More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Increment Lock | 16326681 | 542 days ago | IN | 0 ETH | 0.00152342 | ||||
Lock Tokens | 16326408 | 542 days ago | IN | 0.1 ETH | 0.00672652 | ||||
Lock Tokens | 16326394 | 542 days ago | IN | 0.1 ETH | 0.006087 | ||||
Set Fee | 16326392 | 542 days ago | IN | 0 ETH | 0.00036647 | ||||
0x60806040 | 16326297 | 542 days ago | IN | Create: UniswapV2Locker | 0 ETH | 0.05984857 |
Loading...
Loading
Contract Name:
UniswapV2Locker
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-05 */ // File: contracts/utils/TransferHelper.sol pragma solidity ^0.8.0; /** helper methods for interacting with ERC20 tokens that do not consistently return true/false with the addition of a transfer function to send eth or an erc20 token */ library TransferHelper { function safeApprove(address token, address to, uint value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } // sends ETH or an erc20 token function safeTransferBaseToken(address token, address payable to, uint value, bool isERC20) internal { if (!isERC20) { to.transfer(value); } else { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } } } // File: contracts/interfaces/IUniswapV2Factory.sol pragma solidity ^0.8.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts/interfaces/IUniswapV2Pair.sol pragma solidity ^0.8.0; interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/interfaces/ISignataRight.sol pragma solidity ^0.8.0; interface ISignataRight { function holdsTokenOfSchema(address holder, uint256 schemaId) external view returns (bool); } // File: contracts/@openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/@openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts/@openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/@openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/@openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ 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 of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @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._indexes[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 read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 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 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[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._indexes[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) { return _values(set._inner); } // 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 on 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; } } // File: contracts/UniswapV2Locker.sol pragma solidity ^0.8.0; contract UniswapV2Locker is Ownable, ReentrancyGuard { using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; IUniswapV2Factory public uniswapFactory; struct UserInfo { EnumerableSet.AddressSet lockedTokens; // records all tokens the user has locked mapping(address => uint256[]) locksForToken; // map erc20 address to lock id for that token } struct Lock { uint256 lockDate; // the date the token was locked uint256 amount; // the amount of tokens still locked (initialAmount minus withdrawls) uint256 initialAmount; // the initial lock amount uint256 unlockDate; // the date the token can be withdrawn uint256 lockID; // lockID nonce per uni pair address owner; uint256 schemaId; } mapping(address => UserInfo) private users; EnumerableSet.AddressSet private lockedTokens; mapping(address => Lock[]) public locks; // map univ2 pair to all its locks uint256 public nativeFee; // eth fee for creating a lock address payable feeAddress; // Signata Integration ISignataRight public signataRight; event Deposited( address lpToken, address user, uint256 amount, uint256 lockDate, uint256 unlockDate, uint256 schemaId ); event Withdrawn(address lpToken, uint256 amount); event SignataRightUpdated(address newSignataRight); event LockTransferred(address previousOwner, address newOwner); event Relocked(uint256 lockId, uint256 unlockDate); event LockSplit(uint256 lockId, uint256 amount); constructor(IUniswapV2Factory _uniswapFactory, ISignataRight _signataRight) { feeAddress = payable(msg.sender); nativeFee = 1e18; uniswapFactory = _uniswapFactory; signataRight = _signataRight; } function setFeeAddress(address payable _feeAddress) public onlyOwner { feeAddress = _feeAddress; } function setFee(uint256 _nativeFee) public onlyOwner { nativeFee = _nativeFee; } /** * @notice Creates a new lock * @param _lpToken the univ2 token address * @param _amount amount of LP tokens to lock * @param _unlock_date the unix timestamp (in seconds) until unlock * @param _withdrawer the user who can withdraw liquidity once the lock expires. */ function lockTokens( address _lpToken, uint256 _amount, uint256 _unlock_date, address payable _withdrawer, uint256 _schemaId ) external payable nonReentrant { require(_unlock_date < 10000000000, "lockTokens::Invalid timestamp"); // prevents errors when timestamp entered in milliseconds require(_amount > 0, "lockTokens::Amount needs to be greater than 0"); // ensure this pair is a univ2 pair by querying the factory IUniswapV2Pair lpair = IUniswapV2Pair(address(_lpToken)); address factoryPairAddress = uniswapFactory.getPair( lpair.token0(), lpair.token1() ); require(factoryPairAddress == address(_lpToken), "lockTokens::Invalid LP pair"); // check holding NFT of schema if (_schemaId > 0) { require( signataRight.holdsTokenOfSchema(msg.sender, _schemaId), "lockTokens::Sender does not hold NFT of schema" ); } TransferHelper.safeTransferFrom( _lpToken, address(msg.sender), address(this), _amount ); require(msg.value == nativeFee, "lockTokens::Fee not paid"); feeAddress.transfer(nativeFee); Lock memory lock; lock.lockDate = block.timestamp; lock.amount = _amount; lock.initialAmount = _amount; lock.unlockDate = _unlock_date; lock.lockID = locks[_lpToken].length; lock.owner = _withdrawer; lock.schemaId = _schemaId; // record the lock for the univ2pair locks[_lpToken].push(lock); lockedTokens.add(_lpToken); // record the lock for the user UserInfo storage user = users[_withdrawer]; user.lockedTokens.add(_lpToken); uint256[] storage user_locks = user.locksForToken[_lpToken]; user_locks.push(lock.lockID); emit Deposited( _lpToken, msg.sender, lock.amount, lock.lockDate, lock.unlockDate, lock.schemaId ); } /** * @notice extend a lock with a new unlock date, _index and _lockID ensure the correct lock is changed * this prevents errors when a user performs multiple tx per block possibly with varying gas prices */ function relock( address _lpToken, uint256 _index, uint256 _lockID, uint256 _unlock_date ) external nonReentrant { require(_unlock_date < 10000000000, "relock::Invalid timestamp"); // prevents errors when timestamp entered in milliseconds uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index]; Lock storage userLock = locks[_lpToken][lockID]; require( lockID == _lockID && userLock.owner == msg.sender, "relock::Lock mismatch" ); // ensures correct lock is affected require(userLock.unlockDate < _unlock_date, "relock::Invalid date"); // check holding NFT of schema if (userLock.schemaId > 0) { require( signataRight.holdsTokenOfSchema(msg.sender, userLock.schemaId), "relock::Sender does not hold NFT of schema" ); } userLock.amount = userLock.amount; userLock.unlockDate = _unlock_date; emit Relocked(_lockID, _unlock_date); } /** * @notice withdraw a specified amount from a lock. _index and _lockID ensure the correct lock is changed * this prevents errors when a user performs multiple tx per block possibly with varying gas prices */ function withdraw( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external nonReentrant { require(_amount > 0, "withdraw::Amount needs to be greater than 0"); uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index]; Lock storage userLock = locks[_lpToken][lockID]; require( lockID == _lockID && userLock.owner == msg.sender, "withdraw::Lock mismatch" ); // ensures correct lock is affected require(userLock.unlockDate < block.timestamp, "withdraw::Lock not expired"); userLock.amount = userLock.amount.sub(_amount); // check holding NFT of schema if (userLock.schemaId > 0) { require( signataRight.holdsTokenOfSchema(msg.sender, userLock.schemaId), "withdraw::Sender does not hold NFT of schema" ); } // clean user storage if (userLock.amount == 0) { uint256[] storage userLocks = users[msg.sender].locksForToken[ _lpToken ]; userLocks[_index] = userLocks[userLocks.length - 1]; userLocks.pop(); if (userLocks.length == 0) { users[msg.sender].lockedTokens.remove(_lpToken); } } TransferHelper.safeTransfer(_lpToken, msg.sender, _amount); emit Withdrawn(_lpToken, _amount); } /** * @notice increase the amount of tokens per a specific lock, this is preferable to creating a new lock, less fees, and faster loading on our live block explorer */ function incrementLock( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external nonReentrant { require(_amount > 0, "incrementLock::Amount needs to be greater than 0"); uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index]; Lock storage userLock = locks[_lpToken][lockID]; require( lockID == _lockID && userLock.owner == msg.sender, "incrementLock::Lock mismatch" ); // ensures correct lock is affected // check holding NFT of schema if (userLock.schemaId > 0) { require( signataRight.holdsTokenOfSchema(msg.sender, userLock.schemaId), "incrementLock::Sender does not hold NFT of schema" ); } TransferHelper.safeTransferFrom( _lpToken, address(msg.sender), address(this), _amount ); userLock.amount = userLock.amount.add(_amount); emit Deposited( _lpToken, msg.sender, _amount, userLock.lockDate, userLock.unlockDate, userLock.schemaId ); } /** * @notice split a lock into two seperate locks, useful when a lock is about to expire and youd like to relock a portion * and withdraw a smaller portion */ function splitLock( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external payable nonReentrant { require(_amount > 0, "splitLock::Amount needs to be greater than 0"); uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index]; Lock storage userLock = locks[_lpToken][lockID]; require( lockID == _lockID && userLock.owner == msg.sender, "splitLock::Lock Mismatch" ); // ensures correct lock is affected // check holding NFT of schema if (userLock.schemaId > 0) { require( signataRight.holdsTokenOfSchema(msg.sender, userLock.schemaId), "splitLock::Sender does not hold NFT of schema" ); } userLock.amount = userLock.amount.sub(_amount); Lock memory lock; lock.lockDate = userLock.lockDate; lock.amount = _amount; lock.initialAmount = _amount; lock.unlockDate = userLock.unlockDate; lock.lockID = locks[_lpToken].length; lock.owner = msg.sender; // record the lock for the univ2pair locks[_lpToken].push(lock); // record the lock for the user UserInfo storage user = users[msg.sender]; uint256[] storage user_locks = user.locksForToken[_lpToken]; user_locks.push(lock.lockID); emit LockSplit(_lockID, _amount); } /** * @notice transfer a lock to a new owner */ function transferLockOwnership( address _lpToken, uint256 _index, uint256 _lockID, address payable _newOwner ) external { require(msg.sender != _newOwner, "transferLockOwnership::Cannot transfer to self"); uint256 lockID = users[msg.sender].locksForToken[_lpToken][_index]; Lock storage lock = locks[_lpToken][lockID]; require( lockID == _lockID && lock.owner == msg.sender, "transferLockOwnership::Lock Mismatch" ); // ensures correct lock is affected // check holding NFT of schema if (lock.schemaId > 0) { require( signataRight.holdsTokenOfSchema( _newOwner, lock.schemaId ), "transferLockOwnership::New owner does not hold NFT of schema" ); } // record the lock for the new Owner UserInfo storage user = users[_newOwner]; user.lockedTokens.add(_lpToken); uint256[] storage user_locks = user.locksForToken[_lpToken]; user_locks.push(lock.lockID); // remove the lock from the old owner uint256[] storage userLocks = users[msg.sender].locksForToken[_lpToken]; userLocks[_index] = userLocks[userLocks.length - 1]; userLocks.pop(); if (userLocks.length == 0) { users[msg.sender].lockedTokens.remove(_lpToken); } lock.owner = _newOwner; emit LockTransferred(msg.sender, _newOwner); } function getNumLocksForToken(address _lpToken) external view returns (uint256) { return locks[_lpToken].length; } function getNumLockedTokens() external view returns (uint256) { return lockedTokens.length(); } function getLockedTokenAtIndex(uint256 _index) external view returns (address) { return lockedTokens.at(_index); } // user functions function getUserNumLockedTokens(address _user) external view returns (uint256) { UserInfo storage user = users[_user]; return user.lockedTokens.length(); } function getUserLockedTokenAtIndex(address _user, uint256 _index) external view returns (address) { UserInfo storage user = users[_user]; return user.lockedTokens.at(_index); } function getUserNumLocksForToken(address _user, address _lpToken) external view returns (uint256) { UserInfo storage user = users[_user]; return user.locksForToken[_lpToken].length; } function getUserLockForTokenAtIndex( address _user, address _lpToken, uint256 _index ) external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, address ) { uint256 lockID = users[_user].locksForToken[_lpToken][_index]; Lock storage lock = locks[_lpToken][lockID]; return ( lock.lockDate, lock.amount, lock.initialAmount, lock.unlockDate, lock.lockID, lock.schemaId, lock.owner ); } function updateSignataRight(address _signataRight) public onlyOwner { signataRight = ISignataRight(_signataRight); emit SignataRightUpdated(_signataRight); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IUniswapV2Factory","name":"_uniswapFactory","type":"address"},{"internalType":"contract ISignataRight","name":"_signataRight","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"schemaId","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LockSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"LockTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockDate","type":"uint256"}],"name":"Relocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSignataRight","type":"address"}],"name":"SignataRightUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLockedTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getNumLocksForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockForTokenAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserLockedTokenAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserNumLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getUserNumLocksForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"incrementLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_unlock_date","type":"uint256"},{"internalType":"address payable","name":"_withdrawer","type":"address"},{"internalType":"uint256","name":"_schemaId","type":"uint256"}],"name":"lockTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"locks","outputs":[{"internalType":"uint256","name":"lockDate","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"unlockDate","type":"uint256"},{"internalType":"uint256","name":"lockID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"schemaId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_unlock_date","type":"uint256"}],"name":"relock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nativeFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signataRight","outputs":[{"internalType":"contract ISignataRight","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"splitLock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"transferLockOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signataRight","type":"address"}],"name":"updateSignataRight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_lockID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004b3b38038062004b3b8339818101604052810190620000379190620002c7565b620000576200004b6200013860201b60201c565b6200014060201b60201c565b6001808190555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a764000060078190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200030e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002368262000209565b9050919050565b60006200024a8262000229565b9050919050565b6200025c816200023d565b81146200026857600080fd5b50565b6000815190506200027c8162000251565b92915050565b60006200028f8262000229565b9050919050565b620002a18162000282565b8114620002ad57600080fd5b50565b600081519050620002c18162000296565b92915050565b60008060408385031215620002e157620002e062000204565b5b6000620002f1858286016200026b565b92505060206200030485828601620002b0565b9150509250929050565b61481d806200031e6000396000f3fe6080604052600436106101405760003560e01c80638da5cb5b116100b6578063b3ebbc7a1161006f578063b3ebbc7a1461044d578063b425f80214610476578063bef497fd146104b9578063bf6ca001146104e2578063d4ff493f146104fe578063f2fde38b1461054157610140565b80638da5cb5b14610317578063903df80614610342578063996f79c01461037f578063a3969815146103aa578063a69d9c4f146103e7578063a9b07cea1461042457610140565b806369fe0e2d1161010857806369fe0e2d1461022d5780636add55d314610256578063715018a614610281578063783451e8146102985780638705fcd4146102c35780638bdb2afa146102ec57610140565b806314dd79a3146101455780631f2a1d2f146101825780634532d776146101bf578063582d5adc146101e857806360491d2414610204575b600080fd5b34801561015157600080fd5b5061016c6004803603810190610167919061318d565b61056a565b60405161017991906131fb565b60405180910390f35b34801561018e57600080fd5b506101a960048036038101906101a49190613242565b610587565b6040516101b6919061327e565b60405180910390f35b3480156101cb57600080fd5b506101e660048036038101906101e19190613299565b6105d3565b005b61020260048036038101906101fd9190613299565b610b13565b005b34801561021057600080fd5b5061022b60048036038101906102269190613299565b6110fa565b005b34801561023957600080fd5b50610254600480360381019061024f919061318d565b6114c1565b005b34801561026257600080fd5b5061026b6114d3565b604051610278919061335f565b60405180910390f35b34801561028d57600080fd5b506102966114f9565b005b3480156102a457600080fd5b506102ad61150d565b6040516102ba919061327e565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906133b8565b61151e565b005b3480156102f857600080fd5b5061030161156a565b60405161030e9190613406565b60405180910390f35b34801561032357600080fd5b5061032c611590565b60405161033991906131fb565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613421565b6115b9565b60405161037691906131fb565b60405180910390f35b34801561038b57600080fd5b5061039461161c565b6040516103a1919061327e565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613242565b611622565b6040516103de919061327e565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190613461565b61167a565b60405161041b919061327e565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190613299565b61170c565b005b34801561045957600080fd5b50610474600480360381019061046f9190613242565b611ab2565b005b34801561048257600080fd5b5061049d60048036038101906104989190613421565b611b35565b6040516104b097969594939291906134a1565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613510565b611bb4565b005b6104fc60048036038101906104f79190613577565b61215e565b005b34801561050a57600080fd5b50610525600480360381019061052091906135f2565b6128b8565b6040516105389796959493929190613645565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190613242565b612a25565b005b6000610580826004612aa890919063ffffffff16565b9050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600260015403610618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060f90613711565b60405180910390fd5b600260018190555060008111610663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065a906137a3565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106106f6576106f56137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610756576107556137c3565b5b9060005260206000209060070201905083821480156107c457503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa9061383e565b60405180910390fd5b42816003015410610849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610840906138aa565b60405180910390fd5b610860838260010154612ac290919063ffffffff16565b816001018190555060008160060154111561095757600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b81526004016108d69291906138ca565b602060405180830381865afa1580156108f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610917919061392b565b610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906139ca565b60405180910390fd5b5b6000816001015403610ac0576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600182805490506109f89190613a19565b81548110610a0957610a086137c3565b5b9060005260206000200154818781548110610a2757610a266137c3565b5b906000526020600020018190555080805480610a4657610a45613a4d565b5b600190038181906000526020600020016000905590556000818054905003610abe57610abc87600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001612ad890919063ffffffff16565b505b505b610acb863385612b08565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58684604051610afc9291906138ca565b60405180910390a150506001808190555050505050565b600260015403610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90613711565b60405180910390fd5b600260018190555060008111610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90613aee565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110610c3657610c356137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610c9657610c956137c3565b5b906000526020600020906007020190508382148015610d0457503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613b5a565b60405180910390fd5b600081600601541115610e3257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b8152600401610db19291906138ca565b602060405180830381865afa158015610dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df2919061392b565b610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890613bec565b60405180910390fd5b5b610e49838260010154612ac290919063ffffffff16565b8160010181905550610e596130ff565b816000015481600001818152505083816020018181525050838160400181815250508160030154816060018181525050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050816080018181525050338160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015550506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080836080015190806001815401808255809150506001900390600052602060002001600090919091909150557f76d77d51ae38b2d64ce912b2fb2f249d4ee27348eb71ef5560e5929597c45da387876040516110e0929190613c0c565b60405180910390a150505050506001808190555050505050565b60026001540361113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690613711565b60405180910390fd5b60026001819055506402540be400811061118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613c81565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611221576112206137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611281576112806137c3565b5b9060005260206000209060070201905083821480156112ef57503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590613ced565b60405180910390fd5b82816003015410611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b90613d59565b60405180910390fd5b60008160060154111561146357600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b81526004016113e29291906138ca565b602060405180830381865afa1580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611423919061392b565b611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990613deb565b60405180910390fd5b5b806001015481600101819055508281600301819055507f65bc6cf21b5baee4ef5cc5562708cc13091c42a053d3ef806cbc231e1dfef6dd84846040516114aa929190613c0c565b60405180910390a150506001808190555050505050565b6114c9612c3e565b8060078190555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611501612c3e565b61150b6000612cbc565b565b60006115196004612d80565b905090565b611526612c3e565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506116138382600001612aa890919063ffffffff16565b91505092915050565b60075481565b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061167281600001612d80565b915050919050565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905091505092915050565b600260015403611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613711565b60405180910390fd5b60026001819055506000811161179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390613e7d565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061182f5761182e6137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061188f5761188e6137c3565b5b9060005260206000209060070201905083821480156118fd57503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613ee9565b60405180910390fd5b600081600601541115611a2b57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b81526004016119aa9291906138ca565b602060405180830381865afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb919061392b565b611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190613f7b565b60405180910390fd5b5b611a3786333086612d95565b611a4e838260010154612ece90919063ffffffff16565b81600101819055507ff3b2a76575670b4eff5a4ad3639d40d32f7ca987adac169e6f9b89a3ab857d27863385846000015485600301548660060154604051611a9b96959493929190613f9b565b60405180910390a150506001808190555050505050565b611aba612c3e565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcb65c18faff3332094fd1731355ecc7d2c027a2766ef7ca0cb926322586d85b081604051611b2a91906131fb565b60405180910390a150565b60066020528160005260406000208181548110611b5157600080fd5b9060005260206000209060070201600091509150508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060154905087565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c199061406e565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611cb557611cb46137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611d1557611d146137c3565b5b906000526020600020906007020190508382148015611d8357503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990614100565b60405180910390fd5b600081600601541115611eb157600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977908483600601546040518363ffffffff1660e01b8152600401611e30929190614141565b602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e71919061392b565b611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea7906141dc565b60405180910390fd5b5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611f0a8782600001612ee490919063ffffffff16565b5060008160020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080836004015490806001815401808255809150506001900390600052602060002001600090919091909150556000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600182805490506120119190613a19565b81548110612022576120216137c3565b5b90600052602060002001548189815481106120405761203f6137c3565b5b90600052602060002001819055508080548061205f5761205e613a4d565b5b6001900381819060005260206000200160009055905560008180549050036120d7576120d589600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001612ad890919063ffffffff16565b505b858460050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff2f4568e84e13b982d9f65b4a307fda0cb024bd816f15709c9c25130c7b34b48338760405161214b9291906141fc565b60405180910390a1505050505050505050565b6002600154036121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a90613711565b60405180910390fd5b60026001819055506402540be40083106121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614271565b60405180910390fd5b60008411612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90614303565b60405180910390fd5b60008590506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439058373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e99190614338565b8473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123589190614338565b6040518363ffffffff1660e01b8152600401612375929190614365565b602060405180830381865afa158015612392573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b69190614338565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d906143da565b60405180910390fd5b600083111561250d57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b9779033856040518363ffffffff1660e01b815260040161248c9291906138ca565b602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd919061392b565b61250c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125039061446c565b60405180910390fd5b5b61251987333089612d95565b600754341461255d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612554906144d8565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6007549081150290604051600060405180830381858888f193505050501580156125c7573d6000803e3d6000fd5b506125d06130ff565b42816000018181525050868160200181815250508681604001818152505085816060018181525050600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050816080018181525050848160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160c0018181525050600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c082015181600601555050612788886004612ee490919063ffffffff16565b506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506127e28982600001612ee490919063ffffffff16565b5060008160020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080836080015190806001815401808255809150506001900390600052602060002001600090919091909150557ff3b2a76575670b4eff5a4ad3639d40d32f7ca987adac169e6f9b89a3ab857d278a338560200151866000015187606001518860c0015160405161289d96959493929190613f9b565b60405180910390a15050505050600180819055505050505050565b600080600080600080600080600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612955576129546137c3565b5b906000526020600020015490506000600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106129b5576129b46137c3565b5b906000526020600020906007020190508060000154816001015482600201548360030154846004015485600601548660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16985098509850985098509850985050509397509397509397909450565b612a2d612c3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a939061456a565b60405180910390fd5b612aa581612cbc565b50565b6000612ab78360000183612f14565b60001c905092915050565b60008183612ad09190613a19565b905092915050565b6000612b00836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612f3f565b905092915050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612b3a9291906138ca565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612b8891906145fb565b6000604051808303816000865af19150503d8060008114612bc5576040519150601f19603f3d011682016040523d82523d6000602084013e612bca565b606091505b5091509150818015612bf85750600081511480612bf7575080806020019051810190612bf6919061392b565b5b5b612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e9061465e565b60405180910390fd5b5050505050565b612c46613053565b73ffffffffffffffffffffffffffffffffffffffff16612c64611590565b73ffffffffffffffffffffffffffffffffffffffff1614612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb1906146ca565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612d8e8260000161305b565b9050919050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612dc9939291906146ea565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e1791906145fb565b6000604051808303816000865af19150503d8060008114612e54576040519150601f19603f3d011682016040523d82523d6000602084013e612e59565b606091505b5091509150818015612e875750600081511480612e86575080806020019051810190612e85919061392b565b5b5b612ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebd90614793565b60405180910390fd5b505050505050565b60008183612edc91906147b3565b905092915050565b6000612f0c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61306c565b905092915050565b6000826000018281548110612f2c57612f2b6137c3565b5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114613047576000600182612f719190613a19565b9050600060018660000180549050612f899190613a19565b9050818114612ff8576000866000018281548110612faa57612fa96137c3565b5b9060005260206000200154905080876000018481548110612fce57612fcd6137c3565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061300c5761300b613a4d565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061304d565b60009150505b92915050565b600033905090565b600081600001805490509050919050565b600061307883836130dc565b6130d15782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130d6565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600080fd5b6000819050919050565b61316a81613157565b811461317557600080fd5b50565b60008135905061318781613161565b92915050565b6000602082840312156131a3576131a2613152565b5b60006131b184828501613178565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e5826131ba565b9050919050565b6131f5816131da565b82525050565b600060208201905061321060008301846131ec565b92915050565b61321f816131da565b811461322a57600080fd5b50565b60008135905061323c81613216565b92915050565b60006020828403121561325857613257613152565b5b60006132668482850161322d565b91505092915050565b61327881613157565b82525050565b6000602082019050613293600083018461326f565b92915050565b600080600080608085870312156132b3576132b2613152565b5b60006132c18782880161322d565b94505060206132d287828801613178565b93505060406132e387828801613178565b92505060606132f487828801613178565b91505092959194509250565b6000819050919050565b600061332561332061331b846131ba565b613300565b6131ba565b9050919050565b60006133378261330a565b9050919050565b60006133498261332c565b9050919050565b6133598161333e565b82525050565b60006020820190506133746000830184613350565b92915050565b6000613385826131ba565b9050919050565b6133958161337a565b81146133a057600080fd5b50565b6000813590506133b28161338c565b92915050565b6000602082840312156133ce576133cd613152565b5b60006133dc848285016133a3565b91505092915050565b60006133f08261332c565b9050919050565b613400816133e5565b82525050565b600060208201905061341b60008301846133f7565b92915050565b6000806040838503121561343857613437613152565b5b60006134468582860161322d565b925050602061345785828601613178565b9150509250929050565b6000806040838503121561347857613477613152565b5b60006134868582860161322d565b92505060206134978582860161322d565b9150509250929050565b600060e0820190506134b6600083018a61326f565b6134c3602083018961326f565b6134d0604083018861326f565b6134dd606083018761326f565b6134ea608083018661326f565b6134f760a08301856131ec565b61350460c083018461326f565b98975050505050505050565b6000806000806080858703121561352a57613529613152565b5b60006135388782880161322d565b945050602061354987828801613178565b935050604061355a87828801613178565b925050606061356b878288016133a3565b91505092959194509250565b600080600080600060a0868803121561359357613592613152565b5b60006135a18882890161322d565b95505060206135b288828901613178565b94505060406135c388828901613178565b93505060606135d4888289016133a3565b92505060806135e588828901613178565b9150509295509295909350565b60008060006060848603121561360b5761360a613152565b5b60006136198682870161322d565b935050602061362a8682870161322d565b925050604061363b86828701613178565b9150509250925092565b600060e08201905061365a600083018a61326f565b613667602083018961326f565b613674604083018861326f565b613681606083018761326f565b61368e608083018661326f565b61369b60a083018561326f565b6136a860c08301846131ec565b98975050505050505050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006136fb601f836136b4565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f77697468647261773a3a416d6f756e74206e6565647320746f2062652067726560008201527f61746572207468616e2030000000000000000000000000000000000000000000602082015250565b600061378d602b836136b4565b915061379882613731565b604082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f77697468647261773a3a4c6f636b206d69736d61746368000000000000000000600082015250565b60006138286017836136b4565b9150613833826137f2565b602082019050919050565b600060208201905081810360008301526138578161381b565b9050919050565b7f77697468647261773a3a4c6f636b206e6f742065787069726564000000000000600082015250565b6000613894601a836136b4565b915061389f8261385e565b602082019050919050565b600060208201905081810360008301526138c381613887565b9050919050565b60006040820190506138df60008301856131ec565b6138ec602083018461326f565b9392505050565b60008115159050919050565b613908816138f3565b811461391357600080fd5b50565b600081519050613925816138ff565b92915050565b60006020828403121561394157613940613152565b5b600061394f84828501613916565b91505092915050565b7f77697468647261773a3a53656e64657220646f6573206e6f7420686f6c64204e60008201527f4654206f6620736368656d610000000000000000000000000000000000000000602082015250565b60006139b4602c836136b4565b91506139bf82613958565b604082019050919050565b600060208201905081810360008301526139e3816139a7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a2482613157565b9150613a2f83613157565b9250828203905081811115613a4757613a466139ea565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f73706c69744c6f636b3a3a416d6f756e74206e6565647320746f20626520677260008201527f6561746572207468616e20300000000000000000000000000000000000000000602082015250565b6000613ad8602c836136b4565b9150613ae382613a7c565b604082019050919050565b60006020820190508181036000830152613b0781613acb565b9050919050565b7f73706c69744c6f636b3a3a4c6f636b204d69736d617463680000000000000000600082015250565b6000613b446018836136b4565b9150613b4f82613b0e565b602082019050919050565b60006020820190508181036000830152613b7381613b37565b9050919050565b7f73706c69744c6f636b3a3a53656e64657220646f6573206e6f7420686f6c642060008201527f4e4654206f6620736368656d6100000000000000000000000000000000000000602082015250565b6000613bd6602d836136b4565b9150613be182613b7a565b604082019050919050565b60006020820190508181036000830152613c0581613bc9565b9050919050565b6000604082019050613c21600083018561326f565b613c2e602083018461326f565b9392505050565b7f72656c6f636b3a3a496e76616c69642074696d657374616d7000000000000000600082015250565b6000613c6b6019836136b4565b9150613c7682613c35565b602082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f72656c6f636b3a3a4c6f636b206d69736d617463680000000000000000000000600082015250565b6000613cd76015836136b4565b9150613ce282613ca1565b602082019050919050565b60006020820190508181036000830152613d0681613cca565b9050919050565b7f72656c6f636b3a3a496e76616c69642064617465000000000000000000000000600082015250565b6000613d436014836136b4565b9150613d4e82613d0d565b602082019050919050565b60006020820190508181036000830152613d7281613d36565b9050919050565b7f72656c6f636b3a3a53656e64657220646f6573206e6f7420686f6c64204e465460008201527f206f6620736368656d6100000000000000000000000000000000000000000000602082015250565b6000613dd5602a836136b4565b9150613de082613d79565b604082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b7f696e6372656d656e744c6f636b3a3a416d6f756e74206e6565647320746f206260008201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b6000613e676030836136b4565b9150613e7282613e0b565b604082019050919050565b60006020820190508181036000830152613e9681613e5a565b9050919050565b7f696e6372656d656e744c6f636b3a3a4c6f636b206d69736d6174636800000000600082015250565b6000613ed3601c836136b4565b9150613ede82613e9d565b602082019050919050565b60006020820190508181036000830152613f0281613ec6565b9050919050565b7f696e6372656d656e744c6f636b3a3a53656e64657220646f6573206e6f74206860008201527f6f6c64204e4654206f6620736368656d61000000000000000000000000000000602082015250565b6000613f656031836136b4565b9150613f7082613f09565b604082019050919050565b60006020820190508181036000830152613f9481613f58565b9050919050565b600060c082019050613fb060008301896131ec565b613fbd60208301886131ec565b613fca604083018761326f565b613fd7606083018661326f565b613fe4608083018561326f565b613ff160a083018461326f565b979650505050505050565b7f7472616e736665724c6f636b4f776e6572736869703a3a43616e6e6f7420747260008201527f616e7366657220746f2073656c66000000000000000000000000000000000000602082015250565b6000614058602e836136b4565b915061406382613ffc565b604082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f7472616e736665724c6f636b4f776e6572736869703a3a4c6f636b204d69736d60008201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b60006140ea6024836136b4565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b600061412b8261332c565b9050919050565b61413b81614120565b82525050565b60006040820190506141566000830185614132565b614163602083018461326f565b9392505050565b7f7472616e736665724c6f636b4f776e6572736869703a3a4e6577206f776e657260008201527f20646f6573206e6f7420686f6c64204e4654206f6620736368656d6100000000602082015250565b60006141c6603c836136b4565b91506141d18261416a565b604082019050919050565b600060208201905081810360008301526141f5816141b9565b9050919050565b600060408201905061421160008301856131ec565b61421e6020830184614132565b9392505050565b7f6c6f636b546f6b656e733a3a496e76616c69642074696d657374616d70000000600082015250565b600061425b601d836136b4565b915061426682614225565b602082019050919050565b6000602082019050818103600083015261428a8161424e565b9050919050565b7f6c6f636b546f6b656e733a3a416d6f756e74206e6565647320746f206265206760008201527f726561746572207468616e203000000000000000000000000000000000000000602082015250565b60006142ed602d836136b4565b91506142f882614291565b604082019050919050565b6000602082019050818103600083015261431c816142e0565b9050919050565b60008151905061433281613216565b92915050565b60006020828403121561434e5761434d613152565b5b600061435c84828501614323565b91505092915050565b600060408201905061437a60008301856131ec565b61438760208301846131ec565b9392505050565b7f6c6f636b546f6b656e733a3a496e76616c6964204c5020706169720000000000600082015250565b60006143c4601b836136b4565b91506143cf8261438e565b602082019050919050565b600060208201905081810360008301526143f3816143b7565b9050919050565b7f6c6f636b546f6b656e733a3a53656e64657220646f6573206e6f7420686f6c6460008201527f204e4654206f6620736368656d61000000000000000000000000000000000000602082015250565b6000614456602e836136b4565b9150614461826143fa565b604082019050919050565b6000602082019050818103600083015261448581614449565b9050919050565b7f6c6f636b546f6b656e733a3a466565206e6f7420706169640000000000000000600082015250565b60006144c26018836136b4565b91506144cd8261448c565b602082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145546026836136b4565b915061455f826144f8565b604082019050919050565b6000602082019050818103600083015261458381614547565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156145be5780820151818401526020810190506145a3565b60008484015250505050565b60006145d58261458a565b6145df8185614595565b93506145ef8185602086016145a0565b80840191505092915050565b600061460782846145ca565b915081905092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000614648601f836136b4565b915061465382614612565b602082019050919050565b600060208201905081810360008301526146778161463b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146b46020836136b4565b91506146bf8261467e565b602082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b60006060820190506146ff60008301866131ec565b61470c60208301856131ec565b614719604083018461326f565b949350505050565b7f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160008201527f494c454400000000000000000000000000000000000000000000000000000000602082015250565b600061477d6024836136b4565b915061478882614721565b604082019050919050565b600060208201905081810360008301526147ac81614770565b9050919050565b60006147be82613157565b91506147c983613157565b92508282019050808211156147e1576147e06139ea565b5b9291505056fea264697066735822122050952850847f5a43f03f2c74a841ccb3b8cc7599f0a35f70e2f8f317c34c41d464736f6c634300081100330000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000005e93d064008d7d3001f27e296a1b046635a58baa
Deployed Bytecode
0x6080604052600436106101405760003560e01c80638da5cb5b116100b6578063b3ebbc7a1161006f578063b3ebbc7a1461044d578063b425f80214610476578063bef497fd146104b9578063bf6ca001146104e2578063d4ff493f146104fe578063f2fde38b1461054157610140565b80638da5cb5b14610317578063903df80614610342578063996f79c01461037f578063a3969815146103aa578063a69d9c4f146103e7578063a9b07cea1461042457610140565b806369fe0e2d1161010857806369fe0e2d1461022d5780636add55d314610256578063715018a614610281578063783451e8146102985780638705fcd4146102c35780638bdb2afa146102ec57610140565b806314dd79a3146101455780631f2a1d2f146101825780634532d776146101bf578063582d5adc146101e857806360491d2414610204575b600080fd5b34801561015157600080fd5b5061016c6004803603810190610167919061318d565b61056a565b60405161017991906131fb565b60405180910390f35b34801561018e57600080fd5b506101a960048036038101906101a49190613242565b610587565b6040516101b6919061327e565b60405180910390f35b3480156101cb57600080fd5b506101e660048036038101906101e19190613299565b6105d3565b005b61020260048036038101906101fd9190613299565b610b13565b005b34801561021057600080fd5b5061022b60048036038101906102269190613299565b6110fa565b005b34801561023957600080fd5b50610254600480360381019061024f919061318d565b6114c1565b005b34801561026257600080fd5b5061026b6114d3565b604051610278919061335f565b60405180910390f35b34801561028d57600080fd5b506102966114f9565b005b3480156102a457600080fd5b506102ad61150d565b6040516102ba919061327e565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906133b8565b61151e565b005b3480156102f857600080fd5b5061030161156a565b60405161030e9190613406565b60405180910390f35b34801561032357600080fd5b5061032c611590565b60405161033991906131fb565b60405180910390f35b34801561034e57600080fd5b5061036960048036038101906103649190613421565b6115b9565b60405161037691906131fb565b60405180910390f35b34801561038b57600080fd5b5061039461161c565b6040516103a1919061327e565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613242565b611622565b6040516103de919061327e565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190613461565b61167a565b60405161041b919061327e565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190613299565b61170c565b005b34801561045957600080fd5b50610474600480360381019061046f9190613242565b611ab2565b005b34801561048257600080fd5b5061049d60048036038101906104989190613421565b611b35565b6040516104b097969594939291906134a1565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db9190613510565b611bb4565b005b6104fc60048036038101906104f79190613577565b61215e565b005b34801561050a57600080fd5b50610525600480360381019061052091906135f2565b6128b8565b6040516105389796959493929190613645565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190613242565b612a25565b005b6000610580826004612aa890919063ffffffff16565b9050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600260015403610618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060f90613711565b60405180910390fd5b600260018190555060008111610663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065a906137a3565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106106f6576106f56137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610756576107556137c3565b5b9060005260206000209060070201905083821480156107c457503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa9061383e565b60405180910390fd5b42816003015410610849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610840906138aa565b60405180910390fd5b610860838260010154612ac290919063ffffffff16565b816001018190555060008160060154111561095757600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b81526004016108d69291906138ca565b602060405180830381865afa1580156108f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610917919061392b565b610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906139ca565b60405180910390fd5b5b6000816001015403610ac0576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600182805490506109f89190613a19565b81548110610a0957610a086137c3565b5b9060005260206000200154818781548110610a2757610a266137c3565b5b906000526020600020018190555080805480610a4657610a45613a4d565b5b600190038181906000526020600020016000905590556000818054905003610abe57610abc87600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001612ad890919063ffffffff16565b505b505b610acb863385612b08565b7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58684604051610afc9291906138ca565b60405180910390a150506001808190555050505050565b600260015403610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90613711565b60405180910390fd5b600260018190555060008111610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90613aee565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110610c3657610c356137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610c9657610c956137c3565b5b906000526020600020906007020190508382148015610d0457503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613b5a565b60405180910390fd5b600081600601541115610e3257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b8152600401610db19291906138ca565b602060405180830381865afa158015610dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df2919061392b565b610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890613bec565b60405180910390fd5b5b610e49838260010154612ac290919063ffffffff16565b8160010181905550610e596130ff565b816000015481600001818152505083816020018181525050838160400181815250508160030154816060018181525050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050816080018181525050338160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015550506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080836080015190806001815401808255809150506001900390600052602060002001600090919091909150557f76d77d51ae38b2d64ce912b2fb2f249d4ee27348eb71ef5560e5929597c45da387876040516110e0929190613c0c565b60405180910390a150505050506001808190555050505050565b60026001540361113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690613711565b60405180910390fd5b60026001819055506402540be400811061118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613c81565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611221576112206137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611281576112806137c3565b5b9060005260206000209060070201905083821480156112ef57503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132590613ced565b60405180910390fd5b82816003015410611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b90613d59565b60405180910390fd5b60008160060154111561146357600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b81526004016113e29291906138ca565b602060405180830381865afa1580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611423919061392b565b611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990613deb565b60405180910390fd5b5b806001015481600101819055508281600301819055507f65bc6cf21b5baee4ef5cc5562708cc13091c42a053d3ef806cbc231e1dfef6dd84846040516114aa929190613c0c565b60405180910390a150506001808190555050505050565b6114c9612c3e565b8060078190555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611501612c3e565b61150b6000612cbc565b565b60006115196004612d80565b905090565b611526612c3e565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506116138382600001612aa890919063ffffffff16565b91505092915050565b60075481565b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061167281600001612d80565b915050919050565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905091505092915050565b600260015403611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613711565b60405180910390fd5b60026001819055506000811161179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390613e7d565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061182f5761182e6137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061188f5761188e6137c3565b5b9060005260206000209060070201905083821480156118fd57503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390613ee9565b60405180910390fd5b600081600601541115611a2b57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977903383600601546040518363ffffffff1660e01b81526004016119aa9291906138ca565b602060405180830381865afa1580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb919061392b565b611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190613f7b565b60405180910390fd5b5b611a3786333086612d95565b611a4e838260010154612ece90919063ffffffff16565b81600101819055507ff3b2a76575670b4eff5a4ad3639d40d32f7ca987adac169e6f9b89a3ab857d27863385846000015485600301548660060154604051611a9b96959493929190613f9b565b60405180910390a150506001808190555050505050565b611aba612c3e565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcb65c18faff3332094fd1731355ecc7d2c027a2766ef7ca0cb926322586d85b081604051611b2a91906131fb565b60405180910390a150565b60066020528160005260406000208181548110611b5157600080fd5b9060005260206000209060070201600091509150508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060154905087565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c199061406e565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611cb557611cb46137c3565b5b906000526020600020015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611d1557611d146137c3565b5b906000526020600020906007020190508382148015611d8357503373ffffffffffffffffffffffffffffffffffffffff168160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990614100565b60405180910390fd5b600081600601541115611eb157600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b977908483600601546040518363ffffffff1660e01b8152600401611e30929190614141565b602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e71919061392b565b611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea7906141dc565b60405180910390fd5b5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611f0a8782600001612ee490919063ffffffff16565b5060008160020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080836004015490806001815401808255809150506001900390600052602060002001600090919091909150556000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600182805490506120119190613a19565b81548110612022576120216137c3565b5b90600052602060002001548189815481106120405761203f6137c3565b5b90600052602060002001819055508080548061205f5761205e613a4d565b5b6001900381819060005260206000200160009055905560008180549050036120d7576120d589600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001612ad890919063ffffffff16565b505b858460050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff2f4568e84e13b982d9f65b4a307fda0cb024bd816f15709c9c25130c7b34b48338760405161214b9291906141fc565b60405180910390a1505050505050505050565b6002600154036121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a90613711565b60405180910390fd5b60026001819055506402540be40083106121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614271565b60405180910390fd5b60008411612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90614303565b60405180910390fd5b60008590506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439058373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e99190614338565b8473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123589190614338565b6040518363ffffffff1660e01b8152600401612375929190614365565b602060405180830381865afa158015612392573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b69190614338565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d906143da565b60405180910390fd5b600083111561250d57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398b9779033856040518363ffffffff1660e01b815260040161248c9291906138ca565b602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd919061392b565b61250c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125039061446c565b60405180910390fd5b5b61251987333089612d95565b600754341461255d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612554906144d8565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6007549081150290604051600060405180830381858888f193505050501580156125c7573d6000803e3d6000fd5b506125d06130ff565b42816000018181525050868160200181815250508681604001818152505085816060018181525050600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050816080018181525050848160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160c0018181525050600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c082015181600601555050612788886004612ee490919063ffffffff16565b506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506127e28982600001612ee490919063ffffffff16565b5060008160020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080836080015190806001815401808255809150506001900390600052602060002001600090919091909150557ff3b2a76575670b4eff5a4ad3639d40d32f7ca987adac169e6f9b89a3ab857d278a338560200151866000015187606001518860c0015160405161289d96959493929190613f9b565b60405180910390a15050505050600180819055505050505050565b600080600080600080600080600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208981548110612955576129546137c3565b5b906000526020600020015490506000600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106129b5576129b46137c3565b5b906000526020600020906007020190508060000154816001015482600201548360030154846004015485600601548660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16985098509850985098509850985050509397509397509397909450565b612a2d612c3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a939061456a565b60405180910390fd5b612aa581612cbc565b50565b6000612ab78360000183612f14565b60001c905092915050565b60008183612ad09190613a19565b905092915050565b6000612b00836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612f3f565b905092915050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612b3a9291906138ca565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612b8891906145fb565b6000604051808303816000865af19150503d8060008114612bc5576040519150601f19603f3d011682016040523d82523d6000602084013e612bca565b606091505b5091509150818015612bf85750600081511480612bf7575080806020019051810190612bf6919061392b565b5b5b612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e9061465e565b60405180910390fd5b5050505050565b612c46613053565b73ffffffffffffffffffffffffffffffffffffffff16612c64611590565b73ffffffffffffffffffffffffffffffffffffffff1614612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb1906146ca565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612d8e8260000161305b565b9050919050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612dc9939291906146ea565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612e1791906145fb565b6000604051808303816000865af19150503d8060008114612e54576040519150601f19603f3d011682016040523d82523d6000602084013e612e59565b606091505b5091509150818015612e875750600081511480612e86575080806020019051810190612e85919061392b565b5b5b612ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebd90614793565b60405180910390fd5b505050505050565b60008183612edc91906147b3565b905092915050565b6000612f0c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61306c565b905092915050565b6000826000018281548110612f2c57612f2b6137c3565b5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114613047576000600182612f719190613a19565b9050600060018660000180549050612f899190613a19565b9050818114612ff8576000866000018281548110612faa57612fa96137c3565b5b9060005260206000200154905080876000018481548110612fce57612fcd6137c3565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061300c5761300b613a4d565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061304d565b60009150505b92915050565b600033905090565b600081600001805490509050919050565b600061307883836130dc565b6130d15782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506130d6565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6040518060e001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600080fd5b6000819050919050565b61316a81613157565b811461317557600080fd5b50565b60008135905061318781613161565b92915050565b6000602082840312156131a3576131a2613152565b5b60006131b184828501613178565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e5826131ba565b9050919050565b6131f5816131da565b82525050565b600060208201905061321060008301846131ec565b92915050565b61321f816131da565b811461322a57600080fd5b50565b60008135905061323c81613216565b92915050565b60006020828403121561325857613257613152565b5b60006132668482850161322d565b91505092915050565b61327881613157565b82525050565b6000602082019050613293600083018461326f565b92915050565b600080600080608085870312156132b3576132b2613152565b5b60006132c18782880161322d565b94505060206132d287828801613178565b93505060406132e387828801613178565b92505060606132f487828801613178565b91505092959194509250565b6000819050919050565b600061332561332061331b846131ba565b613300565b6131ba565b9050919050565b60006133378261330a565b9050919050565b60006133498261332c565b9050919050565b6133598161333e565b82525050565b60006020820190506133746000830184613350565b92915050565b6000613385826131ba565b9050919050565b6133958161337a565b81146133a057600080fd5b50565b6000813590506133b28161338c565b92915050565b6000602082840312156133ce576133cd613152565b5b60006133dc848285016133a3565b91505092915050565b60006133f08261332c565b9050919050565b613400816133e5565b82525050565b600060208201905061341b60008301846133f7565b92915050565b6000806040838503121561343857613437613152565b5b60006134468582860161322d565b925050602061345785828601613178565b9150509250929050565b6000806040838503121561347857613477613152565b5b60006134868582860161322d565b92505060206134978582860161322d565b9150509250929050565b600060e0820190506134b6600083018a61326f565b6134c3602083018961326f565b6134d0604083018861326f565b6134dd606083018761326f565b6134ea608083018661326f565b6134f760a08301856131ec565b61350460c083018461326f565b98975050505050505050565b6000806000806080858703121561352a57613529613152565b5b60006135388782880161322d565b945050602061354987828801613178565b935050604061355a87828801613178565b925050606061356b878288016133a3565b91505092959194509250565b600080600080600060a0868803121561359357613592613152565b5b60006135a18882890161322d565b95505060206135b288828901613178565b94505060406135c388828901613178565b93505060606135d4888289016133a3565b92505060806135e588828901613178565b9150509295509295909350565b60008060006060848603121561360b5761360a613152565b5b60006136198682870161322d565b935050602061362a8682870161322d565b925050604061363b86828701613178565b9150509250925092565b600060e08201905061365a600083018a61326f565b613667602083018961326f565b613674604083018861326f565b613681606083018761326f565b61368e608083018661326f565b61369b60a083018561326f565b6136a860c08301846131ec565b98975050505050505050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006136fb601f836136b4565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f77697468647261773a3a416d6f756e74206e6565647320746f2062652067726560008201527f61746572207468616e2030000000000000000000000000000000000000000000602082015250565b600061378d602b836136b4565b915061379882613731565b604082019050919050565b600060208201905081810360008301526137bc81613780565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f77697468647261773a3a4c6f636b206d69736d61746368000000000000000000600082015250565b60006138286017836136b4565b9150613833826137f2565b602082019050919050565b600060208201905081810360008301526138578161381b565b9050919050565b7f77697468647261773a3a4c6f636b206e6f742065787069726564000000000000600082015250565b6000613894601a836136b4565b915061389f8261385e565b602082019050919050565b600060208201905081810360008301526138c381613887565b9050919050565b60006040820190506138df60008301856131ec565b6138ec602083018461326f565b9392505050565b60008115159050919050565b613908816138f3565b811461391357600080fd5b50565b600081519050613925816138ff565b92915050565b60006020828403121561394157613940613152565b5b600061394f84828501613916565b91505092915050565b7f77697468647261773a3a53656e64657220646f6573206e6f7420686f6c64204e60008201527f4654206f6620736368656d610000000000000000000000000000000000000000602082015250565b60006139b4602c836136b4565b91506139bf82613958565b604082019050919050565b600060208201905081810360008301526139e3816139a7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a2482613157565b9150613a2f83613157565b9250828203905081811115613a4757613a466139ea565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f73706c69744c6f636b3a3a416d6f756e74206e6565647320746f20626520677260008201527f6561746572207468616e20300000000000000000000000000000000000000000602082015250565b6000613ad8602c836136b4565b9150613ae382613a7c565b604082019050919050565b60006020820190508181036000830152613b0781613acb565b9050919050565b7f73706c69744c6f636b3a3a4c6f636b204d69736d617463680000000000000000600082015250565b6000613b446018836136b4565b9150613b4f82613b0e565b602082019050919050565b60006020820190508181036000830152613b7381613b37565b9050919050565b7f73706c69744c6f636b3a3a53656e64657220646f6573206e6f7420686f6c642060008201527f4e4654206f6620736368656d6100000000000000000000000000000000000000602082015250565b6000613bd6602d836136b4565b9150613be182613b7a565b604082019050919050565b60006020820190508181036000830152613c0581613bc9565b9050919050565b6000604082019050613c21600083018561326f565b613c2e602083018461326f565b9392505050565b7f72656c6f636b3a3a496e76616c69642074696d657374616d7000000000000000600082015250565b6000613c6b6019836136b4565b9150613c7682613c35565b602082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f72656c6f636b3a3a4c6f636b206d69736d617463680000000000000000000000600082015250565b6000613cd76015836136b4565b9150613ce282613ca1565b602082019050919050565b60006020820190508181036000830152613d0681613cca565b9050919050565b7f72656c6f636b3a3a496e76616c69642064617465000000000000000000000000600082015250565b6000613d436014836136b4565b9150613d4e82613d0d565b602082019050919050565b60006020820190508181036000830152613d7281613d36565b9050919050565b7f72656c6f636b3a3a53656e64657220646f6573206e6f7420686f6c64204e465460008201527f206f6620736368656d6100000000000000000000000000000000000000000000602082015250565b6000613dd5602a836136b4565b9150613de082613d79565b604082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b7f696e6372656d656e744c6f636b3a3a416d6f756e74206e6565647320746f206260008201527f652067726561746572207468616e203000000000000000000000000000000000602082015250565b6000613e676030836136b4565b9150613e7282613e0b565b604082019050919050565b60006020820190508181036000830152613e9681613e5a565b9050919050565b7f696e6372656d656e744c6f636b3a3a4c6f636b206d69736d6174636800000000600082015250565b6000613ed3601c836136b4565b9150613ede82613e9d565b602082019050919050565b60006020820190508181036000830152613f0281613ec6565b9050919050565b7f696e6372656d656e744c6f636b3a3a53656e64657220646f6573206e6f74206860008201527f6f6c64204e4654206f6620736368656d61000000000000000000000000000000602082015250565b6000613f656031836136b4565b9150613f7082613f09565b604082019050919050565b60006020820190508181036000830152613f9481613f58565b9050919050565b600060c082019050613fb060008301896131ec565b613fbd60208301886131ec565b613fca604083018761326f565b613fd7606083018661326f565b613fe4608083018561326f565b613ff160a083018461326f565b979650505050505050565b7f7472616e736665724c6f636b4f776e6572736869703a3a43616e6e6f7420747260008201527f616e7366657220746f2073656c66000000000000000000000000000000000000602082015250565b6000614058602e836136b4565b915061406382613ffc565b604082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f7472616e736665724c6f636b4f776e6572736869703a3a4c6f636b204d69736d60008201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b60006140ea6024836136b4565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b600061412b8261332c565b9050919050565b61413b81614120565b82525050565b60006040820190506141566000830185614132565b614163602083018461326f565b9392505050565b7f7472616e736665724c6f636b4f776e6572736869703a3a4e6577206f776e657260008201527f20646f6573206e6f7420686f6c64204e4654206f6620736368656d6100000000602082015250565b60006141c6603c836136b4565b91506141d18261416a565b604082019050919050565b600060208201905081810360008301526141f5816141b9565b9050919050565b600060408201905061421160008301856131ec565b61421e6020830184614132565b9392505050565b7f6c6f636b546f6b656e733a3a496e76616c69642074696d657374616d70000000600082015250565b600061425b601d836136b4565b915061426682614225565b602082019050919050565b6000602082019050818103600083015261428a8161424e565b9050919050565b7f6c6f636b546f6b656e733a3a416d6f756e74206e6565647320746f206265206760008201527f726561746572207468616e203000000000000000000000000000000000000000602082015250565b60006142ed602d836136b4565b91506142f882614291565b604082019050919050565b6000602082019050818103600083015261431c816142e0565b9050919050565b60008151905061433281613216565b92915050565b60006020828403121561434e5761434d613152565b5b600061435c84828501614323565b91505092915050565b600060408201905061437a60008301856131ec565b61438760208301846131ec565b9392505050565b7f6c6f636b546f6b656e733a3a496e76616c6964204c5020706169720000000000600082015250565b60006143c4601b836136b4565b91506143cf8261438e565b602082019050919050565b600060208201905081810360008301526143f3816143b7565b9050919050565b7f6c6f636b546f6b656e733a3a53656e64657220646f6573206e6f7420686f6c6460008201527f204e4654206f6620736368656d61000000000000000000000000000000000000602082015250565b6000614456602e836136b4565b9150614461826143fa565b604082019050919050565b6000602082019050818103600083015261448581614449565b9050919050565b7f6c6f636b546f6b656e733a3a466565206e6f7420706169640000000000000000600082015250565b60006144c26018836136b4565b91506144cd8261448c565b602082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145546026836136b4565b915061455f826144f8565b604082019050919050565b6000602082019050818103600083015261458381614547565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156145be5780820151818401526020810190506145a3565b60008484015250505050565b60006145d58261458a565b6145df8185614595565b93506145ef8185602086016145a0565b80840191505092915050565b600061460782846145ca565b915081905092915050565b7f5472616e7366657248656c7065723a205452414e534645525f4641494c454400600082015250565b6000614648601f836136b4565b915061465382614612565b602082019050919050565b600060208201905081810360008301526146778161463b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146b46020836136b4565b91506146bf8261467e565b602082019050919050565b600060208201905081810360008301526146e3816146a7565b9050919050565b60006060820190506146ff60008301866131ec565b61470c60208301856131ec565b614719604083018461326f565b949350505050565b7f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160008201527f494c454400000000000000000000000000000000000000000000000000000000602082015250565b600061477d6024836136b4565b915061478882614721565b604082019050919050565b600060208201905081810360008301526147ac81614770565b9050919050565b60006147be82613157565b91506147c983613157565b92508282019050808211156147e1576147e06139ea565b5b9291505056fea264697066735822122050952850847f5a43f03f2c74a841ccb3b8cc7599f0a35f70e2f8f317c34c41d464736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000005e93d064008d7d3001f27e296a1b046635a58baa
-----Decoded View---------------
Arg [0] : _uniswapFactory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
Arg [1] : _signataRight (address): 0x5E93D064008D7D3001f27E296a1B046635a58baa
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Arg [1] : 0000000000000000000000005e93d064008d7d3001f27e296a1b046635a58baa
Deployed Bytecode Sourcemap
32249:14569:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45035:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44751:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38459:1492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41595:1493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37130:1087;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34284:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33398:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11195:103;;;;;;;;;;;;;:::i;:::-;;44918:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34164:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32399:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10547:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45444:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33271:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45226:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45683:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:1260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46635:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33188:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;43161:1582;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34697:2194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45929:698;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;11453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45035:160;45132:7;45164:23;45180:6;45164:12;:15;;:23;;;;:::i;:::-;45157:30;;45035:160;;;:::o;44751:159::-;44848:7;44880:5;:15;44886:8;44880:15;;;;;;;;;;;;;;;:22;;;;44873:29;;44751:159;;;:::o;38459:1492::-;7452:1;8050:7;;:19;8042:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7452:1;8183:7;:18;;;;38639:1:::1;38629:7;:11;38621:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38699:14;38716:5;:17;38722:10;38716:17;;;;;;;;;;;;;;;:31;;:41;38748:8;38716:41;;;;;;;;;;;;;;;38758:6;38716:49;;;;;;;;:::i;:::-;;;;;;;;;;38699:66;;38776:21;38800:5;:15;38806:8;38800:15;;;;;;;;;;;;;;;38816:6;38800:23;;;;;;;;:::i;:::-;;;;;;;;;;;;38776:47;;38866:7;38856:6;:17;:49;;;;;38895:10;38877:28;;:8;:14;;;;;;;;;;;;:28;;;38856:49;38834:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;39033:15;39011:8;:19;;;:37;39003:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39108:28;39128:7;39108:8;:15;;;:19;;:28;;;;:::i;:::-;39090:8;:15;;:46;;;;39213:1;39193:8;:17;;;:21;39189:222;;;39257:12;;;;;;;;;;;:31;;;39289:10;39301:8;:17;;;39257:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39231:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;39189:222;39477:1;39458:8;:15;;;:20:::0;39454:375:::1;;39495:27;39525:5;:17;39531:10;39525:17;;;;;;;;;;;;;;;:31;;:73;39575:8;39525:73;;;;;;;;;;;;;;;39495:103;;39633:9;39662:1;39643:9;:16;;;;:20;;;;:::i;:::-;39633:31;;;;;;;;:::i;:::-;;;;;;;;;;39613:9;39623:6;39613:17;;;;;;;;:::i;:::-;;;;;;;;;:51;;;;39679:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39733:1;39713:9;:16;;;;:21:::0;39709:109:::1;;39755:47;39793:8;39755:5;:17;39761:10;39755:17;;;;;;;;;;;;;;;:30;;:37;;:47;;;;:::i;:::-;;39709:109;39480:349;39454:375;39841:58;39869:8;39879:10;39891:7;39841:27;:58::i;:::-;39915:28;39925:8;39935:7;39915:28;;;;;;;:::i;:::-;;;;;;;;38610:1341;;7408:1:::0;8362:7;:22;;;;38459:1492;;;;:::o;41595:1493::-;7452:1;8050:7;;:19;8042:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7452:1;8183:7;:18;;;;41784:1:::1;41774:7;:11;41766:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41845:14;41862:5;:17;41868:10;41862:17;;;;;;;;;;;;;;;:31;;:41;41894:8;41862:41;;;;;;;;;;;;;;;41904:6;41862:49;;;;;;;;:::i;:::-;;;;;;;;;;41845:66;;41922:21;41946:5;:15;41952:8;41946:15;;;;;;;;;;;;;;;41962:6;41946:23;;;;;;;;:::i;:::-;;;;;;;;;;;;41922:47;;42012:7;42002:6;:17;:49;;;;;42041:10;42023:28;;:8;:14;;;;;;;;;;;;:28;;;42002:49;41980:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;42216:1;42196:8;:17;;;:21;42192:223;;;42260:12;;;;;;;;;;;:31;;;42292:10;42304:8;:17;;;42260:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42234:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;42192:223;42445:28;42465:7;42445:8;:15;;;:19;;:28;;;;:::i;:::-;42427:8;:15;;:46;;;;42486:16;;:::i;:::-;42529:8;:17;;;42513:4;:13;;:33;;;::::0;::::1;42571:7;42557:4;:11;;:21;;;::::0;::::1;42610:7;42589:4;:18;;:28;;;::::0;::::1;42646:8;:19;;;42628:4;:15;;:37;;;::::0;::::1;42690:5;:15;42696:8;42690:15;;;;;;;;;;;;;;;:22;;;;42676:4;:11;;:36;;;::::0;::::1;42736:10;42723:4;:10;;:23;;;;;;;;;::::0;::::1;42805:5;:15;42811:8;42805:15;;;;;;;;;;;;;;;42826:4;42805:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42885:21;42909:5;:17;42915:10;42909:17;;;;;;;;;;;;;;;42885:41;;42937:28;42968:4;:18;;:28;42987:8;42968:28;;;;;;;;;;;;;;;42937:59;;43007:10;43023:4;:11;;;43007:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43053:27;43063:7;43072;43053:27;;;;;;;:::i;:::-;;;;;;;;41755:1333;;;;;7408:1:::0;8362:7;:22;;;;41595:1493;;;;:::o;37130:1087::-;7452:1;8050:7;;:19;8042:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7452:1;8183:7;:18;;;;37318:11:::1;37303:12;:26;37295:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37428:14;37445:5;:17;37451:10;37445:17;;;;;;;;;;;;;;;:31;;:41;37477:8;37445:41;;;;;;;;;;;;;;;37487:6;37445:49;;;;;;;;:::i;:::-;;;;;;;;;;37428:66;;37505:21;37529:5;:15;37535:8;37529:15;;;;;;;;;;;;;;;37545:6;37529:23;;;;;;;;:::i;:::-;;;;;;;;;;;;37505:47;;37595:7;37585:6;:17;:49;;;;;37624:10;37606:28;;:8;:14;;;;;;;;;;;;:28;;;37585:49;37563:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;37760:12;37738:8;:19;;;:34;37730:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37874:1;37854:8;:17;;;:21;37850:220;;;37918:12;;;;;;;;;;;:31;;;37950:10;37962:8;:17;;;37918:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37892:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;37850:220;38100:8;:15;;;38082:8;:15;;:33;;;;38148:12;38126:8;:19;;:34;;;;38178:31;38187:7;38196:12;38178:31;;;;;;;:::i;:::-;;;;;;;;37284:933;;7408:1:::0;8362:7;:22;;;;37130:1087;;;;:::o;34284:94::-;10433:13;:11;:13::i;:::-;34360:10:::1;34348:9;:22;;;;34284:94:::0;:::o;33398:33::-;;;;;;;;;;;;;:::o;11195:103::-;10433:13;:11;:13::i;:::-;11260:30:::1;11287:1;11260:18;:30::i;:::-;11195:103::o:0;44918:109::-;44971:7;44998:21;:12;:19;:21::i;:::-;44991:28;;44918:109;:::o;34164:112::-;10433:13;:11;:13::i;:::-;34257:11:::1;34244:10;;:24;;;;;;;;;;;;;;;;;;34164:112:::0;:::o;32399:39::-;;;;;;;;;;;;;:::o;10547:87::-;10593:7;10620:6;;;;;;;;;;;10613:13;;10547:87;:::o;45444:231::-;45560:7;45585:21;45609:5;:12;45615:5;45609:12;;;;;;;;;;;;;;;45585:36;;45639:28;45660:6;45639:4;:17;;:20;;:28;;;;:::i;:::-;45632:35;;;45444:231;;;;:::o;33271:24::-;;;;:::o;45226:210::-;45323:7;45348:21;45372:5;:12;45378:5;45372:12;;;;;;;;;;;;;;;45348:36;;45402:26;:4;:17;;:24;:26::i;:::-;45395:33;;;45226:210;;;:::o;45683:238::-;45799:7;45824:21;45848:5;:12;45854:5;45848:12;;;;;;;;;;;;;;;45824:36;;45878:4;:18;;:28;45897:8;45878:28;;;;;;;;;;;;;;;:35;;;;45871:42;;;45683:238;;;;:::o;40144:1260::-;7452:1;8050:7;;:19;8042:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7452:1;8183:7;:18;;;;40329:1:::1;40319:7;:11;40311:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;40394:14;40411:5;:17;40417:10;40411:17;;;;;;;;;;;;;;;:31;;:41;40443:8;40411:41;;;;;;;;;;;;;;;40453:6;40411:49;;;;;;;;:::i;:::-;;;;;;;;;;40394:66;;40471:21;40495:5;:15;40501:8;40495:15;;;;;;;;;;;;;;;40511:6;40495:23;;;;;;;;:::i;:::-;;;;;;;;;;;;40471:47;;40561:7;40551:6;:17;:49;;;;;40590:10;40572:28;;:8;:14;;;;;;;;;;;;:28;;;40551:49;40529:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;40769:1;40749:8;:17;;;:21;40745:227;;;40813:12;;;;;;;;;;;:31;;;40845:10;40857:8;:17;;;40813:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40787:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;40745:227;40984:149;41030:8;41061:10;41095:4;41115:7;40984:31;:149::i;:::-;41164:28;41184:7;41164:8;:15;;;:19;;:28;;;;:::i;:::-;41146:8;:15;;:46;;;;41208:188;41232:8;41255:10;41280:7;41302:8;:17;;;41334:8;:19;;;41368:8;:17;;;41208:188;;;;;;;;;;;:::i;:::-;;;;;;;;40300:1104;;7408:1:::0;8362:7;:22;;;;40144:1260;;;;:::o;46635:180::-;10433:13;:11;:13::i;:::-;46743::::1;46714:12;;:43;;;;;;;;;;;;;;;;;;46773:34;46793:13;46773:34;;;;;;:::i;:::-;;;;;;;;46635:180:::0;:::o;33188:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43161:1582::-;43355:9;43341:23;;:10;:23;;;43333:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;43426:14;43443:5;:17;43449:10;43443:17;;;;;;;;;;;;;;;:31;;:41;43475:8;43443:41;;;;;;;;;;;;;;;43485:6;43443:49;;;;;;;;:::i;:::-;;;;;;;;;;43426:66;;43503:17;43523:5;:15;43529:8;43523:15;;;;;;;;;;;;;;;43539:6;43523:23;;;;;;;;:::i;:::-;;;;;;;;;;;;43503:43;;43589:7;43579:6;:17;:45;;;;;43614:10;43600:24;;:4;:10;;;;;;;;;;;;:24;;;43579:45;43557:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;43797:1;43781:4;:13;;;:17;43777:290;;;43841:12;;;;;;;;;;;:31;;;43895:9;43927:4;:13;;;43841:118;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43815:240;;;;;;;;;;;;:::i;:::-;;;;;;;;;43777:290;44125:21;44149:5;:16;44155:9;44149:16;;;;;;;;;;;;;;;44125:40;;44176:31;44198:8;44176:4;:17;;:21;;:31;;;;:::i;:::-;;44218:28;44249:4;:18;;:28;44268:8;44249:28;;;;;;;;;;;;;;;44218:59;;44288:10;44304:4;:11;;;44288:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44376:27;44406:5;:17;44412:10;44406:17;;;;;;;;;;;;;;;:31;;:41;44438:8;44406:41;;;;;;;;;;;;;;;44376:71;;44478:9;44507:1;44488:9;:16;;;;:20;;;;:::i;:::-;44478:31;;;;;;;;:::i;:::-;;;;;;;;;;44458:9;44468:6;44458:17;;;;;;;;:::i;:::-;;;;;;;;;:51;;;;44520:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44570:1;44550:9;:16;;;;:21;44546:101;;44588:47;44626:8;44588:5;:17;44594:10;44588:17;;;;;;;;;;;;;;;:30;;:37;;:47;;;;:::i;:::-;;44546:101;44670:9;44657:4;:10;;;:22;;;;;;;;;;;;;;;;;;44697:38;44713:10;44725:9;44697:38;;;;;;;:::i;:::-;;;;;;;;43322:1421;;;;;43161:1582;;;;:::o;34697:2194::-;7452:1;8050:7;;:19;8042:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7452:1;8183:7;:18;;;;34938:11:::1;34923:12;:26;34915:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35070:1;35060:7;:11;35052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35203:20;35249:8;35203:56;;35270:26;35299:14;;;;;;;;;;;:22;;;35336:5;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35365:5;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35299:91;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35270:120;;35439:8;35409:39;;:18;:39;;;35401:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;35549:1;35537:9;:13;35533:208;;;35593:12;;;;;;;;;;;:31;;;35625:10;35637:9;35593:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35567:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;35533:208;35753:149;35799:8;35830:10;35864:4;35884:7;35753:31;:149::i;:::-;35936:9;;35923;:22;35915:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;35985:10;;;;;;;;;;;:19;;:30;36005:9;;35985:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;36028:16;;:::i;:::-;36071:15;36055:4;:13;;:31;;;::::0;::::1;36111:7;36097:4;:11;;:21;;;::::0;::::1;36150:7;36129:4;:18;;:28;;;::::0;::::1;36186:12;36168:4;:15;;:30;;;::::0;::::1;36223:5;:15;36229:8;36223:15;;;;;;;;;;;;;;;:22;;;;36209:4;:11;;:36;;;::::0;::::1;36269:11;36256:4;:10;;:24;;;;;;;;;::::0;::::1;36307:9;36291:4;:13;;:25;;;::::0;::::1;36375:5;:15;36381:8;36375:15;;;;;;;;;;;;;;;36396:4;36375:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36412;36429:8;36412:12;:16;;:26;;;;:::i;:::-;;36492:21;36516:5;:18;36522:11;36516:18;;;;;;;;;;;;;;;36492:42;;36545:31;36567:8;36545:4;:17;;:21;;:31;;;;:::i;:::-;;36587:28;36618:4;:18;;:28;36637:8;36618:28;;;;;;;;;;;;;;;36587:59;;36657:10;36673:4;:11;;;36657:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36703:180;36727:8;36750:10;36775:4;:11;;;36801:4;:13;;;36829:4;:15;;;36859:4;:13;;;36703:180;;;;;;;;;;;:::i;:::-;;;;;;;;34904:1987;;;;;7408:1:::0;8362:7;:22;;;;34697:2194;;;;;:::o;45929:698::-;46112:7;46134;46156;46178;46200;46222;46244;46279:14;46296:5;:12;46302:5;46296:12;;;;;;;;;;;;;;;:26;;:36;46323:8;46296:36;;;;;;;;;;;;;;;46333:6;46296:44;;;;;;;;:::i;:::-;;;;;;;;;;46279:61;;46351:17;46371:5;:15;46377:8;46371:15;;;;;;;;;;;;;;;46387:6;46371:23;;;;;;;;:::i;:::-;;;;;;;;;;;;46351:43;;46427:4;:13;;;46455:4;:11;;;46481:4;:18;;;46514:4;:15;;;46544:4;:11;;;46570:4;:13;;;46598:4;:10;;;;;;;;;;;;46405:214;;;;;;;;;;;;;;;;45929:698;;;;;;;;;;;:::o;11453:201::-;10433:13;:11;:13::i;:::-;11562:1:::1;11542:22;;:8;:22;;::::0;11534:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11618:28;11637:8;11618:18;:28::i;:::-;11453:201:::0;:::o;28665:158::-;28739:7;28790:22;28794:3;:10;;28806:5;28790:3;:22::i;:::-;28782:31;;28759:56;;28665:158;;;;:::o;15279:98::-;15337:7;15368:1;15364;:5;;;;:::i;:::-;15357:12;;15279:98;;;;:::o;27697:158::-;27770:4;27794:53;27802:3;:10;;27838:5;27822:23;;27814:32;;27794:7;:53::i;:::-;27787:60;;27697:158;;;;:::o;588:294::-;670:12;684:17;705:5;:10;;739;751:2;755:5;716:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;705:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;669:93;;;;781:7;:57;;;;;808:1;793:4;:11;:16;:44;;;;824:4;813:24;;;;;;;;;;;;:::i;:::-;793:44;781:57;773:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;658:224;;588:294;;;:::o;10712:132::-;10787:12;:10;:12::i;:::-;10776:23;;:7;:5;:7::i;:::-;:23;;;10768:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10712:132::o;11814:191::-;11888:16;11907:6;;;;;;;;;;;11888:25;;11933:8;11924:6;;:17;;;;;;;;;;;;;;;;;;11988:8;11957:40;;11978:8;11957:40;;;;;;;;;;;;11877:128;11814:191;:::o;28194:117::-;28257:7;28284:19;28292:3;:10;;28284:7;:19::i;:::-;28277:26;;28194:117;;;:::o;890:323::-;990:12;1004:17;1025:5;:10;;1059;1071:4;1077:2;1081:5;1036:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1025:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;989:99;;;;1107:7;:57;;;;;1134:1;1119:4;:11;:16;:44;;;;1150:4;1139:24;;;;;;;;;;;;:::i;:::-;1119:44;1107:57;1099:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;978:235;;890:323;;;;:::o;14898:98::-;14956:7;14987:1;14983;:5;;;;:::i;:::-;14976:12;;14898:98;;;;:::o;27369:152::-;27439:4;27463:50;27468:3;:10;;27504:5;27488:23;;27480:32;;27463:4;:50::i;:::-;27456:57;;27369:152;;;;:::o;24058:120::-;24125:7;24152:3;:11;;24164:5;24152:18;;;;;;;;:::i;:::-;;;;;;;;;;24145:25;;24058:120;;;;:::o;21874:1420::-;21940:4;22058:18;22079:3;:12;;:19;22092:5;22079:19;;;;;;;;;;;;22058:40;;22129:1;22115:10;:15;22111:1176;;22490:21;22527:1;22514:10;:14;;;;:::i;:::-;22490:38;;22543:17;22584:1;22563:3;:11;;:18;;;;:22;;;;:::i;:::-;22543:42;;22619:13;22606:9;:26;22602:405;;22653:17;22673:3;:11;;22685:9;22673:22;;;;;;;;:::i;:::-;;;;;;;;;;22653:42;;22827:9;22798:3;:11;;22810:13;22798:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;22938:10;22912:3;:12;;:23;22925:9;22912:23;;;;;;;;;;;:36;;;;22634:373;22602:405;23088:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23183:3;:12;;:19;23196:5;23183:19;;;;;;;;;;;23176:26;;;23226:4;23219:11;;;;;;;22111:1176;23270:5;23263:12;;;21874:1420;;;;;:::o;9088:98::-;9141:7;9168:10;9161:17;;9088:98;:::o;23595:109::-;23651:7;23678:3;:11;;:18;;;;23671:25;;23595:109;;;:::o;21284:414::-;21347:4;21369:21;21379:3;21384:5;21369:9;:21::i;:::-;21364:327;;21407:3;:11;;21424:5;21407:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21590:3;:11;;:18;;;;21568:3;:12;;:19;21581:5;21568:19;;;;;;;;;;;:40;;;;21630:4;21623:11;;;;21364:327;21674:5;21667:12;;21284:414;;;;;:::o;23380:129::-;23453:4;23500:1;23477:3;:12;;:19;23490:5;23477:19;;;;;;;;;;;;:24;;23470:31;;23380:129;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025: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:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:118::-;2306:24;2324:5;2306:24;:::i;:::-;2301:3;2294:37;2219:118;;:::o;2343:222::-;2436:4;2474:2;2463:9;2459:18;2451:26;;2487:71;2555:1;2544:9;2540:17;2531:6;2487:71;:::i;:::-;2343:222;;;;:::o;2571:765::-;2657:6;2665;2673;2681;2730:3;2718:9;2709:7;2705:23;2701:33;2698:120;;;2737:79;;:::i;:::-;2698:120;2857:1;2882:53;2927:7;2918:6;2907:9;2903:22;2882:53;:::i;:::-;2872:63;;2828:117;2984:2;3010:53;3055:7;3046:6;3035:9;3031:22;3010:53;:::i;:::-;3000:63;;2955:118;3112:2;3138:53;3183:7;3174:6;3163:9;3159:22;3138:53;:::i;:::-;3128:63;;3083:118;3240:2;3266:53;3311:7;3302:6;3291:9;3287:22;3266:53;:::i;:::-;3256:63;;3211:118;2571:765;;;;;;;:::o;3342:60::-;3370:3;3391:5;3384:12;;3342:60;;;:::o;3408:142::-;3458:9;3491:53;3509:34;3518:24;3536:5;3518:24;:::i;:::-;3509:34;:::i;:::-;3491:53;:::i;:::-;3478:66;;3408:142;;;:::o;3556:126::-;3606:9;3639:37;3670:5;3639:37;:::i;:::-;3626:50;;3556:126;;;:::o;3688:147::-;3759:9;3792:37;3823:5;3792:37;:::i;:::-;3779:50;;3688:147;;;:::o;3841:173::-;3949:58;4001:5;3949:58;:::i;:::-;3944:3;3937:71;3841:173;;:::o;4020:264::-;4134:4;4172:2;4161:9;4157:18;4149:26;;4185:92;4274:1;4263:9;4259:17;4250:6;4185:92;:::i;:::-;4020:264;;;;:::o;4290:104::-;4335:7;4364:24;4382:5;4364:24;:::i;:::-;4353:35;;4290:104;;;:::o;4400:138::-;4481:32;4507:5;4481:32;:::i;:::-;4474:5;4471:43;4461:71;;4528:1;4525;4518:12;4461:71;4400:138;:::o;4544:155::-;4598:5;4636:6;4623:20;4614:29;;4652:41;4687:5;4652:41;:::i;:::-;4544:155;;;;:::o;4705:345::-;4772:6;4821:2;4809:9;4800:7;4796:23;4792:32;4789:119;;;4827:79;;:::i;:::-;4789:119;4947:1;4972:61;5025:7;5016:6;5005:9;5001:22;4972:61;:::i;:::-;4962:71;;4918:125;4705:345;;;;:::o;5056:151::-;5131:9;5164:37;5195:5;5164:37;:::i;:::-;5151:50;;5056:151;;;:::o;5213:181::-;5325:62;5381:5;5325:62;:::i;:::-;5320:3;5313:75;5213:181;;:::o;5400:272::-;5518:4;5556:2;5545:9;5541:18;5533:26;;5569:96;5662:1;5651:9;5647:17;5638:6;5569:96;:::i;:::-;5400:272;;;;:::o;5678:474::-;5746:6;5754;5803:2;5791:9;5782:7;5778:23;5774:32;5771:119;;;5809:79;;:::i;:::-;5771:119;5929:1;5954:53;5999:7;5990:6;5979:9;5975:22;5954:53;:::i;:::-;5944:63;;5900:117;6056:2;6082:53;6127:7;6118:6;6107:9;6103:22;6082:53;:::i;:::-;6072:63;;6027:118;5678:474;;;;;:::o;6158:::-;6226:6;6234;6283:2;6271:9;6262:7;6258:23;6254:32;6251:119;;;6289:79;;:::i;:::-;6251:119;6409:1;6434:53;6479:7;6470:6;6459:9;6455:22;6434:53;:::i;:::-;6424:63;;6380:117;6536:2;6562:53;6607:7;6598:6;6587:9;6583:22;6562:53;:::i;:::-;6552:63;;6507:118;6158:474;;;;;:::o;6638:886::-;6899:4;6937:3;6926:9;6922:19;6914:27;;6951:71;7019:1;7008:9;7004:17;6995:6;6951:71;:::i;:::-;7032:72;7100:2;7089:9;7085:18;7076:6;7032:72;:::i;:::-;7114;7182:2;7171:9;7167:18;7158:6;7114:72;:::i;:::-;7196;7264:2;7253:9;7249:18;7240:6;7196:72;:::i;:::-;7278:73;7346:3;7335:9;7331:19;7322:6;7278:73;:::i;:::-;7361;7429:3;7418:9;7414:19;7405:6;7361:73;:::i;:::-;7444;7512:3;7501:9;7497:19;7488:6;7444:73;:::i;:::-;6638:886;;;;;;;;;;:::o;7530:781::-;7624:6;7632;7640;7648;7697:3;7685:9;7676:7;7672:23;7668:33;7665:120;;;7704:79;;:::i;:::-;7665:120;7824:1;7849:53;7894:7;7885:6;7874:9;7870:22;7849:53;:::i;:::-;7839:63;;7795:117;7951:2;7977:53;8022:7;8013:6;8002:9;7998:22;7977:53;:::i;:::-;7967:63;;7922:118;8079:2;8105:53;8150:7;8141:6;8130:9;8126:22;8105:53;:::i;:::-;8095:63;;8050:118;8207:2;8233:61;8286:7;8277:6;8266:9;8262:22;8233:61;:::i;:::-;8223:71;;8178:126;7530:781;;;;;;;:::o;8317:927::-;8420:6;8428;8436;8444;8452;8501:3;8489:9;8480:7;8476:23;8472:33;8469:120;;;8508:79;;:::i;:::-;8469:120;8628:1;8653:53;8698:7;8689:6;8678:9;8674:22;8653:53;:::i;:::-;8643:63;;8599:117;8755:2;8781:53;8826:7;8817:6;8806:9;8802:22;8781:53;:::i;:::-;8771:63;;8726:118;8883:2;8909:53;8954:7;8945:6;8934:9;8930:22;8909:53;:::i;:::-;8899:63;;8854:118;9011:2;9037:61;9090:7;9081:6;9070:9;9066:22;9037:61;:::i;:::-;9027:71;;8982:126;9147:3;9174:53;9219:7;9210:6;9199:9;9195:22;9174:53;:::i;:::-;9164:63;;9118:119;8317:927;;;;;;;;:::o;9250:619::-;9327:6;9335;9343;9392:2;9380:9;9371:7;9367:23;9363:32;9360:119;;;9398:79;;:::i;:::-;9360:119;9518:1;9543:53;9588:7;9579:6;9568:9;9564:22;9543:53;:::i;:::-;9533:63;;9489:117;9645:2;9671:53;9716:7;9707:6;9696:9;9692:22;9671:53;:::i;:::-;9661:63;;9616:118;9773:2;9799:53;9844:7;9835:6;9824:9;9820:22;9799:53;:::i;:::-;9789:63;;9744:118;9250:619;;;;;:::o;9875:886::-;10136:4;10174:3;10163:9;10159:19;10151:27;;10188:71;10256:1;10245:9;10241:17;10232:6;10188:71;:::i;:::-;10269:72;10337:2;10326:9;10322:18;10313:6;10269:72;:::i;:::-;10351;10419:2;10408:9;10404:18;10395:6;10351:72;:::i;:::-;10433;10501:2;10490:9;10486:18;10477:6;10433:72;:::i;:::-;10515:73;10583:3;10572:9;10568:19;10559:6;10515:73;:::i;:::-;10598;10666:3;10655:9;10651:19;10642:6;10598:73;:::i;:::-;10681;10749:3;10738:9;10734:19;10725:6;10681:73;:::i;:::-;9875:886;;;;;;;;;;:::o;10767:169::-;10851:11;10885:6;10880:3;10873:19;10925:4;10920:3;10916:14;10901:29;;10767:169;;;;:::o;10942:181::-;11082:33;11078:1;11070:6;11066:14;11059:57;10942:181;:::o;11129:366::-;11271:3;11292:67;11356:2;11351:3;11292:67;:::i;:::-;11285:74;;11368:93;11457:3;11368:93;:::i;:::-;11486:2;11481:3;11477:12;11470:19;;11129:366;;;:::o;11501:419::-;11667:4;11705:2;11694:9;11690:18;11682:26;;11754:9;11748:4;11744:20;11740:1;11729:9;11725:17;11718:47;11782:131;11908:4;11782:131;:::i;:::-;11774:139;;11501:419;;;:::o;11926:230::-;12066:34;12062:1;12054:6;12050:14;12043:58;12135:13;12130:2;12122:6;12118:15;12111:38;11926:230;:::o;12162:366::-;12304:3;12325:67;12389:2;12384:3;12325:67;:::i;:::-;12318:74;;12401:93;12490:3;12401:93;:::i;:::-;12519:2;12514:3;12510:12;12503:19;;12162:366;;;:::o;12534:419::-;12700:4;12738:2;12727:9;12723:18;12715:26;;12787:9;12781:4;12777:20;12773:1;12762:9;12758:17;12751:47;12815:131;12941:4;12815:131;:::i;:::-;12807:139;;12534:419;;;:::o;12959:180::-;13007:77;13004:1;12997:88;13104:4;13101:1;13094:15;13128:4;13125:1;13118:15;13145:173;13285:25;13281:1;13273:6;13269:14;13262:49;13145:173;:::o;13324:366::-;13466:3;13487:67;13551:2;13546:3;13487:67;:::i;:::-;13480:74;;13563:93;13652:3;13563:93;:::i;:::-;13681:2;13676:3;13672:12;13665:19;;13324:366;;;:::o;13696:419::-;13862:4;13900:2;13889:9;13885:18;13877:26;;13949:9;13943:4;13939:20;13935:1;13924:9;13920:17;13913:47;13977:131;14103:4;13977:131;:::i;:::-;13969:139;;13696:419;;;:::o;14121:176::-;14261:28;14257:1;14249:6;14245:14;14238:52;14121:176;:::o;14303:366::-;14445:3;14466:67;14530:2;14525:3;14466:67;:::i;:::-;14459:74;;14542:93;14631:3;14542:93;:::i;:::-;14660:2;14655:3;14651:12;14644:19;;14303:366;;;:::o;14675:419::-;14841:4;14879:2;14868:9;14864:18;14856:26;;14928:9;14922:4;14918:20;14914:1;14903:9;14899:17;14892:47;14956:131;15082:4;14956:131;:::i;:::-;14948:139;;14675:419;;;:::o;15100:332::-;15221:4;15259:2;15248:9;15244:18;15236:26;;15272:71;15340:1;15329:9;15325:17;15316:6;15272:71;:::i;:::-;15353:72;15421:2;15410:9;15406:18;15397:6;15353:72;:::i;:::-;15100:332;;;;;:::o;15438:90::-;15472:7;15515:5;15508:13;15501:21;15490:32;;15438:90;;;:::o;15534:116::-;15604:21;15619:5;15604:21;:::i;:::-;15597:5;15594:32;15584:60;;15640:1;15637;15630:12;15584:60;15534:116;:::o;15656:137::-;15710:5;15741:6;15735:13;15726:22;;15757:30;15781:5;15757:30;:::i;:::-;15656:137;;;;:::o;15799:345::-;15866:6;15915:2;15903:9;15894:7;15890:23;15886:32;15883:119;;;15921:79;;:::i;:::-;15883:119;16041:1;16066:61;16119:7;16110:6;16099:9;16095:22;16066:61;:::i;:::-;16056:71;;16012:125;15799:345;;;;:::o;16150:231::-;16290:34;16286:1;16278:6;16274:14;16267:58;16359:14;16354:2;16346:6;16342:15;16335:39;16150:231;:::o;16387:366::-;16529:3;16550:67;16614:2;16609:3;16550:67;:::i;:::-;16543:74;;16626:93;16715:3;16626:93;:::i;:::-;16744:2;16739:3;16735:12;16728:19;;16387:366;;;:::o;16759:419::-;16925:4;16963:2;16952:9;16948:18;16940:26;;17012:9;17006:4;17002:20;16998:1;16987:9;16983:17;16976:47;17040:131;17166:4;17040:131;:::i;:::-;17032:139;;16759:419;;;:::o;17184:180::-;17232:77;17229:1;17222:88;17329:4;17326:1;17319:15;17353:4;17350:1;17343:15;17370:194;17410:4;17430:20;17448:1;17430:20;:::i;:::-;17425:25;;17464:20;17482:1;17464:20;:::i;:::-;17459:25;;17508:1;17505;17501:9;17493:17;;17532:1;17526:4;17523:11;17520:37;;;17537:18;;:::i;:::-;17520:37;17370:194;;;;:::o;17570:180::-;17618:77;17615:1;17608:88;17715:4;17712:1;17705:15;17739:4;17736:1;17729:15;17756:231;17896:34;17892:1;17884:6;17880:14;17873:58;17965:14;17960:2;17952:6;17948:15;17941:39;17756:231;:::o;17993:366::-;18135:3;18156:67;18220:2;18215:3;18156:67;:::i;:::-;18149:74;;18232:93;18321:3;18232:93;:::i;:::-;18350:2;18345:3;18341:12;18334:19;;17993:366;;;:::o;18365:419::-;18531:4;18569:2;18558:9;18554:18;18546:26;;18618:9;18612:4;18608:20;18604:1;18593:9;18589:17;18582:47;18646:131;18772:4;18646:131;:::i;:::-;18638:139;;18365:419;;;:::o;18790:174::-;18930:26;18926:1;18918:6;18914:14;18907:50;18790:174;:::o;18970:366::-;19112:3;19133:67;19197:2;19192:3;19133:67;:::i;:::-;19126:74;;19209:93;19298:3;19209:93;:::i;:::-;19327:2;19322:3;19318:12;19311:19;;18970:366;;;:::o;19342:419::-;19508:4;19546:2;19535:9;19531:18;19523:26;;19595:9;19589:4;19585:20;19581:1;19570:9;19566:17;19559:47;19623:131;19749:4;19623:131;:::i;:::-;19615:139;;19342:419;;;:::o;19767:232::-;19907:34;19903:1;19895:6;19891:14;19884:58;19976:15;19971:2;19963:6;19959:15;19952:40;19767:232;:::o;20005:366::-;20147:3;20168:67;20232:2;20227:3;20168:67;:::i;:::-;20161:74;;20244:93;20333:3;20244:93;:::i;:::-;20362:2;20357:3;20353:12;20346:19;;20005:366;;;:::o;20377:419::-;20543:4;20581:2;20570:9;20566:18;20558:26;;20630:9;20624:4;20620:20;20616:1;20605:9;20601:17;20594:47;20658:131;20784:4;20658:131;:::i;:::-;20650:139;;20377:419;;;:::o;20802:332::-;20923:4;20961:2;20950:9;20946:18;20938:26;;20974:71;21042:1;21031:9;21027:17;21018:6;20974:71;:::i;:::-;21055:72;21123:2;21112:9;21108:18;21099:6;21055:72;:::i;:::-;20802:332;;;;;:::o;21140:175::-;21280:27;21276:1;21268:6;21264:14;21257:51;21140:175;:::o;21321:366::-;21463:3;21484:67;21548:2;21543:3;21484:67;:::i;:::-;21477:74;;21560:93;21649:3;21560:93;:::i;:::-;21678:2;21673:3;21669:12;21662:19;;21321:366;;;:::o;21693:419::-;21859:4;21897:2;21886:9;21882:18;21874:26;;21946:9;21940:4;21936:20;21932:1;21921:9;21917:17;21910:47;21974:131;22100:4;21974:131;:::i;:::-;21966:139;;21693:419;;;:::o;22118:171::-;22258:23;22254:1;22246:6;22242:14;22235:47;22118:171;:::o;22295:366::-;22437:3;22458:67;22522:2;22517:3;22458:67;:::i;:::-;22451:74;;22534:93;22623:3;22534:93;:::i;:::-;22652:2;22647:3;22643:12;22636:19;;22295:366;;;:::o;22667:419::-;22833:4;22871:2;22860:9;22856:18;22848:26;;22920:9;22914:4;22910:20;22906:1;22895:9;22891:17;22884:47;22948:131;23074:4;22948:131;:::i;:::-;22940:139;;22667:419;;;:::o;23092:170::-;23232:22;23228:1;23220:6;23216:14;23209:46;23092:170;:::o;23268:366::-;23410:3;23431:67;23495:2;23490:3;23431:67;:::i;:::-;23424:74;;23507:93;23596:3;23507:93;:::i;:::-;23625:2;23620:3;23616:12;23609:19;;23268:366;;;:::o;23640:419::-;23806:4;23844:2;23833:9;23829:18;23821:26;;23893:9;23887:4;23883:20;23879:1;23868:9;23864:17;23857:47;23921:131;24047:4;23921:131;:::i;:::-;23913:139;;23640:419;;;:::o;24065:229::-;24205:34;24201:1;24193:6;24189:14;24182:58;24274:12;24269:2;24261:6;24257:15;24250:37;24065:229;:::o;24300:366::-;24442:3;24463:67;24527:2;24522:3;24463:67;:::i;:::-;24456:74;;24539:93;24628:3;24539:93;:::i;:::-;24657:2;24652:3;24648:12;24641:19;;24300:366;;;:::o;24672:419::-;24838:4;24876:2;24865:9;24861:18;24853:26;;24925:9;24919:4;24915:20;24911:1;24900:9;24896:17;24889:47;24953:131;25079:4;24953:131;:::i;:::-;24945:139;;24672:419;;;:::o;25097:235::-;25237:34;25233:1;25225:6;25221:14;25214:58;25306:18;25301:2;25293:6;25289:15;25282:43;25097:235;:::o;25338:366::-;25480:3;25501:67;25565:2;25560:3;25501:67;:::i;:::-;25494:74;;25577:93;25666:3;25577:93;:::i;:::-;25695:2;25690:3;25686:12;25679:19;;25338:366;;;:::o;25710:419::-;25876:4;25914:2;25903:9;25899:18;25891:26;;25963:9;25957:4;25953:20;25949:1;25938:9;25934:17;25927:47;25991:131;26117:4;25991:131;:::i;:::-;25983:139;;25710:419;;;:::o;26135:178::-;26275:30;26271:1;26263:6;26259:14;26252:54;26135:178;:::o;26319:366::-;26461:3;26482:67;26546:2;26541:3;26482:67;:::i;:::-;26475:74;;26558:93;26647:3;26558:93;:::i;:::-;26676:2;26671:3;26667:12;26660:19;;26319:366;;;:::o;26691:419::-;26857:4;26895:2;26884:9;26880:18;26872:26;;26944:9;26938:4;26934:20;26930:1;26919:9;26915:17;26908:47;26972:131;27098:4;26972:131;:::i;:::-;26964:139;;26691:419;;;:::o;27116:236::-;27256:34;27252:1;27244:6;27240:14;27233:58;27325:19;27320:2;27312:6;27308:15;27301:44;27116:236;:::o;27358:366::-;27500:3;27521:67;27585:2;27580:3;27521:67;:::i;:::-;27514:74;;27597:93;27686:3;27597:93;:::i;:::-;27715:2;27710:3;27706:12;27699:19;;27358:366;;;:::o;27730:419::-;27896:4;27934:2;27923:9;27919:18;27911:26;;27983:9;27977:4;27973:20;27969:1;27958:9;27954:17;27947:47;28011:131;28137:4;28011:131;:::i;:::-;28003:139;;27730:419;;;:::o;28155:775::-;28388:4;28426:3;28415:9;28411:19;28403:27;;28440:71;28508:1;28497:9;28493:17;28484:6;28440:71;:::i;:::-;28521:72;28589:2;28578:9;28574:18;28565:6;28521:72;:::i;:::-;28603;28671:2;28660:9;28656:18;28647:6;28603:72;:::i;:::-;28685;28753:2;28742:9;28738:18;28729:6;28685:72;:::i;:::-;28767:73;28835:3;28824:9;28820:19;28811:6;28767:73;:::i;:::-;28850;28918:3;28907:9;28903:19;28894:6;28850:73;:::i;:::-;28155:775;;;;;;;;;:::o;28936:233::-;29076:34;29072:1;29064:6;29060:14;29053:58;29145:16;29140:2;29132:6;29128:15;29121:41;28936:233;:::o;29175:366::-;29317:3;29338:67;29402:2;29397:3;29338:67;:::i;:::-;29331:74;;29414:93;29503:3;29414:93;:::i;:::-;29532:2;29527:3;29523:12;29516:19;;29175:366;;;:::o;29547:419::-;29713:4;29751:2;29740:9;29736:18;29728:26;;29800:9;29794:4;29790:20;29786:1;29775:9;29771:17;29764:47;29828:131;29954:4;29828:131;:::i;:::-;29820:139;;29547:419;;;:::o;29972:223::-;30112:34;30108:1;30100:6;30096:14;30089:58;30181:6;30176:2;30168:6;30164:15;30157:31;29972:223;:::o;30201:366::-;30343:3;30364:67;30428:2;30423:3;30364:67;:::i;:::-;30357:74;;30440:93;30529:3;30440:93;:::i;:::-;30558:2;30553:3;30549:12;30542:19;;30201:366;;;:::o;30573:419::-;30739:4;30777:2;30766:9;30762:18;30754:26;;30826:9;30820:4;30816:20;30812:1;30801:9;30797:17;30790:47;30854:131;30980:4;30854:131;:::i;:::-;30846:139;;30573:419;;;:::o;30998:134::-;31056:9;31089:37;31120:5;31089:37;:::i;:::-;31076:50;;30998:134;;;:::o;31138:147::-;31233:45;31272:5;31233:45;:::i;:::-;31228:3;31221:58;31138:147;;:::o;31291:348::-;31420:4;31458:2;31447:9;31443:18;31435:26;;31471:79;31547:1;31536:9;31532:17;31523:6;31471:79;:::i;:::-;31560:72;31628:2;31617:9;31613:18;31604:6;31560:72;:::i;:::-;31291:348;;;;;:::o;31645:247::-;31785:34;31781:1;31773:6;31769:14;31762:58;31854:30;31849:2;31841:6;31837:15;31830:55;31645:247;:::o;31898:366::-;32040:3;32061:67;32125:2;32120:3;32061:67;:::i;:::-;32054:74;;32137:93;32226:3;32137:93;:::i;:::-;32255:2;32250:3;32246:12;32239:19;;31898:366;;;:::o;32270:419::-;32436:4;32474:2;32463:9;32459:18;32451:26;;32523:9;32517:4;32513:20;32509:1;32498:9;32494:17;32487:47;32551:131;32677:4;32551:131;:::i;:::-;32543:139;;32270:419;;;:::o;32695:348::-;32824:4;32862:2;32851:9;32847:18;32839:26;;32875:71;32943:1;32932:9;32928:17;32919:6;32875:71;:::i;:::-;32956:80;33032:2;33021:9;33017:18;33008:6;32956:80;:::i;:::-;32695:348;;;;;:::o;33049:179::-;33189:31;33185:1;33177:6;33173:14;33166:55;33049:179;:::o;33234:366::-;33376:3;33397:67;33461:2;33456:3;33397:67;:::i;:::-;33390:74;;33473:93;33562:3;33473:93;:::i;:::-;33591:2;33586:3;33582:12;33575:19;;33234:366;;;:::o;33606:419::-;33772:4;33810:2;33799:9;33795:18;33787:26;;33859:9;33853:4;33849:20;33845:1;33834:9;33830:17;33823:47;33887:131;34013:4;33887:131;:::i;:::-;33879:139;;33606:419;;;:::o;34031:232::-;34171:34;34167:1;34159:6;34155:14;34148:58;34240:15;34235:2;34227:6;34223:15;34216:40;34031:232;:::o;34269:366::-;34411:3;34432:67;34496:2;34491:3;34432:67;:::i;:::-;34425:74;;34508:93;34597:3;34508:93;:::i;:::-;34626:2;34621:3;34617:12;34610:19;;34269:366;;;:::o;34641:419::-;34807:4;34845:2;34834:9;34830:18;34822:26;;34894:9;34888:4;34884:20;34880:1;34869:9;34865:17;34858:47;34922:131;35048:4;34922:131;:::i;:::-;34914:139;;34641:419;;;:::o;35066:143::-;35123:5;35154:6;35148:13;35139:22;;35170:33;35197:5;35170:33;:::i;:::-;35066:143;;;;:::o;35215:351::-;35285:6;35334:2;35322:9;35313:7;35309:23;35305:32;35302:119;;;35340:79;;:::i;:::-;35302:119;35460:1;35485:64;35541:7;35532:6;35521:9;35517:22;35485:64;:::i;:::-;35475:74;;35431:128;35215:351;;;;:::o;35572:332::-;35693:4;35731:2;35720:9;35716:18;35708:26;;35744:71;35812:1;35801:9;35797:17;35788:6;35744:71;:::i;:::-;35825:72;35893:2;35882:9;35878:18;35869:6;35825:72;:::i;:::-;35572:332;;;;;:::o;35910:177::-;36050:29;36046:1;36038:6;36034:14;36027:53;35910:177;:::o;36093:366::-;36235:3;36256:67;36320:2;36315:3;36256:67;:::i;:::-;36249:74;;36332:93;36421:3;36332:93;:::i;:::-;36450:2;36445:3;36441:12;36434:19;;36093:366;;;:::o;36465:419::-;36631:4;36669:2;36658:9;36654:18;36646:26;;36718:9;36712:4;36708:20;36704:1;36693:9;36689:17;36682:47;36746:131;36872:4;36746:131;:::i;:::-;36738:139;;36465:419;;;:::o;36890:233::-;37030:34;37026:1;37018:6;37014:14;37007:58;37099:16;37094:2;37086:6;37082:15;37075:41;36890:233;:::o;37129:366::-;37271:3;37292:67;37356:2;37351:3;37292:67;:::i;:::-;37285:74;;37368:93;37457:3;37368:93;:::i;:::-;37486:2;37481:3;37477:12;37470:19;;37129:366;;;:::o;37501:419::-;37667:4;37705:2;37694:9;37690:18;37682:26;;37754:9;37748:4;37744:20;37740:1;37729:9;37725:17;37718:47;37782:131;37908:4;37782:131;:::i;:::-;37774:139;;37501:419;;;:::o;37926:174::-;38066:26;38062:1;38054:6;38050:14;38043:50;37926:174;:::o;38106:366::-;38248:3;38269:67;38333:2;38328:3;38269:67;:::i;:::-;38262:74;;38345:93;38434:3;38345:93;:::i;:::-;38463:2;38458:3;38454:12;38447:19;;38106:366;;;:::o;38478:419::-;38644:4;38682:2;38671:9;38667:18;38659:26;;38731:9;38725:4;38721:20;38717:1;38706:9;38702:17;38695:47;38759:131;38885:4;38759:131;:::i;:::-;38751:139;;38478:419;;;:::o;38903:225::-;39043:34;39039:1;39031:6;39027:14;39020:58;39112:8;39107:2;39099:6;39095:15;39088:33;38903:225;:::o;39134:366::-;39276:3;39297:67;39361:2;39356:3;39297:67;:::i;:::-;39290:74;;39373:93;39462:3;39373:93;:::i;:::-;39491:2;39486:3;39482:12;39475:19;;39134:366;;;:::o;39506:419::-;39672:4;39710:2;39699:9;39695:18;39687:26;;39759:9;39753:4;39749:20;39745:1;39734:9;39730:17;39723:47;39787:131;39913:4;39787:131;:::i;:::-;39779:139;;39506:419;;;:::o;39931:98::-;39982:6;40016:5;40010:12;40000:22;;39931:98;;;:::o;40035:147::-;40136:11;40173:3;40158:18;;40035:147;;;;:::o;40188:246::-;40269:1;40279:113;40293:6;40290:1;40287:13;40279:113;;;40378:1;40373:3;40369:11;40363:18;40359:1;40354:3;40350:11;40343:39;40315:2;40312:1;40308:10;40303:15;;40279:113;;;40426:1;40417:6;40412:3;40408:16;40401:27;40250:184;40188:246;;;:::o;40440:386::-;40544:3;40572:38;40604:5;40572:38;:::i;:::-;40626:88;40707:6;40702:3;40626:88;:::i;:::-;40619:95;;40723:65;40781:6;40776:3;40769:4;40762:5;40758:16;40723:65;:::i;:::-;40813:6;40808:3;40804:16;40797:23;;40548:278;40440:386;;;;:::o;40832:271::-;40962:3;40984:93;41073:3;41064:6;40984:93;:::i;:::-;40977:100;;41094:3;41087:10;;40832:271;;;;:::o;41109:181::-;41249:33;41245:1;41237:6;41233:14;41226:57;41109:181;:::o;41296:366::-;41438:3;41459:67;41523:2;41518:3;41459:67;:::i;:::-;41452:74;;41535:93;41624:3;41535:93;:::i;:::-;41653:2;41648:3;41644:12;41637:19;;41296:366;;;:::o;41668:419::-;41834:4;41872:2;41861:9;41857:18;41849:26;;41921:9;41915:4;41911:20;41907:1;41896:9;41892:17;41885:47;41949:131;42075:4;41949:131;:::i;:::-;41941:139;;41668:419;;;:::o;42093:182::-;42233:34;42229:1;42221:6;42217:14;42210:58;42093:182;:::o;42281:366::-;42423:3;42444:67;42508:2;42503:3;42444:67;:::i;:::-;42437:74;;42520:93;42609:3;42520:93;:::i;:::-;42638:2;42633:3;42629:12;42622:19;;42281:366;;;:::o;42653:419::-;42819:4;42857:2;42846:9;42842:18;42834:26;;42906:9;42900:4;42896:20;42892:1;42881:9;42877:17;42870:47;42934:131;43060:4;42934:131;:::i;:::-;42926:139;;42653:419;;;:::o;43078:442::-;43227:4;43265:2;43254:9;43250:18;43242:26;;43278:71;43346:1;43335:9;43331:17;43322:6;43278:71;:::i;:::-;43359:72;43427:2;43416:9;43412:18;43403:6;43359:72;:::i;:::-;43441;43509:2;43498:9;43494:18;43485:6;43441:72;:::i;:::-;43078:442;;;;;;:::o;43526:223::-;43666:34;43662:1;43654:6;43650:14;43643:58;43735:6;43730:2;43722:6;43718:15;43711:31;43526:223;:::o;43755:366::-;43897:3;43918:67;43982:2;43977:3;43918:67;:::i;:::-;43911:74;;43994:93;44083:3;43994:93;:::i;:::-;44112:2;44107:3;44103:12;44096:19;;43755:366;;;:::o;44127:419::-;44293:4;44331:2;44320:9;44316:18;44308:26;;44380:9;44374:4;44370:20;44366:1;44355:9;44351:17;44344:47;44408:131;44534:4;44408:131;:::i;:::-;44400:139;;44127:419;;;:::o;44552:191::-;44592:3;44611:20;44629:1;44611:20;:::i;:::-;44606:25;;44645:20;44663:1;44645:20;:::i;:::-;44640:25;;44688:1;44685;44681:9;44674:16;;44709:3;44706:1;44703:10;44700:36;;;44716:18;;:::i;:::-;44700:36;44552:191;;;;:::o
Swarm Source
ipfs://50952850847f5a43f03f2c74a841ccb3b8cc7599f0a35f70e2f8f317c34c41d4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $21.47 | 6,496.7701 | $139,511.64 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.