Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12677744 | 1250 days ago | IN | 0 ETH | 0.13903005 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Coinvise
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-21 */ // Sources flattened with hardhat v2.1.1 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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); } 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-upgradeable/proxy/[email protected] // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File @openzeppelin/contracts/token/ERC20/[email protected] 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/math/[email protected] 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/utils/[email protected] pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/lib/EIP712MetaTransactionUpgradeable/EIP712BaseUpgradeable.sol // MIT pragma solidity ^0.7.4; contract EIP712BaseUpgradeable is Initializable { struct EIP712Domain { string name; string version; uint256 salt; address verifyingContract; } bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,uint256 salt,address verifyingContract)" ) ); bytes32 internal domainSeperator; function _initialize(string memory name, string memory version) public virtual initializer { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), getChainID(), address(this) ) ); } function getChainID() internal pure returns (uint256 id) { assembly { id := chainid() } } function getDomainSeperator() private view returns (bytes32) { return domainSeperator; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } // File contracts/lib/EIP712MetaTransactionUpgradeable/EIP712MetaTransactionUpgradeable.sol // MIT pragma solidity ^0.7.4; contract EIP712MetaTransactionUpgradeable is Initializable, EIP712BaseUpgradeable { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) private nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function _initialize(string memory _name, string memory _version) public override initializer { EIP712BaseUpgradeable._initialize(_name, _version); } function convertBytesToBytes4(bytes memory inBytes) internal pure returns (bytes4 outBytes4) { if (inBytes.length == 0) { return 0x0; } assembly { outBytes4 := mload(add(inBytes, 32)) } } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable virtual returns (bytes memory) { bytes4 destinationFunctionSig = convertBytesToBytes4(functionSignature); require( destinationFunctionSig != msg.sig, "functionSignature can not be of executeMetaTransaction method" ); MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); nonces[userAddress] = nonces[userAddress].add(1); // Append userAddress at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call(abi.encodePacked(functionSignature, userAddress)); require(success, "Function call not successful"); emit MetaTransactionExecuted(userAddress, msg.sender, functionSignature); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) external view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address user, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { address signer = ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); require(signer != address(0), "Invalid signature"); return signer == user; } function msgSender() internal view returns (address sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = msg.sender; } return sender; } } // File contracts/Coinvise.sol // Unlicensed pragma solidity 0.7.4; pragma experimental ABIEncoderV2; // import "hardhat/console.sol"; interface IERC20Extended is IERC20 { function decimals() external view returns (uint8); } contract Coinvise is Initializable, OwnableUpgradeable, EIP712MetaTransactionUpgradeable { using SafeMath for uint256; using SafeERC20 for IERC20Extended; using SafeERC20 for IERC20; event CampaignCreated(uint256 indexed campaignId); event UserRewarded( address indexed managerAddress, uint256 indexed campaignId, address indexed userAddress, address tokenAddress, uint256 amount ); event Multisent( address indexed tokenAddress, uint256 recipientsAmount, uint256 amount ); event Withdrawn(address indexed recipient, uint256 amount); event Deposited( uint256 depositId, address indexed depositor, address token, uint256 amount, uint256 price ); event Bought( address user, uint256 depositId, address owner, address token, uint256 amount, uint256 price ); event WithdrawnDepositOwnerBalance(address user, uint256 amount); struct Campaign { uint256 campaignId; address manager; address tokenAddress; uint256 initialBalance; uint256 remainingBalance; uint256 linksAmount; uint256 amountPerLink; uint256 linksRewardedCount; } struct Deposit { uint256 depositId; address owner; address token; uint256 initialBalance; uint256 remainingBalance; uint256 price; } /** * @dev Following are the state variables for this contract * Due to resrictions of the proxy pattern, do not change the type or order * of the state variables. * https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable */ uint256 totalDepositOwnersBalanceInWei; // Next campaign ID by manager mapping(address => uint256) internal nextCampaignId; // All campaigns (userAddress => campaignId => Campaign) mapping(address => mapping(uint256 => Campaign)) internal campaigns; // All campaign IDs of a user (userAddress => campaignIds[]) mapping(address => uint256[]) internal campaignIds; // Rewarded addresses by a campaign (campaignId => userAddress[]) mapping(address => mapping(uint256 => mapping(address => bool))) internal addressRewarded; // Rewarded links by a campaign (campaignId => slug[]) mapping(uint256 => mapping(string => bool)) internal linksRewarded; // Next deposit ID by owner mapping(address => uint256) internal nextDepositId; // Deposits by user (userAddress => (depositId => deposit) mapping(address => mapping(uint256 => Deposit)) internal deposits; // All deposits IDs of a user (userAddress => depositIds[]) mapping(address => uint256[]) internal depositIds; // Balances by owner mapping(address => uint256) internal depositOwnersBalancesInWei; // This is an address whose private key lives in the coinvise backend // Used for signature verification address private trustedAddress; // Premiums Charged on Various Services uint256 public airdropPerLinkWeiCharged; uint256 public multisendPerLinkWeiCharged; uint256 public depositPercentageCharged; uint256 public depositPercentageChargedDecimals; // Add any new state variables here // End of state variables /** * @dev We cannot have constructors in upgradeable contracts, * therefore we define an initialize function which we call * manually once the contract is deployed. * the initializer modififer ensures that this can only be called once. * in practice, the openzeppelin library automatically calls the intitazie * function once deployed. */ function initialize( address _trustedAddress, uint256 _airdropPerLinkWeiCharged, uint256 _multisendPerLinkWeiCharged, uint256 _depositPercentageCharged, uint256 _depositPercentageChargedDecimals ) public initializer { require(_trustedAddress != address(0), "ERR__INVALID_TRUSTEDADDRESS_0x0"); // Call intialize of Base Contracts require(_trustedAddress != address(0), "ERR__0x0_TRUSTEDADDRESS"); OwnableUpgradeable.__Ownable_init(); EIP712MetaTransactionUpgradeable._initialize("Coinvise", "1"); trustedAddress = _trustedAddress; // Set premiums require(_depositPercentageCharged < 30, "ERR_DEPOSIT_FEE_TOO_HIGH"); airdropPerLinkWeiCharged = _airdropPerLinkWeiCharged; multisendPerLinkWeiCharged = _multisendPerLinkWeiCharged; depositPercentageCharged = _depositPercentageCharged; depositPercentageChargedDecimals = _depositPercentageChargedDecimals; } function setAirdropPremiums(uint256 _airdropPerLinkWeiCharged) external onlyOwner { airdropPerLinkWeiCharged = _airdropPerLinkWeiCharged; } function setMultisendPremiums(uint256 _mulisendPerLinkWeiCharged) external onlyOwner { multisendPerLinkWeiCharged = _mulisendPerLinkWeiCharged; } function setDepositPremiums( uint256 _depositPercentageCharged, uint256 _depositPercentageChargedDecimals ) external onlyOwner { require(_depositPercentageCharged < 30, "ERR_DEPOSIT_FEE_TOO_HIGH"); depositPercentageCharged = _depositPercentageCharged; depositPercentageChargedDecimals = _depositPercentageChargedDecimals; } function setTrustedAddress(address _trustedAddress) external onlyOwner { require(_trustedAddress != address(0), "ERR__0x0_TRUSTEDADDRESS"); trustedAddress = _trustedAddress; } function withdraw() external onlyOwner { uint256 totalBalance = address(this).balance; uint256 balance = totalBalance.sub(totalDepositOwnersBalanceInWei); msg.sender.transfer(balance); emit Withdrawn(msg.sender, balance); } // Generate Links function _createCampaign( address _tokenAddress, uint256 _linksAmount, uint256 _amountPerLink ) internal returns (uint256 _campaignId) { require(_linksAmount > 0, "ERR__LINKS_AMOUNT_MUST_BE_GREATHER_THAN_ZERO"); require( _amountPerLink > 0, "ERR__AMOUNT_PER_LINK_MUST_BE_GREATHER_THAN_ZERO" ); uint256 _initialBalance = _linksAmount.mul(_amountPerLink); address _sender = msgSender(); IERC20(_tokenAddress).safeTransferFrom( _sender, address(this), _initialBalance ); _campaignId = getCampaignId(); Campaign memory _campaign = Campaign({ campaignId: _campaignId, manager: _sender, tokenAddress: _tokenAddress, initialBalance: _initialBalance, remainingBalance: _initialBalance, linksAmount: _linksAmount, amountPerLink: _amountPerLink, linksRewardedCount: 0 }); campaigns[_sender][_campaignId] = _campaign; campaignIds[_sender].push(_campaignId); emit CampaignCreated(_campaignId); return _campaignId; } // Generate Links // function createCampaignMeta( // address _tokenAddress, // uint256 _linksAmount, // uint256 _amountPerLink // ) external returns (uint256) { // return _createCampaign(_tokenAddress, _linksAmount, _amountPerLink); // } function createCampaign( address _tokenAddress, uint256 _linksAmount, uint256 _amountPerLink ) external payable returns (uint256 _campaignId) { uint256 priceInWei = airdropPerLinkWeiCharged * _linksAmount; require(msg.value == priceInWei, "ERR__CAMPAIGN_PRICE_MUST_BE_PAID"); return _createCampaign(_tokenAddress, _linksAmount, _amountPerLink); } function getCampaign(address _campaignManager, uint256 _campaignId) external view returns ( uint256, address, address, uint256, uint256, uint256, uint256, uint256 ) { require( campaigns[_campaignManager][_campaignId].campaignId == _campaignId, "ERR__CAMPAIGN_DOES_NOT_EXIST" ); Campaign memory _campaign = campaigns[_campaignManager][_campaignId]; return ( _campaign.campaignId, _campaign.manager, _campaign.tokenAddress, _campaign.initialBalance, _campaign.remainingBalance, _campaign.linksAmount, _campaign.amountPerLink, _campaign.linksRewardedCount ); } function getCampaignIdsFromManager(address _campaignManager) external view returns (uint256[] memory) { return campaignIds[_campaignManager]; } function claim( address _campaignManager, uint256 _campaignId, bytes32 r, bytes32 s, uint8 v ) external { require( campaigns[_campaignManager][_campaignId].campaignId == _campaignId, "ERR__CAMPAIGN_DOES_NOT_EXIST" ); address _claimer = msgSender(); Campaign memory _campaign = campaigns[_campaignManager][_campaignId]; require( addressRewarded[_campaignManager][_campaignId][_claimer] != true, "ERR__ADDRESS_ALREADY_REWARDED" ); // require(linksRewarded[_campaignId][_slug] != true, "ERR__LINK_ALREADY_REWARDED"); // Check if signature is correct bytes32 messageHash = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encode(_campaignManager, _campaignId, _claimer)) ) ); address signer = ecrecover(messageHash, v, r, s); require(signer != address(0), "ERR__0x0_SIGNER"); require(signer == trustedAddress, "ERR__INVALID_SIGNER"); require( _campaign.linksRewardedCount < _campaign.linksAmount, "ERR__ALL_LINKS_USED" ); require( _campaign.remainingBalance >= _campaign.amountPerLink, "ERR_NOT_ENOUGH_BALANCE_FOR_REWARDING" ); address _token = _campaign.tokenAddress; IERC20(_token).safeTransfer(_claimer, _campaign.amountPerLink); // Mark as rewarded addressRewarded[_campaignManager][_campaignId][_claimer] = true; campaigns[_campaignManager][_campaignId].linksRewardedCount = _campaign .linksRewardedCount .add(1); campaigns[_campaignManager][_campaignId].remainingBalance = _campaign .remainingBalance .sub(_campaign.amountPerLink); // Emit event emit UserRewarded( _campaignManager, _campaignId, _claimer, _token, _campaign.amountPerLink ); } function _multisend( address _token, address[] memory _recipients, uint256[] memory _amounts ) internal { uint256 recipientsLength = _recipients.length; uint256 amountsLength = _amounts.length; require(amountsLength == recipientsLength, "ERR__INVALID_ARGS"); address _user = msgSender(); uint256 _totalAmount = 0; uint8 i = 0; for (i; i < recipientsLength; i++) { IERC20(_token).safeTransferFrom(_user, _recipients[i], _amounts[i]); _totalAmount = _totalAmount.add(_amounts[i]); } // Emit event emit Multisent(_token, recipientsLength, _totalAmount); } function multisend( address _token, address[] memory _recipients, uint256[] memory _amounts ) external payable { uint256 recipientsLength = _recipients.length; require( msg.value == multisendPerLinkWeiCharged * recipientsLength, "ERR__MULTISEND_PRICE_MUST_BE_PAID" ); _multisend(_token, _recipients, _amounts); } // function multisendMeta( // address _token, // address[] memory _recipients, // uint256[] memory _amounts // ) external { // _multisend(_token, _recipients, _amounts); // } function getCampaignId() internal returns (uint256 _campaignId) { address _campaignManager = msg.sender; _campaignId = nextCampaignId[_campaignManager]; if (_campaignId <= 0) { _campaignId = 1; } nextCampaignId[_campaignManager] = _campaignId.add(1); return _campaignId; } function getCampaignRewardedCount(address _manager, uint256 _campaignId) external view returns (uint256) { return campaigns[_manager][_campaignId].linksRewardedCount; } function _depositToken( address _token, uint256 _amount, uint256 _price ) internal returns (uint256 _depositId) { require(_amount > 0, "ERR__AMOUNT_MUST_BE_GREATHER_THAN_ZERO"); require(_price > 0, "ERR__PRICE_MUST_BE_GREATHER_THAN_ZERO"); IERC20Extended tokenContract = IERC20Extended(_token); address _owner = msg.sender; tokenContract.safeTransferFrom(_owner, address(this), _amount); _depositId = getDepositId(); Deposit memory _deposit = Deposit({ depositId: _depositId, owner: _owner, token: _token, initialBalance: _amount, remainingBalance: _amount, price: _price }); deposits[_owner][_depositId] = _deposit; depositIds[_owner].push(_depositId); emit Deposited(_depositId, _owner, _token, _amount, _price); } function depositToken( address _token, uint256 _amount, uint256 _price ) external payable returns (uint256 _depositId) { IERC20Extended tokenContract = IERC20Extended(_token); uint256 decimalsZeros = 10**tokenContract.decimals(); // Fee = 2% of the total. (tokenAmount * values.tokenPrice * 0.02) / depositPercentageChargedDecimals // (depositPercentageChargedDecimals is used for when depositPercentageCharged < 0.01) // OLD // uint256 priceInWei = _price // .mul(_amount) // .div(decimalsZeros) // .mul(depositPercentageCharged) // .div(100) // .div(10**depositPercentageChargedDecimals); // Same formula but only dividing once, avoiding truncation as much as possible uint256 bigTotal = _price.mul(_amount).mul(depositPercentageCharged); uint256 zeroes = decimalsZeros.mul(100).mul(10**depositPercentageChargedDecimals); uint256 priceInWei = bigTotal.div(zeroes); require(priceInWei > 0, "ERR__A_PRICE_MUST_BE_PAID"); require(msg.value == priceInWei, "ERR__PRICE_MUST_BE_PAID"); return _depositToken(_token, _amount, _price); } function getDepositIdsFromOwner(address _owner) external view returns (uint256[] memory) { return depositIds[_owner]; } function getDeposit(address _owner, uint256 _depositId) external view returns ( uint256, address, address, uint256, uint256, uint256 ) { require( deposits[_owner][_depositId].depositId == _depositId, "ERR__DEPOSIT_DOES_NOT_EXIST" ); Deposit memory _deposit = deposits[_owner][_depositId]; return ( _deposit.depositId, _deposit.owner, _deposit.token, _deposit.initialBalance, _deposit.remainingBalance, _deposit.price ); } function buyToken( uint256 _depositId, address payable _owner, uint256 _amount ) external payable { require( deposits[_owner][_depositId].depositId == _depositId, "ERR__DEPOSIT_DOES_NOT_EXIST" ); Deposit memory _deposit = deposits[_owner][_depositId]; require(_amount > 0, "ERR__AMOUNT_MUST_BE_GREATHER_THAN_ZERO"); require( _deposit.remainingBalance >= _amount, "ERR_NOT_ENOUGH_BALANCE_TO_BUY" ); IERC20Extended tokenContract = IERC20Extended(_deposit.token); uint256 decimalsZeros = 10**tokenContract.decimals(); uint256 totalPrice = _deposit.price.mul(_amount).div(decimalsZeros); require(totalPrice > 0, "ERR__A_PRICE_MUST_BE_PAID"); require(msg.value == totalPrice, "ERR__TOTAL_PRICE_MUST_BE_PAID"); deposits[_owner][_depositId].remainingBalance = _deposit .remainingBalance .sub(_amount); IERC20(_deposit.token).safeTransfer(msg.sender, _amount); depositOwnersBalancesInWei[_owner] = depositOwnersBalancesInWei[_owner].add( msg.value ); totalDepositOwnersBalanceInWei = totalDepositOwnersBalanceInWei.add( msg.value ); emit Bought( msg.sender, _depositId, _owner, _deposit.token, _amount, _deposit.price ); } function withdrawDeposit( uint256 _depositId ) external { address _owner = msg.sender; require(deposits[_owner][_depositId].depositId == _depositId, "ERR__DEPOSIT_DOES_NOT_EXIST"); Deposit memory _deposit = deposits[_owner][_depositId]; require(_deposit.remainingBalance > 0, "ERR_NO_BALANCE_TO_WITHDRAW"); deposits[_owner][_depositId].remainingBalance = 0; delete deposits[_owner][_depositId]; IERC20(_deposit.token).safeTransfer(_owner, _deposit.remainingBalance); } function withdrawDepositOwnerBalance() external { address payable owner = msg.sender; require( depositOwnersBalancesInWei[owner] > 0, "ERR_NO_BALANCE_TO_WITHDRAW" ); uint256 toWithdraw = depositOwnersBalancesInWei[owner]; depositOwnersBalancesInWei[owner] = 0; totalDepositOwnersBalanceInWei = totalDepositOwnersBalanceInWei.sub( toWithdraw ); require( totalDepositOwnersBalanceInWei >= 0, "ERR_NO_GENERAL_BALANCE_TO_WITHDRAW" ); owner.transfer(toWithdraw); emit WithdrawnDepositOwnerBalance(owner, toWithdraw); } function getDepositOwnerBalance() external view returns (uint256) { return depositOwnersBalancesInWei[msg.sender]; } function getCoinviseBalance() external view returns (uint256) { uint256 totalBalance = address(this).balance; return totalBalance.sub(totalDepositOwnersBalanceInWei); } function getDepositId() internal returns (uint256 _depositId) { _depositId = nextDepositId[msg.sender]; if (_depositId <= 0) { _depositId = 1; } nextDepositId[msg.sender] = _depositId.add(1); return _depositId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"campaignId","type":"uint256"}],"name":"CampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"recipientsAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Multisent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"managerAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"campaignId","type":"uint256"},{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserRewarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnDepositOwnerBalance","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_version","type":"string"}],"name":"_initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropPerLinkWeiCharged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_campaignManager","type":"address"},{"internalType":"uint256","name":"_campaignId","type":"uint256"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_linksAmount","type":"uint256"},{"internalType":"uint256","name":"_amountPerLink","type":"uint256"}],"name":"createCampaign","outputs":[{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositPercentageCharged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositPercentageChargedDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"depositToken","outputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_campaignManager","type":"address"},{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"name":"getCampaign","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_campaignManager","type":"address"}],"name":"getCampaignIdsFromManager","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"uint256","name":"_campaignId","type":"uint256"}],"name":"getCampaignRewardedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCoinviseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getDepositIdsFromOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDepositOwnerBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedAddress","type":"address"},{"internalType":"uint256","name":"_airdropPerLinkWeiCharged","type":"uint256"},{"internalType":"uint256","name":"_multisendPerLinkWeiCharged","type":"uint256"},{"internalType":"uint256","name":"_depositPercentageCharged","type":"uint256"},{"internalType":"uint256","name":"_depositPercentageChargedDecimals","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"multisend","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"multisendPerLinkWeiCharged","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_airdropPerLinkWeiCharged","type":"uint256"}],"name":"setAirdropPremiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositPercentageCharged","type":"uint256"},{"internalType":"uint256","name":"_depositPercentageChargedDecimals","type":"uint256"}],"name":"setDepositPremiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mulisendPerLinkWeiCharged","type":"uint256"}],"name":"setMultisendPremiums","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedAddress","type":"address"}],"name":"setTrustedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"withdrawDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDepositOwnerBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613833806100206000396000f3fe6080604052600436106101cd5760003560e01c80638cbfc305116100f7578063b08328b411610095578063ec744d3811610064578063ec744d38146104e0578063f2fde38b146104f5578063f3e6264014610515578063f92ad21914610528576101cd565b8063b08328b414610462578063b8de81bd14610496578063cbc9fe00146104b6578063da6c1dd3146104cb576101cd565b8063963084a0116100d1578063963084a01461040757806399c6d2de14610427578063a8776b4e1461043a578063ad8733ca1461044f576101cd565b80638cbfc305146103a55780638da5cb5b146103c557806396057cbd146103e7576101cd565b80633ccfd60b1161016f5780635b6d6b571161013e5780635b6d6b571461032e5780636a8df47a146103435780636dfea7c414610363578063715018a614610390576101cd565b80633ccfd60b146102d157806343d648e0146102e6578063461b6004146102fb578063484587641461030e576101cd565b80632726b506116101ab5780632726b5061461023d5780632d0335ab1461026f57806333289a461461029c578063337caa80146102bc576101cd565b8063098dce13146101d25780630c53c51c146101f45780631cb2acba1461021d575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612a67565b610548565b005b6102076102023660046128e8565b6105e0565b6040516102149190612db4565b60405180910390f35b34801561022957600080fd5b506101f2610238366004612ac8565b6107a1565b34801561024957600080fd5b5061025d61025836600461295e565b6107e5565b60405161021496959493929190613631565b34801561027b57600080fd5b5061028f61028a3660046127f8565b6108be565b6040516102149190613628565b3480156102a857600080fd5b506101f26102b7366004612ac8565b6108d9565b3480156102c857600080fd5b5061028f610a1a565b3480156102dd57600080fd5b506101f2610a2e565b3480156102f257600080fd5b5061028f610af6565b61028f6103093660046129d0565b610afc565b34801561031a57600080fd5b506101f2610329366004612ac8565b610b39565b34801561033a57600080fd5b5061028f610b7d565b34801561034f57600080fd5b506101f261035e366004612b17565b610b83565b34801561036f57600080fd5b5061038361037e3660046127f8565b610bed565b6040516102149190612d02565b34801561039c57600080fd5b506101f2610c5a565b3480156103b157600080fd5b506101f26103c03660046127f8565b610ce3565b3480156103d157600080fd5b506103da610d6a565b6040516102149190612c1f565b3480156103f357600080fd5b506103836104023660046127f8565b610d79565b34801561041357600080fd5b506101f2610422366004612989565b610de3565b61028f6104353660046129d0565b611164565b34801561044657600080fd5b506101f261128e565b6101f261045d366004612814565b61135b565b34801561046e57600080fd5b5061048261047d36600461295e565b611391565b604051610214989796959493929190613665565b3480156104a257600080fd5b5061028f6104b136600461295e565b61148c565b3480156104c257600080fd5b5061028f6114ba565b3480156104d757600080fd5b5061028f6114c0565b3480156104ec57600080fd5b5061028f6114c6565b34801561050157600080fd5b506101f26105103660046127f8565b6114df565b6101f2610523366004612ae0565b6115a0565b34801561053457600080fd5b506101f2610543366004612a04565b61186c565b600054610100900460ff168061056157506105616119da565b8061056f575060005460ff16155b6105945760405162461bcd60e51b815260040161058b906132e2565b60405180910390fd5b600054610100900460ff161580156105bf576000805460ff1961ff0019909116610100171660011790555b6105c983836119eb565b80156105db576000805461ff00191690555b505050565b606060006105ed86611ad7565b90506000356001600160e01b0319908116908216141561061f5760405162461bcd60e51b815260040161058b90612e7b565b61062761265a565b50604080516060810182526001600160a01b038916600081815260666020908152908490205483528201529081018790526106658882888888611af3565b6106815760405162461bcd60e51b815260040161058b90613459565b6001600160a01b0388166000908152606660205260409020546106a5906001611b9f565b6001600160a01b0389166000908152606660209081526040808320939093559151909160609130916106db918c918e9101612b9c565b60408051601f19818403018152908290526106f591612b80565b6000604051808303816000865af19150503d8060008114610732576040519150601f19603f3d011682016040523d82523d6000602084013e610737565b606091505b5091509150816107595760405162461bcd60e51b815260040161058b90612e44565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8a338b60405161078c93929190612c86565b60405180910390a19998505050505050505050565b6107a9611bc4565b6001600160a01b03166107ba610d6a565b6001600160a01b0316146107e05760405162461bcd60e51b815260040161058b906133ed565b607355565b6001600160a01b0382166000908152606e602090815260408083208484529091528120548190819081908190819087146108315760405162461bcd60e51b815260040161058b90612dc7565b610839612684565b505050506001600160a01b039485166000908152606e6020908152604080832096835295815290859020855160c081018752815480825260018301548916938201849052600283015490981696810187905260038201546060820181905260048301546080830181905260059093015460a09092018290529798929795509093509150565b6001600160a01b031660009081526066602052604090205490565b336000818152606e6020908152604080832085845290915290205482146109125760405162461bcd60e51b815260040161058b90612dc7565b61091a612684565b506001600160a01b038082166000908152606e60209081526040808320868452825291829020825160c0810184528154815260018201548516928101929092526002810154909316918101919091526003820154606082015260048201546080820181905260059092015460a0820152906109a75760405162461bcd60e51b815260040161058b90612faa565b6001600160a01b038281166000908152606e60209081526040808320878452909152808220600481018390558281556001810180546001600160a01b0319908116909155600282018054909116905560038101839055600501919091556080830151908301516105db9216908490611bc8565b336000908152607060205260409020545b90565b610a36611bc4565b6001600160a01b0316610a47610d6a565b6001600160a01b031614610a6d5760405162461bcd60e51b815260040161058b906133ed565b6067544790600090610a80908390611c1e565b604051909150339082156108fc029083906000818181858888f19350505050158015610ab0573d6000803e3d6000fd5b50336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051610aea9190613628565b60405180910390a25050565b60745481565b6072546000908302348114610b235760405162461bcd60e51b815260040161058b906135f3565b610b2e858585611c46565b9150505b9392505050565b610b41611bc4565b6001600160a01b0316610b52610d6a565b6001600160a01b031614610b785760405162461bcd60e51b815260040161058b906133ed565b607255565b60725481565b610b8b611bc4565b6001600160a01b0316610b9c610d6a565b6001600160a01b031614610bc25760405162461bcd60e51b815260040161058b906133ed565b601e8210610be25760405162461bcd60e51b815260040161058b90613422565b607491909155607555565b6001600160a01b0381166000908152606a6020908152604091829020805483518184028101840190945280845260609392830182828015610c4d57602002820191906000526020600020905b815481526020019060010190808311610c39575b505050505090505b919050565b610c62611bc4565b6001600160a01b0316610c73610d6a565b6001600160a01b031614610c995760405162461bcd60e51b815260040161058b906133ed565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610ceb611bc4565b6001600160a01b0316610cfc610d6a565b6001600160a01b031614610d225760405162461bcd60e51b815260040161058b906133ed565b6001600160a01b038116610d485760405162461bcd60e51b815260040161058b90612ed8565b607180546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031690565b6001600160a01b0381166000908152606f6020908152604091829020805483518184028101840190945280845260609392830182828015610c4d5760200282019190600052602060002090815481526020019060010190808311610c395750505050509050919050565b6001600160a01b03851660009081526069602090815260408083208784529091529020548414610e255760405162461bcd60e51b815260040161058b90613182565b6000610e2f611e6a565b9050610e396126cc565b506001600160a01b0380871660008181526069602090815260408083208a845282528083208151610100810183528154815260018083015488168286015260028301548816828501526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e0820152948452606b83528184208b85528352818420958716845294909152902054909160ff90911615151415610efa5760405162461bcd60e51b815260040161058b90613375565b6000878784604051602001610f1193929190612cdf565b60405160208183030381529060405280519060200120604051602001610f379190612bd3565b604051602081830303815290604052805190602001209050600060018286898960405160008152602001604052604051610f749493929190612d96565b6020604051602081039080840390855afa158015610f96573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610fc95760405162461bcd60e51b815260040161058b90613593565b6071546001600160a01b03828116911614610ff65760405162461bcd60e51b815260040161058b90612fe1565b8260a001518360e001511061101d5760405162461bcd60e51b815260040161058b90612f7d565b8260c00151836080015110156110455760405162461bcd60e51b815260040161058b90613267565b604083015160c0840151611065906001600160a01b038316908790611bc8565b6001600160a01b03808b166000908152606b602090815260408083208d84528252808320938916835292905220805460ff1916600190811790915560e08501516110ae91611b9f565b6001600160a01b038b1660009081526069602090815260408083208d845290915290206007015560c084015160808501516110e891611c1e565b6001600160a01b03808c1660008181526069602090815260408083208f8452909152908190206004019390935560c08701519251918816928c927f06393144cb37277ba0e7aec9e82a50974ff3eb81b523dce68b403e11ec4ef4199161115091879190612c33565b60405180910390a450505050505050505050565b6000808490506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a557600080fd5b505afa1580156111b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dd9190612b38565b60ff16600a0a905060006112066074546112008888611ec790919063ffffffff16565b90611ec7565b90506000611227607554600a0a611200606486611ec790919063ffffffff16565b905060006112358383611f01565b9050600081116112575760405162461bcd60e51b815260040161058b906131b9565b8034146112765760405162461bcd60e51b815260040161058b90612f46565b611281898989611f33565b9998505050505050505050565b336000818152607060205260409020546112ba5760405162461bcd60e51b815260040161058b90612faa565b6001600160a01b038116600090815260706020526040812080549190556067546112e49082611c1e565b6067556040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561131d573d6000803e3d6000fd5b507fd0c16bf212a1f1186e895b15e5240571ee9cc35f77e950dfd34b8393f712da6b828260405161134f929190612c33565b60405180910390a15050565b8151607354810234146113805760405162461bcd60e51b815260040161058b906134d1565b61138b84848461209d565b50505050565b6001600160a01b0382166000908152606960209081526040808320848452909152812054819081908190819081908190819089146113e15760405162461bcd60e51b815260040161058b90613182565b6113e96126cc565b505050506001600160a01b03968716600090815260696020908152604080832098835297815290879020875161010081018952815480825260018301548b169382018490526002830154909a16988101899052600382015460608201819052600483015460808301819052600584015460a08401819052600685015460c0850181905260079095015460e09094018490529b9c949b919950975095509093509150565b6001600160a01b03821660009081526069602090815260408083208484529091529020600701545b92915050565b60735481565b60755481565b60675460009047906114d9908290611c1e565b91505090565b6114e7611bc4565b6001600160a01b03166114f8610d6a565b6001600160a01b03161461151e5760405162461bcd60e51b815260040161058b906133ed565b6001600160a01b0381166115445760405162461bcd60e51b815260040161058b90612dfe565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152606e6020908152604080832086845290915290205483146115e25760405162461bcd60e51b815260040161058b90612dc7565b6115ea612684565b506001600160a01b038083166000908152606e60209081526040808320878452825291829020825160c081018452815481526001820154851692810192909252600281015490931691810191909152600382015460608201526004820154608082015260059091015460a0820152816116755760405162461bcd60e51b815260040161058b9061305d565b81816080015110156116995760405162461bcd60e51b815260040161058b906132ab565b6000816040015190506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116dd57600080fd5b505afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117159190612b38565b60ff16600a0a905060006117408261173a878760a00151611ec790919063ffffffff16565b90611f01565b9050600081116117625760405162461bcd60e51b815260040161058b906131b9565b8034146117815760405162461bcd60e51b815260040161058b906135bc565b60808401516117909086611c1e565b6001600160a01b038088166000908152606e602090815260408083208c84529091529081902060040192909255908501516117cd91163387611bc8565b6001600160a01b0386166000908152607060205260409020546117f09034611b9f565b6001600160a01b0387166000908152607060205260409020556067546118169034611b9f565b60675560408085015160a086015191517f842e66351f2f91f26dfe775da328f23de5cae382c37d0988d103d579704b55f39261185b9233928c928c92918c9190612c4c565b60405180910390a150505050505050565b600054610100900460ff168061188557506118856119da565b80611893575060005460ff16155b6118af5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff161580156118da576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166119005760405162461bcd60e51b815260040161058b9061349a565b6001600160a01b0386166119265760405162461bcd60e51b815260040161058b90612ed8565b61192e6121a7565b61197160405180604001604052806008815260200167436f696e7669736560c01b815250604051806040016040528060018152602001603160f81b815250610548565b607180546001600160a01b0319166001600160a01b038816179055601e83106119ac5760405162461bcd60e51b815260040161058b90613422565b607285905560738490556074839055607582905580156119d2576000805461ff00191690555b505050505050565b60006119e53061223a565b15905090565b600054610100900460ff1680611a045750611a046119da565b80611a12575060005460ff16155b611a2e5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff16158015611a59576000805460ff1961ff0019909116610100171660011790555b6040518060800160405280604f81526020016137af604f91398051906020012083805190602001208380519060200120611a91612240565b30604051602001611aa6959493929190612d46565b60408051601f19818403018152919052805160209091012060655580156105db576000805461ff0019169055505050565b6000815160001415611aeb57506000610c55565b506020015190565b6000806001611b09611b0488612244565b6122a2565b84878760405160008152602001604052604051611b299493929190612d96565b6020604051602081039080840390855afa158015611b4b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611b7e5760405162461bcd60e51b815260040161058b906130a3565b866001600160a01b0316816001600160a01b03161491505095945050505050565b600082820183811015610b325760405162461bcd60e51b815260040161058b90612f0f565b3390565b6105db8363a9059cbb60e01b8484604051602401611be7929190612c33565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526122be565b600082821115611c405760405162461bcd60e51b815260040161058b906130ce565b50900390565b6000808311611c675760405162461bcd60e51b815260040161058b9061321b565b60008211611c875760405162461bcd60e51b815260040161058b9061300e565b6000611c938484611ec7565b90506000611c9f611e6a565b9050611cb66001600160a01b03871682308561234d565b611cbe61236e565b9250611cc86126cc565b604051806101000160405280858152602001836001600160a01b03168152602001886001600160a01b03168152602001848152602001848152602001878152602001868152602001600081525090508060696000846001600160a01b03166001600160a01b0316815260200190815260200160002060008681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050606a6000836001600160a01b03166001600160a01b03168152602001908152602001600020849080600181540180825580915050600190039060005260206000200160009091909190915055837fbc0a5edd152fa5b886dcae82c5c109d113708653b4b9c0224549ccdf715af94e60405160405180910390a25050509392505050565b600033301415611ec25760606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610a2b9050565b503390565b600082611ed6575060006114b4565b82820282848281611ee357fe5b0414610b325760405162461bcd60e51b815260040161058b906133ac565b6000808211611f225760405162461bcd60e51b815260040161058b9061314b565b818381611f2b57fe5b049392505050565b6000808311611f545760405162461bcd60e51b815260040161058b9061305d565b60008211611f745760405162461bcd60e51b815260040161058b90613330565b8333611f8b6001600160a01b03831682308861234d565b611f936123b1565b9250611f9d612684565b506040805160c0810182528481526001600160a01b0380841660208084018281528b8416858701908152606086018c8152608087018d815260a088018d81526000878152606e87528a81208e825287528a81208a518155955160018088018054928c166001600160a01b0319938416179055955160028801805491909b169116179098559151600385015551600484015551600590920191909155828452606f8252858420805491820181558452922090910186905591519091907fefd7bb4f992963087670aa168590baee24d227ff5c18ae3790ef7ec22bde62749061208b9087908b908b908b906136a7565b60405180910390a25050509392505050565b815181518082146120c05760405162461bcd60e51b815260040161058b906131f0565b60006120ca611e6a565b90506000805b848160ff16101561215a5761212783888360ff16815181106120ee57fe5b6020026020010151888460ff168151811061210557fe5b60200260200101518b6001600160a01b031661234d909392919063ffffffff16565b612150868260ff168151811061213957fe5b602002602001015183611b9f90919063ffffffff16565b91506001016120d0565b876001600160a01b03167fd8b3799b7666e647874cb27516af73275795e9a144e00bf12d21a20dcc853ca786846040516121959291906136cb565b60405180910390a25050505050505050565b600054610100900460ff16806121c057506121c06119da565b806121ce575060005460ff16155b6121ea5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff16158015612215576000805460ff1961ff0019909116610100171660011790555b61221d6123e8565b612225612469565b8015612237576000805461ff00191690555b50565b3b151590565b4690565b600060405180608001604052806043815260200161376c60439139805160209182012083518483015160408087015180519086012090516122859501612d72565b604051602081830303815290604052805190602001209050919050565b60006122ac612543565b82604051602001612285929190612c04565b6060612313826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125499092919063ffffffff16565b8051909150156105db57808060200190518101906123319190612a47565b6105db5760405162461bcd60e51b815260040161058b90613549565b61138b846323b872dd60e01b858585604051602401611be793929190612cbb565b33600081815260686020526040902054908161238957600191505b612394826001611b9f565b6001600160a01b0390911660009081526068602052604090205590565b336000908152606d6020526040902054806123ca575060015b6123d5816001611b9f565b336000908152606d602052604090205590565b600054610100900460ff168061240157506124016119da565b8061240f575060005460ff16155b61242b5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff16158015612225576000805460ff1961ff0019909116610100171660011790558015612237576000805461ff001916905550565b600054610100900460ff168061248257506124826119da565b80612490575060005460ff16155b6124ac5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff161580156124d7576000805460ff1961ff0019909116610100171660011790555b60006124e1611bc4565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612237576000805461ff001916905550565b60655490565b60606125588484600085612560565b949350505050565b6060824710156125825760405162461bcd60e51b815260040161058b90613105565b61258b8561223a565b6125a75760405162461bcd60e51b815260040161058b90613512565b60006060866001600160a01b031685876040516125c49190612b80565b60006040518083038185875af1925050503d8060008114612601576040519150601f19603f3d011682016040523d82523d6000602084013e612606565b606091505b5091509150612616828286612621565b979650505050505050565b60608315612630575081610b32565b8251156126405782518084602001fd5b8160405162461bcd60e51b815260040161058b9190612db4565b60405180606001604052806000815260200160006001600160a01b03168152602001606081525090565b6040518060c001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518061010001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b600082601f830112612733578081fd5b8135612746612741826136fd565b6136d9565b81815291506020808301908481018184028601820187101561276757600080fd5b60005b848110156127865781358452928201929082019060010161276a565b505050505092915050565b600082601f8301126127a1578081fd5b813567ffffffffffffffff8111156127b557fe5b6127c8601f8201601f19166020016136d9565b91508082528360208285010111156127df57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215612809578081fd5b8135610b3281613747565b600080600060608486031215612828578182fd5b833561283381613747565b925060208481013567ffffffffffffffff80821115612850578485fd5b818701915087601f830112612863578485fd5b8135612871612741826136fd565b81815284810190848601868402860187018c101561288d578889fd5b8895505b838610156128b85780356128a481613747565b835260019590950194918601918601612891565b509650505060408701359250808311156128d0578384fd5b50506128de86828701612723565b9150509250925092565b600080600080600060a086880312156128ff578081fd5b853561290a81613747565b9450602086013567ffffffffffffffff811115612925578182fd5b61293188828901612791565b945050604086013592506060860135915060808601356129508161375c565b809150509295509295909350565b60008060408385031215612970578182fd5b823561297b81613747565b946020939093013593505050565b600080600080600060a086880312156129a0578081fd5b85356129ab81613747565b945060208601359350604086013592506060860135915060808601356129508161375c565b6000806000606084860312156129e4578283fd5b83356129ef81613747565b95602085013595506040909401359392505050565b600080600080600060a08688031215612a1b578081fd5b8535612a2681613747565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612a58578081fd5b81518015158114610b32578182fd5b60008060408385031215612a79578182fd5b823567ffffffffffffffff80821115612a90578384fd5b612a9c86838701612791565b93506020850135915080821115612ab1578283fd5b50612abe85828601612791565b9150509250929050565b600060208284031215612ad9578081fd5b5035919050565b600080600060608486031215612af4578081fd5b833592506020840135612b0681613747565b929592945050506040919091013590565b60008060408385031215612b29578182fd5b50508035926020909101359150565b600060208284031215612b49578081fd5b8151610b328161375c565b60008151808452612b6c81602086016020860161371b565b601f01601f19169290920160200192915050565b60008251612b9281846020870161371b565b9190910192915050565b60008351612bae81846020880161371b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925260a081019190915260c00190565b6001600160a01b03848116825283166020820152606060408201819052600090612cb290830184612b54565b95945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015612d3a57835183529284019291840191600101612d1e565b50909695505050505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b326020830184612b54565b6020808252601b908201527f4552525f5f4445504f5349545f444f45535f4e4f545f45584953540000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604082015260600190565b6020808252603d908201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060408201527f657865637574654d6574615472616e73616374696f6e206d6574686f64000000606082015260800190565b60208082526017908201527f4552525f5f3078305f5452555354454441444452455353000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526017908201527f4552525f5f50524943455f4d5553545f42455f50414944000000000000000000604082015260600190565b60208082526013908201527211549497d7d0531317d3125392d4d7d554d151606a1b604082015260600190565b6020808252601a908201527f4552525f4e4f5f42414c414e43455f544f5f5749544844524157000000000000604082015260600190565b60208082526013908201527222a9292fafa4a72b20a624a22fa9a4a3a722a960691b604082015260600190565b6020808252602f908201527f4552525f5f414d4f554e545f5045525f4c494e4b5f4d5553545f42455f47524560408201526e41544845525f5448414e5f5a45524f60881b606082015260800190565b60208082526026908201527f4552525f5f414d4f554e545f4d5553545f42455f47524541544845525f5448416040820152654e5f5a45524f60d01b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f4552525f5f43414d504149474e5f444f45535f4e4f545f455849535400000000604082015260600190565b60208082526019908201527f4552525f5f415f50524943455f4d5553545f42455f5041494400000000000000604082015260600190565b6020808252601190820152704552525f5f494e56414c49445f4152475360781b604082015260600190565b6020808252602c908201527f4552525f5f4c494e4b535f414d4f554e545f4d5553545f42455f47524541544860408201526b45525f5448414e5f5a45524f60a01b606082015260800190565b60208082526024908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f464f525f524557415260408201526344494e4760e01b606082015260800190565b6020808252601d908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f544f5f425559000000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f4552525f5f50524943455f4d5553545f42455f47524541544845525f5448414e6040820152645f5a45524f60d81b606082015260800190565b6020808252601d908201527f4552525f5f414444524553535f414c52454144595f5245574152444544000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f4552525f4445504f5349545f4645455f544f4f5f484947480000000000000000604082015260600190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b6020808252601f908201527f4552525f5f494e56414c49445f54525553544544414444524553535f30783000604082015260600190565b60208082526021908201527f4552525f5f4d554c544953454e445f50524943455f4d5553545f42455f5041496040820152601160fa1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600f908201526e22a9292faf983c182fa9a4a3a722a960891b604082015260600190565b6020808252601d908201527f4552525f5f544f54414c5f50524943455f4d5553545f42455f50414944000000604082015260600190565b6020808252818101527f4552525f5f43414d504149474e5f50524943455f4d5553545f42455f50414944604082015260600190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9788526001600160a01b0396871660208901529490951660408701526060860192909252608085015260a084015260c083019190915260e08201526101000190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156136f557fe5b604052919050565b600067ffffffffffffffff82111561371157fe5b5060209081020190565b60005b8381101561373657818101518382015260200161371e565b8381111561138b5750506000910152565b6001600160a01b038116811461223757600080fd5b60ff8116811461223757600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e743235362073616c742c6164647265737320766572696679696e67436f6e747261637429a2646970667358221220365ce12842d013ab3f7d3347c6cf8a895b3c41269e47437e67fa357d992c8b1d64736f6c63430007040033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80638cbfc305116100f7578063b08328b411610095578063ec744d3811610064578063ec744d38146104e0578063f2fde38b146104f5578063f3e6264014610515578063f92ad21914610528576101cd565b8063b08328b414610462578063b8de81bd14610496578063cbc9fe00146104b6578063da6c1dd3146104cb576101cd565b8063963084a0116100d1578063963084a01461040757806399c6d2de14610427578063a8776b4e1461043a578063ad8733ca1461044f576101cd565b80638cbfc305146103a55780638da5cb5b146103c557806396057cbd146103e7576101cd565b80633ccfd60b1161016f5780635b6d6b571161013e5780635b6d6b571461032e5780636a8df47a146103435780636dfea7c414610363578063715018a614610390576101cd565b80633ccfd60b146102d157806343d648e0146102e6578063461b6004146102fb578063484587641461030e576101cd565b80632726b506116101ab5780632726b5061461023d5780632d0335ab1461026f57806333289a461461029c578063337caa80146102bc576101cd565b8063098dce13146101d25780630c53c51c146101f45780631cb2acba1461021d575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612a67565b610548565b005b6102076102023660046128e8565b6105e0565b6040516102149190612db4565b60405180910390f35b34801561022957600080fd5b506101f2610238366004612ac8565b6107a1565b34801561024957600080fd5b5061025d61025836600461295e565b6107e5565b60405161021496959493929190613631565b34801561027b57600080fd5b5061028f61028a3660046127f8565b6108be565b6040516102149190613628565b3480156102a857600080fd5b506101f26102b7366004612ac8565b6108d9565b3480156102c857600080fd5b5061028f610a1a565b3480156102dd57600080fd5b506101f2610a2e565b3480156102f257600080fd5b5061028f610af6565b61028f6103093660046129d0565b610afc565b34801561031a57600080fd5b506101f2610329366004612ac8565b610b39565b34801561033a57600080fd5b5061028f610b7d565b34801561034f57600080fd5b506101f261035e366004612b17565b610b83565b34801561036f57600080fd5b5061038361037e3660046127f8565b610bed565b6040516102149190612d02565b34801561039c57600080fd5b506101f2610c5a565b3480156103b157600080fd5b506101f26103c03660046127f8565b610ce3565b3480156103d157600080fd5b506103da610d6a565b6040516102149190612c1f565b3480156103f357600080fd5b506103836104023660046127f8565b610d79565b34801561041357600080fd5b506101f2610422366004612989565b610de3565b61028f6104353660046129d0565b611164565b34801561044657600080fd5b506101f261128e565b6101f261045d366004612814565b61135b565b34801561046e57600080fd5b5061048261047d36600461295e565b611391565b604051610214989796959493929190613665565b3480156104a257600080fd5b5061028f6104b136600461295e565b61148c565b3480156104c257600080fd5b5061028f6114ba565b3480156104d757600080fd5b5061028f6114c0565b3480156104ec57600080fd5b5061028f6114c6565b34801561050157600080fd5b506101f26105103660046127f8565b6114df565b6101f2610523366004612ae0565b6115a0565b34801561053457600080fd5b506101f2610543366004612a04565b61186c565b600054610100900460ff168061056157506105616119da565b8061056f575060005460ff16155b6105945760405162461bcd60e51b815260040161058b906132e2565b60405180910390fd5b600054610100900460ff161580156105bf576000805460ff1961ff0019909116610100171660011790555b6105c983836119eb565b80156105db576000805461ff00191690555b505050565b606060006105ed86611ad7565b90506000356001600160e01b0319908116908216141561061f5760405162461bcd60e51b815260040161058b90612e7b565b61062761265a565b50604080516060810182526001600160a01b038916600081815260666020908152908490205483528201529081018790526106658882888888611af3565b6106815760405162461bcd60e51b815260040161058b90613459565b6001600160a01b0388166000908152606660205260409020546106a5906001611b9f565b6001600160a01b0389166000908152606660209081526040808320939093559151909160609130916106db918c918e9101612b9c565b60408051601f19818403018152908290526106f591612b80565b6000604051808303816000865af19150503d8060008114610732576040519150601f19603f3d011682016040523d82523d6000602084013e610737565b606091505b5091509150816107595760405162461bcd60e51b815260040161058b90612e44565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8a338b60405161078c93929190612c86565b60405180910390a19998505050505050505050565b6107a9611bc4565b6001600160a01b03166107ba610d6a565b6001600160a01b0316146107e05760405162461bcd60e51b815260040161058b906133ed565b607355565b6001600160a01b0382166000908152606e602090815260408083208484529091528120548190819081908190819087146108315760405162461bcd60e51b815260040161058b90612dc7565b610839612684565b505050506001600160a01b039485166000908152606e6020908152604080832096835295815290859020855160c081018752815480825260018301548916938201849052600283015490981696810187905260038201546060820181905260048301546080830181905260059093015460a09092018290529798929795509093509150565b6001600160a01b031660009081526066602052604090205490565b336000818152606e6020908152604080832085845290915290205482146109125760405162461bcd60e51b815260040161058b90612dc7565b61091a612684565b506001600160a01b038082166000908152606e60209081526040808320868452825291829020825160c0810184528154815260018201548516928101929092526002810154909316918101919091526003820154606082015260048201546080820181905260059092015460a0820152906109a75760405162461bcd60e51b815260040161058b90612faa565b6001600160a01b038281166000908152606e60209081526040808320878452909152808220600481018390558281556001810180546001600160a01b0319908116909155600282018054909116905560038101839055600501919091556080830151908301516105db9216908490611bc8565b336000908152607060205260409020545b90565b610a36611bc4565b6001600160a01b0316610a47610d6a565b6001600160a01b031614610a6d5760405162461bcd60e51b815260040161058b906133ed565b6067544790600090610a80908390611c1e565b604051909150339082156108fc029083906000818181858888f19350505050158015610ab0573d6000803e3d6000fd5b50336001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051610aea9190613628565b60405180910390a25050565b60745481565b6072546000908302348114610b235760405162461bcd60e51b815260040161058b906135f3565b610b2e858585611c46565b9150505b9392505050565b610b41611bc4565b6001600160a01b0316610b52610d6a565b6001600160a01b031614610b785760405162461bcd60e51b815260040161058b906133ed565b607255565b60725481565b610b8b611bc4565b6001600160a01b0316610b9c610d6a565b6001600160a01b031614610bc25760405162461bcd60e51b815260040161058b906133ed565b601e8210610be25760405162461bcd60e51b815260040161058b90613422565b607491909155607555565b6001600160a01b0381166000908152606a6020908152604091829020805483518184028101840190945280845260609392830182828015610c4d57602002820191906000526020600020905b815481526020019060010190808311610c39575b505050505090505b919050565b610c62611bc4565b6001600160a01b0316610c73610d6a565b6001600160a01b031614610c995760405162461bcd60e51b815260040161058b906133ed565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610ceb611bc4565b6001600160a01b0316610cfc610d6a565b6001600160a01b031614610d225760405162461bcd60e51b815260040161058b906133ed565b6001600160a01b038116610d485760405162461bcd60e51b815260040161058b90612ed8565b607180546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031690565b6001600160a01b0381166000908152606f6020908152604091829020805483518184028101840190945280845260609392830182828015610c4d5760200282019190600052602060002090815481526020019060010190808311610c395750505050509050919050565b6001600160a01b03851660009081526069602090815260408083208784529091529020548414610e255760405162461bcd60e51b815260040161058b90613182565b6000610e2f611e6a565b9050610e396126cc565b506001600160a01b0380871660008181526069602090815260408083208a845282528083208151610100810183528154815260018083015488168286015260028301548816828501526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e0820152948452606b83528184208b85528352818420958716845294909152902054909160ff90911615151415610efa5760405162461bcd60e51b815260040161058b90613375565b6000878784604051602001610f1193929190612cdf565b60405160208183030381529060405280519060200120604051602001610f379190612bd3565b604051602081830303815290604052805190602001209050600060018286898960405160008152602001604052604051610f749493929190612d96565b6020604051602081039080840390855afa158015610f96573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610fc95760405162461bcd60e51b815260040161058b90613593565b6071546001600160a01b03828116911614610ff65760405162461bcd60e51b815260040161058b90612fe1565b8260a001518360e001511061101d5760405162461bcd60e51b815260040161058b90612f7d565b8260c00151836080015110156110455760405162461bcd60e51b815260040161058b90613267565b604083015160c0840151611065906001600160a01b038316908790611bc8565b6001600160a01b03808b166000908152606b602090815260408083208d84528252808320938916835292905220805460ff1916600190811790915560e08501516110ae91611b9f565b6001600160a01b038b1660009081526069602090815260408083208d845290915290206007015560c084015160808501516110e891611c1e565b6001600160a01b03808c1660008181526069602090815260408083208f8452909152908190206004019390935560c08701519251918816928c927f06393144cb37277ba0e7aec9e82a50974ff3eb81b523dce68b403e11ec4ef4199161115091879190612c33565b60405180910390a450505050505050505050565b6000808490506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a557600080fd5b505afa1580156111b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dd9190612b38565b60ff16600a0a905060006112066074546112008888611ec790919063ffffffff16565b90611ec7565b90506000611227607554600a0a611200606486611ec790919063ffffffff16565b905060006112358383611f01565b9050600081116112575760405162461bcd60e51b815260040161058b906131b9565b8034146112765760405162461bcd60e51b815260040161058b90612f46565b611281898989611f33565b9998505050505050505050565b336000818152607060205260409020546112ba5760405162461bcd60e51b815260040161058b90612faa565b6001600160a01b038116600090815260706020526040812080549190556067546112e49082611c1e565b6067556040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561131d573d6000803e3d6000fd5b507fd0c16bf212a1f1186e895b15e5240571ee9cc35f77e950dfd34b8393f712da6b828260405161134f929190612c33565b60405180910390a15050565b8151607354810234146113805760405162461bcd60e51b815260040161058b906134d1565b61138b84848461209d565b50505050565b6001600160a01b0382166000908152606960209081526040808320848452909152812054819081908190819081908190819089146113e15760405162461bcd60e51b815260040161058b90613182565b6113e96126cc565b505050506001600160a01b03968716600090815260696020908152604080832098835297815290879020875161010081018952815480825260018301548b169382018490526002830154909a16988101899052600382015460608201819052600483015460808301819052600584015460a08401819052600685015460c0850181905260079095015460e09094018490529b9c949b919950975095509093509150565b6001600160a01b03821660009081526069602090815260408083208484529091529020600701545b92915050565b60735481565b60755481565b60675460009047906114d9908290611c1e565b91505090565b6114e7611bc4565b6001600160a01b03166114f8610d6a565b6001600160a01b03161461151e5760405162461bcd60e51b815260040161058b906133ed565b6001600160a01b0381166115445760405162461bcd60e51b815260040161058b90612dfe565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152606e6020908152604080832086845290915290205483146115e25760405162461bcd60e51b815260040161058b90612dc7565b6115ea612684565b506001600160a01b038083166000908152606e60209081526040808320878452825291829020825160c081018452815481526001820154851692810192909252600281015490931691810191909152600382015460608201526004820154608082015260059091015460a0820152816116755760405162461bcd60e51b815260040161058b9061305d565b81816080015110156116995760405162461bcd60e51b815260040161058b906132ab565b6000816040015190506000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116dd57600080fd5b505afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117159190612b38565b60ff16600a0a905060006117408261173a878760a00151611ec790919063ffffffff16565b90611f01565b9050600081116117625760405162461bcd60e51b815260040161058b906131b9565b8034146117815760405162461bcd60e51b815260040161058b906135bc565b60808401516117909086611c1e565b6001600160a01b038088166000908152606e602090815260408083208c84529091529081902060040192909255908501516117cd91163387611bc8565b6001600160a01b0386166000908152607060205260409020546117f09034611b9f565b6001600160a01b0387166000908152607060205260409020556067546118169034611b9f565b60675560408085015160a086015191517f842e66351f2f91f26dfe775da328f23de5cae382c37d0988d103d579704b55f39261185b9233928c928c92918c9190612c4c565b60405180910390a150505050505050565b600054610100900460ff168061188557506118856119da565b80611893575060005460ff16155b6118af5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff161580156118da576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166119005760405162461bcd60e51b815260040161058b9061349a565b6001600160a01b0386166119265760405162461bcd60e51b815260040161058b90612ed8565b61192e6121a7565b61197160405180604001604052806008815260200167436f696e7669736560c01b815250604051806040016040528060018152602001603160f81b815250610548565b607180546001600160a01b0319166001600160a01b038816179055601e83106119ac5760405162461bcd60e51b815260040161058b90613422565b607285905560738490556074839055607582905580156119d2576000805461ff00191690555b505050505050565b60006119e53061223a565b15905090565b600054610100900460ff1680611a045750611a046119da565b80611a12575060005460ff16155b611a2e5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff16158015611a59576000805460ff1961ff0019909116610100171660011790555b6040518060800160405280604f81526020016137af604f91398051906020012083805190602001208380519060200120611a91612240565b30604051602001611aa6959493929190612d46565b60408051601f19818403018152919052805160209091012060655580156105db576000805461ff0019169055505050565b6000815160001415611aeb57506000610c55565b506020015190565b6000806001611b09611b0488612244565b6122a2565b84878760405160008152602001604052604051611b299493929190612d96565b6020604051602081039080840390855afa158015611b4b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611b7e5760405162461bcd60e51b815260040161058b906130a3565b866001600160a01b0316816001600160a01b03161491505095945050505050565b600082820183811015610b325760405162461bcd60e51b815260040161058b90612f0f565b3390565b6105db8363a9059cbb60e01b8484604051602401611be7929190612c33565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526122be565b600082821115611c405760405162461bcd60e51b815260040161058b906130ce565b50900390565b6000808311611c675760405162461bcd60e51b815260040161058b9061321b565b60008211611c875760405162461bcd60e51b815260040161058b9061300e565b6000611c938484611ec7565b90506000611c9f611e6a565b9050611cb66001600160a01b03871682308561234d565b611cbe61236e565b9250611cc86126cc565b604051806101000160405280858152602001836001600160a01b03168152602001886001600160a01b03168152602001848152602001848152602001878152602001868152602001600081525090508060696000846001600160a01b03166001600160a01b0316815260200190815260200160002060008681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050606a6000836001600160a01b03166001600160a01b03168152602001908152602001600020849080600181540180825580915050600190039060005260206000200160009091909190915055837fbc0a5edd152fa5b886dcae82c5c109d113708653b4b9c0224549ccdf715af94e60405160405180910390a25050509392505050565b600033301415611ec25760606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610a2b9050565b503390565b600082611ed6575060006114b4565b82820282848281611ee357fe5b0414610b325760405162461bcd60e51b815260040161058b906133ac565b6000808211611f225760405162461bcd60e51b815260040161058b9061314b565b818381611f2b57fe5b049392505050565b6000808311611f545760405162461bcd60e51b815260040161058b9061305d565b60008211611f745760405162461bcd60e51b815260040161058b90613330565b8333611f8b6001600160a01b03831682308861234d565b611f936123b1565b9250611f9d612684565b506040805160c0810182528481526001600160a01b0380841660208084018281528b8416858701908152606086018c8152608087018d815260a088018d81526000878152606e87528a81208e825287528a81208a518155955160018088018054928c166001600160a01b0319938416179055955160028801805491909b169116179098559151600385015551600484015551600590920191909155828452606f8252858420805491820181558452922090910186905591519091907fefd7bb4f992963087670aa168590baee24d227ff5c18ae3790ef7ec22bde62749061208b9087908b908b908b906136a7565b60405180910390a25050509392505050565b815181518082146120c05760405162461bcd60e51b815260040161058b906131f0565b60006120ca611e6a565b90506000805b848160ff16101561215a5761212783888360ff16815181106120ee57fe5b6020026020010151888460ff168151811061210557fe5b60200260200101518b6001600160a01b031661234d909392919063ffffffff16565b612150868260ff168151811061213957fe5b602002602001015183611b9f90919063ffffffff16565b91506001016120d0565b876001600160a01b03167fd8b3799b7666e647874cb27516af73275795e9a144e00bf12d21a20dcc853ca786846040516121959291906136cb565b60405180910390a25050505050505050565b600054610100900460ff16806121c057506121c06119da565b806121ce575060005460ff16155b6121ea5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff16158015612215576000805460ff1961ff0019909116610100171660011790555b61221d6123e8565b612225612469565b8015612237576000805461ff00191690555b50565b3b151590565b4690565b600060405180608001604052806043815260200161376c60439139805160209182012083518483015160408087015180519086012090516122859501612d72565b604051602081830303815290604052805190602001209050919050565b60006122ac612543565b82604051602001612285929190612c04565b6060612313826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125499092919063ffffffff16565b8051909150156105db57808060200190518101906123319190612a47565b6105db5760405162461bcd60e51b815260040161058b90613549565b61138b846323b872dd60e01b858585604051602401611be793929190612cbb565b33600081815260686020526040902054908161238957600191505b612394826001611b9f565b6001600160a01b0390911660009081526068602052604090205590565b336000908152606d6020526040902054806123ca575060015b6123d5816001611b9f565b336000908152606d602052604090205590565b600054610100900460ff168061240157506124016119da565b8061240f575060005460ff16155b61242b5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff16158015612225576000805460ff1961ff0019909116610100171660011790558015612237576000805461ff001916905550565b600054610100900460ff168061248257506124826119da565b80612490575060005460ff16155b6124ac5760405162461bcd60e51b815260040161058b906132e2565b600054610100900460ff161580156124d7576000805460ff1961ff0019909116610100171660011790555b60006124e1611bc4565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612237576000805461ff001916905550565b60655490565b60606125588484600085612560565b949350505050565b6060824710156125825760405162461bcd60e51b815260040161058b90613105565b61258b8561223a565b6125a75760405162461bcd60e51b815260040161058b90613512565b60006060866001600160a01b031685876040516125c49190612b80565b60006040518083038185875af1925050503d8060008114612601576040519150601f19603f3d011682016040523d82523d6000602084013e612606565b606091505b5091509150612616828286612621565b979650505050505050565b60608315612630575081610b32565b8251156126405782518084602001fd5b8160405162461bcd60e51b815260040161058b9190612db4565b60405180606001604052806000815260200160006001600160a01b03168152602001606081525090565b6040518060c001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518061010001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b600082601f830112612733578081fd5b8135612746612741826136fd565b6136d9565b81815291506020808301908481018184028601820187101561276757600080fd5b60005b848110156127865781358452928201929082019060010161276a565b505050505092915050565b600082601f8301126127a1578081fd5b813567ffffffffffffffff8111156127b557fe5b6127c8601f8201601f19166020016136d9565b91508082528360208285010111156127df57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215612809578081fd5b8135610b3281613747565b600080600060608486031215612828578182fd5b833561283381613747565b925060208481013567ffffffffffffffff80821115612850578485fd5b818701915087601f830112612863578485fd5b8135612871612741826136fd565b81815284810190848601868402860187018c101561288d578889fd5b8895505b838610156128b85780356128a481613747565b835260019590950194918601918601612891565b509650505060408701359250808311156128d0578384fd5b50506128de86828701612723565b9150509250925092565b600080600080600060a086880312156128ff578081fd5b853561290a81613747565b9450602086013567ffffffffffffffff811115612925578182fd5b61293188828901612791565b945050604086013592506060860135915060808601356129508161375c565b809150509295509295909350565b60008060408385031215612970578182fd5b823561297b81613747565b946020939093013593505050565b600080600080600060a086880312156129a0578081fd5b85356129ab81613747565b945060208601359350604086013592506060860135915060808601356129508161375c565b6000806000606084860312156129e4578283fd5b83356129ef81613747565b95602085013595506040909401359392505050565b600080600080600060a08688031215612a1b578081fd5b8535612a2681613747565b97602087013597506040870135966060810135965060800135945092505050565b600060208284031215612a58578081fd5b81518015158114610b32578182fd5b60008060408385031215612a79578182fd5b823567ffffffffffffffff80821115612a90578384fd5b612a9c86838701612791565b93506020850135915080821115612ab1578283fd5b50612abe85828601612791565b9150509250929050565b600060208284031215612ad9578081fd5b5035919050565b600080600060608486031215612af4578081fd5b833592506020840135612b0681613747565b929592945050506040919091013590565b60008060408385031215612b29578182fd5b50508035926020909101359150565b600060208284031215612b49578081fd5b8151610b328161375c565b60008151808452612b6c81602086016020860161371b565b601f01601f19169290920160200192915050565b60008251612b9281846020870161371b565b9190910192915050565b60008351612bae81846020880161371b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0396871681526020810195909552928516604085015293166060830152608082019290925260a081019190915260c00190565b6001600160a01b03848116825283166020820152606060408201819052600090612cb290830184612b54565b95945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015612d3a57835183529284019291840191600101612d1e565b50909695505050505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b326020830184612b54565b6020808252601b908201527f4552525f5f4445504f5349545f444f45535f4e4f545f45584953540000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604082015260600190565b6020808252603d908201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060408201527f657865637574654d6574615472616e73616374696f6e206d6574686f64000000606082015260800190565b60208082526017908201527f4552525f5f3078305f5452555354454441444452455353000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526017908201527f4552525f5f50524943455f4d5553545f42455f50414944000000000000000000604082015260600190565b60208082526013908201527211549497d7d0531317d3125392d4d7d554d151606a1b604082015260600190565b6020808252601a908201527f4552525f4e4f5f42414c414e43455f544f5f5749544844524157000000000000604082015260600190565b60208082526013908201527222a9292fafa4a72b20a624a22fa9a4a3a722a960691b604082015260600190565b6020808252602f908201527f4552525f5f414d4f554e545f5045525f4c494e4b5f4d5553545f42455f47524560408201526e41544845525f5448414e5f5a45524f60881b606082015260800190565b60208082526026908201527f4552525f5f414d4f554e545f4d5553545f42455f47524541544845525f5448416040820152654e5f5a45524f60d01b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f4552525f5f43414d504149474e5f444f45535f4e4f545f455849535400000000604082015260600190565b60208082526019908201527f4552525f5f415f50524943455f4d5553545f42455f5041494400000000000000604082015260600190565b6020808252601190820152704552525f5f494e56414c49445f4152475360781b604082015260600190565b6020808252602c908201527f4552525f5f4c494e4b535f414d4f554e545f4d5553545f42455f47524541544860408201526b45525f5448414e5f5a45524f60a01b606082015260800190565b60208082526024908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f464f525f524557415260408201526344494e4760e01b606082015260800190565b6020808252601d908201527f4552525f4e4f545f454e4f5547485f42414c414e43455f544f5f425559000000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f4552525f5f50524943455f4d5553545f42455f47524541544845525f5448414e6040820152645f5a45524f60d81b606082015260800190565b6020808252601d908201527f4552525f5f414444524553535f414c52454144595f5245574152444544000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f4552525f4445504f5349545f4645455f544f4f5f484947480000000000000000604082015260600190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b6020808252601f908201527f4552525f5f494e56414c49445f54525553544544414444524553535f30783000604082015260600190565b60208082526021908201527f4552525f5f4d554c544953454e445f50524943455f4d5553545f42455f5041496040820152601160fa1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600f908201526e22a9292faf983c182fa9a4a3a722a960891b604082015260600190565b6020808252601d908201527f4552525f5f544f54414c5f50524943455f4d5553545f42455f50414944000000604082015260600190565b6020808252818101527f4552525f5f43414d504149474e5f50524943455f4d5553545f42455f50414944604082015260600190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9788526001600160a01b0396871660208901529490951660408701526060860192909252608085015260a084015260c083019190915260e08201526101000190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156136f557fe5b604052919050565b600067ffffffffffffffff82111561371157fe5b5060209081020190565b60005b8381101561373657818101518382015260200161371e565b8381111561138b5750506000910152565b6001600160a01b038116811461223757600080fd5b60ff8116811461223757600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e743235362073616c742c6164647265737320766572696679696e67436f6e747261637429a2646970667358221220365ce12842d013ab3f7d3347c6cf8a895b3c41269e47437e67fa357d992c8b1d64736f6c63430007040033
Deployed Bytecode Sourcemap
41025:17988:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37836:175;;;;;;;;;;-1:-1:-1;37836:175:0;;;;;:::i;:::-;;:::i;:::-;;38267:1135;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45796:166;;;;;;;;;;-1:-1:-1;45796:166:0;;;;;:::i;:::-;;:::i;55380:574::-;;;;;;;;;;-1:-1:-1;55380:574:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;39736:103::-;;;;;;;;;;-1:-1:-1;39736:103:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57302:516::-;;;;;;;;;;-1:-1:-1;57302:516:0;;;;;:::i;:::-;;:::i;58440:124::-;;;;;;;;;;;;;:::i;46522:246::-;;;;;;;;;;;;;:::i;44111:39::-;;;;;;;;;;;;;:::i;48197:384::-;;;;;;:::i;:::-;;:::i;45630:160::-;;;;;;;;;;-1:-1:-1;45630:160:0;;;;;:::i;:::-;;:::i;44021:39::-;;;;;;;;;;;;;:::i;45968:354::-;;;;;;;;;;-1:-1:-1;45968:354:0;;;;;:::i;:::-;;:::i;49331:169::-;;;;;;;;;;-1:-1:-1;49331:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12557:148::-;;;;;;;;;;;;;:::i;46328:188::-;;;;;;;;;;-1:-1:-1;46328:188:0;;;;;:::i;:::-;;:::i;11906:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55229:145::-;;;;;;;;;;-1:-1:-1;55229:145:0;;;;;:::i;:::-;;:::i;49506:1919::-;;;;;;;;;;-1:-1:-1;49506:1919:0;;;;;:::i;:::-;;:::i;54060:1163::-;;;;;;:::i;:::-;;:::i;57824:610::-;;;;;;;;;;;;;:::i;52082:371::-;;;;;;:::i;:::-;;:::i;48587:738::-;;;;;;;;;;-1:-1:-1;48587:738:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;52989:194::-;;;;;;;;;;-1:-1:-1;52989:194:0;;;;;:::i;:::-;;:::i;44065:41::-;;;;;;;;;;;;;:::i;44155:47::-;;;;;;;;;;;;;:::i;58570:181::-;;;;;;;;;;;;;:::i;12860:244::-;;;;;;;;;;-1:-1:-1;12860:244:0;;;;;:::i;:::-;;:::i;55960:1336::-;;;;;;:::i;:::-;;:::i;44675:949::-;;;;;;;;;;-1:-1:-1;44675:949:0;;;;;:::i;:::-;;:::i;37836:175::-;8715:13;;;;;;;;:33;;;8732:16;:14;:16::i;:::-;8715:50;;;-1:-1:-1;8753:12:0;;;;8752:13;8715:50;8707:109;;;;-1:-1:-1;;;8707:109:0;;;;;;;:::i;:::-;;;;;;;;;8829:19;8852:13;;;;;;8851:14;8876:101;;;;8911:13;:20;;-1:-1:-1;;;;8911:20:0;;;;;8946:19;8927:4;8946:19;;;8876:101;37955:50:::1;37989:5;37996:8;37955:33;:50::i;:::-;9007:14:::0;9003:68;;;9054:5;9038:21;;-1:-1:-1;;9038:21:0;;;9003:68;37836:175;;;:::o;38267:1135::-;38454:12;38475:29;38507:39;38528:17;38507:20;:39::i;:::-;38475:71;-1:-1:-1;38595:7:0;;-1:-1:-1;;;;;;38595:7:0;;;38569:33;;;;;38553:128;;;;-1:-1:-1;;;38553:128:0;;;;;;;:::i;:::-;38688:29;;:::i;:::-;-1:-1:-1;38727:138:0;;;;;;;;-1:-1:-1;;;;;38761:19:0;;-1:-1:-1;38761:19:0;;;:6;:19;;;;;;;;;38727:138;;;;;;;;;;;38888:45;38768:11;38727:138;38916:4;38922;38928;38888:6;:45::i;:::-;38872:112;;;;-1:-1:-1;;;38872:112:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39013:19:0;;;;;;:6;:19;;;;;;:26;;39037:1;39013:23;:26::i;:::-;-1:-1:-1;;;;;38991:19:0;;;;;;:6;:19;;;;;;;;:48;;;;39187;;38991:19;;39134:23;;39176:4;;39187:48;;39204:17;;38998:11;;39187:48;;:::i;:::-;;;;-1:-1:-1;;39187:48:0;;;;;;;;;;39168:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39119:117;;;;39253:7;39245:48;;;;-1:-1:-1;;;39245:48:0;;;;;;;:::i;:::-;39305:67;39329:11;39342:10;39354:17;39305:67;;;;;;;;:::i;:::-;;;;;;;;39386:10;38267:1135;-1:-1:-1;;;;;;;;;38267:1135:0:o;45796:166::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;45901:26:::1;:55:::0;45796:166::o;55380:574::-;-1:-1:-1;;;;;55603:16:0;;55482:7;55603:16;;;:8;:16;;;;;;;;:28;;;;;;;;:38;55482:7;;;;;;;;;;55603:52;;55587:113;;;;-1:-1:-1;;;55587:113:0;;;;;;;:::i;:::-;55709:23;;:::i;:::-;-1:-1:-1;;;;;;;;;55735:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;;55709:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55709:54:0;;-1:-1:-1;55709:54:0;-1:-1:-1;55380:574:0:o;39736:103::-;-1:-1:-1;;;;;39821:12:0;39791:13;39821:12;;;:6;:12;;;;;;;39736:103::o;57302:516::-;57390:10;57373:14;57415:16;;;:8;:16;;;;;;;;:28;;;;;;;;:38;:52;;57407:92;;;;-1:-1:-1;;;57407:92:0;;;;;;;:::i;:::-;57506:23;;:::i;:::-;-1:-1:-1;;;;;;57532:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;57506:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57567:68;;;;-1:-1:-1;;;57567:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57644:16:0;;;57692:1;57644:16;;;:8;:16;;;;;;;;:28;;;;;;;;;:45;;;:49;;;57700:35;;;;;;;;-1:-1:-1;;;;;;57700:35:0;;;;;;;;;;;;;;;;-1:-1:-1;57700:35:0;;;;;;;;;;;57786:25;;;;57749:14;;;;57742:70;;:35;;57644:16;;57742:35;:70::i;58440:124::-;58547:10;58497:7;58520:38;;;:26;:38;;;;;;58440:124;;:::o;46522:246::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;46654:30:::1;::::0;46591:21:::1;::::0;46568:20:::1;::::0;46637:48:::1;::::0;46591:21;;46637:16:::1;:48::i;:::-;46692:28;::::0;46619:66;;-1:-1:-1;46692:10:0::1;::::0;:28;::::1;;;::::0;46619:66;;46692:28:::1;::::0;;;46619:66;46692:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;46742:10;-1:-1:-1::0;;;;;46732:30:0::1;;46754:7;46732:30;;;;;;:::i;:::-;;;;;;;;12197:1;;46522:246::o:0;44111:39::-;;;;:::o;48197:384::-;48385:24;;48336:19;;48385:39;;48439:9;:23;;48431:68;;;;-1:-1:-1;;;48431:68:0;;;;;;;:::i;:::-;48515:60;48531:13;48546:12;48560:14;48515:15;:60::i;:::-;48508:67;;;48197:384;;;;;;:::o;45630:160::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;45732:24:::1;:52:::0;45630:160::o;44021:39::-;;;;:::o;45968:354::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;46151:2:::1;46123:25;:30;46115:67;;;;-1:-1:-1::0;;;46115:67:0::1;;;;;;;:::i;:::-;46189:24;:52:::0;;;;46248:32:::1;:68:::0;45968:354::o;49331:169::-;-1:-1:-1;;;;;49465:29:0;;;;;;:11;:29;;;;;;;;;49458:36;;;;;;;;;;;;;;;;;49430:16;;49458:36;;;49465:29;49458:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49331:169;;;;:::o;12557:148::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;12648:6:::1;::::0;12627:40:::1;::::0;12664:1:::1;::::0;-1:-1:-1;;;;;12648:6:0::1;::::0;12627:40:::1;::::0;12664:1;;12627:40:::1;12678:6;:19:::0;;-1:-1:-1;;;;;;12678:19:0::1;::::0;;12557:148::o;46328:188::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46414:29:0;::::1;46406:65;;;;-1:-1:-1::0;;;46406:65:0::1;;;;;;;:::i;:::-;46478:14;:32:::0;;-1:-1:-1;;;;;;46478:32:0::1;-1:-1:-1::0;;;;;46478:32:0;;;::::1;::::0;;;::::1;::::0;;46328:188::o;11906:87::-;11979:6;;-1:-1:-1;;;;;11979:6:0;11906:87;:::o;55229:145::-;-1:-1:-1;;;;;55350:18:0;;;;;;:10;:18;;;;;;;;;55343:25;;;;;;;;;;;;;;;;;55315:16;;55343:25;;;55350:18;55343:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55229:145;;;:::o;49506:1919::-;-1:-1:-1;;;;;49661:27:0;;;;;;:9;:27;;;;;;;;:40;;;;;;;;:51;:66;;49645:128;;;;-1:-1:-1;;;49645:128:0;;;;;;;:::i;:::-;49782:16;49801:11;:9;:11::i;:::-;49782:30;;49819:25;;:::i;:::-;-1:-1:-1;;;;;;49847:27:0;;;;;;;:9;:27;;;;;;;;:40;;;;;;;;49819:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49912:33;;;:15;:33;;;;;:46;;;;;;;;:56;;;;;;;;;;;;49819:68;;49912:56;;;;:64;;;;49896:127;;;;-1:-1:-1;;;49896:127:0;;;;;;;:::i;:::-;50160:19;50306:16;50324:11;50337:8;50295:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50285:62;;;;;;50209:149;;;;;;;;:::i;:::-;;;;;;;;;;;;;50189:178;;;;;;50160:207;;50374:14;50391:31;50401:11;50414:1;50417;50420;50391:31;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50391:31:0;;-1:-1:-1;;50391:31:0;;;-1:-1:-1;;;;;;;50437:20:0;;50429:48;;;;-1:-1:-1;;;50429:48:0;;;;;;;:::i;:::-;50502:14;;-1:-1:-1;;;;;50492:24:0;;;50502:14;;50492:24;50484:56;;;;-1:-1:-1;;;50484:56:0;;;;;;;:::i;:::-;50596:9;:21;;;50565:9;:28;;;:52;50549:105;;;;-1:-1:-1;;;50549:105:0;;;;;;;:::i;:::-;50707:9;:23;;;50677:9;:26;;;:53;;50661:123;;;;-1:-1:-1;;;50661:123:0;;;;;;;:::i;:::-;50810:22;;;;50879:23;;;;50841:62;;-1:-1:-1;;;;;50841:27:0;;;50869:8;;50841:27;:62::i;:::-;-1:-1:-1;;;;;50937:33:0;;;;;;;:15;:33;;;;;;;;:46;;;;;;;;:56;;;;;;;;;:63;;-1:-1:-1;;50937:63:0;50996:4;50937:63;;;;;;51069:36;;;;:51;;:48;:51::i;:::-;-1:-1:-1;;;;;51007:27:0;;;;;;:9;:27;;;;;;;;:40;;;;;;;;:59;;:113;51234:23;;;;51187:34;;;;:71;;:46;:71::i;:::-;-1:-1:-1;;;;;51127:27:0;;;;;;;:9;:27;;;;;;;;:40;;;;;;;;;;:57;;:131;;;;51389:23;;;;51291:128;;;;;;51155:11;;51291:128;;;;51374:6;;51389:23;51291:128;:::i;:::-;;;;;;;;49506:1919;;;;;;;;;;:::o;54060:1163::-;54177:18;54204:28;54250:6;54204:53;;54264:21;54292:13;-1:-1:-1;;;;;54292:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54288:28;;:2;:28;54264:52;;54834:16;54853:49;54877:24;;54853:19;54864:7;54853:6;:10;;:19;;;;:::i;:::-;:23;;:49::i;:::-;54834:68;;54909:14;54926:64;54957:32;;54953:2;:36;54926:22;54944:3;54926:13;:17;;:22;;;;:::i;:64::-;54909:81;-1:-1:-1;54997:18:0;55018:20;:8;54909:81;55018:12;:20::i;:::-;54997:41;;55066:1;55053:10;:14;55045:52;;;;-1:-1:-1;;;55045:52:0;;;;;;;:::i;:::-;55125:10;55112:9;:23;55104:59;;;;-1:-1:-1;;;55104:59:0;;;;;;;:::i;:::-;55179:38;55193:6;55201:7;55210:6;55179:13;:38::i;:::-;55172:45;54060:1163;-1:-1:-1;;;;;;;;;54060:1163:0:o;57824:610::-;57903:10;57879:21;57936:33;;;:26;:33;;;;;;57920:97;;;;-1:-1:-1;;;57920:97:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58045:33:0;;58024:18;58045:33;;;:26;:33;;;;;;;58085:37;;;58162:30;;:60;;58045:33;58162:34;:60::i;:::-;58129:30;:93;58341:26;;-1:-1:-1;;;;;58341:14:0;;;:26;;;;;58356:10;;58341:26;;;;58356:10;58341:14;:26;;;;;;;;;;;;;;;;;;;;;58381:47;58410:5;58417:10;58381:47;;;;;;;:::i;:::-;;;;;;;;57824:610;;:::o;52082:371::-;52245:18;;52301:26;;:45;;52288:9;:58;52272:125;;;;-1:-1:-1;;;52272:125:0;;;;;;;:::i;:::-;52406:41;52417:6;52425:11;52438:8;52406:10;:41::i;:::-;52082:371;;;;:::o;48587:738::-;-1:-1:-1;;;;;48854:27:0;;48701:7;48854:27;;;:9;:27;;;;;;;;:40;;;;;;;;:51;48701:7;;;;;;;;;;;;;;48854:66;;48838:128;;;;-1:-1:-1;;;48838:128:0;;;;;;;:::i;:::-;48975:25;;:::i;:::-;-1:-1:-1;;;;;;;;;49003:27:0;;;;;;;:9;:27;;;;;;;;:40;;;;;;;;;;48975:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48975:68:0;-1:-1:-1;48975:68:0;-1:-1:-1;48975:68:0;;-1:-1:-1;48975:68:0;-1:-1:-1;48587:738:0:o;52989:194::-;-1:-1:-1;;;;;53126:19:0;;53100:7;53126:19;;;:9;:19;;;;;;;;:32;;;;;;;;:51;;;52989:194;;;;;:::o;44065:41::-;;;;:::o;44155:47::-;;;;:::o;58570:181::-;58714:30;;58623:7;;58662:21;;58697:48;;58662:21;;58697:16;:48::i;:::-;58690:55;;;58570:181;:::o;12860:244::-;12137:12;:10;:12::i;:::-;-1:-1:-1;;;;;12126:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;12126:23:0;;12118:68;;;;-1:-1:-1;;;12118:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12949:22:0;::::1;12941:73;;;;-1:-1:-1::0;;;12941:73:0::1;;;;;;;:::i;:::-;13051:6;::::0;13030:38:::1;::::0;-1:-1:-1;;;;;13030:38:0;;::::1;::::0;13051:6:::1;::::0;13030:38:::1;::::0;13051:6:::1;::::0;13030:38:::1;13079:6;:17:::0;;-1:-1:-1;;;;;;13079:17:0::1;-1:-1:-1::0;;;;;13079:17:0;;;::::1;::::0;;;::::1;::::0;;12860:244::o;55960:1336::-;-1:-1:-1;;;;;56099:16:0;;;;;;:8;:16;;;;;;;;:28;;;;;;;;:38;:52;;56083:113;;;;-1:-1:-1;;;56083:113:0;;;;;;;:::i;:::-;56203:23;;:::i;:::-;-1:-1:-1;;;;;;56229:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;56203:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56272:11;56264:62;;;;-1:-1:-1;;;56264:62:0;;;;;;;:::i;:::-;56378:7;56349:8;:25;;;:36;;56333:99;;;;-1:-1:-1;;;56333:99:0;;;;;;;:::i;:::-;56441:28;56487:8;:14;;;56441:61;;56509:21;56537:13;-1:-1:-1;;;;;56537:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56533:28;;:2;:28;56509:52;;56568:18;56589:46;56621:13;56589:27;56608:7;56589:8;:14;;;:18;;:27;;;;:::i;:::-;:31;;:46::i;:::-;56568:67;;56663:1;56650:10;:14;56642:52;;;;-1:-1:-1;;;56642:52:0;;;;;;;:::i;:::-;56722:10;56709:9;:23;56701:65;;;;-1:-1:-1;;;56701:65:0;;;;;;;:::i;:::-;56823:33;;;;:54;;56869:7;56823:45;:54::i;:::-;-1:-1:-1;;;;;56775:16:0;;;;;;;:8;:16;;;;;;;;:28;;;;;;;;;;:45;;:102;;;;56891:14;;;;56884:56;;:35;56920:10;56932:7;56884:35;:56::i;:::-;-1:-1:-1;;;;;56986:34:0;;;;;;:26;:34;;;;;;:63;;57033:9;56986:38;:63::i;:::-;-1:-1:-1;;;;;56949:34:0;;;;;;:26;:34;;;;;:100;57089:30;;:59;;57132:9;57089:34;:59::i;:::-;57056:30;:92;57230:14;;;;;57269;;;;57162:128;;;;;;57177:10;;57196;;57215:6;;57230:14;57253:7;;57269:14;57162:128;:::i;:::-;;;;;;;;55960:1336;;;;;;;:::o;44675:949::-;8715:13;;;;;;;;:33;;;8732:16;:14;:16::i;:::-;8715:50;;;-1:-1:-1;8753:12:0;;;;8752:13;8715:50;8707:109;;;;-1:-1:-1;;;8707:109:0;;;;;;;:::i;:::-;8829:19;8852:13;;;;;;8851:14;8876:101;;;;8911:13;:20;;-1:-1:-1;;;;8911:20:0;;;;;8946:19;8927:4;8946:19;;;8876:101;-1:-1:-1;;;;;44934:29:0;::::1;44926:73;;;;-1:-1:-1::0;;;44926:73:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45057:29:0;::::1;45049:65;;;;-1:-1:-1::0;;;45049:65:0::1;;;;;;;:::i;:::-;45123:35;:33;:35::i;:::-;45165:61;;;;;;;;;;;;;;-1:-1:-1::0;;;45165:61:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;45165:61:0::1;;::::0;:44:::1;:61::i;:::-;45233:14;:32:::0;;-1:-1:-1;;;;;;45233:32:0::1;-1:-1:-1::0;;;;;45233:32:0;::::1;;::::0;;45331:2:::1;45303:30:::0;::::1;45295:67;;;;-1:-1:-1::0;;;45295:67:0::1;;;;;;;:::i;:::-;45369:24;:52:::0;;;45428:26:::1;:56:::0;;;45491:24:::1;:52:::0;;;45550:32:::1;:68:::0;;;9003;;;;9054:5;9038:21;;-1:-1:-1;;9038:21:0;;;9003:68;44675:949;;;;;;:::o;9171:125::-;9219:4;9244:44;9282:4;9244:29;:44::i;:::-;9243:45;9236:52;;9171:125;:::o;35749:333::-;8715:13;;;;;;;;:33;;;8732:16;:14;:16::i;:::-;8715:50;;;-1:-1:-1;8753:12:0;;;;8752:13;8715:50;8707:109;;;;-1:-1:-1;;;8707:109:0;;;;;;;:::i;:::-;8829:19;8852:13;;;;;;8851:14;8876:101;;;;8911:13;:20;;-1:-1:-1;;;;8911:20:0;;;;;8946:19;8927:4;8946:19;;;8876:101;35590:106:::1;;;;;;;;;;;;;;;;;35572:131;;;;;;35971:4;35955:22;;;;;;36004:7;35988:25;;;;;;36024:12;:10;:12::i;:::-;36055:4;35901:168;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;35901:168:0;;::::1;::::0;;;;;;35883:193;;35901:168:::1;35883:193:::0;;::::1;::::0;35865:15:::1;:211:::0;9003:68;;;;9054:5;9038:21;;-1:-1:-1;;9038:21:0;;;35749:333;;;:::o;38017:244::-;38107:16;38139:7;:14;38157:1;38139:19;38135:52;;;-1:-1:-1;38176:3:0;38169:10;;38135:52;-1:-1:-1;38245:2:0;38232:16;38226:23;;38204:52::o;39845:403::-;39999:4;40012:14;40036:121;40056:47;40075:27;40095:6;40075:19;:27::i;:::-;40056:18;:47::i;:::-;40114:4;40129;40144;40036:121;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40036:121:0;;-1:-1:-1;;40036:121:0;;;-1:-1:-1;;;;;;;40172:20:0;;40164:50;;;;-1:-1:-1;;;40164:50:0;;;;;;;:::i;:::-;40238:4;-1:-1:-1;;;;;40228:14:0;:6;-1:-1:-1;;;;;40228:14:0;;40221:21;;;39845:403;;;;;;;:::o;18767:179::-;18825:7;18857:5;;;18881:6;;;;18873:46;;;;-1:-1:-1;;;18873:46:0;;;;;;;:::i;10169:106::-;10257:10;10169:106;:::o;32147:177::-;32230:86;32250:5;32280:23;;;32305:2;32309:5;32257:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32257:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32257:58:0;-1:-1:-1;;;;;;32257:58:0;;;;;;;;;;32230:19;:86::i;19229:158::-;19287:7;19320:1;19315;:6;;19307:49;;;;-1:-1:-1;;;19307:49:0;;;;;;;:::i;:::-;-1:-1:-1;19374:5:0;;;19229:158::o;46795:1124::-;46927:19;46978:1;46963:12;:16;46955:73;;;;-1:-1:-1;;;46955:73:0;;;;;;;:::i;:::-;47068:1;47051:14;:18;47035:99;;;;-1:-1:-1;;;47035:99:0;;;;;;;:::i;:::-;47143:23;47169:32;:12;47186:14;47169:16;:32::i;:::-;47143:58;;47208:15;47226:11;:9;:11::i;:::-;47208:29;-1:-1:-1;47246:107:0;-1:-1:-1;;;;;47246:38:0;;47208:29;47317:4;47331:15;47246:38;:107::i;:::-;47376:15;:13;:15::i;:::-;47362:29;;47400:25;;:::i;:::-;47435:312;;;;;;;;47467:11;47435:312;;;;47498:7;-1:-1:-1;;;;;47435:312:0;;;;;47530:13;-1:-1:-1;;;;;47435:312:0;;;;;47570:15;47435:312;;;;47614:15;47435:312;;;;47653:12;47435:312;;;;47691:14;47435:312;;;;47736:1;47435:312;;;47400:347;;47790:9;47756;:18;47766:7;-1:-1:-1;;;;;47756:18:0;-1:-1:-1;;;;;47756:18:0;;;;;;;;;;;;:31;47775:11;47756:31;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47756:43:0;;;;;-1:-1:-1;;;;;47756:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47756:43:0;;;;;-1:-1:-1;;;;;47756:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47806:11;:20;47818:7;-1:-1:-1;;;;;47806:20:0;-1:-1:-1;;;;;47806:20:0;;;;;;;;;;;;47832:11;47806:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47874:11;47858:28;;;;;;;;;;47895:18;;;46795:1124;;;;;:::o;40254:509::-;40298:14;40325:10;40347:4;40325:27;40321:417;;;40363:18;40384:8;;40363:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;40417:8:0;40596:17;40590:24;-1:-1:-1;;;;;40574:106:0;;-1:-1:-1;40450:239:0;;-1:-1:-1;40450:239:0;;-1:-1:-1;40720:10:0;40254:509;:::o;19646:220::-;19704:7;19728:6;19724:20;;-1:-1:-1;19743:1:0;19736:8;;19724:20;19767:5;;;19771:1;19767;:5;:1;19791:5;;;;;:10;19783:56;;;;-1:-1:-1;;;19783:56:0;;;;;;;:::i;20344:153::-;20402:7;20434:1;20430;:5;20422:44;;;;-1:-1:-1;;;20422:44:0;;;;;;;:::i;:::-;20488:1;20484;:5;;;;;;;20344:153;-1:-1:-1;;;20344:153:0:o;53189:865::-;53299:18;53344:1;53334:7;:11;53326:62;;;;-1:-1:-1;;;53326:62:0;;;;;;;:::i;:::-;53412:1;53403:6;:10;53395:60;;;;-1:-1:-1;;;53395:60:0;;;;;;;:::i;:::-;53510:6;53543:10;53560:62;-1:-1:-1;;;;;53560:30:0;;53543:10;53607:4;53614:7;53560:30;:62::i;:::-;53644:14;:12;:14::i;:::-;53631:27;;53665:23;;:::i;:::-;-1:-1:-1;53698:192:0;;;;;;;;;;;-1:-1:-1;;;;;53698:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53899:16:0;;;:8;:16;;;;;:28;;;;;;;;:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53899:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53945:18;;;:10;:18;;;;;:35;;;;;;;;;;;;;;;;;53994:54;;53698:192;;;53994:54;;;;53728:10;;53780:6;;53813:7;;53874:6;;53994:54;:::i;:::-;;;;;;;;53189:865;;;;;;;;:::o;51431:645::-;51587:18;;51636:15;;51668:33;;;51660:63;;;;-1:-1:-1;;;51660:63:0;;;;;;;:::i;:::-;51732:13;51748:11;:9;:11::i;:::-;51732:27;;51766:20;51799:7;51817:172;51829:16;51825:1;:20;;;51817:172;;;51861:67;51893:5;51900:11;51912:1;51900:14;;;;;;;;;;;;;;;;51916:8;51925:1;51916:11;;;;;;;;;;;;;;;;51868:6;-1:-1:-1;;;;;51861:31:0;;;:67;;;;;;:::i;:::-;51952:29;51969:8;51978:1;51969:11;;;;;;;;;;;;;;;;51952:12;:16;;:29;;;;:::i;:::-;51937:44;-1:-1:-1;51847:3:0;;51817:172;;;52031:6;-1:-1:-1;;;;;52021:49:0;;52039:16;52057:12;52021:49;;;;;;;:::i;:::-;;;;;;;;51431:645;;;;;;;;:::o;11492:129::-;8715:13;;;;;;;;:33;;;8732:16;:14;:16::i;:::-;8715:50;;;-1:-1:-1;8753:12:0;;;;8752:13;8715:50;8707:109;;;;-1:-1:-1;;;8707:109:0;;;;;;;:::i;:::-;8829:19;8852:13;;;;;;8851:14;8876:101;;;;8911:13;:20;;-1:-1:-1;;;;8911:20:0;;;;;8946:19;8927:4;8946:19;;;8876:101;11550:26:::1;:24;:26::i;:::-;11587;:24;:26::i;:::-;9007:14:::0;9003:68;;;9054:5;9038:21;;-1:-1:-1;;9038:21:0;;;9003:68;11492:129;:::o;909:422::-;1276:20;1315:8;;;909:422::o;36088:109::-;36176:9;;36161:31::o;39408:322::-;39506:7;37214:94;;;;;;;;;;;;;;;;;37196:119;;;;;;;39620:12;;39645:11;;;;39679:24;;;;;39669:35;;;;;;39559:156;;;;;;:::i;:::-;;;;;;;;;;;;;39539:185;;;;;;39525:199;;39408:322;;;:::o;36652:218::-;36739:7;36821:20;:18;:20::i;:::-;36843:11;36792:63;;;;;;;;;:::i;34452:761::-;34876:23;34902:69;34930:4;34902:69;;;;;;;;;;;;;;;;;34910:5;-1:-1:-1;;;;;34902:27:0;;;:69;;;;;:::i;:::-;34986:17;;34876:95;;-1:-1:-1;34986:21:0;34982:224;;35128:10;35117:30;;;;;;;;;;;;:::i;:::-;35109:85;;;;-1:-1:-1;;;35109:85:0;;;;;;;:::i;32332:205::-;32433:96;32453:5;32483:27;;;32512:4;32518:2;32522:5;32460:68;;;;;;;;;;:::i;52665:318::-;52763:10;52708:19;52794:32;;;:14;:32;;;;;;;52839:16;52835:54;;52880:1;52866:15;;52835:54;52932:18;:11;52948:1;52932:15;:18::i;:::-;-1:-1:-1;;;;;52897:32:0;;;;;;;:14;:32;;;;;:53;52665:318;:::o;58757:253::-;58853:10;58799:18;58839:25;;;:13;:25;;;;;;58877:15;58873:52;;-1:-1:-1;58916:1:0;58873:52;58961:17;:10;58976:1;58961:14;:17::i;:::-;58947:10;58933:25;;;;:13;:25;;;;;:45;58757:253;:::o;10098:65::-;8715:13;;;;;;;;:33;;;8732:16;:14;:16::i;:::-;8715:50;;;-1:-1:-1;8753:12:0;;;;8752:13;8715:50;8707:109;;;;-1:-1:-1;;;8707:109:0;;;;;;;:::i;:::-;8829:19;8852:13;;;;;;8851:14;8876:101;;;;8911:13;:20;;-1:-1:-1;;;;8911:20:0;;;;;8946:19;8927:4;8946:19;;;9007:14;9003:68;;;9054:5;9038:21;;-1:-1:-1;;9038:21:0;;;10098:65;:::o;11629:196::-;8715:13;;;;;;;;:33;;;8732:16;:14;:16::i;:::-;8715:50;;;-1:-1:-1;8753:12:0;;;;8752:13;8715:50;8707:109;;;;-1:-1:-1;;;8707:109:0;;;;;;;:::i;:::-;8829:19;8852:13;;;;;;8851:14;8876:101;;;;8911:13;:20;;-1:-1:-1;;;;8911:20:0;;;;;8946:19;8927:4;8946:19;;;8876:101;11697:17:::1;11717:12;:10;:12::i;:::-;11740:6;:18:::0;;-1:-1:-1;;;;;;11740:18:0::1;-1:-1:-1::0;;;;;11740:18:0;::::1;::::0;;::::1;::::0;;;11774:43:::1;::::0;11740:18;;-1:-1:-1;11740:18:0;-1:-1:-1;;11774:43:0::1;::::0;-1:-1:-1;;11774:43:0::1;8989:1;9007:14:::0;9003:68;;;9054:5;9038:21;;-1:-1:-1;;9038:21:0;;;11629:196;:::o;36203:96::-;36278:15;;36203:96;:::o;27134:195::-;27237:12;27269:52;27291:6;27299:4;27305:1;27308:12;27269:21;:52::i;:::-;27262:59;27134:195;-1:-1:-1;;;;27134:195:0:o;28186:530::-;28313:12;28371:5;28346:21;:30;;28338:81;;;;-1:-1:-1;;;28338:81:0;;;;;;;:::i;:::-;28438:18;28449:6;28438:10;:18::i;:::-;28430:60;;;;-1:-1:-1;;;28430:60:0;;;;;;;:::i;:::-;28564:12;28578:23;28605:6;-1:-1:-1;;;;;28605:11:0;28625:5;28633:4;28605:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28563:75;;;;28656:52;28674:7;28683:10;28695:12;28656:17;:52::i;:::-;28649:59;28186:530;-1:-1:-1;;;;;;;28186:530:0:o;30726:742::-;30841:12;30870:7;30866:595;;;-1:-1:-1;30901:10:0;30894:17;;30866:595;31015:17;;:21;31011:439;;31278:10;31272:17;31339:15;31326:10;31322:2;31318:19;31311:44;31226:148;31421:12;31414:20;;-1:-1:-1;;;31414:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:692:1:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;193:6;180:20;218:69;233:53;279:6;233:53;:::i;:::-;218:69;:::i;:::-;321:21;;;209:78;-1:-1:-1;361:4:1;381:14;;;;415:15;;;461;;;449:28;;445:37;;442:46;-1:-1:-1;439:2:1;;;501:1;498;491:12;439:2;523:1;533:167;547:6;544:1;541:13;533:167;;;608:17;;596:30;;646:12;;;;678;;;;569:1;562:9;533:167;;;537:3;;;;;84:622;;;;:::o;711:521::-;;808:3;801:4;793:6;789:17;785:27;775:2;;830:5;823;816:20;775:2;874:6;861:20;904:18;896:6;893:30;890:2;;;926:9;890:2;955:58;1001:2;978:17;;-1:-1:-1;;974:31:1;1007:4;970:42;955:58;:::i;:::-;946:67;;1036:6;1029:5;1022:21;1090:3;1083:4;1074:6;1066;1062:19;1058:30;1055:39;1052:2;;;1107:1;1104;1097:12;1052:2;1170:6;1163:4;1155:6;1151:17;1144:4;1137:5;1133:16;1120:57;1224:1;1197:18;;;1217:4;1193:29;1186:40;1201:5;765:467;-1:-1:-1;;765:467:1:o;1237:259::-;;1349:2;1337:9;1328:7;1324:23;1320:32;1317:2;;;1370:6;1362;1355:22;1317:2;1414:9;1401:23;1433:33;1460:5;1433:33;:::i;1501:1456::-;;;;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1718:6;1710;1703:22;1665:2;1762:9;1749:23;1781:33;1808:5;1781:33;:::i;:::-;1833:5;-1:-1:-1;1857:2:1;1895:18;;;1882:32;1933:18;1963:14;;;1960:2;;;1995:6;1987;1980:22;1960:2;2038:6;2027:9;2023:22;2013:32;;2083:7;2076:4;2072:2;2068:13;2064:27;2054:2;;2110:6;2102;2095:22;2054:2;2155;2142:16;2178:69;2193:53;2239:6;2193:53;:::i;2178:69::-;2281:19;;;2316:12;;;;2348:11;;;2386:15;;;2378:24;;2374:33;;2371:46;-1:-1:-1;2368:2:1;;;2435:6;2427;2420:22;2368:2;2462:6;2453:15;;2477:250;2491:6;2488:1;2485:13;2477:250;;;2568:3;2555:17;2585:35;2612:7;2585:35;:::i;:::-;2633:20;;2513:1;2506:9;;;;;2673:12;;;;2705;;2477:250;;;-1:-1:-1;2746:5:1;-1:-1:-1;;;2804:2:1;2789:18;;2776:32;;-1:-1:-1;2820:16:1;;;2817:2;;;2854:6;2846;2839:22;2817:2;;;2882:69;2943:7;2932:8;2921:9;2917:24;2882:69;:::i;:::-;2872:79;;;1655:1302;;;;;:::o;2962:756::-;;;;;;3149:3;3137:9;3128:7;3124:23;3120:33;3117:2;;;3171:6;3163;3156:22;3117:2;3215:9;3202:23;3234:33;3261:5;3234:33;:::i;:::-;3286:5;-1:-1:-1;3342:2:1;3327:18;;3314:32;3369:18;3358:30;;3355:2;;;3406:6;3398;3391:22;3355:2;3434:51;3477:7;3468:6;3457:9;3453:22;3434:51;:::i;:::-;3424:61;;;3532:2;3521:9;3517:18;3504:32;3494:42;;3583:2;3572:9;3568:18;3555:32;3545:42;;3639:3;3628:9;3624:19;3611:33;3653;3678:7;3653:33;:::i;:::-;3705:7;3695:17;;;3107:611;;;;;;;;:::o;3723:327::-;;;3852:2;3840:9;3831:7;3827:23;3823:32;3820:2;;;3873:6;3865;3858:22;3820:2;3917:9;3904:23;3936:33;3963:5;3936:33;:::i;:::-;3988:5;4040:2;4025:18;;;;4012:32;;-1:-1:-1;;;3810:240:1:o;4055:604::-;;;;;;4233:3;4221:9;4212:7;4208:23;4204:33;4201:2;;;4255:6;4247;4240:22;4201:2;4299:9;4286:23;4318:33;4345:5;4318:33;:::i;:::-;4370:5;-1:-1:-1;4422:2:1;4407:18;;4394:32;;-1:-1:-1;4473:2:1;4458:18;;4445:32;;-1:-1:-1;4524:2:1;4509:18;;4496:32;;-1:-1:-1;4580:3:1;4565:19;;4552:33;4594;4552;4594;:::i;4664:395::-;;;;4810:2;4798:9;4789:7;4785:23;4781:32;4778:2;;;4831:6;4823;4816:22;4778:2;4875:9;4862:23;4894:33;4921:5;4894:33;:::i;:::-;4946:5;4998:2;4983:18;;4970:32;;-1:-1:-1;5049:2:1;5034:18;;;5021:32;;4768:291;-1:-1:-1;;;4768:291:1:o;5064:533::-;;;;;;5244:3;5232:9;5223:7;5219:23;5215:33;5212:2;;;5266:6;5258;5251:22;5212:2;5310:9;5297:23;5329:33;5356:5;5329:33;:::i;:::-;5381:5;5433:2;5418:18;;5405:32;;-1:-1:-1;5484:2:1;5469:18;;5456:32;;5535:2;5520:18;;5507:32;;-1:-1:-1;5586:3:1;5571:19;5558:33;;-1:-1:-1;5202:395:1;-1:-1:-1;;;5202:395:1:o;5602:297::-;;5722:2;5710:9;5701:7;5697:23;5693:32;5690:2;;;5743:6;5735;5728:22;5690:2;5780:9;5774:16;5833:5;5826:13;5819:21;5812:5;5809:32;5799:2;;5860:6;5852;5845:22;5904:575;;;6053:2;6041:9;6032:7;6028:23;6024:32;6021:2;;;6074:6;6066;6059:22;6021:2;6119:9;6106:23;6148:18;6189:2;6181:6;6178:14;6175:2;;;6210:6;6202;6195:22;6175:2;6238:51;6281:7;6272:6;6261:9;6257:22;6238:51;:::i;:::-;6228:61;;6342:2;6331:9;6327:18;6314:32;6298:48;;6371:2;6361:8;6358:16;6355:2;;;6392:6;6384;6377:22;6355:2;;6420:53;6465:7;6454:8;6443:9;6439:24;6420:53;:::i;:::-;6410:63;;;6011:468;;;;;:::o;6484:190::-;;6596:2;6584:9;6575:7;6571:23;6567:32;6564:2;;;6617:6;6609;6602:22;6564:2;-1:-1:-1;6645:23:1;;6554:120;-1:-1:-1;6554:120:1:o;6679:403::-;;;;6833:2;6821:9;6812:7;6808:23;6804:32;6801:2;;;6854:6;6846;6839:22;6801:2;6895:9;6882:23;6872:33;;6955:2;6944:9;6940:18;6927:32;6968:33;6995:5;6968:33;:::i;:::-;6791:291;;7020:5;;-1:-1:-1;;;7072:2:1;7057:18;;;;7044:32;;6791:291::o;7087:258::-;;;7216:2;7204:9;7195:7;7191:23;7187:32;7184:2;;;7237:6;7229;7222:22;7184:2;-1:-1:-1;;7265:23:1;;;7335:2;7320:18;;;7307:32;;-1:-1:-1;7174:171:1:o;7350:259::-;;7471:2;7459:9;7450:7;7446:23;7442:32;7439:2;;;7492:6;7484;7477:22;7439:2;7529:9;7523:16;7548:31;7573:5;7548:31;:::i;7614:259::-;;7695:5;7689:12;7722:6;7717:3;7710:19;7738:63;7794:6;7787:4;7782:3;7778:14;7771:4;7764:5;7760:16;7738:63;:::i;:::-;7855:2;7834:15;-1:-1:-1;;7830:29:1;7821:39;;;;7862:4;7817:50;;7665:208;-1:-1:-1;;7665:208:1:o;7878:274::-;;8045:6;8039:13;8061:53;8107:6;8102:3;8095:4;8087:6;8083:17;8061:53;:::i;:::-;8130:16;;;;;8015:137;-1:-1:-1;;8015:137:1:o;8157:415::-;;8352:6;8346:13;8368:53;8414:6;8409:3;8402:4;8394:6;8390:17;8368:53;:::i;:::-;8490:2;8486:15;;;;-1:-1:-1;;8482:53:1;8443:16;;;;8468:68;;;8563:2;8552:14;;8322:250;-1:-1:-1;;8322:250:1:o;8577:380::-;8819:66;8807:79;;8911:2;8902:12;;8895:28;;;;8948:2;8939:12;;8797:160::o;8962:392::-;-1:-1:-1;;;9220:27:1;;9272:1;9263:11;;9256:27;;;;9308:2;9299:12;;9292:28;9345:2;9336:12;;9210:144::o;9359:203::-;-1:-1:-1;;;;;9523:32:1;;;;9505:51;;9493:2;9478:18;;9460:102::o;9567:282::-;-1:-1:-1;;;;;9767:32:1;;;;9749:51;;9831:2;9816:18;;9809:34;9737:2;9722:18;;9704:145::o;9854:616::-;-1:-1:-1;;;;;10213:15:1;;;10195:34;;10260:2;10245:18;;10238:34;;;;10308:15;;;10303:2;10288:18;;10281:43;10360:15;;10355:2;10340:18;;10333:43;10407:3;10392:19;;10385:35;;;;10175:3;10436:19;;10429:35;;;;10144:3;10129:19;;10111:359::o;10475:433::-;-1:-1:-1;;;;;10732:15:1;;;10714:34;;10784:15;;10779:2;10764:18;;10757:43;10836:2;10831;10816:18;;10809:30;;;10475:433;;10856:46;;10883:18;;10875:6;10856:46;:::i;:::-;10848:54;10666:242;-1:-1:-1;;;;;10666:242:1:o;10913:375::-;-1:-1:-1;;;;;11171:15:1;;;11153:34;;11223:15;;;;11218:2;11203:18;;11196:43;11270:2;11255:18;;11248:34;;;;11103:2;11088:18;;11070:218::o;11572:375::-;-1:-1:-1;;;;;11830:15:1;;;11812:34;;11877:2;11862:18;;11855:34;;;;11925:15;;;11920:2;11905:18;;11898:43;11762:2;11747:18;;11729:218::o;11952:635::-;12123:2;12175:21;;;12245:13;;12148:18;;;12267:22;;;11952:635;;12123:2;12346:15;;;;12320:2;12305:18;;;11952:635;12392:169;12406:6;12403:1;12400:13;12392:169;;;12467:13;;12455:26;;12536:15;;;;12501:12;;;;12428:1;12421:9;12392:169;;;-1:-1:-1;12578:3:1;;12103:484;-1:-1:-1;;;;;;12103:484:1:o;12592:489::-;12851:25;;;12907:2;12892:18;;12885:34;;;;12950:2;12935:18;;12928:34;;;;12993:2;12978:18;;12971:34;-1:-1:-1;;;;;13042:32:1;13036:3;13021:19;;13014:61;12838:3;12823:19;;12805:276::o;13086:417::-;13317:25;;;13373:2;13358:18;;13351:34;;;;-1:-1:-1;;;;;13421:32:1;13416:2;13401:18;;13394:60;13485:2;13470:18;;13463:34;13304:3;13289:19;;13271:232::o;13508:398::-;13735:25;;;13808:4;13796:17;;;;13791:2;13776:18;;13769:45;13845:2;13830:18;;13823:34;13888:2;13873:18;;13866:34;13722:3;13707:19;;13689:217::o;13911:219::-;;14058:2;14047:9;14040:21;14078:46;14120:2;14109:9;14105:18;14097:6;14078:46;:::i;14361:351::-;14563:2;14545:21;;;14602:2;14582:18;;;14575:30;14641:29;14636:2;14621:18;;14614:57;14703:2;14688:18;;14535:177::o;14717:402::-;14919:2;14901:21;;;14958:2;14938:18;;;14931:30;14997:34;14992:2;14977:18;;14970:62;-1:-1:-1;;;15063:2:1;15048:18;;15041:36;15109:3;15094:19;;14891:228::o;15124:352::-;15326:2;15308:21;;;15365:2;15345:18;;;15338:30;15404;15399:2;15384:18;;15377:58;15467:2;15452:18;;15298:178::o;15481:425::-;15683:2;15665:21;;;15722:2;15702:18;;;15695:30;15761:34;15756:2;15741:18;;15734:62;15832:31;15827:2;15812:18;;15805:59;15896:3;15881:19;;15655:251::o;15911:347::-;16113:2;16095:21;;;16152:2;16132:18;;;16125:30;16191:25;16186:2;16171:18;;16164:53;16249:2;16234:18;;16085:173::o;16263:351::-;16465:2;16447:21;;;16504:2;16484:18;;;16477:30;16543:29;16538:2;16523:18;;16516:57;16605:2;16590:18;;16437:177::o;16619:347::-;16821:2;16803:21;;;16860:2;16840:18;;;16833:30;16899:25;16894:2;16879:18;;16872:53;16957:2;16942:18;;16793:173::o;16971:343::-;17173:2;17155:21;;;17212:2;17192:18;;;17185:30;-1:-1:-1;;;17246:2:1;17231:18;;17224:49;17305:2;17290:18;;17145:169::o;17319:350::-;17521:2;17503:21;;;17560:2;17540:18;;;17533:30;17599:28;17594:2;17579:18;;17572:56;17660:2;17645:18;;17493:176::o;17674:343::-;17876:2;17858:21;;;17915:2;17895:18;;;17888:30;-1:-1:-1;;;17949:2:1;17934:18;;17927:49;18008:2;17993:18;;17848:169::o;18022:411::-;18224:2;18206:21;;;18263:2;18243:18;;;18236:30;18302:34;18297:2;18282:18;;18275:62;-1:-1:-1;;;18368:2:1;18353:18;;18346:45;18423:3;18408:19;;18196:237::o;18438:402::-;18640:2;18622:21;;;18679:2;18659:18;;;18652:30;18718:34;18713:2;18698:18;;18691:62;-1:-1:-1;;;18784:2:1;18769:18;;18762:36;18830:3;18815:19;;18612:228::o;18845:341::-;19047:2;19029:21;;;19086:2;19066:18;;;19059:30;-1:-1:-1;;;19120:2:1;19105:18;;19098:47;19177:2;19162:18;;19019:167::o;19191:354::-;19393:2;19375:21;;;19432:2;19412:18;;;19405:30;19471:32;19466:2;19451:18;;19444:60;19536:2;19521:18;;19365:180::o;19550:402::-;19752:2;19734:21;;;19791:2;19771:18;;;19764:30;19830:34;19825:2;19810:18;;19803:62;-1:-1:-1;;;19896:2:1;19881:18;;19874:36;19942:3;19927:19;;19724:228::o;19957:350::-;20159:2;20141:21;;;20198:2;20178:18;;;20171:30;20237:28;20232:2;20217:18;;20210:56;20298:2;20283:18;;20131:176::o;20312:352::-;20514:2;20496:21;;;20553:2;20533:18;;;20526:30;20592;20587:2;20572:18;;20565:58;20655:2;20640:18;;20486:178::o;21072:349::-;21274:2;21256:21;;;21313:2;21293:18;;;21286:30;21352:27;21347:2;21332:18;;21325:55;21412:2;21397:18;;21246:175::o;21426:341::-;21628:2;21610:21;;;21667:2;21647:18;;;21640:30;-1:-1:-1;;;21701:2:1;21686:18;;21679:47;21758:2;21743:18;;21600:167::o;21772:408::-;21974:2;21956:21;;;22013:2;21993:18;;;21986:30;22052:34;22047:2;22032:18;;22025:62;-1:-1:-1;;;22118:2:1;22103:18;;22096:42;22170:3;22155:19;;21946:234::o;22185:400::-;22387:2;22369:21;;;22426:2;22406:18;;;22399:30;22465:34;22460:2;22445:18;;22438:62;-1:-1:-1;;;22531:2:1;22516:18;;22509:34;22575:3;22560:19;;22359:226::o;22590:353::-;22792:2;22774:21;;;22831:2;22811:18;;;22804:30;22870:31;22865:2;22850:18;;22843:59;22934:2;22919:18;;22764:179::o;22948:410::-;23150:2;23132:21;;;23189:2;23169:18;;;23162:30;23228:34;23223:2;23208:18;;23201:62;-1:-1:-1;;;23294:2:1;23279:18;;23272:44;23348:3;23333:19;;23122:236::o;23363:401::-;23565:2;23547:21;;;23604:2;23584:18;;;23577:30;23643:34;23638:2;23623:18;;23616:62;-1:-1:-1;;;23709:2:1;23694:18;;23687:35;23754:3;23739:19;;23537:227::o;23769:353::-;23971:2;23953:21;;;24010:2;23990:18;;;23983:30;24049:31;24044:2;24029:18;;24022:59;24113:2;24098:18;;23943:179::o;24127:397::-;24329:2;24311:21;;;24368:2;24348:18;;;24341:30;24407:34;24402:2;24387:18;;24380:62;-1:-1:-1;;;24473:2:1;24458:18;;24451:31;24514:3;24499:19;;24301:223::o;24529:356::-;24731:2;24713:21;;;24750:18;;;24743:30;24809:34;24804:2;24789:18;;24782:62;24876:2;24861:18;;24703:182::o;24890:348::-;25092:2;25074:21;;;25131:2;25111:18;;;25104:30;25170:26;25165:2;25150:18;;25143:54;25229:2;25214:18;;25064:174::o;25243:397::-;25445:2;25427:21;;;25484:2;25464:18;;;25457:30;25523:34;25518:2;25503:18;;25496:62;-1:-1:-1;;;25589:2:1;25574:18;;25567:31;25630:3;25615:19;;25417:223::o;25645:355::-;25847:2;25829:21;;;25886:2;25866:18;;;25859:30;25925:33;25920:2;25905:18;;25898:61;25991:2;25976:18;;25819:181::o;26005:397::-;26207:2;26189:21;;;26246:2;26226:18;;;26219:30;26285:34;26280:2;26265:18;;26258:62;-1:-1:-1;;;26351:2:1;26336:18;;26329:31;26392:3;26377:19;;26179:223::o;26407:353::-;26609:2;26591:21;;;26648:2;26628:18;;;26621:30;26687:31;26682:2;26667:18;;26660:59;26751:2;26736:18;;26581:179::o;26765:406::-;26967:2;26949:21;;;27006:2;26986:18;;;26979:30;27045:34;27040:2;27025:18;;27018:62;-1:-1:-1;;;27111:2:1;27096:18;;27089:40;27161:3;27146:19;;26939:232::o;27176:339::-;27378:2;27360:21;;;27417:2;27397:18;;;27390:30;-1:-1:-1;;;27451:2:1;27436:18;;27429:45;27506:2;27491:18;;27350:165::o;27520:353::-;27722:2;27704:21;;;27761:2;27741:18;;;27734:30;27800:31;27795:2;27780:18;;27773:59;27864:2;27849:18;;27694:179::o;27878:356::-;28080:2;28062:21;;;28099:18;;;28092:30;28158:34;28153:2;28138:18;;28131:62;28225:2;28210:18;;28052:182::o;28239:177::-;28385:25;;;28373:2;28358:18;;28340:76::o;28421:591::-;28708:25;;;-1:-1:-1;;;;;28807:15:1;;;28802:2;28787:18;;28780:43;28859:15;;;;28854:2;28839:18;;28832:43;28906:2;28891:18;;28884:34;28949:3;28934:19;;28927:35;;;;28760:3;28978:19;;28971:35;28695:3;28680:19;;28662:350::o;29017:735::-;29360:25;;;-1:-1:-1;;;;;29459:15:1;;;29454:2;29439:18;;29432:43;29511:15;;;;29506:2;29491:18;;29484:43;29558:2;29543:18;;29536:34;;;;29601:3;29586:19;;29579:35;29412:3;29630:19;;29623:35;29689:3;29674:19;;29667:35;;;;29733:3;29718:19;;29711:35;29347:3;29332:19;;29314:438::o;29757:417::-;29988:25;;;-1:-1:-1;;;;;30049:32:1;;;;30044:2;30029:18;;30022:60;30113:2;30098:18;;30091:34;30156:2;30141:18;;30134:34;29975:3;29960:19;;29942:232::o;30179:248::-;30353:25;;;30409:2;30394:18;;30387:34;30341:2;30326:18;;30308:119::o;30432:242::-;30502:2;30496:9;30532:17;;;30579:18;30564:34;;30600:22;;;30561:62;30558:2;;;30626:9;30558:2;30653;30646:22;30476:198;;-1:-1:-1;30476:198:1:o;30679:183::-;;30778:18;30770:6;30767:30;30764:2;;;30800:9;30764:2;-1:-1:-1;30851:4:1;30832:17;;;30828:28;;30754:108::o;30867:258::-;30939:1;30949:113;30963:6;30960:1;30957:13;30949:113;;;31039:11;;;31033:18;31020:11;;;31013:39;30985:2;30978:10;30949:113;;;31080:6;31077:1;31074:13;31071:2;;;-1:-1:-1;;31115:1:1;31097:16;;31090:27;30920:205::o;31130:133::-;-1:-1:-1;;;;;31207:31:1;;31197:42;;31187:2;;31253:1;31250;31243:12;31268:116;31354:4;31347:5;31343:16;31336:5;31333:27;31323:2;;31374:1;31371;31364:12
Swarm Source
ipfs://365ce12842d013ab3f7d3347c6cf8a895b3c41269e47437e67fa357d992c8b1d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.