More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 39 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Multi Unstake To... | 21038216 | 24 days ago | IN | 0 ETH | 0.00195411 | ||||
Multi Unstake To... | 21037727 | 24 days ago | IN | 0 ETH | 0.00098438 | ||||
Multi Unstake To... | 21028331 | 26 days ago | IN | 0 ETH | 0.00294537 | ||||
Multi Unstake To... | 21002208 | 29 days ago | IN | 0 ETH | 0.00105666 | ||||
Multi Unstake To... | 21001273 | 29 days ago | IN | 0 ETH | 0.00102275 | ||||
Multi Unstake To... | 21000864 | 29 days ago | IN | 0 ETH | 0.00172805 | ||||
Stake Tokens | 21000153 | 30 days ago | IN | 0 ETH | 0.00446841 | ||||
Multi Unstake To... | 21000139 | 30 days ago | IN | 0 ETH | 0.00198366 | ||||
Multi Unstake To... | 20999938 | 30 days ago | IN | 0 ETH | 0.00471186 | ||||
Multi Unstake To... | 20999557 | 30 days ago | IN | 0 ETH | 0.00088323 | ||||
Multi Unstake To... | 20998937 | 30 days ago | IN | 0 ETH | 0.00097442 | ||||
Stake Tokens | 20577871 | 88 days ago | IN | 0 ETH | 0.00134975 | ||||
Stake Tokens | 20569916 | 90 days ago | IN | 0 ETH | 0.00029093 | ||||
Stake Tokens | 20524480 | 96 days ago | IN | 0 ETH | 0.00026498 | ||||
Stake Tokens | 20496461 | 100 days ago | IN | 0 ETH | 0.00032284 | ||||
Stake Tokens | 20471267 | 103 days ago | IN | 0 ETH | 0.00082041 | ||||
Stake Tokens | 20464654 | 104 days ago | IN | 0 ETH | 0.00167508 | ||||
Stake Tokens | 20448135 | 107 days ago | IN | 0 ETH | 0.00045078 | ||||
Stake Tokens | 20420446 | 110 days ago | IN | 0 ETH | 0.00244933 | ||||
Stake Tokens | 20386300 | 115 days ago | IN | 0 ETH | 0.0010029 | ||||
Stake Tokens | 20386270 | 115 days ago | IN | 0 ETH | 0.00138261 | ||||
Stake Tokens | 20381355 | 116 days ago | IN | 0 ETH | 0.00051723 | ||||
Stake Tokens | 20364934 | 118 days ago | IN | 0 ETH | 0.00138763 | ||||
Stake Tokens | 20361808 | 119 days ago | IN | 0 ETH | 0.00104429 | ||||
Stake Tokens | 20356808 | 119 days ago | IN | 0 ETH | 0.00437245 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BoostStaking3
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-07-10 */ pragma solidity 0.8.26; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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); } interface IERC20Metadata is IERC20{ /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } } abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } contract BoostStaking3 is Ownable, ReentrancyGuard { using EnumerableSet for EnumerableSet.UintSet; address immutable public stakingToken; uint32 public apr; uint32 public constant APR_DENOMINATOR = 10000; // 100 = 1% uint64 public stakingDuration; uint256 public totalStaked; bool public stakingPaused = true; struct StakingData { address owner; uint128 stakedAmount; uint64 startTime; uint64 endTime; uint32 apr; bool completed; } StakingData[] public stakes; mapping (address => EnumerableSet.UintSet) private userStakes; mapping (address => uint256) public userTotalRewards; event Staked(StakingData stakingData); event Unstaked(StakingData stakingData, uint256 reward); constructor() Ownable(msg.sender){ stakingToken = 0xa2ce8366603f3fffC460BeF0Fb90E980C9337967; apr = 4000; // 1% = 100, 100% = 10000, etc. stakingDuration = 90 days; // express time in days, hours, or minutes } // owner functions function updateApr(uint32 newApr) external onlyOwner { apr = newApr; } function updateStakingPaused(bool _stakingPaused) external onlyOwner { stakingPaused = _stakingPaused; } function updateStakingDuration(uint32 stakingDurationInDays) external onlyOwner { stakingDuration = stakingDurationInDays * 1 days; } function stakeFor(address user, uint128 amount) external nonReentrant onlyOwner { // transfer tokens, verify amount reaches the contract uint256 balance = IERC20(stakingToken).balanceOf(address(this)); SafeERC20.safeTransferFrom(IERC20(stakingToken), msg.sender, address(this), amount); amount = uint128(IERC20(stakingToken).balanceOf(address(this)) - balance); // establish staking data StakingData memory newStakingData; newStakingData.owner = user; newStakingData.stakedAmount = amount; newStakingData.startTime = uint64(block.timestamp); newStakingData.endTime = newStakingData.startTime + stakingDuration; newStakingData.apr = apr; newStakingData.completed = false; totalStaked += amount; // write staking data to storage and assign staking data to user userStakes[user].add(stakes.length); stakes.push(newStakingData); emit Staked(newStakingData); } // stake / unstake function stakeTokens(uint128 amount) external nonReentrant { require(!stakingPaused, "Staking is currently paused"); // transfer tokens, verify amount reaches the contract uint256 balance = IERC20(stakingToken).balanceOf(address(this)); SafeERC20.safeTransferFrom(IERC20(stakingToken), msg.sender, address(this), amount); amount = uint128(IERC20(stakingToken).balanceOf(address(this)) - balance); // establish staking data StakingData memory newStakingData; newStakingData.owner = msg.sender; newStakingData.stakedAmount = amount; newStakingData.startTime = uint64(block.timestamp); newStakingData.endTime = newStakingData.startTime + stakingDuration; newStakingData.apr = apr; newStakingData.completed = false; totalStaked += amount; // write staking data to storage and assign staking data to user userStakes[msg.sender].add(stakes.length); stakes.push(newStakingData); emit Staked(newStakingData); } function unstakeTokensAndReceiveReward(uint256 stakeId, bool bypassRewards) external nonReentrant { require(!stakingPaused, "Staking is currently paused"); // verify stake is owned by user and is ready for withdrawal require(userStakes[msg.sender].contains(stakeId), "Stake not owned by user or already claimed"); StakingData memory stakingData = stakes[stakeId]; require(!stakingData.completed, "Stake already received"); require(block.timestamp >= stakingData.endTime, "Staking not ready yet"); // calculate reward, remove stake from user's storage to prevent claiming again userStakes[msg.sender].remove(stakeId); uint256 reward; if(!bypassRewards){ reward = calculateReward(stakeId); require(reward <= getRewardsRemaining(), "Not enough rewards to pay out."); } // transfer out reward and staked amount SafeERC20.safeTransfer(IERC20(stakingToken), address(msg.sender), stakingData.stakedAmount + reward); emit Unstaked(stakingData, reward); stakingData.completed = true; totalStaked -= stakingData.stakedAmount; stakingData.stakedAmount = 0; stakes[stakeId] = stakingData; userTotalRewards[msg.sender] += reward; } function multiUnstakeTokensAndReceiveReward(uint256[] memory stakeIds, bool bypassRewards) external nonReentrant { require(!stakingPaused, "Staking is currently paused"); uint256 totalToUnstake; uint256 totalRewards; for(uint256 i = 0; i < stakeIds.length; i++){ uint256 stakingId = stakeIds[i]; // verify stake is owned by user and is ready for withdrawal require(userStakes[msg.sender].contains(stakingId), "Stake not owned by user or already claimed"); StakingData memory stakingData = stakes[stakingId]; require(!stakingData.completed, "Stake already received"); require(block.timestamp >= stakingData.endTime, "Staking not ready yet"); // calculate reward, remove stake from user's storage to prevent claiming again userStakes[msg.sender].remove(stakingId); uint256 reward; if(!bypassRewards){ totalRewards += calculateReward(stakingId); } totalToUnstake += stakingData.stakedAmount; // transfer out reward and staked amount emit Unstaked(stakingData, reward); stakingData.completed = true; totalStaked -= stakingData.stakedAmount; stakingData.stakedAmount = 0; stakes[stakingId] = stakingData; userTotalRewards[msg.sender] += reward; } require(totalRewards <= getRewardsRemaining(), "Not enough rewards to pay out."); SafeERC20.safeTransfer(IERC20(stakingToken), address(msg.sender), totalToUnstake + totalRewards); } // views function calculateReward(uint256 stakeId) public view returns (uint256){ StakingData memory stakingData = stakes[stakeId]; uint256 computedEndTime = block.timestamp; if(block.timestamp >= stakingData.endTime){ computedEndTime = stakingData.endTime; } return ((computedEndTime - stakingData.startTime) * stakingData.apr * stakingData.stakedAmount / APR_DENOMINATOR / 365 days); } function getUserStakes(address user) public view returns (uint256[] memory){ return userStakes[user].values(); } function getUserStakesReadyToClaim(address user) public view returns (uint256[] memory){ uint256[] memory localStakes = getUserStakes(user); uint256 arraySize; for (uint256 i = 0; i < localStakes.length; i++){ if(stakes[localStakes[i]].endTime <= block.timestamp){ arraySize++; } } uint256[] memory unstakeableIds = new uint256[](arraySize); for (uint256 i = 0; i < localStakes.length; i++){ if(stakes[localStakes[i]].endTime <= block.timestamp){ unstakeableIds[i] = localStakes[i]; } } return unstakeableIds; } function getUserRewardsReadyToClaim(address user) external view returns (uint256){ uint256 rewardsToClaim; uint256[] memory unstakeableIds = getUserStakesReadyToClaim(user); for(uint256 i = 0; i < unstakeableIds.length; i++){ rewardsToClaim += calculateReward(unstakeableIds[i]); } return rewardsToClaim; } function getUserStakesDetailed(address user) external view returns (StakingData[] memory){ uint256[] memory localStakes = getUserStakes(user); StakingData[] memory stakingData = new StakingData[](localStakes.length); for (uint256 i = 0; i < localStakes.length; i++){ stakingData[i] = stakes[localStakes[i]]; } return stakingData; } function calculateUserCurrentRewards(address user) external view returns (uint256){ uint256[] memory usersStakes = getUserStakes(user); uint256 cumulativeReward; for(uint256 i = 0; i < usersStakes.length; i++){ cumulativeReward += calculateReward(usersStakes[i]); } return cumulativeReward; } function getUserTotalTokensStaked(address user) external view returns (uint256){ uint256[] memory usersStakes = getUserStakes(user); uint256 cumulativeStake; for(uint256 i = 0; i < usersStakes.length; i++){ cumulativeStake += stakes[usersStakes[i]].stakedAmount; } return cumulativeStake; } function getRewardsRemaining() public view returns (uint256){ uint256 balance = IERC20(stakingToken).balanceOf(address(this)); if(balance <= totalStaked){ return 0; } return balance - totalStaked; } function emergencyRewardWithdrawal(uint256 _amount) external onlyOwner { require(_amount < getRewardsRemaining(), "Cannot withdraw staked tokens"); SafeERC20.safeTransfer(IERC20(stakingToken), msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"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":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint128","name":"stakedAmount","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint32","name":"apr","type":"uint32"},{"internalType":"bool","name":"completed","type":"bool"}],"indexed":false,"internalType":"struct BoostStaking3.StakingData","name":"stakingData","type":"tuple"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint128","name":"stakedAmount","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint32","name":"apr","type":"uint32"},{"internalType":"bool","name":"completed","type":"bool"}],"indexed":false,"internalType":"struct BoostStaking3.StakingData","name":"stakingData","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"APR_DENOMINATOR","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateUserCurrentRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserRewardsReadyToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakesDetailed","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint128","name":"stakedAmount","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint32","name":"apr","type":"uint32"},{"internalType":"bool","name":"completed","type":"bool"}],"internalType":"struct BoostStaking3.StakingData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakesReadyToClaim","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserTotalTokensStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"stakeIds","type":"uint256[]"},{"internalType":"bool","name":"bypassRewards","type":"bool"}],"name":"multiUnstakeTokensAndReceiveReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"stakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint128","name":"stakedAmount","type":"uint128"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint32","name":"apr","type":"uint32"},{"internalType":"bool","name":"completed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"bool","name":"bypassRewards","type":"bool"}],"name":"unstakeTokensAndReceiveReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newApr","type":"uint32"}],"name":"updateApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"stakingDurationInDays","type":"uint32"}],"name":"updateStakingDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_stakingPaused","type":"bool"}],"name":"updateStakingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052600160045f6101000a81548160ff021916908315150217905550348015610029575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009b575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610092919061024d565b60405180910390fd5b6100aa8161014d60201b60201c565b506001808190555073a2ce8366603f3fffc460bef0fb90e980c933796773ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050610fa060025f6101000a81548163ffffffff021916908363ffffffff1602179055506276a700600260046101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610266565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102378261020e565b9050919050565b6102478161022d565b82525050565b5f6020820190506102605f83018461023e565b92915050565b6080516140336102c45f395f81816105ac015281816106900152818161072d0152818161076901528181610c6b01528181610d5201528181610def01528181610e2b015281816112040152818161168c0152611f7101526140335ff3fe608060405234801561000f575f80fd5b50600436106101a7575f3560e01c8063842e2981116100f7578063d5a44f8611610095578063f2fde38b1161006f578063f2fde38b146104bc578063f6a3f3cf146104d8578063fb9e7aa014610508578063fd56edfb14610526576101a7565b8063d5a44f861461043b578063e7d6c22014610470578063ef024cae1461048c576101a7565b8063c038b472116100d1578063c038b472146103b7578063c79552a9146103d3578063d21d97c7146103ef578063d2d7231f1461040b576101a7565b8063842e29811461034b5780638da5cb5b1461037b578063bbb781cc14610399576101a7565b8063527e868411610164578063715018a61161013e578063715018a6146102e757806372f702f3146102f15780638005a7de1461030f578063817b1cd21461032d576101a7565b8063527e86841461028f57806357ded9c9146102ad57806370458d85146102cb576101a7565b806309b6d29a146101ab5780630f7f9655146101c75780631eddd5ca146101f757806327aa97a01461021357806333a376301461024357806350e71b6914610273575b5f80fd5b6101c560048036038101906101c09190612f77565b610556565b005b6101e160048036038101906101dc9190612ffc565b6105d5565b6040516101ee9190613036565b60405180910390f35b610211600480360381019061020c9190613094565b610636565b005b61022d60048036038101906102289190612ffc565b610b2c565b60405161023a9190613036565b60405180910390f35b61025d60048036038101906102589190612ffc565b610b90565b60405161026a9190613036565b60405180910390f35b61028d600480360381019061028891906130f8565b610c3c565b005b610297610c67565b6040516102a49190613036565b60405180910390f35b6102b5610d2a565b6040516102c29190613132565b60405180910390f35b6102e560048036038101906102e0919061314b565b610d3f565b005b6102ef6111ef565b005b6102f9611202565b6040516103069190613198565b60405180910390f35b610317611226565b60405161032491906131d3565b60405180910390f35b610335611240565b6040516103429190613036565b60405180910390f35b61036560048036038101906103609190612ffc565b611246565b60405161037291906132a3565b60405180910390f35b610383611294565b6040516103909190613198565b60405180910390f35b6103a16112bb565b6040516103ae91906132dd565b60405180910390f35b6103d160048036038101906103cc9190613320565b6112cd565b005b6103ed60048036038101906103e8919061334b565b6112f1565b005b610409600480360381019061040491906134d9565b611926565b005b61042560048036038101906104209190612f77565b611fb0565b6040516104329190613036565b60405180910390f35b61045560048036038101906104509190612f77565b6121c6565b60405161046796959493929190613542565b60405180910390f35b61048a600480360381019061048591906130f8565b61228b565b005b6104a660048036038101906104a19190612ffc565b6122d3565b6040516104b3919061370d565b60405180910390f35b6104d660048036038101906104d19190612ffc565b612500565b005b6104f260048036038101906104ed9190612ffc565b612584565b6040516104ff9190613036565b60405180910390f35b610510612599565b60405161051d9190613132565b60405180910390f35b610540600480360381019061053b9190612ffc565b61259f565b60405161054d91906132a3565b60405180910390f35b61055e612748565b610566610c67565b81106105a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059e90613787565b60405180910390fd5b6105d27f000000000000000000000000000000000000000000000000000000000000000033836127cf565b50565b5f805f6105e18461259f565b90505f5b815181101561062b57610611828281518110610604576106036137a5565b5b6020026020010151611fb0565b8361061c91906137ff565b925080806001019150506105e5565b508192505050919050565b61063e612855565b60045f9054906101000a900460ff161561068d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106849061387c565b60405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106e79190613198565b602060405180830381865afa158015610702573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072691906138ae565b90506107667f00000000000000000000000000000000000000000000000000000000000000003330856fffffffffffffffffffffffffffffffff1661289b565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107c09190613198565b602060405180830381865afa1580156107db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ff91906138ae565b61080991906138d9565b9150610813612ebf565b33815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505042816040019067ffffffffffffffff16908167ffffffffffffffff1681525050600260049054906101000a900467ffffffffffffffff1681604001516108c0919061390c565b816060019067ffffffffffffffff16908167ffffffffffffffff168152505060025f9054906101000a900463ffffffff16816080019063ffffffff16908163ffffffff16815250505f8160a0019015159081151581525050826fffffffffffffffffffffffffffffffff1660035f82825461093b91906137ff565b9250508190555061099660058054905060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061292490919063ffffffff16565b50600581908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff02191690831515021790555050507f8b2ac1728e0110685e958540458d00364f59bb946e0e33ca419ce37173f30f6381604051610b1791906139c0565b60405180910390a15050610b2961293b565b50565b5f80610b3783611246565b90505f805f90505b8251811015610b8557610b6b838281518110610b5e57610b5d6137a5565b5b6020026020010151611fb0565b82610b7691906137ff565b91508080600101915050610b3f565b508092505050919050565b5f80610b9b83611246565b90505f805f90505b8251811015610c31576005838281518110610bc157610bc06137a5565b5b602002602001015181548110610bda57610bd96137a5565b5b905f5260205f2090600302016001015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610c2291906137ff565b91508080600101915050610ba3565b508092505050919050565b610c44612748565b8060025f6101000a81548163ffffffff021916908363ffffffff16021790555050565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cc29190613198565b602060405180830381865afa158015610cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0191906138ae565b90506003548111610d15575f915050610d27565b60035481610d2391906138d9565b9150505b90565b60025f9054906101000a900463ffffffff1681565b610d47612855565b610d4f612748565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610da99190613198565b602060405180830381865afa158015610dc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de891906138ae565b9050610e287f00000000000000000000000000000000000000000000000000000000000000003330856fffffffffffffffffffffffffffffffff1661289b565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e829190613198565b602060405180830381865afa158015610e9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec191906138ae565b610ecb91906138d9565b9150610ed5612ebf565b83815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505042816040019067ffffffffffffffff16908167ffffffffffffffff1681525050600260049054906101000a900467ffffffffffffffff168160400151610f82919061390c565b816060019067ffffffffffffffff16908167ffffffffffffffff168152505060025f9054906101000a900463ffffffff16816080019063ffffffff16908163ffffffff16815250505f8160a0019015159081151581525050826fffffffffffffffffffffffffffffffff1660035f828254610ffd91906137ff565b9250508190555061105860058054905060065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061292490919063ffffffff16565b50600581908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff02191690831515021790555050507f8b2ac1728e0110685e958540458d00364f59bb946e0e33ca419ce37173f30f63816040516111d991906139c0565b60405180910390a150506111eb61293b565b5050565b6111f7612748565b6112005f612944565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260049054906101000a900467ffffffffffffffff1681565b60035481565b606061128d60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a05565b9050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045f9054906101000a900460ff1681565b6112d5612748565b8060045f6101000a81548160ff02191690831515021790555050565b6112f9612855565b60045f9054906101000a900460ff1615611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f9061387c565b60405180910390fd5b6113978260065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a2490919063ffffffff16565b6113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90613a49565b60405180910390fd5b5f600583815481106113eb576113ea6137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff16151515158152505090508060a001511561158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190613ab1565b60405180910390fd5b806060015167ffffffffffffffff164210156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d290613b19565b60405180910390fd5b61162a8360065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a3b90919063ffffffff16565b505f826116875761163a84611fb0565b9050611644610c67565b811115611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613b81565b60405180910390fd5b5b6116d37f0000000000000000000000000000000000000000000000000000000000000000338385602001516fffffffffffffffffffffffffffffffff166116ce91906137ff565b6127cf565b7f7808bc58914d289dfd90e51b373811fe23129075a64c0dfe022cbf82f074894f8282604051611704929190613b9f565b60405180910390a160018260a001901515908115158152505081602001516fffffffffffffffffffffffffffffffff1660035f82825461174491906138d9565b925050819055505f82602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505081600585815481106117905761178f6137a5565b5b905f5260205f2090600302015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff0219169083151502179055509050508060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461191191906137ff565b92505081905550505061192261293b565b5050565b61192e612855565b60045f9054906101000a900460ff161561197d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119749061387c565b60405180910390fd5b5f805f5b8451811015611f21575f85828151811061199e5761199d6137a5565b5b602002602001015190506119f78160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a2490919063ffffffff16565b611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613a49565b60405180910390fd5b5f60058281548110611a4b57611a4a6137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff16151515158152505090508060a0015115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613ab1565b60405180910390fd5b806060015167ffffffffffffffff16421015611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3290613b19565b60405180910390fd5b611c8a8260065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a3b90919063ffffffff16565b505f86611ca857611c9a83611fb0565b85611ca591906137ff565b94505b81602001516fffffffffffffffffffffffffffffffff1686611cca91906137ff565b95507f7808bc58914d289dfd90e51b373811fe23129075a64c0dfe022cbf82f074894f8282604051611cfd929190613b9f565b60405180910390a160018260a001901515908115158152505081602001516fffffffffffffffffffffffffffffffff1660035f828254611d3d91906138d9565b925050819055505f82602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508160058481548110611d8957611d886137a5565b5b905f5260205f2090600302015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff0219169083151502179055509050508060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f0a91906137ff565b925050819055505050508080600101915050611981565b50611f2a610c67565b811115611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390613b81565b60405180910390fd5b611fa27f0000000000000000000000000000000000000000000000000000000000000000338385611f9d91906137ff565b6127cf565b5050611fac61293b565b5050565b5f8060058381548110611fc657611fc56137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff16151515158152505090505f429050816060015167ffffffffffffffff16421061214b57816060015167ffffffffffffffff1690505b6301e1338061271063ffffffff1683602001516fffffffffffffffffffffffffffffffff16846080015163ffffffff16856040015167ffffffffffffffff168561219591906138d9565b61219f9190613bc6565b6121a99190613bc6565b6121b39190613c34565b6121bd9190613c34565b92505050919050565b600581815481106121d5575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a900467ffffffffffffffff16908060010160189054906101000a900467ffffffffffffffff1690806002015f9054906101000a900463ffffffff16908060020160049054906101000a900460ff16905086565b612293612748565b62015180816122a29190613c64565b63ffffffff16600260046101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60605f6122df83611246565b90505f815167ffffffffffffffff8111156122fd576122fc61339d565b5b60405190808252806020026020018201604052801561233657816020015b612323612ebf565b81526020019060019003908161231b5790505b5090505f5b82518110156124f5576005838281518110612359576123586137a5565b5b602002602001015181548110612372576123716137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff1615151515815250508282815181106124dd576124dc6137a5565b5b6020026020010181905250808060010191505061233b565b508092505050919050565b612508612748565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612578575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161256f9190613198565b60405180910390fd5b61258181612944565b50565b6007602052805f5260405f205f915090505481565b61271081565b60605f6125ab83611246565b90505f805f90505b825181101561263a574260058483815181106125d2576125d16137a5565b5b6020026020010151815481106125eb576125ea6137a5565b5b905f5260205f20906003020160010160189054906101000a900467ffffffffffffffff1667ffffffffffffffff161161262d57818061262990613ca0565b9250505b80806001019150506125b3565b505f8167ffffffffffffffff8111156126565761265561339d565b5b6040519080825280602002602001820160405280156126845781602001602082028036833780820191505090505b5090505f5b835181101561273c574260058583815181106126a8576126a76137a5565b5b6020026020010151815481106126c1576126c06137a5565b5b905f5260205f20906003020160010160189054906101000a900467ffffffffffffffff1667ffffffffffffffff161161272f57838181518110612707576127066137a5565b5b6020026020010151828281518110612722576127216137a5565b5b6020026020010181815250505b8080600101915050612689565b50809350505050919050565b612750612a52565b73ffffffffffffffffffffffffffffffffffffffff1661276e611294565b73ffffffffffffffffffffffffffffffffffffffff16146127cd57612791612a52565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016127c49190613198565b60405180910390fd5b565b6128508363a9059cbb60e01b84846040516024016127ee929190613ce7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a59565b505050565b600260015403612891576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b61291e846323b872dd60e01b8585856040516024016128bc93929190613d0e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a59565b50505050565b5f612933835f01835f1b612b1e565b905092915050565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60605f612a13835f01612b85565b905060608190508092505050919050565b5f612a33835f01835f1b612bde565b905092915050565b5f612a4a835f01835f1b612bfe565b905092915050565b5f33905090565b5f612aba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612cfa9092919063ffffffff16565b90505f81511115612b195780806020019051810190612ad99190613d57565b612b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0f90613df2565b60405180910390fd5b5b505050565b5f612b298383612bde565b612b7b57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050612b7f565b5f90505b92915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612bd257602002820191905f5260205f20905b815481526020019060010190808311612bbe575b50505050509050919050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80836001015f8481526020019081526020015f205490505f8114612cef575f600182612c2b91906138d9565b90505f6001865f0180549050612c4191906138d9565b9050808214612ca7575f865f018281548110612c6057612c5f6137a5565b5b905f5260205f200154905080875f018481548110612c8157612c806137a5565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480612cba57612cb9613e10565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050612cf4565b5f9150505b92915050565b6060612d0884845f85612d11565b90509392505050565b606082471015612d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4d90613ead565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612d7e9190613f1d565b5f6040518083038185875af1925050503d805f8114612db8576040519150601f19603f3d011682016040523d82523d5f602084013e612dbd565b606091505b5091509150612dce87838387612dda565b92505050949350505050565b60608315612e3b575f835103612e3357612df385612e4e565b612e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2990613f7d565b60405180910390fd5b5b829050612e46565b612e458383612e70565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f82511115612e825781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb69190613fdd565b60405180910390fd5b6040518060c001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f63ffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612f5681612f44565b8114612f60575f80fd5b50565b5f81359050612f7181612f4d565b92915050565b5f60208284031215612f8c57612f8b612f3c565b5b5f612f9984828501612f63565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612fcb82612fa2565b9050919050565b612fdb81612fc1565b8114612fe5575f80fd5b50565b5f81359050612ff681612fd2565b92915050565b5f6020828403121561301157613010612f3c565b5b5f61301e84828501612fe8565b91505092915050565b61303081612f44565b82525050565b5f6020820190506130495f830184613027565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6130738161304f565b811461307d575f80fd5b50565b5f8135905061308e8161306a565b92915050565b5f602082840312156130a9576130a8612f3c565b5b5f6130b684828501613080565b91505092915050565b5f63ffffffff82169050919050565b6130d7816130bf565b81146130e1575f80fd5b50565b5f813590506130f2816130ce565b92915050565b5f6020828403121561310d5761310c612f3c565b5b5f61311a848285016130e4565b91505092915050565b61312c816130bf565b82525050565b5f6020820190506131455f830184613123565b92915050565b5f806040838503121561316157613160612f3c565b5b5f61316e85828601612fe8565b925050602061317f85828601613080565b9150509250929050565b61319281612fc1565b82525050565b5f6020820190506131ab5f830184613189565b92915050565b5f67ffffffffffffffff82169050919050565b6131cd816131b1565b82525050565b5f6020820190506131e65f8301846131c4565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61321e81612f44565b82525050565b5f61322f8383613215565b60208301905092915050565b5f602082019050919050565b5f613251826131ec565b61325b81856131f6565b935061326683613206565b805f5b8381101561329657815161327d8882613224565b97506132888361323b565b925050600181019050613269565b5085935050505092915050565b5f6020820190508181035f8301526132bb8184613247565b905092915050565b5f8115159050919050565b6132d7816132c3565b82525050565b5f6020820190506132f05f8301846132ce565b92915050565b6132ff816132c3565b8114613309575f80fd5b50565b5f8135905061331a816132f6565b92915050565b5f6020828403121561333557613334612f3c565b5b5f6133428482850161330c565b91505092915050565b5f806040838503121561336157613360612f3c565b5b5f61336e85828601612f63565b925050602061337f8582860161330c565b9150509250929050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6133d38261338d565b810181811067ffffffffffffffff821117156133f2576133f161339d565b5b80604052505050565b5f613404612f33565b905061341082826133ca565b919050565b5f67ffffffffffffffff82111561342f5761342e61339d565b5b602082029050602081019050919050565b5f80fd5b5f61345661345184613415565b6133fb565b9050808382526020820190506020840283018581111561347957613478613440565b5b835b818110156134a2578061348e8882612f63565b84526020840193505060208101905061347b565b5050509392505050565b5f82601f8301126134c0576134bf613389565b5b81356134d0848260208601613444565b91505092915050565b5f80604083850312156134ef576134ee612f3c565b5b5f83013567ffffffffffffffff81111561350c5761350b612f40565b5b613518858286016134ac565b92505060206135298582860161330c565b9150509250929050565b61353c8161304f565b82525050565b5f60c0820190506135555f830189613189565b6135626020830188613533565b61356f60408301876131c4565b61357c60608301866131c4565b6135896080830185613123565b61359660a08301846132ce565b979650505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6135d381612fc1565b82525050565b6135e28161304f565b82525050565b6135f1816131b1565b82525050565b613600816130bf565b82525050565b61360f816132c3565b82525050565b60c082015f8201516136295f8501826135ca565b50602082015161363c60208501826135d9565b50604082015161364f60408501826135e8565b50606082015161366260608501826135e8565b50608082015161367560808501826135f7565b5060a082015161368860a0850182613606565b50505050565b5f6136998383613615565b60c08301905092915050565b5f602082019050919050565b5f6136bb826135a1565b6136c581856135ab565b93506136d0836135bb565b805f5b838110156137005781516136e7888261368e565b97506136f2836136a5565b9250506001810190506136d3565b5085935050505092915050565b5f6020820190508181035f83015261372581846136b1565b905092915050565b5f82825260208201905092915050565b7f43616e6e6f74207769746864726177207374616b656420746f6b656e730000005f82015250565b5f613771601d8361372d565b915061377c8261373d565b602082019050919050565b5f6020820190508181035f83015261379e81613765565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61380982612f44565b915061381483612f44565b925082820190508082111561382c5761382b6137d2565b5b92915050565b7f5374616b696e672069732063757272656e746c792070617573656400000000005f82015250565b5f613866601b8361372d565b915061387182613832565b602082019050919050565b5f6020820190508181035f8301526138938161385a565b9050919050565b5f815190506138a881612f4d565b92915050565b5f602082840312156138c3576138c2612f3c565b5b5f6138d08482850161389a565b91505092915050565b5f6138e382612f44565b91506138ee83612f44565b9250828203905081811115613906576139056137d2565b5b92915050565b5f613916826131b1565b9150613921836131b1565b9250828201905067ffffffffffffffff811115613941576139406137d2565b5b92915050565b60c082015f82015161395b5f8501826135ca565b50602082015161396e60208501826135d9565b50604082015161398160408501826135e8565b50606082015161399460608501826135e8565b5060808201516139a760808501826135f7565b5060a08201516139ba60a0850182613606565b50505050565b5f60c0820190506139d35f830184613947565b92915050565b7f5374616b65206e6f74206f776e65642062792075736572206f7220616c7265615f8201527f647920636c61696d656400000000000000000000000000000000000000000000602082015250565b5f613a33602a8361372d565b9150613a3e826139d9565b604082019050919050565b5f6020820190508181035f830152613a6081613a27565b9050919050565b7f5374616b6520616c7265616479207265636569766564000000000000000000005f82015250565b5f613a9b60168361372d565b9150613aa682613a67565b602082019050919050565b5f6020820190508181035f830152613ac881613a8f565b9050919050565b7f5374616b696e67206e6f742072656164792079657400000000000000000000005f82015250565b5f613b0360158361372d565b9150613b0e82613acf565b602082019050919050565b5f6020820190508181035f830152613b3081613af7565b9050919050565b7f4e6f7420656e6f756768207265776172647320746f20706179206f75742e00005f82015250565b5f613b6b601e8361372d565b9150613b7682613b37565b602082019050919050565b5f6020820190508181035f830152613b9881613b5f565b9050919050565b5f60e082019050613bb25f830185613947565b613bbf60c0830184613027565b9392505050565b5f613bd082612f44565b9150613bdb83612f44565b9250828202613be981612f44565b91508282048414831517613c0057613bff6137d2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613c3e82612f44565b9150613c4983612f44565b925082613c5957613c58613c07565b5b828204905092915050565b5f613c6e826130bf565b9150613c79836130bf565b9250828202613c87816130bf565b9150808214613c9957613c986137d2565b5b5092915050565b5f613caa82612f44565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cdc57613cdb6137d2565b5b600182019050919050565b5f604082019050613cfa5f830185613189565b613d076020830184613027565b9392505050565b5f606082019050613d215f830186613189565b613d2e6020830185613189565b613d3b6040830184613027565b949350505050565b5f81519050613d51816132f6565b92915050565b5f60208284031215613d6c57613d6b612f3c565b5b5f613d7984828501613d43565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f613ddc602a8361372d565b9150613de782613d82565b604082019050919050565b5f6020820190508181035f830152613e0981613dd0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f613e9760268361372d565b9150613ea282613e3d565b604082019050919050565b5f6020820190508181035f830152613ec481613e8b565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f613ef782613ecb565b613f018185613ed5565b9350613f11818560208601613edf565b80840191505092915050565b5f613f288284613eed565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f613f67601d8361372d565b9150613f7282613f33565b602082019050919050565b5f6020820190508181035f830152613f9481613f5b565b9050919050565b5f81519050919050565b5f613faf82613f9b565b613fb9818561372d565b9350613fc9818560208601613edf565b613fd28161338d565b840191505092915050565b5f6020820190508181035f830152613ff58184613fa5565b90509291505056fea2646970667358221220dd8cb7ced9a1b4898cb438fd7467e89925efe030b33fea55ed2ac2a80be4769364736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101a7575f3560e01c8063842e2981116100f7578063d5a44f8611610095578063f2fde38b1161006f578063f2fde38b146104bc578063f6a3f3cf146104d8578063fb9e7aa014610508578063fd56edfb14610526576101a7565b8063d5a44f861461043b578063e7d6c22014610470578063ef024cae1461048c576101a7565b8063c038b472116100d1578063c038b472146103b7578063c79552a9146103d3578063d21d97c7146103ef578063d2d7231f1461040b576101a7565b8063842e29811461034b5780638da5cb5b1461037b578063bbb781cc14610399576101a7565b8063527e868411610164578063715018a61161013e578063715018a6146102e757806372f702f3146102f15780638005a7de1461030f578063817b1cd21461032d576101a7565b8063527e86841461028f57806357ded9c9146102ad57806370458d85146102cb576101a7565b806309b6d29a146101ab5780630f7f9655146101c75780631eddd5ca146101f757806327aa97a01461021357806333a376301461024357806350e71b6914610273575b5f80fd5b6101c560048036038101906101c09190612f77565b610556565b005b6101e160048036038101906101dc9190612ffc565b6105d5565b6040516101ee9190613036565b60405180910390f35b610211600480360381019061020c9190613094565b610636565b005b61022d60048036038101906102289190612ffc565b610b2c565b60405161023a9190613036565b60405180910390f35b61025d60048036038101906102589190612ffc565b610b90565b60405161026a9190613036565b60405180910390f35b61028d600480360381019061028891906130f8565b610c3c565b005b610297610c67565b6040516102a49190613036565b60405180910390f35b6102b5610d2a565b6040516102c29190613132565b60405180910390f35b6102e560048036038101906102e0919061314b565b610d3f565b005b6102ef6111ef565b005b6102f9611202565b6040516103069190613198565b60405180910390f35b610317611226565b60405161032491906131d3565b60405180910390f35b610335611240565b6040516103429190613036565b60405180910390f35b61036560048036038101906103609190612ffc565b611246565b60405161037291906132a3565b60405180910390f35b610383611294565b6040516103909190613198565b60405180910390f35b6103a16112bb565b6040516103ae91906132dd565b60405180910390f35b6103d160048036038101906103cc9190613320565b6112cd565b005b6103ed60048036038101906103e8919061334b565b6112f1565b005b610409600480360381019061040491906134d9565b611926565b005b61042560048036038101906104209190612f77565b611fb0565b6040516104329190613036565b60405180910390f35b61045560048036038101906104509190612f77565b6121c6565b60405161046796959493929190613542565b60405180910390f35b61048a600480360381019061048591906130f8565b61228b565b005b6104a660048036038101906104a19190612ffc565b6122d3565b6040516104b3919061370d565b60405180910390f35b6104d660048036038101906104d19190612ffc565b612500565b005b6104f260048036038101906104ed9190612ffc565b612584565b6040516104ff9190613036565b60405180910390f35b610510612599565b60405161051d9190613132565b60405180910390f35b610540600480360381019061053b9190612ffc565b61259f565b60405161054d91906132a3565b60405180910390f35b61055e612748565b610566610c67565b81106105a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059e90613787565b60405180910390fd5b6105d27f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796733836127cf565b50565b5f805f6105e18461259f565b90505f5b815181101561062b57610611828281518110610604576106036137a5565b5b6020026020010151611fb0565b8361061c91906137ff565b925080806001019150506105e5565b508192505050919050565b61063e612855565b60045f9054906101000a900460ff161561068d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106849061387c565b60405180910390fd5b5f7f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106e79190613198565b602060405180830381865afa158015610702573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072691906138ae565b90506107667f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c93379673330856fffffffffffffffffffffffffffffffff1661289b565b807f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107c09190613198565b602060405180830381865afa1580156107db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ff91906138ae565b61080991906138d9565b9150610813612ebf565b33815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505042816040019067ffffffffffffffff16908167ffffffffffffffff1681525050600260049054906101000a900467ffffffffffffffff1681604001516108c0919061390c565b816060019067ffffffffffffffff16908167ffffffffffffffff168152505060025f9054906101000a900463ffffffff16816080019063ffffffff16908163ffffffff16815250505f8160a0019015159081151581525050826fffffffffffffffffffffffffffffffff1660035f82825461093b91906137ff565b9250508190555061099660058054905060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061292490919063ffffffff16565b50600581908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff02191690831515021790555050507f8b2ac1728e0110685e958540458d00364f59bb946e0e33ca419ce37173f30f6381604051610b1791906139c0565b60405180910390a15050610b2961293b565b50565b5f80610b3783611246565b90505f805f90505b8251811015610b8557610b6b838281518110610b5e57610b5d6137a5565b5b6020026020010151611fb0565b82610b7691906137ff565b91508080600101915050610b3f565b508092505050919050565b5f80610b9b83611246565b90505f805f90505b8251811015610c31576005838281518110610bc157610bc06137a5565b5b602002602001015181548110610bda57610bd96137a5565b5b905f5260205f2090600302016001015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610c2291906137ff565b91508080600101915050610ba3565b508092505050919050565b610c44612748565b8060025f6101000a81548163ffffffff021916908363ffffffff16021790555050565b5f807f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cc29190613198565b602060405180830381865afa158015610cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0191906138ae565b90506003548111610d15575f915050610d27565b60035481610d2391906138d9565b9150505b90565b60025f9054906101000a900463ffffffff1681565b610d47612855565b610d4f612748565b5f7f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610da99190613198565b602060405180830381865afa158015610dc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de891906138ae565b9050610e287f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c93379673330856fffffffffffffffffffffffffffffffff1661289b565b807f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e829190613198565b602060405180830381865afa158015610e9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec191906138ae565b610ecb91906138d9565b9150610ed5612ebf565b83815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505042816040019067ffffffffffffffff16908167ffffffffffffffff1681525050600260049054906101000a900467ffffffffffffffff168160400151610f82919061390c565b816060019067ffffffffffffffff16908167ffffffffffffffff168152505060025f9054906101000a900463ffffffff16816080019063ffffffff16908163ffffffff16815250505f8160a0019015159081151581525050826fffffffffffffffffffffffffffffffff1660035f828254610ffd91906137ff565b9250508190555061105860058054905060065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061292490919063ffffffff16565b50600581908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff02191690831515021790555050507f8b2ac1728e0110685e958540458d00364f59bb946e0e33ca419ce37173f30f63816040516111d991906139c0565b60405180910390a150506111eb61293b565b5050565b6111f7612748565b6112005f612944565b565b7f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c933796781565b600260049054906101000a900467ffffffffffffffff1681565b60035481565b606061128d60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a05565b9050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045f9054906101000a900460ff1681565b6112d5612748565b8060045f6101000a81548160ff02191690831515021790555050565b6112f9612855565b60045f9054906101000a900460ff1615611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f9061387c565b60405180910390fd5b6113978260065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a2490919063ffffffff16565b6113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90613a49565b60405180910390fd5b5f600583815481106113eb576113ea6137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff16151515158152505090508060a001511561158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190613ab1565b60405180910390fd5b806060015167ffffffffffffffff164210156115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d290613b19565b60405180910390fd5b61162a8360065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a3b90919063ffffffff16565b505f826116875761163a84611fb0565b9050611644610c67565b811115611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d90613b81565b60405180910390fd5b5b6116d37f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c9337967338385602001516fffffffffffffffffffffffffffffffff166116ce91906137ff565b6127cf565b7f7808bc58914d289dfd90e51b373811fe23129075a64c0dfe022cbf82f074894f8282604051611704929190613b9f565b60405180910390a160018260a001901515908115158152505081602001516fffffffffffffffffffffffffffffffff1660035f82825461174491906138d9565b925050819055505f82602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505081600585815481106117905761178f6137a5565b5b905f5260205f2090600302015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff0219169083151502179055509050508060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461191191906137ff565b92505081905550505061192261293b565b5050565b61192e612855565b60045f9054906101000a900460ff161561197d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119749061387c565b60405180910390fd5b5f805f5b8451811015611f21575f85828151811061199e5761199d6137a5565b5b602002602001015190506119f78160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a2490919063ffffffff16565b611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613a49565b60405180910390fd5b5f60058281548110611a4b57611a4a6137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff16151515158152505090508060a0015115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613ab1565b60405180910390fd5b806060015167ffffffffffffffff16421015611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3290613b19565b60405180910390fd5b611c8a8260065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a3b90919063ffffffff16565b505f86611ca857611c9a83611fb0565b85611ca591906137ff565b94505b81602001516fffffffffffffffffffffffffffffffff1686611cca91906137ff565b95507f7808bc58914d289dfd90e51b373811fe23129075a64c0dfe022cbf82f074894f8282604051611cfd929190613b9f565b60405180910390a160018260a001901515908115158152505081602001516fffffffffffffffffffffffffffffffff1660035f828254611d3d91906138d9565b925050819055505f82602001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508160058481548110611d8957611d886137a5565b5b905f5260205f2090600302015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816002015f6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020160046101000a81548160ff0219169083151502179055509050508060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f0a91906137ff565b925050819055505050508080600101915050611981565b50611f2a610c67565b811115611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390613b81565b60405180910390fd5b611fa27f000000000000000000000000a2ce8366603f3fffc460bef0fb90e980c9337967338385611f9d91906137ff565b6127cf565b5050611fac61293b565b5050565b5f8060058381548110611fc657611fc56137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff16151515158152505090505f429050816060015167ffffffffffffffff16421061214b57816060015167ffffffffffffffff1690505b6301e1338061271063ffffffff1683602001516fffffffffffffffffffffffffffffffff16846080015163ffffffff16856040015167ffffffffffffffff168561219591906138d9565b61219f9190613bc6565b6121a99190613bc6565b6121b39190613c34565b6121bd9190613c34565b92505050919050565b600581815481106121d5575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a900467ffffffffffffffff16908060010160189054906101000a900467ffffffffffffffff1690806002015f9054906101000a900463ffffffff16908060020160049054906101000a900460ff16905086565b612293612748565b62015180816122a29190613c64565b63ffffffff16600260046101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60605f6122df83611246565b90505f815167ffffffffffffffff8111156122fd576122fc61339d565b5b60405190808252806020026020018201604052801561233657816020015b612323612ebf565b81526020019060019003908161231b5790505b5090505f5b82518110156124f5576005838281518110612359576123586137a5565b5b602002602001015181548110612372576123716137a5565b5b905f5260205f2090600302016040518060c00160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600282015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820160049054906101000a900460ff1615151515815250508282815181106124dd576124dc6137a5565b5b6020026020010181905250808060010191505061233b565b508092505050919050565b612508612748565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612578575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161256f9190613198565b60405180910390fd5b61258181612944565b50565b6007602052805f5260405f205f915090505481565b61271081565b60605f6125ab83611246565b90505f805f90505b825181101561263a574260058483815181106125d2576125d16137a5565b5b6020026020010151815481106125eb576125ea6137a5565b5b905f5260205f20906003020160010160189054906101000a900467ffffffffffffffff1667ffffffffffffffff161161262d57818061262990613ca0565b9250505b80806001019150506125b3565b505f8167ffffffffffffffff8111156126565761265561339d565b5b6040519080825280602002602001820160405280156126845781602001602082028036833780820191505090505b5090505f5b835181101561273c574260058583815181106126a8576126a76137a5565b5b6020026020010151815481106126c1576126c06137a5565b5b905f5260205f20906003020160010160189054906101000a900467ffffffffffffffff1667ffffffffffffffff161161272f57838181518110612707576127066137a5565b5b6020026020010151828281518110612722576127216137a5565b5b6020026020010181815250505b8080600101915050612689565b50809350505050919050565b612750612a52565b73ffffffffffffffffffffffffffffffffffffffff1661276e611294565b73ffffffffffffffffffffffffffffffffffffffff16146127cd57612791612a52565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016127c49190613198565b60405180910390fd5b565b6128508363a9059cbb60e01b84846040516024016127ee929190613ce7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a59565b505050565b600260015403612891576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b61291e846323b872dd60e01b8585856040516024016128bc93929190613d0e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a59565b50505050565b5f612933835f01835f1b612b1e565b905092915050565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60605f612a13835f01612b85565b905060608190508092505050919050565b5f612a33835f01835f1b612bde565b905092915050565b5f612a4a835f01835f1b612bfe565b905092915050565b5f33905090565b5f612aba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612cfa9092919063ffffffff16565b90505f81511115612b195780806020019051810190612ad99190613d57565b612b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0f90613df2565b60405180910390fd5b5b505050565b5f612b298383612bde565b612b7b57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050612b7f565b5f90505b92915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612bd257602002820191905f5260205f20905b815481526020019060010190808311612bbe575b50505050509050919050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f80836001015f8481526020019081526020015f205490505f8114612cef575f600182612c2b91906138d9565b90505f6001865f0180549050612c4191906138d9565b9050808214612ca7575f865f018281548110612c6057612c5f6137a5565b5b905f5260205f200154905080875f018481548110612c8157612c806137a5565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f01805480612cba57612cb9613e10565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050612cf4565b5f9150505b92915050565b6060612d0884845f85612d11565b90509392505050565b606082471015612d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4d90613ead565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612d7e9190613f1d565b5f6040518083038185875af1925050503d805f8114612db8576040519150601f19603f3d011682016040523d82523d5f602084013e612dbd565b606091505b5091509150612dce87838387612dda565b92505050949350505050565b60608315612e3b575f835103612e3357612df385612e4e565b612e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2990613f7d565b60405180910390fd5b5b829050612e46565b612e458383612e70565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f82511115612e825781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb69190613fdd565b60405180910390fd5b6040518060c001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f6fffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f63ffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b612f5681612f44565b8114612f60575f80fd5b50565b5f81359050612f7181612f4d565b92915050565b5f60208284031215612f8c57612f8b612f3c565b5b5f612f9984828501612f63565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612fcb82612fa2565b9050919050565b612fdb81612fc1565b8114612fe5575f80fd5b50565b5f81359050612ff681612fd2565b92915050565b5f6020828403121561301157613010612f3c565b5b5f61301e84828501612fe8565b91505092915050565b61303081612f44565b82525050565b5f6020820190506130495f830184613027565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6130738161304f565b811461307d575f80fd5b50565b5f8135905061308e8161306a565b92915050565b5f602082840312156130a9576130a8612f3c565b5b5f6130b684828501613080565b91505092915050565b5f63ffffffff82169050919050565b6130d7816130bf565b81146130e1575f80fd5b50565b5f813590506130f2816130ce565b92915050565b5f6020828403121561310d5761310c612f3c565b5b5f61311a848285016130e4565b91505092915050565b61312c816130bf565b82525050565b5f6020820190506131455f830184613123565b92915050565b5f806040838503121561316157613160612f3c565b5b5f61316e85828601612fe8565b925050602061317f85828601613080565b9150509250929050565b61319281612fc1565b82525050565b5f6020820190506131ab5f830184613189565b92915050565b5f67ffffffffffffffff82169050919050565b6131cd816131b1565b82525050565b5f6020820190506131e65f8301846131c4565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61321e81612f44565b82525050565b5f61322f8383613215565b60208301905092915050565b5f602082019050919050565b5f613251826131ec565b61325b81856131f6565b935061326683613206565b805f5b8381101561329657815161327d8882613224565b97506132888361323b565b925050600181019050613269565b5085935050505092915050565b5f6020820190508181035f8301526132bb8184613247565b905092915050565b5f8115159050919050565b6132d7816132c3565b82525050565b5f6020820190506132f05f8301846132ce565b92915050565b6132ff816132c3565b8114613309575f80fd5b50565b5f8135905061331a816132f6565b92915050565b5f6020828403121561333557613334612f3c565b5b5f6133428482850161330c565b91505092915050565b5f806040838503121561336157613360612f3c565b5b5f61336e85828601612f63565b925050602061337f8582860161330c565b9150509250929050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6133d38261338d565b810181811067ffffffffffffffff821117156133f2576133f161339d565b5b80604052505050565b5f613404612f33565b905061341082826133ca565b919050565b5f67ffffffffffffffff82111561342f5761342e61339d565b5b602082029050602081019050919050565b5f80fd5b5f61345661345184613415565b6133fb565b9050808382526020820190506020840283018581111561347957613478613440565b5b835b818110156134a2578061348e8882612f63565b84526020840193505060208101905061347b565b5050509392505050565b5f82601f8301126134c0576134bf613389565b5b81356134d0848260208601613444565b91505092915050565b5f80604083850312156134ef576134ee612f3c565b5b5f83013567ffffffffffffffff81111561350c5761350b612f40565b5b613518858286016134ac565b92505060206135298582860161330c565b9150509250929050565b61353c8161304f565b82525050565b5f60c0820190506135555f830189613189565b6135626020830188613533565b61356f60408301876131c4565b61357c60608301866131c4565b6135896080830185613123565b61359660a08301846132ce565b979650505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6135d381612fc1565b82525050565b6135e28161304f565b82525050565b6135f1816131b1565b82525050565b613600816130bf565b82525050565b61360f816132c3565b82525050565b60c082015f8201516136295f8501826135ca565b50602082015161363c60208501826135d9565b50604082015161364f60408501826135e8565b50606082015161366260608501826135e8565b50608082015161367560808501826135f7565b5060a082015161368860a0850182613606565b50505050565b5f6136998383613615565b60c08301905092915050565b5f602082019050919050565b5f6136bb826135a1565b6136c581856135ab565b93506136d0836135bb565b805f5b838110156137005781516136e7888261368e565b97506136f2836136a5565b9250506001810190506136d3565b5085935050505092915050565b5f6020820190508181035f83015261372581846136b1565b905092915050565b5f82825260208201905092915050565b7f43616e6e6f74207769746864726177207374616b656420746f6b656e730000005f82015250565b5f613771601d8361372d565b915061377c8261373d565b602082019050919050565b5f6020820190508181035f83015261379e81613765565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61380982612f44565b915061381483612f44565b925082820190508082111561382c5761382b6137d2565b5b92915050565b7f5374616b696e672069732063757272656e746c792070617573656400000000005f82015250565b5f613866601b8361372d565b915061387182613832565b602082019050919050565b5f6020820190508181035f8301526138938161385a565b9050919050565b5f815190506138a881612f4d565b92915050565b5f602082840312156138c3576138c2612f3c565b5b5f6138d08482850161389a565b91505092915050565b5f6138e382612f44565b91506138ee83612f44565b9250828203905081811115613906576139056137d2565b5b92915050565b5f613916826131b1565b9150613921836131b1565b9250828201905067ffffffffffffffff811115613941576139406137d2565b5b92915050565b60c082015f82015161395b5f8501826135ca565b50602082015161396e60208501826135d9565b50604082015161398160408501826135e8565b50606082015161399460608501826135e8565b5060808201516139a760808501826135f7565b5060a08201516139ba60a0850182613606565b50505050565b5f60c0820190506139d35f830184613947565b92915050565b7f5374616b65206e6f74206f776e65642062792075736572206f7220616c7265615f8201527f647920636c61696d656400000000000000000000000000000000000000000000602082015250565b5f613a33602a8361372d565b9150613a3e826139d9565b604082019050919050565b5f6020820190508181035f830152613a6081613a27565b9050919050565b7f5374616b6520616c7265616479207265636569766564000000000000000000005f82015250565b5f613a9b60168361372d565b9150613aa682613a67565b602082019050919050565b5f6020820190508181035f830152613ac881613a8f565b9050919050565b7f5374616b696e67206e6f742072656164792079657400000000000000000000005f82015250565b5f613b0360158361372d565b9150613b0e82613acf565b602082019050919050565b5f6020820190508181035f830152613b3081613af7565b9050919050565b7f4e6f7420656e6f756768207265776172647320746f20706179206f75742e00005f82015250565b5f613b6b601e8361372d565b9150613b7682613b37565b602082019050919050565b5f6020820190508181035f830152613b9881613b5f565b9050919050565b5f60e082019050613bb25f830185613947565b613bbf60c0830184613027565b9392505050565b5f613bd082612f44565b9150613bdb83612f44565b9250828202613be981612f44565b91508282048414831517613c0057613bff6137d2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613c3e82612f44565b9150613c4983612f44565b925082613c5957613c58613c07565b5b828204905092915050565b5f613c6e826130bf565b9150613c79836130bf565b9250828202613c87816130bf565b9150808214613c9957613c986137d2565b5b5092915050565b5f613caa82612f44565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cdc57613cdb6137d2565b5b600182019050919050565b5f604082019050613cfa5f830185613189565b613d076020830184613027565b9392505050565b5f606082019050613d215f830186613189565b613d2e6020830185613189565b613d3b6040830184613027565b949350505050565b5f81519050613d51816132f6565b92915050565b5f60208284031215613d6c57613d6b612f3c565b5b5f613d7984828501613d43565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f613ddc602a8361372d565b9150613de782613d82565b604082019050919050565b5f6020820190508181035f830152613e0981613dd0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f613e9760268361372d565b9150613ea282613e3d565b604082019050919050565b5f6020820190508181035f830152613ec481613e8b565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f613ef782613ecb565b613f018185613ed5565b9350613f11818560208601613edf565b80840191505092915050565b5f613f288284613eed565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f613f67601d8361372d565b9150613f7282613f33565b602082019050919050565b5f6020820190508181035f830152613f9481613f5b565b9050919050565b5f81519050919050565b5f613faf82613f9b565b613fb9818561372d565b9350613fc9818560208601613edf565b613fd28161338d565b840191505092915050565b5f6020820190508181035f830152613ff58184613fa5565b90509291505056fea2646970667358221220dd8cb7ced9a1b4898cb438fd7467e89925efe030b33fea55ed2ac2a80be4769364736f6c634300081a0033
Deployed Bytecode Sourcemap
27952:9958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37668:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35905:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30486:1081;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36684:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37047:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29055:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37408:252;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28112:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29429:1023;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24697:103;;;:::i;:::-;;28066:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28201:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28239:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35081:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24022:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28274:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29147:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31575:1330;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32913:1695;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34632:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28503:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;29274:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36282:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24955:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28607:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28136:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35215:682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37668:239;23908:13;:11;:13::i;:::-;37768:21:::1;:19;:21::i;:::-;37758:7;:31;37750:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37834:65;37864:12;37879:10;37891:7;37834:22;:65::i;:::-;37668:239:::0;:::o;35905:369::-;35978:7;35997:22;36030:31;36064;36090:4;36064:25;:31::i;:::-;36030:65;;36110:9;36106:129;36129:14;:21;36125:1;:25;36106:129;;;36189:34;36205:14;36220:1;36205:17;;;;;;;;:::i;:::-;;;;;;;;36189:15;:34::i;:::-;36171:52;;;;;:::i;:::-;;;36152:3;;;;;;;36106:129;;;;36252:14;36245:21;;;;35905:369;;;:::o;30486:1081::-;27037:21;:19;:21::i;:::-;30567:13:::1;;;;;;;;;;;30566:14;30558:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;30689:15;30714:12;30707:30;;;30746:4;30707:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30689:63;;30763:83;30797:12;30812:10;30832:4;30839:6;30763:83;;:26;:83::i;:::-;30922:7;30881:12;30874:30;;;30913:4;30874:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;30857:73;;30978:33;;:::i;:::-;31045:10;31022:14;:20;;:33;;;;;;;;;::::0;::::1;31096:6;31066:14;:27;;:36;;;;;;;;;::::0;::::1;31147:15;31113:14;:24;;:50;;;;;;;;;::::0;::::1;31226:15;;;;;;;;;;;31199:14;:24;;;:42;;;;:::i;:::-;31174:14;:22;;:67;;;;;;;;;::::0;::::1;31273:3;;;;;;;;;;;31252:14;:18;;:24;;;;;;;;;::::0;::::1;31314:5;31287:14;:24;;:32;;;;;;;;;::::0;::::1;31347:6;31332:21;;:11;;:21;;;;;;;:::i;:::-;;;;;;;;31440:41;31467:6;:13;;;;31440:10;:22;31451:10;31440:22;;;;;;;;;;;;;;;:26;;:41;;;;:::i;:::-;;31492:6;31504:14;31492:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31537:22;31544:14;31537:22;;;;;;:::i;:::-;;;;;;;;30545:1022;;27081:20:::0;:18;:20::i;:::-;30486:1081;:::o;36684:355::-;36758:7;36777:28;36808:19;36822:4;36808:13;:19::i;:::-;36777:50;;36838:24;36877:9;36889:1;36877:13;;36873:125;36896:11;:18;36892:1;:22;36873:125;;;36955:31;36971:11;36983:1;36971:14;;;;;;;;:::i;:::-;;;;;;;;36955:15;:31::i;:::-;36935:51;;;;;:::i;:::-;;;36916:3;;;;;;;36873:125;;;;37015:16;37008:23;;;;36684:355;;;:::o;37047:353::-;37118:7;37137:28;37168:19;37182:4;37168:13;:19::i;:::-;37137:50;;37198:23;37236:9;37248:1;37236:13;;37232:128;37255:11;:18;37251:1;:22;37232:128;;;37313:6;37320:11;37332:1;37320:14;;;;;;;;:::i;:::-;;;;;;;;37313:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;;;;;;;;;37294:54;;;;;;;:::i;:::-;;;37275:3;;;;;;;37232:128;;;;37377:15;37370:22;;;;37047:353;;;:::o;29055:84::-;23908:13;:11;:13::i;:::-;29125:6:::1;29119:3;;:12;;;;;;;;;;;;;;;;;;29055:84:::0;:::o;37408:252::-;37460:7;37479:15;37504:12;37497:30;;;37536:4;37497:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37479:63;;37567:11;;37556:7;:22;37553:61;;37601:1;37594:8;;;;;37553:61;37641:11;;37631:7;:21;;;;:::i;:::-;37624:28;;;37408:252;;:::o;28112:17::-;;;;;;;;;;;;;:::o;29429:1023::-;27037:21;:19;:21::i;:::-;23908:13:::1;:11;:13::i;:::-;29586:15:::2;29611:12;29604:30;;;29643:4;29604:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29586:63;;29660:83;29694:12;29709:10;29729:4;29736:6;29660:83;;:26;:83::i;:::-;29819:7;29778:12;29771:30;;;29810:4;29771:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;;:::i;:::-;29754:73;;29875:33;;:::i;:::-;29942:4;29919:14;:20;;:27;;;;;;;;;::::0;::::2;29987:6;29957:14;:27;;:36;;;;;;;;;::::0;::::2;30038:15;30004:14;:24;;:50;;;;;;;;;::::0;::::2;30117:15;;;;;;;;;;;30090:14;:24;;;:42;;;;:::i;:::-;30065:14;:22;;:67;;;;;;;;;::::0;::::2;30164:3;;;;;;;;;;;30143:14;:18;;:24;;;;;;;;;::::0;::::2;30205:5;30178:14;:24;;:32;;;;;;;;;::::0;::::2;30238:6;30223:21;;:11;;:21;;;;;;;:::i;:::-;;;;;;;;30331:35;30352:6;:13;;;;30331:10;:16;30342:4;30331:16;;;;;;;;;;;;;;;:20;;:35;;;;:::i;:::-;;30377:6;30389:14;30377:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30422:22;30429:14;30422:22;;;;;;:::i;:::-;;;;;;;;29509:943;;27081:20:::0;:18;:20::i;:::-;29429:1023;;:::o;24697:103::-;23908:13;:11;:13::i;:::-;24762:30:::1;24789:1;24762:18;:30::i;:::-;24697:103::o:0;28066:37::-;;;:::o;28201:29::-;;;;;;;;;;;;;:::o;28239:26::-;;;;:::o;35081:126::-;35139:16;35174:25;:10;:16;35185:4;35174:16;;;;;;;;;;;;;;;:23;:25::i;:::-;35167:32;;35081:126;;;:::o;24022:87::-;24068:7;24095:6;;;;;;;;;;;24088:13;;24022:87;:::o;28274:32::-;;;;;;;;;;;;;:::o;29147:118::-;23908:13;:11;:13::i;:::-;29243:14:::1;29227:13;;:30;;;;;;;;;;;;;;;;;;29147:118:::0;:::o;31575:1330::-;27037:21;:19;:21::i;:::-;31695:13:::1;;;;;;;;;;;31694:14;31686:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;31831:40;31863:7;31831:10;:22;31842:10;31831:22;;;;;;;;;;;;;;;:31;;:40;;;;:::i;:::-;31823:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;31929:30;31962:6;31969:7;31962:15;;;;;;;;:::i;:::-;;;;;;;;;;;;31929:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;31997:11;:21;;;31996:22;31988:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32083:11;:19;;;32064:38;;:15;:38;;32056:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;32232:38;32262:7;32232:10;:22;32243:10;32232:22;;;;;;;;;;;;;;;:29;;:38;;;;:::i;:::-;;32281:14;32310:13;32306:167;;32348:24;32364:7;32348:15;:24::i;:::-;32339:33;;32405:21;:19;:21::i;:::-;32395:6;:31;;32387:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32306:167;32533:100;32563:12;32586:10;32626:6;32599:11;:24;;;:33;;;;;;:::i;:::-;32533:22;:100::i;:::-;32649:29;32658:11;32671:6;32649:29;;;;;;;:::i;:::-;;;;;;;;32715:4;32691:11;:21;;:28;;;;;;;;;::::0;::::1;32745:11;:24;;;32730:39;;:11;;:39;;;;;;;:::i;:::-;;;;;;;;32807:1;32780:11;:24;;:28;;;;;;;;;::::0;::::1;32837:11;32819:6;32826:7;32819:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32891:6;32859:16;:28;32876:10;32859:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;31673:1232;;27081:20:::0;:18;:20::i;:::-;31575:1330;;:::o;32913:1695::-;27037:21;:19;:21::i;:::-;33048:13:::1;;;;;;;;;;;33047:14;33039:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;33114:22;33147:20:::0;33192:9:::1;33188:1205;33211:8;:15;33207:1;:19;33188:1205;;;33247:17;33267:8;33276:1;33267:11;;;;;;;;:::i;:::-;;;;;;;;33247:31;;33377:42;33409:9;33377:10;:22;33388:10;33377:22;;;;;;;;;;;;;;;:31;;:42;;;;:::i;:::-;33369:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;33481:30;33514:6;33521:9;33514:17;;;;;;;;:::i;:::-;;;;;;;;;;;;33481:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;33555:11;:21;;;33554:22;33546:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33645:11;:19;;;33626:38;;:15;:38;;33618:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;33802:40;33832:9;33802:10;:22;33813:10;33802:22;;;;;;;;;;;;;;;:29;;:40;;;;:::i;:::-;;33857:14;33890:13;33886:95;;33939:26;33955:9;33939:15;:26::i;:::-;33923:42;;;;;:::i;:::-;;;33886:95;34013:11;:24;;;33995:42;;;;;;;:::i;:::-;;;34111:29;34120:11;34133:6;34111:29;;;;;;;:::i;:::-;;;;;;;;34181:4;34157:11;:21;;:28;;;;;;;;;::::0;::::1;34215:11;:24;;;34200:39;;:11;;:39;;;;;;;:::i;:::-;;;;;;;;34281:1;34254:11;:24;;:28;;;;;;;;;::::0;::::1;34317:11;34297:6;34304:9;34297:17;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34375:6;34343:16;:28;34360:10;34343:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;33232:1161;;;33228:3;;;;;;;33188:1205;;;;34437:21;:19;:21::i;:::-;34421:12;:37;;34413:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;34504:96;34534:12;34557:10;34587:12;34570:14;:29;;;;:::i;:::-;34504:22;:96::i;:::-;33026:1582;;27081:20:::0;:18;:20::i;:::-;32913:1695;;:::o;34632:441::-;34695:7;34714:30;34747:6;34754:7;34747:15;;;;;;;;:::i;:::-;;;;;;;;;;;;34714:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34773:23;34799:15;34773:41;;34847:11;:19;;;34828:38;;:15;:38;34825:106;;34900:11;:19;;;34882:37;;;;34825:106;35056:8;28177:5;34949:104;;35011:11;:24;;;34949:86;;34993:11;:15;;;34949:59;;34968:11;:21;;;34950:39;;:15;:39;;;;:::i;:::-;34949:59;;;;:::i;:::-;:86;;;;:::i;:::-;:104;;;;:::i;:::-;:115;;;;:::i;:::-;34941:124;;;;34632:441;;;:::o;28503:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29274:147::-;23908:13;:11;:13::i;:::-;29407:6:::1;29383:21;:30;;;;:::i;:::-;29365:48;;:15;;:48;;;;;;;;;;;;;;;;;;29274:147:::0;:::o;36282:394::-;36350:20;36382:28;36413:19;36427:4;36413:13;:19::i;:::-;36382:50;;36443:32;36496:11;:18;36478:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;36443:72;;36531:9;36526:114;36550:11;:18;36546:1;:22;36526:114;;;36606:6;36613:11;36625:1;36613:14;;;;;;;;:::i;:::-;;;;;;;;36606:22;;;;;;;;:::i;:::-;;;;;;;;;;;;36589:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;36601:1;36589:14;;;;;;;;:::i;:::-;;;;;;;:39;;;;36570:3;;;;;;;36526:114;;;;36657:11;36650:18;;;;36282:394;;;:::o;24955:220::-;23908:13;:11;:13::i;:::-;25060:1:::1;25040:22;;:8;:22;;::::0;25036:93:::1;;25114:1;25086:31;;;;;;;;;;;:::i;:::-;;;;;;;;25036:93;25139:28;25158:8;25139:18;:28::i;:::-;24955:220:::0;:::o;28607:52::-;;;;;;;;;;;;;;;;;:::o;28136:46::-;28177:5;28136:46;:::o;35215:682::-;35285:16;35313:28;35344:19;35358:4;35344:13;:19::i;:::-;35313:50;;35374:17;35409:9;35421:1;35409:13;;35404:173;35428:11;:18;35424:1;:22;35404:173;;;35504:15;35470:6;35477:11;35489:1;35477:14;;;;;;;;:::i;:::-;;;;;;;;35470:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:49;;;35467:99;;35539:11;;;;;:::i;:::-;;;;35467:99;35448:3;;;;;;;35404:173;;;;35589:31;35637:9;35623:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35589:58;;35665:9;35660:196;35684:11;:18;35680:1;:22;35660:196;;;35760:15;35726:6;35733:11;35745:1;35733:14;;;;;;;;:::i;:::-;;;;;;;;35726:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:49;;;35723:122;;35815:11;35827:1;35815:14;;;;;;;;:::i;:::-;;;;;;;;35795;35810:1;35795:17;;;;;;;;:::i;:::-;;;;;;;:34;;;;;35723:122;35704:3;;;;;;;35660:196;;;;35875:14;35868:21;;;;;35215:682;;;:::o;24187:166::-;24258:12;:10;:12::i;:::-;24247:23;;:7;:5;:7::i;:::-;:23;;;24243:103;;24321:12;:10;:12::i;:::-;24294:40;;;;;;;;;;;:::i;:::-;;;;;;;;24243:103;24187:166::o;21683:177::-;21766:86;21786:5;21816:23;;;21841:2;21845:5;21793:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21766:19;:86::i;:::-;21683:177;;;:::o;27117:315::-;26415:1;27246:7;;:18;27242:88;;27288:30;;;;;;;;;;;;;;27242:88;26415:1;27407:7;:17;;;;27117:315::o;21868:205::-;21969:96;21989:5;22019:27;;;22048:4;22054:2;22058:5;21996:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21969:19;:96::i;:::-;21868:205;;;;:::o;13289:131::-;13356:4;13380:32;13385:3;:10;;13405:5;13397:14;;13380:4;:32::i;:::-;13373:39;;13289:131;;;;:::o;27440:212::-;26372:1;27623:7;:21;;;;27440:212::o;25335:191::-;25409:16;25428:6;;;;;;;;;;;25409:25;;25454:8;25445:6;;:17;;;;;;;;;;;;;;;;;;25509:8;25478:40;;25499:8;25478:40;;;;;;;;;;;;25398:128;25335:191;:::o;15206:307::-;15266:16;15295:22;15320:19;15328:3;:10;;15320:7;:19::i;:::-;15295:44;;15350:23;15464:5;15454:15;;15499:6;15492:13;;;;15206:307;;;:::o;13819:146::-;13896:4;13920:37;13930:3;:10;;13950:5;13942:14;;13920:9;:37::i;:::-;13913:44;;13819:146;;;;:::o;13596:137::-;13666:4;13690:35;13698:3;:10;;13718:5;13710:14;;13690:7;:35::i;:::-;13683:42;;13596:137;;;;:::o;95:98::-;148:7;175:10;168:17;;95:98;:::o;22081:333::-;22162:23;22188:69;22216:4;22188:69;;;;;;;;;;;;;;;;;22196:5;22188:27;;;;:69;;;;;:::i;:::-;22162:95;;22292:1;22272:10;:17;:21;22268:139;;;22329:10;22318:30;;;;;;;;;;;;:::i;:::-;22310:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;22268:139;22151:263;22081:333;;:::o;4474:416::-;4537:4;4559:21;4569:3;4574:5;4559:9;:21::i;:::-;4554:329;;4597:3;:11;;4614:5;4597:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4782:3;:11;;:18;;;;4758:3;:14;;:21;4773:5;4758:21;;;;;;;;;;;:42;;;;4822:4;4815:11;;;;4554:329;4866:5;4859:12;;4474:416;;;;;:::o;7902:111::-;7958:16;7994:3;:11;;7987:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7902:111;;;:::o;6552:131::-;6625:4;6674:1;6649:3;:14;;:21;6664:5;6649:21;;;;;;;;;;;;:26;;6642:33;;6552:131;;;;:::o;5066:1400::-;5132:4;5244:16;5263:3;:14;;:21;5278:5;5263:21;;;;;;;;;;;;5244:40;;5313:1;5301:8;:13;5297:1162;;5674:18;5706:1;5695:8;:12;;;;:::i;:::-;5674:33;;5722:17;5763:1;5742:3;:11;;:18;;;;:22;;;;:::i;:::-;5722:42;;5799:9;5785:10;:23;5781:385;;5829:17;5849:3;:11;;5861:9;5849:22;;;;;;;;:::i;:::-;;;;;;;;;;5829:42;;5999:9;5973:3;:11;;5985:10;5973:23;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;6142:8;6114:3;:14;;:25;6129:9;6114:25;;;;;;;;;;;:36;;;;5810:356;5781:385;6247:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6353:3;:14;;:21;6368:5;6353:21;;;;;;;;;;;6346:28;;;6398:4;6391:11;;;;;;;5297:1162;6442:5;6435:12;;;5066:1400;;;;;:::o;16186:229::-;16323:12;16355:52;16377:6;16385:4;16391:1;16394:12;16355:21;:52::i;:::-;16348:59;;16186:229;;;;;:::o;17306:455::-;17476:12;17534:5;17509:21;:30;;17501:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;17594:12;17608:23;17635:6;:11;;17654:5;17661:4;17635:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17593:73;;;;17684:69;17711:6;17719:7;17728:10;17740:12;17684:26;:69::i;:::-;17677:76;;;;17306:455;;;;;;:::o;19879:644::-;20064:12;20093:7;20089:427;;;20142:1;20121:10;:17;:22;20117:290;;20339:18;20350:6;20339:10;:18::i;:::-;20331:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;20117:290;20428:10;20421:17;;;;20089:427;20471:33;20479:10;20491:12;20471:7;:33::i;:::-;19879:644;;;;;;;:::o;15543:115::-;15603:4;15649:1;15627:7;:19;;;:23;15620:30;;15543:115;;;:::o;21065:552::-;21246:1;21226:10;:17;:21;21222:388;;;21458:10;21452:17;21515:15;21502:10;21498:2;21494:19;21487:44;21222:388;21585:12;21578:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:96::-;1194:7;1223:24;1241:5;1223:24;:::i;:::-;1212:35;;1157:96;;;:::o;1259:122::-;1332:24;1350:5;1332:24;:::i;:::-;1325:5;1322:35;1312:63;;1371:1;1368;1361:12;1312:63;1259:122;:::o;1387:139::-;1433:5;1471:6;1458:20;1449:29;;1487:33;1514:5;1487:33;:::i;:::-;1387:139;;;;:::o;1532:329::-;1591:6;1640:2;1628:9;1619:7;1615:23;1611:32;1608:119;;;1646:79;;:::i;:::-;1608:119;1766:1;1791:53;1836:7;1827:6;1816:9;1812:22;1791:53;:::i;:::-;1781:63;;1737:117;1532:329;;;;:::o;1867:118::-;1954:24;1972:5;1954:24;:::i;:::-;1949:3;1942:37;1867:118;;:::o;1991:222::-;2084:4;2122:2;2111:9;2107:18;2099:26;;2135:71;2203:1;2192:9;2188:17;2179:6;2135:71;:::i;:::-;1991:222;;;;:::o;2219:118::-;2256:7;2296:34;2289:5;2285:46;2274:57;;2219:118;;;:::o;2343:122::-;2416:24;2434:5;2416:24;:::i;:::-;2409:5;2406:35;2396:63;;2455:1;2452;2445:12;2396:63;2343:122;:::o;2471:139::-;2517:5;2555:6;2542:20;2533:29;;2571:33;2598:5;2571:33;:::i;:::-;2471:139;;;;:::o;2616:329::-;2675:6;2724:2;2712:9;2703:7;2699:23;2695:32;2692:119;;;2730:79;;:::i;:::-;2692:119;2850:1;2875:53;2920:7;2911:6;2900:9;2896:22;2875:53;:::i;:::-;2865:63;;2821:117;2616:329;;;;:::o;2951:93::-;2987:7;3027:10;3020:5;3016:22;3005:33;;2951:93;;;:::o;3050:120::-;3122:23;3139:5;3122:23;:::i;:::-;3115:5;3112:34;3102:62;;3160:1;3157;3150:12;3102:62;3050:120;:::o;3176:137::-;3221:5;3259:6;3246:20;3237:29;;3275:32;3301:5;3275:32;:::i;:::-;3176:137;;;;:::o;3319:327::-;3377:6;3426:2;3414:9;3405:7;3401:23;3397:32;3394:119;;;3432:79;;:::i;:::-;3394:119;3552:1;3577:52;3621:7;3612:6;3601:9;3597:22;3577:52;:::i;:::-;3567:62;;3523:116;3319:327;;;;:::o;3652:115::-;3737:23;3754:5;3737:23;:::i;:::-;3732:3;3725:36;3652:115;;:::o;3773:218::-;3864:4;3902:2;3891:9;3887:18;3879:26;;3915:69;3981:1;3970:9;3966:17;3957:6;3915:69;:::i;:::-;3773:218;;;;:::o;3997:474::-;4065:6;4073;4122:2;4110:9;4101:7;4097:23;4093:32;4090:119;;;4128:79;;:::i;:::-;4090:119;4248:1;4273:53;4318:7;4309:6;4298:9;4294:22;4273:53;:::i;:::-;4263:63;;4219:117;4375:2;4401:53;4446:7;4437:6;4426:9;4422:22;4401:53;:::i;:::-;4391:63;;4346:118;3997:474;;;;;:::o;4477:118::-;4564:24;4582:5;4564:24;:::i;:::-;4559:3;4552:37;4477:118;;:::o;4601:222::-;4694:4;4732:2;4721:9;4717:18;4709:26;;4745:71;4813:1;4802:9;4798:17;4789:6;4745:71;:::i;:::-;4601:222;;;;:::o;4829:101::-;4865:7;4905:18;4898:5;4894:30;4883:41;;4829:101;;;:::o;4936:115::-;5021:23;5038:5;5021:23;:::i;:::-;5016:3;5009:36;4936:115;;:::o;5057:218::-;5148:4;5186:2;5175:9;5171:18;5163:26;;5199:69;5265:1;5254:9;5250:17;5241:6;5199:69;:::i;:::-;5057:218;;;;:::o;5281:114::-;5348:6;5382:5;5376:12;5366:22;;5281:114;;;:::o;5401:184::-;5500:11;5534:6;5529:3;5522:19;5574:4;5569:3;5565:14;5550:29;;5401:184;;;;:::o;5591:132::-;5658:4;5681:3;5673:11;;5711:4;5706:3;5702:14;5694:22;;5591:132;;;:::o;5729:108::-;5806:24;5824:5;5806:24;:::i;:::-;5801:3;5794:37;5729:108;;:::o;5843:179::-;5912:10;5933:46;5975:3;5967:6;5933:46;:::i;:::-;6011:4;6006:3;6002:14;5988:28;;5843:179;;;;:::o;6028:113::-;6098:4;6130;6125:3;6121:14;6113:22;;6028:113;;;:::o;6177:732::-;6296:3;6325:54;6373:5;6325:54;:::i;:::-;6395:86;6474:6;6469:3;6395:86;:::i;:::-;6388:93;;6505:56;6555:5;6505:56;:::i;:::-;6584:7;6615:1;6600:284;6625:6;6622:1;6619:13;6600:284;;;6701:6;6695:13;6728:63;6787:3;6772:13;6728:63;:::i;:::-;6721:70;;6814:60;6867:6;6814:60;:::i;:::-;6804:70;;6660:224;6647:1;6644;6640:9;6635:14;;6600:284;;;6604:14;6900:3;6893:10;;6301:608;;;6177:732;;;;:::o;6915:373::-;7058:4;7096:2;7085:9;7081:18;7073:26;;7145:9;7139:4;7135:20;7131:1;7120:9;7116:17;7109:47;7173:108;7276:4;7267:6;7173:108;:::i;:::-;7165:116;;6915:373;;;;:::o;7294:90::-;7328:7;7371:5;7364:13;7357:21;7346:32;;7294:90;;;:::o;7390:109::-;7471:21;7486:5;7471:21;:::i;:::-;7466:3;7459:34;7390:109;;:::o;7505:210::-;7592:4;7630:2;7619:9;7615:18;7607:26;;7643:65;7705:1;7694:9;7690:17;7681:6;7643:65;:::i;:::-;7505:210;;;;:::o;7721:116::-;7791:21;7806:5;7791:21;:::i;:::-;7784:5;7781:32;7771:60;;7827:1;7824;7817:12;7771:60;7721:116;:::o;7843:133::-;7886:5;7924:6;7911:20;7902:29;;7940:30;7964:5;7940:30;:::i;:::-;7843:133;;;;:::o;7982:323::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:50;8280:7;8271:6;8260:9;8256:22;8238:50;:::i;:::-;8228:60;;8184:114;7982:323;;;;:::o;8311:468::-;8376:6;8384;8433:2;8421:9;8412:7;8408:23;8404:32;8401:119;;;8439:79;;:::i;:::-;8401:119;8559:1;8584:53;8629:7;8620:6;8609:9;8605:22;8584:53;:::i;:::-;8574:63;;8530:117;8686:2;8712:50;8754:7;8745:6;8734:9;8730:22;8712:50;:::i;:::-;8702:60;;8657:115;8311:468;;;;;:::o;8785:117::-;8894:1;8891;8884:12;8908:102;8949:6;9000:2;8996:7;8991:2;8984:5;8980:14;8976:28;8966:38;;8908:102;;;:::o;9016:180::-;9064:77;9061:1;9054:88;9161:4;9158:1;9151:15;9185:4;9182:1;9175:15;9202:281;9285:27;9307:4;9285:27;:::i;:::-;9277:6;9273:40;9415:6;9403:10;9400:22;9379:18;9367:10;9364:34;9361:62;9358:88;;;9426:18;;:::i;:::-;9358:88;9466:10;9462:2;9455:22;9245:238;9202:281;;:::o;9489:129::-;9523:6;9550:20;;:::i;:::-;9540:30;;9579:33;9607:4;9599:6;9579:33;:::i;:::-;9489:129;;;:::o;9624:311::-;9701:4;9791:18;9783:6;9780:30;9777:56;;;9813:18;;:::i;:::-;9777:56;9863:4;9855:6;9851:17;9843:25;;9923:4;9917;9913:15;9905:23;;9624:311;;;:::o;9941:117::-;10050:1;10047;10040:12;10081:710;10177:5;10202:81;10218:64;10275:6;10218:64;:::i;:::-;10202:81;:::i;:::-;10193:90;;10303:5;10332:6;10325:5;10318:21;10366:4;10359:5;10355:16;10348:23;;10419:4;10411:6;10407:17;10399:6;10395:30;10448:3;10440:6;10437:15;10434:122;;;10467:79;;:::i;:::-;10434:122;10582:6;10565:220;10599:6;10594:3;10591:15;10565:220;;;10674:3;10703:37;10736:3;10724:10;10703:37;:::i;:::-;10698:3;10691:50;10770:4;10765:3;10761:14;10754:21;;10641:144;10625:4;10620:3;10616:14;10609:21;;10565:220;;;10569:21;10183:608;;10081:710;;;;;:::o;10814:370::-;10885:5;10934:3;10927:4;10919:6;10915:17;10911:27;10901:122;;10942:79;;:::i;:::-;10901:122;11059:6;11046:20;11084:94;11174:3;11166:6;11159:4;11151:6;11147:17;11084:94;:::i;:::-;11075:103;;10891:293;10814:370;;;;:::o;11190:678::-;11280:6;11288;11337:2;11325:9;11316:7;11312:23;11308:32;11305:119;;;11343:79;;:::i;:::-;11305:119;11491:1;11480:9;11476:17;11463:31;11521:18;11513:6;11510:30;11507:117;;;11543:79;;:::i;:::-;11507:117;11648:78;11718:7;11709:6;11698:9;11694:22;11648:78;:::i;:::-;11638:88;;11434:302;11775:2;11801:50;11843:7;11834:6;11823:9;11819:22;11801:50;:::i;:::-;11791:60;;11746:115;11190:678;;;;;:::o;11874:118::-;11961:24;11979:5;11961:24;:::i;:::-;11956:3;11949:37;11874:118;;:::o;11998:751::-;12219:4;12257:3;12246:9;12242:19;12234:27;;12271:71;12339:1;12328:9;12324:17;12315:6;12271:71;:::i;:::-;12352:72;12420:2;12409:9;12405:18;12396:6;12352:72;:::i;:::-;12434:70;12500:2;12489:9;12485:18;12476:6;12434:70;:::i;:::-;12514;12580:2;12569:9;12565:18;12556:6;12514:70;:::i;:::-;12594:71;12660:3;12649:9;12645:19;12636:6;12594:71;:::i;:::-;12675:67;12737:3;12726:9;12722:19;12713:6;12675:67;:::i;:::-;11998:751;;;;;;;;;:::o;12755:143::-;12851:6;12885:5;12879:12;12869:22;;12755:143;;;:::o;12904:213::-;13032:11;13066:6;13061:3;13054:19;13106:4;13101:3;13097:14;13082:29;;12904:213;;;;:::o;13123:161::-;13219:4;13242:3;13234:11;;13272:4;13267:3;13263:14;13255:22;;13123:161;;;:::o;13290:108::-;13367:24;13385:5;13367:24;:::i;:::-;13362:3;13355:37;13290:108;;:::o;13404:::-;13481:24;13499:5;13481:24;:::i;:::-;13476:3;13469:37;13404:108;;:::o;13518:105::-;13593:23;13610:5;13593:23;:::i;:::-;13588:3;13581:36;13518:105;;:::o;13629:::-;13704:23;13721:5;13704:23;:::i;:::-;13699:3;13692:36;13629:105;;:::o;13740:99::-;13811:21;13826:5;13811:21;:::i;:::-;13806:3;13799:34;13740:99;;:::o;13921:1210::-;14066:4;14061:3;14057:14;14154:4;14147:5;14143:16;14137:23;14173:63;14230:4;14225:3;14221:14;14207:12;14173:63;:::i;:::-;14081:165;14336:4;14329:5;14325:16;14319:23;14355:63;14412:4;14407:3;14403:14;14389:12;14355:63;:::i;:::-;14256:172;14515:4;14508:5;14504:16;14498:23;14534:61;14589:4;14584:3;14580:14;14566:12;14534:61;:::i;:::-;14438:167;14690:4;14683:5;14679:16;14673:23;14709:61;14764:4;14759:3;14755:14;14741:12;14709:61;:::i;:::-;14615:165;14861:4;14854:5;14850:16;14844:23;14880:61;14935:4;14930:3;14926:14;14912:12;14880:61;:::i;:::-;14790:161;15038:4;15031:5;15027:16;15021:23;15057:57;15108:4;15103:3;15099:14;15085:12;15057:57;:::i;:::-;14961:163;14035:1096;13921:1210;;:::o;15137:295::-;15264:10;15285:104;15385:3;15377:6;15285:104;:::i;:::-;15421:4;15416:3;15412:14;15398:28;;15137:295;;;;:::o;15438:142::-;15537:4;15569;15564:3;15560:14;15552:22;;15438:142;;;:::o;15666:964::-;15843:3;15872:83;15949:5;15872:83;:::i;:::-;15971:115;16079:6;16074:3;15971:115;:::i;:::-;15964:122;;16110:85;16189:5;16110:85;:::i;:::-;16218:7;16249:1;16234:371;16259:6;16256:1;16253:13;16234:371;;;16335:6;16329:13;16362:121;16479:3;16464:13;16362:121;:::i;:::-;16355:128;;16506:89;16588:6;16506:89;:::i;:::-;16496:99;;16294:311;16281:1;16278;16274:9;16269:14;;16234:371;;;16238:14;16621:3;16614:10;;15848:782;;;15666:964;;;;:::o;16636:489::-;16837:4;16875:2;16864:9;16860:18;16852:26;;16924:9;16918:4;16914:20;16910:1;16899:9;16895:17;16888:47;16952:166;17113:4;17104:6;16952:166;:::i;:::-;16944:174;;16636:489;;;;:::o;17131:169::-;17215:11;17249:6;17244:3;17237:19;17289:4;17284:3;17280:14;17265:29;;17131:169;;;;:::o;17306:179::-;17446:31;17442:1;17434:6;17430:14;17423:55;17306:179;:::o;17491:366::-;17633:3;17654:67;17718:2;17713:3;17654:67;:::i;:::-;17647:74;;17730:93;17819:3;17730:93;:::i;:::-;17848:2;17843:3;17839:12;17832:19;;17491:366;;;:::o;17863:419::-;18029:4;18067:2;18056:9;18052:18;18044:26;;18116:9;18110:4;18106:20;18102:1;18091:9;18087:17;18080:47;18144:131;18270:4;18144:131;:::i;:::-;18136:139;;17863:419;;;:::o;18288:180::-;18336:77;18333:1;18326:88;18433:4;18430:1;18423:15;18457:4;18454:1;18447:15;18474:180;18522:77;18519:1;18512:88;18619:4;18616:1;18609:15;18643:4;18640:1;18633:15;18660:191;18700:3;18719:20;18737:1;18719:20;:::i;:::-;18714:25;;18753:20;18771:1;18753:20;:::i;:::-;18748:25;;18796:1;18793;18789:9;18782:16;;18817:3;18814:1;18811:10;18808:36;;;18824:18;;:::i;:::-;18808:36;18660:191;;;;:::o;18857:177::-;18997:29;18993:1;18985:6;18981:14;18974:53;18857:177;:::o;19040:366::-;19182:3;19203:67;19267:2;19262:3;19203:67;:::i;:::-;19196:74;;19279:93;19368:3;19279:93;:::i;:::-;19397:2;19392:3;19388:12;19381:19;;19040:366;;;:::o;19412:419::-;19578:4;19616:2;19605:9;19601:18;19593:26;;19665:9;19659:4;19655:20;19651:1;19640:9;19636:17;19629:47;19693:131;19819:4;19693:131;:::i;:::-;19685:139;;19412:419;;;:::o;19837:143::-;19894:5;19925:6;19919:13;19910:22;;19941:33;19968:5;19941:33;:::i;:::-;19837:143;;;;:::o;19986:351::-;20056:6;20105:2;20093:9;20084:7;20080:23;20076:32;20073:119;;;20111:79;;:::i;:::-;20073:119;20231:1;20256:64;20312:7;20303:6;20292:9;20288:22;20256:64;:::i;:::-;20246:74;;20202:128;19986:351;;;;:::o;20343:194::-;20383:4;20403:20;20421:1;20403:20;:::i;:::-;20398:25;;20437:20;20455:1;20437:20;:::i;:::-;20432:25;;20481:1;20478;20474:9;20466:17;;20505:1;20499:4;20496:11;20493:37;;;20510:18;;:::i;:::-;20493:37;20343:194;;;;:::o;20543:205::-;20582:3;20601:19;20618:1;20601:19;:::i;:::-;20596:24;;20634:19;20651:1;20634:19;:::i;:::-;20629:24;;20676:1;20673;20669:9;20662:16;;20699:18;20694:3;20691:27;20688:53;;;20721:18;;:::i;:::-;20688:53;20543:205;;;;:::o;20830:1220::-;20985:4;20980:3;20976:14;21073:4;21066:5;21062:16;21056:23;21092:63;21149:4;21144:3;21140:14;21126:12;21092:63;:::i;:::-;21000:165;21255:4;21248:5;21244:16;21238:23;21274:63;21331:4;21326:3;21322:14;21308:12;21274:63;:::i;:::-;21175:172;21434:4;21427:5;21423:16;21417:23;21453:61;21508:4;21503:3;21499:14;21485:12;21453:61;:::i;:::-;21357:167;21609:4;21602:5;21598:16;21592:23;21628:61;21683:4;21678:3;21674:14;21660:12;21628:61;:::i;:::-;21534:165;21780:4;21773:5;21769:16;21763:23;21799:61;21854:4;21849:3;21845:14;21831:12;21799:61;:::i;:::-;21709:161;21957:4;21950:5;21946:16;21940:23;21976:57;22027:4;22022:3;22018:14;22004:12;21976:57;:::i;:::-;21880:163;20954:1096;20830:1220;;:::o;22056:339::-;22207:4;22245:3;22234:9;22230:19;22222:27;;22259:129;22385:1;22374:9;22370:17;22361:6;22259:129;:::i;:::-;22056:339;;;;:::o;22401:229::-;22541:34;22537:1;22529:6;22525:14;22518:58;22610:12;22605:2;22597:6;22593:15;22586:37;22401:229;:::o;22636:366::-;22778:3;22799:67;22863:2;22858:3;22799:67;:::i;:::-;22792:74;;22875:93;22964:3;22875:93;:::i;:::-;22993:2;22988:3;22984:12;22977:19;;22636:366;;;:::o;23008:419::-;23174:4;23212:2;23201:9;23197:18;23189:26;;23261:9;23255:4;23251:20;23247:1;23236:9;23232:17;23225:47;23289:131;23415:4;23289:131;:::i;:::-;23281:139;;23008:419;;;:::o;23433:172::-;23573:24;23569:1;23561:6;23557:14;23550:48;23433:172;:::o;23611:366::-;23753:3;23774:67;23838:2;23833:3;23774:67;:::i;:::-;23767:74;;23850:93;23939:3;23850:93;:::i;:::-;23968:2;23963:3;23959:12;23952:19;;23611:366;;;:::o;23983:419::-;24149:4;24187:2;24176:9;24172:18;24164:26;;24236:9;24230:4;24226:20;24222:1;24211:9;24207:17;24200:47;24264:131;24390:4;24264:131;:::i;:::-;24256:139;;23983:419;;;:::o;24408:171::-;24548:23;24544:1;24536:6;24532:14;24525:47;24408:171;:::o;24585:366::-;24727:3;24748:67;24812:2;24807:3;24748:67;:::i;:::-;24741:74;;24824:93;24913:3;24824:93;:::i;:::-;24942:2;24937:3;24933:12;24926:19;;24585:366;;;:::o;24957:419::-;25123:4;25161:2;25150:9;25146:18;25138:26;;25210:9;25204:4;25200:20;25196:1;25185:9;25181:17;25174:47;25238:131;25364:4;25238:131;:::i;:::-;25230:139;;24957:419;;;:::o;25382:180::-;25522:32;25518:1;25510:6;25506:14;25499:56;25382:180;:::o;25568:366::-;25710:3;25731:67;25795:2;25790:3;25731:67;:::i;:::-;25724:74;;25807:93;25896:3;25807:93;:::i;:::-;25925:2;25920:3;25916:12;25909:19;;25568:366;;;:::o;25940:419::-;26106:4;26144:2;26133:9;26129:18;26121:26;;26193:9;26187:4;26183:20;26179:1;26168:9;26164:17;26157:47;26221:131;26347:4;26221:131;:::i;:::-;26213:139;;25940:419;;;:::o;26365:450::-;26544:4;26582:3;26571:9;26567:19;26559:27;;26596:129;26722:1;26711:9;26707:17;26698:6;26596:129;:::i;:::-;26735:73;26803:3;26792:9;26788:19;26779:6;26735:73;:::i;:::-;26365:450;;;;;:::o;26821:410::-;26861:7;26884:20;26902:1;26884:20;:::i;:::-;26879:25;;26918:20;26936:1;26918:20;:::i;:::-;26913:25;;26973:1;26970;26966:9;26995:30;27013:11;26995:30;:::i;:::-;26984:41;;27174:1;27165:7;27161:15;27158:1;27155:22;27135:1;27128:9;27108:83;27085:139;;27204:18;;:::i;:::-;27085:139;26869:362;26821:410;;;;:::o;27237:180::-;27285:77;27282:1;27275:88;27382:4;27379:1;27372:15;27406:4;27403:1;27396:15;27423:185;27463:1;27480:20;27498:1;27480:20;:::i;:::-;27475:25;;27514:20;27532:1;27514:20;:::i;:::-;27509:25;;27553:1;27543:35;;27558:18;;:::i;:::-;27543:35;27600:1;27597;27593:9;27588:14;;27423:185;;;;:::o;27614:275::-;27653:7;27676:19;27693:1;27676:19;:::i;:::-;27671:24;;27709:19;27726:1;27709:19;:::i;:::-;27704:24;;27763:1;27760;27756:9;27785:29;27802:11;27785:29;:::i;:::-;27774:40;;27846:11;27837:7;27834:24;27824:58;;27862:18;;:::i;:::-;27824:58;27661:228;27614:275;;;;:::o;27895:233::-;27934:3;27957:24;27975:5;27957:24;:::i;:::-;27948:33;;28003:66;27996:5;27993:77;27990:103;;28073:18;;:::i;:::-;27990:103;28120:1;28113:5;28109:13;28102:20;;27895:233;;;:::o;28134:332::-;28255:4;28293:2;28282:9;28278:18;28270:26;;28306:71;28374:1;28363:9;28359:17;28350:6;28306:71;:::i;:::-;28387:72;28455:2;28444:9;28440:18;28431:6;28387:72;:::i;:::-;28134:332;;;;;:::o;28472:442::-;28621:4;28659:2;28648:9;28644:18;28636:26;;28672:71;28740:1;28729:9;28725:17;28716:6;28672:71;:::i;:::-;28753:72;28821:2;28810:9;28806:18;28797:6;28753:72;:::i;:::-;28835;28903:2;28892:9;28888:18;28879:6;28835:72;:::i;:::-;28472:442;;;;;;:::o;28920:137::-;28974:5;29005:6;28999:13;28990:22;;29021:30;29045:5;29021:30;:::i;:::-;28920:137;;;;:::o;29063:345::-;29130:6;29179:2;29167:9;29158:7;29154:23;29150:32;29147:119;;;29185:79;;:::i;:::-;29147:119;29305:1;29330:61;29383:7;29374:6;29363:9;29359:22;29330:61;:::i;:::-;29320:71;;29276:125;29063:345;;;;:::o;29414:229::-;29554:34;29550:1;29542:6;29538:14;29531:58;29623:12;29618:2;29610:6;29606:15;29599:37;29414:229;:::o;29649:366::-;29791:3;29812:67;29876:2;29871:3;29812:67;:::i;:::-;29805:74;;29888:93;29977:3;29888:93;:::i;:::-;30006:2;30001:3;29997:12;29990:19;;29649:366;;;:::o;30021:419::-;30187:4;30225:2;30214:9;30210:18;30202:26;;30274:9;30268:4;30264:20;30260:1;30249:9;30245:17;30238:47;30302:131;30428:4;30302:131;:::i;:::-;30294:139;;30021:419;;;:::o;30446:180::-;30494:77;30491:1;30484:88;30591:4;30588:1;30581:15;30615:4;30612:1;30605:15;30632:225;30772:34;30768:1;30760:6;30756:14;30749:58;30841:8;30836:2;30828:6;30824:15;30817:33;30632:225;:::o;30863:366::-;31005:3;31026:67;31090:2;31085:3;31026:67;:::i;:::-;31019:74;;31102:93;31191:3;31102:93;:::i;:::-;31220:2;31215:3;31211:12;31204:19;;30863:366;;;:::o;31235:419::-;31401:4;31439:2;31428:9;31424:18;31416:26;;31488:9;31482:4;31478:20;31474:1;31463:9;31459:17;31452:47;31516:131;31642:4;31516:131;:::i;:::-;31508:139;;31235:419;;;:::o;31660:98::-;31711:6;31745:5;31739:12;31729:22;;31660:98;;;:::o;31764:147::-;31865:11;31902:3;31887:18;;31764:147;;;;:::o;31917:139::-;32006:6;32001:3;31996;31990:23;32047:1;32038:6;32033:3;32029:16;32022:27;31917:139;;;:::o;32062:386::-;32166:3;32194:38;32226:5;32194:38;:::i;:::-;32248:88;32329:6;32324:3;32248:88;:::i;:::-;32241:95;;32345:65;32403:6;32398:3;32391:4;32384:5;32380:16;32345:65;:::i;:::-;32435:6;32430:3;32426:16;32419:23;;32170:278;32062:386;;;;:::o;32454:271::-;32584:3;32606:93;32695:3;32686:6;32606:93;:::i;:::-;32599:100;;32716:3;32709:10;;32454:271;;;;:::o;32731:179::-;32871:31;32867:1;32859:6;32855:14;32848:55;32731:179;:::o;32916:366::-;33058:3;33079:67;33143:2;33138:3;33079:67;:::i;:::-;33072:74;;33155:93;33244:3;33155:93;:::i;:::-;33273:2;33268:3;33264:12;33257:19;;32916:366;;;:::o;33288:419::-;33454:4;33492:2;33481:9;33477:18;33469:26;;33541:9;33535:4;33531:20;33527:1;33516:9;33512:17;33505:47;33569:131;33695:4;33569:131;:::i;:::-;33561:139;;33288:419;;;:::o;33713:99::-;33765:6;33799:5;33793:12;33783:22;;33713:99;;;:::o;33818:377::-;33906:3;33934:39;33967:5;33934:39;:::i;:::-;33989:71;34053:6;34048:3;33989:71;:::i;:::-;33982:78;;34069:65;34127:6;34122:3;34115:4;34108:5;34104:16;34069:65;:::i;:::-;34159:29;34181:6;34159:29;:::i;:::-;34154:3;34150:39;34143:46;;33910:285;33818:377;;;;:::o;34201:313::-;34314:4;34352:2;34341:9;34337:18;34329:26;;34401:9;34395:4;34391:20;34387:1;34376:9;34372:17;34365:47;34429:78;34502:4;34493:6;34429:78;:::i;:::-;34421:86;;34201:313;;;;:::o
Swarm Source
ipfs://dd8cb7ced9a1b4898cb438fd7467e89925efe030b33fea55ed2ac2a80be47693
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000657 | 460,264.9094 | $302.27 |
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.