More Info
Private Name Tags
ContractCreator
Latest 22 from a total of 22 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 19860305 | 88 days ago | IN | 0 ETH | 0.00097942 | ||||
Unstake Exact St... | 19860298 | 88 days ago | IN | 0 ETH | 0.0004949 | ||||
Stake | 19738792 | 105 days ago | IN | 0 ETH | 0.00106189 | ||||
Stake | 19735542 | 106 days ago | IN | 0 ETH | 0.00067208 | ||||
Stake | 19359372 | 159 days ago | IN | 0 ETH | 0.00527968 | ||||
Stake | 19354579 | 159 days ago | IN | 0 ETH | 0.00586674 | ||||
Stake | 19239295 | 176 days ago | IN | 0 ETH | 0.00301727 | ||||
Stake | 19076814 | 198 days ago | IN | 0 ETH | 0.00188739 | ||||
Stake | 19069667 | 199 days ago | IN | 0 ETH | 0.00245257 | ||||
Stake | 19069629 | 199 days ago | IN | 0 ETH | 0.00280255 | ||||
Stake | 18997999 | 209 days ago | IN | 0 ETH | 0.00207514 | ||||
Stake | 18964589 | 214 days ago | IN | 0 ETH | 0.00500511 | ||||
Stake | 18893919 | 224 days ago | IN | 0 ETH | 0.00279948 | ||||
Add Pool | 18893012 | 224 days ago | IN | 0 ETH | 0.00261228 | ||||
Add Pool | 18893011 | 224 days ago | IN | 0 ETH | 0.00260724 | ||||
Stake | 18889844 | 225 days ago | IN | 0 ETH | 0.00402347 | ||||
Stake | 18871221 | 227 days ago | IN | 0 ETH | 0.00298787 | ||||
Stake | 18766169 | 242 days ago | IN | 0 ETH | 0.00656238 | ||||
Stake | 18766130 | 242 days ago | IN | 0 ETH | 0.00318415 | ||||
Add Pool | 18766127 | 242 days ago | IN | 0 ETH | 0.00492562 | ||||
Add Pool | 17347352 | 441 days ago | IN | 0 ETH | 0.0022163 | ||||
0x60806040 | 17347283 | 441 days ago | IN | 0 ETH | 0.10437029 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingC
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-27 */ // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.7.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/math/SafeMath.sol pragma solidity ^0.7.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/token/ERC20/IERC20.sol pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.7.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: @openzeppelin/contracts/utils/Context.sol 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/access/Ownable.sol pragma solidity ^0.7.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: Staking.sol pragma solidity ^0.7.0; contract StakingC is Context, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; event PoolAdded(uint256 indexed poolId, address indexed token, uint256 cliff, uint256 duration, uint256 penalty, uint256 unstakeCliff); event PoolClosed(uint256 indexed poolId); event Staked(address indexed token, uint256 indexed pool, address indexed beneficiary, uint256 stake, uint256 stakeAmount, uint256 duration); event UnstakeIntention(address indexed token, uint256 indexed pool, address indexed beneficiary, uint256 stake, uint256 amount); event Unstaked(address indexed token, uint256 indexed pool, address indexed beneficiary, uint256 stake, uint256 unstakeAmount, uint256 penalty); uint256 private constant EXP = 1e18; struct Pool { IERC20 token; // Token of the pool uint256 cliff; // Period when unstake is prohibited uint256 duration; // Stake duration (including cliff) uint256 penalty; // Penalty of early unstake calculated as amount * penalty / EXP uint256 unstakeCliff; // Period between unstake intention and unstake bool closed; // Closed pool is no longer available for new stakes, only unstake allowed uint256 tvl; // Total amount of tokens locked in this pool } struct Stake { uint256 start; uint256 amount; uint256 unstakeIntentionTimestamp; } Pool[] public pools; mapping(address => mapping(uint256 => Stake[])) public stakes; address public penaltyBeneficiary; uint256 public constant ADMIN_UNSTAKE_PENALTY = 0.03e18; constructor() { penaltyBeneficiary = owner(); } function addPool(IERC20 token, uint256 cliff, uint256 duration, uint256 penalty, uint256 unstakeCliff) external onlyOwner returns(uint256) { require(penalty < EXP, "penalty >= 100%"); require(duration >= cliff, "wrong duration"); //Infinite pool can be created with zero cliff && zero duration uint256 poolId = pools.length; pools.push(Pool({ token: token, cliff: cliff, duration: duration, penalty:penalty, unstakeCliff:unstakeCliff, closed:false, tvl: 0 })); emit PoolAdded(poolId, address(token), cliff, duration, penalty, unstakeCliff); return poolId; } function closePool(uint256 poolId) external onlyOwner { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); require(!pool.closed, "already closed"); pool.closed = true; emit PoolClosed(poolId); } function setPenaltyBeneficiary(address _penaltyBeneficiary) external onlyOwner { penaltyBeneficiary = _penaltyBeneficiary; } function stake(uint256 poolId, uint256 amount) external { stakeInternal(_msgSender(), poolId, amount); } function stakeFor(address beneficiary, uint256 poolId, uint256 amount) external { stakeInternal(beneficiary, poolId, amount); } /** * @notice Intention to unstake from specific stake * @param poolId Pool to unstake from * @param stakeId Stake to unstake from */ function unstakeIntention(uint256 poolId, uint256 stakeId) external { unstakeIntentionInternal(_msgSender(), poolId, stakeId); } /** * @notice Unstake from specific stake * @param poolId Pool to unstake from * @param stakeId Stake to unstake from * @param amount Amount to unstake */ function unstakeExactStake(uint256 poolId, uint256 stakeId, uint256 amount) external { unstakeExactStakeInternal(_msgSender(), poolId, stakeId, amount); } /** * @notice Unstake from specific stakes * @param poolId Pool to unstake from * @param stakeIds Array of stake ids to use for unstake, must be sorted in ascending order * @param amounts Array of amounts corresponding to stake ids */ function unstakeExactStakes(uint256 poolId, uint256[] calldata stakeIds, uint256[] calldata amounts) external { require(stakeIds.length == amounts.length, "arrays length mismatch"); unstakeExactStakesInternal(_msgSender(), poolId, stakeIds, amounts); } /** * @notice Unstake + stake to another pool * @param fromPoolId Pool to unstake from * @param stakeId Stake to unstake from * @param amount Amount to unstake * @param toPoolId Pool to stake to */ function restake(uint256 fromPoolId, uint256 stakeId, uint256 amount, uint256 toPoolId) external { restakeExactStakeInternal(_msgSender(), fromPoolId, stakeId, amount, toPoolId); } function userStakesAndPenalties(address beneficiary, uint256 poolId) external view returns(uint256[] memory stakeStarts, uint256[] memory stakeAmounts, uint256[] memory penalties) { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); Stake[] storage userStakes = stakes[beneficiary][poolId]; stakeStarts = new uint256[](userStakes.length); stakeAmounts = new uint256[](userStakes.length); penalties = new uint256[](userStakes.length); for(uint256 i=0; i<userStakes.length; i++) { Stake storage stakee = userStakes[i]; stakeStarts[i] = stakee.start; stakeAmounts[i] = stakee.amount; uint256 unstakeTimestamp = (stakee.unstakeIntentionTimestamp == 0)?block.timestamp:stakee.unstakeIntentionTimestamp; uint256 penaltieForFullUnstake = calculateUnstakePenalty(pool, stakee, stakee.amount, unstakeTimestamp); if (penaltieForFullUnstake == 0) { penalties[i] = 0; } else if(penaltieForFullUnstake == stakee.amount) { penalties[i] = EXP; } else { penalties[i] = penaltieForFullUnstake.mul(EXP).div(stakee.amount); } } } function allUserStakesAndPenalties(address beneficiary) external view returns(uint256[] memory stakePools, uint256[] memory stakeIds, uint256[] memory stakeStarts, uint256[] memory stakeAmounts, uint256[] memory penalties, uint256[] memory unstakeIntentionTimestamps) { uint256 totalStakes; for(uint256 p=0; p<pools.length; p++){ totalStakes += stakes[beneficiary][p].length; } stakePools = new uint256[](totalStakes); stakeIds = new uint256[](totalStakes); stakeStarts = new uint256[](totalStakes); stakeAmounts = new uint256[](totalStakes); penalties = new uint256[](totalStakes); unstakeIntentionTimestamps = new uint256[](totalStakes); uint256 idx; for(uint256 p=0; p<pools.length; p++){ Stake[] storage userStakes = stakes[beneficiary][p]; if(userStakes.length == 0) continue; Pool storage pool = pools[p]; for(uint256 i=0; i<userStakes.length; i++) { Stake storage stakee = userStakes[i]; stakePools[idx] = p; stakeIds[idx] = i; stakeStarts[idx] = stakee.start; stakeAmounts[idx] = stakee.amount; unstakeIntentionTimestamps[idx] = stakee.unstakeIntentionTimestamp; uint256 unstakeTimestamp = (stakee.unstakeIntentionTimestamp == 0)?block.timestamp:stakee.unstakeIntentionTimestamp; uint256 penaltieForFullUnstake = calculateUnstakePenalty(pool, stakee, stakee.amount, unstakeTimestamp); if (penaltieForFullUnstake == 0) { penalties[idx] = 0; } else if(penaltieForFullUnstake == stakee.amount) { penalties[idx] = EXP; } else { penalties[idx] = penaltieForFullUnstake.mul(EXP).div(stakee.amount); } idx++; } } } function stakeInternal(address beneficiary, uint256 poolId, uint256 amount) internal { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); require(!pool.closed, "pool closed"); pool.token.safeTransferFrom(_msgSender(), address(this), amount); Stake[] storage userStakes = stakes[beneficiary][poolId]; uint256 stakeId = userStakes.length; userStakes.push(Stake({ start: block.timestamp, amount: amount, unstakeIntentionTimestamp: 0 })); pool.tvl = pool.tvl.add(amount); emit Staked(address(pool.token), poolId, beneficiary, stakeId, amount, pool.duration); } function unstakeIntentionInternal(address beneficiary, uint256 poolId, uint256 stakeId) internal { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); Stake[] storage userStakes = stakes[beneficiary][poolId]; require(userStakes.length > 0, "no stakes"); require(stakeId < userStakes.length, "wrong stake id"); Stake storage stakee = userStakes[stakeId]; stakee.unstakeIntentionTimestamp = block.timestamp; emit UnstakeIntention(address(pool.token), poolId, beneficiary, stakeId, stakee.amount); } function adminUnstakeExactStake(address beneficiary, uint256 poolId, uint256 stakeId, uint256 unstakeAmount) external onlyOwner { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); Stake[] storage userStakes = stakes[beneficiary][poolId]; require(userStakes.length > 0, "no stakes"); require(stakeId < userStakes.length, "wrong stake id"); Stake storage stakee = userStakes[stakeId]; require(unstakeAmount <= stakee.amount, "unstakeAmount too high"); uint256 penaltyAmount = unstakeAmount.mul(ADMIN_UNSTAKE_PENALTY).div(EXP); uint256 userAmount = unstakeAmount.sub(penaltyAmount); stakee.amount = stakee.amount.sub(unstakeAmount); stakee.unstakeIntentionTimestamp = 0; if(stakee.unstakeIntentionTimestamp == 0){ emit UnstakeIntention(address(pool.token), poolId, beneficiary, stakeId, unstakeAmount); } emit Unstaked(address(pool.token), poolId, beneficiary, stakeId, unstakeAmount, penaltyAmount); pool.tvl = pool.tvl.sub(unstakeAmount); pool.token.safeTransfer(beneficiary, userAmount); if(penaltyAmount > 0) { pool.token.safeTransfer(penaltyBeneficiary, penaltyAmount); } } function unstakeExactStakeInternal(address beneficiary, uint256 poolId, uint256 stakeId, uint256 unstakeAmount) internal { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); Stake[] storage userStakes = stakes[beneficiary][poolId]; require(userStakes.length > 0, "no stakes"); require(stakeId < userStakes.length, "wrong stake id"); Stake storage stakee = userStakes[stakeId]; (uint256 userAmount, uint256 penaltyAmount) = prepareUnstakeExactStake(pool, stakee, unstakeAmount, false); stakee.amount = stakee.amount.sub(unstakeAmount); emit Unstaked(address(pool.token), poolId, beneficiary, stakeId, unstakeAmount, penaltyAmount); pool.tvl = pool.tvl.sub(unstakeAmount); pool.token.safeTransfer(beneficiary, userAmount); if(penaltyAmount > 0) { pool.token.safeTransfer(penaltyBeneficiary, penaltyAmount); } } function unstakeExactStakesInternal(address beneficiary, uint256 poolId, uint256[] memory stakeIds, uint256[] memory amounts) internal { Pool storage pool = pools[poolId]; require(address(pool.token) != address(0), "pool not found"); Stake[] storage userStakes = stakes[beneficiary][poolId]; require(userStakes.length > 0, "no stakes"); //require(stakeIds.length == amounts.length, "arrays length mismatch"); //Here we assume its already checked uint256 prevStakeId; uint256 totalUserAmount; uint256 totalPenaltyAmount; for (uint256 i=0; i<stakeIds.length; i++) { uint256 stakeId = stakeIds[i]; require(i==0 || prevStakeId < stakeId, "unsorted stake ids"); // Prevent unstaking from same stake twice require(stakeId < userStakes.length, "wrong stake id"); prevStakeId = stakeId; Stake storage stakee = userStakes[stakeId]; (uint256 userAmount, uint256 penaltyAmount) = prepareUnstakeExactStake(pool, stakee, amounts[i], false); stakee.amount = stakee.amount.sub(amounts[i]); emit Unstaked(address(pool.token), poolId, beneficiary, stakeIds[i], amounts[i], penaltyAmount); totalUserAmount = totalUserAmount.add(userAmount); totalPenaltyAmount = totalPenaltyAmount.add(penaltyAmount); } pool.tvl = pool.tvl.sub(totalUserAmount).sub(totalPenaltyAmount); pool.token.safeTransfer(beneficiary, totalUserAmount); if(totalPenaltyAmount > 0) { pool.token.safeTransfer(penaltyBeneficiary, totalPenaltyAmount); } } function restakeExactStakeInternal(address beneficiary, uint256 fromPoolId, uint256 stakeId, uint256 amount, uint256 toPoolId) internal { Pool storage pool = pools[fromPoolId]; require(address(pool.token) != address(0), "pool not found"); Pool storage toPool = pools[toPoolId]; require(address(pool.token) == address(toPool.token), "different pool tokens"); bool ignoreUnstake = (toPool.duration >= pool.duration); // Allow restake without intention to a pool with longer duration Stake[] storage userStakes = stakes[beneficiary][fromPoolId]; require(userStakes.length > 0, "no stakes"); require(stakeId < userStakes.length, "wrong stake id"); Stake storage stakee = userStakes[stakeId]; (uint256 userAmount, uint256 penaltyAmount) = prepareUnstakeExactStake(pool, stakee, amount, ignoreUnstake); stakee.amount = stakee.amount.sub(amount); if(stakee.unstakeIntentionTimestamp == 0){ emit UnstakeIntention(address(pool.token), fromPoolId, beneficiary, stakeId, amount); } emit Unstaked(address(pool.token), fromPoolId, beneficiary, stakeId, amount, penaltyAmount); pool.tvl = pool.tvl.sub(amount); //pool.token.safeTransfer(beneficiary, userAmount); // Do not transfer to user because we restake it userStakes = stakes[beneficiary][toPoolId]; uint256 toStakeId = userStakes.length; userStakes.push(Stake({ start: block.timestamp, amount: userAmount, unstakeIntentionTimestamp: 0 })); toPool.tvl = toPool.tvl.add(userAmount); emit Staked(address(toPool.token), toPoolId, beneficiary, toStakeId, userAmount, pool.duration); if(penaltyAmount > 0) { pool.token.safeTransfer(penaltyBeneficiary, penaltyAmount); } } function prepareUnstakeExactStake(Pool storage pool, Stake storage stakee, uint256 amount, bool ignoreUnstake) internal returns(uint256 userAmount, uint256 penaltyAmount) { require(stakee.start > 0, "incorrect stake"); // should never happen, but just to be sure... require(amount > 0, "wrong amount"); require(amount <= stakee.amount, "high amount"); uint256 unstakeTimestamp = block.timestamp; if(pool.unstakeCliff > 0) { if(!ignoreUnstake) { require(stakee.unstakeIntentionTimestamp > 0, "no unstake intention"); require(stakee.unstakeIntentionTimestamp.add(pool.unstakeCliff) <= block.timestamp, "unstake cliff not passed"); unstakeTimestamp = stakee.unstakeIntentionTimestamp; } stakee.unstakeIntentionTimestamp = 0; } if(pool.duration > 0) { penaltyAmount = calculateUnstakePenalty(pool, stakee, amount, unstakeTimestamp); require(penaltyAmount < amount, "unstake not available yet"); userAmount = amount - penaltyAmount; return (userAmount, penaltyAmount); } else { return (amount, 0); } } /** * @notice Calculates penalty amount * @dev if penalty == unstakeAmount, that indicates that unstake is forbidden * @param pool Pool of the stake * @param stakee Stake to unstake from * @param unstakeAmount Amount to unstake * @param unstakeTimestamp Timestamp of unstake action (usually timestamp of unstake intention) * @return penalty amount */ function calculateUnstakePenalty(Pool storage pool, Stake storage stakee, uint256 unstakeAmount, uint256 unstakeTimestamp) internal view returns(uint256) { uint256 timePassed = unstakeTimestamp.sub(stakee.start); if(timePassed >= pool.duration) return 0; if(timePassed < pool.cliff) return unstakeAmount; //unstake is prohibited uint256 penaltyTimeLeft = pool.duration.sub(timePassed); uint256 linearVestingDuration = pool.duration.sub(pool.cliff); // penaltyTimePeriod != 0 because if pool.duration == pool.cliff, then one of conditions above will be true return unstakeAmount.mul(pool.penalty).mul(penaltyTimeLeft).div(linearVestingDuration).div(EXP); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"cliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeCliff","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pool","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pool","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeIntention","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pool","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"ADMIN_UNSTAKE_PENALTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"},{"internalType":"uint256","name":"unstakeCliff","type":"uint256"}],"name":"addPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint256","name":"unstakeAmount","type":"uint256"}],"name":"adminUnstakeExactStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"allUserStakesAndPenalties","outputs":[{"internalType":"uint256[]","name":"stakePools","type":"uint256[]"},{"internalType":"uint256[]","name":"stakeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"stakeStarts","type":"uint256[]"},{"internalType":"uint256[]","name":"stakeAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"penalties","type":"uint256[]"},{"internalType":"uint256[]","name":"unstakeIntentionTimestamps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"closePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penaltyBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"},{"internalType":"uint256","name":"unstakeCliff","type":"uint256"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"uint256","name":"tvl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromPoolId","type":"uint256"},{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"toPoolId","type":"uint256"}],"name":"restake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_penaltyBeneficiary","type":"address"}],"name":"setPenaltyBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unstakeIntentionTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeExactStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256[]","name":"stakeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"unstakeExactStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"unstakeIntention","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"userStakesAndPenalties","outputs":[{"internalType":"uint256[]","name":"stakeStarts","type":"uint256[]"},{"internalType":"uint256[]","name":"stakeAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"penalties","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000620000246200011860201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620000d26200012060201b60201c565b600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000149565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61471e80620001596000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063715018a6116100ad578063c2b2363711610071578063c2b23637146105d3578063ce24788c146106ab578063dd63152c146106ef578063f2fde38b146108f0578063f52b619a1461093457610121565b8063715018a6146104775780637b0472f0146104815780638da5cb5b146104b95780639e7ac263146104ed578063ac4afa381461054f57610121565b806329286910116100f4578063292869101461020657806329cb00901461023e57806337de615f146102be57806351d25d5d146102ec57806358e9a8151461041f57610121565b80630754219b146101265780630913dd70146101725780631c3cbf04146101a657806321a6a29c146101c4575b600080fd5b6101706004803603608081101561013c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291905050506109ae565b005b61017a6109c8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101ae6109ee565b6040518082815260200191505060405180910390f35b610204600480360360608110156101da57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506109f9565b005b61023c6004803603604081101561021c57600080fd5b810190808035906020019092919080359060200190929190505050610a11565b005b6102a8600480360360a081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610a27565b6040518082815260200191505060405180910390f35b6102ea600480360360208110156102d457600080fd5b8101908080359060200190929190505050610d5c565b005b6103386004803603604081101561030257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc4565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015610383578082015181840152602081019050610368565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156103c55780820151818401526020810190506103aa565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156104075780820151818401526020810190506103ec565b50505050905001965050505050505060405180910390f35b6104756004803603606081101561043557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061133f565b005b61047f61134f565b005b6104b76004803603604081101561049757600080fd5b8101908080359060200190929190803590602001909291905050506114bc565b005b6104c16114d2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054d6004803603608081101561050357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291905050506114fb565b005b61057b6004803603602081101561056557600080fd5b8101908080359060200190929190505050611b15565b604051808873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001831515815260200182815260200197505050505050505060405180910390f35b6106a9600480360360608110156105e957600080fd5b81019080803590602001909291908035906020019064010000000081111561061057600080fd5b82018360208201111561062257600080fd5b8035906020019184602083028401116401000000008311171561064457600080fd5b90919293919293908035906020019064010000000081111561066557600080fd5b82018360208201111561067757600080fd5b8035906020019184602083028401116401000000008311171561069957600080fd5b9091929391929390505050611b94565b005b6106ed600480360360208110156106c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cab565b005b6107316004803603602081101561070557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d9e565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b8381101561078857808201518184015260208101905061076d565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b838110156107ca5780820151818401526020810190506107af565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561080c5780820151818401526020810190506107f1565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b8381101561084e578082015181840152602081019050610833565b50505050905001878103835289818151815260200191508051906020019060200280838360005b83811015610890578082015181840152602081019050610875565b50505050905001878103825288818151815260200191508051906020019060200280838360005b838110156108d25780820151818401526020810190506108b7565b505050509050019c5050505050505050505050505060405180910390f35b6109326004803603602081101561090657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612232565b005b61098a6004803603606081101561094a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612424565b60405180848152602001838152602001828152602001935050505060405180910390f35b6109c26109b9612478565b85858585612480565b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b666a94d74f43000081565b610a0c610a04612478565b848484612b76565b505050565b610a23610a1c612478565b8383612f82565b5050565b6000610a31612478565b73ffffffffffffffffffffffffffffffffffffffff16610a4f6114d2565b73ffffffffffffffffffffffffffffffffffffffff1614610ad8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b670de0b6b3a76400008310610b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f70656e616c7479203e3d2031303025000000000000000000000000000000000081525060200191505060405180910390fd5b84841015610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67206475726174696f6e00000000000000000000000000000000000081525060200191505060405180910390fd5b6000600180549050905060016040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020016000151581526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c0820151816006015550508673ffffffffffffffffffffffffffffffffffffffff16817f3ff6ba61e9c77719adb4a90993171e493ca68a3469805a3cf4e901b3c317bf32888888886040518085815260200184815260200183815260200182815260200194505050505060405180910390a38091505095945050505050565b610d64612478565b73ffffffffffffffffffffffffffffffffffffffff16610d826114d2565b73ffffffffffffffffffffffffffffffffffffffff1614610e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060018281548110610e1a57fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ef1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900460ff1615610f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f616c726561647920636c6f73656400000000000000000000000000000000000081525060200191505060405180910390fd5b60018160050160006101000a81548160ff021916908315150217905550817f925a19753e677c9dc36a80e0fc824ca0c5b1afde494872b43daccab9ffeaffd460405160405180910390a25050565b6060806060600060018581548110610fd857fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000209050808054905067ffffffffffffffff8111801561111e57600080fd5b5060405190808252806020026020018201604052801561114d5781602001602082028036833780820191505090505b509450808054905067ffffffffffffffff8111801561116b57600080fd5b5060405190808252806020026020018201604052801561119a5781602001602082028036833780820191505090505b509350808054905067ffffffffffffffff811180156111b857600080fd5b506040519080825280602002602001820160405280156111e75781602001602082028036833780820191505090505b50925060005b818054905081101561133557600082828154811061120757fe5b90600052602060002090600302019050806000015487838151811061122857fe5b602002602001018181525050806001015486838151811061124557fe5b60200260200101818152505060008082600201541461126857816002015461126a565b425b9050600061127e8684856001015485613274565b905060008114156112a857600087858151811061129757fe5b602002602001018181525050611325565b82600101548114156112da57670de0b6b3a76400008785815181106112c957fe5b602002602001018181525050611324565b61130b83600101546112fd670de0b6b3a76400008461335790919063ffffffff16565b6133dd90919063ffffffff16565b87858151811061131757fe5b6020026020010181815250505b5b50505080806001019150506111ed565b5050509250925092565b61134a838383613466565b505050565b611357612478565b73ffffffffffffffffffffffffffffffffffffffff166113756114d2565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114ce6114c7612478565b8383613466565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611503612478565b73ffffffffffffffffffffffffffffffffffffffff166115216114d2565b73ffffffffffffffffffffffffffffffffffffffff16146115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600184815481106115b957fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000209050600081805490501161175e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b808054905084106117d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b60008185815481106117e557fe5b90600052602060002090600302019050806001015484111561186f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f756e7374616b65416d6f756e7420746f6f20686967680000000000000000000081525060200191505060405180910390fd5b60006118a5670de0b6b3a7640000611897666a94d74f4300008861335790919063ffffffff16565b6133dd90919063ffffffff16565b905060006118bc82876137b190919063ffffffff16565b90506118d58684600101546137b190919063ffffffff16565b836001018190555060008360020181905550600083600201541415611987578873ffffffffffffffffffffffffffffffffffffffff16888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3afc0cd769150605cf3d677fb22218406594422f1fd5a9266d303d1e3b3f17508a8a604051808381526020018281526020019250505060405180910390a45b8873ffffffffffffffffffffffffffffffffffffffff16888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8a8a8760405180848152602001838152602001828152602001935050505060405180910390a4611a388686600601546137b190919063ffffffff16565b8560060181905550611a8f89828760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b6000821115611b0a57611b09600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b505050505050505050565b60018181548110611b2557600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060060154905087565b818190508484905014611c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f617272617973206c656e677468206d69736d617463680000000000000000000081525060200191505060405180910390fd5b611ca4611c1a612478565b86868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506138d6565b5050505050565b611cb3612478565b73ffffffffffffffffffffffffffffffffffffffff16611cd16114d2565b73ffffffffffffffffffffffffffffffffffffffff1614611d5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606080606080606080600080600090505b600180549050811015611e2157600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002080549050820191508080600101915050611daf565b508067ffffffffffffffff81118015611e3957600080fd5b50604051908082528060200260200182016040528015611e685781602001602082028036833780820191505090505b5096508067ffffffffffffffff81118015611e8257600080fd5b50604051908082528060200260200182016040528015611eb15781602001602082028036833780820191505090505b5095508067ffffffffffffffff81118015611ecb57600080fd5b50604051908082528060200260200182016040528015611efa5781602001602082028036833780820191505090505b5094508067ffffffffffffffff81118015611f1457600080fd5b50604051908082528060200260200182016040528015611f435781602001602082028036833780820191505090505b5093508067ffffffffffffffff81118015611f5d57600080fd5b50604051908082528060200260200182016040528015611f8c5781602001602082028036833780820191505090505b5092508067ffffffffffffffff81118015611fa657600080fd5b50604051908082528060200260200182016040528015611fd55781602001602082028036833780820191505090505b509150600080600090505b600180549050811015612226576000600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000818054905014156120545750612219565b60006001838154811061206357fe5b9060005260206000209060070201905060005b828054905081101561221557600083828154811061209057fe5b90600052602060002090600302019050848d87815181106120ad57fe5b602002602001018181525050818c87815181106120c657fe5b60200260200101818152505080600001548b87815181106120e357fe5b60200260200101818152505080600101548a878151811061210057fe5b602002602001018181525050806002015488878151811061211d57fe5b602002602001018181525050600080826002015414612140578160020154612142565b425b905060006121568584856001015485613274565b905060008114156121805760008b898151811061216f57fe5b6020026020010181815250506121fd565b82600101548114156121b257670de0b6b3a76400008b89815181106121a157fe5b6020026020010181815250506121fc565b6121e383600101546121d5670de0b6b3a76400008461335790919063ffffffff16565b6133dd90919063ffffffff16565b8b89815181106121ef57fe5b6020026020010181815250505b5b87806001019850505050508080600101915050612076565b5050505b8080600101915050611fe0565b50505091939550919395565b61223a612478565b73ffffffffffffffffffffffffffffffffffffffff166122586114d2565b73ffffffffffffffffffffffffffffffffffffffff16146122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612367576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146526026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002602052826000526040600020602052816000526040600020818154811061244c57600080fd5b906000526020600020906003020160009250925050508060000154908060010154908060020154905083565b600033905090565b60006001858154811061248f57fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b60006001838154811061257557fe5b906000526020600020906007020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f646966666572656e7420706f6f6c20746f6b656e73000000000000000000000081525060200191505060405180910390fd5b600082600201548260020154101590506000600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000209050600081805490501161274c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b808054905087106127c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b60008188815481106127d357fe5b906000526020600020906003020190506000806127f287848b88613e2b565b9150915061280d8984600101546137b190919063ffffffff16565b83600101819055506000836002015414156128b5578b73ffffffffffffffffffffffffffffffffffffffff168b8860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3afc0cd769150605cf3d677fb22218406594422f1fd5a9266d303d1e3b3f17508d8d604051808381526020018281526020019250505060405180910390a45b8b73ffffffffffffffffffffffffffffffffffffffff168b8860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8d8d8660405180848152602001838152602001828152602001935050505060405180910390a46129668988600601546137b190919063ffffffff16565b8760060181905550600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000209350600084805490509050846040518060600160405280428152602001858152602001600081525090806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000015560208201518160010155604082015181600201555050612a4683886006015461417990919063ffffffff16565b87600601819055508c73ffffffffffffffffffffffffffffffffffffffff16898860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f76e324f068a8bf6d168b3249574fe4ad25b9f378d8645319674b654c58850b2e84878d6002015460405180848152602001838152602001828152602001935050505060405180910390a46000821115612b6757612b66600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b50505050505050505050505050565b600060018481548110612b8557fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002090506000818054905011612d2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80805490508410612da3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b6000818581548110612db157fe5b90600052602060002090600302019050600080612dd18584886000613e2b565b91509150612dec8684600101546137b190919063ffffffff16565b83600101819055508873ffffffffffffffffffffffffffffffffffffffff16888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8a8a8660405180848152602001838152602001828152602001935050505060405180910390a4612ea58686600601546137b190919063ffffffff16565b8560060181905550612efc89838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b6000811115612f7757612f76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b505050505050505050565b600060018381548110612f9157fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002090506000818054905011613136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b808054905083106131af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b60008184815481106131bd57fe5b906000526020600020906003020190504281600201819055508573ffffffffffffffffffffffffffffffffffffffff16858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3afc0cd769150605cf3d677fb22218406594422f1fd5a9266d303d1e3b3f1750878560010154604051808381526020018281526020019250505060405180910390a4505050505050565b60008061328e8560000154846137b190919063ffffffff16565b9050856002015481106132a557600091505061334f565b85600101548110156132ba578391505061334f565b60006132d38288600201546137b190919063ffffffff16565b905060006132f2886001015489600201546137b190919063ffffffff16565b9050613349670de0b6b3a764000061333b8361332d8661331f8e600301548d61335790919063ffffffff16565b61335790919063ffffffff16565b6133dd90919063ffffffff16565b6133dd90919063ffffffff16565b93505050505b949350505050565b60008083141561336a57600090506133d7565b600082840290508284828161337b57fe5b04146133d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061469e6021913960400191505060405180910390fd5b809150505b92915050565b6000808211613454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161345d57fe5b04905092915050565b60006001838154811061347557fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561354c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900460ff16156135d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f706f6f6c20636c6f73656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b6136296135dc612478565b30848460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614201909392919063ffffffff16565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060008180549050905081604051806060016040528042815260200186815260200160008152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020155505061370384846006015461417990919063ffffffff16565b83600601819055508573ffffffffffffffffffffffffffffffffffffffff16858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f76e324f068a8bf6d168b3249574fe4ad25b9f378d8645319674b654c58850b2e8488886002015460405180848152602001838152602001828152602001935050505060405180910390a4505050505050565b600082821115613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6138d18363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506142c2565b505050565b6000600184815481106138e557fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156139bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002090506000818054905011613a8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600080600080600090505b8751811015613d24576000888281518110613aac57fe5b602002602001015190506000821480613ac457508085105b613b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f756e736f72746564207374616b6520696473000000000000000000000000000081525060200191505060405180910390fd5b85805490508110613baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b8094506000868281548110613bc057fe5b90600052602060002090600302019050600080613bf38a848d8881518110613be457fe5b60200260200101516000613e2b565b91509150613c218b8681518110613c0657fe5b602002602001015184600101546137b190919063ffffffff16565b83600101819055508d73ffffffffffffffffffffffffffffffffffffffff168d8b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8f8981518110613ca957fe5b60200260200101518f8a81518110613cbd57fe5b60200260200101518660405180848152602001838152602001828152602001935050505060405180910390a4613cfc828861417990919063ffffffff16565b9650613d11818761417990919063ffffffff16565b9550505050508080600101915050613a95565b50613d4e81613d408488600601546137b190919063ffffffff16565b6137b190919063ffffffff16565b8560060181905550613da589838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b6000811115613e2057613e1f600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b505050505050505050565b6000806000856000015411613ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f696e636f7272656374207374616b65000000000000000000000000000000000081525060200191505060405180910390fd5b60008411613f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f77726f6e6720616d6f756e74000000000000000000000000000000000000000081525060200191505060405180910390fd5b8460010154841115613f98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f6869676820616d6f756e7400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60004290506000876004015411156140cc57836140c1576000866002015411614029576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f20756e7374616b6520696e74656e74696f6e00000000000000000000000081525060200191505060405180910390fd5b426140458860040154886002015461417990919063ffffffff16565b11156140b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f756e7374616b6520636c696666206e6f7420706173736564000000000000000081525060200191505060405180910390fd5b856002015490505b600086600201819055505b600087600201541115614167576140e587878784613274565b915084821061415c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f756e7374616b65206e6f7420617661696c61626c65207965740000000000000081525060200191505060405180910390fd5b818503925050614170565b84600092509250505b94509492505050565b6000808284019050838110156141f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6142bc846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506142c2565b50505050565b6060614324826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143b19092919063ffffffff16565b90506000815111156143ac5780806020019051602081101561434557600080fd5b81019080805190602001909291905050506143ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806146bf602a913960400191505060405180910390fd5b5b505050565b60606143c084846000856143c9565b90509392505050565b606082471015614424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146786026913960400191505060405180910390fd5b61442d85614572565b61449f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106144ef57805182526020820191506020810190506020830392506144cc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614551576040519150601f19603f3d011682016040523d82523d6000602084013e614556565b606091505b5091509150614566828286614585565b92505050949350505050565b600080823b905060008111915050919050565b606083156145955782905061464a565b6000835111156145a85782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561460f5780820151818401526020810190506145f4565b50505050905090810190601f16801561463c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220e4edd81745ea51850cb9bc83cc121e3c1dc4188fc149dbfffd1db98db280184564736f6c63430007040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063715018a6116100ad578063c2b2363711610071578063c2b23637146105d3578063ce24788c146106ab578063dd63152c146106ef578063f2fde38b146108f0578063f52b619a1461093457610121565b8063715018a6146104775780637b0472f0146104815780638da5cb5b146104b95780639e7ac263146104ed578063ac4afa381461054f57610121565b806329286910116100f4578063292869101461020657806329cb00901461023e57806337de615f146102be57806351d25d5d146102ec57806358e9a8151461041f57610121565b80630754219b146101265780630913dd70146101725780631c3cbf04146101a657806321a6a29c146101c4575b600080fd5b6101706004803603608081101561013c57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291905050506109ae565b005b61017a6109c8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101ae6109ee565b6040518082815260200191505060405180910390f35b610204600480360360608110156101da57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506109f9565b005b61023c6004803603604081101561021c57600080fd5b810190808035906020019092919080359060200190929190505050610a11565b005b6102a8600480360360a081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610a27565b6040518082815260200191505060405180910390f35b6102ea600480360360208110156102d457600080fd5b8101908080359060200190929190505050610d5c565b005b6103386004803603604081101561030257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc4565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015610383578082015181840152602081019050610368565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156103c55780820151818401526020810190506103aa565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156104075780820151818401526020810190506103ec565b50505050905001965050505050505060405180910390f35b6104756004803603606081101561043557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061133f565b005b61047f61134f565b005b6104b76004803603604081101561049757600080fd5b8101908080359060200190929190803590602001909291905050506114bc565b005b6104c16114d2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054d6004803603608081101561050357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291905050506114fb565b005b61057b6004803603602081101561056557600080fd5b8101908080359060200190929190505050611b15565b604051808873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001868152602001858152602001848152602001831515815260200182815260200197505050505050505060405180910390f35b6106a9600480360360608110156105e957600080fd5b81019080803590602001909291908035906020019064010000000081111561061057600080fd5b82018360208201111561062257600080fd5b8035906020019184602083028401116401000000008311171561064457600080fd5b90919293919293908035906020019064010000000081111561066557600080fd5b82018360208201111561067757600080fd5b8035906020019184602083028401116401000000008311171561069957600080fd5b9091929391929390505050611b94565b005b6106ed600480360360208110156106c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cab565b005b6107316004803603602081101561070557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d9e565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b8381101561078857808201518184015260208101905061076d565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b838110156107ca5780820151818401526020810190506107af565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561080c5780820151818401526020810190506107f1565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b8381101561084e578082015181840152602081019050610833565b50505050905001878103835289818151815260200191508051906020019060200280838360005b83811015610890578082015181840152602081019050610875565b50505050905001878103825288818151815260200191508051906020019060200280838360005b838110156108d25780820151818401526020810190506108b7565b505050509050019c5050505050505050505050505060405180910390f35b6109326004803603602081101561090657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612232565b005b61098a6004803603606081101561094a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612424565b60405180848152602001838152602001828152602001935050505060405180910390f35b6109c26109b9612478565b85858585612480565b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b666a94d74f43000081565b610a0c610a04612478565b848484612b76565b505050565b610a23610a1c612478565b8383612f82565b5050565b6000610a31612478565b73ffffffffffffffffffffffffffffffffffffffff16610a4f6114d2565b73ffffffffffffffffffffffffffffffffffffffff1614610ad8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b670de0b6b3a76400008310610b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f70656e616c7479203e3d2031303025000000000000000000000000000000000081525060200191505060405180910390fd5b84841015610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67206475726174696f6e00000000000000000000000000000000000081525060200191505060405180910390fd5b6000600180549050905060016040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020016000151581526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c0820151816006015550508673ffffffffffffffffffffffffffffffffffffffff16817f3ff6ba61e9c77719adb4a90993171e493ca68a3469805a3cf4e901b3c317bf32888888886040518085815260200184815260200183815260200182815260200194505050505060405180910390a38091505095945050505050565b610d64612478565b73ffffffffffffffffffffffffffffffffffffffff16610d826114d2565b73ffffffffffffffffffffffffffffffffffffffff1614610e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060018281548110610e1a57fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ef1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900460ff1615610f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f616c726561647920636c6f73656400000000000000000000000000000000000081525060200191505060405180910390fd5b60018160050160006101000a81548160ff021916908315150217905550817f925a19753e677c9dc36a80e0fc824ca0c5b1afde494872b43daccab9ffeaffd460405160405180910390a25050565b6060806060600060018581548110610fd857fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000209050808054905067ffffffffffffffff8111801561111e57600080fd5b5060405190808252806020026020018201604052801561114d5781602001602082028036833780820191505090505b509450808054905067ffffffffffffffff8111801561116b57600080fd5b5060405190808252806020026020018201604052801561119a5781602001602082028036833780820191505090505b509350808054905067ffffffffffffffff811180156111b857600080fd5b506040519080825280602002602001820160405280156111e75781602001602082028036833780820191505090505b50925060005b818054905081101561133557600082828154811061120757fe5b90600052602060002090600302019050806000015487838151811061122857fe5b602002602001018181525050806001015486838151811061124557fe5b60200260200101818152505060008082600201541461126857816002015461126a565b425b9050600061127e8684856001015485613274565b905060008114156112a857600087858151811061129757fe5b602002602001018181525050611325565b82600101548114156112da57670de0b6b3a76400008785815181106112c957fe5b602002602001018181525050611324565b61130b83600101546112fd670de0b6b3a76400008461335790919063ffffffff16565b6133dd90919063ffffffff16565b87858151811061131757fe5b6020026020010181815250505b5b50505080806001019150506111ed565b5050509250925092565b61134a838383613466565b505050565b611357612478565b73ffffffffffffffffffffffffffffffffffffffff166113756114d2565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114ce6114c7612478565b8383613466565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611503612478565b73ffffffffffffffffffffffffffffffffffffffff166115216114d2565b73ffffffffffffffffffffffffffffffffffffffff16146115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600184815481106115b957fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000209050600081805490501161175e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b808054905084106117d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b60008185815481106117e557fe5b90600052602060002090600302019050806001015484111561186f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f756e7374616b65416d6f756e7420746f6f20686967680000000000000000000081525060200191505060405180910390fd5b60006118a5670de0b6b3a7640000611897666a94d74f4300008861335790919063ffffffff16565b6133dd90919063ffffffff16565b905060006118bc82876137b190919063ffffffff16565b90506118d58684600101546137b190919063ffffffff16565b836001018190555060008360020181905550600083600201541415611987578873ffffffffffffffffffffffffffffffffffffffff16888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3afc0cd769150605cf3d677fb22218406594422f1fd5a9266d303d1e3b3f17508a8a604051808381526020018281526020019250505060405180910390a45b8873ffffffffffffffffffffffffffffffffffffffff16888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8a8a8760405180848152602001838152602001828152602001935050505060405180910390a4611a388686600601546137b190919063ffffffff16565b8560060181905550611a8f89828760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b6000821115611b0a57611b09600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b505050505050505050565b60018181548110611b2557600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060060154905087565b818190508484905014611c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f617272617973206c656e677468206d69736d617463680000000000000000000081525060200191505060405180910390fd5b611ca4611c1a612478565b86868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506138d6565b5050505050565b611cb3612478565b73ffffffffffffffffffffffffffffffffffffffff16611cd16114d2565b73ffffffffffffffffffffffffffffffffffffffff1614611d5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606080606080606080600080600090505b600180549050811015611e2157600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002080549050820191508080600101915050611daf565b508067ffffffffffffffff81118015611e3957600080fd5b50604051908082528060200260200182016040528015611e685781602001602082028036833780820191505090505b5096508067ffffffffffffffff81118015611e8257600080fd5b50604051908082528060200260200182016040528015611eb15781602001602082028036833780820191505090505b5095508067ffffffffffffffff81118015611ecb57600080fd5b50604051908082528060200260200182016040528015611efa5781602001602082028036833780820191505090505b5094508067ffffffffffffffff81118015611f1457600080fd5b50604051908082528060200260200182016040528015611f435781602001602082028036833780820191505090505b5093508067ffffffffffffffff81118015611f5d57600080fd5b50604051908082528060200260200182016040528015611f8c5781602001602082028036833780820191505090505b5092508067ffffffffffffffff81118015611fa657600080fd5b50604051908082528060200260200182016040528015611fd55781602001602082028036833780820191505090505b509150600080600090505b600180549050811015612226576000600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090506000818054905014156120545750612219565b60006001838154811061206357fe5b9060005260206000209060070201905060005b828054905081101561221557600083828154811061209057fe5b90600052602060002090600302019050848d87815181106120ad57fe5b602002602001018181525050818c87815181106120c657fe5b60200260200101818152505080600001548b87815181106120e357fe5b60200260200101818152505080600101548a878151811061210057fe5b602002602001018181525050806002015488878151811061211d57fe5b602002602001018181525050600080826002015414612140578160020154612142565b425b905060006121568584856001015485613274565b905060008114156121805760008b898151811061216f57fe5b6020026020010181815250506121fd565b82600101548114156121b257670de0b6b3a76400008b89815181106121a157fe5b6020026020010181815250506121fc565b6121e383600101546121d5670de0b6b3a76400008461335790919063ffffffff16565b6133dd90919063ffffffff16565b8b89815181106121ef57fe5b6020026020010181815250505b5b87806001019850505050508080600101915050612076565b5050505b8080600101915050611fe0565b50505091939550919395565b61223a612478565b73ffffffffffffffffffffffffffffffffffffffff166122586114d2565b73ffffffffffffffffffffffffffffffffffffffff16146122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612367576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146526026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002602052826000526040600020602052816000526040600020818154811061244c57600080fd5b906000526020600020906003020160009250925050508060000154908060010154908060020154905083565b600033905090565b60006001858154811061248f57fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b60006001838154811061257557fe5b906000526020600020906007020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f646966666572656e7420706f6f6c20746f6b656e73000000000000000000000081525060200191505060405180910390fd5b600082600201548260020154101590506000600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000209050600081805490501161274c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b808054905087106127c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b60008188815481106127d357fe5b906000526020600020906003020190506000806127f287848b88613e2b565b9150915061280d8984600101546137b190919063ffffffff16565b83600101819055506000836002015414156128b5578b73ffffffffffffffffffffffffffffffffffffffff168b8860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3afc0cd769150605cf3d677fb22218406594422f1fd5a9266d303d1e3b3f17508d8d604051808381526020018281526020019250505060405180910390a45b8b73ffffffffffffffffffffffffffffffffffffffff168b8860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8d8d8660405180848152602001838152602001828152602001935050505060405180910390a46129668988600601546137b190919063ffffffff16565b8760060181905550600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000209350600084805490509050846040518060600160405280428152602001858152602001600081525090806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000015560208201518160010155604082015181600201555050612a4683886006015461417990919063ffffffff16565b87600601819055508c73ffffffffffffffffffffffffffffffffffffffff16898860000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f76e324f068a8bf6d168b3249574fe4ad25b9f378d8645319674b654c58850b2e84878d6002015460405180848152602001838152602001828152602001935050505060405180910390a46000821115612b6757612b66600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838a60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b50505050505050505050505050565b600060018481548110612b8557fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002090506000818054905011612d2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80805490508410612da3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b6000818581548110612db157fe5b90600052602060002090600302019050600080612dd18584886000613e2b565b91509150612dec8684600101546137b190919063ffffffff16565b83600101819055508873ffffffffffffffffffffffffffffffffffffffff16888660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8a8a8660405180848152602001838152602001828152602001935050505060405180910390a4612ea58686600601546137b190919063ffffffff16565b8560060181905550612efc89838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b6000811115612f7757612f76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b505050505050505050565b600060018381548110612f9157fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002090506000818054905011613136576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b808054905083106131af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b60008184815481106131bd57fe5b906000526020600020906003020190504281600201819055508573ffffffffffffffffffffffffffffffffffffffff16858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3afc0cd769150605cf3d677fb22218406594422f1fd5a9266d303d1e3b3f1750878560010154604051808381526020018281526020019250505060405180910390a4505050505050565b60008061328e8560000154846137b190919063ffffffff16565b9050856002015481106132a557600091505061334f565b85600101548110156132ba578391505061334f565b60006132d38288600201546137b190919063ffffffff16565b905060006132f2886001015489600201546137b190919063ffffffff16565b9050613349670de0b6b3a764000061333b8361332d8661331f8e600301548d61335790919063ffffffff16565b61335790919063ffffffff16565b6133dd90919063ffffffff16565b6133dd90919063ffffffff16565b93505050505b949350505050565b60008083141561336a57600090506133d7565b600082840290508284828161337b57fe5b04146133d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061469e6021913960400191505060405180910390fd5b809150505b92915050565b6000808211613454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b81838161345d57fe5b04905092915050565b60006001838154811061347557fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561354c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900460ff16156135d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f706f6f6c20636c6f73656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b6136296135dc612478565b30848460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614201909392919063ffffffff16565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060008180549050905081604051806060016040528042815260200186815260200160008152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020155505061370384846006015461417990919063ffffffff16565b83600601819055508573ffffffffffffffffffffffffffffffffffffffff16858460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f76e324f068a8bf6d168b3249574fe4ad25b9f378d8645319674b654c58850b2e8488886002015460405180848152602001838152602001828152602001935050505060405180910390a4505050505050565b600082821115613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6138d18363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506142c2565b505050565b6000600184815481106138e557fe5b90600052602060002090600702019050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156139bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706f6f6c206e6f7420666f756e6400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002090506000818054905011613a8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6e6f207374616b6573000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600080600080600090505b8751811015613d24576000888281518110613aac57fe5b602002602001015190506000821480613ac457508085105b613b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f756e736f72746564207374616b6520696473000000000000000000000000000081525060200191505060405180910390fd5b85805490508110613baf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f77726f6e67207374616b6520696400000000000000000000000000000000000081525060200191505060405180910390fd5b8094506000868281548110613bc057fe5b90600052602060002090600302019050600080613bf38a848d8881518110613be457fe5b60200260200101516000613e2b565b91509150613c218b8681518110613c0657fe5b602002602001015184600101546137b190919063ffffffff16565b83600101819055508d73ffffffffffffffffffffffffffffffffffffffff168d8b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f0b598c0d1c4a0eff9fe8687a16f795524df83784a7cc2a7946718e49f7c47f9b8f8981518110613ca957fe5b60200260200101518f8a81518110613cbd57fe5b60200260200101518660405180848152602001838152602001828152602001935050505060405180910390a4613cfc828861417990919063ffffffff16565b9650613d11818761417990919063ffffffff16565b9550505050508080600101915050613a95565b50613d4e81613d408488600601546137b190919063ffffffff16565b6137b190919063ffffffff16565b8560060181905550613da589838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b6000811115613e2057613e1f600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166138349092919063ffffffff16565b5b505050505050505050565b6000806000856000015411613ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f696e636f7272656374207374616b65000000000000000000000000000000000081525060200191505060405180910390fd5b60008411613f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f77726f6e6720616d6f756e74000000000000000000000000000000000000000081525060200191505060405180910390fd5b8460010154841115613f98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f6869676820616d6f756e7400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60004290506000876004015411156140cc57836140c1576000866002015411614029576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f20756e7374616b6520696e74656e74696f6e00000000000000000000000081525060200191505060405180910390fd5b426140458860040154886002015461417990919063ffffffff16565b11156140b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f756e7374616b6520636c696666206e6f7420706173736564000000000000000081525060200191505060405180910390fd5b856002015490505b600086600201819055505b600087600201541115614167576140e587878784613274565b915084821061415c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f756e7374616b65206e6f7420617661696c61626c65207965740000000000000081525060200191505060405180910390fd5b818503925050614170565b84600092509250505b94509492505050565b6000808284019050838110156141f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6142bc846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506142c2565b50505050565b6060614324826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143b19092919063ffffffff16565b90506000815111156143ac5780806020019051602081101561434557600080fd5b81019080805190602001909291905050506143ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806146bf602a913960400191505060405180910390fd5b5b505050565b60606143c084846000856143c9565b90509392505050565b606082471015614424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146786026913960400191505060405180910390fd5b61442d85614572565b61449f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106144ef57805182526020820191506020810190506020830392506144cc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614551576040519150601f19603f3d011682016040523d82523d6000602084013e614556565b606091505b5091509150614566828286614585565b92505050949350505050565b600080823b905060008111915050919050565b606083156145955782905061464a565b6000835111156145a85782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561460f5780820151818401526020810190506145f4565b50505050905090810190601f16801561463c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220e4edd81745ea51850cb9bc83cc121e3c1dc4188fc149dbfffd1db98db280184564736f6c63430007040033
Deployed Bytecode Sourcemap
25357:17975:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30058:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26968:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27008:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29089:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28748:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27141:716;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27865:290;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30262:1314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28435:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24740:148;;;:::i;:::-;;28309:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24089:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34985:1323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26874:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29535:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28163:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31584:2013;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25043:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26900:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30058:194;30166:78;30192:12;:10;:12::i;:::-;30206:10;30218:7;30227:6;30235:8;30166:25;:78::i;:::-;30058:194;;;;:::o;26968:33::-;;;;;;;;;;;;;:::o;27008:55::-;27056:7;27008:55;:::o;29089:168::-;29185:64;29211:12;:10;:12::i;:::-;29225:6;29233:7;29242:6;29185:25;:64::i;:::-;29089:168;;;:::o;28748:142::-;28827:55;28852:12;:10;:12::i;:::-;28866:6;28874:7;28827:24;:55::i;:::-;28748:142;;:::o;27141:716::-;27271:7;24320:12;:10;:12::i;:::-;24309:23;;:7;:5;:7::i;:::-;:23;;;24301:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26124:4:::1;27299:7;:13;27291:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27363:5;27351:8;:17;;27343:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27462:14;27479:5;:12;;;;27462:29;;27502:5;27513:222;;;;;;;;27540:5;27513:222;;;;;;27567:5;27513:222;;;;27597:8;27513:222;;;;27628:7;27513:222;;;;27663:12;27513:222;;;;27697:5;27513:222;;;;;;27722:1;27513:222;;::::0;27502:234:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27778:5;27752:73;;27762:6;27752:73;27786:5;27793:8;27803:7;27812:12;27752:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27843:6;27836:13;;;27141:716:::0;;;;;;;:::o;27865:290::-;24320:12;:10;:12::i;:::-;24309:23;;:7;:5;:7::i;:::-;:23;;;24301:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27930:17:::1;27950:5;27956:6;27950:13;;;;;;;;;;;;;;;;;;27930:33;;28013:1;27982:33;;27990:4;:10;;;;;;;;;;;;27982:33;;;;27974:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28054:4;:11;;;;;;;;;;;;28053:12;28045:39;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28109:4;28095;:11;;;:18;;;;;;;;;;;;;;;;;;28140:6;28129:18;;;;;;;;;;24380:1;27865:290:::0;:::o;30262:1314::-;30358:28;30388:29;30419:26;30458:17;30478:5;30484:6;30478:13;;;;;;;;;;;;;;;;;;30458:33;;30541:1;30510:33;;30518:4;:10;;;;;;;;;;;;30510:33;;;;30502:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30573:26;30602:6;:19;30609:11;30602:19;;;;;;;;;;;;;;;:27;30622:6;30602:27;;;;;;;;;;;30573:56;;30670:10;:17;;;;30656:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30642:46;;30728:10;:17;;;;30714:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30699:47;;30783:10;:17;;;;30769:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30757:44;;30818:9;30814:755;30833:10;:17;;;;30831:1;:19;30814:755;;;30872:20;30895:10;30906:1;30895:13;;;;;;;;;;;;;;;;;;30872:36;;30940:6;:12;;;30923:11;30935:1;30923:14;;;;;;;;;;;;;:29;;;;;30985:6;:13;;;30967:12;30980:1;30967:15;;;;;;;;;;;;;:31;;;;;31013:24;31077:1;31041:6;:32;;;:37;31040:88;;31096:6;:32;;;31040:88;;;31080:15;31040:88;31013:115;;31143:30;31176:70;31200:4;31206:6;31214;:13;;;31229:16;31176:23;:70::i;:::-;31143:103;;31291:1;31265:22;:27;31261:297;;;31328:1;31313:9;31323:1;31313:12;;;;;;;;;;;;;:16;;;;;31261:297;;;31384:6;:13;;;31358:22;:39;31355:203;;;26124:4;31418:9;31428:1;31418:12;;;;;;;;;;;;;:18;;;;;31355:203;;;31492:50;31528:6;:13;;;31492:31;26124:4;31492:22;:26;;:31;;;;:::i;:::-;:35;;:50;;;;:::i;:::-;31477:9;31487:1;31477:12;;;;;;;;;;;;;:65;;;;;31355:203;31261:297;30814:755;;;30852:3;;;;;;;30814:755;;;;30262:1314;;;;;;;:::o;28435:141::-;28526:42;28540:11;28553:6;28561;28526:13;:42::i;:::-;28435:141;;;:::o;24740:148::-;24320:12;:10;:12::i;:::-;24309:23;;:7;:5;:7::i;:::-;:23;;;24301:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24847:1:::1;24810:40;;24831:6;::::0;::::1;;;;;;;;24810:40;;;;;;;;;;;;24878:1;24861:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;24740:148::o:0;28309:118::-;28376:43;28390:12;:10;:12::i;:::-;28404:6;28412;28376:13;:43::i;:::-;28309:118;;:::o;24089:87::-;24135:7;24162:6;;;;;;;;;;;24155:13;;24089:87;:::o;34985:1323::-;24320:12;:10;:12::i;:::-;24309:23;;:7;:5;:7::i;:::-;:23;;;24301:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35124:17:::1;35144:5;35150:6;35144:13;;;;;;;;;;;;;;;;;;35124:33;;35207:1;35176:33;;35184:4;:10;;;;;;;;;;;;35176:33;;;;35168:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35239:26;35268:6;:19;35275:11;35268:19;;;;;;;;;;;;;;;:27;35288:6;35268:27;;;;;;;;;;;35239:56;;35334:1;35314:10;:17;;;;:21;35306:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35378:10;:17;;;;35368:7;:27;35360:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35427:20;35450:10;35461:7;35450:19;;;;;;;;;;;;;;;;;;35427:42;;35505:6;:13;;;35488;:30;;35480:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35558:21;35582:49;26124:4;35582:40;27056:7;35582:13;:17;;:40;;;;:::i;:::-;:44;;:49;;;;:::i;:::-;35558:73;;35642:18;35663:32;35681:13;35663;:17;;:32;;;;:::i;:::-;35642:53;;35722:32;35740:13;35722:6;:13;;;:17;;:32;;;;:::i;:::-;35706:6;:13;;:48;;;;35800:1;35765:6;:32;;:36;;;;35853:1;35817:6;:32;;;:37;35814:155;;;35921:11;35875:82;;35913:6;35900:4;:10;;;;;;;;;;;;35875:82;;;35934:7;35943:13;35875:82;;;;;;;;;;;;;;;;;;;;;;;;35814:155;36022:11;35984:89;;36014:6;36001:4;:10;;;;;;;;;;;;35984:89;;;36035:7;36044:13;36059;35984:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36095:27;36108:13;36095:4;:8;;;:12;;:27;;;;:::i;:::-;36084:4;:8;;:38;;;;36135:48;36159:11;36172:10;36135:4;:10;;;;;;;;;;;;:23;;;;:48;;;;;:::i;:::-;36213:1;36197:13;:17;36194:107;;;36231:58;36255:18;;;;;;;;;;;36275:13;36231:4;:10;;;;;;;;;;;;:23;;;;:58;;;;;:::i;:::-;36194:107;24380:1;;;;;34985:1323:::0;;;;:::o;26874:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29535:275::-;29683:7;;:14;;29664:8;;:15;;:33;29656:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29735:67;29762:12;:10;:12::i;:::-;29776:6;29784:8;;29735:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29794:7;;29735:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;:67::i;:::-;29535:275;;;;;:::o;28163:138::-;24320:12;:10;:12::i;:::-;24309:23;;:7;:5;:7::i;:::-;:23;;;24301:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28274:19:::1;28253:18;;:40;;;;;;;;;;;;;;;;;;28163:138:::0;:::o;31584:2013::-;31667:27;31696:25;31723:28;31753:29;31784:26;31812:43;31868:19;31902:9;31912:1;31902:11;;31898:108;31917:5;:12;;;;31915:1;:14;31898:108;;;31965:6;:19;31972:11;31965:19;;;;;;;;;;;;;;;:22;31985:1;31965:22;;;;;;;;;;;:29;;;;31950:44;;;;31931:3;;;;;;;31898:108;;;;32053:11;32039:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32026:39;;32101:11;32087:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32076:37;;32152:11;32138:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32124:40;;32204:11;32190:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32175:41;;32253:11;32239:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32227:38;;32319:11;32305:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32276:55;;32344:11;32370:9;32380:1;32370:11;;32366:1224;32385:5;:12;;;;32383:1;:14;32366:1224;;;32418:26;32447:6;:19;32454:11;32447:19;;;;;;;;;;;;;;;:22;32467:1;32447:22;;;;;;;;;;;32418:51;;32508:1;32487:10;:17;;;;:22;32484:35;;;32511:8;;;32484:35;32536:17;32556:5;32562:1;32556:8;;;;;;;;;;;;;;;;;;32536:28;;32583:9;32579:1000;32598:10;:17;;;;32596:1;:19;32579:1000;;;32641:20;32664:10;32675:1;32664:13;;;;;;;;;;;;;;;;;;32641:36;;32714:1;32696:10;32707:3;32696:15;;;;;;;;;;;;;:19;;;;;32750:1;32734:8;32743:3;32734:13;;;;;;;;;;;;;:17;;;;;32789:6;:12;;;32770:11;32782:3;32770:16;;;;;;;;;;;;;:31;;;;;32840:6;:13;;;32820:12;32833:3;32820:17;;;;;;;;;;;;;:33;;;;;32906:6;:32;;;32872:26;32899:3;32872:31;;;;;;;;;;;;;:66;;;;;32957:24;33021:1;32985:6;:32;;;:37;32984:88;;33040:6;:32;;;32984:88;;;33024:15;32984:88;32957:115;;33091:30;33124:70;33148:4;33154:6;33162;:13;;;33177:16;33124:23;:70::i;:::-;33091:103;;33243:1;33217:22;:27;33213:327;;;33286:1;33269:9;33279:3;33269:14;;;;;;;;;;;;;:18;;;;;33213:327;;;33346:6;:13;;;33320:22;:39;33317:223;;;26124:4;33384:9;33394:3;33384:14;;;;;;;;;;;;;:20;;;;;33317:223;;;33470:50;33506:6;:13;;;33470:31;26124:4;33470:22;:26;;:31;;;;:::i;:::-;:35;;:50;;;;:::i;:::-;33453:9;33463:3;33453:14;;;;;;;;;;;;;:67;;;;;33317:223;33213:327;33558:5;;;;;;;32579:1000;;;32617:3;;;;;;;32579:1000;;;;32366:1224;;;32399:3;;;;;;;32366:1224;;;;31584:2013;;;;;;;;;:::o;25043:244::-;24320:12;:10;:12::i;:::-;24309:23;;:7;:5;:7::i;:::-;:23;;;24301:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25152:1:::1;25132:22;;:8;:22;;;;25124:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25242:8;25213:38;;25234:6;::::0;::::1;;;;;;;;25213:38;;;;;;;;;;;;25271:8;25262:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;25043:244:::0;:::o;26900:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22643:106::-;22696:15;22731:10;22724:17;;22643:106;:::o;39014:1914::-;39161:17;39181:5;39187:10;39181:17;;;;;;;;;;;;;;;;;;39161:37;;39248:1;39217:33;;39225:4;:10;;;;;;;;;;;;39217:33;;;;39209:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39282:19;39304:5;39310:8;39304:15;;;;;;;;;;;;;;;;;;39282:37;;39369:6;:12;;;;;;;;;;;;39338:44;;39346:4;:10;;;;;;;;;;;;39338:44;;;39330:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39421:18;39462:4;:13;;;39443:6;:15;;;:32;;39421:55;;39555:26;39584:6;:19;39591:11;39584:19;;;;;;;;;;;;;;;:31;39604:10;39584:31;;;;;;;;;;;39555:60;;39654:1;39634:10;:17;;;;:21;39626:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39698:10;:17;;;;39688:7;:27;39680:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39747:20;39770:10;39781:7;39770:19;;;;;;;;;;;;;;;;;;39747:42;;39801:18;39821:21;39846:61;39871:4;39877:6;39885;39893:13;39846:24;:61::i;:::-;39800:107;;;;39934:25;39952:6;39934;:13;;;:17;;:25;;;;:::i;:::-;39918:6;:13;;:41;;;;40011:1;39975:6;:32;;;:37;39972:152;;;40083:11;40033:79;;40071:10;40058:4;:10;;;;;;;;;;;;40033:79;;;40096:7;40105:6;40033:79;;;;;;;;;;;;;;;;;;;;;;;;39972:152;40183:11;40141:86;;40171:10;40158:4;:10;;;;;;;;;;;;40141:86;;;40196:7;40205:6;40213:13;40141:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40249:20;40262:6;40249:4;:8;;;:12;;:20;;;;:::i;:::-;40238:4;:8;;:31;;;;40407:6;:19;40414:11;40407:19;;;;;;;;;;;;;;;:29;40427:8;40407:29;;;;;;;;;;;40394:42;;40447:17;40467:10;:17;;;;40447:37;;40495:10;40511:131;;;;;;;;40539:15;40511:131;;;;40577:10;40511:131;;;;40629:1;40511:131;;;40495:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40667:26;40682:10;40667:6;:10;;;:14;;:26;;;;:::i;:::-;40654:6;:10;;:39;;;;40749:11;40709:90;;40739:8;40724:6;:12;;;;;;;;;;;;40709:90;;;40762:9;40773:10;40785:4;:13;;;40709:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40831:1;40815:13;:17;40812:107;;;40849:58;40873:18;;;;;;;;;;;40893:13;40849:4;:10;;;;;;;;;;;;:23;;;;:58;;;;;:::i;:::-;40812:107;39014:1914;;;;;;;;;;;;;:::o;36316:993::-;36448:17;36468:5;36474:6;36468:13;;;;;;;;;;;;;;;;;;36448:33;;36531:1;36500:33;;36508:4;:10;;;;;;;;;;;;36500:33;;;;36492:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36563:26;36592:6;:19;36599:11;36592:19;;;;;;;;;;;;;;;:27;36612:6;36592:27;;;;;;;;;;;36563:56;;36658:1;36638:10;:17;;;;:21;36630:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36702:10;:17;;;;36692:7;:27;36684:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36751:20;36774:10;36785:7;36774:19;;;;;;;;;;;;;;;;;;36751:42;;36805:18;36825:21;36850:60;36875:4;36881:6;36889:13;36904:5;36850:24;:60::i;:::-;36804:106;;;;36937:32;36955:13;36937:6;:13;;;:17;;:32;;;;:::i;:::-;36921:6;:13;;:48;;;;37023:11;36985:89;;37015:6;37002:4;:10;;;;;;;;;;;;36985:89;;;37036:7;37045:13;37060;36985:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37096:27;37109:13;37096:4;:8;;;:12;;:27;;;;:::i;:::-;37085:4;:8;;:38;;;;37136:48;37160:11;37173:10;37136:4;:10;;;;;;;;;;;;:23;;;;:48;;;;;:::i;:::-;37214:1;37198:13;:17;37195:107;;;37232:58;37256:18;;;;;;;;;;;37276:13;37232:4;:10;;;;;;;;;;;;:23;;;;:58;;;;;:::i;:::-;37195:107;36316:993;;;;;;;;;:::o;34355:620::-;34463:17;34483:5;34489:6;34483:13;;;;;;;;;;;;;;;;;;34463:33;;34546:1;34515:33;;34523:4;:10;;;;;;;;;;;;34515:33;;;;34507:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34578:26;34607:6;:19;34614:11;34607:19;;;;;;;;;;;;;;;:27;34627:6;34607:27;;;;;;;;;;;34578:56;;34673:1;34653:10;:17;;;;:21;34645:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34717:10;:17;;;;34707:7;:27;34699:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34766:20;34789:10;34800:7;34789:19;;;;;;;;;;;;;;;;;;34766:42;;34854:15;34819:6;:32;;:50;;;;34931:11;34885:82;;34923:6;34910:4;:10;;;;;;;;;;;;34885:82;;;34944:7;34953:6;:13;;;34885:82;;;;;;;;;;;;;;;;;;;;;;;;34355:620;;;;;;:::o;42601:726::-;42746:7;42766:18;42787:34;42808:6;:12;;;42787:16;:20;;:34;;;;:::i;:::-;42766:55;;42849:4;:13;;;42835:10;:27;42832:40;;42871:1;42864:8;;;;;42832:40;42899:4;:10;;;42886;:23;42883:48;;;42918:13;42911:20;;;;;42883:48;42968:23;42994:29;43012:10;42994:4;:13;;;:17;;:29;;;;:::i;:::-;42968:55;;43034:29;43066;43084:4;:10;;;43066:4;:13;;;:17;;:29;;;;:::i;:::-;43034:61;;43231:88;26124:4;43231:79;43288:21;43231:52;43267:15;43231:31;43249:4;:12;;;43231:13;:17;;:31;;;;:::i;:::-;:35;;:52;;;;:::i;:::-;:56;;:79;;;;:::i;:::-;:83;;:88;;;;:::i;:::-;43224:95;;;;;42601:726;;;;;;;:::o;11691:220::-;11749:7;11778:1;11773;:6;11769:20;;;11788:1;11781:8;;;;11769:20;11800:9;11816:1;11812;:5;11800:17;;11845:1;11840;11836;:5;;;;;;:10;11828:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11902:1;11895:8;;;11691:220;;;;;:::o;12389:153::-;12447:7;12479:1;12475;:5;12467:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12533:1;12529;:5;;;;;;12522:12;;12389:153;;;;:::o;33607:740::-;33703:17;33723:5;33729:6;33723:13;;;;;;;;;;;;;;;;;;33703:33;;33786:1;33755:33;;33763:4;:10;;;;;;;;;;;;33755:33;;;;33747:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33827:4;:11;;;;;;;;;;;;33826:12;33818:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33867:64;33895:12;:10;:12::i;:::-;33917:4;33924:6;33867:4;:10;;;;;;;;;;;;:27;;;;:64;;;;;;:::i;:::-;33944:26;33973:6;:19;33980:11;33973:19;;;;;;;;;;;;;;;:27;33993:6;33973:27;;;;;;;;;;;33944:56;;34011:15;34029:10;:17;;;;34011:35;;34057:10;34073:127;;;;;;;;34101:15;34073:127;;;;34139:6;34073:127;;;;34187:1;34073:127;;;34057:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34223:20;34236:6;34223:4;:8;;;:12;;:20;;;;:::i;:::-;34212:4;:8;;:31;;;;34295:11;34259:80;;34287:6;34274:4;:10;;;;;;;;;;;;34259:80;;;34308:7;34317:6;34325:4;:13;;;34259:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33607:740;;;;;;:::o;11274:158::-;11332:7;11365:1;11360;:6;;11352:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11423:1;11419;:5;11412:12;;11274:158;;;;:::o;18936:177::-;19019:86;19039:5;19069:23;;;19094:2;19098:5;19046:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19019:19;:86::i;:::-;18936:177;;;:::o;37317:1689::-;37463:17;37483:5;37489:6;37483:13;;;;;;;;;;;;;;;;;;37463:33;;37546:1;37515:33;;37523:4;:10;;;;;;;;;;;;37515:33;;;;37507:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37578:26;37607:6;:19;37614:11;37607:19;;;;;;;;;;;;;;;:27;37627:6;37607:27;;;;;;;;;;;37578:56;;37673:1;37653:10;:17;;;;:21;37645:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37819:19;37849:23;37883:26;37927:9;37937:1;37927:11;;37922:807;37942:8;:15;37940:1;:17;37922:807;;;37979:15;37997:8;38006:1;37997:11;;;;;;;;;;;;;;37979:29;;38034:1;38031;:4;:29;;;;38053:7;38039:11;:21;38031:29;38023:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38159:10;:17;;;;38149:7;:27;38141:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38224:7;38210:21;;38248:20;38271:10;38282:7;38271:19;;;;;;;;;;;;;;;;;;38248:42;;38306:18;38326:21;38351:57;38376:4;38382:6;38390:7;38398:1;38390:10;;;;;;;;;;;;;;38402:5;38351:24;:57::i;:::-;38305:103;;;;38439:29;38457:7;38465:1;38457:10;;;;;;;;;;;;;;38439:6;:13;;;:17;;:29;;;;:::i;:::-;38423:6;:13;;:45;;;;38526:11;38488:90;;38518:6;38505:4;:10;;;;;;;;;;;;38488:90;;;38539:8;38548:1;38539:11;;;;;;;;;;;;;;38552:7;38560:1;38552:10;;;;;;;;;;;;;;38564:13;38488:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38613:31;38633:10;38613:15;:19;;:31;;;;:::i;:::-;38595:49;;38680:37;38703:13;38680:18;:22;;:37;;;;:::i;:::-;38659:58;;37922:807;;;;37959:3;;;;;;;37922:807;;;;38752:53;38786:18;38752:29;38765:15;38752:4;:8;;;:12;;:29;;;;:::i;:::-;:33;;:53;;;;:::i;:::-;38741:4;:8;;:64;;;;38818:53;38842:11;38855:15;38818:4;:10;;;;;;;;;;;;:23;;;;:53;;;;;:::i;:::-;38906:1;38885:18;:22;38882:117;;;38924:63;38948:18;;;;;;;;;;;38968;38924:4;:10;;;;;;;;;;;;:23;;;;:63;;;;;:::i;:::-;38882:117;37317:1689;;;;;;;;;:::o;40940:1249::-;41073:18;41093:21;41150:1;41135:6;:12;;;:16;41127:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41248:1;41239:6;:10;41231:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41295:6;:13;;;41285:6;:23;;41277:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41338:24;41365:15;41338:42;;41414:1;41394:4;:17;;;:21;41391:426;;;41436:13;41432:323;;41513:1;41478:6;:32;;;:36;41470:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41625:15;41566:55;41603:4;:17;;;41566:6;:32;;;:36;;:55;;;;:::i;:::-;:74;;41558:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41707:6;:32;;;41688:51;;41432:323;41804:1;41769:6;:32;;:36;;;;41391:426;41848:1;41832:4;:13;;;:17;41829:353;;;41882:63;41906:4;41912:6;41920;41928:16;41882:23;:63::i;:::-;41866:79;;41984:6;41968:13;:22;41960:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42057:13;42048:6;:22;42035:35;;42085:34;;;41829:353;42160:6;42168:1;42152:18;;;;;40940:1249;;;;;;;;:::o;10812:179::-;10870:7;10890:9;10906:1;10902;:5;10890:17;;10931:1;10926;:6;;10918:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10982:1;10975:8;;;10812:179;;;;:::o;19121:205::-;19222:96;19242:5;19272:27;;;19301:4;19307:2;19311:5;19249:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19222:19;:96::i;:::-;19121:205;;;;:::o;21241:761::-;21665:23;21691:69;21719:4;21691:69;;;;;;;;;;;;;;;;;21699:5;21691:27;;;;:69;;;;;:::i;:::-;21665:95;;21795:1;21775:10;:17;:21;21771:224;;;21917:10;21906:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21898:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21771:224;21241:761;;;:::o;3684:195::-;3787:12;3819:52;3841:6;3849:4;3855:1;3858:12;3819:21;:52::i;:::-;3812:59;;3684:195;;;;;:::o;4736:530::-;4863:12;4921:5;4896:21;:30;;4888:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4988:18;4999:6;4988:10;:18::i;:::-;4980:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5114:12;5128:23;5155:6;:11;;5175:5;5183:4;5155:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5113:75;;;;5206:52;5224:7;5233:10;5245:12;5206:17;:52::i;:::-;5199:59;;;;4736:530;;;;;;:::o;766:422::-;826:4;1034:12;1145:7;1133:20;1125:28;;1179:1;1172:4;:8;1165:15;;;766:422;;;:::o;7276:742::-;7391:12;7420:7;7416:595;;;7451:10;7444:17;;;;7416:595;7585:1;7565:10;:17;:21;7561:439;;;7828:10;7822:17;7889:15;7876:10;7872:2;7868:19;7861:44;7776:148;7971:12;7964:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7276:742;;;;;;:::o
Swarm Source
ipfs://e4edd81745ea51850cb9bc83cc121e3c1dc4188fc149dbfffd1db98db2801845
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.044723 | 410,942.4338 | $18,378.62 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.