Contract
0xfba13b2a525d2b11c6c138a3a31040a663921213
1
Contract Overview
My Name Tag:
Not Available
TokenTracker:
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x3ad92c9731ae2bdd087bec25249e8ea63024ec0388d4e1f8cbe78649a48782f8 | Transfer | 53407729 | 15 days 4 hrs ago | 0xef09879057a9ad798438f3ba561bcdd293d72fc7 | IN | 0xfba13b2a525d2b11c6c138a3a31040a663921213 | 0 ETH | 0.00003097 | |
0x0d737d474ed4cf4460a1ce22b72346d62c508f7bdf178758c82626456df07d4d | Transfer | 7249987 | 334 days 21 hrs ago | 0xef09879057a9ad798438f3ba561bcdd293d72fc7 | IN | 0xfba13b2a525d2b11c6c138a3a31040a663921213 | 0 ETH | 0.000282035842 ETH | |
0x728b616d5e7ecb645444405893df8e64e2ac94c804d410a44af8167d1a1aabc3 | Transfer | 7249128 | 334 days 21 hrs ago | 0xef09879057a9ad798438f3ba561bcdd293d72fc7 | IN | 0xfba13b2a525d2b11c6c138a3a31040a663921213 | 0 ETH | 0.000282768405 ETH |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x946fde4f78d558994123d19215778fbef3656cf9
Contract Name:
KSPool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2022-03-16 */ // File: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/math/Math.sol // MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol // MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol // MIT pragma solidity >=0.6.0 <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 SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/libraries/MathExt.sol // MIT pragma solidity 0.6.12; library MathExt { using SafeMath for uint256; uint256 public constant PRECISION = (10**18); /// @dev Returns x*y in precision function mulInPrecision(uint256 x, uint256 y) internal pure returns (uint256) { return x.mul(y) / PRECISION; } /// @dev source: dsMath /// @param xInPrecision should be < PRECISION, so this can not overflow /// @return zInPrecision = (x/PRECISION) ^k * PRECISION function unsafePowInPrecision(uint256 xInPrecision, uint256 k) internal pure returns (uint256 zInPrecision) { require(xInPrecision <= PRECISION, "MathExt: x > PRECISION"); zInPrecision = k % 2 != 0 ? xInPrecision : PRECISION; for (k /= 2; k != 0; k /= 2) { xInPrecision = (xInPrecision * xInPrecision) / PRECISION; if (k % 2 != 0) { zInPrecision = (zInPrecision * xInPrecision) / PRECISION; } } } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File: @openzeppelin/contracts/utils/Context.sol // MIT pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: contracts/interfaces/IERC20Permit.sol // MIT pragma solidity 0.6.12; interface IERC20Permit is IERC20 { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File: contracts/libraries/ERC20Permit.sol // MIT pragma solidity 0.6.12; /// @dev https://eips.ethereum.org/EIPS/eip-2612 contract ERC20Permit is ERC20, IERC20Permit { /// @dev To make etherscan auto-verify new pool, this variable is not immutable bytes32 public domainSeparator; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public nonces; constructor( string memory name, string memory symbol, string memory version ) public ERC20(name, symbol) { uint256 chainId; assembly { chainId := chainid() } domainSeparator = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name)), keccak256(bytes(version)), chainId, address(this) ) ); } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { require(deadline >= block.timestamp, "ERC20Permit: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, keccak256( abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require( recoveredAddress != address(0) && recoveredAddress == owner, "ERC20Permit: INVALID_SIGNATURE" ); _approve(owner, spender, value); } } // File: contracts/interfaces/IKSFactory.sol // BUSL-1.1 pragma solidity 0.6.12; interface IKSFactory { function createPool( IERC20 tokenA, IERC20 tokenB, uint32 ampBps, uint16 feeBps ) external returns (address pool); function setFeeConfiguration(address feeTo, uint16 governmentFeeBps) external; function enableFeeOption(uint16 feeBps) external; function disableFeeOption(uint16 feeBps) external; function setFeeToSetter(address) external; function getFeeConfiguration() external view returns (address feeTo, uint16 governmentFeeBps); function feeToSetter() external view returns (address); function allPools(uint256) external view returns (address pool); function allPoolsLength() external view returns (uint256); function getUnamplifiedPool(IERC20 token0, IERC20 token1) external view returns (address); function getPools(IERC20 token0, IERC20 token1) external view returns (address[] memory _tokenPools); function isPool( IERC20 token0, IERC20 token1, address pool ) external view returns (bool); } // File: contracts/interfaces/IKSCallee.sol // BUSL-1.1 pragma solidity 0.6.12; interface IKSCallee { function ksSwapCall( address sender, uint256 amount0, uint256 amount1, bytes calldata data ) external; } // File: contracts/interfaces/IKSPool.sol // BUSL-1.1 pragma solidity 0.6.12; interface IKSPool { function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function sync() external; function getReserves() external view returns (uint112 reserve0, uint112 reserve1); function getTradeInfo() external view returns ( uint112 _vReserve0, uint112 _vReserve1, uint112 reserve0, uint112 reserve1, uint256 feeInPrecision ); function token0() external view returns (IERC20); function token1() external view returns (IERC20); function ampBps() external view returns (uint32); function factory() external view returns (IKSFactory); function kLast() external view returns (uint256); } // File: contracts/interfaces/IERC20Metadata.sol // MIT pragma solidity 0.6.12; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ 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: contracts/KSPool.sol // BUSL-1.1 pragma solidity 0.6.12; contract KSPool is IKSPool, ERC20Permit, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 internal constant MAX_UINT112 = 2**112 - 1; uint256 internal constant BPS = 10000; struct ReserveData { uint256 reserve0; uint256 reserve1; uint256 vReserve0; uint256 vReserve1; // only used when isAmpPool = true } uint256 public constant MINIMUM_LIQUIDITY = 10**3; uint256 internal constant PRECISION = 10**18; /// @dev To make etherscan auto-verify new pool, these variables are not immutable IKSFactory public override factory; IERC20 public override token0; IERC20 public override token1; /// @dev uses single storage slot, accessible via getReservesData uint112 internal reserve0; uint112 internal reserve1; uint32 public override ampBps; /// @dev addition param only when amplification factor > 1 uint112 internal vReserve0; uint112 internal vReserve1; /// @dev vReserve0 * vReserve1, as of immediately after the most recent liquidity event uint256 public override kLast; /// @dev fixed fee for swap uint256 internal feeInPrecision; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to, uint256 feeInPrecision ); event Sync(uint256 vReserve0, uint256 vReserve1, uint256 reserve0, uint256 reserve1); constructor() public ERC20Permit("KyberSwap LP", "KS-LP", "1") { factory = IKSFactory(msg.sender); } // called once by the factory at time of deployment function initialize( IERC20 _token0, IERC20 _token1, uint32 _ampBps, uint16 _feeBps ) external { require(msg.sender == address(factory), "KS: FORBIDDEN"); token0 = _token0; token1 = _token1; ampBps = _ampBps; feeInPrecision = (_feeBps * PRECISION) / BPS; } /// @dev this low-level function should be called from a contract /// which performs important safety checks function mint(address to) external override nonReentrant returns (uint256 liquidity) { (bool isAmpPool, ReserveData memory data) = getReservesData(); ReserveData memory _data; _data.reserve0 = token0.balanceOf(address(this)); _data.reserve1 = token1.balanceOf(address(this)); uint256 amount0 = _data.reserve0.sub(data.reserve0); uint256 amount1 = _data.reserve1.sub(data.reserve1); bool feeOn = _mintFee(isAmpPool, data); uint256 _totalSupply = totalSupply(); // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { if (isAmpPool) { uint32 _ampBps = ampBps; _data.vReserve0 = _data.reserve0.mul(_ampBps) / BPS; _data.vReserve1 = _data.reserve1.mul(_ampBps) / BPS; } liquidity = MathExt.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY); _mint(address(-1), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min( amount0.mul(_totalSupply) / data.reserve0, amount1.mul(_totalSupply) / data.reserve1 ); if (isAmpPool) { uint256 b = liquidity.add(_totalSupply); _data.vReserve0 = Math.max(data.vReserve0.mul(b) / _totalSupply, _data.reserve0); _data.vReserve1 = Math.max(data.vReserve1.mul(b) / _totalSupply, _data.reserve1); } } require(liquidity > 0, "KS: INSUFFICIENT_LIQUIDITY_MINTED"); _mint(to, liquidity); _update(isAmpPool, _data); if (feeOn) kLast = getK(isAmpPool, _data); emit Mint(msg.sender, amount0, amount1); } /// @dev this low-level function should be called from a contract /// @dev which performs important safety checks /// @dev user must transfer LP token to this contract before call burn function burn(address to) external override nonReentrant returns (uint256 amount0, uint256 amount1) { (bool isAmpPool, ReserveData memory data) = getReservesData(); // gas savings IERC20 _token0 = token0; // gas savings IERC20 _token1 = token1; // gas savings uint256 balance0 = _token0.balanceOf(address(this)); uint256 balance1 = _token1.balanceOf(address(this)); require(balance0 >= data.reserve0 && balance1 >= data.reserve1, "KS: UNSYNC_RESERVES"); uint256 liquidity = balanceOf(address(this)); bool feeOn = _mintFee(isAmpPool, data); uint256 _totalSupply = totalSupply(); // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, "KS: INSUFFICIENT_LIQUIDITY_BURNED"); _burn(address(this), liquidity); _token0.safeTransfer(to, amount0); _token1.safeTransfer(to, amount1); ReserveData memory _data; _data.reserve0 = _token0.balanceOf(address(this)); _data.reserve1 = _token1.balanceOf(address(this)); if (isAmpPool) { uint256 b = Math.min( _data.reserve0.mul(_totalSupply) / data.reserve0, _data.reserve1.mul(_totalSupply) / data.reserve1 ); _data.vReserve0 = Math.max(data.vReserve0.mul(b) / _totalSupply, _data.reserve0); _data.vReserve1 = Math.max(data.vReserve1.mul(b) / _totalSupply, _data.reserve1); } _update(isAmpPool, _data); if (feeOn) kLast = getK(isAmpPool, _data); // data are up-to-date emit Burn(msg.sender, amount0, amount1, to); } /// @dev this low-level function should be called from a contract /// @dev which performs important safety checks function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata callbackData ) external override nonReentrant { require(amount0Out > 0 || amount1Out > 0, "KS: INSUFFICIENT_OUTPUT_AMOUNT"); (bool isAmpPool, ReserveData memory data) = getReservesData(); // gas savings require( amount0Out < data.reserve0 && amount1Out < data.reserve1, "KS: INSUFFICIENT_LIQUIDITY" ); ReserveData memory newData; { // scope for _token{0,1}, avoids stack too deep errors IERC20 _token0 = token0; IERC20 _token1 = token1; require(to != address(_token0) && to != address(_token1), "KS: INVALID_TO"); if (amount0Out > 0) _token0.safeTransfer(to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _token1.safeTransfer(to, amount1Out); // optimistically transfer tokens if (callbackData.length > 0) IKSCallee(to).ksSwapCall(msg.sender, amount0Out, amount1Out, callbackData); newData.reserve0 = _token0.balanceOf(address(this)); newData.reserve1 = _token1.balanceOf(address(this)); if (isAmpPool) { newData.vReserve0 = data.vReserve0.add(newData.reserve0).sub(data.reserve0); newData.vReserve1 = data.vReserve1.add(newData.reserve1).sub(data.reserve1); } } uint256 amount0In = newData.reserve0 > data.reserve0 - amount0Out ? newData.reserve0 - (data.reserve0 - amount0Out) : 0; uint256 amount1In = newData.reserve1 > data.reserve1 - amount1Out ? newData.reserve1 - (data.reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, "KS: INSUFFICIENT_INPUT_AMOUNT"); verifyBalance( amount0In, amount1In, isAmpPool ? data.vReserve0 : data.reserve0, isAmpPool ? data.vReserve1 : data.reserve1, isAmpPool ? newData.vReserve0 : newData.reserve0, isAmpPool ? newData.vReserve1 : newData.reserve1 ); _update(isAmpPool, newData); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to, feeInPrecision); } /// @dev force balances to match reserves function skim(address to) external nonReentrant { token0.safeTransfer(to, token0.balanceOf(address(this)).sub(reserve0)); token1.safeTransfer(to, token1.balanceOf(address(this)).sub(reserve1)); } /// @dev force reserves to match balances function sync() external override nonReentrant { (bool isAmpPool, ReserveData memory data) = getReservesData(); bool feeOn = _mintFee(isAmpPool, data); ReserveData memory newData; newData.reserve0 = IERC20(token0).balanceOf(address(this)); newData.reserve1 = IERC20(token1).balanceOf(address(this)); // update virtual reserves if this is amp pool if (isAmpPool) { uint256 _totalSupply = totalSupply(); uint256 b = Math.min( newData.reserve0.mul(_totalSupply) / data.reserve0, newData.reserve1.mul(_totalSupply) / data.reserve1 ); newData.vReserve0 = Math.max(data.vReserve0.mul(b) / _totalSupply, newData.reserve0); newData.vReserve1 = Math.max(data.vReserve1.mul(b) / _totalSupply, newData.reserve1); } _update(isAmpPool, newData); if (feeOn) kLast = getK(isAmpPool, newData); } /// @dev returns data to calculate amountIn, amountOut function getTradeInfo() external virtual override view returns ( uint112 _reserve0, uint112 _reserve1, uint112 _vReserve0, uint112 _vReserve1, uint256 _feeInPrecision ) { // gas saving to read reserve data _reserve0 = reserve0; _reserve1 = reserve1; uint32 _ampBps = ampBps; _vReserve0 = vReserve0; _vReserve1 = vReserve1; if (_ampBps == BPS) { _vReserve0 = _reserve0; _vReserve1 = _reserve1; } _feeInPrecision = feeInPrecision; } /// @dev returns reserve data to calculate amount to add liquidity function getReserves() external override view returns (uint112 _reserve0, uint112 _reserve1) { _reserve0 = reserve0; _reserve1 = reserve1; } function name() public override view returns (string memory) { IERC20Metadata _token0 = IERC20Metadata(address(token0)); IERC20Metadata _token1 = IERC20Metadata(address(token1)); return string(abi.encodePacked("KyberSwap LP ", _token0.symbol(), "-", _token1.symbol())); } function symbol() public override view returns (string memory) { IERC20Metadata _token0 = IERC20Metadata(address(token0)); IERC20Metadata _token1 = IERC20Metadata(address(token1)); return string(abi.encodePacked("KS-LP ", _token0.symbol(), "-", _token1.symbol())); } function verifyBalance( uint256 amount0In, uint256 amount1In, uint256 beforeReserve0, uint256 beforeReserve1, uint256 afterReserve0, uint256 afterReserve1 ) internal virtual view { // verify balance update matches with fomula uint256 balance0Adjusted = afterReserve0.mul(PRECISION); balance0Adjusted = balance0Adjusted.sub(amount0In.mul(feeInPrecision)); balance0Adjusted = balance0Adjusted / PRECISION; uint256 balance1Adjusted = afterReserve1.mul(PRECISION); balance1Adjusted = balance1Adjusted.sub(amount1In.mul(feeInPrecision)); balance1Adjusted = balance1Adjusted / PRECISION; require( balance0Adjusted.mul(balance1Adjusted) >= beforeReserve0.mul(beforeReserve1), "KS: K" ); } /// @dev update reserves function _update(bool isAmpPool, ReserveData memory data) internal { reserve0 = safeUint112(data.reserve0); reserve1 = safeUint112(data.reserve1); if (isAmpPool) { assert(data.vReserve0 >= data.reserve0 && data.vReserve1 >= data.reserve1); // never happen vReserve0 = safeUint112(data.vReserve0); vReserve1 = safeUint112(data.vReserve1); } emit Sync(data.vReserve0, data.vReserve1, data.reserve0, data.reserve1); } /// @dev if fee is on, mint liquidity equivalent to configured fee of the growth in sqrt(k) function _mintFee(bool isAmpPool, ReserveData memory data) internal returns (bool feeOn) { (address feeTo, uint16 governmentFeeBps) = factory.getFeeConfiguration(); feeOn = feeTo != address(0); uint256 _kLast = kLast; // gas savings if (feeOn) { if (_kLast != 0) { uint256 rootK = MathExt.sqrt(getK(isAmpPool, data)); uint256 rootKLast = MathExt.sqrt(_kLast); if (rootK > rootKLast) { uint256 numerator = totalSupply().mul(rootK.sub(rootKLast)).mul( governmentFeeBps ); uint256 denominator = rootK.add(rootKLast).mul(5000); uint256 liquidity = numerator / denominator; if (liquidity > 0) _mint(feeTo, liquidity); } } } else if (_kLast != 0) { kLast = 0; } } /// @dev gas saving to read reserve data function getReservesData() internal view returns (bool isAmpPool, ReserveData memory data) { data.reserve0 = reserve0; data.reserve1 = reserve1; isAmpPool = ampBps != BPS; if (isAmpPool) { data.vReserve0 = vReserve0; data.vReserve1 = vReserve1; } } function getK(bool isAmpPool, ReserveData memory data) internal pure returns (uint256) { return isAmpPool ? data.vReserve0 * data.vReserve1 : data.reserve0 * data.reserve1; } function safeUint112(uint256 x) internal pure returns (uint112) { require(x <= MAX_UINT112, "KS: OVERFLOW"); return uint112(x); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeInPrecision","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vReserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vReserve1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve1","type":"uint256"}],"name":"Sync","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":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ampBps","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"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":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IKSFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTradeInfo","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint112","name":"_vReserve0","type":"uint112"},{"internalType":"uint112","name":"_vReserve1","type":"uint112"},{"internalType":"uint256","name":"_feeInPrecision","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token0","type":"address"},{"internalType":"contract IERC20","name":"_token1","type":"address"},{"internalType":"uint32","name":"_ampBps","type":"uint32"},{"internalType":"uint16","name":"_feeBps","type":"uint16"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600c81526020016b04b7962657253776170204c560a41b8152506040518060400160405280600581526020016404b532d4c560dc1b815250604051806040016040528060018152602001603160f81b815250828281600390805190602001906200008992919062000142565b5080516200009f90600490602084019062000142565b50506005805460ff19166012179055508251602093840120815191840191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c090920190528051920191909120600655506001600855600980546001600160a01b03191633179055620001de565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200018557805160ff1916838001178555620001b5565b82800160010185558215620001b5579182015b82811115620001b557825182559160200191906001019062000198565b50620001c3929150620001c7565b5090565b5b80821115620001c35760008155600101620001c8565b613fdf80620001ee6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637464fc3d11610104578063bc25cf77116100a2578063d669402711610071578063d6694027146106f0578063dd62ed3e1461073a578063f698da2514610775578063fff6cae91461077d576101cf565b8063bc25cf771461064f578063c45a015514610682578063d21220a71461068a578063d505accf14610692576101cf565b806395d89b41116100de57806395d89b41146105cd578063a457c2d7146105d5578063a9059cbb1461060e578063ba9a7a5614610647576101cf565b80637464fc3d146105465780637ecebe001461054e57806389afcb4414610581576101cf565b806330adf81f1161017157806349386b161161014b57806349386b161461046b5780635fd3a5d91461048c5780636a627842146104e057806370a0823114610513576101cf565b806330adf81f1461040c578063313ce567146104145780633950935114610432576101cf565b8063095ea7b3116101ad578063095ea7b3146103315780630dfe16811461037e57806318160ddd146103af57806323b872dd146103c9576101cf565b8063022c0d9f146101d457806306fdde031461026f5780630902f1ac146102ec575b600080fd5b61026d600480360360808110156101ea57600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184600183028401116401000000008311171561026257600080fd5b509092509050610785565b005b610277610e22565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b1578181015183820152602001610299565b50505050905090810190601f1680156102de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102f461123a565b60405180836dffffffffffffffffffffffffffff168152602001826dffffffffffffffffffffffffffff1681526020019250505060405180910390f35b61036a6004803603604081101561034757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611267565b604080519115158252519081900360200190f35b610386611285565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103b76112a1565b60408051918252519081900360200190f35b61036a600480360360608110156103df57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356112a7565b6103b7611349565b61041c61136d565b6040805160ff9092168252519081900360200190f35b61036a6004803603604081101561044857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611376565b6104736113d1565b6040805163ffffffff9092168252519081900360200190f35b61026d600480360360808110156104a257600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff90811691602081013590911690604081013563ffffffff16906060013561ffff166113fd565b6103b7600480360360208110156104f657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611541565b6103b76004803603602081101561052957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119b1565b6103b76119dd565b6103b76004803603602081101561056457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119e3565b6105b46004803603602081101561059757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166119f5565b6040805192835260208301919091528051918290030190f35b610277611fd3565b61036a600480360360408110156105eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561231b565b61036a6004803603604081101561062457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612390565b6103b76123a4565b61026d6004803603602081101561066557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166123aa565b6103866125cc565b6103866125e8565b61026d600480360360e08110156106a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135612604565b6106f86128d0565b604080516dffffffffffffffffffffffffffff968716815294861660208601529285168484015293166060830152608082019290925290519081900360a00190f35b6103b76004803603604081101561075057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661294f565b6103b7612987565b61026d61298d565b600260085414156107f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026008558415158061080a5750600084115b61087557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4b533a20494e53554646494349454e545f4f55545055545f414d4f554e540000604482015290519081900360640190fd5b600061087f613d8a565b610887612c4a565b805191935091508710801561089f5750806020015186105b61090a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4b533a20494e53554646494349454e545f4c4951554944495459000000000000604482015290519081900360640190fd5b610912613d8a565b600a54600b5473ffffffffffffffffffffffffffffffffffffffff91821691908116908816821480159061097257508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b6109dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4b533a20494e56414c49445f544f000000000000000000000000000000000000604482015290519081900360640190fd5b8915610a0457610a0473ffffffffffffffffffffffffffffffffffffffff8316898c612cee565b8815610a2b57610a2b73ffffffffffffffffffffffffffffffffffffffff8216898b612cee565b8515610af7578773ffffffffffffffffffffffffffffffffffffffff16637a646c19338c8c8b8b6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610b6357600080fd5b505afa158015610b77573d6000803e3d6000fd5b505050506040513d6020811015610b8d57600080fd5b50518352604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8316916370a08231916024808301926020929190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b505160208401528415610c7b57835183516040860151610c529291610c4c9190612d80565b90612df4565b6040840152602080850151908401516060860151610c759291610c4c9190612d80565b60608401525b5050815181516000918a900310610c93576000610c9e565b82518251908a900390035b9050600088846020015103836020015111610cba576000610cc8565b888460200151038360200151035b90506000821180610cd95750600081115b610d4457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4b533a20494e53554646494349454e545f494e5055545f414d4f554e54000000604482015290519081900360640190fd5b610d9c828287610d55578651610d5b565b86604001515b88610d6a578760200151610d70565b87606001515b89610d7c578751610d82565b87604001515b8a610d91578860200151610d97565b88606001515b612e6b565b610da68584612f75565b600f5460408051848152602081018490528082018d9052606081018c905260808101929092525173ffffffffffffffffffffffffffffffffffffffff8a169133917f606ecd02b3e3b4778f8e97b2e03351de14224efaa5fa64e62200afc9395c24999181900360a00190a3505060016008555050505050505050565b600a54600b54604080517f95d89b41000000000000000000000000000000000000000000000000000000008152905160609373ffffffffffffffffffffffffffffffffffffffff90811693169183916395d89b4191600480820192600092909190829003018186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610ef257600080fd5b8101908080516040519392919084640100000000821115610f1257600080fd5b908301906020820185811115610f2757600080fd5b8251640100000000811182820188101715610f4157600080fd5b82525081516020918201929091019080838360005b83811015610f6e578181015183820152602001610f56565b50505050905090810190601f168015610f9b5780820380516001836020036101000a031916815260200191505b506040525050508173ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015610fe857600080fd5b505afa158015610ffc573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561104357600080fd5b810190808051604051939291908464010000000082111561106357600080fd5b90830190602082018581111561107857600080fd5b825164010000000081118282018810171561109257600080fd5b82525081516020918201929091019080838360005b838110156110bf5781810151838201526020016110a7565b50505050905090810190601f1680156110ec5780820380516001836020036101000a031916815260200191505b5060405250505060405160200180807f4b7962657253776170204c502000000000000000000000000000000000000000815250600d0183805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b6001836020036101000a038019825116818451168082178552505050505050905001807f2d0000000000000000000000000000000000000000000000000000000000000081525060010182805190602001908083835b602083106111fe57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016111c1565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529250505090565b600c546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000009092041690565b600061127b611274613111565b8484613115565b5060015b92915050565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60025490565b60006112b484848461325c565b61133e846112c0613111565b61133985604051806060016040528060288152602001613ea86028913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526001602052604081209061130b613111565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054919061342c565b613115565b5060015b9392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b600061127b611383613111565b846113398560016000611394613111565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490612d80565b600c547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1681565b60095473ffffffffffffffffffffffffffffffffffffffff16331461148357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4b533a20464f5242494444454e00000000000000000000000000000000000000604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600b805492861692909116919091179055600c805463ffffffff84167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911617905561271061ffff8216670de0b6b3a76400000204600f5550505050565b6000600260085414156115b557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260085560006115c4613d8a565b6115cc612c4a565b915091506115d8613d8a565b600a54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d602081101561167357600080fd5b50518152600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b1580156116e857600080fd5b505afa1580156116fc573d6000803e3d6000fd5b505050506040513d602081101561171257600080fd5b505160208201528151815160009161172a9190612df4565b9050600061174984602001518460200151612df490919063ffffffff16565b9050600061175786866134dd565b905060006117636112a1565b9050806118315786156117e657600c54855163ffffffff7c0100000000000000000000000000000000000000000000000000000000909204821691612710916117ae91849061364c16565b816117b557fe5b0460408701526020860151612710906117d79063ffffffff8085169061364c16565b816117de57fe5b046060870152505b6117fe6103e8610c4c6117f9878761364c565b6136bf565b975061182c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6103e8613710565b6118e4565b855161186e90611841868461364c565b8161184857fe5b048760200151611861848761364c90919063ffffffff16565b8161186857fe5b04613841565b975086156118e45760006118828983612d80565b90506118b18261189f838a6040015161364c90919063ffffffff16565b816118a657fe5b048760000151613857565b604087015260608701516118dd9083906118cb908461364c565b816118d257fe5b048760200151613857565b6060870152505b6000881161193d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613f646021913960400191505060405180910390fd5b6119478989613710565b6119518786612f75565b8115611965576119618786613867565b600e555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600855509395945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b600e5481565b60076020526000908152604090205481565b60008060026008541415611a6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026008556000611a79613d8a565b611a81612c4a565b600a54600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b158015611b0257600080fd5b505afa158015611b16573d6000803e3d6000fd5b505050506040513d6020811015611b2c57600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b158015611ba057600080fd5b505afa158015611bb4573d6000803e3d6000fd5b505050506040513d6020811015611bca57600080fd5b505185519091508210801590611be4575084602001518110155b611c4f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4b533a20554e53594e435f524553455256455300000000000000000000000000604482015290519081900360640190fd5b6000611c5a306119b1565b90506000611c6888886134dd565b90506000611c746112a1565b905080611c81848761364c565b81611c8857fe5b049a5080611c96848661364c565b81611c9d57fe5b04995060008b118015611cb0575060008a115b611d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613df86021913960400191505060405180910390fd5b611d0f308461388d565b611d3073ffffffffffffffffffffffffffffffffffffffff88168d8d612cee565b611d5173ffffffffffffffffffffffffffffffffffffffff87168d8c612cee565b611d59613d8a565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8a16916370a08231916024808301926020929190829003018186803b158015611dc557600080fd5b505afa158015611dd9573d6000803e3d6000fd5b505050506040513d6020811015611def57600080fd5b50518152604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b158015611e5f57600080fd5b505afa158015611e73573d6000803e3d6000fd5b505050506040513d6020811015611e8957600080fd5b505160208201528915611f315788518151600091611ecf91611eab908661364c565b81611eb257fe5b048b6020015161186186866020015161364c90919063ffffffff16565b9050611efe83611eec838d6040015161364c90919063ffffffff16565b81611ef357fe5b048360000151613857565b604083015260608a0151611f2a908490611f18908461364c565b81611f1f57fe5b048360200151613857565b6060830152505b611f3b8a82612f75565b8215611f4f57611f4b8a82613867565b600e555b8c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d819364968e8e604051808381526020018281526020019250505060405180910390a3505050505050505050506001600881905550915091565b600a54600b54604080517f95d89b41000000000000000000000000000000000000000000000000000000008152905160609373ffffffffffffffffffffffffffffffffffffffff90811693169183916395d89b4191600480820192600092909190829003018186803b15801561204857600080fd5b505afa15801561205c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405260208110156120a357600080fd5b81019080805160405193929190846401000000008211156120c357600080fd5b9083019060208201858111156120d857600080fd5b82516401000000008111828201881017156120f257600080fd5b82525081516020918201929091019080838360005b8381101561211f578181015183820152602001612107565b50505050905090810190601f16801561214c5780820380516001836020036101000a031916815260200191505b506040525050508173ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561219957600080fd5b505afa1580156121ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405260208110156121f457600080fd5b810190808051604051939291908464010000000082111561221457600080fd5b90830190602082018581111561222957600080fd5b825164010000000081118282018810171561224357600080fd5b82525081516020918201929091019080838360005b83811015612270578181015183820152602001612258565b50505050905090810190601f16801561229d5780820380516001836020036101000a031916815260200191505b5060405250505060405160200180807f4b532d4c5020000000000000000000000000000000000000000000000000000081525060060183805190602001908083836020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b600061127b612328613111565b8461133985604051806060016040528060258152602001613f856025913960016000612352613111565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919061342c565b600061127b61239d613111565b848461325c565b6103e881565b6002600854141561241c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600855600c54600a54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516125039385936124e3936dffffffffffffffffffffffffffff9092169273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b1580156124b157600080fd5b505afa1580156124c5573d6000803e3d6000fd5b505050506040513d60208110156124db57600080fd5b505190612df4565b600a5473ffffffffffffffffffffffffffffffffffffffff169190612cee565b600c54600b54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516125c49385936125a4936e0100000000000000000000000000009092046dffffffffffffffffffffffffffff169273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b1580156124b157600080fd5b600b5473ffffffffffffffffffffffffffffffffffffffff169190612cee565b506001600855565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b4284101561267357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f45524332305065726d69743a2045585049524544000000000000000000000000604482015290519081900360640190fd5b60065473ffffffffffffffffffffffffffffffffffffffff80891660008181526007602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156127d4573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061284f57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6128ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20494e56414c49445f5349474e41545552450000604482015290519081900360640190fd5b6128c5898989613115565b505050505050505050565b600c54600d546dffffffffffffffffffffffffffff808316926e0100000000000000000000000000008082048316938381169391900416906000907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16612710811415612942578593508492505b600f549150509091929394565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60065481565b600260085414156129ff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026008556000612a0e613d8a565b612a16612c4a565b915091506000612a2683836134dd565b9050612a30613d8a565b600a54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015612aa157600080fd5b505afa158015612ab5573d6000803e3d6000fd5b505050506040513d6020811015612acb57600080fd5b50518152600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015612b4057600080fd5b505afa158015612b54573d6000803e3d6000fd5b505050506040513d6020811015612b6a57600080fd5b505160208201528315612c21576000612b816112a1565b84518351919250600091612bbe9190612b9a908561364c565b81612ba157fe5b04866020015161186185876020015161364c90919063ffffffff16565b9050612bed82612bdb83886040015161364c90919063ffffffff16565b81612be257fe5b048460000151613857565b60408401526060850151612c19908390612c07908461364c565b81612c0e57fe5b048460200151613857565b606084015250505b612c2b8482612f75565b8115612c3f57612c3b8482613867565b600e555b505060016008555050565b6000612c54613d8a565b600c546dffffffffffffffffffffffffffff80821683526e010000000000000000000000000000820416602083015263ffffffff7c0100000000000000000000000000000000000000000000000000000000909104166127101480159250612cea57600d546dffffffffffffffffffffffffffff80821660408401526e0100000000000000000000000000009091041660608201525b9091565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612d7b9084906139d7565b505050565b60008282018381101561134257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115612e6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000612e7f83670de0b6b3a764000061364c565b9050612ea0612e99600f548961364c90919063ffffffff16565b8290612df4565b9050670de0b6b3a7640000810490506000612ec383670de0b6b3a764000061364c565b9050612edd612e99600f548961364c90919063ffffffff16565b670de0b6b3a764000090049050612ef4868661364c565b612efe838361364c565b1015612f6b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f4b533a204b000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5050505050505050565b8051612f8090613aaf565b600c80547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff929092169190911790556020810151612fcd90613aaf565b600c600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff16021790555081156130b957805160408201511080159061302457508060200151816060015110155b61302a57fe5b6130378160400151613aaf565b600d80547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff92909216919091179055606081015161308490613aaf565b600d600e6101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055505b6040808201516060808401518451602080870151865195865290850192909252838501529082015290517f2f9d55abfefdfd4c3a83e00a1b419b3c2fe4b83100c559f0e2213e57f6e0bba99181900360800190a15050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316613181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f166024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166131ed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e196022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166132c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613ef16025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613334576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613db36023913960400191505060405180910390fd5b61333f838383612d7b565b61338981604051806060016040528060268152602001613e3b6026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919061342c565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822093909355908416815220546133c59082612d80565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156134d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561349a578181015183820152602001613482565b50505050905090810190601f1680156134c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5cb2e16040518163ffffffff1660e01b8152600401604080518083038186803b15801561354957600080fd5b505afa15801561355d573d6000803e3d6000fd5b505050506040513d604081101561357357600080fd5b508051602090910151600e5473ffffffffffffffffffffffffffffffffffffffff83161580159650929450909250906136375780156136325760006135bb6117f98888613867565b905060006135c8836136bf565b90508082111561362f5760006135f761ffff86166135f16135e98686612df4565b6135f16112a1565b9061364c565b9050600061360b6113886135f18686612d80565b9050600081838161361857fe5b049050801561362b5761362b8882613710565b5050505b50505b613643565b8015613643576000600e555b50505092915050565b60008261365b5750600061127f565b8282028284828161366857fe5b0414611342576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e876021913960400191505060405180910390fd5b60006003821115613702575080600160028204015b818110156136fc578091506002818285816136eb57fe5b0401816136f457fe5b0490506136d4565b506119d8565b81156119d857506001919050565b73ffffffffffffffffffffffffffffffffffffffff821661379257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61379e60008383612d7b565b6002546137ab9082612d80565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546137de9082612d80565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106138505781611342565b5090919050565b6000818310156138505781611342565b60008261387b576020820151825102611342565b50606081015160409091015102919050565b73ffffffffffffffffffffffffffffffffffffffff82166138f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ed06021913960400191505060405180910390fd5b61390582600083612d7b565b61394f81604051806060016040528060228152602001613dd66022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919061342c565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020556002546139829082612df4565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6060613a39826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b329092919063ffffffff16565b805190915015612d7b57808060200190516020811015613a5857600080fd5b5051612d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613f3a602a913960400191505060405180910390fd5b60006dffffffffffffffffffffffffffff821115613b2e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4b533a204f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b5090565b6060613b418484600085613b49565b949350505050565b606082471015613ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613e616026913960400191505060405180910390fd5b613bad85613d04565b613c1857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c8257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c45565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce4576040519150601f19603f3d011682016040523d82523d6000602084013e613ce9565b606091505b5091509150613cf9828286613d0a565b979650505050505050565b3b151590565b60608315613d19575081611342565b825115613d295782518084602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815284516024840152845185939192839260440191908501908083836000831561349a578181015183820152602001613482565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654b533a20494e53554646494349454e545f4c49515549444954595f4255524e454445524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644b533a20494e53554646494349454e545f4c49515549444954595f4d494e54454445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122046a8a082300af5f226c618db95013841bc987ae34f110242c887486e6f1d75f664736f6c634300060c0033
Deployed ByteCode Sourcemap
44872:14941:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51368:2354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51368:2354:0;;-1:-1:-1;51368:2354:0;-1:-1:-1;51368:2354:0;:::i;:::-;;56008:303;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55837:163;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32496:169;;;;;;;;;;;;;;;;-1:-1:-1;32496:169:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45525:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31449:108;;;:::i;:::-;;;;;;;;;;;;;;;;33147:321;;;;;;;;;;;;;;;;-1:-1:-1;33147:321:0;;;;;;;;;;;;;;;;;;:::i;39965:117::-;;;:::i;31293:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33877:218;;;;;;;;;;;;;;;;-1:-1:-1;33877:218:0;;;;;;;;;:::i;45734:29::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46781:347;;;;;;;;;;;;;;;;-1:-1:-1;46781:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47271:1811::-;;;;;;;;;;;;;;;;-1:-1:-1;47271:1811:0;;;;:::i;31620:127::-;;;;;;;;;;;;;;;;-1:-1:-1;31620:127:0;;;;:::i;45995:29::-;;;:::i;40091:41::-;;;;;;;;;;;;;;;;-1:-1:-1;40091:41:0;;;;:::i;49290:1946::-;;;;;;;;;;;;;;;;-1:-1:-1;49290:1946:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;56319:298;;;:::i;34598:269::-;;;;;;;;;;;;;;;;-1:-1:-1;34598:269:0;;;;;;;;;:::i;31960:175::-;;;;;;;;;;;;;;;;-1:-1:-1;31960:175:0;;;;;;;;;:::i;45287:49::-;;;:::i;53777:218::-;;;;;;;;;;;;;;;;-1:-1:-1;53777:218:0;;;;:::i;45484:34::-;;;:::i;45561:29::-;;;:::i;40772:839::-;;;;;;;;;;;;;;;;-1:-1:-1;40772:839:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55091:666::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32198:151;;;;;;;;;;;;;;;;-1:-1:-1;32198:151:0;;;;;;;;;;;:::i;39823:30::-;;;:::i;54050:973::-;;;:::i;51368:2354::-;10122:1;10728:7;;:19;;10720:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10122:1;10861:7;:18;51556:14;;;;:32:::1;;;51587:1;51574:10;:14;51556:32;51548:75;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51635:14;51651:23;;:::i;:::-;51678:17;:15;:17::i;:::-;51756:13:::0;;51634:61;;-1:-1:-1;51634:61:0;-1:-1:-1;51743:26:0;::::1;:56:::0;::::1;;;;51786:4;:13;;;51773:10;:26;51743:56;51721:132;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51866:26;;:::i;:::-;52003:6;::::0;52041::::1;::::0;52003::::1;::::0;;::::1;::::0;52041;;::::1;::::0;52070:22;::::1;::::0;::::1;::::0;::::1;::::0;:48:::1;;;52110:7;52096:22;;:2;:22;;;;52070:48;52062:75;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;52156:14:::0;;52152:56:::1;;52172:36;:20;::::0;::::1;52193:2:::0;52197:10;52172:20:::1;:36::i;:::-;52261:14:::0;;52257:56:::1;;52277:36;:20;::::0;::::1;52298:2:::0;52302:10;52277:20:::1;:36::i;:::-;52366:23:::0;;52362:120:::1;;52418:2;52408:24;;;52433:10;52445;52457;52469:12;;52408:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52362:120;52516:32;::::0;;;;;52542:4:::1;52516:32;::::0;::::1;::::0;;;:17:::1;::::0;::::1;::::0;::::1;::::0;:32;;;;;::::1;::::0;;;;;;;;:17;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52516:32:0;52497:51;;52582:32:::1;::::0;;;;;52608:4:::1;52582:32;::::0;::::1;::::0;;;:17:::1;::::0;::::1;::::0;::::1;::::0;:32;;;;;52516::::1;::::0;52582;;;;;;;:17;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52582:32:0;::::1;52563:16:::0;::::1;:51:::0;52629:219;::::1;;;52724:13:::0;;52702:16;;52683:14:::1;::::0;::::1;::::0;:55:::1;::::0;52724:13;52683:36:::1;::::0;:14;:18:::1;:36::i;:::-;:40:::0;::::1;:55::i;:::-;52663:17;::::0;::::1;:75:::0;52818:13:::1;::::0;;::::1;::::0;52796:16;;::::1;::::0;52777:14:::1;::::0;::::1;::::0;:55:::1;::::0;52818:13;52777:36:::1;::::0;:14;:18:::1;:36::i;:55::-;52757:17;::::0;::::1;:75:::0;52629:219:::1;-1:-1:-1::0;;52908:13:0;;52889:16;;52869:17:::1;::::0;52908:26;;::::1;-1:-1:-1::0;52889:125:0::1;;53013:1;52889:125;;;52970:13:::0;;52950:16;;52970:26;;;::::1;52950:47:::0;::::1;52889:125;52869:145;;53025:17;53080:10;53064:4;:13;;;:26;53045:7;:16;;;:45;:125;;53169:1;53045:125;;;53142:10;53126:4;:13;;;:26;53106:7;:16;;;:47;53045:125;53025:145;;53201:1;53189:9;:13;:30;;;;53218:1;53206:9;:13;53189:30;53181:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53264:312;53292:9;53316;53340;:42;;53369:13:::0;;53340:42:::1;;;53352:4;:14;;;53340:42;53397:9;:42;;53426:4;:13;;;53397:42;;;53409:4;:14;;;53397:42;53454:9;:48;;53486:16:::0;;53454:48:::1;;;53466:7;:17;;;53454:48;53517:9;:48;;53549:7;:16;;;53517:48;;;53529:7;:17;;;53517:48;53264:13;:312::i;:::-;53589:27;53597:9;53608:7;53589;:27::i;:::-;53699:14;::::0;53632:82:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;::::0;53637:10:::1;::::0;53632:82:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;10078:1:0;11040:7;:22;-1:-1:-1;;;;;;;;51368:2354:0:o;56008:303::-;56128:6;;56195;;56262:16;;;;;;;;56054:13;;56128:6;;;;;56195;;56128;;56262:14;;:16;;;;;56080:22;;56262:16;;;;;;;;56128:6;56262:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56262:16:0;;;;;;;;;;-1:-1:-1;56262:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56285:7;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56285:16:0;;;;;;;;;;-1:-1:-1;56285:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56228:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56214:89;;;;56008:303;:::o;55837:163::-;55953:8;;;;;;;55984;;;;;;55837:163::o;32496:169::-;32579:4;32596:39;32605:12;:10;:12::i;:::-;32619:7;32628:6;32596:8;:39::i;:::-;-1:-1:-1;32653:4:0;32496:169;;;;;:::o;45525:29::-;;;;;;:::o;31449:108::-;31537:12;;31449:108;:::o;33147:321::-;33253:4;33270:36;33280:6;33288:9;33299:6;33270:9;:36::i;:::-;33317:121;33326:6;33334:12;:10;:12::i;:::-;33348:89;33386:6;33348:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;33368:12;:10;:12::i;:::-;33348:33;;;;;;;;;;;;;-1:-1:-1;33348:33:0;;;:89;:37;:89::i;:::-;33317:8;:121::i;:::-;-1:-1:-1;33456:4:0;33147:321;;;;;;:::o;39965:117::-;40016:66;39965:117;:::o;31293:91::-;31367:9;;;;31293:91;:::o;33877:218::-;33965:4;33982:83;33991:12;:10;:12::i;:::-;34005:7;34014:50;34053:10;34014:11;:25;34026:12;:10;:12::i;:::-;34014:25;;;;;;;;;;;;;;;;;;-1:-1:-1;34014:25:0;;;:34;;;;;;;;;;;:38;:50::i;45734:29::-;;;;;;;;;:::o;46781:347::-;46958:7;;;;46936:10;:30;46928:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46995:6;:16;;;;;;;;;;;;;;47022:6;:16;;;;;;;;;;;;;;;47049:6;:16;;;;;;;;;;;;;;45093:5;47094:19;;;45381:6;47094:19;47093:27;47076:14;:44;-1:-1:-1;;;;46781:347:0:o;47271:1811::-;47337:17;10122:1;10728:7;;:19;;10720:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10122:1;10861:7;:18;47368:14:::1;47384:23;;:::i;:::-;47411:17;:15;:17::i;:::-;47367:61;;;;47439:24;;:::i;:::-;47491:6;::::0;:31:::1;::::0;;;;;47516:4:::1;47491:31;::::0;::::1;::::0;;;:6:::1;::::0;;::::1;::::0;:16:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;;:6;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47491:31:0;47474:48;;47550:6:::1;::::0;:31:::1;::::0;;;;;47575:4:::1;47550:31;::::0;::::1;::::0;;;:6:::1;::::0;;::::1;::::0;:16:::1;::::0;:31;;;;;47491::::1;::::0;47550;;;;;;;;:6;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47550:31:0;::::1;47533:14:::0;::::1;:48:::0;47629:13;;47610:14;;47592:15:::1;::::0;47610:33:::1;::::0;:14;:18:::1;:33::i;:::-;47592:51;;47654:15;47672:33;47691:4;:13;;;47672:5;:14;;;:18;;:33;;;;:::i;:::-;47654:51;;47718:10;47731:25;47740:9;47751:4;47731:8;:25::i;:::-;47718:38;;47767:20;47790:13;:11;:13::i;:::-;47767:36:::0;-1:-1:-1;47896:17:0;47892:942:::1;;47934:9;47930:213;;;47981:6;::::0;48024:14;;47981:6:::1;::::0;;;::::1;::::0;::::1;::::0;45093:5:::1;::::0;48024:27:::1;::::0;47981:6;;48024:18:::1;:27;:::i;:::-;:33;;;;;;48006:15;::::0;::::1;:51:::0;48094:14:::1;::::0;::::1;::::0;45093:5:::1;::::0;48094:27:::1;::::0;::::1;::::0;;::::1;::::0;:18:::1;:27;:::i;:::-;:33;;;;;;48076:15;::::0;::::1;:51:::0;-1:-1:-1;47930:213:0::1;48169:57;45331:5;48169:34;48182:20;:7:::0;48194;48182:11:::1;:20::i;:::-;48169:12;:34::i;:57::-;48157:69;;48241:37;48255:2;45331:5;48241;:37::i;:::-;47892:942;;;48433:13:::0;;48378:143:::1;::::0;48405:25:::1;:7:::0;48417:12;48405:11:::1;:25::i;:::-;:41;;;;;;48493:4;:13;;;48465:25;48477:12;48465:7;:11;;:25;;;;:::i;:::-;:41;;;;;;48378:8;:143::i;:::-;48366:155;;48540:9;48536:287;;;48570:9;48582:27;:9:::0;48596:12;48582:13:::1;:27::i;:::-;48570:39;;48646:62;48679:12;48655:21;48674:1;48655:4;:14;;;:18;;:21;;;;:::i;:::-;:36;;;;;;48693:5;:14;;;48646:8;:62::i;:::-;48628:15;::::0;::::1;:80:::0;48754:14:::1;::::0;::::1;::::0;48745:62:::1;::::0;48778:12;;48754:21:::1;::::0;48773:1;48754:18:::1;:21::i;:::-;:36;;;;;;48792:5;:14;;;48745:8;:62::i;:::-;48727:15;::::0;::::1;:80:::0;-1:-1:-1;48536:287:0::1;48864:1;48852:9;:13;48844:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48914:20;48920:2;48924:9;48914:5;:20::i;:::-;48947:25;48955:9;48966:5;48947:7;:25::i;:::-;48987:5;48983:41;;;49002:22;49007:9;49018:5;49002:4;:22::i;:::-;48994:5;:30:::0;48983:41:::1;49040:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;49045:10:::1;::::0;49040:34:::1;::::0;;;;;;::::1;-1:-1:-1::0;;10078:1:0;11040:7;:22;-1:-1:-1;47271:1811:0;;;-1:-1:-1;;;;;47271:1811:0:o;31620:127::-;31721:18;;;31694:7;31721:18;;;;;;;;;;;31620:127;;;;:::o;45995:29::-;;;;:::o;40091:41::-;;;;;;;;;;;;;:::o;49290:1946::-;49392:15;49409;10122:1;10728:7;;:19;;10720:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10122:1;10861:7;:18;49443:14:::1;49459:23;;:::i;:::-;49486:17;:15;:17::i;:::-;49546:6;::::0;49595::::1;::::0;49648:32:::1;::::0;;;;;49674:4:::1;49648:32;::::0;::::1;::::0;;;49442:61;;-1:-1:-1;49442:61:0;;-1:-1:-1;49546:6:0::1;::::0;;::::1;::::0;49595;::::1;::::0;49529:14:::1;::::0;49546:6;;49648:17:::1;::::0;:32;;;;;::::1;::::0;;;;;;;;49546:6;49648:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49648:32:0;49710::::1;::::0;;;;;49736:4:::1;49710:32;::::0;::::1;::::0;;;49648;;-1:-1:-1;49691:16:0::1;::::0;49710:17:::1;::::0;::::1;::::0;::::1;::::0;:32;;;;;49648::::1;::::0;49710;;;;;;;:17;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49710:32:0;49773:13;;49710:32;;-1:-1:-1;49761:25:0;::::1;::::0;::::1;::::0;:54:::1;;;49802:4;:13;;;49790:8;:25;;49761:54;49753:86;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;49850:17;49870:24;49888:4;49870:9;:24::i;:::-;49850:44;;49907:10;49920:25;49929:9;49940:4;49920:8;:25::i;:::-;49907:38;;49956:20;49979:13;:11;:13::i;:::-;49956:36:::0;-1:-1:-1;49956:36:0;50091:23:::1;:9:::0;50105:8;50091:13:::1;:23::i;:::-;:38;;;;;;::::0;-1:-1:-1;50224:12:0;50198:23:::1;:9:::0;50212:8;50198:13:::1;:23::i;:::-;:38;;;;;;50188:48;;50313:1;50303:7;:11;:26;;;;;50328:1;50318:7;:11;50303:26;50295:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50378:31;50392:4;50399:9;50378:5;:31::i;:::-;50420:33;:20;::::0;::::1;50441:2:::0;50445:7;50420:20:::1;:33::i;:::-;50464;:20;::::0;::::1;50485:2:::0;50489:7;50464:20:::1;:33::i;:::-;50508:24;;:::i;:::-;50560:32;::::0;;;;;50586:4:::1;50560:32;::::0;::::1;::::0;;;:17:::1;::::0;::::1;::::0;::::1;::::0;:32;;;;;::::1;::::0;;;;;;;;:17;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50560:32:0;50543:49;;50620:32:::1;::::0;;;;;50646:4:::1;50620:32;::::0;::::1;::::0;;;:17:::1;::::0;::::1;::::0;::::1;::::0;:32;;;;;50560::::1;::::0;50620;;;;;;;:17;:32;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50620:32:0;::::1;50603:14:::0;::::1;:49:::0;50663:401;::::1;;;50767:13:::0;;50732:14;;50693:9:::1;::::0;50705:157:::1;::::0;50732:32:::1;::::0;50751:12;50732:18:::1;:32::i;:::-;:48;;;;;;50834:4;:13;;;50799:32;50818:12;50799:5;:14;;;:18;;:32;;;;:::i;50705:157::-;50693:169;;50895:62;50928:12;50904:21;50923:1;50904:4;:14;;;:18;;:21;;;;:::i;:::-;:36;;;;;;50942:5;:14;;;50895:8;:62::i;:::-;50877:15;::::0;::::1;:80:::0;50999:14:::1;::::0;::::1;::::0;50990:62:::1;::::0;51023:12;;50999:21:::1;::::0;51018:1;50999:18:::1;:21::i;:::-;:36;;;;;;51037:5;:14;;;50990:8;:62::i;:::-;50972:15;::::0;::::1;:80:::0;-1:-1:-1;50663:401:0::1;51074:25;51082:9;51093:5;51074:7;:25::i;:::-;51114:5;51110:41;;;51129:22;51134:9;51145:5;51129:4;:22::i;:::-;51121:5;:30:::0;51110:41:::1;51225:2;51190:38;;51195:10;51190:38;;;51207:7;51216;51190:38;;;;;;;;;;;;;;;;;;;;;;;;10892:1;;;;;;;;;;10078::::0;11040:7;:22;;;;49290:1946;;;:::o;56319:298::-;56441:6;;56508;;56568:16;;;;;;;;56367:13;;56441:6;;;;;56508;;56441;;56568:14;;:16;;;;;56393:22;;56568:16;;;;;;;;56441:6;56568:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56568:16:0;;;;;;;;;;-1:-1:-1;56568:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56591:7;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56591:16:0;;;;;;;;;;-1:-1:-1;56591:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56541:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34598:269;34691:4;34708:129;34717:12;:10;:12::i;:::-;34731:7;34740:96;34779:15;34740:96;;;;;;;;;;;;;;;;;:11;:25;34752:12;:10;:12::i;:::-;34740:25;;;;;;;;;;;;;;;;;;-1:-1:-1;34740:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;31960:175::-;32046:4;32063:42;32073:12;:10;:12::i;:::-;32087:9;32098:6;32063:9;:42::i;45287:49::-;45331:5;45287:49;:::o;53777:218::-;10122:1;10728:7;;:19;;10720:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10122:1;10861:7;:18;53896:8:::1;::::0;53860:6:::1;::::0;:31:::1;::::0;;;;;53885:4:::1;53860:31;::::0;::::1;::::0;;;53836:70:::1;::::0;53856:2;;53860:45:::1;::::0;53896:8:::1;::::0;;::::1;::::0;53860:6:::1;::::0;;::::1;::::0;:16:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;:6;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53860:31:0;;:35:::1;:45::i;:::-;53836:6;::::0;::::1;;::::0;:70;:19:::1;:70::i;:::-;53977:8;::::0;53941:6:::1;::::0;:31:::1;::::0;;;;;53966:4:::1;53941:31;::::0;::::1;::::0;;;53917:70:::1;::::0;53937:2;;53941:45:::1;::::0;53977:8;;;::::1;;;::::0;53941:6:::1;::::0;;::::1;::::0;:16:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;:6;:31;::::1;;::::0;::::1;;;;::::0;::::1;:45;53917:6;::::0;::::1;;::::0;:70;:19:::1;:70::i;:::-;-1:-1:-1::0;10078:1:0;11040:7;:22;53777:218::o;45484:34::-;;;;;;:::o;45561:29::-;;;;;;:::o;40772:839::-;41003:15;40991:8;:27;;40983:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41159:15;;41276:13;;;;41054:14;41276:13;;;:6;:13;;;;;;;;:15;;;;;;;;;41225:77;;40016:66;41225:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41193:128;;;;;;41095:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41071:276;;;;;;;;;41385:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41054:14;;41276:15;41385:26;;;;;-1:-1:-1;41385:26:0;;;;;;;;;;41276:15;41385:26;;;;;;;;;;;;;;;-1:-1:-1;;41385:26:0;;;;;;-1:-1:-1;;41444:30:0;;;;;;;:59;;;41498:5;41478:25;;:16;:25;;;41444:59;41422:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41572:31;41581:5;41588:7;41597:5;41572:8;:31::i;:::-;40772:839;;;;;;;;;:::o;55091:666::-;55451:8;;55548:9;;55451:8;;;;;55482;;;;;;;55548:9;;;;55581;;;;;55214:17;;55518:6;;;;;45093:5;55605:14;;55601:106;;;55649:9;55636:22;;55686:9;55673:22;;55601:106;55735:14;;55717:32;;55091:666;;;;;;:::o;32198:151::-;32314:18;;;;32287:7;32314:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32198:151::o;39823:30::-;;;;:::o;54050:973::-;10122:1;10728:7;;:19;;10720:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10122:1;10861:7;:18;54109:14:::1;54125:23;;:::i;:::-;54152:17;:15;:17::i;:::-;54108:61;;;;54180:10;54193:25;54202:9;54213:4;54193:8;:25::i;:::-;54180:38;;54229:26;;:::i;:::-;54292:6;::::0;54285:39:::1;::::0;;;;;54318:4:::1;54285:39;::::0;::::1;::::0;;;54292:6:::1;::::0;;::::1;::::0;54285:24:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;54292:6;54285:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54285:39:0;54266:58;;54361:6:::1;::::0;54354:39:::1;::::0;;;;;54387:4:::1;54354:39;::::0;::::1;::::0;;;54361:6:::1;::::0;;::::1;::::0;54354:24:::1;::::0;:39;;;;;54285::::1;::::0;54354;;;;;;;;54361:6;54354:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54354:39:0;::::1;54335:16:::0;::::1;:58:::0;54460:464;::::1;;;54490:20;54513:13;:11;:13::i;:::-;54617::::0;;54580:16;;54490:36;;-1:-1:-1;54541:9:0::1;::::0;54553:161:::1;::::0;54617:13;54580:34:::1;::::0;54490:36;54580:20:::1;:34::i;:::-;:50;;;;;;54686:4;:13;;;54649:34;54670:12;54649:7;:16;;;:20;;:34;;;;:::i;54553:161::-;54541:173;;54749:64;54782:12;54758:21;54777:1;54758:4;:14;;;:18;;:21;;;;:::i;:::-;:36;;;;;;54796:7;:16;;;54749:8;:64::i;:::-;54729:17;::::0;::::1;:84:::0;54857:14:::1;::::0;::::1;::::0;54848:64:::1;::::0;54881:12;;54857:21:::1;::::0;54876:1;54857:18:::1;:21::i;:::-;:36;;;;;;54895:7;:16;;;54848:8;:64::i;:::-;54828:17;::::0;::::1;:84:::0;-1:-1:-1;;54460:464:0::1;54934:27;54942:9;54953:7;54934;:27::i;:::-;54976:5;54972:43;;;54991:24;54996:9;55007:7;54991:4;:24::i;:::-;54983:5;:32:::0;54972:43:::1;-1:-1:-1::0;;10078:1:0;11040:7;:22;-1:-1:-1;;54050:973:0:o;59130:324::-;59180:14;59196:23;;:::i;:::-;59248:8;;;;;;59232:24;;59283:8;;;;59267:13;;;:24;59314:6;;;;;;45093:5;59314:13;;;;-1:-1:-1;59338:109:0;;59385:9;;;;;;59368:14;;;:26;59426:9;;;;;59409:14;;;:26;59338:109;59130:324;;:::o;22608:177::-;22718:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22741:23;22718:58;;;22691:86;;22711:5;;22691:19;:86::i;:::-;22608:177;;;:::o;2828:179::-;2886:7;2918:5;;;2942:6;;;;2934:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3290:158;3348:7;3381:1;3376;:6;;3368:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3435:5:0;;;3290:158::o;56625:852::-;56928:24;56955:28;:13;45381:6;56955:17;:28::i;:::-;56928:55;;57013:51;57034:29;57048:14;;57034:9;:13;;:29;;;;:::i;:::-;57013:16;;:20;:51::i;:::-;56994:70;-1:-1:-1;45381:6:0;56994:70;57094:28;;-1:-1:-1;57133:24:0;57160:28;:13;45381:6;57160:17;:28::i;:::-;57133:55;;57218:51;57239:29;57253:14;;57239:9;:13;;:29;;;;:::i;57218:51::-;45381:6;57299:28;;;-1:-1:-1;57402:34:0;:14;57421;57402:18;:34::i;:::-;57360:38;:16;57381;57360:20;:38::i;:::-;:76;;57338:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56625:852;;;;;;;;:::o;57515:503::-;57616:13;;57604:26;;:11;:26::i;:::-;57593:8;:37;;;;;;;;;;;;;;;57664:13;;;;57652:26;;:11;:26::i;:::-;57641:8;;:37;;;;;;;;;;;;;;;;;;57693:9;57689:240;;;57744:13;;57726:14;;;;:31;;;;:66;;;57779:4;:13;;;57761:4;:14;;;:31;;57726:66;57719:74;;;;57836:27;57848:4;:14;;;57836:11;:27::i;:::-;57824:9;:39;;;;;;;;;;;;;;;57902:14;;;;57890:27;;:11;:27::i;:::-;57878:9;;:39;;;;;;;;;;;;;;;;;;57689:240;57949:14;;;;;57965;;;;;57981:13;;57996;;;;;57944:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57515:503;;:::o;27821:106::-;27909:10;27821:106;:::o;37745:346::-;37847:19;;;37839:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37926:21;;;37918:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37999:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;38051:32;;;;;;;;;;;;;;;;;37745:346;;;:::o;35357:539::-;35463:20;;;35455:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35544:23;;;35536:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35620:47;35641:6;35649:9;35660:6;35620:20;:47::i;:::-;35700:71;35722:6;35700:71;;;;;;;;;;;;;;;;;:17;;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;35680:17;;;;:9;:17;;;;;;;;;;;:91;;;;35805:20;;;;;;;:32;;35830:6;35805:24;:32::i;:::-;35782:20;;;;:9;:20;;;;;;;;;;;;:55;;;;35853:35;;;;;;;35782:20;;35853:35;;;;;;;;;;;;;35357:539;;;:::o;5655:166::-;5741:7;5777:12;5769:6;;;;5761:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5808:5:0;;;5655:166::o;58123:953::-;58200:10;58224:13;58239:23;58266:7;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58266:29:0;;;;;;;58361:5;;58314:19;;;;;;;-1:-1:-1;58266:29:0;;-1:-1:-1;58266:29:0;;-1:-1:-1;58361:5:0;58392:677;;58422:11;;58418:581;;58454:13;58470:35;58483:21;58488:9;58499:4;58483;:21::i;58470:35::-;58454:51;;58524:17;58544:20;58557:6;58544:12;:20::i;:::-;58524:40;;58595:9;58587:5;:17;58583:401;;;58629:17;58649:109;;;;:39;58667:20;:5;58677:9;58667;:20::i;:::-;58649:13;:11;:13::i;:::-;:17;;:39::i;:109::-;58629:129;-1:-1:-1;58781:19:0;58803:30;58828:4;58803:20;:5;58813:9;58803;:20::i;:30::-;58781:52;;58856:17;58888:11;58876:9;:23;;;;;;;-1:-1:-1;58926:13:0;;58922:42;;58941:23;58947:5;58954:9;58941:5;:23::i;:::-;58583:401;;;;58418:581;;;58392:677;;;59020:11;;59016:53;;59056:1;59048:5;:9;59016:53;58123:953;;;;;;;:::o;3707:220::-;3765:7;3789:6;3785:20;;-1:-1:-1;3804:1:0;3797:8;;3785:20;3828:5;;;3832:1;3828;:5;:1;3852:5;;;;;:10;3844:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26859:312;26907:9;26937:1;26933;:5;26929:235;;;-1:-1:-1;26959:1:0;26995;26991;26987:5;;:9;27011:92;27022:1;27018;:5;27011:92;;;27048:1;27044:5;;27086:1;27081;27077;27073;:5;;;;;;:9;27072:15;;;;;;27068:19;;27011:92;;;26929:235;;;;27124:6;;27120:44;;-1:-1:-1;27151:1:0;26859:312;;;:::o;36178:378::-;36262:21;;;36254:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36332:49;36361:1;36365:7;36374:6;36332:20;:49::i;:::-;36409:12;;:24;;36426:6;36409:16;:24::i;:::-;36394:12;:39;36465:18;;;:9;:18;;;;;;;;;;;:30;;36488:6;36465:22;:30::i;:::-;36444:18;;;:9;:18;;;;;;;;;;;:51;;;;36511:37;;;;;;;36444:18;;:9;;36511:37;;;;;;;;;;36178:378;;:::o;7938:106::-;7996:7;8027:1;8023;:5;:13;;8035:1;8023:13;;;-1:-1:-1;8031:1:0;;8016:20;-1:-1:-1;7938:106:0:o;7755:107::-;7813:7;7845:1;7840;:6;;:14;;7853:1;7840:14;;59462:188;59540:7;59567:9;:75;;59629:13;;;;59613;;:29;59567:75;;;-1:-1:-1;59596:14:0;;;;59579;;;;;:31;;59462:188;-1:-1:-1;59462:188:0:o;36889:418::-;36973:21;;;36965:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37045:49;37066:7;37083:1;37087:6;37045:20;:49::i;:::-;37128:68;37151:6;37128:68;;;;;;;;;;;;;;;;;:18;;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;37107:18;;;:9;:18;;;;;;;;;;:89;37222:12;;:24;;37239:6;37222:16;:24::i;:::-;37207:12;:39;37262:37;;;;;;;;37288:1;;37262:37;;;;;;;;;;;;;36889:418;;:::o;24913:761::-;25337:23;25363:69;25391:4;25363:69;;;;;;;;;;;;;;;;;25371:5;25363:27;;;;:69;;;;;:::i;:::-;25447:17;;25337:95;;-1:-1:-1;25447:21:0;25443:224;;25589:10;25578:30;;;;;;;;;;;;;;;-1:-1:-1;25578:30:0;25570:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59658:152;59713:7;45044:10;59741:1;:16;;59733:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59800:1:0;59658:152::o;17594:195::-;17697:12;17729:52;17751:6;17759:4;17765:1;17768:12;17729:21;:52::i;:::-;17722:59;17594:195;-1:-1:-1;;;;17594:195:0:o;18646:530::-;18773:12;18831:5;18806:21;:30;;18798:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18898:18;18909:6;18898:10;:18::i;:::-;18890:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19024:12;19038:23;19065:6;:11;;19085:5;19093:4;19065:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19023:75;;;;19116:52;19134:7;19143:10;19155:12;19116:17;:52::i;:::-;19109:59;18646:530;-1:-1:-1;;;;;;;18646:530:0:o;14676:422::-;15043:20;15082:8;;;14676:422::o;21186:742::-;21301:12;21330:7;21326:595;;;-1:-1:-1;21361:10:0;21354:17;;21326:595;21475:17;;:21;21471:439;;21738:10;21732:17;21799:15;21786:10;21782:2;21778:19;21771:44;21686:148;21874:20;;;;;;;;;;;;;;;;;;;;21881:12;;21874:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Metadata Hash
46a8a082300af5f226c618db95013841bc987ae34f110242c887486e6f1d75f6
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.