Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 49 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Un Stake | 12861977 | 1305 days ago | IN | 0 ETH | 0.00632077 | ||||
Un Stake | 12861959 | 1305 days ago | IN | 0 ETH | 0.00609535 | ||||
Un Stake | 12861954 | 1305 days ago | IN | 0 ETH | 0.00079741 | ||||
Un Stake | 12861954 | 1305 days ago | IN | 0 ETH | 0.00632077 | ||||
Stake | 12861831 | 1305 days ago | IN | 0 ETH | 0.0007836 | ||||
Stake | 12861831 | 1305 days ago | IN | 0 ETH | 0.00548915 | ||||
Un Stake | 12861791 | 1305 days ago | IN | 0 ETH | 0.00496658 | ||||
Stake | 12861738 | 1305 days ago | IN | 0 ETH | 0.0068253 | ||||
Un Stake | 12861729 | 1305 days ago | IN | 0 ETH | 0.00695285 | ||||
Stake | 12861719 | 1305 days ago | IN | 0 ETH | 0.00664121 | ||||
Stake | 12861691 | 1305 days ago | IN | 0 ETH | 0.00692041 | ||||
Stake | 12861684 | 1305 days ago | IN | 0 ETH | 0.00787495 | ||||
Stake | 12861676 | 1305 days ago | IN | 0 ETH | 0.0095454 | ||||
Un Stake | 12861658 | 1305 days ago | IN | 0 ETH | 0.00925591 | ||||
Stake | 12861650 | 1305 days ago | IN | 0 ETH | 0.01050046 | ||||
Un Stake | 12861638 | 1305 days ago | IN | 0 ETH | 0.0066834 | ||||
Stake | 12861623 | 1305 days ago | IN | 0 ETH | 0.01327787 | ||||
Un Stake | 12861621 | 1305 days ago | IN | 0 ETH | 0.01219071 | ||||
Stake | 12861504 | 1305 days ago | IN | 0 ETH | 0.01312558 | ||||
Un Stake | 12861457 | 1305 days ago | IN | 0 ETH | 0.01465065 | ||||
Un Stake | 12861442 | 1305 days ago | IN | 0 ETH | 0.01512471 | ||||
Un Stake | 12861388 | 1305 days ago | IN | 0 ETH | 0.01625342 | ||||
Un Stake | 12861382 | 1305 days ago | IN | 0 ETH | 0.01467323 | ||||
Stake | 12861374 | 1305 days ago | IN | 0 ETH | 0.0147976 | ||||
Un Stake | 12861333 | 1305 days ago | IN | 0 ETH | 0.00242071 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
YouswapFactoryV2
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-15 */ // File: @openzeppelin/contracts/utils/Address.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: localhost/contract/library/ErrorCode.sol pragma solidity 0.7.4; library ErrorCode { string constant FORBIDDEN = 'YouSwap:FORBIDDEN'; string constant IDENTICAL_ADDRESSES = 'YouSwap:IDENTICAL_ADDRESSES'; string constant ZERO_ADDRESS = 'YouSwap:ZERO_ADDRESS'; string constant INVALID_ADDRESSES = 'YouSwap:INVALID_ADDRESSES'; string constant BALANCE_INSUFFICIENT = 'YouSwap:BALANCE_INSUFFICIENT'; string constant REWARDTOTAL_LESS_THAN_REWARDPROVIDE = 'YouSwap:REWARDTOTAL_LESS_THAN_REWARDPROVIDE'; string constant PARAMETER_TOO_LONG = 'YouSwap:PARAMETER_TOO_LONG'; string constant REGISTERED = 'YouSwap:REGISTERED'; string constant MINING_NOT_STARTED = 'YouSwap:MINING_NOT_STARTED'; string constant END_OF_MINING = 'YouSwap:END_OF_MINING'; string constant POOL_NOT_EXIST_OR_END_OF_MINING = 'YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING'; } // File: localhost/contract/interface/IYouswapInviteV1.sol pragma solidity 0.7.4; interface IYouswapInviteV1 { struct UserInfo { address upper;//上级 address[] lowers;//下级 uint256 startBlock;//邀请块高 } event InviteV1(address indexed owner, address indexed upper, uint256 indexed height);//被邀请人的地址,邀请人的地址,邀请块高 function inviteCount() external view returns (uint256);//邀请人数 function inviteUpper1(address) external view returns (address);//上级邀请 function inviteUpper2(address) external view returns (address, address);//上级邀请 function inviteLower1(address) external view returns (address[] memory);//下级邀请 function inviteLower2(address) external view returns (address[] memory, address[] memory);//下级邀请 function inviteLower2Count(address) external view returns (uint256, uint256);//下级邀请 function register() external returns (bool);//注册邀请关系 function acceptInvitation(address) external returns (bool);//注册邀请关系 function inviteBatch(address[] memory) external returns (uint, uint);//注册邀请关系:输入数量,成功数量 } // File: localhost/contract/implement/YouswapInviteV1.sol pragma solidity 0.7.4; contract YouswapInviteV1 is IYouswapInviteV1 { address public constant ZERO = address(0); uint256 public startBlock; address[] public inviteUserInfoV1; mapping(address => UserInfo) public inviteUserInfoV2; constructor () { startBlock = block.number; } function inviteCount() override external view returns (uint256) { return inviteUserInfoV1.length; } function inviteUpper1(address _owner) override external view returns (address) { return inviteUserInfoV2[_owner].upper; } function inviteUpper2(address _owner) override external view returns (address, address) { address upper1 = inviteUserInfoV2[_owner].upper; address upper2 = address(0); if (address(0) != upper1) { upper2 = inviteUserInfoV2[upper1].upper; } return (upper1, upper2); } function inviteLower1(address _owner) override external view returns (address[] memory) { return inviteUserInfoV2[_owner].lowers; } function inviteLower2(address _owner) override external view returns (address[] memory, address[] memory) { address[] memory lowers1 = inviteUserInfoV2[_owner].lowers; uint256 count = 0; uint256 lowers1Len = lowers1.length; for (uint256 i = 0; i < lowers1Len; i++) { count += inviteUserInfoV2[lowers1[i]].lowers.length; } address[] memory lowers; address[] memory lowers2 = new address[](count); count = 0; for (uint256 i = 0; i < lowers1Len; i++) { lowers = inviteUserInfoV2[lowers1[i]].lowers; for (uint256 j = 0; j < lowers.length; j++) { lowers2[count] = lowers[j]; count++; } } return (lowers1, lowers2); } function inviteLower2Count(address _owner) override external view returns (uint256, uint256) { address[] memory lowers1 = inviteUserInfoV2[_owner].lowers; uint256 lowers2Len = 0; uint256 len = lowers1.length; for (uint256 i = 0; i < len; i++) { lowers2Len += inviteUserInfoV2[lowers1[i]].lowers.length; } return (lowers1.length, lowers2Len); } function register() override external returns (bool) { UserInfo storage user = inviteUserInfoV2[tx.origin]; require(0 == user.startBlock, ErrorCode.REGISTERED); user.upper = ZERO; user.startBlock = block.number; inviteUserInfoV1.push(tx.origin); emit InviteV1(tx.origin, user.upper, user.startBlock); return true; } function acceptInvitation(address _inviter) override external returns (bool) { require(msg.sender != _inviter, ErrorCode.FORBIDDEN); UserInfo storage user = inviteUserInfoV2[msg.sender]; require(0 == user.startBlock, ErrorCode.REGISTERED); UserInfo storage upper = inviteUserInfoV2[_inviter]; if (0 == upper.startBlock) { upper.upper = ZERO; upper.startBlock = block.number; inviteUserInfoV1.push(_inviter); emit InviteV1(_inviter, upper.upper, upper.startBlock); } user.upper = _inviter; upper.lowers.push(msg.sender); user.startBlock = block.number; inviteUserInfoV1.push(msg.sender); emit InviteV1(msg.sender, user.upper, user.startBlock); return true; } function inviteBatch(address[] memory _invitees) override external returns (uint, uint) { uint len = _invitees.length; require(len <= 100, ErrorCode.PARAMETER_TOO_LONG); UserInfo storage user = inviteUserInfoV2[msg.sender]; if (0 == user.startBlock) { user.upper = ZERO; user.startBlock = block.number; inviteUserInfoV1.push(msg.sender); emit InviteV1(msg.sender, user.upper, user.startBlock); } uint count = 0; for (uint i = 0; i < len; i++) { if ((address(0) != _invitees[i]) && (msg.sender != _invitees[i])) { UserInfo storage lower = inviteUserInfoV2[_invitees[i]]; if (0 == lower.startBlock) { lower.upper = msg.sender; lower.startBlock = block.number; user.lowers.push(_invitees[i]); inviteUserInfoV1.push(_invitees[i]); count++; emit InviteV1(_invitees[i], msg.sender, lower.startBlock); } } } return (len, count); } } // File: localhost/contract/interface/ITokenYou.sol pragma solidity 0.7.4; interface ITokenYou { function mint(address recipient, uint256 amount) external; function decimals() external view returns (uint8); } // File: localhost/contract/interface/IYouswapFactoryV2.sol pragma solidity 0.7.4; /** 挖矿 */ interface IYouswapFactoryV2 { /** 矿池可视化信息 */ struct PoolViewInfo { address token;//token合约地址 string name;//名称 uint256 multiple;//奖励倍数 uint256 priority;//排序 } /** 矿池质押信息 */ struct PoolStakeInfo { uint256 startBlock;//挖矿开始块高 address token;//token合约地址 uint256 amount;//质押数量 uint256 lastRewardBlock;//最后发放奖励块高 uint256 totalPower;//总算力 uint256 powerRatio;//质押数量到算力系数 uint256 maxStakeAmount;//最大质押数量 uint256 endBlock;//挖矿结束块高 } /** 矿池奖励信息 */ struct PoolRewardInfo { address token;//挖矿奖励币种:A/B/C uint256 rewardTotal;//矿池总奖励 uint256 rewardPerBlock;//单个区块奖励 uint256 rewardProvide;//矿池已发放奖励 uint256 rewardPerShare;//单位算力奖励 } /** 用户质押信息 */ struct UserStakeInfo { uint256 startBlock;//质押开始块高 uint256 amount;//质押数量 uint256 invitePower;//邀请算力 uint256 stakePower;//质押算力 uint256[] invitePendingRewards;//待领取奖励 uint256[] stakePendingRewards;//待领取奖励 uint256[] inviteRewardDebts;//邀请负债 uint256[] stakeRewardDebts;//质押负债 } //////////////////////////////////////////////////////////////////////////////////// /** 自邀请 self:Sender地址 */ event InviteRegister(address indexed self); /** 更新矿池信息 action:true(新建矿池),false(更新矿池) poolId:矿池ID name:矿池名称 token:质押token合约地址 powerRatio:质押数量到算力系数=最小质押数量 maxStakeAmount:最大质押数量 startBlock:矿池开始挖矿块高 multiple:矿池奖励倍数 priority:矿池排序 tokens:挖矿奖励token合约地址 rewardTotal:挖矿总奖励数量 rewardPerBlock:区块奖励数量 */ event UpdatePool(bool action, uint256 poolId, string name, address indexed token, uint256 powerRatio, uint256 maxStakeAmount, uint256 startBlock, uint256 multiple, uint256 priority, address[] tokens, uint256[] _rewardTotals, uint256[] rewardPerBlocks); /** 矿池挖矿结束 poolId:矿池ID */ event EndPool(uint256 poolId); /** 质押 poolId:矿池ID token:token合约地址 from:质押转出地址 amount:质押数量 */ event Stake(uint256 poolId, address indexed token, address indexed from, uint256 amount); /** 算力 poolId:矿池ID token:token合约地址 totalPower:矿池总算力 owner:用户地址 ownerInvitePower:用户邀请算力 ownerStakePower:用户质押算力 upper1:上1级地址 upper1InvitePower:上1级邀请算力 upper2:上2级地址 upper2InvitePower:上2级邀请算力 */ event UpdatePower(uint256 poolId, address token, uint256 totalPower, address indexed owner, uint256 ownerInvitePower, uint256 ownerStakePower, address indexed upper1, uint256 upper1InvitePower, address indexed upper2, uint256 upper2InvitePower); /** 解质押 poolId:矿池ID token:token合约地址 to:解质押转入地址 amount:解质押数量 */ event UnStake(uint256 poolId, address indexed token, address indexed to, uint256 amount); /** 提取奖励 poolId:矿池ID token:token合约地址 to:奖励转入地址 inviteAmount:奖励数量 stakeAmount:奖励数量 */ event WithdrawReward(uint256 poolId, address indexed token, address indexed to, uint256 inviteAmount, uint256 stakeAmount); /** 挖矿 poolId:矿池ID token:token合约地址 amount:奖励数量 */ event Mint(uint256 poolId, address indexed token, uint256 amount); /** 紧急提取奖励事件 token:领取token合约地址 to:领取地址 amount:领取token数量 */ event SafeWithdraw(address indexed token, address indexed to, uint256 amount); /** 转移Owner oldOwner:旧Owner newOwner:新Owner */ event TransferOwnership(address indexed oldOwner, address indexed newOwner); //////////////////////////////////////////////////////////////////////////////////// /** 修改OWNER */ function transferOwnership(address owner) external; /** 质押 */ function stake(uint256 poolId, uint256 amount) external; /** 解质押并提取奖励 */ function unStake(uint256 poolId, uint256 amount) external; /** 批量解质押并提取奖励 */ function unStakes(uint256[] memory _poolIds) external; /** 提取奖励 */ function withdrawReward(uint256 poolId) external; /** 批量提取奖励 */ function withdrawRewards(uint256[] memory _poolIds) external; /** 紧急转移token */ function safeWithdraw(address token, address to, uint256 amount) external; /** 算力占比 */ function powerScale(uint256 poolId, address user) external view returns (uint256, uint256); /** 待领取的奖励 */ function pendingRewardV2(uint256 poolId, address user) external view returns (address[] memory, uint256[] memory); function pendingRewardV3(uint256 poolId, address user) external view returns (address[] memory, uint256[] memory, uint256[] memory); /** 通过token查询矿池编号 */ function poolNumbers(address token) external view returns (uint256[] memory); /** 矿池ID */ function poolIdsV2() external view returns (uint256[] memory); /** 质押数量范围 */ function stakeRange(uint256 poolId) external view returns (uint256, uint256); /** 质押数量到算力系数 */ function getPowerRatio(uint256 poolId) external view returns (uint256); function getRewardInfo(uint256 poolId, address user, uint256 index) external view returns (uint256, uint256, uint256, uint256); /** 设置运营权限 */ function setOperateOwner(address user, bool state) external; //////////////////////////////////////////////////////////////////////////////////// /** 新建矿池 */ function addPool(string memory name, address token, uint256 powerRatio, uint256 startBlock, uint256 multiple, uint256 priority, address[] memory tokens, uint256[] memory rewardTotals, uint256[] memory rewardPerBlocks) external; /** 修改矿池区块奖励 */ function setRewardPerBlock(uint256 poolId, address token, uint256 rewardPerBlock) external; /** 修改矿池总奖励 */ function setRewardTotal(uint256 poolId, address token, uint256 rewardTotal) external; /** 修改矿池名称 */ function setName(uint256 poolId, string memory name) external; /** 修改矿池倍数 */ function setMultiple(uint256 poolId, uint256 multiple) external; /** 修改矿池排序 */ function setPriority(uint256 poolId, uint256 priority) external; /** 修改矿池最大可质押数量 */ function setMaxStakeAmount(uint256 poolId, uint256 maxStakeAmount) external; //////////////////////////////////////////////////////////////////////////////////// } // File: localhost/contract/implement/YouswapFactoryV2.sol pragma solidity 0.7.4; contract YouswapFactoryV2 is IYouswapFactoryV2 { using SafeMath for uint256; using SafeERC20 for IERC20; address public constant ZERO = address(0); uint256 public constant INVITE_SELF_REWARD = 5;//质押自奖励,5% uint256 public constant INVITE1_REWARD = 15;//1级邀请奖励,15% uint256 public constant INVITE2_REWARD = 10;//2级邀请奖励,10% uint256 public deployBlock;//合约部署块高 address public owner;//所有权限 mapping(address => bool) public operateOwner;//运营权限 ITokenYou public you;//you contract YouswapInviteV1 public invite;//invite contract uint256 public poolCount = 0;//矿池数量 uint256[] public poolIds;//矿池ID mapping(uint256 => PoolViewInfo) public poolViewInfos;//矿池可视化信息,poolID->PoolViewInfo mapping(uint256 => PoolStakeInfo) public poolStakeInfos;//矿池质押信息,poolID->PoolStakeInfo mapping(uint256 => PoolRewardInfo[]) public poolRewardInfos;//矿池奖励信息,poolID->PoolRewardInfo[] mapping(uint256 => mapping(address => UserStakeInfo)) public userStakeInfos;//用户质押信息,poolID->user-UserStakeInfo mapping(address => uint256) public tokenPendingRewards;//现存token奖励数量,token-amount mapping(address => mapping(address => uint256)) public userReceiveRewards;//用户已领取数量,token->user->amount modifier onlyOwner() {//校验owner权限 require(owner == msg.sender, "YouSwap:FORBIDDEN_NOT_OWNER"); _; } modifier onlyOperater() {//校验运营权限 require(operateOwner[msg.sender], "YouSwap:FORBIDDEN_NOT_OPERATER"); _; } constructor (ITokenYou _you, YouswapInviteV1 _invite) { deployBlock = block.number; owner = msg.sender; invite = _invite; you = _you; _setOperateOwner(owner, true);//给owner授权运营权限 } /** 修改OWNER */ function transferOwnership(address _owner) override external onlyOwner { require(ZERO != _owner, "YouSwap:INVALID_ADDRESSES"); emit TransferOwnership(owner, _owner); owner = _owner; } /** 质押 */ function stake(uint256 poolId, uint256 amount) override external { require(0 < amount, "YouSwap:PARAMETER_ERROR"); PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId]; require((ZERO != poolStakeInfo.token) && (poolStakeInfo.startBlock <= block.number), "YouSwap:POOL_NOT_EXIST_OR_MINT_NOT_START");//是否开启挖矿 require((poolStakeInfo.powerRatio <= amount) && (poolStakeInfo.amount.add(amount) < poolStakeInfo.maxStakeAmount), "YouSwap:STAKE_AMOUNT_TOO_SMALL_OR_TOO_LARGE"); (, uint256 startBlock) = invite.inviteUserInfoV2(msg.sender);//sender是否注册邀请关系 if (0 == startBlock) { invite.register();//sender注册邀请关系 emit InviteRegister(msg.sender); } IERC20(poolStakeInfo.token).safeTransferFrom(msg.sender, address(this), amount);//转移sender的质押资产到this (address upper1, address upper2) = invite.inviteUpper2(msg.sender);//获取上2级邀请关系 initRewardInfo(poolId, msg.sender, upper1, upper2); uint256[] memory rewardPerShares = computeReward(poolId);//计算单位算力奖励 provideReward(poolId, rewardPerShares, msg.sender, upper1, upper2);//给sender发放收益,给upper1,upper2增加待领取收益 addPower(poolId, msg.sender, amount, poolStakeInfo.powerRatio, upper1, upper2);//增加sender,upper1,upper2算力 setRewardDebt(poolId, rewardPerShares, msg.sender, upper1, upper2);//重置sender,upper1,upper2负债 emit Stake(poolId, poolStakeInfo.token, msg.sender, amount); } /** 解质押并提取奖励 */ function unStake(uint256 poolId, uint256 amount) override external { _unStake(poolId, amount); } /** 批量解质押并提取奖励 */ function unStakes(uint256[] memory _poolIds) override external { require((0 < _poolIds.length) && (50 >= _poolIds.length), "YouSwap:PARAMETER_ERROR_TOO_SHORT_OR_LONG"); uint256 amount; uint256 poolId; for(uint i = 0; i < _poolIds.length; i++) { poolId = _poolIds[i]; amount = userStakeInfos[poolId][msg.sender].amount;//sender的质押数量 if (0 < amount) { _unStake(poolId, amount); } } } /** 提取奖励 */ function withdrawReward(uint256 poolId) override external { _withdrawReward(poolId); } /** 批量提取奖励 */ function withdrawRewards(uint256[] memory _poolIds) override external { require((0 < _poolIds.length) && (50 >= _poolIds.length), "YouSwap:PARAMETER_ERROR_TOO_SHORT_OR_LONG"); for(uint i = 0; i < _poolIds.length; i++) { _withdrawReward(_poolIds[i]); } } /** 紧急转移token */ function safeWithdraw(address token, address to, uint256 amount) override external onlyOwner { require((ZERO != token) && (ZERO != to) && (0 < amount), "YouSwap:ZERO_ADDRESS_OR_ZERO_AMOUNT"); require(IERC20(token).balanceOf(address(this)) >= amount, "YouSwap:BALANCE_INSUFFICIENT"); IERC20(token).safeTransfer(to, amount);//紧急转移资产到to地址 emit SafeWithdraw(token, to, amount); } /** 算力占比 */ function powerScale(uint256 poolId, address user) override external view returns (uint256, uint256) { PoolStakeInfo memory poolStakeInfo = poolStakeInfos[poolId]; if (0 == poolStakeInfo.totalPower) { return (0, 0); } UserStakeInfo memory userStakeInfo = userStakeInfos[poolId][user]; return (userStakeInfo.invitePower.add(userStakeInfo.stakePower), poolStakeInfo.totalPower); } /** 待领取的奖励 */ function pendingRewardV2(uint256 poolId, address user) override external view returns (address[] memory, uint256[] memory) { PoolRewardInfo[] memory _poolRewardInfos = poolRewardInfos[poolId]; address[] memory tokens = new address[](_poolRewardInfos.length); uint256[] memory pendingRewards = new uint256[](_poolRewardInfos.length); PoolStakeInfo memory poolStakeInfo = poolStakeInfos[poolId]; if (ZERO != poolStakeInfo.token) { uint256 totalReward = 0; uint256 rewardPre; UserStakeInfo memory userStakeInfo = userStakeInfos[poolId][user]; for(uint i = 0; i < _poolRewardInfos.length; i++) { PoolRewardInfo memory poolRewardInfo = _poolRewardInfos[i]; if (poolStakeInfo.startBlock <= block.number) { totalReward = 0; if (userStakeInfo.invitePendingRewards.length == _poolRewardInfos.length) { if (0 < poolStakeInfo.totalPower) { rewardPre = block.number.sub(poolStakeInfo.lastRewardBlock).mul(poolRewardInfo.rewardPerBlock);//待快照奖励 if (poolRewardInfo.rewardProvide.add(rewardPre) >= poolRewardInfo.rewardTotal) {//是否超出总奖励 rewardPre = poolRewardInfo.rewardTotal.sub(poolRewardInfo.rewardProvide);//核减超出奖励 } poolRewardInfo.rewardPerShare = poolRewardInfo.rewardPerShare.add(rewardPre.mul(1e24).div(poolStakeInfo.totalPower));//累加待快照的单位算力奖励 } totalReward = userStakeInfo.invitePendingRewards[i];//待领取奖励 totalReward = totalReward.add(userStakeInfo.stakePendingRewards[i]);//待领取奖励 totalReward = totalReward.add(userStakeInfo.invitePower.mul(poolRewardInfo.rewardPerShare).sub(userStakeInfo.inviteRewardDebts[i]).div(1e24));//待快照的邀请奖励 totalReward = totalReward.add(userStakeInfo.stakePower.mul(poolRewardInfo.rewardPerShare).sub(userStakeInfo.stakeRewardDebts[i]).div(1e24));//待快照的质押奖励 } pendingRewards[i] = totalReward; } tokens[i] = poolRewardInfo.token; } } return (tokens, pendingRewards); } /** 待领取的奖励 */ function pendingRewardV3(uint256 poolId, address user) override external view returns (address[] memory, uint256[] memory, uint256[] memory) { PoolRewardInfo[] memory _poolRewardInfos = poolRewardInfos[poolId]; address[] memory tokens = new address[](_poolRewardInfos.length); uint256[] memory invitePendingRewards = new uint256[](_poolRewardInfos.length); uint256[] memory stakePendingRewards = new uint256[](_poolRewardInfos.length); PoolStakeInfo memory poolStakeInfo = poolStakeInfos[poolId]; if (ZERO != poolStakeInfo.token) { uint256 inviteReward = 0; uint256 stakeReward = 0; uint256 rewardPre; UserStakeInfo memory userStakeInfo = userStakeInfos[poolId][user]; for(uint i = 0; i < _poolRewardInfos.length; i++) { PoolRewardInfo memory poolRewardInfo = _poolRewardInfos[i]; if (poolStakeInfo.startBlock <= block.number) { inviteReward = 0; stakeReward = 0; if (userStakeInfo.invitePendingRewards.length == _poolRewardInfos.length) { if (0 < poolStakeInfo.totalPower) { rewardPre = block.number.sub(poolStakeInfo.lastRewardBlock).mul(poolRewardInfo.rewardPerBlock);//待快照奖励 if (poolRewardInfo.rewardProvide.add(rewardPre) >= poolRewardInfo.rewardTotal) {//是否超出总奖励 rewardPre = poolRewardInfo.rewardTotal.sub(poolRewardInfo.rewardProvide);//核减超出奖励 } poolRewardInfo.rewardPerShare = poolRewardInfo.rewardPerShare.add(rewardPre.mul(1e24).div(poolStakeInfo.totalPower));//累加待快照的单位算力奖励 } inviteReward = userStakeInfo.invitePendingRewards[i];//待领取奖励 stakeReward = userStakeInfo.stakePendingRewards[i];//待领取奖励 inviteReward = inviteReward.add(userStakeInfo.invitePower.mul(poolRewardInfo.rewardPerShare).sub(userStakeInfo.inviteRewardDebts[i]).div(1e24));//待快照的邀请奖励 stakeReward = stakeReward.add(userStakeInfo.stakePower.mul(poolRewardInfo.rewardPerShare).sub(userStakeInfo.stakeRewardDebts[i]).div(1e24));//待快照的质押奖励 } invitePendingRewards[i] = inviteReward; stakePendingRewards[i] = stakeReward; } tokens[i] = poolRewardInfo.token; } } return (tokens, invitePendingRewards, stakePendingRewards); } /** 通过token查询矿池编号 */ function poolNumbers(address token) override external view returns (uint256[] memory) { uint256 count = 0; for (uint256 i = 0; i < poolIds.length; i++) { if (poolViewInfos[poolIds[i]].token == token) { count = count.add(1); } } uint256[] memory ids = new uint256[](count); count = 0; for (uint i = 0; i < poolIds.length; i++) { if (poolViewInfos[poolIds[i]].token == token) { ids[count] = poolIds[i]; count = count.add(1); } } return ids; } /** 矿池ID */ function poolIdsV2() override external view returns (uint256[] memory) { return poolIds; } /** 质押数量范围 */ function stakeRange(uint256 poolId) override external view returns (uint256, uint256) { PoolStakeInfo memory poolStakeInfo = poolStakeInfos[poolId]; if (ZERO == poolStakeInfo.token) { return (0, 0); } return (poolStakeInfo.powerRatio, poolStakeInfo.maxStakeAmount.sub(poolStakeInfo.amount)); } /** 质押数量到算力系数 */ function getPowerRatio(uint256 poolId) override external view returns (uint256) { return poolStakeInfos[poolId].powerRatio; } function getRewardInfo(uint256 poolId, address user, uint256 index) override external view returns (uint256, uint256, uint256, uint256) { UserStakeInfo memory userStakeInfo = userStakeInfos[poolId][user]; return (userStakeInfo.invitePendingRewards[index], userStakeInfo.stakePendingRewards[index], userStakeInfo.inviteRewardDebts[index], userStakeInfo.stakeRewardDebts[index]); } /** 设置运营权限 */ function setOperateOwner(address user, bool state) override external onlyOwner { _setOperateOwner(user, state); } //////////////////////////////////////////////////////////////////////////////////// /** 新建矿池 */ function addPool(string memory name, address token, uint256 powerRatio, uint256 startBlock, uint256 multiple, uint256 priority, address[] memory tokens, uint256[] memory _rewardTotals, uint256[] memory rewardPerBlocks) override external onlyOperater { require((ZERO != token) && (address(this) != token), "YouSwap:PARAMETER_ERROR_TOKEN"); require(0 < powerRatio, "YouSwap:POWERRATIO_MUST_GREATER_THAN_ZERO"); require((0 < tokens.length) && (10 >= tokens.length) && (tokens.length == _rewardTotals.length) && (tokens.length == rewardPerBlocks.length), "YouSwap:PARAMETER_ERROR_REWARD"); startBlock = startBlock < block.number ? block.number : startBlock;//合法开始块高 uint256 poolId = poolCount.add(20000000);//矿池ID,偏移20000000,与v1区分开 poolIds.push(poolId);//全部矿池ID poolCount = poolCount.add(1);//矿池总数量 PoolViewInfo storage poolViewInfo = poolViewInfos[poolId];//矿池可视化信息 poolViewInfo.token = token;//矿池质押token poolViewInfo.name = name;//矿池名称 poolViewInfo.multiple = multiple;//矿池倍数 if (0 < priority) { poolViewInfo.priority = priority;//矿池优先级 }else { poolViewInfo.priority = poolIds.length.mul(100).add(75);//矿池优先级 } PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId];//矿池质押信息 poolStakeInfo.startBlock = startBlock;//开始块高 poolStakeInfo.token = token;//矿池质押token poolStakeInfo.amount = 0;//矿池质押数量 poolStakeInfo.lastRewardBlock = startBlock.sub(1);//矿池上次快照块高 poolStakeInfo.totalPower = 0;//矿池总算力 poolStakeInfo.powerRatio = powerRatio;//质押数量到算力系数 poolStakeInfo.maxStakeAmount = 0;//最大质押数量 poolStakeInfo.endBlock = 0;//矿池结束块高 uint256 minRewardPerBlock = uint256(0) - uint256(1);//最小区块奖励 for(uint i = 0; i < tokens.length; i++) { require((ZERO != tokens[i]) && (address(this) != tokens[i]), "YouSwap:PARAMETER_ERROR_TOKEN"); require(0 < _rewardTotals[i], "YouSwap:PARAMETER_ERROR_REWARD_TOTAL"); require(0 < rewardPerBlocks[i], "YouSwap:PARAMETER_ERROR_REWARD_PER_BLOCK"); if (address(you) != tokens[i]) {//非you奖励 tokenPendingRewards[tokens[i]] = tokenPendingRewards[tokens[i]].add(_rewardTotals[i]); require(IERC20(tokens[i]).balanceOf(address(this)) >= tokenPendingRewards[tokens[i]], "YouSwap:BALANCE_INSUFFICIENT");//奖励数量是否足额 } PoolRewardInfo memory poolRewardInfo;//矿池奖励信息 poolRewardInfo.token = tokens[i];//奖励token poolRewardInfo.rewardTotal = _rewardTotals[i];//总奖励 poolRewardInfo.rewardPerBlock = rewardPerBlocks[i];//区块奖励 poolRewardInfo.rewardProvide = 0;//已发放奖励 poolRewardInfo.rewardPerShare = 0;//单位算力简历 poolRewardInfos[poolId].push(poolRewardInfo); if (minRewardPerBlock > poolRewardInfo.rewardPerBlock) { minRewardPerBlock = poolRewardInfo.rewardPerBlock; poolStakeInfo.maxStakeAmount = minRewardPerBlock.mul(1e24).mul(poolStakeInfo.powerRatio).div(13); } } sendUpdatePoolEvent(true, poolId); } /** 修改矿池区块奖励 */ function setRewardPerBlock(uint256 poolId, address token, uint256 rewardPerBlock) override external onlyOperater { PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId]; require((ZERO != poolStakeInfo.token) && (0 == poolStakeInfo.endBlock), "YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING");//矿池是否存在、是否结束 computeReward(poolId);//计算单位算力奖励 uint256 minRewardPerBlock = uint256(0) - uint256(1);//最小区块奖励 PoolRewardInfo[] storage _poolRewardInfos = poolRewardInfos[poolId]; for(uint i = 0; i < _poolRewardInfos.length; i++) { if (_poolRewardInfos[i].token == token) { _poolRewardInfos[i].rewardPerBlock = rewardPerBlock;//修改矿池区块奖励 sendUpdatePoolEvent(false, poolId);//更新矿池信息事件 } if (minRewardPerBlock > _poolRewardInfos[i].rewardPerBlock) { minRewardPerBlock = _poolRewardInfos[i].rewardPerBlock; poolStakeInfo.maxStakeAmount = minRewardPerBlock.mul(1e24).mul(poolStakeInfo.powerRatio).div(13); } } } /** 修改矿池总奖励 */ function setRewardTotal(uint256 poolId, address token, uint256 rewardTotal) override external onlyOperater { PoolStakeInfo memory poolStakeInfo = poolStakeInfos[poolId]; require((ZERO != poolStakeInfo.token) && (0 == poolStakeInfo.endBlock), "YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING");//矿池是否存在、是否结束 computeReward(poolId);//计算单位算力奖励 PoolRewardInfo[] storage _poolRewardInfos = poolRewardInfos[poolId]; for(uint i = 0; i < _poolRewardInfos.length; i++) { if (_poolRewardInfos[i].token == token) { require(_poolRewardInfos[i].rewardProvide <= rewardTotal, "YouSwap:REWARDTOTAL_LESS_THAN_REWARDPROVIDE");//新总奖励是否超出已发放奖励 if (address(you) != token) {//非you if (_poolRewardInfos[i].rewardTotal > rewardTotal) {//新总奖励小于旧总奖励 tokenPendingRewards[token] = tokenPendingRewards[token].sub(_poolRewardInfos[i].rewardTotal.sub(rewardTotal));//减少新旧差额 }else {//新总奖励大于旧总奖励 tokenPendingRewards[token] = tokenPendingRewards[token].add(rewardTotal.sub(_poolRewardInfos[i].rewardTotal));//增加新旧差额 } require(IERC20(token).balanceOf(address(this)) >= tokenPendingRewards[token], "YouSwap:BALANCE_INSUFFICIENT");//奖励数量是否足额 } _poolRewardInfos[i].rewardTotal = rewardTotal;//修改矿池总奖励 sendUpdatePoolEvent(false, poolId);//更新矿池信息事件 } } } /** 修改矿池名称 */ function setName(uint256 poolId, string memory name) override external onlyOperater { PoolViewInfo storage poolViewInfo = poolViewInfos[poolId]; require(ZERO != poolViewInfo.token, "YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING");//矿池是否存在 poolViewInfo.name = name;//修改矿池名称 sendUpdatePoolEvent(false, poolId);//更新矿池信息事件 } /** 修改矿池倍数 */ function setMultiple(uint256 poolId, uint256 multiple) override external onlyOperater { PoolViewInfo storage poolViewInfo = poolViewInfos[poolId]; require(ZERO != poolViewInfo.token, "YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING");//矿池是否存在 poolViewInfo.multiple = multiple;//修改矿池倍数 sendUpdatePoolEvent(false, poolId);//更新矿池信息事件 } /** 修改矿池排序 */ function setPriority(uint256 poolId, uint256 priority) override external onlyOperater { PoolViewInfo storage poolViewInfo = poolViewInfos[poolId]; require(ZERO != poolViewInfo.token, "YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING");//矿池是否存在 poolViewInfo.priority = priority;//修改矿池排序 sendUpdatePoolEvent(false, poolId);//更新矿池信息事件 } function setMaxStakeAmount(uint256 poolId, uint256 maxStakeAmount) override external onlyOperater { uint256 _maxStakeAmount; PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId]; require((ZERO != poolStakeInfo.token) && (0 == poolStakeInfo.endBlock), "YouSwap:POOL_NOT_EXIST_OR_END_OF_MINING");//矿池是否存在、是否结束 uint256 minRewardPerBlock = uint256(0) - uint256(1);//最小区块奖励 PoolRewardInfo[] memory _poolRewardInfos = poolRewardInfos[poolId]; for(uint i = 0; i < _poolRewardInfos.length; i++) { if (minRewardPerBlock > _poolRewardInfos[i].rewardPerBlock) { minRewardPerBlock = _poolRewardInfos[i].rewardPerBlock; _maxStakeAmount = minRewardPerBlock.mul(1e24).mul(poolStakeInfo.powerRatio).div(13); } } require(poolStakeInfo.powerRatio <= maxStakeAmount && poolStakeInfo.amount <= maxStakeAmount && maxStakeAmount <= _maxStakeAmount, "YouSwap:MAX_STAKE_AMOUNT_INVALID"); poolStakeInfo.maxStakeAmount = maxStakeAmount; sendUpdatePoolEvent(false, poolId);//更新矿池信息事件 } //////////////////////////////////////////////////////////////////////////////////// function _setOperateOwner(address user, bool state) internal onlyOwner { operateOwner[user] = state;//设置运营权限 } /** 计算单位算力奖励 */ function computeReward(uint256 poolId) internal returns (uint256[] memory) { PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId]; PoolRewardInfo[] storage _poolRewardInfos = poolRewardInfos[poolId]; uint256[] memory rewardPerShares = new uint256[](_poolRewardInfos.length); if (0 < poolStakeInfo.totalPower) {//有算力才能发奖励 uint finishRewardCount = 0; uint256 reward = 0; uint256 blockCount = block.number.sub(poolStakeInfo.lastRewardBlock);//待发放的区块数量 for(uint i = 0; i < _poolRewardInfos.length; i++) { PoolRewardInfo storage poolRewardInfo = _poolRewardInfos[i];//矿池奖励信息 reward = blockCount.mul(poolRewardInfo.rewardPerBlock);//两次快照之间总奖励 if (poolRewardInfo.rewardProvide.add(reward) >= poolRewardInfo.rewardTotal) {//是否超出总奖励数量 reward = poolRewardInfo.rewardTotal.sub(poolRewardInfo.rewardProvide);//核减超出奖励 finishRewardCount = finishRewardCount.add(1);//挖矿结束token计数 } poolRewardInfo.rewardProvide = poolRewardInfo.rewardProvide.add(reward);//更新已发放奖励数量 poolRewardInfo.rewardPerShare = poolRewardInfo.rewardPerShare.add(reward.mul(1e24).div(poolStakeInfo.totalPower));//更新单位算力奖励 rewardPerShares[i] = poolRewardInfo.rewardPerShare; if (0 < reward) { emit Mint(poolId, poolRewardInfo.token, reward);//挖矿事件 } } poolStakeInfo.lastRewardBlock = block.number;//更新快照块高 if (finishRewardCount == _poolRewardInfos.length) {//是否挖矿结束 poolStakeInfo.endBlock = block.number;//挖矿结束块高 emit EndPool(poolId);//挖矿结束事件 } }else { for(uint i = 0; i < _poolRewardInfos.length; i++) { rewardPerShares[i] = _poolRewardInfos[i].rewardPerShare; } } return rewardPerShares; } /** 增加算力 */ function addPower(uint256 poolId, address user, uint256 amount, uint256 powerRatio, address upper1, address upper2) internal { uint256 power = amount.div(powerRatio); PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId];//矿池质押信息 poolStakeInfo.amount = poolStakeInfo.amount.add(amount);//更新矿池质押数量 poolStakeInfo.totalPower = poolStakeInfo.totalPower.add(power);//更新矿池总算力 UserStakeInfo storage userStakeInfo = userStakeInfos[poolId][user];//sender质押信息 userStakeInfo.amount = userStakeInfo.amount.add(amount);//更新sender质押数量 userStakeInfo.stakePower = userStakeInfo.stakePower.add(power);//更新sender质押算力 if (0 == userStakeInfo.startBlock) { userStakeInfo.startBlock = block.number;//挖矿开始块高 } uint256 upper1InvitePower = 0;//upper1邀请算力 uint256 upper2InvitePower = 0;//upper2邀请算力 if (ZERO != upper1) { uint256 inviteSelfPower = power.mul(INVITE_SELF_REWARD).div(100);//新增sender自邀请算力 userStakeInfo.invitePower = userStakeInfo.invitePower.add(inviteSelfPower);//更新sender邀请算力 poolStakeInfo.totalPower = poolStakeInfo.totalPower.add(inviteSelfPower);//更新矿池总算力 uint256 invite1Power = power.mul(INVITE1_REWARD).div(100);//新增upper1邀请算力 UserStakeInfo storage upper1StakeInfo = userStakeInfos[poolId][upper1];//upper1质押信息 upper1StakeInfo.invitePower = upper1StakeInfo.invitePower.add(invite1Power);//更新upper1邀请算力 upper1InvitePower = upper1StakeInfo.invitePower; poolStakeInfo.totalPower = poolStakeInfo.totalPower.add(invite1Power);//更新矿池总算力 if (0 == upper1StakeInfo.startBlock) { upper1StakeInfo.startBlock = block.number;//挖矿开始块高 } } if (ZERO != upper2) { uint256 invite2Power = power.mul(INVITE2_REWARD).div(100);//新增upper2邀请算力 UserStakeInfo storage upper2StakeInfo = userStakeInfos[poolId][upper2];//upper2质押信息 upper2StakeInfo.invitePower = upper2StakeInfo.invitePower.add(invite2Power);//更新upper2邀请算力 upper2InvitePower = upper2StakeInfo.invitePower; poolStakeInfo.totalPower = poolStakeInfo.totalPower.add(invite2Power);//更新矿池总算力 if (0 == upper2StakeInfo.startBlock) { upper2StakeInfo.startBlock = block.number;//挖矿开始块高 } } emit UpdatePower(poolId, poolStakeInfo.token, poolStakeInfo.totalPower, user, userStakeInfo.invitePower, userStakeInfo.stakePower, upper1, upper1InvitePower, upper2, upper2InvitePower);//更新算力事件 } /** 减少算力 */ function subPower(uint256 poolId, address user, uint256 amount, uint256 powerRatio, address upper1, address upper2) internal { uint256 power = amount.div(powerRatio); PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId];//矿池质押信息 if (poolStakeInfo.amount <= amount) { poolStakeInfo.amount = 0;//减少矿池总质押数量 }else { poolStakeInfo.amount = poolStakeInfo.amount.sub(amount);//减少矿池总质押数量 } if (poolStakeInfo.totalPower <= power) { poolStakeInfo.totalPower = 0;//减少矿池总算力 }else { poolStakeInfo.totalPower = poolStakeInfo.totalPower.sub(power);//减少矿池总算力 } UserStakeInfo storage userStakeInfo = userStakeInfos[poolId][user];//sender质押信息 userStakeInfo.amount = userStakeInfo.amount.sub(amount);//减少sender质押数量 if (userStakeInfo.stakePower <= power) { userStakeInfo.stakePower = 0;//减少sender质押算力 }else { userStakeInfo.stakePower = userStakeInfo.stakePower.sub(power);//减少sender质押算力 } uint256 upper1InvitePower = 0; uint256 upper2InvitePower = 0; if (ZERO != upper1) { uint256 inviteSelfPower = power.mul(INVITE_SELF_REWARD).div(100);//sender自邀请算力 if (poolStakeInfo.totalPower <= inviteSelfPower) { poolStakeInfo.totalPower = 0;//减少矿池sender自邀请算力 }else { poolStakeInfo.totalPower = poolStakeInfo.totalPower.sub(inviteSelfPower);//减少矿池sender自邀请算力 } if (userStakeInfo.invitePower <= inviteSelfPower) { userStakeInfo.invitePower = 0;//减少sender自邀请算力 }else { userStakeInfo.invitePower = userStakeInfo.invitePower.sub(inviteSelfPower);//减少sender自邀请算力 } uint256 invite1Power = power.mul(INVITE1_REWARD).div(100);//upper1邀请算力 if (poolStakeInfo.totalPower <= invite1Power) { poolStakeInfo.totalPower = 0;//减少矿池upper1邀请算力 }else { poolStakeInfo.totalPower = poolStakeInfo.totalPower.sub(invite1Power);//减少矿池upper1邀请算力 } UserStakeInfo storage upper1StakeInfo = userStakeInfos[poolId][upper1]; if (upper1StakeInfo.invitePower <= invite1Power) { upper1StakeInfo.invitePower = 0;//减少upper1邀请算力 }else { upper1StakeInfo.invitePower = upper1StakeInfo.invitePower.sub(invite1Power);//减少upper1邀请算力 } upper1InvitePower = upper1StakeInfo.invitePower; } if (ZERO != upper2) { uint256 invite2Power = power.mul(INVITE2_REWARD).div(100);//upper2邀请算力 if (poolStakeInfo.totalPower <= invite2Power) { poolStakeInfo.totalPower = 0;//减少矿池upper2邀请算力 }else { poolStakeInfo.totalPower = poolStakeInfo.totalPower.sub(invite2Power);//减少矿池upper2邀请算力 } UserStakeInfo storage upper2StakeInfo = userStakeInfos[poolId][upper2]; if (upper2StakeInfo.invitePower <= invite2Power) { upper2StakeInfo.invitePower = 0;//减少upper2邀请算力 }else { upper2StakeInfo.invitePower = upper2StakeInfo.invitePower.sub(invite2Power);//减少upper2邀请算力 } upper2InvitePower = upper2StakeInfo.invitePower; } emit UpdatePower(poolId, poolStakeInfo.token, poolStakeInfo.totalPower, user, userStakeInfo.invitePower, userStakeInfo.stakePower, upper1, upper1InvitePower, upper2, upper2InvitePower); } /** //给sender发放收益,给upper1,upper2增加待领取收益 */ function provideReward(uint256 poolId, uint256[] memory rewardPerShares, address user, address upper1, address upper2) internal { uint256 reward = 0; uint256 inviteReward = 0; uint256 stakeReward = 0; uint256 rewardPerShare = 0; address token; UserStakeInfo storage userStakeInfo = userStakeInfos[poolId][user]; PoolRewardInfo[] memory _poolRewardInfos = poolRewardInfos[poolId]; for(uint i = 0; i < _poolRewardInfos.length; i++) { token = _poolRewardInfos[i].token;//挖矿奖励token rewardPerShare = rewardPerShares[i];//单位算力奖励系数 if ((0 < userStakeInfo.invitePower) || (0 < userStakeInfo.stakePower)) { inviteReward = userStakeInfo.invitePower.mul(rewardPerShare).sub(userStakeInfo.inviteRewardDebts[i]).div(1e24);//邀请奖励 stakeReward = userStakeInfo.stakePower.mul(rewardPerShare).sub(userStakeInfo.stakeRewardDebts[i]).div(1e24);//质押奖励 inviteReward = userStakeInfo.invitePendingRewards[i].add(inviteReward);//待领取奖励 stakeReward = userStakeInfo.stakePendingRewards[i].add(stakeReward);//待领取奖励 reward = inviteReward.add(stakeReward); } if (0 < reward) { userStakeInfo.invitePendingRewards[i] = 0;//重置待领取奖励 userStakeInfo.stakePendingRewards[i] = 0;//重置待领取奖励 userReceiveRewards[token][user] = userReceiveRewards[token][user].add(reward);//增加已领取奖励 if (address(you) == token) {//you you.mint(user, reward);//挖you }else {//非you tokenPendingRewards[token] = tokenPendingRewards[token].sub(reward);//减少奖励总额 IERC20(token).safeTransfer(user, reward);//发放奖励 } emit WithdrawReward(poolId, token, user, inviteReward, stakeReward); } if (ZERO != upper1) { UserStakeInfo storage upper1StakeInfo = userStakeInfos[poolId][upper1]; if ((0 < upper1StakeInfo.invitePower) || (0 < upper1StakeInfo.stakePower)) { inviteReward = upper1StakeInfo.invitePower.mul(rewardPerShare).sub(upper1StakeInfo.inviteRewardDebts[i]).div(1e24);//邀请奖励 stakeReward = upper1StakeInfo.stakePower.mul(rewardPerShare).sub(upper1StakeInfo.stakeRewardDebts[i]).div(1e24);//质押奖励 upper1StakeInfo.invitePendingRewards[i] = upper1StakeInfo.invitePendingRewards[i].add(inviteReward);//待领取奖励 upper1StakeInfo.stakePendingRewards[i] = upper1StakeInfo.stakePendingRewards[i].add(stakeReward);//待领取奖励 } } if (ZERO != upper2) { UserStakeInfo storage upper2StakeInfo = userStakeInfos[poolId][upper2]; if ((0 < upper2StakeInfo.invitePower) || (0 < upper2StakeInfo.stakePower)) { inviteReward = upper2StakeInfo.invitePower.mul(rewardPerShare).sub(upper2StakeInfo.inviteRewardDebts[i]).div(1e24);//邀请奖励 stakeReward = upper2StakeInfo.stakePower.mul(rewardPerShare).sub(upper2StakeInfo.stakeRewardDebts[i]).div(1e24);//质押奖励 upper2StakeInfo.invitePendingRewards[i] = upper2StakeInfo.invitePendingRewards[i].add(inviteReward);//待领取奖励 upper2StakeInfo.stakePendingRewards[i] = upper2StakeInfo.stakePendingRewards[i].add(stakeReward);//待领取奖励 } } } } /** 重置负债 */ function setRewardDebt(uint256 poolId, uint256[] memory rewardPerShares, address user, address upper1, address upper2) internal { uint256 rewardPerShare = 0; UserStakeInfo storage userStakeInfo = userStakeInfos[poolId][user]; for(uint i = 0; i < rewardPerShares.length; i++) { rewardPerShare = rewardPerShares[i];//单位算力奖励系数 userStakeInfo.inviteRewardDebts[i] = userStakeInfo.invitePower.mul(rewardPerShare);//重置sender邀请负债 userStakeInfo.stakeRewardDebts[i] = userStakeInfo.stakePower.mul(rewardPerShare);//重置sender质押负债 if (ZERO != upper1) { UserStakeInfo storage upper1StakeInfo = userStakeInfos[poolId][upper1]; upper1StakeInfo.inviteRewardDebts[i] = upper1StakeInfo.invitePower.mul(rewardPerShare);//重置upper1邀请负债 upper1StakeInfo.stakeRewardDebts[i] = upper1StakeInfo.stakePower.mul(rewardPerShare);//重置upper1质押负债 if (ZERO != upper2) { UserStakeInfo storage upper2StakeInfo = userStakeInfos[poolId][upper2]; upper2StakeInfo.inviteRewardDebts[i] = upper2StakeInfo.invitePower.mul(rewardPerShare);//重置upper2邀请负债 upper2StakeInfo.stakeRewardDebts[i] = upper2StakeInfo.stakePower.mul(rewardPerShare);//重置upper2质押负债 } } } } /** 矿池信息更新事件 */ function sendUpdatePoolEvent(bool action, uint256 poolId) internal { PoolViewInfo memory poolViewInfo = poolViewInfos[poolId]; PoolStakeInfo memory poolStakeInfo = poolStakeInfos[poolId]; PoolRewardInfo[] memory _poolRewardInfos = poolRewardInfos[poolId]; address[] memory tokens = new address[](_poolRewardInfos.length); uint256[] memory _rewardTotals = new uint256[](_poolRewardInfos.length); uint256[] memory rewardPerBlocks = new uint256[](_poolRewardInfos.length); for(uint i = 0; i < _poolRewardInfos.length; i++) { tokens[i] = _poolRewardInfos[i].token; _rewardTotals[i] = _poolRewardInfos[i].rewardTotal; rewardPerBlocks[i] = _poolRewardInfos[i].rewardPerBlock; } emit UpdatePool(action, poolId, poolViewInfo.name, poolStakeInfo.token, poolStakeInfo.powerRatio, poolStakeInfo.maxStakeAmount, poolStakeInfo.startBlock, poolViewInfo.multiple, poolViewInfo.priority, tokens, _rewardTotals, rewardPerBlocks); } /** 解质押 */ function _unStake(uint256 poolId, uint256 amount) internal { PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId]; require((ZERO != poolStakeInfo.token) && (poolStakeInfo.startBlock <= block.number), "YouSwap:POOL_NOT_EXIST_OR_MINING_NOT_START"); require((0 < amount) && (userStakeInfos[poolId][msg.sender].amount >= amount), "YouSwap:BALANCE_INSUFFICIENT"); (address upper1, address upper2) = invite.inviteUpper2(msg.sender); initRewardInfo(poolId, msg.sender, upper1, upper2); uint256[] memory rewardPerShares = computeReward(poolId);//计算单位算力奖励系数 provideReward(poolId, rewardPerShares, msg.sender, upper1, upper2);//给sender发放收益,给upper1,upper2增加待领取收益 subPower(poolId, msg.sender, amount, poolStakeInfo.powerRatio, upper1, upper2);//减少算力 setRewardDebt(poolId, rewardPerShares, msg.sender, upper1, upper2);//重置sender,upper1,upper2负债 IERC20(poolStakeInfo.token).safeTransfer(msg.sender, amount);//解质押token emit UnStake(poolId, poolStakeInfo.token, msg.sender, amount); } function _withdrawReward(uint256 poolId) internal { PoolStakeInfo storage poolStakeInfo = poolStakeInfos[poolId]; require((ZERO != poolStakeInfo.token) && (poolStakeInfo.startBlock <= block.number), "YouSwap:POOL_NOT_EXIST_OR_MINING_NOT_START"); (address upper1, address upper2) = invite.inviteUpper2(msg.sender); initRewardInfo(poolId, msg.sender, upper1, upper2); uint256[] memory rewardPerShares = computeReward(poolId);//计算单位算力奖励系数 provideReward(poolId, rewardPerShares, msg.sender, upper1, upper2);//给sender发放收益,给upper1,upper2增加待领取收益 setRewardDebt(poolId, rewardPerShares, msg.sender, upper1, upper2);//重置sender,upper1,upper2负债 } function initRewardInfo(uint256 poolId, address user, address upper1, address upper2) internal { uint count = poolRewardInfos[poolId].length; UserStakeInfo storage userStakeInfo = userStakeInfos[poolId][user]; if (0 == userStakeInfo.invitePendingRewards.length) { for(uint i = 0; i < count; i++) { userStakeInfo.invitePendingRewards.push(0);//初始化待领取数量 userStakeInfo.stakePendingRewards.push(0);//初始化待领取数量 userStakeInfo.inviteRewardDebts.push(0);//初始化邀请负债 userStakeInfo.stakeRewardDebts.push(0);//初始化质押负债 } } if (ZERO != upper1) { UserStakeInfo storage upper1StakeInfo = userStakeInfos[poolId][upper1]; if (0 == upper1StakeInfo.invitePendingRewards.length) { for(uint i = 0; i < count; i++) { upper1StakeInfo.invitePendingRewards.push(0);//初始化待领取数量 upper1StakeInfo.stakePendingRewards.push(0);//初始化待领取数量 upper1StakeInfo.inviteRewardDebts.push(0);//初始化邀请负债 upper1StakeInfo.stakeRewardDebts.push(0);//初始化质押负债 } } if (ZERO != upper2) { UserStakeInfo storage upper2StakeInfo = userStakeInfos[poolId][upper2]; if (0 == upper2StakeInfo.invitePendingRewards.length) { for(uint i = 0; i < count; i++) { upper2StakeInfo.invitePendingRewards.push(0);//初始化待领取数量 upper2StakeInfo.stakePendingRewards.push(0);//初始化待领取数量 upper2StakeInfo.inviteRewardDebts.push(0);//初始化邀请负债 upper2StakeInfo.stakeRewardDebts.push(0);//初始化质押负债 } } } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ITokenYou","name":"_you","type":"address"},{"internalType":"contract YouswapInviteV1","name":"_invite","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"EndPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"self","type":"address"}],"name":"InviteRegister","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SafeWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"action","type":"bool"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"powerRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxStakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"multiple","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priority","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_rewardTotals","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"rewardPerBlocks","type":"uint256[]"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalPower","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"ownerInvitePower","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ownerStakePower","type":"uint256"},{"indexed":true,"internalType":"address","name":"upper1","type":"address"},{"indexed":false,"internalType":"uint256","name":"upper1InvitePower","type":"uint256"},{"indexed":true,"internalType":"address","name":"upper2","type":"address"},{"indexed":false,"internalType":"uint256","name":"upper2InvitePower","type":"uint256"}],"name":"UpdatePower","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"inviteAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"WithdrawReward","type":"event"},{"inputs":[],"name":"INVITE1_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVITE2_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVITE_SELF_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"powerRatio","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"multiple","type":"uint256"},{"internalType":"uint256","name":"priority","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"_rewardTotals","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardPerBlocks","type":"uint256[]"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPowerRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRewardInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invite","outputs":[{"internalType":"contract YouswapInviteV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operateOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"pendingRewardV2","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"pendingRewardV3","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolIdsV2","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"poolNumbers","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRewardInfos","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"rewardTotal","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"rewardProvide","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolStakeInfos","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"totalPower","type":"uint256"},{"internalType":"uint256","name":"powerRatio","type":"uint256"},{"internalType":"uint256","name":"maxStakeAmount","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolViewInfos","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"multiple","type":"uint256"},{"internalType":"uint256","name":"priority","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"powerScale","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"maxStakeAmount","type":"uint256"}],"name":"setMaxStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"multiple","type":"uint256"}],"name":"setMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setOperateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"priority","type":"uint256"}],"name":"setPriority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"setRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"rewardTotal","type":"uint256"}],"name":"setRewardTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"stakeRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_poolIds","type":"uint256[]"}],"name":"unStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userReceiveRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userStakeInfos","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"invitePower","type":"uint256"},{"internalType":"uint256","name":"stakePower","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"withdrawReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_poolIds","type":"uint256[]"}],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"you","outputs":[{"internalType":"contract ITokenYou","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260006005553480156200001657600080fd5b506040516200612938038062006129833981810160405260408110156200003c57600080fd5b5080516020909101514360005560018054336001600160a01b0319918216178083556004805483166001600160a01b0380871691909117909155600380549093168187161790925562000092929116906200009a565b505062000125565b6001546001600160a01b03163314620000fa576040805162461bcd60e51b815260206004820152601b60248201527f596f75537761703a464f5242494444454e5f4e4f545f4f574e45520000000000604482015290519081900360640190fd5b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b615ff480620001356000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063df5140a7116100b8578063eec30bfd1161007c578063eec30bfd14610d10578063f2fde38b14610d18578063f49f589114610d3e578063f525cb6814610d74578063fe55932a14610d7c57610248565b8063df5140a714610a3c578063df9e516c14610c8b578063e22ffa0814610ca8578063e46d811e14610cd6578063e9bb64c214610cde57610248565b8063bd2b0290116100ff578063bd2b0290146107c7578063d24287f91461081f578063d4f0afd114610929578063d6aa14cb1461094f578063dd87ad9d1461098957610248565b80638da5cb5b1461075a578063918b58e31461076257806396ddecfc1461076a578063a393b1461461078d578063a3ec191a146107bf57610248565b80634ff0198b116101c957806368833c1c1161018d57806368833c1c1461068657806369883b4e146106ac5780637b0472f0146106c957806388953cb9146106ec5780638ca527e6146106f457610248565b80634ff0198b14610526578063523a3f081461055257806358fa63ca1461056f5780635c335f07146105935780635f1bf90c1461063457610248565b8063372caeb811610210578063372caeb81461044b578063374043c41461046e57806347d7514b146104915780634b3b5f8a146104e95780634d51abf71461050357610248565b8063057b62761461024d5780630b93638d1461028357806311fed1a1146102b757806319f489821461037c57806330f2e6aa146103aa575b600080fd5b61026a6004803603602081101561026357600080fd5b5035610e27565b6040805192835260208301919091528051918290030190f35b6102b56004803603606081101561029957600080fd5b508035906001600160a01b036020820135169060400135610ed7565b005b6102e3600480360360408110156102cd57600080fd5b50803590602001356001600160a01b03166110ab565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561032757818101518382015260200161030f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561036657818101518382015260200161034e565b5050505090500194505050505060405180910390f35b6102b56004803603604081101561039257600080fd5b506001600160a01b0381351690602001351515611636565b6102b5600480360360208110156103c057600080fd5b810190602081018135600160201b8111156103da57600080fd5b8201836020820111156103ec57600080fd5b803590602001918460208302840111600160201b8311171561040d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611691945050505050565b6102b56004803603604081101561046157600080fd5b5080359060200135611744565b6102b56004803603604081101561048457600080fd5b508035906020013561174e565b61049961180b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104d55781810151838201526020016104bd565b505050509050019250505060405180910390f35b6104f1611863565b60408051918252519081900360200190f35b6102b56004803603604081101561051957600080fd5b5080359060200135611868565b61026a6004803603604081101561053c57600080fd5b50803590602001356001600160a01b0316611920565b6102b56004803603602081101561056857600080fd5b5035611b96565b610577611ba2565b604080516001600160a01b039092168252519081900360200190f35b6102b5600480360360208110156105a957600080fd5b810190602081018135600160201b8111156105c357600080fd5b8201836020820111156105d557600080fd5b803590602001918460208302840111600160201b831117156105f657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ba7945050505050565b6106606004803603604081101561064a57600080fd5b50803590602001356001600160a01b0316611c25565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6104f16004803603602081101561069c57600080fd5b50356001600160a01b0316611c57565b6104f1600480360360208110156106c257600080fd5b5035611c69565b6102b5600480360360408110156106df57600080fd5b5080359060200135611c8a565b610577611ff8565b6107116004803603602081101561070a57600080fd5b5035612007565b604080519889526001600160a01b039097166020890152878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b610577612054565b6104f1612063565b6102b56004803603604081101561078057600080fd5b5080359060200135612068565b6102b5600480360360608110156107a357600080fd5b508035906001600160a01b0360208201351690604001356122c4565b6104f161269d565b6107ea600480360360408110156107dd57600080fd5b50803590602001356126a3565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b61084b6004803603604081101561083557600080fd5b50803590602001356001600160a01b03166126fb565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561089357818101518382015260200161087b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156108d25781810151838201526020016108ba565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156109115781810151838201526020016108f9565b50505050905001965050505050505060405180910390f35b6104996004803603602081101561093f57600080fd5b50356001600160a01b0316612ca4565b6109756004803603602081101561096557600080fd5b50356001600160a01b0316612dfb565b604080519115158252519081900360200190f35b6109a66004803603602081101561099f57600080fd5b5035612e10565b60405180856001600160a01b0316815260200180602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109fe5781810151838201526020016109e6565b50505050905090810190601f168015610a2b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102b56004803603610120811015610a5357600080fd5b810190602081018135600160201b811115610a6d57600080fd5b820183602082011115610a7f57600080fd5b803590602001918460018302840111600160201b83111715610aa057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b038535169560208601359560408101359550606081013594506080810135935060c081019060a00135600160201b811115610b1657600080fd5b820183602082011115610b2857600080fd5b803590602001918460208302840111600160201b83111715610b4957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b9857600080fd5b820183602082011115610baa57600080fd5b803590602001918460208302840111600160201b83111715610bcb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c1a57600080fd5b820183602082011115610c2c57600080fd5b803590602001918460208302840111600160201b83111715610c4d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ed0945050505050565b6104f160048036036020811015610ca157600080fd5b503561360c565b6104f160048036036040811015610cbe57600080fd5b506001600160a01b0381358116916020013516613621565b6104f161363e565b61066060048036036060811015610cf457600080fd5b508035906001600160a01b036020820135169060400135613643565b610577613871565b6102b560048036036020811015610d2e57600080fd5b50356001600160a01b0316613880565b6102b560048036036060811015610d5457600080fd5b506001600160a01b03813581169160208101359091169060400135613984565b6104f1613b57565b6102b560048036036040811015610d9257600080fd5b81359190810190604081016020820135600160201b811115610db357600080fd5b820183602082011115610dc557600080fd5b803590602001918460018302840111600160201b83111715610de657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613b5d945050505050565b600080610e32615be6565b506000838152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e0830152610eb4576000809250925050610ed2565b60a0810151604082015160c0830151610ecc91613c24565b92509250505b915091565b3360009081526002602052604090205460ff16610f29576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600083815260086020526040902060018101546001600160a01b031615801590610f5557506007810154155b610f905760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b610f9984613c86565b506000848152600960205260408120600019915b81548110156110a257856001600160a01b0316828281548110610fcc57fe5b60009182526020909120600590910201546001600160a01b031614156110195784828281548110610ff957fe5b906000526020600020906005020160020181905550611019600088613ef9565b81818154811061102557fe5b90600052602060002090600502016002015483111561109a5781818154811061104a57fe5b9060005260206000209060050201600201549250611094600d61108e866005015461108869d3c21bcecceda10000008861444190919063ffffffff16565b90614441565b906144a1565b60068501555b600101610fad565b50505050505050565b606080606060096000868152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561114a5760008481526020908190206040805160a0810182526005860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260040154608083015290835290920191016110e3565b5050505090506060815167ffffffffffffffff8111801561116a57600080fd5b50604051908082528060200260200182016040528015611194578160200160208202803683370190505b5090506060825167ffffffffffffffff811180156111b157600080fd5b506040519080825280602002602001820160405280156111db578160200160208202803683370190505b5090506111e6615be6565b506000878152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e08301521561162757600080611267615c34565b60008b8152600a602090815260408083206001600160a01b038e1684528252918290208251610100810184528154815260018201548184015260028201548185015260038201546060820152600482018054855181860281018601909652808652919492936080860193929083018282801561130257602002820191906000526020600020905b8154815260200190600101908083116112ee575b505050505081526020016005820180548060200260200160405190810160405280929190818152602001828054801561135a57602002820191906000526020600020905b815481526020019060010190808311611346575b50505050508152602001600682018054806020026020016040519081016040528092919081815260200182805480156113b257602002820191906000526020600020905b81548152602001906001019080831161139e575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561140a57602002820191906000526020600020905b8154815260200190600101908083116113f6575b505050505081525050905060005b875181101561162257611429615c79565b88828151811061143557fe5b60200260200101519050438660000151116115f05760009450885183608001515114156115d6576080860151156114f0576114858160400151611088886060015143613c2490919063ffffffff16565b935080602001516114a385836060015161450890919063ffffffff16565b106114be57606081015160208201516114bb91613c24565b93505b60808601516114ea906114df9061108e8769d3c21bcecceda1000000614441565b608083015190614508565b60808201525b8260800151828151811061150057fe5b602002602001015194506115348360a00151838151811061151d57fe5b60200260200101518661450890919063ffffffff16565b945061158a61158369d3c21bcecceda100000061108e8660c00151868151811061155a57fe5b602002602001015161157d8660800151896040015161444190919063ffffffff16565b90613c24565b8690614508565b94506115d361158369d3c21bcecceda100000061108e8660e0015186815181106115b057fe5b602002602001015161157d8660800151896060015161444190919063ffffffff16565b94505b848783815181106115e357fe5b6020026020010181815250505b806000015188838151811061160157fe5b6001600160a01b039092166020928302919091019091015250600101611418565b505050505b509093509150505b9250929050565b6001546001600160a01b03163314611683576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b61168d8282614562565b5050565b805160001080156116a457508051603210155b6116df5760405162461bcd60e51b8152600401808060200182810382526029815260200180615f6d6029913960400191505060405180910390fd5b60008060005b835181101561173e578381815181106116fa57fe5b6020908102919091018101516000818152600a8352604080822033835290935291909120600101549350915082156117365761173682846145da565b6001016116e5565b50505050565b61168d82826145da565b3360009081526002602052604090205460ff166117a0576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260076020526040902080546001600160a01b03166117f45760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b60028101829055611806600084613ef9565b505050565b6060600680548060200260200160405190810160405280929190818152602001828054801561185957602002820191906000526020600020905b815481526020019060010190808311611845575b5050505050905090565b600581565b3360009081526002602052604090205460ff166118ba576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260076020526040902080546001600160a01b031661190e5760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b60038101829055611806600084613ef9565b60008061192b615be6565b506000848152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281019290925260028101549282019290925260038201546060820152600482015460808201819052600583015460a0830152600683015460c083015260079092015460e0820152906119b357600080925092505061162f565b6119bb615c34565b6000868152600a602090815260408083206001600160a01b038916845282529182902082516101008101845281548152600182015481840152600282015481850152600382015460608201526004820180548551818602810186019096528086529194929360808601939290830182828015611a5657602002820191906000526020600020905b815481526020019060010190808311611a42575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611aae57602002820191906000526020600020905b815481526020019060010190808311611a9a575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611b0657602002820191906000526020600020905b815481526020019060010190808311611af2575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611b5e57602002820191906000526020600020905b815481526020019060010190808311611b4a575b5050505050815250509050611b848160600151826040015161450890919063ffffffff16565b82608001519350935050509250929050565b611b9f816147dd565b50565b600081565b80516000108015611bba57508051603210155b611bf55760405162461bcd60e51b8152600401808060200182810382526029815260200180615f6d6029913960400191505060405180910390fd5b60005b815181101561168d57611c1d828281518110611c1057fe5b60200260200101516147dd565b600101611bf8565b600a60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b600b6020526000908152604090205481565b60068181548110611c7957600080fd5b600091825260209091200154905081565b80600010611cdf576040805162461bcd60e51b815260206004820152601760248201527f596f75537761703a504152414d455445525f4552524f52000000000000000000604482015290519081900360640190fd5b600082815260086020526040902060018101546001600160a01b031615801590611d0a575080544310155b611d455760405162461bcd60e51b8152600401808060200182810382526028815260200180615ecc6028913960400191505060405180910390fd5b81816005015411158015611d6a575060068101546002820154611d689084614508565b105b611da55760405162461bcd60e51b815260040180806020018281038252602b815260200180615e60602b913960400191505060405180910390fd5b600480546040805163aaaf7eaf60e01b8152339381019390935280516000936001600160a01b039093169263aaaf7eaf926024808301939192829003018186803b158015611df257600080fd5b505afa158015611e06573d6000803e3d6000fd5b505050506040513d6040811015611e1c57600080fd5b5060200151905080611ec4576004805460408051630354740160e31b815290516001600160a01b0390921692631aa3a0089282820192602092908290030181600087803b158015611e6c57600080fd5b505af1158015611e80573d6000803e3d6000fd5b505050506040513d6020811015611e9657600080fd5b505060405133907faae87b0d5fa6fab112ec583bb4f7405cb8da557e222b0061761336d65516857290600090a25b6001820154611ede906001600160a01b0316333086614900565b6004805460408051630d69191f60e41b81523393810193909352805160009384936001600160a01b03169263d69191f092602480840193829003018186803b158015611f2957600080fd5b505afa158015611f3d573d6000803e3d6000fd5b505050506040513d6040811015611f5357600080fd5b5080516020909101519092509050611f6d8633848461495a565b6060611f7887613c86565b9050611f878782338686614b62565b611f9987338888600501548787615174565b611fa6878233868661540f565b60018501546040805189815260208101899052815133936001600160a01b0316927ff7373f56c201647feae85a62d3cf56286ed3a43d20c5eb7f9883d6ea690ef7c0928290030190a350505050505050565b6003546001600160a01b031681565b6008602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495966001600160a01b0390951695939492939192909188565b6001546001600160a01b031681565b600f81565b3360009081526002602052604090205460ff166120ba576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260086020526040812060018101546001600160a01b0316158015906120e657506007810154155b6121215760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b600084815260096020908152604080832080548251818502810185019093528083526000199460609484015b828210156121b45760008481526020908190206040805160a0810182526005860290920180546001600160a01b031683526001808201548486015260028201549284019290925260038101546060840152600401546080830152908352909201910161214d565b50505050905060005b8151811015612234578181815181106121d257fe5b60200260200101516040015183111561222c578181815181106121f157fe5b6020026020010151604001519250612229600d61108e866005015461108869d3c21bcecceda10000008861444190919063ffffffff16565b94505b6001016121bd565b508483600501541115801561224d575084836002015411155b80156122595750838511155b6122aa576040805162461bcd60e51b815260206004820181905260248201527f596f75537761703a4d41585f5354414b455f414d4f554e545f494e56414c4944604482015290519081900360640190fd5b600683018590556122bc600087613ef9565b505050505050565b3360009081526002602052604090205460ff16612316576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b61231e615be6565b506000838152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e08301521580159061239f575060e0810151155b6123da5760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b6123e384613c86565b506000848152600960205260408120905b81548110156122bc57846001600160a01b031682828154811061241357fe5b60009182526020909120600590910201546001600160a01b03161415612695578382828154811061244057fe5b906000526020600020906005020160030154111561248f5760405162461bcd60e51b815260040180806020018281038252602b815260200180615da4602b913960400191505060405180910390fd5b6003546001600160a01b0386811691161461266857838282815481106124b157fe5b90600052602060002090600502016001015411156125395761251b6124fc858484815481106124dc57fe5b906000526020600020906005020160010154613c2490919063ffffffff16565b6001600160a01b0387166000908152600b602052604090205490613c24565b6001600160a01b0386166000908152600b60205260409020556125a5565b61258b61256c83838154811061254b57fe5b90600052602060002090600502016001015486613c2490919063ffffffff16565b6001600160a01b0387166000908152600b602052604090205490614508565b6001600160a01b0386166000908152600b60205260409020555b6001600160a01b0385166000818152600b60209081526040918290205482516370a0823160e01b815230600482015292519093926370a08231926024808301939192829003018186803b1580156125fb57600080fd5b505afa15801561260f573d6000803e3d6000fd5b505050506040513d602081101561262557600080fd5b50511015612668576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b8382828154811061267557fe5b906000526020600020906005020160010181905550612695600087613ef9565b6001016123f4565b60005481565b600960205281600052604060002081815481106126bf57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919085565b60608060608060096000878152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561279b5760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101612734565b5050505090506060815167ffffffffffffffff811180156127bb57600080fd5b506040519080825280602002602001820160405280156127e5578160200160208202803683370190505b5090506060825167ffffffffffffffff8111801561280257600080fd5b5060405190808252806020026020018201604052801561282c578160200160208202803683370190505b5090506060835167ffffffffffffffff8111801561284957600080fd5b50604051908082528060200260200182016040528015612873578160200160208202803683370190505b50905061287e615be6565b506000898152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e083015215612c94576000806000612901615c34565b600a60008f815260200190815260200160002060008e6001600160a01b03166001600160a01b031681526020019081526020016000206040518061010001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054806020026020016040519081016040528092919081815260200182805480156129ba57602002820191906000526020600020905b8154815260200190600101908083116129a6575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015612a1257602002820191906000526020600020905b8154815260200190600101908083116129fe575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a6a57602002820191906000526020600020905b815481526020019060010190808311612a56575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612ac257602002820191906000526020600020905b815481526020019060010190808311612aae575b505050505081525050905060005b8951811015612c8e57612ae1615c79565b8a8281518110612aed57fe5b6020026020010151905043876000015111612c5c5760009550600094508a518360800151511415612c2957608087015115612ba157612b418160400151611088896060015143613c2490919063ffffffff16565b93508060200151612b5f85836060015161450890919063ffffffff16565b10612b7a5760608101516020820151612b7791613c24565b93505b6080870151612b9b906114df9061108e8769d3c21bcecceda1000000614441565b60808201525b82608001518281518110612bb157fe5b602002602001015195508260a001518281518110612bcb57fe5b60200260200101519450612c00612bf969d3c21bcecceda100000061108e8660c00151868151811061155a57fe5b8790614508565b9550612c2661158369d3c21bcecceda100000061108e8660e0015186815181106115b057fe5b94505b85898381518110612c3657fe5b60200260200101818152505084888381518110612c4f57fe5b6020026020010181815250505b80600001518a8381518110612c6d57fe5b6001600160a01b039092166020928302919091019091015250600101612ad0565b50505050505b5091955093509150509250925092565b60606000805b600654811015612d1057836001600160a01b03166007600060068481548110612ccf57fe5b600091825260208083209091015483528201929092526040019020546001600160a01b03161415612d0857612d05826001614508565b91505b600101612caa565b5060608167ffffffffffffffff81118015612d2a57600080fd5b50604051908082528060200260200182016040528015612d54578160200160208202803683370190505b5090506000915060005b600654811015612df357846001600160a01b03166007600060068481548110612d8357fe5b600091825260208083209091015483528201929092526040019020546001600160a01b03161415612deb5760068181548110612dbb57fe5b9060005260206000200154828481518110612dd257fe5b6020908102919091010152612de8836001614508565b92505b600101612d5e565b509392505050565b60026020526000908152604090205460ff1681565b6007602090815260009182526040918290208054600180830180548651600261010094831615949094026000190190911692909204601f81018690048602830186019096528582526001600160a01b03909216949293909290830182828015612eba5780601f10612e8f57610100808354040283529160200191612eba565b820191906000526020600020905b815481529060010190602001808311612e9d57829003601f168201915b5050505050908060020154908060030154905084565b3360009081526002602052604090205460ff16612f22576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b6001600160a01b03881615801590612f435750306001600160a01b03891614155b612f94576040805162461bcd60e51b815260206004820152601d60248201527f596f75537761703a504152414d455445525f4552524f525f544f4b454e000000604482015290519081900360640190fd5b86600010612fd35760405162461bcd60e51b8152600401808060200182810382526029815260200180615f966029913960400191505060405180910390fd5b82516000108015612fe657508251600a10155b8015612ff3575081518351145b8015613000575080518351145b613051576040805162461bcd60e51b815260206004820152601e60248201527f596f75537761703a504152414d455445525f4552524f525f5245574152440000604482015290519081900360640190fd5b43861061305e5785613060565b435b9550600061307d6301312d0060055461450890919063ffffffff16565b60068054600181810183556000929092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f018290556005549192506130c39190614508565b600555600081815260076020908152604090912080546001600160a01b0319166001600160a01b038c161781558b5190916131059160018401918e0190615cb1565b5060028101879055851561311f5760038101869055613140565b60065461313a90604b90613134906064614441565b90614508565b60038201555b6000828152600860205260408120898155600180820180546001600160a01b0319166001600160a01b038f16179055600282019290925590613183908a90613c24565b6003820155600060048201819055600582018b90556006820181905560078201819055600019905b87518110156135f1578781815181106131c057fe5b60200260200101516001600160a01b031660006001600160a01b03161415801561320f57508781815181106131f157fe5b60200260200101516001600160a01b0316306001600160a01b031614155b613260576040805162461bcd60e51b815260206004820152601d60248201527f596f75537761703a504152414d455445525f4552524f525f544f4b454e000000604482015290519081900360640190fd5b86818151811061326c57fe5b60200260200101516000106132b25760405162461bcd60e51b8152600401808060200182810382526024815260200180615e196024913960400191505060405180910390fd5b8581815181106132be57fe5b60200260200101516000106133045760405162461bcd60e51b8152600401808060200182810382526028815260200180615ef46028913960400191505060405180910390fd5b87818151811061331057fe5b60209081029190910101516003546001600160a01b039081169116146134d05761338e87828151811061333f57fe5b6020026020010151600b60008b858151811061335757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461450890919063ffffffff16565b600b60008a848151811061339e57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600b60008983815181106133da57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205488828151811061340f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561346357600080fd5b505afa158015613477573d6000803e3d6000fd5b505050506040513d602081101561348d57600080fd5b505110156134d0576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b6134d8615c79565b8882815181106134e457fe5b60209081029190910101516001600160a01b03168152875188908390811061350857fe5b602002602001015181602001818152505086828151811061352557fe5b6020908102919091018101516040838101918252600060608501818152608086018281528b83526009865292822080546001808201835591845292869020875160059094020180546001600160a01b0319166001600160a01b03909416939093178355948601519482019490945591516002830181905592516003830155516004909101558311156135e857806040015192506135e2600d61108e866005015461108869d3c21bcecceda10000008861444190919063ffffffff16565b60068501555b506001016131ab565b506135fd600185613ef9565b50505050505050505050505050565b60009081526008602052604090206005015490565b600c60209081526000928352604080842090915290825290205481565b600a81565b600080600080613651615c34565b6000888152600a602090815260408083206001600160a01b038b168452825291829020825161010081018452815481526001820154818401526002820154818501526003820154606082015260048201805485518186028101860190965280865291949293608086019392908301828280156136ec57602002820191906000526020600020905b8154815260200190600101908083116136d8575b505050505081526020016005820180548060200260200160405190810160405280929190818152602001828054801561374457602002820191906000526020600020905b815481526020019060010190808311613730575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561379c57602002820191906000526020600020905b815481526020019060010190808311613788575b50505050508152602001600782018054806020026020016040519081016040528092919081815260200182805480156137f457602002820191906000526020600020905b8154815260200190600101908083116137e0575b50505050508152505090508060800151868151811061380f57fe5b60200260200101518160a00151878151811061382757fe5b60200260200101518260c00151888151811061383f57fe5b60200260200101518360e00151898151811061385757fe5b602002602001015194509450945094505093509350935093565b6004546001600160a01b031681565b6001546001600160a01b031633146138cd576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b6001600160a01b038116613928576040805162461bcd60e51b815260206004820152601960248201527f596f75537761703a494e56414c49445f41444452455353455300000000000000604482015290519081900360640190fd5b6001546040516001600160a01b038084169216907f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c90600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146139d1576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b6001600160a01b038316158015906139f157506001600160a01b03821615155b80156139fd5750806000105b613a385760405162461bcd60e51b8152600401808060200182810382526023815260200180615e3d6023913960400191505060405180910390fd5b80836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613a8657600080fd5b505afa158015613a9a573d6000803e3d6000fd5b505050506040513d6020811015613ab057600080fd5b50511015613af3576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b613b076001600160a01b03841683836155c4565b816001600160a01b0316836001600160a01b03167f4f419798e514c337b327bb657066e69201f8adf380d6894b7f60cdf937ea9f03836040518082815260200191505060405180910390a3505050565b60055481565b3360009081526002602052604090205460ff16613baf576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260076020526040902080546001600160a01b0316613c035760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b8151613c189060018301906020850190615cb1565b50611806600084613ef9565b600082821115613c7b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000818152600860209081526040808320600990925290912080546060929190839067ffffffffffffffff81118015613cbe57600080fd5b50604051908082528060200260200182016040528015613ce8578160200160208202803683370190505b50600484015490915015613ea6576000806000613d12866003015443613c2490919063ffffffff16565b905060005b8554811015613e54576000868281548110613d2e57fe5b90600052602060002090600502019050613d5581600201548461444190919063ffffffff16565b93508060010154613d7385836003015461450890919063ffffffff16565b10613d9b5760038101546001820154613d8b91613c24565b9350613d98856001614508565b94505b6003810154613daa9085614508565b60038201556004880154613ddb90613dd09061108e8769d3c21bcecceda1000000614441565b600483015490614508565b600482018190558651879084908110613df057fe5b60209081029190910101528315613e4b578054604080518c81526020810187905281516001600160a01b03909316927f4e3883c75cc9c752bb1db2e406a822e4a75067ae77ad9a0a4d179f2709b9e1f6929181900390910190a25b50600101613d17565b504360038701558454831415613e9e574360078701556040805189815290517f3ff9cb67fb8342155b3414d735a9d18cc79ebb0c5b234f801da50205fdf2b7089181900360200190a15b505050613ef1565b60005b8254811015613eef57828181548110613ebe57fe5b906000526020600020906005020160040154828281518110613edc57fe5b6020908102919091010152600101613ea9565b505b949350505050565b613f01615d3d565b600082815260076020908152604091829020825160808101845281546001600160a01b03168152600180830180548651600261010094831615949094026000190190911692909204601f8101869004860283018601909652858252919492938581019391929190830182828015613fb95780601f10613f8e57610100808354040283529160200191613fb9565b820191906000526020600020905b815481529060010190602001808311613f9c57829003601f168201915b50505050508152602001600282015481526020016003820154815250509050613fe0615be6565b5060008281526008602090815260408083208151610100810183528154815260018201546001600160a01b031681850152600282015481840152600382015460608083019190915260048301546080830152600583015460a0830152600683015460c083015260079092015460e08201528685526009845282852080548451818702810187019095528085529195929490929084015b828210156140dd5760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101614076565b5050505090506060815167ffffffffffffffff811180156140fd57600080fd5b50604051908082528060200260200182016040528015614127578160200160208202803683370190505b5090506060825167ffffffffffffffff8111801561414457600080fd5b5060405190808252806020026020018201604052801561416e578160200160208202803683370190505b5090506060835167ffffffffffffffff8111801561418b57600080fd5b506040519080825280602002602001820160405280156141b5578160200160208202803683370190505b50905060005b845181101561426f578481815181106141d057fe5b6020026020010151600001518482815181106141e857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084818151811061421457fe5b60200260200101516020015183828151811061422c57fe5b60200260200101818152505084818151811061424457fe5b60200260200101516040015182828151811061425c57fe5b60209081029190910101526001016141bb565b5084602001516001600160a01b03167fc93fd4851cdd85d065a0104d3ebd884cc66bd74dde6d8a86eedda35f77356036898989602001518960a001518a60c001518b600001518d604001518e606001518c8c8c604051808c151581526020018b8152602001806020018a815260200189815260200188815260200187815260200186815260200180602001806020018060200185810385528e818151815260200191508051906020019080838360005b8381101561433757818101518382015260200161431f565b50505050905090810190601f1680156143645780820380516001836020036101000a031916815260200191505b508581038452885181528851602091820191808b01910280838360005b83811015614399578181015183820152602001614381565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156143d85781810151838201526020016143c0565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156144175781810151838201526020016143ff565b505050509050019f5050505050505050505050505050505060405180910390a25050505050505050565b60008261445057506000613c80565b8282028284828161445d57fe5b041461449a5760405162461bcd60e51b8152600401808060200182810382526021815260200180615eab6021913960400191505060405180910390fd5b9392505050565b60008082116144f7576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161450057fe5b049392505050565b60008282018381101561449a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001546001600160a01b031633146145af576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b600082815260086020526040902060018101546001600160a01b031615801590614605575080544310155b6146405760405162461bcd60e51b815260040180806020018281038252602a815260200180615def602a913960400191505060405180910390fd5b81600010801561466c57506000838152600a602090815260408083203384529091529020600101548211155b6146ab576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b6004805460408051630d69191f60e41b81523393810193909352805160009384936001600160a01b03169263d69191f092602480840193829003018186803b1580156146f657600080fd5b505afa15801561470a573d6000803e3d6000fd5b505050506040513d604081101561472057600080fd5b508051602090910151909250905061473a8533848461495a565b606061474586613c86565b90506147548682338686614b62565b61476686338787600501548787615616565b614773868233868661540f565b600184015461478c906001600160a01b031633876155c4565b60018401546040805188815260208101889052815133936001600160a01b0316927fc544f856c32130d17b1c425626be0a3f8d4d0d4dbd9dc7522f3e210ca8f733e1928290030190a3505050505050565b600081815260086020526040902060018101546001600160a01b031615801590614808575080544310155b6148435760405162461bcd60e51b815260040180806020018281038252602a815260200180615def602a913960400191505060405180910390fd5b6004805460408051630d69191f60e41b81523393810193909352805160009384936001600160a01b03169263d69191f092602480840193829003018186803b15801561488e57600080fd5b505afa1580156148a2573d6000803e3d6000fd5b505050506040513d60408110156148b857600080fd5b50805160209091015190925090506148d28433848461495a565b60606148dd85613c86565b90506148ec8582338686614b62565b6148f9858233868661540f565b5050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261173e908590615965565b600084815260096020908152604080832054600a83528184206001600160a01b03881685529092529091206004810154614a005760005b828110156149fe57600482018054600181810183556000928352602080842090920183905560058501805480830182559084528284200183905560068501805480830182559084528284200183905560078501805480830182559084529183209091019190915501614991565b505b6001600160a01b038416156122bc576000868152600a602090815260408083206001600160a01b038816845290915290206004810154614aac5760005b83811015614aaa57600482018054600181810183556000928352602080842090920183905560058501805480830182559084528284200183905560068501805480830182559084528284200183905560078501805480830182559084529183209091019190915501614a3d565b505b6001600160a01b038416156110a2576000878152600a602090815260408083206001600160a01b038816845290915290206004810154614b585760005b84811015614b5657600482018054600181810183556000928352602080842090920183905560058501805480830182559084528284200183905560068501805480830182559084528284200183905560078501805480830182559084529183209091019190915501614ae9565b505b5050505050505050565b6000858152600a602090815260408083206001600160a01b0387168452825280832088845260098352818420805483518186028101860190945280845285948594859485949093606093869084015b82821015614c185760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101614bb1565b50505050905060005b81518110156135fd57818181518110614c3657fe5b60200260200101516000015193508b8181518110614c5057fe5b60200260200101519450826002015460001080614c71575082600301546000105b15614d4e57614cb869d3c21bcecceda100000061108e856006018481548110614c9657fe5b906000526020600020015461157d89886002015461444190919063ffffffff16565b9650614cfc69d3c21bcecceda100000061108e856007018481548110614cda57fe5b906000526020600020015461157d89886003015461444190919063ffffffff16565b9550614d2a87846004018381548110614d1157fe5b906000526020600020015461450890919063ffffffff16565b9650614d3f86846005018381548110614d1157fe5b9550614d4b8787614508565b97505b8715614f46576000836004018281548110614d6557fe5b90600052602060002001819055506000836005018281548110614d8457fe5b60009182526020808320909101929092556001600160a01b038087168252600c83526040808320918f16835292522054614dbe9089614508565b600c6000866001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550836001600160a01b0316600360009054906101000a90046001600160a01b03166001600160a01b03161415614eab57600354604080516340c10f1960e01b81526001600160a01b038e81166004830152602482018c9052915191909216916340c10f1991604480830192600092919082900301818387803b158015614e8e57600080fd5b505af1158015614ea2573d6000803e3d6000fd5b50505050614ef5565b6001600160a01b0384166000908152600b6020526040902054614ece9089613c24565b6001600160a01b0385166000818152600b6020526040902091909155614ef5908c8a6155c4565b604080518e81526020810189905280820188905290516001600160a01b03808e1692908716917f4e236244a1930cf7a42cb431522293c19bfe68da419e41778bb1738ea91ccd609181900360600190a35b6001600160a01b038a161561507b5760008d8152600a602090815260408083206001600160a01b038e16845290915290206002810154151580614f8d575080600301546000105b1561507957614fd469d3c21bcecceda100000061108e836006018581548110614fb257fe5b906000526020600020015461157d8a866002015461444190919063ffffffff16565b975061501869d3c21bcecceda100000061108e836007018581548110614ff657fe5b906000526020600020015461157d8a866003015461444190919063ffffffff16565b965061502d88826004018481548110614d1157fe5b81600401838154811061503c57fe5b906000526020600020018190555061505d87826005018481548110614d1157fe5b81600501838154811061506c57fe5b6000918252602090912001555b505b6001600160a01b0389161561516c5760008d8152600a602090815260408083206001600160a01b038d168452909152902060028101541515806150c2575080600301546000105b1561516a576150e769d3c21bcecceda100000061108e836006018581548110614fb257fe5b975061510969d3c21bcecceda100000061108e836007018581548110614ff657fe5b965061511e88826004018481548110614d1157fe5b81600401838154811061512d57fe5b906000526020600020018190555061514e87826005018481548110614d1157fe5b81600501838154811061515d57fe5b6000918252602090912001555b505b600101614c21565b600061518085856144a1565b60008881526008602052604090206002810154919250906151a19087614508565b600282015560048101546151b59083614508565b60048201556000888152600a602090815260408083206001600160a01b038b168452909152902060018101546151eb9088614508565b600182015560038101546151ff9084614508565b6003820155805461520e574381555b6000806001600160a01b038716156152d0576000615232606461108e886005614441565b60028501549091506152449082614508565b600285015560048501546152589082614508565b6004860155600061526f606461108e89600f614441565b60008e8152600a602090815260408083206001600160a01b038e16845290915290206002810154919250906152a49083614508565b6002820181905560048801549095506152bd9083614508565b600488015580546152cc574381555b5050505b6001600160a01b038616156153515760006152f1606461108e88600a614441565b60008d8152600a602090815260408083206001600160a01b038c16845290915290206002810154919250906153269083614508565b60028201819055600487015490935061533f9083614508565b6004870155805461534e574381555b50505b856001600160a01b0316876001600160a01b03168b6001600160a01b03167fbcb83545704eeae85addce8eab4d42b642e16a24e2e3eec7160ffd3d7c0571768e8860010160009054906101000a90046001600160a01b0316896004015489600201548a600301548a8a60405180888152602001876001600160a01b0316815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a45050505050505050505050565b6000858152600a602090815260408083206001600160a01b03871684529091528120815b8651811015614b585786818151811061544857fe5b6020026020010151925061546983836002015461444190919063ffffffff16565b82600601828154811061547857fe5b60009182526020909120015560038201546154939084614441565b8260070182815481106154a257fe5b6000918252602090912001556001600160a01b038516156155bc576000888152600a602090815260408083206001600160a01b0389168452909152902060028101546154ee9085614441565b8160060183815481106154fd57fe5b60009182526020909120015560038101546155189085614441565b81600701838154811061552757fe5b6000918252602090912001556001600160a01b038516156155ba576000898152600a602090815260408083206001600160a01b0389168452909152902060028101546155739086614441565b81600601848154811061558257fe5b600091825260209091200155600381015461559d9086614441565b8160070184815481106155ac57fe5b600091825260209091200155505b505b600101615433565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611806908490615965565b600061562285856144a1565b6000888152600860205260409020600281015491925090861061564b5760006002820155615660565b600281015461565a9087613c24565b60028201555b81816004015411615677576000600482015561568c565b60048101546156869083613c24565b60048201555b6000888152600a602090815260408083206001600160a01b038b168452909152902060018101546156bd9088613c24565b6001820155600381015483106156d957600060038201556156ee565b60038101546156e89084613c24565b60038201555b6000806001600160a01b03871615615803576000615712606461108e886005614441565b90508085600401541161572b5760006004860155615740565b600485015461573a9082613c24565b60048601555b80846002015411615757576000600285015561576c565b60028401546157669082613c24565b60028501555b600061577e606461108e89600f614441565b90508086600401541161579757600060048701556157ac565b60048601546157a69082613c24565b60048701555b60008d8152600a602090815260408083206001600160a01b038d1684529091529020600281015482106157e557600060028201556157fa565b60028101546157f49083613c24565b60028201555b60020154935050505b6001600160a01b03861615615351576000615824606461108e88600a614441565b90508085600401541161583d5760006004860155615852565b600485015461584c9082613c24565b60048601555b60008c8152600a602090815260408083206001600160a01b038b16845290915290206002810154821061588b57600060028201556158a0565b600281015461589a9083613c24565b60028201555b60020154915050856001600160a01b0316876001600160a01b03168b6001600160a01b03167fbcb83545704eeae85addce8eab4d42b642e16a24e2e3eec7160ffd3d7c0571768e8860010160009054906101000a90046001600160a01b0316896004015489600201548a600301548a8a60405180888152602001876001600160a01b0316815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a45050505050505050505050565b60606159ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316615a169092919063ffffffff16565b805190915015611806578080602001905160208110156159d957600080fd5b50516118065760405162461bcd60e51b815260040180806020018281038252602a815260200180615f1c602a913960400191505060405180910390fd5b6060613ef1848460008585615a2a85615b3c565b615a7b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310615aba5780518252601f199092019160209182019101615a9b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615b1c576040519150601f19603f3d011682016040523d82523d6000602084013e615b21565b606091505b5091509150615b31828286615b42565b979650505050505050565b3b151590565b60608315615b5157508161449a565b825115615b615782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615bab578181015183820152602001615b93565b50505050905090810190601f168015615bd85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518061010001604052806000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615ce75760008555615d2d565b82601f10615d0057805160ff1916838001178555615d2d565b82800160010185558215615d2d579182015b82811115615d2d578251825591602001919060010190615d12565b50615d39929150615d6e565b5090565b604051806080016040528060006001600160a01b031681526020016060815260200160008152602001600081525090565b5b80821115615d395760008155600101615d6f56fe596f75537761703a42414c414e43455f494e53554646494349454e5400000000596f75537761703a524557415244544f54414c5f4c4553535f5448414e5f52455741524450524f56494445596f75537761703a464f5242494444454e5f4e4f545f4f504552415445520000596f75537761703a504f4f4c5f4e4f545f45584953545f4f525f4d494e494e475f4e4f545f5354415254596f75537761703a504152414d455445525f4552524f525f5245574152445f544f54414c596f75537761703a5a45524f5f414444524553535f4f525f5a45524f5f414d4f554e54596f75537761703a5354414b455f414d4f554e545f544f4f5f534d414c4c5f4f525f544f4f5f4c41524745596f75537761703a464f5242494444454e5f4e4f545f4f574e45520000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77596f75537761703a504f4f4c5f4e4f545f45584953545f4f525f4d494e545f4e4f545f5354415254596f75537761703a504152414d455445525f4552524f525f5245574152445f5045525f424c4f434b5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564596f75537761703a504f4f4c5f4e4f545f45584953545f4f525f454e445f4f465f4d494e494e47596f75537761703a504152414d455445525f4552524f525f544f4f5f53484f52545f4f525f4c4f4e47596f75537761703a504f574552524154494f5f4d5553545f475245415445525f5448414e5f5a45524fa264697066735822122025532177b9a3af08f4fc5d512a9efe259993d9e6f16f19821b66c0a7c754b4ea64736f6c634300070400330000000000000000000000001d32916cfa6534d261ad53e2498ab95505bd251000000000000000000000000025310873e310b270aec5113a2d3037fa94166969
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063df5140a7116100b8578063eec30bfd1161007c578063eec30bfd14610d10578063f2fde38b14610d18578063f49f589114610d3e578063f525cb6814610d74578063fe55932a14610d7c57610248565b8063df5140a714610a3c578063df9e516c14610c8b578063e22ffa0814610ca8578063e46d811e14610cd6578063e9bb64c214610cde57610248565b8063bd2b0290116100ff578063bd2b0290146107c7578063d24287f91461081f578063d4f0afd114610929578063d6aa14cb1461094f578063dd87ad9d1461098957610248565b80638da5cb5b1461075a578063918b58e31461076257806396ddecfc1461076a578063a393b1461461078d578063a3ec191a146107bf57610248565b80634ff0198b116101c957806368833c1c1161018d57806368833c1c1461068657806369883b4e146106ac5780637b0472f0146106c957806388953cb9146106ec5780638ca527e6146106f457610248565b80634ff0198b14610526578063523a3f081461055257806358fa63ca1461056f5780635c335f07146105935780635f1bf90c1461063457610248565b8063372caeb811610210578063372caeb81461044b578063374043c41461046e57806347d7514b146104915780634b3b5f8a146104e95780634d51abf71461050357610248565b8063057b62761461024d5780630b93638d1461028357806311fed1a1146102b757806319f489821461037c57806330f2e6aa146103aa575b600080fd5b61026a6004803603602081101561026357600080fd5b5035610e27565b6040805192835260208301919091528051918290030190f35b6102b56004803603606081101561029957600080fd5b508035906001600160a01b036020820135169060400135610ed7565b005b6102e3600480360360408110156102cd57600080fd5b50803590602001356001600160a01b03166110ab565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561032757818101518382015260200161030f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561036657818101518382015260200161034e565b5050505090500194505050505060405180910390f35b6102b56004803603604081101561039257600080fd5b506001600160a01b0381351690602001351515611636565b6102b5600480360360208110156103c057600080fd5b810190602081018135600160201b8111156103da57600080fd5b8201836020820111156103ec57600080fd5b803590602001918460208302840111600160201b8311171561040d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611691945050505050565b6102b56004803603604081101561046157600080fd5b5080359060200135611744565b6102b56004803603604081101561048457600080fd5b508035906020013561174e565b61049961180b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104d55781810151838201526020016104bd565b505050509050019250505060405180910390f35b6104f1611863565b60408051918252519081900360200190f35b6102b56004803603604081101561051957600080fd5b5080359060200135611868565b61026a6004803603604081101561053c57600080fd5b50803590602001356001600160a01b0316611920565b6102b56004803603602081101561056857600080fd5b5035611b96565b610577611ba2565b604080516001600160a01b039092168252519081900360200190f35b6102b5600480360360208110156105a957600080fd5b810190602081018135600160201b8111156105c357600080fd5b8201836020820111156105d557600080fd5b803590602001918460208302840111600160201b831117156105f657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ba7945050505050565b6106606004803603604081101561064a57600080fd5b50803590602001356001600160a01b0316611c25565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6104f16004803603602081101561069c57600080fd5b50356001600160a01b0316611c57565b6104f1600480360360208110156106c257600080fd5b5035611c69565b6102b5600480360360408110156106df57600080fd5b5080359060200135611c8a565b610577611ff8565b6107116004803603602081101561070a57600080fd5b5035612007565b604080519889526001600160a01b039097166020890152878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b610577612054565b6104f1612063565b6102b56004803603604081101561078057600080fd5b5080359060200135612068565b6102b5600480360360608110156107a357600080fd5b508035906001600160a01b0360208201351690604001356122c4565b6104f161269d565b6107ea600480360360408110156107dd57600080fd5b50803590602001356126a3565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b61084b6004803603604081101561083557600080fd5b50803590602001356001600160a01b03166126fb565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561089357818101518382015260200161087b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156108d25781810151838201526020016108ba565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156109115781810151838201526020016108f9565b50505050905001965050505050505060405180910390f35b6104996004803603602081101561093f57600080fd5b50356001600160a01b0316612ca4565b6109756004803603602081101561096557600080fd5b50356001600160a01b0316612dfb565b604080519115158252519081900360200190f35b6109a66004803603602081101561099f57600080fd5b5035612e10565b60405180856001600160a01b0316815260200180602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156109fe5781810151838201526020016109e6565b50505050905090810190601f168015610a2b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102b56004803603610120811015610a5357600080fd5b810190602081018135600160201b811115610a6d57600080fd5b820183602082011115610a7f57600080fd5b803590602001918460018302840111600160201b83111715610aa057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b038535169560208601359560408101359550606081013594506080810135935060c081019060a00135600160201b811115610b1657600080fd5b820183602082011115610b2857600080fd5b803590602001918460208302840111600160201b83111715610b4957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b9857600080fd5b820183602082011115610baa57600080fd5b803590602001918460208302840111600160201b83111715610bcb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610c1a57600080fd5b820183602082011115610c2c57600080fd5b803590602001918460208302840111600160201b83111715610c4d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ed0945050505050565b6104f160048036036020811015610ca157600080fd5b503561360c565b6104f160048036036040811015610cbe57600080fd5b506001600160a01b0381358116916020013516613621565b6104f161363e565b61066060048036036060811015610cf457600080fd5b508035906001600160a01b036020820135169060400135613643565b610577613871565b6102b560048036036020811015610d2e57600080fd5b50356001600160a01b0316613880565b6102b560048036036060811015610d5457600080fd5b506001600160a01b03813581169160208101359091169060400135613984565b6104f1613b57565b6102b560048036036040811015610d9257600080fd5b81359190810190604081016020820135600160201b811115610db357600080fd5b820183602082011115610dc557600080fd5b803590602001918460018302840111600160201b83111715610de657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613b5d945050505050565b600080610e32615be6565b506000838152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e0830152610eb4576000809250925050610ed2565b60a0810151604082015160c0830151610ecc91613c24565b92509250505b915091565b3360009081526002602052604090205460ff16610f29576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600083815260086020526040902060018101546001600160a01b031615801590610f5557506007810154155b610f905760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b610f9984613c86565b506000848152600960205260408120600019915b81548110156110a257856001600160a01b0316828281548110610fcc57fe5b60009182526020909120600590910201546001600160a01b031614156110195784828281548110610ff957fe5b906000526020600020906005020160020181905550611019600088613ef9565b81818154811061102557fe5b90600052602060002090600502016002015483111561109a5781818154811061104a57fe5b9060005260206000209060050201600201549250611094600d61108e866005015461108869d3c21bcecceda10000008861444190919063ffffffff16565b90614441565b906144a1565b60068501555b600101610fad565b50505050505050565b606080606060096000868152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561114a5760008481526020908190206040805160a0810182526005860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003810154606084015260040154608083015290835290920191016110e3565b5050505090506060815167ffffffffffffffff8111801561116a57600080fd5b50604051908082528060200260200182016040528015611194578160200160208202803683370190505b5090506060825167ffffffffffffffff811180156111b157600080fd5b506040519080825280602002602001820160405280156111db578160200160208202803683370190505b5090506111e6615be6565b506000878152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e08301521561162757600080611267615c34565b60008b8152600a602090815260408083206001600160a01b038e1684528252918290208251610100810184528154815260018201548184015260028201548185015260038201546060820152600482018054855181860281018601909652808652919492936080860193929083018282801561130257602002820191906000526020600020905b8154815260200190600101908083116112ee575b505050505081526020016005820180548060200260200160405190810160405280929190818152602001828054801561135a57602002820191906000526020600020905b815481526020019060010190808311611346575b50505050508152602001600682018054806020026020016040519081016040528092919081815260200182805480156113b257602002820191906000526020600020905b81548152602001906001019080831161139e575b505050505081526020016007820180548060200260200160405190810160405280929190818152602001828054801561140a57602002820191906000526020600020905b8154815260200190600101908083116113f6575b505050505081525050905060005b875181101561162257611429615c79565b88828151811061143557fe5b60200260200101519050438660000151116115f05760009450885183608001515114156115d6576080860151156114f0576114858160400151611088886060015143613c2490919063ffffffff16565b935080602001516114a385836060015161450890919063ffffffff16565b106114be57606081015160208201516114bb91613c24565b93505b60808601516114ea906114df9061108e8769d3c21bcecceda1000000614441565b608083015190614508565b60808201525b8260800151828151811061150057fe5b602002602001015194506115348360a00151838151811061151d57fe5b60200260200101518661450890919063ffffffff16565b945061158a61158369d3c21bcecceda100000061108e8660c00151868151811061155a57fe5b602002602001015161157d8660800151896040015161444190919063ffffffff16565b90613c24565b8690614508565b94506115d361158369d3c21bcecceda100000061108e8660e0015186815181106115b057fe5b602002602001015161157d8660800151896060015161444190919063ffffffff16565b94505b848783815181106115e357fe5b6020026020010181815250505b806000015188838151811061160157fe5b6001600160a01b039092166020928302919091019091015250600101611418565b505050505b509093509150505b9250929050565b6001546001600160a01b03163314611683576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b61168d8282614562565b5050565b805160001080156116a457508051603210155b6116df5760405162461bcd60e51b8152600401808060200182810382526029815260200180615f6d6029913960400191505060405180910390fd5b60008060005b835181101561173e578381815181106116fa57fe5b6020908102919091018101516000818152600a8352604080822033835290935291909120600101549350915082156117365761173682846145da565b6001016116e5565b50505050565b61168d82826145da565b3360009081526002602052604090205460ff166117a0576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260076020526040902080546001600160a01b03166117f45760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b60028101829055611806600084613ef9565b505050565b6060600680548060200260200160405190810160405280929190818152602001828054801561185957602002820191906000526020600020905b815481526020019060010190808311611845575b5050505050905090565b600581565b3360009081526002602052604090205460ff166118ba576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260076020526040902080546001600160a01b031661190e5760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b60038101829055611806600084613ef9565b60008061192b615be6565b506000848152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281019290925260028101549282019290925260038201546060820152600482015460808201819052600583015460a0830152600683015460c083015260079092015460e0820152906119b357600080925092505061162f565b6119bb615c34565b6000868152600a602090815260408083206001600160a01b038916845282529182902082516101008101845281548152600182015481840152600282015481850152600382015460608201526004820180548551818602810186019096528086529194929360808601939290830182828015611a5657602002820191906000526020600020905b815481526020019060010190808311611a42575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611aae57602002820191906000526020600020905b815481526020019060010190808311611a9a575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611b0657602002820191906000526020600020905b815481526020019060010190808311611af2575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611b5e57602002820191906000526020600020905b815481526020019060010190808311611b4a575b5050505050815250509050611b848160600151826040015161450890919063ffffffff16565b82608001519350935050509250929050565b611b9f816147dd565b50565b600081565b80516000108015611bba57508051603210155b611bf55760405162461bcd60e51b8152600401808060200182810382526029815260200180615f6d6029913960400191505060405180910390fd5b60005b815181101561168d57611c1d828281518110611c1057fe5b60200260200101516147dd565b600101611bf8565b600a60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b600b6020526000908152604090205481565b60068181548110611c7957600080fd5b600091825260209091200154905081565b80600010611cdf576040805162461bcd60e51b815260206004820152601760248201527f596f75537761703a504152414d455445525f4552524f52000000000000000000604482015290519081900360640190fd5b600082815260086020526040902060018101546001600160a01b031615801590611d0a575080544310155b611d455760405162461bcd60e51b8152600401808060200182810382526028815260200180615ecc6028913960400191505060405180910390fd5b81816005015411158015611d6a575060068101546002820154611d689084614508565b105b611da55760405162461bcd60e51b815260040180806020018281038252602b815260200180615e60602b913960400191505060405180910390fd5b600480546040805163aaaf7eaf60e01b8152339381019390935280516000936001600160a01b039093169263aaaf7eaf926024808301939192829003018186803b158015611df257600080fd5b505afa158015611e06573d6000803e3d6000fd5b505050506040513d6040811015611e1c57600080fd5b5060200151905080611ec4576004805460408051630354740160e31b815290516001600160a01b0390921692631aa3a0089282820192602092908290030181600087803b158015611e6c57600080fd5b505af1158015611e80573d6000803e3d6000fd5b505050506040513d6020811015611e9657600080fd5b505060405133907faae87b0d5fa6fab112ec583bb4f7405cb8da557e222b0061761336d65516857290600090a25b6001820154611ede906001600160a01b0316333086614900565b6004805460408051630d69191f60e41b81523393810193909352805160009384936001600160a01b03169263d69191f092602480840193829003018186803b158015611f2957600080fd5b505afa158015611f3d573d6000803e3d6000fd5b505050506040513d6040811015611f5357600080fd5b5080516020909101519092509050611f6d8633848461495a565b6060611f7887613c86565b9050611f878782338686614b62565b611f9987338888600501548787615174565b611fa6878233868661540f565b60018501546040805189815260208101899052815133936001600160a01b0316927ff7373f56c201647feae85a62d3cf56286ed3a43d20c5eb7f9883d6ea690ef7c0928290030190a350505050505050565b6003546001600160a01b031681565b6008602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495966001600160a01b0390951695939492939192909188565b6001546001600160a01b031681565b600f81565b3360009081526002602052604090205460ff166120ba576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260086020526040812060018101546001600160a01b0316158015906120e657506007810154155b6121215760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b600084815260096020908152604080832080548251818502810185019093528083526000199460609484015b828210156121b45760008481526020908190206040805160a0810182526005860290920180546001600160a01b031683526001808201548486015260028201549284019290925260038101546060840152600401546080830152908352909201910161214d565b50505050905060005b8151811015612234578181815181106121d257fe5b60200260200101516040015183111561222c578181815181106121f157fe5b6020026020010151604001519250612229600d61108e866005015461108869d3c21bcecceda10000008861444190919063ffffffff16565b94505b6001016121bd565b508483600501541115801561224d575084836002015411155b80156122595750838511155b6122aa576040805162461bcd60e51b815260206004820181905260248201527f596f75537761703a4d41585f5354414b455f414d4f554e545f494e56414c4944604482015290519081900360640190fd5b600683018590556122bc600087613ef9565b505050505050565b3360009081526002602052604090205460ff16612316576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b61231e615be6565b506000838152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e08301521580159061239f575060e0810151155b6123da5760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b6123e384613c86565b506000848152600960205260408120905b81548110156122bc57846001600160a01b031682828154811061241357fe5b60009182526020909120600590910201546001600160a01b03161415612695578382828154811061244057fe5b906000526020600020906005020160030154111561248f5760405162461bcd60e51b815260040180806020018281038252602b815260200180615da4602b913960400191505060405180910390fd5b6003546001600160a01b0386811691161461266857838282815481106124b157fe5b90600052602060002090600502016001015411156125395761251b6124fc858484815481106124dc57fe5b906000526020600020906005020160010154613c2490919063ffffffff16565b6001600160a01b0387166000908152600b602052604090205490613c24565b6001600160a01b0386166000908152600b60205260409020556125a5565b61258b61256c83838154811061254b57fe5b90600052602060002090600502016001015486613c2490919063ffffffff16565b6001600160a01b0387166000908152600b602052604090205490614508565b6001600160a01b0386166000908152600b60205260409020555b6001600160a01b0385166000818152600b60209081526040918290205482516370a0823160e01b815230600482015292519093926370a08231926024808301939192829003018186803b1580156125fb57600080fd5b505afa15801561260f573d6000803e3d6000fd5b505050506040513d602081101561262557600080fd5b50511015612668576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b8382828154811061267557fe5b906000526020600020906005020160010181905550612695600087613ef9565b6001016123f4565b60005481565b600960205281600052604060002081815481106126bf57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919085565b60608060608060096000878152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561279b5760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101612734565b5050505090506060815167ffffffffffffffff811180156127bb57600080fd5b506040519080825280602002602001820160405280156127e5578160200160208202803683370190505b5090506060825167ffffffffffffffff8111801561280257600080fd5b5060405190808252806020026020018201604052801561282c578160200160208202803683370190505b5090506060835167ffffffffffffffff8111801561284957600080fd5b50604051908082528060200260200182016040528015612873578160200160208202803683370190505b50905061287e615be6565b506000898152600860209081526040918290208251610100810184528154815260018201546001600160a01b03169281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e083015215612c94576000806000612901615c34565b600a60008f815260200190815260200160002060008e6001600160a01b03166001600160a01b031681526020019081526020016000206040518061010001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054806020026020016040519081016040528092919081815260200182805480156129ba57602002820191906000526020600020905b8154815260200190600101908083116129a6575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015612a1257602002820191906000526020600020905b8154815260200190600101908083116129fe575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a6a57602002820191906000526020600020905b815481526020019060010190808311612a56575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612ac257602002820191906000526020600020905b815481526020019060010190808311612aae575b505050505081525050905060005b8951811015612c8e57612ae1615c79565b8a8281518110612aed57fe5b6020026020010151905043876000015111612c5c5760009550600094508a518360800151511415612c2957608087015115612ba157612b418160400151611088896060015143613c2490919063ffffffff16565b93508060200151612b5f85836060015161450890919063ffffffff16565b10612b7a5760608101516020820151612b7791613c24565b93505b6080870151612b9b906114df9061108e8769d3c21bcecceda1000000614441565b60808201525b82608001518281518110612bb157fe5b602002602001015195508260a001518281518110612bcb57fe5b60200260200101519450612c00612bf969d3c21bcecceda100000061108e8660c00151868151811061155a57fe5b8790614508565b9550612c2661158369d3c21bcecceda100000061108e8660e0015186815181106115b057fe5b94505b85898381518110612c3657fe5b60200260200101818152505084888381518110612c4f57fe5b6020026020010181815250505b80600001518a8381518110612c6d57fe5b6001600160a01b039092166020928302919091019091015250600101612ad0565b50505050505b5091955093509150509250925092565b60606000805b600654811015612d1057836001600160a01b03166007600060068481548110612ccf57fe5b600091825260208083209091015483528201929092526040019020546001600160a01b03161415612d0857612d05826001614508565b91505b600101612caa565b5060608167ffffffffffffffff81118015612d2a57600080fd5b50604051908082528060200260200182016040528015612d54578160200160208202803683370190505b5090506000915060005b600654811015612df357846001600160a01b03166007600060068481548110612d8357fe5b600091825260208083209091015483528201929092526040019020546001600160a01b03161415612deb5760068181548110612dbb57fe5b9060005260206000200154828481518110612dd257fe5b6020908102919091010152612de8836001614508565b92505b600101612d5e565b509392505050565b60026020526000908152604090205460ff1681565b6007602090815260009182526040918290208054600180830180548651600261010094831615949094026000190190911692909204601f81018690048602830186019096528582526001600160a01b03909216949293909290830182828015612eba5780601f10612e8f57610100808354040283529160200191612eba565b820191906000526020600020905b815481529060010190602001808311612e9d57829003601f168201915b5050505050908060020154908060030154905084565b3360009081526002602052604090205460ff16612f22576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b6001600160a01b03881615801590612f435750306001600160a01b03891614155b612f94576040805162461bcd60e51b815260206004820152601d60248201527f596f75537761703a504152414d455445525f4552524f525f544f4b454e000000604482015290519081900360640190fd5b86600010612fd35760405162461bcd60e51b8152600401808060200182810382526029815260200180615f966029913960400191505060405180910390fd5b82516000108015612fe657508251600a10155b8015612ff3575081518351145b8015613000575080518351145b613051576040805162461bcd60e51b815260206004820152601e60248201527f596f75537761703a504152414d455445525f4552524f525f5245574152440000604482015290519081900360640190fd5b43861061305e5785613060565b435b9550600061307d6301312d0060055461450890919063ffffffff16565b60068054600181810183556000929092527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f018290556005549192506130c39190614508565b600555600081815260076020908152604090912080546001600160a01b0319166001600160a01b038c161781558b5190916131059160018401918e0190615cb1565b5060028101879055851561311f5760038101869055613140565b60065461313a90604b90613134906064614441565b90614508565b60038201555b6000828152600860205260408120898155600180820180546001600160a01b0319166001600160a01b038f16179055600282019290925590613183908a90613c24565b6003820155600060048201819055600582018b90556006820181905560078201819055600019905b87518110156135f1578781815181106131c057fe5b60200260200101516001600160a01b031660006001600160a01b03161415801561320f57508781815181106131f157fe5b60200260200101516001600160a01b0316306001600160a01b031614155b613260576040805162461bcd60e51b815260206004820152601d60248201527f596f75537761703a504152414d455445525f4552524f525f544f4b454e000000604482015290519081900360640190fd5b86818151811061326c57fe5b60200260200101516000106132b25760405162461bcd60e51b8152600401808060200182810382526024815260200180615e196024913960400191505060405180910390fd5b8581815181106132be57fe5b60200260200101516000106133045760405162461bcd60e51b8152600401808060200182810382526028815260200180615ef46028913960400191505060405180910390fd5b87818151811061331057fe5b60209081029190910101516003546001600160a01b039081169116146134d05761338e87828151811061333f57fe5b6020026020010151600b60008b858151811061335757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461450890919063ffffffff16565b600b60008a848151811061339e57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600b60008983815181106133da57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205488828151811061340f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561346357600080fd5b505afa158015613477573d6000803e3d6000fd5b505050506040513d602081101561348d57600080fd5b505110156134d0576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b6134d8615c79565b8882815181106134e457fe5b60209081029190910101516001600160a01b03168152875188908390811061350857fe5b602002602001015181602001818152505086828151811061352557fe5b6020908102919091018101516040838101918252600060608501818152608086018281528b83526009865292822080546001808201835591845292869020875160059094020180546001600160a01b0319166001600160a01b03909416939093178355948601519482019490945591516002830181905592516003830155516004909101558311156135e857806040015192506135e2600d61108e866005015461108869d3c21bcecceda10000008861444190919063ffffffff16565b60068501555b506001016131ab565b506135fd600185613ef9565b50505050505050505050505050565b60009081526008602052604090206005015490565b600c60209081526000928352604080842090915290825290205481565b600a81565b600080600080613651615c34565b6000888152600a602090815260408083206001600160a01b038b168452825291829020825161010081018452815481526001820154818401526002820154818501526003820154606082015260048201805485518186028101860190965280865291949293608086019392908301828280156136ec57602002820191906000526020600020905b8154815260200190600101908083116136d8575b505050505081526020016005820180548060200260200160405190810160405280929190818152602001828054801561374457602002820191906000526020600020905b815481526020019060010190808311613730575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561379c57602002820191906000526020600020905b815481526020019060010190808311613788575b50505050508152602001600782018054806020026020016040519081016040528092919081815260200182805480156137f457602002820191906000526020600020905b8154815260200190600101908083116137e0575b50505050508152505090508060800151868151811061380f57fe5b60200260200101518160a00151878151811061382757fe5b60200260200101518260c00151888151811061383f57fe5b60200260200101518360e00151898151811061385757fe5b602002602001015194509450945094505093509350935093565b6004546001600160a01b031681565b6001546001600160a01b031633146138cd576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b6001600160a01b038116613928576040805162461bcd60e51b815260206004820152601960248201527f596f75537761703a494e56414c49445f41444452455353455300000000000000604482015290519081900360640190fd5b6001546040516001600160a01b038084169216907f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c90600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146139d1576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b6001600160a01b038316158015906139f157506001600160a01b03821615155b80156139fd5750806000105b613a385760405162461bcd60e51b8152600401808060200182810382526023815260200180615e3d6023913960400191505060405180910390fd5b80836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613a8657600080fd5b505afa158015613a9a573d6000803e3d6000fd5b505050506040513d6020811015613ab057600080fd5b50511015613af3576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b613b076001600160a01b03841683836155c4565b816001600160a01b0316836001600160a01b03167f4f419798e514c337b327bb657066e69201f8adf380d6894b7f60cdf937ea9f03836040518082815260200191505060405180910390a3505050565b60055481565b3360009081526002602052604090205460ff16613baf576040805162461bcd60e51b815260206004820152601e6024820152600080516020615dcf833981519152604482015290519081900360640190fd5b600082815260076020526040902080546001600160a01b0316613c035760405162461bcd60e51b8152600401808060200182810382526027815260200180615f466027913960400191505060405180910390fd5b8151613c189060018301906020850190615cb1565b50611806600084613ef9565b600082821115613c7b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000818152600860209081526040808320600990925290912080546060929190839067ffffffffffffffff81118015613cbe57600080fd5b50604051908082528060200260200182016040528015613ce8578160200160208202803683370190505b50600484015490915015613ea6576000806000613d12866003015443613c2490919063ffffffff16565b905060005b8554811015613e54576000868281548110613d2e57fe5b90600052602060002090600502019050613d5581600201548461444190919063ffffffff16565b93508060010154613d7385836003015461450890919063ffffffff16565b10613d9b5760038101546001820154613d8b91613c24565b9350613d98856001614508565b94505b6003810154613daa9085614508565b60038201556004880154613ddb90613dd09061108e8769d3c21bcecceda1000000614441565b600483015490614508565b600482018190558651879084908110613df057fe5b60209081029190910101528315613e4b578054604080518c81526020810187905281516001600160a01b03909316927f4e3883c75cc9c752bb1db2e406a822e4a75067ae77ad9a0a4d179f2709b9e1f6929181900390910190a25b50600101613d17565b504360038701558454831415613e9e574360078701556040805189815290517f3ff9cb67fb8342155b3414d735a9d18cc79ebb0c5b234f801da50205fdf2b7089181900360200190a15b505050613ef1565b60005b8254811015613eef57828181548110613ebe57fe5b906000526020600020906005020160040154828281518110613edc57fe5b6020908102919091010152600101613ea9565b505b949350505050565b613f01615d3d565b600082815260076020908152604091829020825160808101845281546001600160a01b03168152600180830180548651600261010094831615949094026000190190911692909204601f8101869004860283018601909652858252919492938581019391929190830182828015613fb95780601f10613f8e57610100808354040283529160200191613fb9565b820191906000526020600020905b815481529060010190602001808311613f9c57829003601f168201915b50505050508152602001600282015481526020016003820154815250509050613fe0615be6565b5060008281526008602090815260408083208151610100810183528154815260018201546001600160a01b031681850152600282015481840152600382015460608083019190915260048301546080830152600583015460a0830152600683015460c083015260079092015460e08201528685526009845282852080548451818702810187019095528085529195929490929084015b828210156140dd5760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101614076565b5050505090506060815167ffffffffffffffff811180156140fd57600080fd5b50604051908082528060200260200182016040528015614127578160200160208202803683370190505b5090506060825167ffffffffffffffff8111801561414457600080fd5b5060405190808252806020026020018201604052801561416e578160200160208202803683370190505b5090506060835167ffffffffffffffff8111801561418b57600080fd5b506040519080825280602002602001820160405280156141b5578160200160208202803683370190505b50905060005b845181101561426f578481815181106141d057fe5b6020026020010151600001518482815181106141e857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084818151811061421457fe5b60200260200101516020015183828151811061422c57fe5b60200260200101818152505084818151811061424457fe5b60200260200101516040015182828151811061425c57fe5b60209081029190910101526001016141bb565b5084602001516001600160a01b03167fc93fd4851cdd85d065a0104d3ebd884cc66bd74dde6d8a86eedda35f77356036898989602001518960a001518a60c001518b600001518d604001518e606001518c8c8c604051808c151581526020018b8152602001806020018a815260200189815260200188815260200187815260200186815260200180602001806020018060200185810385528e818151815260200191508051906020019080838360005b8381101561433757818101518382015260200161431f565b50505050905090810190601f1680156143645780820380516001836020036101000a031916815260200191505b508581038452885181528851602091820191808b01910280838360005b83811015614399578181015183820152602001614381565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156143d85781810151838201526020016143c0565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156144175781810151838201526020016143ff565b505050509050019f5050505050505050505050505050505060405180910390a25050505050505050565b60008261445057506000613c80565b8282028284828161445d57fe5b041461449a5760405162461bcd60e51b8152600401808060200182810382526021815260200180615eab6021913960400191505060405180910390fd5b9392505050565b60008082116144f7576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161450057fe5b049392505050565b60008282018381101561449a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001546001600160a01b031633146145af576040805162461bcd60e51b815260206004820152601b6024820152600080516020615e8b833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b600082815260086020526040902060018101546001600160a01b031615801590614605575080544310155b6146405760405162461bcd60e51b815260040180806020018281038252602a815260200180615def602a913960400191505060405180910390fd5b81600010801561466c57506000838152600a602090815260408083203384529091529020600101548211155b6146ab576040805162461bcd60e51b815260206004820152601c6024820152600080516020615d84833981519152604482015290519081900360640190fd5b6004805460408051630d69191f60e41b81523393810193909352805160009384936001600160a01b03169263d69191f092602480840193829003018186803b1580156146f657600080fd5b505afa15801561470a573d6000803e3d6000fd5b505050506040513d604081101561472057600080fd5b508051602090910151909250905061473a8533848461495a565b606061474586613c86565b90506147548682338686614b62565b61476686338787600501548787615616565b614773868233868661540f565b600184015461478c906001600160a01b031633876155c4565b60018401546040805188815260208101889052815133936001600160a01b0316927fc544f856c32130d17b1c425626be0a3f8d4d0d4dbd9dc7522f3e210ca8f733e1928290030190a3505050505050565b600081815260086020526040902060018101546001600160a01b031615801590614808575080544310155b6148435760405162461bcd60e51b815260040180806020018281038252602a815260200180615def602a913960400191505060405180910390fd5b6004805460408051630d69191f60e41b81523393810193909352805160009384936001600160a01b03169263d69191f092602480840193829003018186803b15801561488e57600080fd5b505afa1580156148a2573d6000803e3d6000fd5b505050506040513d60408110156148b857600080fd5b50805160209091015190925090506148d28433848461495a565b60606148dd85613c86565b90506148ec8582338686614b62565b6148f9858233868661540f565b5050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261173e908590615965565b600084815260096020908152604080832054600a83528184206001600160a01b03881685529092529091206004810154614a005760005b828110156149fe57600482018054600181810183556000928352602080842090920183905560058501805480830182559084528284200183905560068501805480830182559084528284200183905560078501805480830182559084529183209091019190915501614991565b505b6001600160a01b038416156122bc576000868152600a602090815260408083206001600160a01b038816845290915290206004810154614aac5760005b83811015614aaa57600482018054600181810183556000928352602080842090920183905560058501805480830182559084528284200183905560068501805480830182559084528284200183905560078501805480830182559084529183209091019190915501614a3d565b505b6001600160a01b038416156110a2576000878152600a602090815260408083206001600160a01b038816845290915290206004810154614b585760005b84811015614b5657600482018054600181810183556000928352602080842090920183905560058501805480830182559084528284200183905560068501805480830182559084528284200183905560078501805480830182559084529183209091019190915501614ae9565b505b5050505050505050565b6000858152600a602090815260408083206001600160a01b0387168452825280832088845260098352818420805483518186028101860190945280845285948594859485949093606093869084015b82821015614c185760008481526020908190206040805160a0810182526005860290920180546001600160a01b0316835260018082015484860152600282015492840192909252600381015460608401526004015460808301529083529092019101614bb1565b50505050905060005b81518110156135fd57818181518110614c3657fe5b60200260200101516000015193508b8181518110614c5057fe5b60200260200101519450826002015460001080614c71575082600301546000105b15614d4e57614cb869d3c21bcecceda100000061108e856006018481548110614c9657fe5b906000526020600020015461157d89886002015461444190919063ffffffff16565b9650614cfc69d3c21bcecceda100000061108e856007018481548110614cda57fe5b906000526020600020015461157d89886003015461444190919063ffffffff16565b9550614d2a87846004018381548110614d1157fe5b906000526020600020015461450890919063ffffffff16565b9650614d3f86846005018381548110614d1157fe5b9550614d4b8787614508565b97505b8715614f46576000836004018281548110614d6557fe5b90600052602060002001819055506000836005018281548110614d8457fe5b60009182526020808320909101929092556001600160a01b038087168252600c83526040808320918f16835292522054614dbe9089614508565b600c6000866001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550836001600160a01b0316600360009054906101000a90046001600160a01b03166001600160a01b03161415614eab57600354604080516340c10f1960e01b81526001600160a01b038e81166004830152602482018c9052915191909216916340c10f1991604480830192600092919082900301818387803b158015614e8e57600080fd5b505af1158015614ea2573d6000803e3d6000fd5b50505050614ef5565b6001600160a01b0384166000908152600b6020526040902054614ece9089613c24565b6001600160a01b0385166000818152600b6020526040902091909155614ef5908c8a6155c4565b604080518e81526020810189905280820188905290516001600160a01b03808e1692908716917f4e236244a1930cf7a42cb431522293c19bfe68da419e41778bb1738ea91ccd609181900360600190a35b6001600160a01b038a161561507b5760008d8152600a602090815260408083206001600160a01b038e16845290915290206002810154151580614f8d575080600301546000105b1561507957614fd469d3c21bcecceda100000061108e836006018581548110614fb257fe5b906000526020600020015461157d8a866002015461444190919063ffffffff16565b975061501869d3c21bcecceda100000061108e836007018581548110614ff657fe5b906000526020600020015461157d8a866003015461444190919063ffffffff16565b965061502d88826004018481548110614d1157fe5b81600401838154811061503c57fe5b906000526020600020018190555061505d87826005018481548110614d1157fe5b81600501838154811061506c57fe5b6000918252602090912001555b505b6001600160a01b0389161561516c5760008d8152600a602090815260408083206001600160a01b038d168452909152902060028101541515806150c2575080600301546000105b1561516a576150e769d3c21bcecceda100000061108e836006018581548110614fb257fe5b975061510969d3c21bcecceda100000061108e836007018581548110614ff657fe5b965061511e88826004018481548110614d1157fe5b81600401838154811061512d57fe5b906000526020600020018190555061514e87826005018481548110614d1157fe5b81600501838154811061515d57fe5b6000918252602090912001555b505b600101614c21565b600061518085856144a1565b60008881526008602052604090206002810154919250906151a19087614508565b600282015560048101546151b59083614508565b60048201556000888152600a602090815260408083206001600160a01b038b168452909152902060018101546151eb9088614508565b600182015560038101546151ff9084614508565b6003820155805461520e574381555b6000806001600160a01b038716156152d0576000615232606461108e886005614441565b60028501549091506152449082614508565b600285015560048501546152589082614508565b6004860155600061526f606461108e89600f614441565b60008e8152600a602090815260408083206001600160a01b038e16845290915290206002810154919250906152a49083614508565b6002820181905560048801549095506152bd9083614508565b600488015580546152cc574381555b5050505b6001600160a01b038616156153515760006152f1606461108e88600a614441565b60008d8152600a602090815260408083206001600160a01b038c16845290915290206002810154919250906153269083614508565b60028201819055600487015490935061533f9083614508565b6004870155805461534e574381555b50505b856001600160a01b0316876001600160a01b03168b6001600160a01b03167fbcb83545704eeae85addce8eab4d42b642e16a24e2e3eec7160ffd3d7c0571768e8860010160009054906101000a90046001600160a01b0316896004015489600201548a600301548a8a60405180888152602001876001600160a01b0316815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a45050505050505050505050565b6000858152600a602090815260408083206001600160a01b03871684529091528120815b8651811015614b585786818151811061544857fe5b6020026020010151925061546983836002015461444190919063ffffffff16565b82600601828154811061547857fe5b60009182526020909120015560038201546154939084614441565b8260070182815481106154a257fe5b6000918252602090912001556001600160a01b038516156155bc576000888152600a602090815260408083206001600160a01b0389168452909152902060028101546154ee9085614441565b8160060183815481106154fd57fe5b60009182526020909120015560038101546155189085614441565b81600701838154811061552757fe5b6000918252602090912001556001600160a01b038516156155ba576000898152600a602090815260408083206001600160a01b0389168452909152902060028101546155739086614441565b81600601848154811061558257fe5b600091825260209091200155600381015461559d9086614441565b8160070184815481106155ac57fe5b600091825260209091200155505b505b600101615433565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611806908490615965565b600061562285856144a1565b6000888152600860205260409020600281015491925090861061564b5760006002820155615660565b600281015461565a9087613c24565b60028201555b81816004015411615677576000600482015561568c565b60048101546156869083613c24565b60048201555b6000888152600a602090815260408083206001600160a01b038b168452909152902060018101546156bd9088613c24565b6001820155600381015483106156d957600060038201556156ee565b60038101546156e89084613c24565b60038201555b6000806001600160a01b03871615615803576000615712606461108e886005614441565b90508085600401541161572b5760006004860155615740565b600485015461573a9082613c24565b60048601555b80846002015411615757576000600285015561576c565b60028401546157669082613c24565b60028501555b600061577e606461108e89600f614441565b90508086600401541161579757600060048701556157ac565b60048601546157a69082613c24565b60048701555b60008d8152600a602090815260408083206001600160a01b038d1684529091529020600281015482106157e557600060028201556157fa565b60028101546157f49083613c24565b60028201555b60020154935050505b6001600160a01b03861615615351576000615824606461108e88600a614441565b90508085600401541161583d5760006004860155615852565b600485015461584c9082613c24565b60048601555b60008c8152600a602090815260408083206001600160a01b038b16845290915290206002810154821061588b57600060028201556158a0565b600281015461589a9083613c24565b60028201555b60020154915050856001600160a01b0316876001600160a01b03168b6001600160a01b03167fbcb83545704eeae85addce8eab4d42b642e16a24e2e3eec7160ffd3d7c0571768e8860010160009054906101000a90046001600160a01b0316896004015489600201548a600301548a8a60405180888152602001876001600160a01b0316815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a45050505050505050505050565b60606159ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316615a169092919063ffffffff16565b805190915015611806578080602001905160208110156159d957600080fd5b50516118065760405162461bcd60e51b815260040180806020018281038252602a815260200180615f1c602a913960400191505060405180910390fd5b6060613ef1848460008585615a2a85615b3c565b615a7b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310615aba5780518252601f199092019160209182019101615a9b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615b1c576040519150601f19603f3d011682016040523d82523d6000602084013e615b21565b606091505b5091509150615b31828286615b42565b979650505050505050565b3b151590565b60608315615b5157508161449a565b825115615b615782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615bab578181015183820152602001615b93565b50505050905090810190601f168015615bd85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518061010001604052806000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615ce75760008555615d2d565b82601f10615d0057805160ff1916838001178555615d2d565b82800160010185558215615d2d579182015b82811115615d2d578251825591602001919060010190615d12565b50615d39929150615d6e565b5090565b604051806080016040528060006001600160a01b031681526020016060815260200160008152602001600081525090565b5b80821115615d395760008155600101615d6f56fe596f75537761703a42414c414e43455f494e53554646494349454e5400000000596f75537761703a524557415244544f54414c5f4c4553535f5448414e5f52455741524450524f56494445596f75537761703a464f5242494444454e5f4e4f545f4f504552415445520000596f75537761703a504f4f4c5f4e4f545f45584953545f4f525f4d494e494e475f4e4f545f5354415254596f75537761703a504152414d455445525f4552524f525f5245574152445f544f54414c596f75537761703a5a45524f5f414444524553535f4f525f5a45524f5f414d4f554e54596f75537761703a5354414b455f414d4f554e545f544f4f5f534d414c4c5f4f525f544f4f5f4c41524745596f75537761703a464f5242494444454e5f4e4f545f4f574e45520000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77596f75537761703a504f4f4c5f4e4f545f45584953545f4f525f4d494e545f4e4f545f5354415254596f75537761703a504152414d455445525f4552524f525f5245574152445f5045525f424c4f434b5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564596f75537761703a504f4f4c5f4e4f545f45584953545f4f525f454e445f4f465f4d494e494e47596f75537761703a504152414d455445525f4552524f525f544f4f5f53484f52545f4f525f4c4f4e47596f75537761703a504f574552524154494f5f4d5553545f475245415445525f5448414e5f5a45524fa264697066735822122025532177b9a3af08f4fc5d512a9efe259993d9e6f16f19821b66c0a7c754b4ea64736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001d32916cfa6534d261ad53e2498ab95505bd251000000000000000000000000025310873e310b270aec5113a2d3037fa94166969
-----Decoded View---------------
Arg [0] : _you (address): 0x1d32916CFA6534D261AD53E2498AB95505bd2510
Arg [1] : _invite (address): 0x25310873E310b270aEc5113A2d3037FA94166969
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d32916cfa6534d261ad53e2498ab95505bd2510
Arg [1] : 00000000000000000000000025310873e310b270aec5113a2d3037fa94166969
Deployed Bytecode Sourcemap
37638:42600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49969:347;;;;;;;;;;;;;;;;-1:-1:-1;49969:347:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;54839:1165;;;;;;;;;;;;;;;;-1:-1:-1;54839:1165:0;;;-1:-1:-1;;;;;54839:1165:0;;;;;;;;;;:::i;:::-;;43793:2487;;;;;;;;;;;;;;;;-1:-1:-1;43793:2487:0;;;;;;-1:-1:-1;;;;;43793:2487:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50982:127;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50982:127:0;;;;;;;;;;:::i;41763:510::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41763:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41763:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41763:510:0;;-1:-1:-1;41763:510:0;;-1:-1:-1;;;;;41763:510:0:i;41587:110::-;;;;;;;;;;;;;;;;-1:-1:-1;41587:110:0;;;;;;;:::i;58242:405::-;;;;;;;;;;;;;;;;-1:-1:-1;58242:405:0;;;;;;;:::i;49811:104::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37814:46;;;:::i;:::-;;;;;;;;;;;;;;;;58701:405;;;;;;;;;;;;;;;;-1:-1:-1;58701:405:0;;;;;;;:::i;43299:440::-;;;;;;;;;;;;;;;;-1:-1:-1;43299:440:0;;;;;;-1:-1:-1;;;;;43299:440:0;;:::i;42321:100::-;;;;;;;;;;;;;;;;-1:-1:-1;42321:100:0;;:::i;37766:41::-;;;:::i;:::-;;;;-1:-1:-1;;;;;37766:41:0;;;;;;;;;;;;;;42471:298;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42471:298:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42471:298:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42471:298:0;;-1:-1:-1;42471:298:0;;-1:-1:-1;;;;;42471:298:0:i;38713:75::-;;;;;;;;;;;;;;;;-1:-1:-1;38713:75:0;;;;;;-1:-1:-1;;;;;38713:75:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38844:54;;;;;;;;;;;;;;;;-1:-1:-1;38844:54:0;-1:-1:-1;;;;;38844:54:0;;:::i;38347:24::-;;;;;;;;;;;;;;;;-1:-1:-1;38347:24:0;;:::i;39907:1620::-;;;;;;;;;;;;;;;;-1:-1:-1;39907:1620:0;;;;;;;:::i;38202:20::-;;;:::i;38494:55::-;;;;;;;;;;;;;;;;-1:-1:-1;38494:55:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38494:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38096:20;;;:::i;37889:43::-;;;:::i;59118:1171::-;;;;;;;;;;;;;;;;-1:-1:-1;59118:1171:0;;;;;;;:::i;56057:1686::-;;;;;;;;;;;;;;;;-1:-1:-1;56057:1686:0;;;-1:-1:-1;;;;;56057:1686:0;;;;;;;;;;:::i;38043:26::-;;;:::i;38600:59::-;;;;;;;;;;;;;;;;-1:-1:-1;38600:59:0;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;38600:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46330:2756;;;;;;;;;;;;;;;;-1:-1:-1;46330:2756:0;;;;;;-1:-1:-1;;;;;46330:2756:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49151:620;;;;;;;;;;;;;;;;-1:-1:-1;49151:620:0;-1:-1:-1;;;;;49151:620:0;;:::i;38137:44::-;;;;;;;;;;;;;;;;-1:-1:-1;38137:44:0;-1:-1:-1;;;;;38137:44:0;;:::i;:::-;;;;;;;;;;;;;;;;;;38388:53;;;;;;;;;;;;;;;;-1:-1:-1;38388:53:0;;:::i;:::-;;;;;-1:-1:-1;;;;;38388:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51253:3530;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51253:3530:0;;-1:-1:-1;;;;;51253:3530:0;;;;;;;;;;;;;;-1:-1:-1;51253:3530:0;;;;;-1:-1:-1;51253:3530:0;;;;;-1:-1:-1;51253:3530:0;;;;;;;-1:-1:-1;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51253:3530:0;;;;;;;;-1:-1:-1;51253:3530:0;;-1:-1:-1;;;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51253:3530:0;;;;;;;;-1:-1:-1;51253:3530:0;;-1:-1:-1;;;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51253:3530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51253:3530:0;;-1:-1:-1;51253:3530:0;;-1:-1:-1;;;;;51253:3530:0:i;50379:139::-;;;;;;;;;;;;;;;;-1:-1:-1;50379:139:0;;:::i;38945:73::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38945:73:0;;;;;;;;;;:::i;37963:43::-;;;:::i;50530:402::-;;;;;;;;;;;;;;;;-1:-1:-1;50530:402:0;;;-1:-1:-1;;;;;50530:402:0;;;;;;;;;;:::i;38243:29::-;;;:::i;39651:215::-;;;;;;;;;;;;;;;;-1:-1:-1;39651:215:0;-1:-1:-1;;;;;39651:215:0;;:::i;42817:434::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42817:434:0;;;;;;;;;;;;;;;;;:::i;38298:28::-;;;:::i;57793:395::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57793:395:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57793:395:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57793:395:0;;-1:-1:-1;57793:395:0;;-1:-1:-1;;;;;57793:395:0:i;49969:347::-;50037:7;50046;50066:34;;:::i;:::-;-1:-1:-1;50103:22:0;;;;:14;:22;;;;;;;;;50066:59;;;;;;;;;;;;;;;-1:-1:-1;;;;;50066:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50136:73;;50192:1;50195;50184:13;;;;;;;50136:73;50227:24;;;;50286:20;;;;50253:28;;;;:54;;:32;:54::i;:::-;50219:89;;;;;49969:347;;;;:::o;54839:1165::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;54963:35:::1;55001:22:::0;;;:14:::1;:22;::::0;;;;55051:19:::1;::::0;::::1;::::0;-1:-1:-1;;;;;55051:19:0::1;55043:27:::0;;::::1;::::0;55042:62:::1;;-1:-1:-1::0;55081:22:0::1;::::0;::::1;::::0;55076:27;55042:62:::1;55034:114;;;;-1:-1:-1::0;;;55034:114:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55194:21;55208:6;55194:13;:21::i;:::-;-1:-1:-1::0;55252:25:0::1;55378:23:::0;;;:15:::1;:23;::::0;;;;-1:-1:-1;;55280:23:0;55412:585:::1;55432:23:::0;;55428:27;::::1;55412:585;;;55510:5;-1:-1:-1::0;;;;;55481:34:0::1;:16;55498:1;55481:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:25:::0;-1:-1:-1;;;;;55481:25:0::1;:34;55477:231;;;55573:14;55536:16;55553:1;55536:19;;;;;;;;;;;;;;;;;;:34;;:51;;;;55632:34;55652:5;55659:6;55632:19;:34::i;:::-;55746:16;55763:1;55746:19;;;;;;;;;;;;;;;;;;:34;;;55726:17;:54;55722:264;;;55821:16;55838:1;55821:19;;;;;;;;;;;;;;;;;;:34;;;55801:54;;55905:65;55967:2;55905:57;55937:13;:24;;;55905:27;55927:4;55905:17;:21;;:27;;;;:::i;:::-;:31:::0;::::1;:57::i;:::-;:61:::0;::::1;:65::i;:::-;55874:28;::::0;::::1;:96:::0;55722:264:::1;55457:3;;55412:585;;;;39347:1;;;54839:1165:::0;;;:::o;43793:2487::-;43880:16;43898;43927:40;43970:15;:23;43986:6;43970:23;;;;;;;;;;;43927:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43927:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44004:23;44044:16;:23;44030:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44030:38:0;;44004:64;;44079:31;44127:16;:23;44113:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44113:38:0;;44079:72;;44162:34;;:::i;:::-;-1:-1:-1;44199:22:0;;;;:14;:22;;;;;;;;;44162:59;;;;;;;;;;;;;;;-1:-1:-1;;;;;44162:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44236:27;44232:1997;;44280:19;44318:17;44350:34;;:::i;:::-;44387:22;;;;:14;:22;;;;;;;;-1:-1:-1;;;;;44387:28:0;;;;;;;;;;44350:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44387:28;;44350:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44434:6;44430:1788;44450:16;:23;44446:1;:27;44430:1788;;;44499:36;;:::i;:::-;44538:16;44555:1;44538:19;;;;;;;;;;;;;;44499:58;;44608:12;44580:13;:24;;;:40;44576:1576;;44659:1;44645:15;;44732:16;:23;44687:13;:34;;;:41;:68;44683:1396;;;44792:24;;;;44788:28;44784:680;;44861:82;44913:14;:29;;;44861:47;44878:13;:29;;;44861:12;:16;;:47;;;;:::i;:82::-;44849:94;;45042:14;:26;;;44995:43;45028:9;44995:14;:28;;;:32;;:43;;;;:::i;:::-;:73;44991:261;;45171:28;;;;45140:26;;;;:60;;:30;:60::i;:::-;45128:72;;44991:261;45372:24;;;;45314:84;;45348:49;;:19;:9;45362:4;45348:13;:19::i;:49::-;45314:29;;;;;:33;:84::i;:::-;45282:29;;;:116;44784:680;45504:13;:34;;;45539:1;45504:37;;;;;;;;;;;;;;45490:51;;45599:53;45615:13;:33;;;45649:1;45615:36;;;;;;;;;;;;;;45599:11;:15;;:53;;;;:::i;:::-;45585:67;;45710:127;45726:110;45831:4;45726:100;45791:13;:31;;;45823:1;45791:34;;;;;;;;;;;;;;45726:60;45756:14;:29;;;45726:13;:25;;;:29;;:60;;;;:::i;:::-;:64;;:100::i;:110::-;45710:11;;:15;:127::i;:::-;45696:141;;45904:125;45920:108;46023:4;45920:98;45984:13;:30;;;46015:1;45984:33;;;;;;;;;;;;;;45920:59;45949:14;:29;;;45920:13;:24;;;:28;;:59;;;;:::i;45904:125::-;45890:139;;44683:1396;46121:11;46101:14;46116:1;46101:17;;;;;;;;;;;;;:31;;;;;44576:1576;46182:14;:20;;;46170:6;46177:1;46170:9;;;;;;;;-1:-1:-1;;;;;46170:32:0;;;:9;;;;;;;;;;;:32;-1:-1:-1;44475:3:0;;44430:1788;;;;44232:1997;;;;-1:-1:-1;46249:6:0;;-1:-1:-1;46257:14:0;-1:-1:-1;;43793:2487:0;;;;;;:::o;50982:127::-;39135:5;;-1:-1:-1;;;;;39135:5:0;39144:10;39135:19;39127:59;;;;;-1:-1:-1;;;39127:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39127:59:0;;;;;;;;;;;;;;;51072:29:::1;51089:4;51095:5;51072:16;:29::i;:::-;50982:127:::0;;:::o;41763:510::-;41850:8;:15;41846:1;:19;41845:48;;;;;41877:8;:15;41871:2;:21;;41845:48;41837:102;;;;-1:-1:-1;;;41837:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41950:14;41975;42004:6;42000:266;42020:8;:15;42016:1;:19;42000:266;;;42066:8;42075:1;42066:11;;;;;;;;;;;;;;;;;;;42101:22;;;;:14;:22;;;;;;42124:10;42101:34;;;;;;;;;:41;;;;-1:-1:-1;42066:11:0;-1:-1:-1;42184:10:0;;42180:75;;42215:24;42224:6;42232;42215:8;:24::i;:::-;42037:3;;42000:266;;;;41763:510;;;:::o;41587:110::-;41665:24;41674:6;41682;41665:8;:24::i;58242:405::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;58339:33:::1;58375:21:::0;;;:13:::1;:21;::::0;;;;58423:18;;-1:-1:-1;;;;;58423:18:0::1;58407:78;;;;-1:-1:-1::0;;;58407:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58516:21;::::0;::::1;:32:::0;;;58579:34:::1;58599:5;58606:6:::0;58579:19:::1;:34::i;:::-;39347:1;58242:405:::0;;:::o;49811:104::-;49864:16;49900:7;49893:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49811:104;:::o;37814:46::-;37859:1;37814:46;:::o;58701:405::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;58798:33:::1;58834:21:::0;;;:13:::1;:21;::::0;;;;58882:18;;-1:-1:-1;;;;;58882:18:0::1;58866:78;;;;-1:-1:-1::0;;;58866:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58975:21;::::0;::::1;:32:::0;;;59038:34:::1;59058:5;59065:6:::0;59038:19:::1;:34::i;43299:440::-:0;43381:7;43390;43410:34;;:::i;:::-;-1:-1:-1;43447:22:0;;;;:14;:22;;;;;;;;;43410:59;;;;;;;;;;;;;;;-1:-1:-1;;;;;43410:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43480:75;;43538:1;43541;43530:13;;;;;;;43480:75;43565:34;;:::i;:::-;43602:22;;;;:14;:22;;;;;;;;-1:-1:-1;;;;;43602:28:0;;;;;;;;;;43565:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43602:28;;43565:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43649:55;43679:13;:24;;;43649:13;:25;;;:29;;:55;;;;:::i;:::-;43706:13;:24;;;43641:90;;;;;;43299:440;;;;;:::o;42321:100::-;42390:23;42406:6;42390:15;:23::i;:::-;42321:100;:::o;37766:41::-;37805:1;37766:41;:::o;42471:298::-;42565:8;:15;42561:1;:19;42560:48;;;;;42592:8;:15;42586:2;:21;;42560:48;42552:102;;;;-1:-1:-1;;;42552:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42669:6;42665:97;42685:8;:15;42681:1;:19;42665:97;;;42722:28;42738:8;42747:1;42738:11;;;;;;;;;;;;;;42722:15;:28::i;:::-;42702:3;;42665:97;;38713:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38844:54::-;;;;;;;;;;;;;:::o;38347:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38347:24:0;:::o;39907:1620::-;39995:6;39991:1;:10;39983:46;;;;;-1:-1:-1;;;39983:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40040:35;40078:22;;;:14;:22;;;;;40128:19;;;;-1:-1:-1;;;;;40128:19:0;40120:27;;;;40119:75;;-1:-1:-1;40153:24:0;;40181:12;-1:-1:-1;40153:40:0;40119:75;40111:128;;;;-1:-1:-1;;;40111:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40307:6;40279:13;:24;;;:34;;40278:105;;;;-1:-1:-1;40354:28:0;;;;40319:20;;;;:32;;40344:6;40319:24;:32::i;:::-;:63;40278:105;40270:161;;;;-1:-1:-1;;;40270:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40467:6;;;:35;;;-1:-1:-1;;;40467:35:0;;40491:10;40467:35;;;;;;;;;40445:18;;-1:-1:-1;;;;;40467:6:0;;;;:23;;:35;;;;;;;;;;;;:6;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40467:35:0;;;;-1:-1:-1;40549:15:0;40545:137;;40581:6;;;:17;;;-1:-1:-1;;;40581:17:0;;;;-1:-1:-1;;;;;40581:6:0;;;;:15;;:17;;;;;;;;;;;;:6;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40644:26:0;;40659:10;;40644:26;;;;;40545:137;40699:19;;;;40692:79;;-1:-1:-1;;;;;40699:19:0;40737:10;40757:4;40764:6;40692:44;:79::i;:::-;40853:6;;;:31;;;-1:-1:-1;;;40853:31:0;;40873:10;40853:31;;;;;;;;;40819:14;;;;-1:-1:-1;;;;;40853:6:0;;:19;;:31;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40853:31:0;;;;;;;;;-1:-1:-1;40853:31:0;-1:-1:-1;40922:50:0;40937:6;40945:10;40853:31;;40922:14;:50::i;:::-;40983:32;41018:21;41032:6;41018:13;:21::i;:::-;40983:56;;41076:66;41090:6;41098:15;41115:10;41127:6;41135;41076:13;:66::i;:::-;41218:78;41227:6;41235:10;41247:6;41255:13;:24;;;41281:6;41289;41218:8;:78::i;:::-;41345:66;41359:6;41367:15;41384:10;41396:6;41404;41345:13;:66::i;:::-;41479:19;;;;41465:54;;;;;;;;;;;;;;41500:10;;-1:-1:-1;;;;;41479:19:0;;41465:54;;;;;;;;39907:1620;;;;;;;:::o;38202:20::-;;;-1:-1:-1;;;;;38202:20:0;;:::o;38494:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38494:55:0;;;;;;;;;;;;;:::o;38096:20::-;;;-1:-1:-1;;;;;38096:20:0;;:::o;37889:43::-;37930:2;37889:43;:::o;59118:1171::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;59227:23:::1;59299:22:::0;;;:14:::1;:22;::::0;;;;59349:19:::1;::::0;::::1;::::0;-1:-1:-1;;;;;59349:19:0::1;59341:27:::0;;::::1;::::0;59340:62:::1;;-1:-1:-1::0;59379:22:0::1;::::0;::::1;::::0;59374:27;59340:62:::1;59332:114;;;;-1:-1:-1::0;;;59332:114:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59492:25;59617:23:::0;;;:15:::1;:23;::::0;;;;;;;59574:66;;;;;;::::1;::::0;;;;;;;;;;-1:-1:-1;;59520:23:0;59574:40:::1;::::0;:66;::::1;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;59574:66:0::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;;;;;;::::1;::::0;::::1;;;;;;;;;;59655:6;59651:327;59671:16;:23;59667:1;:27;59651:327;;;59740:16;59757:1;59740:19;;;;;;;;;;;;;;:34;;;59720:17;:54;59716:251;;;59815:16;59832:1;59815:19;;;;;;;;;;;;;;:34;;;59795:54;;59886:65;59948:2;59886:57;59918:13;:24;;;59886:27;59908:4;59886:17;:21;;:27;;;;:::i;:65::-;59868:83;;59716:251;59696:3;;59651:327;;;;60024:14;59996:13;:24;;;:42;;:84;;;;;60066:14;60042:13;:20;;;:38;;59996:84;:121;;;;;60102:15;60084:14;:33;;59996:121;59988:166;;;::::0;;-1:-1:-1;;;59988:166:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;60165:28;::::0;::::1;:45:::0;;;60221:34:::1;60241:5;60248:6:::0;60221:19:::1;:34::i;:::-;39347:1;;;;59118:1171:::0;;:::o;56057:1686::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;56175:34:::1;;:::i;:::-;-1:-1:-1::0;56212:22:0::1;::::0;;;:14:::1;:22;::::0;;;;;;;;56175:59;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;56175:59:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;56254:27;;::::1;::::0;56253:62:::1;;-1:-1:-1::0;56292:22:0::1;::::0;::::1;::::0;56287:27;56253:62:::1;56245:114;;;;-1:-1:-1::0;;;56245:114:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56405:21;56419:6;56405:13;:21::i;:::-;-1:-1:-1::0;56463:41:0::1;56507:23:::0;;;:15:::1;:23;::::0;;;;;56541:1195:::1;56561:23:::0;;56557:27;::::1;56541:1195;;;56639:5;-1:-1:-1::0;;;;;56610:34:0::1;:16;56627:1;56610:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:25:::0;-1:-1:-1;;;;;56610:25:0::1;:34;56606:1119;;;56710:11;56673:16;56690:1;56673:19;;;;;;;;;;;;;;;;;;:33;;;:48;;56665:104;;;;-1:-1:-1::0;;;56665:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56841:3;::::0;-1:-1:-1;;;;;56833:21:0;;::::1;56841:3:::0;::::1;56833:21;56829:715;;56925:11;56891:16;56908:1;56891:19;;;;;;;;;;;;;;;;;;:31;;;:45;56887:480;;;57026:80;57057:48;57093:11;57057:16;57074:1;57057:19;;;;;;;;;;;;;;;;;;:31;;;:35;;:48;;;;:::i;:::-;-1:-1:-1::0;;;;;57026:26:0;::::1;;::::0;;;:19:::1;:26;::::0;;;;;;:30:::1;:80::i;:::-;-1:-1:-1::0;;;;;56997:26:0;::::1;;::::0;;;:19:::1;:26;::::0;;;;:109;56887:480:::1;;;57243:80;57274:48;57290:16;57307:1;57290:19;;;;;;;;;;;;;;;;;;:31;;;57274:11;:15;;:48;;;;:::i;:::-;-1:-1:-1::0;;;;;57243:26:0;::::1;;::::0;;;:19:::1;:26;::::0;;;;;;:30:::1;:80::i;:::-;-1:-1:-1::0;;;;;57214:26:0;::::1;;::::0;;;:19:::1;:26;::::0;;;;:109;56887:480:::1;-1:-1:-1::0;;;;;57439:26:0;::::1;;::::0;;;:19:::1;:26;::::0;;;;;;;;;57397:38;;-1:-1:-1;;;57397:38:0;;57429:4:::1;57397:38;::::0;::::1;::::0;;;57439:26;;;57397:23:::1;::::0;:38;;;;;57439:26;;57397:38;;;;;57439:26;57397:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;57397:38:0;:68:::1;;57389:109;;;::::0;;-1:-1:-1;;;57389:109:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;57389:109:0;;;;;;;;;;;;;::::1;;57596:11;57562:16;57579:1;57562:19;;;;;;;;;;;;;;;;;;:31;;:45;;;;57649:34;57669:5;57676:6;57649:19;:34::i;:::-;56586:3;;56541:1195;;38043:26:::0;;;;:::o;38600:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38600:59:0;;;;-1:-1:-1;38600:59:0;;-1:-1:-1;38600:59:0;;;:::o;46330:2756::-;46417:16;46435;46453;46482:40;46525:15;:23;46541:6;46525:23;;;;;;;;;;;46482:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46482:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46559:23;46599:16;:23;46585:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46585:38:0;;46559:64;;46634:37;46688:16;:23;46674:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46674:38:0;;46634:78;;46723:36;46776:16;:23;46762:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46762:38:0;;46723:77;;46811:34;;:::i;:::-;-1:-1:-1;46848:22:0;;;;:14;:22;;;;;;;;;46811:59;;;;;;;;;;;;;;;-1:-1:-1;;;;;46811:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46885:27;46881:2127;;46929:20;46968:19;47006:17;47038:34;;:::i;:::-;47075:14;:22;47090:6;47075:22;;;;;;;;;;;:28;47098:4;-1:-1:-1;;;;;47075:28:0;-1:-1:-1;;;;;47075:28:0;;;;;;;;;;;;47038:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47122:6;47118:1879;47138:16;:23;47134:1;:27;47118:1879;;;47187:36;;:::i;:::-;47226:16;47243:1;47226:19;;;;;;;;;;;;;;47187:58;;47296:12;47268:13;:24;;;:40;47264:1667;;47348:1;47333:16;;47386:1;47372:15;;47459:16;:23;47414:13;:34;;;:41;:68;47410:1382;;;47519:24;;;;47515:28;47511:680;;47588:82;47640:14;:29;;;47588:47;47605:13;:29;;;47588:12;:16;;:47;;;;:::i;:82::-;47576:94;;47769:14;:26;;;47722:43;47755:9;47722:14;:28;;;:32;;:43;;;;:::i;:::-;:73;47718:261;;47898:28;;;;47867:26;;;;:60;;:30;:60::i;:::-;47855:72;;47718:261;48099:24;;;;48041:84;;48075:49;;:19;:9;48089:4;48075:13;:19::i;48041:84::-;48009:29;;;:116;47511:680;48232:13;:34;;;48267:1;48232:37;;;;;;;;;;;;;;48217:52;;48327:13;:33;;;48361:1;48327:36;;;;;;;;;;;;;;48313:50;;48422:128;48439:110;48544:4;48439:100;48504:13;:31;;;48536:1;48504:34;;;;;;;48439:110;48422:12;;:16;:128::i;:::-;48407:143;;48617:125;48633:108;48736:4;48633:98;48697:13;:30;;;48728:1;48697:33;;;;;;;48617:125;48603:139;;47410:1382;48840:12;48814:20;48835:1;48814:23;;;;;;;;;;;;;:38;;;;;48900:11;48875:19;48895:1;48875:22;;;;;;;;;;;;;:36;;;;;47264:1667;48961:14;:20;;;48949:6;48956:1;48949:9;;;;;;;;-1:-1:-1;;;;;48949:32:0;;;:9;;;;;;;;;;;:32;-1:-1:-1;47163:3:0;;47118:1879;;;;46881:2127;;;;;-1:-1:-1;49028:6:0;;-1:-1:-1;49036:20:0;-1:-1:-1;49058:19:0;-1:-1:-1;;46330:2756:0;;;;;:::o;49151:620::-;49219:16;49248:13;49281:9;49276:172;49300:7;:14;49296:18;;49276:172;;;49375:5;-1:-1:-1;;;;;49340:40:0;:13;:25;49354:7;49362:1;49354:10;;;;;;;;;;;;;;;;;;;;49340:25;;;;;;;;;;;;:31;-1:-1:-1;;;;;49340:31:0;:40;49336:101;;;49409:12;:5;49419:1;49409:9;:12::i;:::-;49401:20;;49336:101;49316:3;;49276:172;;;;49458:20;49495:5;49481:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49481:20:0;;49458:43;;49520:1;49512:9;;49537:6;49532:211;49553:7;:14;49549:18;;49532:211;;;49628:5;-1:-1:-1;;;;;49593:40:0;:13;:25;49607:7;49615:1;49607:10;;;;;;;;;;;;;;;;;;;;49593:25;;;;;;;;;;;;:31;-1:-1:-1;;;;;49593:31:0;:40;49589:143;;;49667:7;49675:1;49667:10;;;;;;;;;;;;;;;;49654:3;49658:5;49654:10;;;;;;;;;;;;;;;;;:23;49704:12;:5;49714:1;49704:9;:12::i;:::-;49696:20;;49589:143;49569:3;;49532:211;;;-1:-1:-1;49760:3:0;49151:620;-1:-1:-1;;;49151:620:0:o;38137:44::-;;;;;;;;;;;;;;;:::o;38388:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38388:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38388:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51253:3530::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;51523:13:0;::::1;::::0;;::::1;::::0;51522:43:::1;;-1:-1:-1::0;51550:4:0::1;-1:-1:-1::0;;;;;51542:22:0;::::1;;;51522:43;51514:85;;;::::0;;-1:-1:-1;;;51514:85:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51622:10;51618:1;:14;51610:68;;;;-1:-1:-1::0;;;51610:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51702:6;:13;51698:1;:17;51697:44;;;;;51727:6;:13;51721:2;:19;;51697:44;:87;;;;;51763:13;:20;51746:6;:13;:37;51697:87;:132;;;;;51806:15;:22;51789:6;:13;:39;51697:132;51689:175;;;::::0;;-1:-1:-1;;;51689:175:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51901:12;51888:10;:25;:53;;51931:10;51888:53;;;51916:12;51888:53;51875:66;;51972:14;51989:23;52003:8;51989:9;;:13;;:23;;;;:::i;:::-;52067:7;:20:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;52067:20:0;;;;;::::1;::::0;;;52126:9:::1;::::0;51972:40;;-1:-1:-1;52126:16:0::1;::::0;:9;:13:::1;:16::i;:::-;52114:9;:28:::0;52170:33:::1;52206:21:::0;;;:13:::1;:21;::::0;;;;;;;52261:26;;-1:-1:-1;;;;;;52261:26:0::1;-1:-1:-1::0;;;;;52261:26:0;::::1;;::::0;;52317:24;;52206:21;;52317:24:::1;::::0;-1:-1:-1;52317:17:0;::::1;::::0;:24;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;52366:21:0::1;::::0;::::1;:32:::0;;;52427:12;;52423:198:::1;;52456:21;::::0;::::1;:32:::0;;;52423:198:::1;;;52561:7;:14:::0;:31:::1;::::0;52589:2:::1;::::0;52561:23:::1;::::0;52580:3:::1;52561:18;:23::i;:::-;:27:::0;::::1;:31::i;:::-;52537:21;::::0;::::1;:55:::0;52423:198:::1;52631:35;52669:22:::0;;;:14:::1;:22;::::0;;;;52722:37;;;52784:19:::1;::::0;;::::1;:27:::0;;-1:-1:-1;;;;;;52784:27:0::1;-1:-1:-1::0;;;;;52784:27:0;::::1;;::::0;;52841:20:::1;::::0;::::1;:24:::0;;;;52669:22;52928:17:::1;::::0;52722:37;;52928:14:::1;:17::i;:::-;52896:29;::::0;::::1;:49:::0;53009:1:::1;52982:24;::::0;::::1;:28:::0;;;53038:24:::1;::::0;::::1;:37:::0;;;53115:28:::1;::::0;::::1;:32:::0;;;53178:22:::1;::::0;::::1;:26:::0;;;-1:-1:-1;;;53317:1415:0::1;53337:6;:13;53333:1;:17;53317:1415;;;53389:6;53396:1;53389:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53381:17:0::1;37805:1;-1:-1:-1::0;;;;;53381:17:0::1;;;53380:51;;;;;53421:6;53428:1;53421:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53404:26:0::1;53412:4;-1:-1:-1::0;;;;;53404:26:0::1;;;53380:51;53372:93;;;::::0;;-1:-1:-1;;;53372:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53492:13;53506:1;53492:16;;;;;;;;;;;;;;53488:1;:20;53480:69;;;;-1:-1:-1::0;;;53480:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53576:15;53592:1;53576:18;;;;;;;;;;;;;;53572:1;:22;53564:75;;;;-1:-1:-1::0;;;53564:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53674:6;53681:1;53674:9;;;;;;;;;::::0;;::::1;::::0;;;;;;53666:3:::1;::::0;-1:-1:-1;;;;;53666:3:0;;::::1;53658:25:::0;::::1;;53654:327;;53751:52;53786:13;53800:1;53786:16;;;;;;;;;;;;;;53751:19;:30;53771:6;53778:1;53771:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53751:30:0::1;-1:-1:-1::0;;;;;53751:30:0::1;;;;;;;;;;;;;:34;;:52;;;;:::i;:::-;53718:19;:30;53738:6;53745:1;53738:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53718:30:0::1;-1:-1:-1::0;;;;;53718:30:0::1;;;;;;;;;;;;:85;;;;53876:19;:30;53896:6;53903:1;53896:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53876:30:0::1;-1:-1:-1::0;;;;;53876:30:0::1;;;;;;;;;;;;;53837:6;53844:1;53837:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53830:27:0::1;;53866:4;53830:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;53830:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53830:42:0;:76:::1;;53822:117;;;::::0;;-1:-1:-1;;;53822:117:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;53822:117:0;;;;;;;;;;;;;::::1;;53995:36;;:::i;:::-;54089:6;54096:1;54089:9;;;;;;;;;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;54066:32:0::1;::::0;;54155:16;;:13;;54169:1;;54155:16;::::1;;;;;;;;;;;54126:14;:26;;:45;;;::::0;::::1;54229:15;54245:1;54229:18;;;;;;;;;::::0;;::::1;::::0;;;;;;;54197:29:::1;::::0;;::::1;:50:::0;;;54307:1:::1;54276:28;::::0;::::1;:32:::0;;;54340:29:::1;::::0;::::1;:33:::0;;;54408:23;;;:15:::1;:23:::0;;;;;:44;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;54408:44:0::1;-1:-1:-1::0;;;;;54408:44:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;54471:49;::::1;54467:254;;;54561:14;:29;;;54541:49;;54640:65;54702:2;54640:57;54672:13;:24;;;54640:27;54662:4;54640:17;:21;;:27;;;;:::i;:65::-;54609:28;::::0;::::1;:96:::0;54467:254:::1;-1:-1:-1::0;53352:3:0::1;;53317:1415;;;;54742:33;54762:4;54768:6;54742:19;:33::i;:::-;39347:1;;;;51253:3530:::0;;;;;;;;;:::o;50379:139::-;50450:7;50477:22;;;:14;:22;;;;;:33;;;;50379:139::o;38945:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;37963:43::-;38004:2;37963:43;:::o;50530:402::-;50630:7;50639;50648;50657;50677:34;;:::i;:::-;50714:22;;;;:14;:22;;;;;;;;-1:-1:-1;;;;;50714:28:0;;;;;;;;;;50677:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50714:28;;50677:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50761:13;:34;;;50796:5;50761:41;;;;;;;;;;;;;;50804:13;:33;;;50838:5;50804:40;;;;;;;;;;;;;;50846:13;:31;;;50878:5;50846:38;;;;;;;;;;;;;;50886:13;:30;;;50917:5;50886:37;;;;;;;;;;;;;;50753:171;;;;;;;;;50530:402;;;;;;;:::o;38243:29::-;;;-1:-1:-1;;;;;38243:29:0;;:::o;39651:215::-;39135:5;;-1:-1:-1;;;;;39135:5:0;39144:10;39135:19;39127:59;;;;;-1:-1:-1;;;39127:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39127:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39741:14:0;::::1;39733:52;;;::::0;;-1:-1:-1;;;39733:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39819:5;::::0;39801:32:::1;::::0;-1:-1:-1;;;;;39801:32:0;;::::1;::::0;39819:5:::1;::::0;39801:32:::1;::::0;39819:5:::1;::::0;39801:32:::1;39844:5;:14:::0;;-1:-1:-1;;;;;;39844:14:0::1;-1:-1:-1::0;;;;;39844:14:0;;;::::1;::::0;;;::::1;::::0;;39651:215::o;42817:434::-;39135:5;;-1:-1:-1;;;;;39135:5:0;39144:10;39135:19;39127:59;;;;;-1:-1:-1;;;39127:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39127:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42930:13:0;::::1;::::0;;::::1;::::0;42929:31:::1;;-1:-1:-1::0;;;;;;42949:10:0;::::1;::::0;::::1;42929:31;:47;;;;;42969:6;42965:1;:10;42929:47;42921:95;;;;-1:-1:-1::0;;;42921:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43077:6;43042:5;-1:-1:-1::0;;;;;43035:23:0::1;;43067:4;43035:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;43035:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43035:38:0;:48:::1;;43027:89;;;::::0;;-1:-1:-1;;;43027:89:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;43027:89:0;;;;;;;;;;;;;::::1;;43127:38;-1:-1:-1::0;;;;;43127:26:0;::::1;43154:2:::0;43158:6;43127:26:::1;:38::i;:::-;43232:2;-1:-1:-1::0;;;;;43212:31:0::1;43225:5;-1:-1:-1::0;;;;;43212:31:0::1;;43236:6;43212:31;;;;;;;;;;;;;;;;;;42817:434:::0;;;:::o;38298:28::-;;;;:::o;57793:395::-;39290:10;39277:24;;;;:12;:24;;;;;;;;39269:67;;;;;-1:-1:-1;;;39269:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39269:67:0;;;;;;;;;;;;;;;57888:33:::1;57924:21:::0;;;:13:::1;:21;::::0;;;;57972:18;;-1:-1:-1;;;;;57972:18:0::1;57956:78;;;;-1:-1:-1::0;;;57956:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58065:24:::0;;::::1;::::0;:17:::1;::::0;::::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58120:34;58140:5;58147:6;58120:19;:34::i;11324:158::-:0;11382:7;11415:1;11410;:6;;11402:49;;;;;-1:-1:-1;;;11402:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11469:5:0;;;11324:158;;;;;:::o;60591:2210::-;60677:35;60715:22;;;:14;:22;;;;;;;;60792:15;:23;;;;;;60875;;60648:16;;60715:22;60792:23;60648:16;;60861:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60861:38:0;-1:-1:-1;60918:24:0;;;;60826:73;;-1:-1:-1;60914:28:0;60910:1851;;60985:22;61026:14;61059:18;61080:47;61097:13;:29;;;61080:12;:16;;:47;;;;:::i;:::-;61059:68;;61172:6;61168:1097;61188:23;;61184:27;;61168:1097;;;61237:37;61277:16;61294:1;61277:19;;;;;;;;;;;;;;;;;;61237:59;;61344:45;61359:14;:29;;;61344:10;:14;;:45;;;;:::i;:::-;61335:54;;61485:14;:26;;;61441:40;61474:6;61441:14;:28;;;:32;;:40;;;;:::i;:::-;:70;61437:329;;61605:28;;;;61574:26;;;;:60;;:30;:60::i;:::-;61565:69;-1:-1:-1;61697:24:0;:17;61719:1;61697:21;:24::i;:::-;61677:44;;61437:329;61815:28;;;;:40;;61848:6;61815:32;:40::i;:::-;61784:28;;;:71;61990:24;;;;61935:81;;61969:46;;:16;:6;61980:4;61969:10;:16::i;:46::-;61935:29;;;;;:33;:81::i;:::-;61903:29;;;:113;;;62061:18;;:15;;62077:1;;62061:18;;;;;;;;;;;;;;;:50;62134:10;;62130:120;;62187:20;;62174:42;;;;;;;;;;;;;;-1:-1:-1;;;;;62187:20:0;;;;62174:42;;;;;;;;;;;62130:120;-1:-1:-1;61213:3:0;;61168:1097;;;-1:-1:-1;62311:12:0;62279:29;;;:44;62383:23;;62362:44;;62358:221;;;62472:12;62447:22;;;:37;62528:15;;;;;;;;;;;;;;;;;62358:221;60910:1851;;;;;;62614:6;62610:140;62630:23;;62626:27;;62610:140;;;62700:16;62717:1;62700:19;;;;;;;;;;;;;;;;;;:34;;;62679:15;62695:1;62679:18;;;;;;;;;;;;;;;;;:55;62655:3;;62610:140;;;;60910:1851;62778:15;60591:2210;-1:-1:-1;;;;60591:2210:0:o;75175:1039::-;75253:32;;:::i;:::-;75288:21;;;;:13;:21;;;;;;;;;75253:56;;;;;;;;;-1:-1:-1;;;;;75253:56:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75253:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75288:21;;75253:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75320:34;;:::i;:::-;-1:-1:-1;75357:22:0;;;;:14;:22;;;;;;;;75320:59;;;;;;;;;;;;;;;-1:-1:-1;;;;;75320:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75433:23;;;:15;:23;;;;;75390:66;;;;;;;;;;;;;;;;;75320:59;;;;75433:23;;75357:22;75390:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75390:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75467:23;75507:16;:23;75493:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75493:38:0;;75467:64;;75542:30;75589:16;:23;75575:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75575:38:0;;75542:71;;75624:32;75673:16;:23;75659:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75659:38:0;;75624:73;;75712:6;75708:249;75728:16;:23;75724:1;:27;75708:249;;;75785:16;75802:1;75785:19;;;;;;;;;;;;;;:25;;;75773:6;75780:1;75773:9;;;;;;;;;;;;;:37;-1:-1:-1;;;;;75773:37:0;;;-1:-1:-1;;;;;75773:37:0;;;;;75844:16;75861:1;75844:19;;;;;;;;;;;;;;:31;;;75825:13;75839:1;75825:16;;;;;;;;;;;;;:50;;;;;75911:16;75928:1;75911:19;;;;;;;;;;;;;;:34;;;75890:15;75906:1;75890:18;;;;;;;;;;;;;;;;;:55;75753:3;;75708:249;;;;76018:13;:19;;;-1:-1:-1;;;;;75972:234:0;;75983:6;75991;75999:12;:17;;;76039:13;:24;;;76065:13;:28;;;76095:13;:24;;;76121:12;:21;;;76144:12;:21;;;76167:6;76175:13;76190:15;75972:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75972:234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75175:1039;;;;;;;;:::o;11741:220::-;11799:7;11823:6;11819:20;;-1:-1:-1;11838:1:0;11831:8;;11819:20;11862:5;;;11866:1;11862;:5;:1;11886:5;;;;;:10;11878:56;;;;-1:-1:-1;;;11878:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11952:1;11741:220;-1:-1:-1;;;11741:220:0:o;12439:153::-;12497:7;12529:1;12525;:5;12517:44;;;;;-1:-1:-1;;;12517:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12583:1;12579;:5;;;;;;;12439:153;-1:-1:-1;;;12439:153:0:o;10862:179::-;10920:7;10952:5;;;10976:6;;;;10968:46;;;;;-1:-1:-1;;;10968:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;60399:136;39135:5;;-1:-1:-1;;;;;39135:5:0;39144:10;39135:19;39127:59;;;;;-1:-1:-1;;;39127:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39127:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;60481:18:0;;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:26;;-1:-1:-1;;60481:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60399:136::o;76255:1164::-;76333:35;76371:22;;;:14;:22;;;;;76421:19;;;;-1:-1:-1;;;;;76421:19:0;76413:27;;;;76412:75;;-1:-1:-1;76446:24:0;;76474:12;-1:-1:-1;76446:40:0;76412:75;76404:130;;;;-1:-1:-1;;;76404:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76558:6;76554:1;:10;76553:69;;;;-1:-1:-1;76570:22:0;;;;:14;:22;;;;;;;;76593:10;76570:34;;;;;;;:41;;;:51;-1:-1:-1;76570:51:0;76553:69;76545:110;;;;;-1:-1:-1;;;76545:110:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;76545:110:0;;;;;;;;;;;;;;;76701:6;;;:31;;;-1:-1:-1;;;76701:31:0;;76721:10;76701:31;;;;;;;;;76667:14;;;;-1:-1:-1;;;;;76701:6:0;;:19;;:31;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76701:31:0;;;;;;;;;-1:-1:-1;76701:31:0;-1:-1:-1;76743:50:0;76758:6;76766:10;76701:31;;76743:14;:50::i;:::-;76804:32;76839:21;76853:6;76839:13;:21::i;:::-;76804:56;;76903:66;76917:6;76925:15;76942:10;76954:6;76962;76903:13;:66::i;:::-;77045:78;77054:6;77062:10;77074:6;77082:13;:24;;;77108:6;77116;77045:8;:78::i;:::-;77148:66;77162:6;77170:15;77187:10;77199:6;77207;77148:13;:66::i;:::-;77270:19;;;;77263:60;;-1:-1:-1;;;;;77270:19:0;77304:10;77316:6;77263:40;:60::i;:::-;77371:19;;;;77355:56;;;;;;;;;;;;;;77392:10;;-1:-1:-1;;;;;77371:19:0;;77355:56;;;;;;;;76255:1164;;;;;;:::o;77431:764::-;77492:35;77530:22;;;:14;:22;;;;;77580:19;;;;-1:-1:-1;;;;;77580:19:0;77572:27;;;;77571:75;;-1:-1:-1;77605:24:0;;77633:12;-1:-1:-1;77605:40:0;77571:75;77563:130;;;;-1:-1:-1;;;77563:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77739:6;;;:31;;;-1:-1:-1;;;77739:31:0;;77759:10;77739:31;;;;;;;;;77705:14;;;;-1:-1:-1;;;;;77739:6:0;;:19;;:31;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77739:31:0;;;;;;;;;-1:-1:-1;77739:31:0;-1:-1:-1;77781:50:0;77796:6;77804:10;77739:31;;77781:14;:50::i;:::-;77842:32;77877:21;77891:6;77877:13;:21::i;:::-;77842:56;;77941:66;77955:6;77963:15;77980:10;77992:6;78000;77941:13;:66::i;:::-;78083;78097:6;78105:15;78122:10;78134:6;78142;78083:13;:66::i;:::-;77431:764;;;;;:::o;19193:205::-;19321:68;;;-1:-1:-1;;;;;19321:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19321:68:0;-1:-1:-1;;;19321:68:0;;;19294:96;;19314:5;;19294:19;:96::i;78207:2026::-;78313:10;78326:23;;;:15;:23;;;;;;;;:30;78405:14;:22;;;;;-1:-1:-1;;;;;78405:28:0;;;;;;;;;;78453:34;;;:41;78444:460;;78515:6;78511:382;78531:5;78527:1;:9;78511:382;;;78562:34;;;:42;;;;;;;;78602:1;78562:42;;;;;;;;;;;;;78649:33;;;:41;;;;;;;;;;;;;;;;;78735:31;;;:39;;;;;;;;;;;;;;;;;78816:30;;;:38;;;;;;;;;;;;;;;;;;;;78538:3;78511:382;;;;78444:460;-1:-1:-1;;;;;78918:14:0;;;78914:1312;;78949:37;78989:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;78989:30:0;;;;;;;;;79043:36;;;:43;79034:498;;79111:6;79107:410;79127:5;79123:1;:9;79107:410;;;79162:36;;;:44;;;;;;;;79204:1;79162:44;;;;;;;;;;;;;79255:35;;;:43;;;;;;;;;;;;;;;;;79347:33;;;:41;;;;;;;;;;;;;;;;;79434:32;;;:40;;;;;;;;;;;;;;;;;;;;79134:3;79107:410;;;;79034:498;-1:-1:-1;;;;;79550:14:0;;;79546:669;;79585:37;79625:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;79625:30:0;;;;;;;;;79683:36;;;:43;79674:526;;79755:6;79751:430;79771:5;79767:1;:9;79751:430;;;79810:36;;;:44;;;;;;;;79852:1;79810:44;;;;;;;;;;;;;79907:35;;;:43;;;;;;;;;;;;;;;;;80003:33;;;:41;;;;;;;;;;;;;;;;;80094:32;;;:40;;;;;;;;;;;;;;;;;;;;79778:3;79751:430;;;;79674:526;79546:669;78914:1312;78207:2026;;;;;;:::o;69891:3725::-;70030:14;70227:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;70227:28:0;;;;;;;;;70309:23;;;:15;:23;;;;;70266:66;;;;;;;;;;;;;;;;;70030:14;;;;;;;;70227:28;;70266:40;;70030:14;;70266:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70266:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70347:6;70343:3266;70363:16;:23;70359:1;:27;70343:3266;;;70416:16;70433:1;70416:19;;;;;;;;;;;;;;:25;;;70408:33;;70492:15;70508:1;70492:18;;;;;;;;;;;;;;70475:35;;70560:13;:25;;;70556:1;:29;70555:65;;;;70595:13;:24;;;70591:1;:28;70555:65;70551:636;;;70656:95;70746:4;70656:85;70706:13;:31;;70738:1;70706:34;;;;;;;;;;;;;;;;70656:45;70686:14;70656:13;:25;;;:29;;:45;;;;:::i;:95::-;70641:110;;70798:93;70886:4;70798:83;70847:13;:30;;70878:1;70847:33;;;;;;;;;;;;;;;;70798:44;70827:14;70798:13;:24;;;:28;;:44;;;;:::i;:93::-;70784:107;;70939:55;70981:12;70939:13;:34;;70974:1;70939:37;;;;;;;;;;;;;;;;:41;;:55;;;;:::i;:::-;70924:70;;71044:53;71085:11;71044:13;:33;;71078:1;71044:36;;;;;;;:53;71030:67;-1:-1:-1;71142:29:0;:12;71030:67;71142:16;:29::i;:::-;71133:38;;70551:636;71205:10;;71201:745;;71276:1;71236:13;:34;;71271:1;71236:37;;;;;;;;;;;;;;;:41;;;;71358:1;71319:13;:33;;71353:1;71319:36;;;;;;;;;;;;;;;;;;;:40;;;;-1:-1:-1;;;;;71435:25:0;;;;;:18;:25;;;;;;:31;;;;;;;;;:43;;71471:6;71435:35;:43::i;:::-;71401:18;:25;71420:5;-1:-1:-1;;;;;71401:25:0;-1:-1:-1;;;;;71401:25:0;;;;;;;;;;;;:31;71427:4;-1:-1:-1;;;;;71401:31:0;-1:-1:-1;;;;;71401:31:0;;;;;;;;;;;;:77;;;;71540:5;-1:-1:-1;;;;;71524:21:0;71532:3;;;;;;;;;-1:-1:-1;;;;;71532:3:0;-1:-1:-1;;;;;71524:21:0;;71520:325;;;71575:3;;:22;;;-1:-1:-1;;;71575:22:0;;-1:-1:-1;;;;;71575:22:0;;;;;;;;;;;;;;;:3;;;;;:8;;:22;;;;;:3;;:22;;;;;;;:3;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71520:325;;;-1:-1:-1;;;;;71690:26:0;;;;;;:19;:26;;;;;;:38;;71721:6;71690:30;:38::i;:::-;-1:-1:-1;;;;;71661:26:0;;;;;;:19;:26;;;;;:67;;;;71771:40;;71798:4;71804:6;71771:26;:40::i;:::-;71868:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;71868:62:0;;;;;;;;;;;;;;;;;71201:745;-1:-1:-1;;;;;71964:14:0;;;71960:812;;71999:37;72039:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;72039:30:0;;;;;;;;;72097:27;;;;72093:31;;;72092:69;;;72134:15;:26;;;72130:1;:30;72092:69;72088:669;;;72201:99;72295:4;72201:89;72253:15;:33;;72287:1;72253:36;;;;;;;;;;;;;;;;72201:47;72233:14;72201:15;:27;;;:31;;:47;;;;:::i;:99::-;72186:114;;72351:97;72443:4;72351:87;72402:15;:32;;72435:1;72402:35;;;;;;;;;;;;;;;;72351:46;72382:14;72351:15;:26;;;:30;;:46;;;;:::i;:97::-;72337:111;;72527:57;72571:12;72527:15;:36;;72564:1;72527:39;;;;;;;:57;72485:15;:36;;72522:1;72485:39;;;;;;;;;;;;;;;:99;;;;72665:55;72708:11;72665:15;:35;;72701:1;72665:38;;;;;;;:55;72624:15;:35;;72660:1;72624:38;;;;;;;;;;;;;;;;;:96;72088:669;71960:812;;-1:-1:-1;;;;;72790:14:0;;;72786:812;;72825:37;72865:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;72865:30:0;;;;;;;;;72923:27;;;;72919:31;;;72918:69;;;72960:15;:26;;;72956:1;:30;72918:69;72914:669;;;73027:99;73121:4;73027:89;73079:15;:33;;73113:1;73079:36;;;;;;;73027:99;73012:114;;73177:97;73269:4;73177:87;73228:15;:32;;73261:1;73228:35;;;;;;;73177:97;73163:111;;73353:57;73397:12;73353:15;:36;;73390:1;73353:39;;;;;;;:57;73311:15;:36;;73348:1;73311:39;;;;;;;;;;;;;;;:99;;;;73491:55;73534:11;73491:15;:35;;73527:1;73491:38;;;;;;;:55;73450:15;:35;;73486:1;73450:38;;;;;;;;;;;;;;;;;:96;72914:669;72786:812;;70388:3;;70343:3266;;62849:2916;62985:13;63001:22;:6;63012:10;63001;:22::i;:::-;63034:35;63072:22;;;:14;:22;;;;;63148:20;;;;62985:38;;-1:-1:-1;63072:22:0;63148:32;;63173:6;63148:24;:32::i;:::-;63125:20;;;:55;63244:24;;;;:35;;63273:5;63244:28;:35::i;:::-;63217:24;;;:62;63313:35;63351:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;63351:28:0;;;;;;;;;63433:20;;;;:32;;63458:6;63433:24;:32::i;:::-;63410:20;;;:55;63529:24;;;;:35;;63558:5;63529:28;:35::i;:::-;63502:24;;;:62;63610:24;;63601:121;;63678:12;63651:39;;63601:121;63732:25;;-1:-1:-1;;;;;63856:14:0;;;63852:1014;;63887:23;63913:38;63947:3;63913:29;:5;37859:1;63913:9;:29::i;:38::-;64023:25;;;;63887:64;;-1:-1:-1;64023:46:0;;63887:64;64023:29;:46::i;:::-;63995:25;;;:74;64137:24;;;;:45;;64166:15;64137:28;:45::i;:::-;64110:24;;;:72;64220:20;64243:34;64273:3;64243:25;:5;37930:2;64243:9;:25::i;:34::-;64318:37;64358:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;64358:30:0;;;;;;;;;64453:27;;;;64220:57;;-1:-1:-1;64358:30:0;64453:45;;64220:57;64453:31;:45::i;:::-;64423:27;;;:75;;;64628:24;;;;64423:75;;-1:-1:-1;64628:42:0;;64657:12;64628:28;:42::i;:::-;64601:24;;;:69;64717:26;;64708:133;;64793:12;64764:41;;64708:133;63852:1014;;;;-1:-1:-1;;;;;64880:14:0;;;64876:667;;64911:20;64934:34;64964:3;64934:25;:5;38004:2;64934:9;:25::i;:34::-;65009:37;65049:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;65049:30:0;;;;;;;;;65144:27;;;;64911:57;;-1:-1:-1;65049:30:0;65144:45;;64911:57;65144:31;:45::i;:::-;65114:27;;;:75;;;65319:24;;;;65114:75;;-1:-1:-1;65319:42:0;;65348:12;65319:28;:42::i;:::-;65292:24;;;:69;65408:26;;65399:133;;65484:12;65455:41;;65399:133;64876:667;;;65711:6;-1:-1:-1;;;;;65558:179:0;65684:6;-1:-1:-1;;;;;65558:179:0;65625:4;-1:-1:-1;;;;;65558:179:0;;65570:6;65578:13;:19;;;;;;;;;;-1:-1:-1;;;;;65578:19:0;65599:13;:24;;;65631:13;:25;;;65658:13;:24;;;65692:17;65719;65558:179;;;;;;;;;-1:-1:-1;;;;;65558:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62849:2916;;;;;;;;;;;:::o;73660:1459::-;73799:22;73874;;;:14;:22;;;;;;;;-1:-1:-1;;;;;73874:28:0;;;;;;;;;73799:22;73913:1199;73933:15;:22;73929:1;:26;73913:1199;;;73994:15;74010:1;73994:18;;;;;;;;;;;;;;73977:35;;74090:45;74120:14;74090:13;:25;;;:29;;:45;;;;:::i;:::-;74053:13;:31;;74085:1;74053:34;;;;;;;;;;;;;;;;;:82;74212:24;;;;:44;;74241:14;74212:28;:44::i;:::-;74176:13;:30;;74207:1;74176:33;;;;;;;;;;;;;;;;;:80;-1:-1:-1;;;;;74301:14:0;;;74297:804;;74336:37;74376:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;74376:30:0;;;;;;;;;74464:27;;;;:47;;74496:14;74464:31;:47::i;:::-;74425:15;:33;;74459:1;74425:36;;;;;;;;;;;;;;;;;:86;74594:26;;;;:46;;74625:14;74594:30;:46::i;:::-;74556:15;:32;;74589:1;74556:35;;;;;;;;;;;;;;;;;:84;-1:-1:-1;;;;;74689:14:0;;;74685:401;;74728:37;74768:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;74768:30:0;;;;;;;;;74860:27;;;;:47;;74892:14;74860:31;:47::i;:::-;74821:15;:33;;74855:1;74821:36;;;;;;;;;;;;;;;;;:86;74994:26;;;;:46;;75025:14;74994:30;:46::i;:::-;74956:15;:32;;74989:1;74956:35;;;;;;;;;;;;;;;;;:84;-1:-1:-1;74685:401:0;74297:804;;73957:3;;73913:1199;;19008:177;19118:58;;;-1:-1:-1;;;;;19118:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19118:58:0;-1:-1:-1;;;19118:58:0;;;19091:86;;19111:5;;19091:19;:86::i;65809:3981::-;65945:13;65961:22;:6;65972:10;65961;:22::i;:::-;65994:35;66032:22;;;:14;:22;;;;;66089:20;;;;65945:38;;-1:-1:-1;66032:22:0;66089:30;-1:-1:-1;66085:232:0;;66159:1;66136:20;;;:24;66085:232;;;66244:20;;;;:32;;66269:6;66244:24;:32::i;:::-;66221:20;;;:55;66085:232;66359:5;66331:13;:24;;;:33;66327:234;;66408:1;66381:24;;;:28;66327:234;;;66491:24;;;;:35;;66520:5;66491:28;:35::i;:::-;66464:24;;;:62;66327:234;66571:35;66609:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;66609:28:0;;;;;;;;;66691:20;;;;:32;;66716:6;66691:24;:32::i;:::-;66668:20;;;:55;66764:24;;;;:33;-1:-1:-1;66760:240:0;;66841:1;66814:24;;;:28;66760:240;;;66927:24;;;;:35;;66956:5;66927:28;:35::i;:::-;66900:24;;;:62;66760:240;67010:25;;-1:-1:-1;;;;;67094:14:0;;;67090:1573;;67125:23;67151:38;67185:3;67151:29;:5;37859:1;67151:9;:29::i;:38::-;67125:64;;67259:15;67231:13;:24;;;:43;67227:294;;67322:1;67295:24;;;:28;67227:294;;;67425:24;;;;:45;;67454:15;67425:28;:45::i;:::-;67398:24;;;:72;67227:294;67568:15;67539:13;:25;;;:44;67535:286;;67632:1;67604:25;;;:29;67535:286;;;67730:25;;;;:46;;67760:15;67730:29;:46::i;:::-;67702:25;;;:74;67535:286;67835:20;67858:34;67888:3;67858:25;:5;37930:2;67858:9;:25::i;:34::-;67835:57;;67959:12;67931:13;:24;;;:40;67927:282;;68019:1;67992:24;;;:28;67927:282;;;68119:24;;;;:42;;68148:12;68119:28;:42::i;:::-;68092:24;;;:69;67927:282;68223:37;68263:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;68263:30:0;;;;;;;;;68312:27;;;;:43;-1:-1:-1;68308:282:0;;68406:1;68376:27;;;:31;68308:282;;;68503:27;;;;:45;;68535:12;68503:31;:45::i;:::-;68473:27;;;:75;68308:282;68624:27;;;;-1:-1:-1;;;67090:1573:0;-1:-1:-1;;;;;68677:14:0;;;68673:915;;68712:20;68735:34;68765:3;68735:25;:5;38004:2;68735:9;:25::i;:34::-;68712:57;;68840:12;68812:13;:24;;;:40;68808:298;;68904:1;68877:24;;;:28;68808:298;;;69012:24;;;;:42;;69041:12;69012:28;:42::i;:::-;68985:24;;;:69;68808:298;69124:37;69164:22;;;:14;:22;;;;;;;;-1:-1:-1;;;;;69164:30:0;;;;;;;;;69217:27;;;;:43;-1:-1:-1;69213:298:0;;69315:1;69285:27;;;:31;69213:298;;;69420:27;;;;:45;;69452:12;69420:31;:45::i;:::-;69390:27;;;:75;69213:298;69549:27;;;;-1:-1:-1;;69756:6:0;-1:-1:-1;;;;;69603:179:0;69729:6;-1:-1:-1;;;;;69603:179:0;69670:4;-1:-1:-1;;;;;69603:179:0;;69615:6;69623:13;:19;;;;;;;;;;-1:-1:-1;;;;;69623:19:0;69644:13;:24;;;69676:13;:25;;;69703:13;:24;;;69737:17;69764;69603:179;;;;;;;;;-1:-1:-1;;;;;69603:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65809:3981;;;;;;;;;;;:::o;21313:761::-;21737:23;21763:69;21791:4;21763:69;;;;;;;;;;;;;;;;;21771:5;-1:-1:-1;;;;;21763:27:0;;;:69;;;;;:::i;:::-;21847:17;;21737:95;;-1:-1:-1;21847:21:0;21843:224;;21989:10;21978:30;;;;;;;;;;;;;;;-1:-1:-1;21978:30:0;21970:85;;;;-1:-1:-1;;;21970:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3723:195;3826:12;3858:52;3880:6;3888:4;3894:1;3897:12;3826;5027:18;5038:6;5027:10;:18::i;:::-;5019:60;;;;;-1:-1:-1;;;5019:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5153:12;5167:23;5194:6;-1:-1:-1;;;;;5194:11:0;5214:5;5222:4;5194:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5194:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5152:75;;;;5245:52;5263:7;5272:10;5284:12;5245:17;:52::i;:::-;5238:59;4775:530;-1:-1:-1;;;;;;;4775:530:0:o;805:422::-;1172:20;1211:8;;;805:422::o;7315:742::-;7430:12;7459:7;7455:595;;;-1:-1:-1;7490:10:0;7483:17;;7455:595;7604:17;;:21;7600:439;;7867:10;7861:17;7928:15;7915:10;7911:2;7907:19;7900:44;7815:148;8010:12;8003:20;;-1:-1:-1;;;8003:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://25532177b9a3af08f4fc5d512a9efe259993d9e6f16f19821b66c0a7c754b4ea
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1 | 10 | $10 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.