More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 292,700 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Zap In Token | 18772258 | 24 mins ago | IN | 0 CRO | 0.99633596 | ||||
Zap In Token | 18772026 | 46 mins ago | IN | 0 CRO | 0.983932 | ||||
Zap In | 18771717 | 1 hr ago | IN | 224.35543673 CRO | 1.19135467 | ||||
Zap In Token | 18771319 | 1 hr ago | IN | 0 CRO | 1.64499003 | ||||
Zap In Token | 18771259 | 1 hr ago | IN | 0 CRO | 1.24061645 | ||||
Zap In Token | 18771258 | 1 hr ago | IN | 0 CRO | 1.10147696 | ||||
Zap In Token | 18771238 | 2 hrs ago | IN | 0 CRO | 1.09615175 | ||||
Zap In Token | 18771152 | 2 hrs ago | IN | 0 CRO | 1.03661981 | ||||
Zap In | 18771080 | 2 hrs ago | IN | 6,870.491163 CRO | 1.2397644 | ||||
Zap In Token | 18770887 | 2 hrs ago | IN | 0 CRO | 2.35147505 | ||||
Zap In Token | 18770875 | 2 hrs ago | IN | 0 CRO | 1.65221544 | ||||
Zap In Token | 18770866 | 2 hrs ago | IN | 0 CRO | 1.52351808 | ||||
Zap In Token | 18770684 | 2 hrs ago | IN | 0 CRO | 1.43983706 | ||||
Zap In | 18770680 | 2 hrs ago | IN | 160 CRO | 0.97638341 | ||||
Zap In Token | 18770677 | 2 hrs ago | IN | 0 CRO | 1.1027988 | ||||
Zap In | 18770619 | 2 hrs ago | IN | 150 CRO | 1.53003448 | ||||
Zap In Token | 18770557 | 3 hrs ago | IN | 0 CRO | 1.2294466 | ||||
Zap In Token | 18770549 | 3 hrs ago | IN | 0 CRO | 1.52254091 | ||||
Zap In Token | 18770545 | 3 hrs ago | IN | 0 CRO | 1.14296523 | ||||
Zap In | 18770234 | 3 hrs ago | IN | 1,000.171969 CRO | 0.92443785 | ||||
Zap In Token | 18770217 | 3 hrs ago | IN | 0 CRO | 2.84193168 | ||||
Zap In Token | 18770130 | 3 hrs ago | IN | 0 CRO | 1.52351808 | ||||
Zap In Token | 18770093 | 3 hrs ago | IN | 0 CRO | 1.49450394 | ||||
Zap In | 18769954 | 4 hrs ago | IN | 250 CRO | 1.50207136 | ||||
Zap In Token | 18769912 | 4 hrs ago | IN | 0 CRO | 1.58621068 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18771717 | 1 hr ago | 224.35543673 CRO | ||||
18771080 | 2 hrs ago | 6,870.491163 CRO | ||||
18770680 | 2 hrs ago | 160 CRO | ||||
18770619 | 2 hrs ago | 150 CRO | ||||
18770234 | 3 hrs ago | 1,000.171969 CRO | ||||
18769954 | 4 hrs ago | 250 CRO | ||||
18769722 | 4 hrs ago | 300 CRO | ||||
18769613 | 4 hrs ago | 237.87055467 CRO | ||||
18769599 | 4 hrs ago | 318.25056238 CRO | ||||
18769568 | 4 hrs ago | 22,553.12931331 CRO | ||||
18769432 | 4 hrs ago | 38 CRO | ||||
18768724 | 5 hrs ago | 45,000 CRO | ||||
18768274 | 6 hrs ago | 45,000 CRO | ||||
18767908 | 7 hrs ago | 50,000 CRO | ||||
18767813 | 7 hrs ago | 300 CRO | ||||
18767730 | 7 hrs ago | 50,000 CRO | ||||
18767565 | 7 hrs ago | 101.51573129 CRO | ||||
18766698 | 9 hrs ago | 1,450 CRO | ||||
18766636 | 9 hrs ago | 150 CRO | ||||
18766208 | 9 hrs ago | 8,100.713736 CRO | ||||
18765706 | 10 hrs ago | 10,025.4676419 CRO | ||||
18765681 | 10 hrs ago | 40,105.58858212 CRO | ||||
18765654 | 10 hrs ago | 3,031.49404014 CRO | ||||
18765273 | 11 hrs ago | 3,770 CRO | ||||
18765102 | 11 hrs ago | 43 CRO |
Loading...
Loading
Contract Name:
VVSZap
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-03-14 */ // ██████ ██⌐ ▐██ ██▌ ╓██Γ // ╟██,╟██ ╟██ ██▌ ╙█████ // ███▀██▌ ██▌ ]██⌐ ╟██▀ // ]██████▌ ███▓██▌ ██▌ // └└└└└ ╙╙╙└ ╙└ // ▐████████]██⌐ ╟██ ╟█████▌ // ██▌ ╟██,,██▌ ██▌▄▄, ]██████████████████████████████████████ ,▄▄██████▄▄▄ // j██> ███▀███ ▐██▀▀▀" ╓██▀▀╙` └╙▀▀██▄ // ╟██ ▐██ ╫█▌ ██████▌ ███████████████████████████ ╓███▄,, ╙██ // á█▌ └╙╙╙▀▀▀▀███▄▄▄▄,, ██ ,,, // ▄▄▄▄▄▄ ▄▄ε ▄▄▄▄▄▄ ]██ ╟█▌ ▐█▀▀▀▀▀████▄▄▄,, └╙╙╙▀▀███╙╟█ // ▐██╙╙██▌]██>]██▀╙██▌ ╟█▌ ██⌐ ]██▀▀███████▄▄▄▄╠╠╙▀▀▀▀███▄██▌ ╟▌ // ██▌ ]██ ╟██ ╟██████ ██ ]█▌ ██▄▄▄╓,, └╙╙╙▀▀▀███████▄██ █µ // ]██▄▄██▌ ██▌ ██▌╙╙` ╓▄▄ ▄▄µ ,▄██▀╙╙▀▀▀███████▄▄▄╓,, ╙██▀▀╙ // ╙▀▀▀▀▀└ "▀▀ "▀▀ ╙▀▀ ▀▀¬ ,▄██▀╙ ▐█└└╙╠███████▀└ // ,▄██▀▀` ╟▌ █████ ▄██▄▄▄▄, // ,▄███▀└ ╙█▄╓▄╣██▌ ███▌''└╙╠██▄ // ╓███▀└ á█▀╙╙╙╙██▀▀██ ███▌ ╔████▀ // ╓▄██▀╙ ╟█ ╙██▄▄█⌐ ███▄▄╓▄███▀ // "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀████▀╙ ╓▄██████▄, ]████▄▄▄▄██▀▄▄██▀╙└▀████ // ,▄███▀, ╓██╙ .╠█▌ ▐█▒ ███▌╟█⌐╔█▌└╟██▄▄█▌╙█▌ // ]████████████████ ▄██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀██▌ `██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀███`╙▀█▀ ╫█ ╔█▀██╙` ▐█▌ // j█▌ "█▌ ╓██╙ ██ ╙███▌ ██▄ ╓██ // █▌ ▀██████▀╙ ╓█▌ ╫██▄▄▄╟███▀ // ╙▀███████████████████████████████████████████████▀▀ └╙╙▀▀ // ]█▌ █▌ ▐█▌ å█▀ // ]█▌ ██████████████████████████████████▌ ▐█▌ // ]█▌ █▌ ██ ]█▌ // ]█▌ █▌ ▓█¬ ]██ // ]█▌ ██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀██▌ ██ // ,▄▄▄▄, ]█▌ j██▄█▄▄, ,▄▄▓▓▄▄▐█▌ ╫█⌐ // ██▀╙╙╙╙▀██ ]█▌,██▀██▄██▀█▄╓╓╓╓╓╓╓╓╓╓╓▄██████████▄ ▐█▀ // ▓█ ▀▀▀██▄ ]████▓█└ ╙█╬██╙╙╙╙╙╙╙╙╙╟█▒█▀` '▀█╟█▄▐█▌ // ▄█▀▀ ╙██▄, ]███▒█ ╟█╟████████████╟▌ █▌███▌ // ██, ,,,╓╠█████ `██╟█▄ ,▄█╬█▌ ╚█▒██, ,██▓█╜ // ╙▀▀▀▀███▄▄▄███▀▀▀▀▀▀▀▀╙└ ▀█████████▀ ╙██████████└ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/security/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^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 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/libraries/Math.sol pragma solidity >=0.8.0; // a library for performing various math operations library Math { function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File @vvs-finance/vvs-swap-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IVVSPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File @vvs-finance/vvs-swap-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IVVSFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File @vvs-finance/vvs-swap-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IVVSRouter01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File @vvs-finance/vvs-swap-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IVVSRouter02 is IVVSRouter01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File @vvs-finance/vvs-swap-periphery/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IWCRO { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function deposit() external payable; function withdraw(uint) external; } // File contracts/VVSZap.sol pragma solidity >=0.8.0; contract VVSZap is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; /* ========== CONSTANT VARIABLES ========== */ address public immutable WCRO; IVVSRouter02 public immutable ROUTER; IVVSFactory public immutable FACTORY; uint256 public lastFetchedPairIndex; /* ========== STATE VARIABLES ========== */ mapping(address => bool) public liquidityPools; mapping(address => uint256) public tokens; address[] public tokenList; mapping(address => uint256) public intermediateTokens; address[] public intermediateTokenList; mapping(address => mapping(address => address[])) public presetPaths; /* ========== EVENT ========== */ event ZapIn(address indexed to, uint256 amount, uint256 outputAmount); event ZapInToken(address indexed from, address indexed to, uint256 amount, uint256 outputAmount); event ZapOut(address indexed from, address indexed to, uint256 amount, uint256 outputAmount); event SwapExactTokensForTokens(address[] paths, uint256[] amounts); event FetchLiquidityPoolsFromFactory(uint256 startFromPairIndex, uint256 endAtPairIndex); event AddLiquidityPool(address indexed liquidityPool, bool isFromFactory); event AddToken(address indexed token, bool isFromFactory); event AddIntermediateToken(address indexed intermediateToken); event RemoveLiquidityPool(address indexed liquidityPool); event RemoveToken(address indexed token); event RemoveIntermediateToken(address indexed intermediateToken); event SetPresetPath(address indexed fromToken, address indexed toToken, address[] paths, bool isAutoGenerated); event RemovePresetPath(address indexed fromToken, address indexed toToken); /* ========== INITIALIZER ========== */ constructor(address _wcro, address _router) { WCRO = _wcro; ROUTER = IVVSRouter02(_router); FACTORY = IVVSFactory(ROUTER.factory()); _addToken(WCRO, false); _addIntermediateToken(WCRO); } receive() external payable {} /* ========== External Functions ========== */ /// @notice swap ERC20 Token to ERC20 Token or LP function zapInToken( address _fromToken, uint256 _inputAmount, address _toTokenOrLp, uint256 _outputAmountMin ) external nonReentrant returns (uint256) { require(isToken(_fromToken), "VVSZap:zapInToken: given fromToken is not token"); require(isToken(_toTokenOrLp) || isLP(_toTokenOrLp), "VVSZap:zapInToken: given toTokenOrLp is not token or LP"); require(_inputAmount > 0, "VVSZap:zapInToken: given amount should > 0"); IERC20(_fromToken).safeTransferFrom(msg.sender, address(this), _inputAmount); uint256 outputAmount = _zapInFromToken(_fromToken, _inputAmount, _toTokenOrLp, msg.sender); require(outputAmount >= _outputAmountMin, "VVSZap:zapInToken: output amount less than expected"); emit ZapInToken(_fromToken, _toTokenOrLp, _inputAmount, outputAmount); return outputAmount; } /// @notice swap CRO to ERC20 Token or LP, CRO will wrap into WCRO before the rest of action /// @param _outputAmountMin: minimum amount expected to received , can estimate by /// @return outputAmount: amount of target Token or LP which user will received /// @dev estimateZapInToLpSwapPaths if output is LP /// @dev estimateZapTokenToTokenAmountsOut if output is token function zapIn(address _toTokenOrLp, uint256 _outputAmountMin) external payable nonReentrant returns (uint256) { require(msg.value > 0, "VVSZap:zapIn: given amount should > 0"); IWCRO(WCRO).deposit{value: msg.value}(); require(isToken(_toTokenOrLp) || isLP(_toTokenOrLp), "VVSZap:zapIn: given toTokenOrLp is not token or LP"); uint256 outputAmount = _zapInFromToken(WCRO, msg.value, _toTokenOrLp, msg.sender); require(outputAmount >= _outputAmountMin, "VVSZap:zapIn: output amount less than expected"); emit ZapIn(_toTokenOrLp, msg.value, outputAmount); return outputAmount; } /// @notice break LP into token , and swap to target Token or stake as another LP function zapOut( address _fromLp, uint256 _inputAmount, address _toTokenOrLp, uint256 _outputAmountMin ) external payable nonReentrant returns (uint256) { require(isLP(_fromLp), "VVSZap:zapOut: should zap out from LP Address"); require(_fromLp != _toTokenOrLp, "VVSZap:zapOut: input = output"); require(_inputAmount > 0, "VVSZap:zapOut: given amount should > 0"); IERC20(_fromLp).safeTransferFrom(msg.sender, address(this), _inputAmount); _approveTokenIfNeeded(_fromLp); uint256 outputAmount; if (isLP(_toTokenOrLp)) { uint256 removedAmount = _removeLiquidityToToken(_fromLp, _inputAmount, WCRO, address(this)); outputAmount = _zapInFromToken(WCRO, removedAmount, _toTokenOrLp, msg.sender); } else if (isToken(_toTokenOrLp)) { outputAmount = _removeLiquidityToToken(_fromLp, _inputAmount, _toTokenOrLp, msg.sender); } else if (_toTokenOrLp == address(0)) { // handle native CRO outputAmount = _removeLiquidityToToken(_fromLp, _inputAmount, WCRO, address(this)); IWCRO(WCRO).withdraw(outputAmount); (bool sent, ) = payable(msg.sender).call{value: outputAmount}(""); require(sent, "Failed to send Ether"); } else { revert("VVSZap:zapOut: should zap out to Token or LP Address"); } require(outputAmount >= _outputAmountMin, "VVSZap:zapIn: output amount less than expected"); emit ZapOut(_fromLp, _toTokenOrLp, _inputAmount, outputAmount); return outputAmount; } /* ========== View Functions ========== */ function getLiquidityPoolAddress(address _tokenA, address _tokenB) public view returns (address) { return FACTORY.getPair(_tokenA, _tokenB); } function isLiquidityPoolExistInFactory(address _tokenA, address _tokenB) public view returns (bool) { return getLiquidityPoolAddress(_tokenA, _tokenB) != address(0); } function isLP(address _address) public view returns (bool) { return liquidityPools[_address] == true; } function isToken(address _address) public view returns (bool) { return !(tokens[_address] == 0); } function getToken(uint256 i) public view returns (address) { return tokenList[i]; } function getTokenListLength() public view returns (uint256) { return tokenList.length; } function getIntermediateToken(uint256 _i) public view returns (address) { return intermediateTokenList[_i]; } function getIntermediateTokenListLength() public view returns (uint256) { return intermediateTokenList.length; } /// @notice For complicated / special target , can preset path for swapping for gas saving function getPresetPath(address _tokenA, address _tokenB) public view returns (address[] memory) { return presetPaths[_tokenA][_tokenB]; } /// @notice For estimate zapIn (Token -> Token) path, including preset path & auto calculated path /// if preset path exist , preset path will be taken instead of auto calculated path function getPathForTokenToToken(address _fromToken, address _toToken) external view returns (address[] memory) { return _getPathForTokenToToken(_fromToken, _toToken); } /// @notice For checking zapIn (Token -> Token) AUTO-CALCULATED path , in order to allow estimate output amount /// fromToken -> IntermediateToken (if any) -> toToken function getAutoCalculatedPathWithIntermediateTokenForTokenToToken(address _fromToken, address _toToken) external view returns (address[] memory) { return _autoCalculatedPathWithIntermediateTokenForTokenToToken(_fromToken, _toToken); } /// @notice For estimate zapIn path , in order to allow estimate output amount /// fromToken -> IntermediateToken (if any) -> token 0 & token 1 in LP -> LP function getSuitableIntermediateTokenForTokenToLP(address _fromToken, address _toLP) external view returns (address) { return _getSuitableIntermediateToken(_fromToken, _toLP); } /* ========== Update Functions ========== */ /// @notice Open for public to call if when this contract's token & LP is outdated from factory /// only missing token and LP will be fetched according to lastFetchedPairIndex /// automatically fetch from last fetched index and with interval as 8 function fetchLiquidityPoolsFromFactory() public { if (lastFetchedPairIndex < FACTORY.allPairsLength() - 1) { fetchLiquidityPoolsFromFactoryWithIndex(lastFetchedPairIndex, 8); } } /// @param _startFromPairIndex FACTORY.allPairs(i) 's index /// @param _interval number of LP going to be fetched starting from _startFromPairIndex function fetchLiquidityPoolsFromFactoryWithIndex(uint256 _startFromPairIndex, uint256 _interval) public { uint256 factoryPairLength = FACTORY.allPairsLength(); require( _startFromPairIndex < factoryPairLength, "VVSZap:fetchLiquidityPoolsFromFactoryWithIndex: _startFromPairIndex should < factoryPairLength" ); uint256 endAtPairIndex = _startFromPairIndex + _interval; if (endAtPairIndex > factoryPairLength) { endAtPairIndex = factoryPairLength; } for (uint256 i = _startFromPairIndex; i < endAtPairIndex; i++) { _addLiquidityPool(FACTORY.allPairs(i), true); } emit FetchLiquidityPoolsFromFactory(_startFromPairIndex, endAtPairIndex - 1); if (lastFetchedPairIndex < endAtPairIndex - 1) { lastFetchedPairIndex = endAtPairIndex - 1; } } /* ========== Private Functions ========== */ function _removeLiquidityToToken( address _lp, uint256 _amount, address _toToken, address _receiver ) private returns (uint256) { require(isLP(_lp), "VVSZap:_removeLiquidityToToken: _lp is Non LP Address"); IVVSPair pair = IVVSPair(_lp); address token0 = pair.token0(); address token1 = pair.token1(); (uint256 token0Amount, uint256 token1Amount) = ROUTER.removeLiquidity( token0, token1, _amount, 0, 0, address(this), block.timestamp ); uint256 outputAmount = ( (token0 == _toToken) ? token0Amount : _swapTokenToToken(token0, token0Amount, _toToken, address(this)) ) + ((token1 == _toToken) ? token1Amount : _swapTokenToToken(token1, token1Amount, _toToken, address(this))); IERC20(_toToken).safeTransfer(_receiver, outputAmount); return outputAmount; } function _zapInFromToken( address _from, uint256 _amount, address _to, address _receiver ) private returns (uint256) { _approveTokenIfNeeded(_from); if (isLP(_to)) { return _swapTokenToLP(_from, _amount, _to, _receiver); } else { return _swapTokenToToken(_from, _amount, _to, _receiver); } } function _approveTokenIfNeeded(address token) private { if (IERC20(token).allowance(address(this), address(ROUTER)) == 0) { IERC20(token).safeApprove(address(ROUTER), type(uint256).max); } } function _swapTokenToLP( address _fromToken, uint256 _fromTokenAmount, address _lp, address _receiver ) private returns (uint256) { require(isLP(_lp), "VVSZap:_swapTokenToLP: _lp is Non LP Address"); (address token0, uint256 token0Amount, address token1, uint256 token1Amount) = _swapTokenToTokenPairForLP( _fromToken, _fromTokenAmount, _lp ); _approveTokenIfNeeded(token0); _approveTokenIfNeeded(token1); return _addLiquidityAndReturnRemainingToUser(token0, token1, token0Amount, token1Amount, _receiver); } function _addLiquidityAndReturnRemainingToUser( address token0, address token1, uint256 token0Amount, uint256 token1Amount, address _receiver ) private returns (uint256) { (uint256 amountA, uint256 amountB, uint256 liquidity) = ROUTER.addLiquidity( token0, token1, token0Amount, token1Amount, 0, 0, _receiver, block.timestamp ); if (token0Amount - amountA > 0) { IERC20(token0).transfer(_receiver, token0Amount - amountA); } if (token1Amount - amountB > 0) { IERC20(token1).transfer(_receiver, token1Amount - amountB); } return liquidity; } function _swapTokenToTokenPairForLP( address _fromToken, uint256 _fromTokenAmount, address _lp ) private returns ( address, uint256, address, uint256 ) { IVVSPair pair = IVVSPair(_lp); address token0 = pair.token0(); address token1 = pair.token1(); uint256 token0Amount; uint256 token1Amount; if (_fromToken == token0) { token0Amount = _fromTokenAmount / 2; token1Amount = _swapTokenToToken(_fromToken, _fromTokenAmount - token0Amount, token1, address(this)); } else if (_fromToken == token1) { token1Amount = _fromTokenAmount / 2; token0Amount = _swapTokenToToken(_fromToken, _fromTokenAmount - token1Amount, token0, address(this)); } else { address intermediateToken = _getSuitableIntermediateToken(_fromToken, _lp); uint256 intermediateTokenAmount = _fromToken == intermediateToken ? _fromTokenAmount : _swapTokenToToken(_fromToken, _fromTokenAmount, intermediateToken, address(this)); uint256 intermediateTokenAmountForToken0 = intermediateTokenAmount / 2; uint256 intermediateTokenAmountForToken1 = intermediateTokenAmount - intermediateTokenAmountForToken0; token0Amount = token0 == intermediateToken ? intermediateTokenAmountForToken0 : _swapTokenToToken(intermediateToken, intermediateTokenAmountForToken0, token0, address(this)); token1Amount = token1 == intermediateToken ? intermediateTokenAmountForToken1 : _swapTokenToToken(intermediateToken, intermediateTokenAmountForToken1, token1, address(this)); } return (token0, token0Amount, token1, token1Amount); } function _swapTokenToToken( address _fromToken, uint256 _fromAmount, address _toToken, address _receiver ) private returns (uint256) { address[] memory path = _getPathForTokenToToken(_fromToken, _toToken); _approveTokenIfNeeded(_fromToken); uint256[] memory amounts = ROUTER.swapExactTokensForTokens(_fromAmount, 0, path, _receiver, block.timestamp); require(amounts[amounts.length - 1] > 0, "VVSZap:_swapTokenToToken: output amounts invalid - 0 amoount"); emit SwapExactTokensForTokens(path, amounts); return amounts[amounts.length - 1]; } function _getPathForTokenToToken(address _fromToken, address _toToken) private view returns (address[] memory) { address[] memory path; require(_fromToken != _toToken, "VVSZap:_swapTokenToToken: Not Allow fromToken == toToken"); if (isLiquidityPoolExistInFactory(_fromToken, _toToken)) { path = new address[](2); path[0] = _fromToken; path[1] = _toToken; } else { path = getPresetPath(_fromToken, _toToken); if (path.length == 0) { path = _autoCalculatedPathWithIntermediateTokenForTokenToToken(_fromToken, _toToken); } } require(path.length > 0, "VVSZap:_getPathForTokenToToken: Does not support this route"); return path; } function _getSuitableIntermediateToken(address _fromToken, address _toLp) private view returns (address) { IVVSPair pair = IVVSPair(_toLp); address token0 = pair.token0(); address token1 = pair.token1(); // IntermediateToken is not necessary, returns _fromToken if (_fromToken == token0 || _fromToken == token1) { return _fromToken; } if (intermediateTokens[token0] > 0) { if ( intermediateTokens[token1] > 0 && !isLiquidityPoolExistInFactory(_fromToken, token0) && isLiquidityPoolExistInFactory(_fromToken, token1) ) { // when both token0 & token1 can be intermediateToken, do comparison return token1; } return token0; } if (intermediateTokens[token1] > 0) { return token1; } if ( intermediateTokens[_fromToken] > 0 && isLiquidityPoolExistInFactory(_fromToken, token0) && isLiquidityPoolExistInFactory(_fromToken, token1) ) { return _fromToken; } address bestIntermediateToken; for (uint256 i = 0; i < intermediateTokenList.length; i++) { address intermediateToken = intermediateTokenList[i]; if ( isLiquidityPoolExistInFactory(intermediateToken, token0) && isLiquidityPoolExistInFactory(intermediateToken, token1) ) { if (isLiquidityPoolExistInFactory(_fromToken, intermediateToken)) { return intermediateToken; } if (intermediateToken != address(0)) { bestIntermediateToken = intermediateToken; } } } if (bestIntermediateToken != address(0)) { return bestIntermediateToken; } revert("VVSZap:_getSuitableIntermediateToken: Does not support this route"); } function _autoCalculatedPathWithIntermediateTokenForTokenToToken(address _fromToken, address _toToken) private view returns (address[] memory) { address[] memory path; for (uint256 i = 0; i < intermediateTokenList.length; i++) { address intermediateToken = intermediateTokenList[i]; if ( _fromToken != intermediateToken && _toToken != intermediateToken && isLiquidityPoolExistInFactory(_fromToken, intermediateToken) && isLiquidityPoolExistInFactory(intermediateToken, _toToken) ) { path = new address[](3); path[0] = _fromToken; path[1] = intermediateToken; path[2] = _toToken; break; } } return path; } /* ========== RESTRICTED FUNCTIONS ========== */ function addToken(address _tokenAddress) external onlyOwner { require(tokens[_tokenAddress] == 0, "VVSZap:addToken: _tokenAddress is already in token list"); _addToken(_tokenAddress, false); } function _addToken(address _tokenAddress, bool _isFromFactory) private { require(_tokenAddress != address(0), "Zap:_addToken: _tokenAddress should not be zero"); require(isLP(_tokenAddress) == false, "VVSZap:_addToken: _tokenAddress is LP"); tokenList.push(_tokenAddress); tokens[_tokenAddress] = tokenList.length; emit AddToken(_tokenAddress, _isFromFactory); } function removeToken(address _tokenAddress) external onlyOwner { uint256 tokenListIndex = tokens[_tokenAddress] - 1; delete tokens[_tokenAddress]; if (tokenListIndex != tokenList.length - 1) { address lastTokenInList = tokenList[tokenList.length - 1]; tokenList[tokenListIndex] = lastTokenInList; tokens[lastTokenInList] = tokenListIndex + 1; } tokenList.pop(); emit RemoveToken(_tokenAddress); } function addIntermediateToken(address _tokenAddress) public onlyOwner { require( intermediateTokens[_tokenAddress] == 0, "VVSZap:addIntermediateToken: _tokenAddress is already in token list" ); _addIntermediateToken(_tokenAddress); } function _addIntermediateToken(address _tokenAddress) private { require(_tokenAddress != address(0), "Zap:_addIntermediateToken: _tokenAddress should not be zero"); require(isLP(_tokenAddress) == false, "VVSZap:_addIntermediateToken: _tokenAddress is LP"); intermediateTokenList.push(_tokenAddress); intermediateTokens[_tokenAddress] = intermediateTokenList.length; emit AddIntermediateToken(_tokenAddress); } function removeIntermediateToken(address _intermediateTokenAddress) external onlyOwner { uint256 intermediateTokenListIndex = intermediateTokens[_intermediateTokenAddress] - 1; delete intermediateTokens[_intermediateTokenAddress]; if (intermediateTokenListIndex != intermediateTokenList.length - 1) { address lastIntermediateTokenInList = intermediateTokenList[intermediateTokenList.length - 1]; intermediateTokenList[intermediateTokenListIndex] = lastIntermediateTokenInList; intermediateTokens[lastIntermediateTokenInList] = intermediateTokenListIndex + 1; } intermediateTokenList.pop(); emit RemoveIntermediateToken(_intermediateTokenAddress); } function setPresetPath( address _tokenA, address _tokenB, address[] memory _path ) external onlyOwner { _setPresetPath(_tokenA, _tokenB, _path, false); } function setPresetPathByAutoCalculation(address _tokenA, address _tokenB) external onlyOwner { _setPresetPath( _tokenA, _tokenB, _autoCalculatedPathWithIntermediateTokenForTokenToToken(_tokenA, _tokenB), true ); } function removePresetPath(address tokenA, address tokenB) external onlyOwner { delete presetPaths[tokenA][tokenB]; emit RemovePresetPath(tokenA, tokenB); } function _setPresetPath( address _tokenA, address _tokenB, address[] memory _path, bool _isAutoGenerated ) private { presetPaths[_tokenA][_tokenB] = _path; emit SetPresetPath(_tokenA, _tokenB, _path, _isAutoGenerated); } function addLiquidityPool(address _lpAddress) external onlyOwner { _addLiquidityPool(_lpAddress, false); } function removeLiquidityPool(address _lpAddress) external onlyOwner { liquidityPools[_lpAddress] = false; emit RemoveLiquidityPool(_lpAddress); } function _addLiquidityPool(address _lpAddress, bool _isFromFactory) private { require(_lpAddress != address(0), "Zap:_addLiquidityPool: _lpAddress should not be zero"); if (!liquidityPools[_lpAddress]) { IVVSPair pair = IVVSPair(_lpAddress); address token0 = pair.token0(); address token1 = pair.token1(); if (!isToken(token0)) { _addToken(token0, true); } if (!isToken(token1)) { _addToken(token1, true); } liquidityPools[_lpAddress] = true; emit AddLiquidityPool(_lpAddress, _isFromFactory); } } /* ========== RESTRICTED FUNCTIONS FOR MISDEPOSIT ========== */ function withdrawBalance(address _token, uint256 _amount) public payable onlyOwner { if (_token == address(0)) { uint256 balance = address(this).balance; if (balance > 0) { if (_amount == 0) { (bool sent, ) = payable(msg.sender).call{value: balance}(""); require(sent, "Failed to send Ether"); } else { (bool sent, ) = payable(msg.sender).call{value: _amount}(""); require(sent, "Failed to send Ether"); } } } else { uint256 balance = IERC20(_token).balanceOf(address(this)); if (_amount == 0) { _amount = balance; } IERC20(_token).transfer(owner(), _amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_wcro","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"intermediateToken","type":"address"}],"name":"AddIntermediateToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidityPool","type":"address"},{"indexed":false,"internalType":"bool","name":"isFromFactory","type":"bool"}],"name":"AddLiquidityPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"isFromFactory","type":"bool"}],"name":"AddToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startFromPairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endAtPairIndex","type":"uint256"}],"name":"FetchLiquidityPoolsFromFactory","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":"intermediateToken","type":"address"}],"name":"RemoveIntermediateToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidityPool","type":"address"}],"name":"RemoveLiquidityPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"}],"name":"RemovePresetPath","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"RemoveToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"paths","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isAutoGenerated","type":"bool"}],"name":"SetPresetPath","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"paths","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"SwapExactTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"}],"name":"ZapIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"}],"name":"ZapInToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"}],"name":"ZapOut","type":"event"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract IVVSFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract IVVSRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WCRO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"addIntermediateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"}],"name":"addLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fetchLiquidityPoolsFromFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startFromPairIndex","type":"uint256"},{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"fetchLiquidityPoolsFromFactoryWithIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"}],"name":"getAutoCalculatedPathWithIntermediateTokenForTokenToToken","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"}],"name":"getIntermediateToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIntermediateTokenListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"}],"name":"getLiquidityPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"}],"name":"getPathForTokenToToken","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"}],"name":"getPresetPath","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toLP","type":"address"}],"name":"getSuitableIntermediateTokenForTokenToLP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"intermediateTokenList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"intermediateTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"}],"name":"isLiquidityPoolExistInFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFetchedPairIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidityPools","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"presetPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_intermediateTokenAddress","type":"address"}],"name":"removeIntermediateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"}],"name":"removeLiquidityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"removePresetPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"setPresetPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenA","type":"address"},{"internalType":"address","name":"_tokenB","type":"address"}],"name":"setPresetPathByAutoCalculation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_toTokenOrLp","type":"address"},{"internalType":"uint256","name":"_outputAmountMin","type":"uint256"}],"name":"zapIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"uint256","name":"_inputAmount","type":"uint256"},{"internalType":"address","name":"_toTokenOrLp","type":"address"},{"internalType":"uint256","name":"_outputAmountMin","type":"uint256"}],"name":"zapInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fromLp","type":"address"},{"internalType":"uint256","name":"_inputAmount","type":"uint256"},{"internalType":"address","name":"_toTokenOrLp","type":"address"},{"internalType":"uint256","name":"_outputAmountMin","type":"uint256"}],"name":"zapOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200464a3803806200464a83398101604081905262000034916200047c565b6200003f33620000ec565b600180556001600160a01b03808316608052811660a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000094573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ba9190620004b4565b6001600160a01b031660c052608051620000d69060006200013c565b608051620000e490620002ca565b5050620004d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620001b05760405162461bcd60e51b815260206004820152602f60248201527f5a61703a5f616464546f6b656e3a205f746f6b656e416464726573732073686f60448201526e756c64206e6f74206265207a65726f60881b60648201526084015b60405180910390fd5b620001d8826001600160a01b031660009081526003602052604090205460ff16151560011490565b15620002355760405162461bcd60e51b815260206004820152602560248201527f5656535a61703a5f616464546f6b656e3a205f746f6b656e416464726573732060448201526406973204c560dc1b6064820152608401620001a7565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0385169081179091559054600082815260046020908152604091829020929092555183151581527f02fb12ee42ca4026d39d2102e2e3d3fcb4d12c158f8e0028f2f1eed6cf33ecbe910160405180910390a25050565b6001600160a01b038116620003485760405162461bcd60e51b815260206004820152603b60248201527f5a61703a5f616464496e7465726d656469617465546f6b656e3a205f746f6b6560448201527f6e416464726573732073686f756c64206e6f74206265207a65726f00000000006064820152608401620001a7565b62000370816001600160a01b031660009081526003602052604090205460ff16151560011490565b15620003d95760405162461bcd60e51b815260206004820152603160248201527f5656535a61703a5f616464496e7465726d656469617465546f6b656e3a205f7460448201527006f6b656e41646472657373206973204c5607c1b6064820152608401620001a7565b600780546001810182557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b03841690811790915590546000828152600660205260408082209290925590517fc15631f4ae3b982224d43ad1bd5b6ba064e060f12830bd78b02a43e183045aae9190a250565b80516001600160a01b03811681146200047757600080fd5b919050565b600080604083850312156200049057600080fd5b6200049b836200045f565b9150620004ab602084016200045f565b90509250929050565b600060208284031215620004c757600080fd5b620004d2826200045f565b9392505050565b60805160a05160c0516140d862000572600039600081816103f301528181610b6901528181610cc30152818161144e01526114e90152600081816104270152818161290f0152818161299501528181612b4f015281816130d701526136410152600081816103470152818161171601528181611742015281816117a7015281816117e501528181611be30152611cdb01526140d86000f3fe60806040526004361061023e5760003560e01c806387e3f21c1161012e578063c02a2fd4116100ab578063e21813381161006f578063e2181338146106ee578063e48603391461070e578063e4b50cb81461073b578063ee6a934c1461075b578063f2fde38b1461077b57600080fd5b8063c02a2fd414610666578063d118a51914610686578063d48bfca7146106a6578063dad4cd52146106c6578063de17ca7d146106d957600080fd5b8063a16e647e116100f2578063a16e647e146105e8578063a863ff2f146105fd578063ae22107f14610610578063b7cc146814610630578063bd35d48a1461064657600080fd5b806387e3f21c1461053d5780638da5cb5b1461055d578063917c170c1461057b57806395d5fe85146105a85780639ead7222146105c857600080fd5b80632dd31000116101bc5780636b02ea14116101805780636b02ea14146104a8578063715018a6146104c857806377c16369146104dd5780637c469c0c146104fd5780637df0f7671461051d57600080fd5b80632dd31000146103e157806332fe7b26146104155780635719dd22146104495780635ee7515a146104685780635fa7b5841461048857600080fd5b806319f373611161020357806319f37361146103155780631d470cb1146103355780632755b5fa146103815780632962483d146103a15780632b0a0fd4146103c157600080fd5b806299c5071461024a5780630b0fd47e146102805780630cf20cc9146102c05780630d7eb8a6146102d557806316184ba1146102f557600080fd5b3661024557005b600080fd5b34801561025657600080fd5b5061026a610265366004613a0a565b61079b565b6040516102779190613a87565b60405180910390f35b34801561028c57600080fd5b506102b061029b366004613a9a565b60036020526000908152604090205460ff1681565b6040519015158152602001610277565b6102d36102ce366004613ab7565b61081f565b005b3480156102e157600080fd5b5061026a6102f0366004613a0a565b610a54565b34801561030157600080fd5b506102d3610310366004613a0a565b610a67565b34801561032157600080fd5b506102b0610330366004613a9a565b610b05565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610277565b34801561038d57600080fd5b5061026a61039c366004613a0a565b610b22565b3480156103ad57600080fd5b506102d36103bc366004613b4e565b610b2e565b3480156103cd57600080fd5b506102d36103dc366004613c14565b610b65565b3480156103ed57600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b34801561042157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b34801561045557600080fd5b506005545b604051908152602001610277565b34801561047457600080fd5b50610369610483366004613a0a565b610dbd565b34801561049457600080fd5b506102d36104a3366004613a9a565b610dc9565b3480156104b457600080fd5b506103696104c3366004613c36565b610f56565b3480156104d457600080fd5b506102d3610f86565b3480156104e957600080fd5b506102d36104f8366004613a9a565b610fbc565b34801561050957600080fd5b506102d3610518366004613a0a565b611149565b34801561052957600080fd5b506102b0610538366004613a9a565b611189565b34801561054957600080fd5b5061045a610558366004613c4f565b6111ac565b34801561056957600080fd5b506000546001600160a01b0316610369565b34801561058757600080fd5b5061045a610596366004613a9a565b60066020526000908152604090205481565b3480156105b457600080fd5b506103696105c3366004613a0a565b611424565b3480156105d457600080fd5b506103696105e3366004613c36565b6114bb565b3480156105f457600080fd5b506102d36114e5565b61045a61060b366004613c4f565b611589565b34801561061c57600080fd5b506102d361062b366004613a9a565b6119b1565b34801561063c57600080fd5b5061045a60025481565b34801561065257600080fd5b50610369610661366004613c97565b611a24565b34801561067257600080fd5b50610369610681366004613c36565b611a69565b34801561069257600080fd5b506102b06106a1366004613a0a565b611a79565b3480156106b257600080fd5b506102d36106c1366004613a9a565b611a98565b61045a6106d4366004613ab7565b611b5c565b3480156106e557600080fd5b5060075461045a565b3480156106fa57600080fd5b506102d3610709366004613a9a565b611d73565b34801561071a57600080fd5b5061045a610729366004613a9a565b60046020526000908152604090205481565b34801561074757600080fd5b50610369610756366004613c36565b611e3e565b34801561076757600080fd5b506102d3610776366004613a9a565b611e53565b34801561078757600080fd5b506102d3610796366004613a9a565b611e88565b6001600160a01b03808316600090815260086020908152604080832093851683529281529082902080548351818402810184019094528084526060939283018282801561081157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107f3575b505050505090505b92915050565b6000546001600160a01b031633146108525760405162461bcd60e51b815260040161084990613cd8565b60405180910390fd5b6001600160a01b03821661094857478015610943578161090157604051600090339083908381818185875af1925050503d80600081146108ae576040519150601f19603f3d011682016040523d82523d6000602084013e6108b3565b606091505b50509050806108fb5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610849565b50505050565b604051600090339084908381818185875af1925050503d80600081146108ae576040519150601f19603f3d011682016040523d82523d6000602084013e6108b3565b505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561098f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b39190613d0d565b9050816109be578091505b826001600160a01b031663a9059cbb6109df6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610a2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb9190613d26565b5050565b6060610a608383611f20565b9392505050565b6000546001600160a01b03163314610a915760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b0380831660009081526008602090815260408083209385168352929052908120610ac19161395d565b806001600160a01b0316826001600160a01b03167f27cca96a96530203ba7b0736f27ccb9e3b3765abb6cdf91662034cea0402310860405160405180910390a35050565b6001600160a01b0316600090815260046020526040902054151590565b6060610a6083836120e1565b6000546001600160a01b03163314610b585760405162461bcd60e51b815260040161084990613cd8565b6109438383836000612247565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663574f2ba36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613d0d565b9050808310610c865760405162461bcd60e51b815260206004820152605e60248201527f5656535a61703a66657463684c6971756964697479506f6f6c7346726f6d466160448201527f63746f727957697468496e6465783a205f737461727446726f6d50616972496e60648201527f6465782073686f756c64203c20666163746f7279506169724c656e6774680000608482015260a401610849565b6000610c928385613d5e565b905081811115610c9f5750805b835b81811015610d4f57604051631e3dd18b60e01b815260048101829052610d3d907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631e3dd18b90602401602060405180830381865afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d369190613d76565b60016122d0565b80610d4781613d93565b915050610ca1565b507fa76782213fce5241451c7f5e159bf5c73c4a82661a6620e570e80c934c35b56884610d7d600184613dae565b6040805192835260208301919091520160405180910390a1610da0600182613dae565b60025410156108fb57610db4600182613dae565b60025550505050565b6000610a6083836124ca565b6000546001600160a01b03163314610df35760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b038116600090815260046020526040812054610e1890600190613dae565b6001600160a01b038316600090815260046020526040812055600554909150610e4390600190613dae565b8114610eeb576005805460009190610e5d90600190613dae565b81548110610e6d57610e6d613dc5565b600091825260209091200154600580546001600160a01b039092169250829184908110610e9c57610e9c613dc5565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055610ed0826001613d5e565b6001600160a01b039091166000908152600460205260409020555b6005805480610efc57610efc613ddb565b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038416917f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b91a25050565b600060078281548110610f6b57610f6b613dc5565b6000918252602090912001546001600160a01b031692915050565b6000546001600160a01b03163314610fb05760405162461bcd60e51b815260040161084990613cd8565b610fba60006127f7565b565b6000546001600160a01b03163314610fe65760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b03811660009081526006602052604081205461100b90600190613dae565b6001600160a01b03831660009081526006602052604081205560075490915061103690600190613dae565b81146110de57600780546000919061105090600190613dae565b8154811061106057611060613dc5565b600091825260209091200154600780546001600160a01b03909216925082918490811061108f5761108f613dc5565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556110c3826001613d5e565b6001600160a01b039091166000908152600660205260409020555b60078054806110ef576110ef613ddb565b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038416917f90a3f84c7f380e70131009dd78eaa65c4d523342e691c3e8303544e8fe139b5291a25050565b6000546001600160a01b031633146111735760405162461bcd60e51b815260040161084990613cd8565b610a50828261118285856120e1565b6001612247565b6001600160a01b031660009081526003602052604090205460ff16151560011490565b6000600260015414156111d15760405162461bcd60e51b815260040161084990613df1565b60026001556111df85610b05565b6112435760405162461bcd60e51b815260206004820152602f60248201527f5656535a61703a7a6170496e546f6b656e3a20676976656e2066726f6d546f6b60448201526e32b71034b9903737ba103a37b5b2b760891b6064820152608401610849565b61124c83610b05565b8061125b575061125b83611189565b6112cd5760405162461bcd60e51b815260206004820152603760248201527f5656535a61703a7a6170496e546f6b656e3a20676976656e20746f546f6b656e60448201527f4f724c70206973206e6f7420746f6b656e206f72204c500000000000000000006064820152608401610849565b600084116113305760405162461bcd60e51b815260206004820152602a60248201527f5656535a61703a7a6170496e546f6b656e3a20676976656e20616d6f756e7420604482015269073686f756c64203e20360b41b6064820152608401610849565b6113456001600160a01b038616333087612847565b6000611353868686336128b2565b9050828110156113c15760405162461bcd60e51b815260206004820152603360248201527f5656535a61703a7a6170496e546f6b656e3a206f757470757420616d6f756e74604482015272081b195cdcc81d1a185b88195e1c1958dd1959606a1b6064820152608401610849565b836001600160a01b0316866001600160a01b03167f963777cd6436c297e0a22853a32509d63b46241d9858a89350921b3517e552ad878460405161140f929190918252602082015260400190565b60405180910390a36001805595945050505050565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015611497573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190613d76565b600581815481106114cb57600080fd5b6000918252602090912001546001600160a01b0316905081565b60017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663574f2ba36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190613d0d565b6115739190613dae565b6002541015610fba57610fba6002546008610b65565b6000600260015414156115ae5760405162461bcd60e51b815260040161084990613df1565b60026001556115bc85611189565b61161e5760405162461bcd60e51b815260206004820152602d60248201527f5656535a61703a7a61704f75743a2073686f756c64207a6170206f757420667260448201526c6f6d204c50204164647265737360981b6064820152608401610849565b826001600160a01b0316856001600160a01b031614156116805760405162461bcd60e51b815260206004820152601d60248201527f5656535a61703a7a61704f75743a20696e707574203d206f75747075740000006044820152606401610849565b600084116116df5760405162461bcd60e51b815260206004820152602660248201527f5656535a61703a7a61704f75743a20676976656e20616d6f756e742073686f7560448201526506c64203e20360d41b6064820152608401610849565b6116f46001600160a01b038616333087612847565b6116fd856128f2565b600061170884611189565b1561177157600061173b87877f0000000000000000000000000000000000000000000000000000000000000000306129bc565b90506117697f00000000000000000000000000000000000000000000000000000000000000008287336128b2565b915050611943565b61177a84610b05565b156117925761178b868686336129bc565b9050611943565b6001600160a01b0384166118de576117cc86867f0000000000000000000000000000000000000000000000000000000000000000306129bc565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561183157600080fd5b505af1158015611845573d6000803e3d6000fd5b50506040516000925033915083908381818185875af1925050503d806000811461188b576040519150601f19603f3d011682016040523d82523d6000602084013e611890565b606091505b50509050806118d85760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610849565b50611943565b60405162461bcd60e51b815260206004820152603460248201527f5656535a61703a7a61704f75743a2073686f756c64207a6170206f757420746f60448201527320546f6b656e206f72204c50204164647265737360601b6064820152608401610849565b828110156119635760405162461bcd60e51b815260040161084990613e28565b836001600160a01b0316866001600160a01b03167f49c082cd7a2d84c4820fb8ea8b7cd2a0dac8bac51b973cfc358260a859b3c959878460405161140f929190918252602082015260400190565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b038116600081815260036020526040808220805460ff19169055517ff2750254aa8500753755d8adbf0f857f1cf9e03fcd5555a92a3ca87810350e379190a250565b60086020528260005260406000206020528160005260406000208181548110611a4c57600080fd5b6000918252602090912001546001600160a01b0316925083915050565b600781815481106114cb57600080fd5b600080611a868484611424565b6001600160a01b031614159392505050565b6000546001600160a01b03163314611ac25760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b03811660009081526004602052604090205415611b4e5760405162461bcd60e51b815260206004820152603760248201527f5656535a61703a616464546f6b656e3a205f746f6b656e41646472657373206960448201527f7320616c726561647920696e20746f6b656e206c6973740000000000000000006064820152608401610849565b611b59816000612c49565b50565b600060026001541415611b815760405162461bcd60e51b815260040161084990613df1565b600260015534611be15760405162461bcd60e51b815260206004820152602560248201527f5656535a61703a7a6170496e3a20676976656e20616d6f756e742073686f756c604482015264064203e20360dc1b6064820152608401610849565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b5050505050611c5e83610b05565b80611c6d5750611c6d83611189565b611cd45760405162461bcd60e51b815260206004820152603260248201527f5656535a61703a7a6170496e3a20676976656e20746f546f6b656e4f724c702060448201527106973206e6f7420746f6b656e206f72204c560741b6064820152608401610849565b6000611d027f00000000000000000000000000000000000000000000000000000000000000003486336128b2565b905082811015611d245760405162461bcd60e51b815260040161084990613e28565b60408051348152602081018390526001600160a01b038616917f193fb64a5cf261bde281eeee0a0c87ac3818fc1b82a9eeafb907889bc3f84ced910160405180910390a2600180559392505050565b6000546001600160a01b03163314611d9d5760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b03811660009081526006602052604090205415611e355760405162461bcd60e51b815260206004820152604360248201527f5656535a61703a616464496e7465726d656469617465546f6b656e3a205f746f60448201527f6b656e4164647265737320697320616c726561647920696e20746f6b656e206c6064820152621a5cdd60ea1b608482015260a401610849565b611b5981612db0565b600060058281548110610f6b57610f6b613dc5565b6000546001600160a01b03163314611e7d5760405162461bcd60e51b815260040161084990613cd8565b611b598160006122d0565b6000546001600160a01b03163314611eb25760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b038116611f175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610849565b611b59816127f7565b606080826001600160a01b0316846001600160a01b03161415611fab5760405162461bcd60e51b815260206004820152603860248201527f5656535a61703a5f73776170546f6b656e546f546f6b656e3a204e6f7420416c60448201527f6c6f772066726f6d546f6b656e203d3d20746f546f6b656e00000000000000006064820152608401610849565b611fb58484611a79565b156120475760408051600280825260608201835290916020830190803683370190505090508381600081518110611fee57611fee613dc5565b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061202257612022613dc5565b60200260200101906001600160a01b031690816001600160a01b03168152505061206a565b612051848461079b565b905080516000141561206a5761206784846120e1565b90505b6000815111610a605760405162461bcd60e51b815260206004820152603b60248201527f5656535a61703a5f67657450617468466f72546f6b656e546f546f6b656e3a2060448201527f446f6573206e6f7420737570706f7274207468697320726f75746500000000006064820152608401610849565b60608060005b60075481101561223f5760006007828154811061210657612106613dc5565b6000918252602090912001546001600160a01b039081169150861681148015906121425750806001600160a01b0316856001600160a01b031614155b801561215357506121538682611a79565b801561216457506121648186611a79565b1561222c57604080516003808252608082019092529060208201606080368337019050509250858360008151811061219e5761219e613dc5565b60200260200101906001600160a01b031690816001600160a01b03168152505080836001815181106121d2576121d2613dc5565b60200260200101906001600160a01b031690816001600160a01b031681525050848360028151811061220657612206613dc5565b60200260200101906001600160a01b031690816001600160a01b0316815250505061223f565b508061223781613d93565b9150506120e7565b509392505050565b6001600160a01b0380851660009081526008602090815260408083209387168352928152919020835161227c9285019061397b565b50826001600160a01b0316846001600160a01b03167fb9b43edbbefa85363959fd93ea381b7aa374d8b80e275a892a8b065fb23d522984846040516122c2929190613e76565b60405180910390a350505050565b6001600160a01b0382166123435760405162461bcd60e51b815260206004820152603460248201527f5a61703a5f6164644c6971756964697479506f6f6c3a205f6c70416464726573604482015273732073686f756c64206e6f74206265207a65726f60601b6064820152608401610849565b6001600160a01b03821660009081526003602052604090205460ff16610a505760008290506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc9190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124329190613d76565b905061243d82610b05565b61244c5761244c826001612c49565b61245581610b05565b61246457612464816001612c49565b6001600160a01b03851660008181526003602052604090819020805460ff19166001179055517f3409167cbcbdc0e24587ee761aa4b32843bee0d6a77956b802a9212b32538c6c906124bb90871515815260200190565b60405180910390a25050505050565b6000808290506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125349190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259a9190613d76565b9050816001600160a01b0316866001600160a01b031614806125cd5750806001600160a01b0316866001600160a01b0316145b156125dd57859350505050610819565b6001600160a01b03821660009081526006602052604090205415612653576001600160a01b0381166000908152600660205260409020541580159061262957506126278683611a79565b155b801561263a575061263a8682611a79565b15612649579250610819915050565b5091506108199050565b6001600160a01b0381166000908152600660205260409020541561267b579250610819915050565b6001600160a01b038616600090815260066020526040902054158015906126a757506126a78683611a79565b80156126b857506126b88682611a79565b156126c857859350505050610819565b6000805b600754811015612764576000600782815481106126eb576126eb613dc5565b6000918252602090912001546001600160a01b0316905061270c8186611a79565b801561271d575061271d8185611a79565b156127515761272c8982611a79565b1561273e579550610819945050505050565b6001600160a01b03811615612751578092505b508061275c81613d93565b9150506126cc565b506001600160a01b0381161561277f57935061081992505050565b60405162461bcd60e51b815260206004820152604160248201527f5656535a61703a5f6765745375697461626c65496e7465726d6564696174655460448201527f6f6b656e3a20446f6573206e6f7420737570706f7274207468697320726f75746064820152606560f81b608482015260a401610849565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526108fb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612f22565b60006128bd856128f2565b6128c683611189565b156128de576128d785858585612ff4565b90506128ea565b6128d7858585856130a5565b949350505050565b604051636eb1769f60e11b81523060048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116602483015282169063dd62ed3e90604401602060405180830381865afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129829190613d0d565b611b5957611b596001600160a01b0382167f0000000000000000000000000000000000000000000000000000000000000000600019613265565b60006129c785611189565b612a315760405162461bcd60e51b815260206004820152603560248201527f5656535a61703a5f72656d6f76654c6971756964697479546f546f6b656e3a206044820152745f6c70206973204e6f6e204c50204164647265737360581b6064820152608401610849565b60008590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9a9190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b009190613d76565b604051635d5155ef60e11b81526001600160a01b0384811660048301528281166024830152604482018a9052600060648301819052608483018190523060a48401524260c484015292935082917f00000000000000000000000000000000000000000000000000000000000000009091169063baa2abde9060e40160408051808303816000875af1158015612b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbd9190613e9a565b915091506000886001600160a01b0316846001600160a01b031614612bed57612be884838b306130a5565b612bef565b815b896001600160a01b0316866001600160a01b031614612c1957612c1486858c306130a5565b612c1b565b835b612c259190613d5e565b9050612c3b6001600160a01b038a16898361337a565b9a9950505050505050505050565b6001600160a01b038216612cb75760405162461bcd60e51b815260206004820152602f60248201527f5a61703a5f616464546f6b656e3a205f746f6b656e416464726573732073686f60448201526e756c64206e6f74206265207a65726f60881b6064820152608401610849565b612cc082611189565b15612d1b5760405162461bcd60e51b815260206004820152602560248201527f5656535a61703a5f616464546f6b656e3a205f746f6b656e416464726573732060448201526406973204c560dc1b6064820152608401610849565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0385169081179091559054600082815260046020908152604091829020929092555183151581527f02fb12ee42ca4026d39d2102e2e3d3fcb4d12c158f8e0028f2f1eed6cf33ecbe910160405180910390a25050565b6001600160a01b038116612e2c5760405162461bcd60e51b815260206004820152603b60248201527f5a61703a5f616464496e7465726d656469617465546f6b656e3a205f746f6b6560448201527f6e416464726573732073686f756c64206e6f74206265207a65726f00000000006064820152608401610849565b612e3581611189565b15612e9c5760405162461bcd60e51b815260206004820152603160248201527f5656535a61703a5f616464496e7465726d656469617465546f6b656e3a205f7460448201527006f6b656e41646472657373206973204c5607c1b6064820152608401610849565b600780546001810182557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b03841690811790915590546000828152600660205260408082209290925590517fc15631f4ae3b982224d43ad1bd5b6ba064e060f12830bd78b02a43e183045aae9190a250565b6000612f77826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133aa9092919063ffffffff16565b8051909150156109435780806020019051810190612f959190613d26565b6109435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610849565b6000612fff83611189565b6130605760405162461bcd60e51b815260206004820152602c60248201527f5656535a61703a5f73776170546f6b656e546f4c503a205f6c70206973204e6f60448201526b6e204c50204164647265737360a01b6064820152608401610849565b6000806000806130718989896133b9565b9350935093509350613082846128f2565b61308b826128f2565b613098848385848a6135e8565b9998505050505050505050565b6000806130b28685611f20565b90506130bd866128f2565b6040516338ed173960e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906338ed173990613114908990859087908a904290600401613ebe565b6000604051808303816000875af1158015613133573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261315b9190810190613efa565b90506000816001835161316e9190613dae565b8151811061317e5761317e613dc5565b6020026020010151116131f95760405162461bcd60e51b815260206004820152603c60248201527f5656535a61703a5f73776170546f6b656e546f546f6b656e3a206f757470757460448201527f20616d6f756e747320696e76616c6964202d203020616d6f6f756e74000000006064820152608401610849565b7f6683da1ec942d96015ed8dc2a8e5ad662e6613fee8d7e488434713362a6b8c4f828260405161322a929190613f80565b60405180910390a180600182516132419190613dae565b8151811061325157613251613dc5565b602002602001015192505050949350505050565b8015806132df5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156132b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132dd9190613d0d565b155b61334a5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610849565b6040516001600160a01b03831660248201526044810182905261094390849063095ea7b360e01b9060640161287b565b6040516001600160a01b03831660248201526044810182905261094390849063a9059cbb60e01b9060640161287b565b60606128ea84846000856137fc565b60008060008060008590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015613404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134289190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561346a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348e9190613d76565b9050600080836001600160a01b03168c6001600160a01b031614156134d6576134b860028c613fd7565b91506134cf8c6134c8848e613dae565b85306130a5565b90506135d5565b826001600160a01b03168c6001600160a01b03161415613519576134fb60028c613fd7565b90506135128c61350b838e613dae565b86306130a5565b91506135d5565b60006135258d8c6124ca565b90506000816001600160a01b03168e6001600160a01b0316146135535761354e8e8e84306130a5565b613555565b8c5b90506000613564600283613fd7565b905060006135728284613dae565b9050836001600160a01b0316886001600160a01b03161461359e5761359984838a306130a5565b6135a0565b815b9550836001600160a01b0316876001600160a01b0316146135cc576135c7848289306130a5565b6135ce565b805b9450505050505b9297509550935091505093509350935093565b60405162e8e33760e81b81526001600160a01b0386811660048301528581166024830152604482018590526064820184905260006084830181905260a4830181905283821660c48401524260e4840152918291829182917f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303816000875af115801561368b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136af9190613ff9565b9194509250905060006136c28489613dae565b1115613753576001600160a01b03891663a9059cbb866136e2868b613dae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137519190613d26565b505b600061375f8388613dae565b11156137f0576001600160a01b03881663a9059cbb8661377f858a613dae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156137ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ee9190613d26565b505b98975050505050505050565b60608247101561385d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610849565b843b6138ab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610849565b600080866001600160a01b031685876040516138c79190614053565b60006040518083038185875af1925050503d8060008114613904576040519150601f19603f3d011682016040523d82523d6000602084013e613909565b606091505b5091509150613919828286613924565b979650505050505050565b60608315613933575081610a60565b8251156139435782518084602001fd5b8160405162461bcd60e51b8152600401610849919061406f565b5080546000825590600052602060002090810190611b5991906139e0565b8280548282559060005260206000209081019282156139d0579160200282015b828111156139d057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061399b565b506139dc9291506139e0565b5090565b5b808211156139dc57600081556001016139e1565b6001600160a01b0381168114611b5957600080fd5b60008060408385031215613a1d57600080fd5b8235613a28816139f5565b91506020830135613a38816139f5565b809150509250929050565b600081518084526020808501945080840160005b83811015613a7c5781516001600160a01b031687529582019590820190600101613a57565b509495945050505050565b602081526000610a606020830184613a43565b600060208284031215613aac57600080fd5b8135610a60816139f5565b60008060408385031215613aca57600080fd5b8235613ad5816139f5565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613b2257613b22613ae3565b604052919050565b600067ffffffffffffffff821115613b4457613b44613ae3565b5060051b60200190565b600080600060608486031215613b6357600080fd5b8335613b6e816139f5565b9250602084810135613b7f816139f5565b9250604085013567ffffffffffffffff811115613b9b57600080fd5b8501601f81018713613bac57600080fd5b8035613bbf613bba82613b2a565b613af9565b81815260059190911b82018301908381019089831115613bde57600080fd5b928401925b82841015613c05578335613bf6816139f5565b82529284019290840190613be3565b80955050505050509250925092565b60008060408385031215613c2757600080fd5b50508035926020909101359150565b600060208284031215613c4857600080fd5b5035919050565b60008060008060808587031215613c6557600080fd5b8435613c70816139f5565b9350602085013592506040850135613c87816139f5565b9396929550929360600135925050565b600080600060608486031215613cac57600080fd5b8335613cb7816139f5565b92506020840135613cc7816139f5565b929592945050506040919091013590565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d1f57600080fd5b5051919050565b600060208284031215613d3857600080fd5b81518015158114610a6057600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613d7157613d71613d48565b500190565b600060208284031215613d8857600080fd5b8151610a60816139f5565b6000600019821415613da757613da7613d48565b5060010190565b600082821015613dc057613dc0613d48565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602e908201527f5656535a61703a7a6170496e3a206f757470757420616d6f756e74206c65737360408201526d081d1a185b88195e1c1958dd195960921b606082015260800190565b604081526000613e896040830185613a43565b905082151560208301529392505050565b60008060408385031215613ead57600080fd5b505080516020909101519092909150565b85815284602082015260a060408201526000613edd60a0830186613a43565b6001600160a01b0394909416606083015250608001529392505050565b60006020808385031215613f0d57600080fd5b825167ffffffffffffffff811115613f2457600080fd5b8301601f81018513613f3557600080fd5b8051613f43613bba82613b2a565b81815260059190911b82018301908381019087831115613f6257600080fd5b928401925b8284101561391957835182529284019290840190613f67565b604081526000613f936040830185613a43565b82810360208481019190915284518083528582019282019060005b81811015613fca57845183529383019391830191600101613fae565b5090979650505050505050565b600082613ff457634e487b7160e01b600052601260045260246000fd5b500490565b60008060006060848603121561400e57600080fd5b8351925060208401519150604084015190509250925092565b60005b8381101561404257818101518382015260200161402a565b838111156108fb5750506000910152565b60008251614065818460208701614027565b9190910192915050565b602081526000825180602084015261408e816040850160208701614027565b601f01601f1916919091016040019291505056fea264697066735822122004d95cba6f71967ebb69ad52c89ff82a67744bb249faf57016d8d4e3a842466764736f6c634300080b00330000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae
Deployed Bytecode
0x60806040526004361061023e5760003560e01c806387e3f21c1161012e578063c02a2fd4116100ab578063e21813381161006f578063e2181338146106ee578063e48603391461070e578063e4b50cb81461073b578063ee6a934c1461075b578063f2fde38b1461077b57600080fd5b8063c02a2fd414610666578063d118a51914610686578063d48bfca7146106a6578063dad4cd52146106c6578063de17ca7d146106d957600080fd5b8063a16e647e116100f2578063a16e647e146105e8578063a863ff2f146105fd578063ae22107f14610610578063b7cc146814610630578063bd35d48a1461064657600080fd5b806387e3f21c1461053d5780638da5cb5b1461055d578063917c170c1461057b57806395d5fe85146105a85780639ead7222146105c857600080fd5b80632dd31000116101bc5780636b02ea14116101805780636b02ea14146104a8578063715018a6146104c857806377c16369146104dd5780637c469c0c146104fd5780637df0f7671461051d57600080fd5b80632dd31000146103e157806332fe7b26146104155780635719dd22146104495780635ee7515a146104685780635fa7b5841461048857600080fd5b806319f373611161020357806319f37361146103155780631d470cb1146103355780632755b5fa146103815780632962483d146103a15780632b0a0fd4146103c157600080fd5b806299c5071461024a5780630b0fd47e146102805780630cf20cc9146102c05780630d7eb8a6146102d557806316184ba1146102f557600080fd5b3661024557005b600080fd5b34801561025657600080fd5b5061026a610265366004613a0a565b61079b565b6040516102779190613a87565b60405180910390f35b34801561028c57600080fd5b506102b061029b366004613a9a565b60036020526000908152604090205460ff1681565b6040519015158152602001610277565b6102d36102ce366004613ab7565b61081f565b005b3480156102e157600080fd5b5061026a6102f0366004613a0a565b610a54565b34801561030157600080fd5b506102d3610310366004613a0a565b610a67565b34801561032157600080fd5b506102b0610330366004613a9a565b610b05565b34801561034157600080fd5b506103697f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2381565b6040516001600160a01b039091168152602001610277565b34801561038d57600080fd5b5061026a61039c366004613a0a565b610b22565b3480156103ad57600080fd5b506102d36103bc366004613b4e565b610b2e565b3480156103cd57600080fd5b506102d36103dc366004613c14565b610b65565b3480156103ed57600080fd5b506103697f0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc1581565b34801561042157600080fd5b506103697f000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae81565b34801561045557600080fd5b506005545b604051908152602001610277565b34801561047457600080fd5b50610369610483366004613a0a565b610dbd565b34801561049457600080fd5b506102d36104a3366004613a9a565b610dc9565b3480156104b457600080fd5b506103696104c3366004613c36565b610f56565b3480156104d457600080fd5b506102d3610f86565b3480156104e957600080fd5b506102d36104f8366004613a9a565b610fbc565b34801561050957600080fd5b506102d3610518366004613a0a565b611149565b34801561052957600080fd5b506102b0610538366004613a9a565b611189565b34801561054957600080fd5b5061045a610558366004613c4f565b6111ac565b34801561056957600080fd5b506000546001600160a01b0316610369565b34801561058757600080fd5b5061045a610596366004613a9a565b60066020526000908152604090205481565b3480156105b457600080fd5b506103696105c3366004613a0a565b611424565b3480156105d457600080fd5b506103696105e3366004613c36565b6114bb565b3480156105f457600080fd5b506102d36114e5565b61045a61060b366004613c4f565b611589565b34801561061c57600080fd5b506102d361062b366004613a9a565b6119b1565b34801561063c57600080fd5b5061045a60025481565b34801561065257600080fd5b50610369610661366004613c97565b611a24565b34801561067257600080fd5b50610369610681366004613c36565b611a69565b34801561069257600080fd5b506102b06106a1366004613a0a565b611a79565b3480156106b257600080fd5b506102d36106c1366004613a9a565b611a98565b61045a6106d4366004613ab7565b611b5c565b3480156106e557600080fd5b5060075461045a565b3480156106fa57600080fd5b506102d3610709366004613a9a565b611d73565b34801561071a57600080fd5b5061045a610729366004613a9a565b60046020526000908152604090205481565b34801561074757600080fd5b50610369610756366004613c36565b611e3e565b34801561076757600080fd5b506102d3610776366004613a9a565b611e53565b34801561078757600080fd5b506102d3610796366004613a9a565b611e88565b6001600160a01b03808316600090815260086020908152604080832093851683529281529082902080548351818402810184019094528084526060939283018282801561081157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107f3575b505050505090505b92915050565b6000546001600160a01b031633146108525760405162461bcd60e51b815260040161084990613cd8565b60405180910390fd5b6001600160a01b03821661094857478015610943578161090157604051600090339083908381818185875af1925050503d80600081146108ae576040519150601f19603f3d011682016040523d82523d6000602084013e6108b3565b606091505b50509050806108fb5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610849565b50505050565b604051600090339084908381818185875af1925050503d80600081146108ae576040519150601f19603f3d011682016040523d82523d6000602084013e6108b3565b505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561098f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b39190613d0d565b9050816109be578091505b826001600160a01b031663a9059cbb6109df6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610a2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb9190613d26565b5050565b6060610a608383611f20565b9392505050565b6000546001600160a01b03163314610a915760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b0380831660009081526008602090815260408083209385168352929052908120610ac19161395d565b806001600160a01b0316826001600160a01b03167f27cca96a96530203ba7b0736f27ccb9e3b3765abb6cdf91662034cea0402310860405160405180910390a35050565b6001600160a01b0316600090815260046020526040902054151590565b6060610a6083836120e1565b6000546001600160a01b03163314610b585760405162461bcd60e51b815260040161084990613cd8565b6109438383836000612247565b60007f0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc156001600160a01b031663574f2ba36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be99190613d0d565b9050808310610c865760405162461bcd60e51b815260206004820152605e60248201527f5656535a61703a66657463684c6971756964697479506f6f6c7346726f6d466160448201527f63746f727957697468496e6465783a205f737461727446726f6d50616972496e60648201527f6465782073686f756c64203c20666163746f7279506169724c656e6774680000608482015260a401610849565b6000610c928385613d5e565b905081811115610c9f5750805b835b81811015610d4f57604051631e3dd18b60e01b815260048101829052610d3d907f0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc156001600160a01b031690631e3dd18b90602401602060405180830381865afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d369190613d76565b60016122d0565b80610d4781613d93565b915050610ca1565b507fa76782213fce5241451c7f5e159bf5c73c4a82661a6620e570e80c934c35b56884610d7d600184613dae565b6040805192835260208301919091520160405180910390a1610da0600182613dae565b60025410156108fb57610db4600182613dae565b60025550505050565b6000610a6083836124ca565b6000546001600160a01b03163314610df35760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b038116600090815260046020526040812054610e1890600190613dae565b6001600160a01b038316600090815260046020526040812055600554909150610e4390600190613dae565b8114610eeb576005805460009190610e5d90600190613dae565b81548110610e6d57610e6d613dc5565b600091825260209091200154600580546001600160a01b039092169250829184908110610e9c57610e9c613dc5565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055610ed0826001613d5e565b6001600160a01b039091166000908152600460205260409020555b6005805480610efc57610efc613ddb565b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038416917f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b91a25050565b600060078281548110610f6b57610f6b613dc5565b6000918252602090912001546001600160a01b031692915050565b6000546001600160a01b03163314610fb05760405162461bcd60e51b815260040161084990613cd8565b610fba60006127f7565b565b6000546001600160a01b03163314610fe65760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b03811660009081526006602052604081205461100b90600190613dae565b6001600160a01b03831660009081526006602052604081205560075490915061103690600190613dae565b81146110de57600780546000919061105090600190613dae565b8154811061106057611060613dc5565b600091825260209091200154600780546001600160a01b03909216925082918490811061108f5761108f613dc5565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556110c3826001613d5e565b6001600160a01b039091166000908152600660205260409020555b60078054806110ef576110ef613ddb565b600082815260208120820160001990810180546001600160a01b03191690559091019091556040516001600160a01b038416917f90a3f84c7f380e70131009dd78eaa65c4d523342e691c3e8303544e8fe139b5291a25050565b6000546001600160a01b031633146111735760405162461bcd60e51b815260040161084990613cd8565b610a50828261118285856120e1565b6001612247565b6001600160a01b031660009081526003602052604090205460ff16151560011490565b6000600260015414156111d15760405162461bcd60e51b815260040161084990613df1565b60026001556111df85610b05565b6112435760405162461bcd60e51b815260206004820152602f60248201527f5656535a61703a7a6170496e546f6b656e3a20676976656e2066726f6d546f6b60448201526e32b71034b9903737ba103a37b5b2b760891b6064820152608401610849565b61124c83610b05565b8061125b575061125b83611189565b6112cd5760405162461bcd60e51b815260206004820152603760248201527f5656535a61703a7a6170496e546f6b656e3a20676976656e20746f546f6b656e60448201527f4f724c70206973206e6f7420746f6b656e206f72204c500000000000000000006064820152608401610849565b600084116113305760405162461bcd60e51b815260206004820152602a60248201527f5656535a61703a7a6170496e546f6b656e3a20676976656e20616d6f756e7420604482015269073686f756c64203e20360b41b6064820152608401610849565b6113456001600160a01b038616333087612847565b6000611353868686336128b2565b9050828110156113c15760405162461bcd60e51b815260206004820152603360248201527f5656535a61703a7a6170496e546f6b656e3a206f757470757420616d6f756e74604482015272081b195cdcc81d1a185b88195e1c1958dd1959606a1b6064820152608401610849565b836001600160a01b0316866001600160a01b03167f963777cd6436c297e0a22853a32509d63b46241d9858a89350921b3517e552ad878460405161140f929190918252602082015260400190565b60405180910390a36001805595945050505050565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000917f0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc159091169063e6a4390590604401602060405180830381865afa158015611497573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190613d76565b600581815481106114cb57600080fd5b6000918252602090912001546001600160a01b0316905081565b60017f0000000000000000000000003b44b2a187a7b3824131f8db5a74194d0a42fc156001600160a01b031663574f2ba36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115699190613d0d565b6115739190613dae565b6002541015610fba57610fba6002546008610b65565b6000600260015414156115ae5760405162461bcd60e51b815260040161084990613df1565b60026001556115bc85611189565b61161e5760405162461bcd60e51b815260206004820152602d60248201527f5656535a61703a7a61704f75743a2073686f756c64207a6170206f757420667260448201526c6f6d204c50204164647265737360981b6064820152608401610849565b826001600160a01b0316856001600160a01b031614156116805760405162461bcd60e51b815260206004820152601d60248201527f5656535a61703a7a61704f75743a20696e707574203d206f75747075740000006044820152606401610849565b600084116116df5760405162461bcd60e51b815260206004820152602660248201527f5656535a61703a7a61704f75743a20676976656e20616d6f756e742073686f7560448201526506c64203e20360d41b6064820152608401610849565b6116f46001600160a01b038616333087612847565b6116fd856128f2565b600061170884611189565b1561177157600061173b87877f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23306129bc565b90506117697f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238287336128b2565b915050611943565b61177a84610b05565b156117925761178b868686336129bc565b9050611943565b6001600160a01b0384166118de576117cc86867f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23306129bc565b604051632e1a7d4d60e01b8152600481018290529091507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561183157600080fd5b505af1158015611845573d6000803e3d6000fd5b50506040516000925033915083908381818185875af1925050503d806000811461188b576040519150601f19603f3d011682016040523d82523d6000602084013e611890565b606091505b50509050806118d85760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610849565b50611943565b60405162461bcd60e51b815260206004820152603460248201527f5656535a61703a7a61704f75743a2073686f756c64207a6170206f757420746f60448201527320546f6b656e206f72204c50204164647265737360601b6064820152608401610849565b828110156119635760405162461bcd60e51b815260040161084990613e28565b836001600160a01b0316866001600160a01b03167f49c082cd7a2d84c4820fb8ea8b7cd2a0dac8bac51b973cfc358260a859b3c959878460405161140f929190918252602082015260400190565b6000546001600160a01b031633146119db5760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b038116600081815260036020526040808220805460ff19169055517ff2750254aa8500753755d8adbf0f857f1cf9e03fcd5555a92a3ca87810350e379190a250565b60086020528260005260406000206020528160005260406000208181548110611a4c57600080fd5b6000918252602090912001546001600160a01b0316925083915050565b600781815481106114cb57600080fd5b600080611a868484611424565b6001600160a01b031614159392505050565b6000546001600160a01b03163314611ac25760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b03811660009081526004602052604090205415611b4e5760405162461bcd60e51b815260206004820152603760248201527f5656535a61703a616464546f6b656e3a205f746f6b656e41646472657373206960448201527f7320616c726561647920696e20746f6b656e206c6973740000000000000000006064820152608401610849565b611b59816000612c49565b50565b600060026001541415611b815760405162461bcd60e51b815260040161084990613df1565b600260015534611be15760405162461bcd60e51b815260206004820152602560248201527f5656535a61703a7a6170496e3a20676976656e20616d6f756e742073686f756c604482015264064203e20360dc1b6064820152608401610849565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c3c57600080fd5b505af1158015611c50573d6000803e3d6000fd5b5050505050611c5e83610b05565b80611c6d5750611c6d83611189565b611cd45760405162461bcd60e51b815260206004820152603260248201527f5656535a61703a7a6170496e3a20676976656e20746f546f6b656e4f724c702060448201527106973206e6f7420746f6b656e206f72204c560741b6064820152608401610849565b6000611d027f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae233486336128b2565b905082811015611d245760405162461bcd60e51b815260040161084990613e28565b60408051348152602081018390526001600160a01b038616917f193fb64a5cf261bde281eeee0a0c87ac3818fc1b82a9eeafb907889bc3f84ced910160405180910390a2600180559392505050565b6000546001600160a01b03163314611d9d5760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b03811660009081526006602052604090205415611e355760405162461bcd60e51b815260206004820152604360248201527f5656535a61703a616464496e7465726d656469617465546f6b656e3a205f746f60448201527f6b656e4164647265737320697320616c726561647920696e20746f6b656e206c6064820152621a5cdd60ea1b608482015260a401610849565b611b5981612db0565b600060058281548110610f6b57610f6b613dc5565b6000546001600160a01b03163314611e7d5760405162461bcd60e51b815260040161084990613cd8565b611b598160006122d0565b6000546001600160a01b03163314611eb25760405162461bcd60e51b815260040161084990613cd8565b6001600160a01b038116611f175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610849565b611b59816127f7565b606080826001600160a01b0316846001600160a01b03161415611fab5760405162461bcd60e51b815260206004820152603860248201527f5656535a61703a5f73776170546f6b656e546f546f6b656e3a204e6f7420416c60448201527f6c6f772066726f6d546f6b656e203d3d20746f546f6b656e00000000000000006064820152608401610849565b611fb58484611a79565b156120475760408051600280825260608201835290916020830190803683370190505090508381600081518110611fee57611fee613dc5565b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061202257612022613dc5565b60200260200101906001600160a01b031690816001600160a01b03168152505061206a565b612051848461079b565b905080516000141561206a5761206784846120e1565b90505b6000815111610a605760405162461bcd60e51b815260206004820152603b60248201527f5656535a61703a5f67657450617468466f72546f6b656e546f546f6b656e3a2060448201527f446f6573206e6f7420737570706f7274207468697320726f75746500000000006064820152608401610849565b60608060005b60075481101561223f5760006007828154811061210657612106613dc5565b6000918252602090912001546001600160a01b039081169150861681148015906121425750806001600160a01b0316856001600160a01b031614155b801561215357506121538682611a79565b801561216457506121648186611a79565b1561222c57604080516003808252608082019092529060208201606080368337019050509250858360008151811061219e5761219e613dc5565b60200260200101906001600160a01b031690816001600160a01b03168152505080836001815181106121d2576121d2613dc5565b60200260200101906001600160a01b031690816001600160a01b031681525050848360028151811061220657612206613dc5565b60200260200101906001600160a01b031690816001600160a01b0316815250505061223f565b508061223781613d93565b9150506120e7565b509392505050565b6001600160a01b0380851660009081526008602090815260408083209387168352928152919020835161227c9285019061397b565b50826001600160a01b0316846001600160a01b03167fb9b43edbbefa85363959fd93ea381b7aa374d8b80e275a892a8b065fb23d522984846040516122c2929190613e76565b60405180910390a350505050565b6001600160a01b0382166123435760405162461bcd60e51b815260206004820152603460248201527f5a61703a5f6164644c6971756964697479506f6f6c3a205f6c70416464726573604482015273732073686f756c64206e6f74206265207a65726f60601b6064820152608401610849565b6001600160a01b03821660009081526003602052604090205460ff16610a505760008290506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cc9190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124329190613d76565b905061243d82610b05565b61244c5761244c826001612c49565b61245581610b05565b61246457612464816001612c49565b6001600160a01b03851660008181526003602052604090819020805460ff19166001179055517f3409167cbcbdc0e24587ee761aa4b32843bee0d6a77956b802a9212b32538c6c906124bb90871515815260200190565b60405180910390a25050505050565b6000808290506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125349190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259a9190613d76565b9050816001600160a01b0316866001600160a01b031614806125cd5750806001600160a01b0316866001600160a01b0316145b156125dd57859350505050610819565b6001600160a01b03821660009081526006602052604090205415612653576001600160a01b0381166000908152600660205260409020541580159061262957506126278683611a79565b155b801561263a575061263a8682611a79565b15612649579250610819915050565b5091506108199050565b6001600160a01b0381166000908152600660205260409020541561267b579250610819915050565b6001600160a01b038616600090815260066020526040902054158015906126a757506126a78683611a79565b80156126b857506126b88682611a79565b156126c857859350505050610819565b6000805b600754811015612764576000600782815481106126eb576126eb613dc5565b6000918252602090912001546001600160a01b0316905061270c8186611a79565b801561271d575061271d8185611a79565b156127515761272c8982611a79565b1561273e579550610819945050505050565b6001600160a01b03811615612751578092505b508061275c81613d93565b9150506126cc565b506001600160a01b0381161561277f57935061081992505050565b60405162461bcd60e51b815260206004820152604160248201527f5656535a61703a5f6765745375697461626c65496e7465726d6564696174655460448201527f6f6b656e3a20446f6573206e6f7420737570706f7274207468697320726f75746064820152606560f81b608482015260a401610849565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526108fb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612f22565b60006128bd856128f2565b6128c683611189565b156128de576128d785858585612ff4565b90506128ea565b6128d7858585856130a5565b949350505050565b604051636eb1769f60e11b81523060048201526001600160a01b037f000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae8116602483015282169063dd62ed3e90604401602060405180830381865afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129829190613d0d565b611b5957611b596001600160a01b0382167f000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae600019613265565b60006129c785611189565b612a315760405162461bcd60e51b815260206004820152603560248201527f5656535a61703a5f72656d6f76654c6971756964697479546f546f6b656e3a206044820152745f6c70206973204e6f6e204c50204164647265737360581b6064820152608401610849565b60008590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9a9190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612adc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b009190613d76565b604051635d5155ef60e11b81526001600160a01b0384811660048301528281166024830152604482018a9052600060648301819052608483018190523060a48401524260c484015292935082917f000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae9091169063baa2abde9060e40160408051808303816000875af1158015612b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbd9190613e9a565b915091506000886001600160a01b0316846001600160a01b031614612bed57612be884838b306130a5565b612bef565b815b896001600160a01b0316866001600160a01b031614612c1957612c1486858c306130a5565b612c1b565b835b612c259190613d5e565b9050612c3b6001600160a01b038a16898361337a565b9a9950505050505050505050565b6001600160a01b038216612cb75760405162461bcd60e51b815260206004820152602f60248201527f5a61703a5f616464546f6b656e3a205f746f6b656e416464726573732073686f60448201526e756c64206e6f74206265207a65726f60881b6064820152608401610849565b612cc082611189565b15612d1b5760405162461bcd60e51b815260206004820152602560248201527f5656535a61703a5f616464546f6b656e3a205f746f6b656e416464726573732060448201526406973204c560dc1b6064820152608401610849565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0385169081179091559054600082815260046020908152604091829020929092555183151581527f02fb12ee42ca4026d39d2102e2e3d3fcb4d12c158f8e0028f2f1eed6cf33ecbe910160405180910390a25050565b6001600160a01b038116612e2c5760405162461bcd60e51b815260206004820152603b60248201527f5a61703a5f616464496e7465726d656469617465546f6b656e3a205f746f6b6560448201527f6e416464726573732073686f756c64206e6f74206265207a65726f00000000006064820152608401610849565b612e3581611189565b15612e9c5760405162461bcd60e51b815260206004820152603160248201527f5656535a61703a5f616464496e7465726d656469617465546f6b656e3a205f7460448201527006f6b656e41646472657373206973204c5607c1b6064820152608401610849565b600780546001810182557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b03841690811790915590546000828152600660205260408082209290925590517fc15631f4ae3b982224d43ad1bd5b6ba064e060f12830bd78b02a43e183045aae9190a250565b6000612f77826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133aa9092919063ffffffff16565b8051909150156109435780806020019051810190612f959190613d26565b6109435760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610849565b6000612fff83611189565b6130605760405162461bcd60e51b815260206004820152602c60248201527f5656535a61703a5f73776170546f6b656e546f4c503a205f6c70206973204e6f60448201526b6e204c50204164647265737360a01b6064820152608401610849565b6000806000806130718989896133b9565b9350935093509350613082846128f2565b61308b826128f2565b613098848385848a6135e8565b9998505050505050505050565b6000806130b28685611f20565b90506130bd866128f2565b6040516338ed173960e01b81526000906001600160a01b037f000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae16906338ed173990613114908990859087908a904290600401613ebe565b6000604051808303816000875af1158015613133573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261315b9190810190613efa565b90506000816001835161316e9190613dae565b8151811061317e5761317e613dc5565b6020026020010151116131f95760405162461bcd60e51b815260206004820152603c60248201527f5656535a61703a5f73776170546f6b656e546f546f6b656e3a206f757470757460448201527f20616d6f756e747320696e76616c6964202d203020616d6f6f756e74000000006064820152608401610849565b7f6683da1ec942d96015ed8dc2a8e5ad662e6613fee8d7e488434713362a6b8c4f828260405161322a929190613f80565b60405180910390a180600182516132419190613dae565b8151811061325157613251613dc5565b602002602001015192505050949350505050565b8015806132df5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156132b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132dd9190613d0d565b155b61334a5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610849565b6040516001600160a01b03831660248201526044810182905261094390849063095ea7b360e01b9060640161287b565b6040516001600160a01b03831660248201526044810182905261094390849063a9059cbb60e01b9060640161287b565b60606128ea84846000856137fc565b60008060008060008590506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015613404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134289190613d76565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561346a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348e9190613d76565b9050600080836001600160a01b03168c6001600160a01b031614156134d6576134b860028c613fd7565b91506134cf8c6134c8848e613dae565b85306130a5565b90506135d5565b826001600160a01b03168c6001600160a01b03161415613519576134fb60028c613fd7565b90506135128c61350b838e613dae565b86306130a5565b91506135d5565b60006135258d8c6124ca565b90506000816001600160a01b03168e6001600160a01b0316146135535761354e8e8e84306130a5565b613555565b8c5b90506000613564600283613fd7565b905060006135728284613dae565b9050836001600160a01b0316886001600160a01b03161461359e5761359984838a306130a5565b6135a0565b815b9550836001600160a01b0316876001600160a01b0316146135cc576135c7848289306130a5565b6135ce565b805b9450505050505b9297509550935091505093509350935093565b60405162e8e33760e81b81526001600160a01b0386811660048301528581166024830152604482018590526064820184905260006084830181905260a4830181905283821660c48401524260e4840152918291829182917f000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae169063e8e3370090610104016060604051808303816000875af115801561368b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136af9190613ff9565b9194509250905060006136c28489613dae565b1115613753576001600160a01b03891663a9059cbb866136e2868b613dae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137519190613d26565b505b600061375f8388613dae565b11156137f0576001600160a01b03881663a9059cbb8661377f858a613dae565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156137ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ee9190613d26565b505b98975050505050505050565b60608247101561385d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610849565b843b6138ab5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610849565b600080866001600160a01b031685876040516138c79190614053565b60006040518083038185875af1925050503d8060008114613904576040519150601f19603f3d011682016040523d82523d6000602084013e613909565b606091505b5091509150613919828286613924565b979650505050505050565b60608315613933575081610a60565b8251156139435782518084602001fd5b8160405162461bcd60e51b8152600401610849919061406f565b5080546000825590600052602060002090810190611b5991906139e0565b8280548282559060005260206000209081019282156139d0579160200282015b828111156139d057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061399b565b506139dc9291506139e0565b5090565b5b808211156139dc57600081556001016139e1565b6001600160a01b0381168114611b5957600080fd5b60008060408385031215613a1d57600080fd5b8235613a28816139f5565b91506020830135613a38816139f5565b809150509250929050565b600081518084526020808501945080840160005b83811015613a7c5781516001600160a01b031687529582019590820190600101613a57565b509495945050505050565b602081526000610a606020830184613a43565b600060208284031215613aac57600080fd5b8135610a60816139f5565b60008060408385031215613aca57600080fd5b8235613ad5816139f5565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613b2257613b22613ae3565b604052919050565b600067ffffffffffffffff821115613b4457613b44613ae3565b5060051b60200190565b600080600060608486031215613b6357600080fd5b8335613b6e816139f5565b9250602084810135613b7f816139f5565b9250604085013567ffffffffffffffff811115613b9b57600080fd5b8501601f81018713613bac57600080fd5b8035613bbf613bba82613b2a565b613af9565b81815260059190911b82018301908381019089831115613bde57600080fd5b928401925b82841015613c05578335613bf6816139f5565b82529284019290840190613be3565b80955050505050509250925092565b60008060408385031215613c2757600080fd5b50508035926020909101359150565b600060208284031215613c4857600080fd5b5035919050565b60008060008060808587031215613c6557600080fd5b8435613c70816139f5565b9350602085013592506040850135613c87816139f5565b9396929550929360600135925050565b600080600060608486031215613cac57600080fd5b8335613cb7816139f5565b92506020840135613cc7816139f5565b929592945050506040919091013590565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d1f57600080fd5b5051919050565b600060208284031215613d3857600080fd5b81518015158114610a6057600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613d7157613d71613d48565b500190565b600060208284031215613d8857600080fd5b8151610a60816139f5565b6000600019821415613da757613da7613d48565b5060010190565b600082821015613dc057613dc0613d48565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602e908201527f5656535a61703a7a6170496e3a206f757470757420616d6f756e74206c65737360408201526d081d1a185b88195e1c1958dd195960921b606082015260800190565b604081526000613e896040830185613a43565b905082151560208301529392505050565b60008060408385031215613ead57600080fd5b505080516020909101519092909150565b85815284602082015260a060408201526000613edd60a0830186613a43565b6001600160a01b0394909416606083015250608001529392505050565b60006020808385031215613f0d57600080fd5b825167ffffffffffffffff811115613f2457600080fd5b8301601f81018513613f3557600080fd5b8051613f43613bba82613b2a565b81815260059190911b82018301908381019087831115613f6257600080fd5b928401925b8284101561391957835182529284019290840190613f67565b604081526000613f936040830185613a43565b82810360208481019190915284518083528582019282019060005b81811015613fca57845183529383019391830191600101613fae565b5090979650505050505050565b600082613ff457634e487b7160e01b600052601260045260246000fd5b500490565b60008060006060848603121561400e57600080fd5b8351925060208401519150604084015190509250925092565b60005b8381101561404257818101518382015260200161402a565b838111156108fb5750506000910152565b60008251614065818460208701614027565b9190910192915050565b602081526000825180602084015261408e816040850160208701614027565b601f01601f1916919091016040019291505056fea264697066735822122004d95cba6f71967ebb69ad52c89ff82a67744bb249faf57016d8d4e3a842466764736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae
-----Decoded View---------------
Arg [0] : _wcro (address): 0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23
Arg [1] : _router (address): 0x145863Eb42Cf62847A6Ca784e6416C1682b1b2Ae
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Arg [1] : 000000000000000000000000145863eb42cf62847a6ca784e6416c1682b1b2ae
Deployed Bytecode Sourcemap
36984:25211:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44106:151;;;;;;;;;;-1:-1:-1;44106:151:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37339:46;;;;;;;;;;-1:-1:-1;37339:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1692:14:1;;1685:22;1667:41;;1655:2;1640:18;37339:46:0;1527:187:1;61352:840:0;;;;;;:::i;:::-;;:::i;:::-;;44459:182;;;;;;;;;;-1:-1:-1;44459:182:0;;;;;:::i;:::-;;:::i;59811:178::-;;;;;;;;;;-1:-1:-1;59811:178:0;;;;;:::i;:::-;;:::i;43410:112::-;;;;;;;;;;-1:-1:-1;43410:112:0;;;;;:::i;:::-;;:::i;37124:29::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2203:32:1;;;2185:51;;2173:2;2158:18;37124:29:0;2039:203:1;44826:281:0;;;;;;;;;;-1:-1:-1;44826:281:0;;;;;:::i;:::-;;:::i;59308:199::-;;;;;;;;;;-1:-1:-1;59308:199:0;;;;;:::i;:::-;;:::i;46208:903::-;;;;;;;;;;-1:-1:-1;46208:903:0;;;;;:::i;:::-;;:::i;37203:36::-;;;;;;;;;;;;;;;37160;;;;;;;;;;;;;;;43635:102;;;;;;;;;;-1:-1:-1;43713:9:0;:16;43635:102;;;4956:25:1;;;4944:2;4929:18;43635:102:0;4810:177:1;45282:223:0;;;;;;;;;;-1:-1:-1;45282:223:0;;;;;:::i;:::-;;:::i;57286:494::-;;;;;;;;;;-1:-1:-1;57286:494:0;;;;;:::i;:::-;;:::i;43745:123::-;;;;;;;;;;-1:-1:-1;43745:123:0;;;;;:::i;:::-;;:::i;25988:103::-;;;;;;;;;;;;;:::i;58554:746::-;;;;;;;;;;-1:-1:-1;58554:746:0;;;;;:::i;:::-;;:::i;59515:288::-;;;;;;;;;;-1:-1:-1;59515:288:0;;;;;:::i;:::-;;:::i;43285:117::-;;;;;;;;;;-1:-1:-1;43285:117:0;;;;;:::i;:::-;;:::i;39183:900::-;;;;;;;;;;-1:-1:-1;39183:900:0;;;;;:::i;:::-;;:::i;25337:87::-;;;;;;;;;;-1:-1:-1;25383:7:0;25410:6;-1:-1:-1;;;;;25410:6:0;25337:87;;37477:53;;;;;;;;;;-1:-1:-1;37477:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;42932:156;;;;;;;;;;-1:-1:-1;42932:156:0;;;;;:::i;:::-;;:::i;37442:26::-;;;;;;;;;;-1:-1:-1;37442:26:0;;;;;:::i;:::-;;:::i;45827:215::-;;;;;;;;;;;;;:::i;41225:1649::-;;;;;;:::i;:::-;;:::i;60417:168::-;;;;;;;;;;-1:-1:-1;60417:168:0;;;;;:::i;:::-;;:::i;37246:35::-;;;;;;;;;;;;;;;;37584:68;;;;;;;;;;-1:-1:-1;37584:68:0;;;;;:::i;:::-;;:::i;37537:38::-;;;;;;;;;;-1:-1:-1;37537:38:0;;;;;:::i;:::-;;:::i;43096:181::-;;;;;;;;;;-1:-1:-1;43096:181:0;;;;;:::i;:::-;;:::i;56643:215::-;;;;;;;;;;-1:-1:-1;56643:215:0;;;;;:::i;:::-;;:::i;40486:644::-;;;;;;:::i;:::-;;:::i;43876:126::-;;;;;;;;;;-1:-1:-1;43966:21:0;:28;43876:126;;57788:291;;;;;;;;;;-1:-1:-1;57788:291:0;;;;;:::i;:::-;;:::i;37394:41::-;;;;;;;;;;-1:-1:-1;37394:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;43530:97;;;;;;;;;;-1:-1:-1;43530:97:0;;;;;:::i;:::-;;:::i;60289:120::-;;;;;;;;;;-1:-1:-1;60289:120:0;;;;;:::i;:::-;;:::i;26246:201::-;;;;;;;;;;-1:-1:-1;26246:201:0;;;;;:::i;:::-;;:::i;44106:151::-;-1:-1:-1;;;;;44220:20:0;;;;;;;:11;:20;;;;;;;;:29;;;;;;;;;;;;44213:36;;;;;;;;;;;;;;;;;44184:16;;44213:36;;;44220:29;44213:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44213:36:0;;;;;;;;;;;;;;;;;;;;;;;44106:151;;;;;:::o;61352:840::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;61450:20:0;::::1;61446:739;;61505:21;61545:11:::0;;61541:401:::1;;61581:12:::0;61577:350:::1;;61634:44;::::0;61619:9:::1;::::0;61642:10:::1;::::0;61666:7;;61619:9;61634:44;61619:9;61634:44;61666:7;61642:10;61634:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61618:60;;;61709:4;61701:37;;;::::0;-1:-1:-1;;;61701:37:0;;6941:2:1;61701:37:0::1;::::0;::::1;6923:21:1::0;6980:2;6960:18;;;6953:30;-1:-1:-1;;;6999:18:1;;;6992:50;7059:18;;61701:37:0::1;6739:344:1::0;61701:37:0::1;61595:163;61472:481;61352:840:::0;;:::o;61577:350::-:1;61803:44;::::0;61788:9:::1;::::0;61811:10:::1;::::0;61835:7;;61788:9;61803:44;61788:9;61803:44;61835:7;61811:10;61803:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61577:350;61472:481;61352:840:::0;;:::o;61446:739::-:1;61992:39;::::0;-1:-1:-1;;;61992:39:0;;62025:4:::1;61992:39;::::0;::::1;2185:51:1::0;61974:15:0::1;::::0;-1:-1:-1;;;;;61992:24:0;::::1;::::0;::::1;::::0;2158:18:1;;61992:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61974:57:::0;-1:-1:-1;62052:12:0;62048:70:::1;;62095:7;62085:17;;62048:70;62139:6;-1:-1:-1::0;;;;;62132:23:0::1;;62156:7;25383::::0;25410:6;-1:-1:-1;;;;;25410:6:0;;25337:87;62156:7:::1;62132:41;::::0;-1:-1:-1;;;;;;62132:41:0::1;::::0;;;;;;-1:-1:-1;;;;;7469:32:1;;;62132:41:0::1;::::0;::::1;7451:51:1::0;7518:18;;;7511:34;;;7424:18;;62132:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;61446:739::-;61352:840:::0;;:::o;44459:182::-;44552:16;44588:45;44612:10;44624:8;44588:23;:45::i;:::-;44581:52;44459:182;-1:-1:-1;;;44459:182:0:o;59811:178::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59906:19:0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;:27;;::::1;::::0;;;;;;;;59899:34:::1;::::0;::::1;:::i;:::-;59974:6;-1:-1:-1::0;;;;;59949:32:0::1;59966:6;-1:-1:-1::0;;;;;59949:32:0::1;;;;;;;;;;;59811:178:::0;;:::o;43410:112::-;-1:-1:-1;;;;;43492:16:0;43466:4;43492:16;;;:6;:16;;;;;;:21;43490:24;;43410:112::o;44826:281::-;44981:16;45022:77;45078:10;45090:8;45022:55;:77::i;59308:199::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;59453:46:::1;59468:7;59477;59486:5;59493;59453:14;:46::i;46208:903::-:0;46323:25;46351:7;-1:-1:-1;;;;;46351:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46323:52;;46430:17;46408:19;:39;46386:183;;;;-1:-1:-1;;;46386:183:0;;8040:2:1;46386:183:0;;;8022:21:1;8079:2;8059:18;;;8052:30;8118:34;8098:18;;;8091:62;8189:34;8169:18;;;8162:62;8261:32;8240:19;;;8233:61;8311:19;;46386:183:0;7838:498:1;46386:183:0;46580:22;46605:31;46627:9;46605:19;:31;:::i;:::-;46580:56;;46668:17;46651:14;:34;46647:101;;;-1:-1:-1;46719:17:0;46647:101;46775:19;46758:134;46800:14;46796:1;:18;46758:134;;;46854:19;;-1:-1:-1;;;46854:19:0;;;;;4956:25:1;;;46836:44:0;;46854:7;-1:-1:-1;;;;;46854:16:0;;;;4929:18:1;;46854:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46875:4;46836:17;:44::i;:::-;46816:3;;;;:::i;:::-;;;;46758:134;;;-1:-1:-1;46907:71:0;46938:19;46959:18;46976:1;46959:14;:18;:::i;:::-;46907:71;;;9306:25:1;;;9362:2;9347:18;;9340:34;;;;9279:18;46907:71:0;;;;;;;47016:18;47033:1;47016:14;:18;:::i;:::-;46993:20;;:41;46989:115;;;47074:18;47091:1;47074:14;:18;:::i;:::-;47051:20;:41;46312:799;;46208:903;;:::o;45282:223::-;45417:7;45449:48;45479:10;45491:5;45449:29;:48::i;57286:494::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57385:21:0;::::1;57360:22;57385:21:::0;;;:6:::1;:21;::::0;;;;;:25:::1;::::0;57409:1:::1;::::0;57385:25:::1;:::i;:::-;-1:-1:-1::0;;;;;57428:21:0;::::1;;::::0;;;:6:::1;:21;::::0;;;;57421:28;57482:9:::1;:16:::0;57360:50;;-1:-1:-1;57482:20:0::1;::::0;57501:1:::1;::::0;57482:20:::1;:::i;:::-;57464:14;:38;57460:245;;57545:9;57555:16:::0;;57519:23:::1;::::0;57545:9;57555:20:::1;::::0;57574:1:::1;::::0;57555:20:::1;:::i;:::-;57545:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;57591:9:::1;:25:::0;;-1:-1:-1;;;;;57545:31:0;;::::1;::::0;-1:-1:-1;57545:31:0;;57601:14;;57591:25;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:43:::0;;-1:-1:-1;;;;;;57591:43:0::1;-1:-1:-1::0;;;;;57591:43:0;;;::::1;::::0;;;::::1;::::0;;57675:18:::1;:14:::0;-1:-1:-1;57675:18:0::1;:::i;:::-;-1:-1:-1::0;;;;;57649:23:0;;::::1;;::::0;;;:6:::1;:23;::::0;;;;:44;57460:245:::1;57715:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;57715:15:0;;;;;-1:-1:-1;;;;;;57715:15:0::1;::::0;;;;;;;;57746:26:::1;::::0;-1:-1:-1;;;;;57746:26:0;::::1;::::0;::::1;::::0;::::1;57349:431;57286:494:::0;:::o;43745:123::-;43808:7;43835:21;43857:2;43835:25;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43835:25:0;;43745:123;-1:-1:-1;;43745:123:0:o;25988:103::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;26053:30:::1;26080:1;26053:18;:30::i;:::-;25988:103::o:0;58554:746::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58689:45:0;::::1;58652:34;58689:45:::0;;;:18:::1;:45;::::0;;;;;:49:::1;::::0;58737:1:::1;::::0;58689:49:::1;:::i;:::-;-1:-1:-1::0;;;;;58756:45:0;::::1;;::::0;;;:18:::1;:45;::::0;;;;58749:52;58846:21:::1;:28:::0;58652:86;;-1:-1:-1;58846:32:0::1;::::0;58877:1:::1;::::0;58846:32:::1;:::i;:::-;58816:26;:62;58812:377;;58933:21;58955:28:::0;;58895:35:::1;::::0;58933:21;58955:32:::1;::::0;58986:1:::1;::::0;58955:32:::1;:::i;:::-;58933:55;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;59003:21:::1;:49:::0;;-1:-1:-1;;;;;58933:55:0;;::::1;::::0;-1:-1:-1;58933:55:0;;59025:26;;59003:49;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:79:::0;;-1:-1:-1;;;;;;59003:79:0::1;-1:-1:-1::0;;;;;59003:79:0;;;::::1;::::0;;;::::1;::::0;;59147:30:::1;:26:::0;-1:-1:-1;59147:30:0::1;:::i;:::-;-1:-1:-1::0;;;;;59097:47:0;;::::1;;::::0;;;:18:::1;:47;::::0;;;;:80;58812:377:::1;59199:21;:27;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;59199:27:0;;;;;-1:-1:-1;;;;;;59199:27:0::1;::::0;;;;;;;;59242:50:::1;::::0;-1:-1:-1;;;;;59242:50:0;::::1;::::0;::::1;::::0;::::1;58641:659;58554:746:::0;:::o;59515:288::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;59619:176:::1;59648:7;59670;59692:73;59748:7;59757;59692:55;:73::i;:::-;59780:4;59619:14;:176::i;43285:117::-:0;-1:-1:-1;;;;;43362:24:0;43338:4;43362:24;;;:14;:24;;;;;;;;:32;;:24;:32;;43285:117::o;39183:900::-;39367:7;7369:1;7967:7;;:19;;7959:63;;;;-1:-1:-1;;;7959:63:0;;;;;;;:::i;:::-;7369:1;8100:7;:18;39395:19:::1;39403:10:::0;39395:7:::1;:19::i;:::-;39387:79;;;::::0;-1:-1:-1;;;39387:79:0;;10211:2:1;39387:79:0::1;::::0;::::1;10193:21:1::0;10250:2;10230:18;;;10223:30;10289:34;10269:18;;;10262:62;-1:-1:-1;;;10340:18:1;;;10333:45;10395:19;;39387:79:0::1;10009:411:1::0;39387:79:0::1;39485:21;39493:12;39485:7;:21::i;:::-;:43;;;;39510:18;39515:12;39510:4;:18::i;:::-;39477:111;;;::::0;-1:-1:-1;;;39477:111:0;;10627:2:1;39477:111:0::1;::::0;::::1;10609:21:1::0;10666:2;10646:18;;;10639:30;10705:34;10685:18;;;10678:62;10776:25;10756:18;;;10749:53;10819:19;;39477:111:0::1;10425:419:1::0;39477:111:0::1;39622:1;39607:12;:16;39599:71;;;::::0;-1:-1:-1;;;39599:71:0;;11051:2:1;39599:71:0::1;::::0;::::1;11033:21:1::0;11090:2;11070:18;;;11063:30;11129:34;11109:18;;;11102:62;-1:-1:-1;;;11180:18:1;;;11173:40;11230:19;;39599:71:0::1;10849:406:1::0;39599:71:0::1;39681:76;-1:-1:-1::0;;;;;39681:35:0;::::1;39717:10;39737:4;39744:12:::0;39681:35:::1;:76::i;:::-;39768:20;39791:67;39807:10;39819:12;39833;39847:10;39791:15;:67::i;:::-;39768:90;;39893:16;39877:12;:32;;39869:96;;;::::0;-1:-1:-1;;;39869:96:0;;11462:2:1;39869:96:0::1;::::0;::::1;11444:21:1::0;11501:2;11481:18;;;11474:30;11540:34;11520:18;;;11513:62;-1:-1:-1;;;11591:18:1;;;11584:49;11650:19;;39869:96:0::1;11260:415:1::0;39869:96:0::1;40004:12;-1:-1:-1::0;;;;;39981:64:0::1;39992:10;-1:-1:-1::0;;;;;39981:64:0::1;;40018:12;40032;39981:64;;;;;;9306:25:1::0;;;9362:2;9347:18;;9340:34;9294:2;9279:18;;9132:248;39981:64:0::1;;;;;;;;7325:1:::0;8279:22;;40063:12;39183:900;-1:-1:-1;;;;;39183:900:0:o;42932:156::-;43047:33;;-1:-1:-1;;;43047:33:0;;-1:-1:-1;;;;;11910:15:1;;;43047:33:0;;;11892:34:1;11962:15;;;11942:18;;;11935:43;43020:7:0;;43047;:15;;;;;;11827:18:1;;43047:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37442:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37442:26:0;;-1:-1:-1;37442:26:0;:::o;45827:215::-;45941:1;45914:7;-1:-1:-1;;;;;45914:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;;;:::i;:::-;45891:20;;:51;45887:148;;;45959:64;45999:20;;46021:1;45959:39;:64::i;41225:1649::-;41410:7;7369:1;7967:7;;:19;;7959:63;;;;-1:-1:-1;;;7959:63:0;;;;;;;:::i;:::-;7369:1;8100:7;:18;41438:13:::1;41443:7:::0;41438:4:::1;:13::i;:::-;41430:71;;;::::0;-1:-1:-1;;;41430:71:0;;12191:2:1;41430:71:0::1;::::0;::::1;12173:21:1::0;12230:2;12210:18;;;12203:30;12269:34;12249:18;;;12242:62;-1:-1:-1;;;12320:18:1;;;12313:43;12373:19;;41430:71:0::1;11989:409:1::0;41430:71:0::1;41531:12;-1:-1:-1::0;;;;;41520:23:0::1;:7;-1:-1:-1::0;;;;;41520:23:0::1;;;41512:65;;;::::0;-1:-1:-1;;;41512:65:0;;12605:2:1;41512:65:0::1;::::0;::::1;12587:21:1::0;12644:2;12624:18;;;12617:30;12683:31;12663:18;;;12656:59;12732:18;;41512:65:0::1;12403:353:1::0;41512:65:0::1;41611:1;41596:12;:16;41588:67;;;::::0;-1:-1:-1;;;41588:67:0;;12963:2:1;41588:67:0::1;::::0;::::1;12945:21:1::0;13002:2;12982:18;;;12975:30;13041:34;13021:18;;;13014:62;-1:-1:-1;;;13092:18:1;;;13085:36;13138:19;;41588:67:0::1;12761:402:1::0;41588:67:0::1;41666:73;-1:-1:-1::0;;;;;41666:32:0;::::1;41699:10;41719:4;41726:12:::0;41666:32:::1;:73::i;:::-;41750:30;41772:7;41750:21;:30::i;:::-;41791:20;41826:18;41831:12;41826:4;:18::i;:::-;41822:838;;;41861:21;41885:67;41909:7;41918:12;41932:4;41946;41885:23;:67::i;:::-;41861:91;;41982:62;41998:4;42004:13;42019:12;42033:10;41982:15;:62::i;:::-;41967:77;;41846:210;41822:838;;;42066:21;42074:12;42066:7;:21::i;:::-;42062:598;;;42119:72;42143:7;42152:12;42166;42180:10;42119:23;:72::i;:::-;42104:87;;42062:598;;;-1:-1:-1::0;;;;;42213:26:0;::::1;42209:451;;42305:67;42329:7;42338:12;42352:4;42366;42305:23;:67::i;:::-;42387:34;::::0;-1:-1:-1;;;42387:34:0;;::::1;::::0;::::1;4956:25:1::0;;;42290:82:0;;-1:-1:-1;42393:4:0::1;-1:-1:-1::0;;;;;42387:20:0::1;::::0;::::1;::::0;4929:18:1;;42387:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42452:49:0::1;::::0;42437:9:::1;::::0;-1:-1:-1;42460:10:0::1;::::0;-1:-1:-1;42484:12:0;;42437:9;42452:49;42437:9;42452:49;42484:12;42460:10;42452:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42436:65;;;42524:4;42516:37;;;::::0;-1:-1:-1;;;42516:37:0;;6941:2:1;42516:37:0::1;::::0;::::1;6923:21:1::0;6980:2;6960:18;;;6953:30;-1:-1:-1;;;6999:18:1;;;6992:50;7059:18;;42516:37:0::1;6739:344:1::0;42516:37:0::1;42241:324;42209:451;;;42586:62;::::0;-1:-1:-1;;;42586:62:0;;13370:2:1;42586:62:0::1;::::0;::::1;13352:21:1::0;13409:2;13389:18;;;13382:30;13448:34;13428:18;;;13421:62;-1:-1:-1;;;13499:18:1;;;13492:50;13559:19;;42586:62:0::1;13168:416:1::0;42209:451:0::1;42696:16;42680:12;:32;;42672:91;;;;-1:-1:-1::0;;;42672:91:0::1;;;;;;;:::i;:::-;42795:12;-1:-1:-1::0;;;;;42779:57:0::1;42786:7;-1:-1:-1::0;;;;;42779:57:0::1;;42809:12;42823;42779:57;;;;;;9306:25:1::0;;;9362:2;9347:18;;9340:34;9294:2;9279:18;;9132:248;60417:168:0;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60496:26:0;::::1;60525:5;60496:26:::0;;;:14:::1;:26;::::0;;;;;:34;;-1:-1:-1;;60496:34:0::1;::::0;;60546:31;::::1;::::0;60525:5;60546:31:::1;60417:168:::0;:::o;37584:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37584:68:0;;-1:-1:-1;37584:68:0;;-1:-1:-1;;37584:68:0:o;37537:38::-;;;;;;;;;;;;43096:181;43190:4;;43214:41;43238:7;43247;43214:23;:41::i;:::-;-1:-1:-1;;;;;43214:55:0;;;;43096:181;-1:-1:-1;;;43096:181:0:o;56643:215::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56722:21:0;::::1;;::::0;;;:6:::1;:21;::::0;;;;;:26;56714:94:::1;;;::::0;-1:-1:-1;;;56714:94:0;;14206:2:1;56714:94:0::1;::::0;::::1;14188:21:1::0;14245:2;14225:18;;;14218:30;14284:34;14264:18;;;14257:62;14355:25;14335:18;;;14328:53;14398:19;;56714:94:0::1;14004:419:1::0;56714:94:0::1;56819:31;56829:13;56844:5;56819:9;:31::i;:::-;56643:215:::0;:::o;40486:644::-;40588:7;7369:1;7967:7;;:19;;7959:63;;;;-1:-1:-1;;;7959:63:0;;;;;;;:::i;:::-;7369:1;8100:7;:18;40616:9:::1;40608:63;;;::::0;-1:-1:-1;;;40608:63:0;;14630:2:1;40608:63:0::1;::::0;::::1;14612:21:1::0;14669:2;14649:18;;;14642:30;14708:34;14688:18;;;14681:62;-1:-1:-1;;;14759:18:1;;;14752:35;14804:19;;40608:63:0::1;14428:401:1::0;40608:63:0::1;40688:4;-1:-1:-1::0;;;;;40682:19:0::1;;40709:9;40682:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;40740:21;40748:12;40740:7;:21::i;:::-;:43;;;;40765:18;40770:12;40765:4;:18::i;:::-;40732:106;;;::::0;-1:-1:-1;;;40732:106:0;;15036:2:1;40732:106:0::1;::::0;::::1;15018:21:1::0;15075:2;15055:18;;;15048:30;15114:34;15094:18;;;15087:62;-1:-1:-1;;;15165:18:1;;;15158:48;15223:19;;40732:106:0::1;14834:414:1::0;40732:106:0::1;40849:20;40872:58;40888:4;40894:9;40905:12;40919:10;40872:15;:58::i;:::-;40849:81;;40965:16;40949:12;:32;;40941:91;;;;-1:-1:-1::0;;;40941:91:0::1;;;;;;;:::i;:::-;41048:44;::::0;;41068:9:::1;9306:25:1::0;;9362:2;9347:18;;9340:34;;;-1:-1:-1;;;;;41048:44:0;::::1;::::0;::::1;::::0;9279:18:1;41048:44:0::1;;;;;;;7325:1:::0;8279:22;;41110:12;40486:644;-1:-1:-1;;;40486:644:0:o;57788:291::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57891:33:0;::::1;;::::0;;;:18:::1;:33;::::0;;;;;:38;57869:155:::1;;;::::0;-1:-1:-1;;;57869:155:0;;15455:2:1;57869:155:0::1;::::0;::::1;15437:21:1::0;15494:2;15474:18;;;15467:30;15533:34;15513:18;;;15506:62;15604:34;15584:18;;;15577:62;-1:-1:-1;;;15655:19:1;;;15648:34;15699:19;;57869:155:0::1;15253:471:1::0;57869:155:0::1;58035:36;58057:13;58035:21;:36::i;43530:97::-:0;43580:7;43607:9;43617:1;43607:12;;;;;;;;:::i;60289:120::-;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;60365:36:::1;60383:10;60395:5;60365:17;:36::i;26246:201::-:0;25383:7;25410:6;-1:-1:-1;;;;;25410:6:0;24137:10;25557:23;25549:68;;;;-1:-1:-1;;;25549:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26335:22:0;::::1;26327:73;;;::::0;-1:-1:-1;;;26327:73:0;;15931:2:1;26327:73:0::1;::::0;::::1;15913:21:1::0;15970:2;15950:18;;;15943:30;16009:34;15989:18;;;15982:62;-1:-1:-1;;;16060:18:1;;;16053:36;16106:19;;26327:73:0::1;15729:402:1::0;26327:73:0::1;26411:28;26430:8;26411:18;:28::i;52835:788::-:0;52928:16;52957:21;53011:8;-1:-1:-1;;;;;52997:22:0;:10;-1:-1:-1;;;;;52997:22:0;;;52989:91;;;;-1:-1:-1;;;52989:91:0;;16338:2:1;52989:91:0;;;16320:21:1;16377:2;16357:18;;;16350:30;16416:34;16396:18;;;16389:62;16487:26;16467:18;;;16460:54;16531:19;;52989:91:0;16136:420:1;52989:91:0;53095:51;53125:10;53137:8;53095:29;:51::i;:::-;53091:405;;;53170:16;;;53184:1;53170:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53170:16:0;53163:23;;53211:10;53201:4;53206:1;53201:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1;;;;;53201:20:0;;;-1:-1:-1;;;;;53201:20:0;;;;;53246:8;53236:4;53241:1;53236:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;53236:18:0;;;-1:-1:-1;;;;;53236:18:0;;;;;53091:405;;;53294:35;53308:10;53320:8;53294:13;:35::i;:::-;53287:42;;53348:4;:11;53363:1;53348:16;53344:141;;;53392:77;53448:10;53460:8;53392:55;:77::i;:::-;53385:84;;53344:141;53528:1;53514:4;:11;:15;53506:87;;;;-1:-1:-1;;;53506:87:0;;16763:2:1;53506:87:0;;;16745:21:1;16802:2;16782:18;;;16775:30;16841:34;16821:18;;;16814:62;16912:29;16892:18;;;16885:57;16959:19;;53506:87:0;16561:423:1;55697:882:0;55849:16;55883:21;55920:9;55915:635;55939:21;:28;55935:32;;55915:635;;;55989:25;56017:21;56039:1;56017:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;56017:24:0;;;;-1:-1:-1;56078:31:0;;;;;;;:81;;;56142:17;-1:-1:-1;;;;;56130:29:0;:8;-1:-1:-1;;;;;56130:29:0;;;56078:81;:162;;;;;56180:60;56210:10;56222:17;56180:29;:60::i;:::-;56078:241;;;;;56261:58;56291:17;56310:8;56261:29;:58::i;:::-;56056:483;;;56361:16;;;56375:1;56361:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56361:16:0;56354:23;;56406:10;56396:4;56401:1;56396:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1;;;;;56396:20:0;;;-1:-1:-1;;;;;56396:20:0;;;;;56445:17;56435:4;56440:1;56435:7;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;56435:27:0;;;-1:-1:-1;;;;;56435:27:0;;;;;56491:8;56481:4;56486:1;56481:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;56481:18:0;;;-1:-1:-1;;;;;56481:18:0;;;;;56518:5;;;56056:483;-1:-1:-1;55969:3:0;;;;:::i;:::-;;;;55915:635;;;-1:-1:-1;56567:4:0;55697:882;-1:-1:-1;;;55697:882:0:o;59997:284::-;-1:-1:-1;;;;;60164:20:0;;;;;;;:11;:20;;;;;;;;:29;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;60240:7;-1:-1:-1;;;;;60217:56:0;60231:7;-1:-1:-1;;;;;60217:56:0;;60249:5;60256:16;60217:56;;;;;;;:::i;:::-;;;;;;;;59997:284;;;;:::o;60593:680::-;-1:-1:-1;;;;;60688:24:0;;60680:89;;;;-1:-1:-1;;;60680:89:0;;17538:2:1;60680:89:0;;;17520:21:1;17577:2;17557:18;;;17550:30;17616:34;17596:18;;;17589:62;-1:-1:-1;;;17667:18:1;;;17660:50;17727:19;;60680:89:0;17336:416:1;60680:89:0;-1:-1:-1;;;;;60785:26:0;;;;;;:14;:26;;;;;;;;60780:486;;60828:13;60853:10;60828:36;;60879:14;60896:4;-1:-1:-1;;;;;60896:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60879:30;;60924:14;60941:4;-1:-1:-1;;;;;60941:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60924:30;;60974:15;60982:6;60974:7;:15::i;:::-;60969:80;;61010:23;61020:6;61028:4;61010:9;:23::i;:::-;61068:15;61076:6;61068:7;:15::i;:::-;61063:80;;61104:23;61114:6;61122:4;61104:9;:23::i;:::-;-1:-1:-1;;;;;61157:26:0;;;;;;:14;:26;;;;;;;:33;;-1:-1:-1;;61157:33:0;61186:4;61157:33;;;61210:44;;;;;61239:14;1692::1;1685:22;1667:41;;1655:2;1640:18;;1527:187;61210:44:0;;;;;;;;60813:453;;;60593:680;;:::o;53631:2058::-;53727:7;53747:13;53772:5;53747:31;;53789:14;53806:4;-1:-1:-1;;;;;53806:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53789:30;;53830:14;53847:4;-1:-1:-1;;;;;53847:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53830:30;;53956:6;-1:-1:-1;;;;;53942:20:0;:10;-1:-1:-1;;;;;53942:20:0;;:44;;;;53980:6;-1:-1:-1;;;;;53966:20:0;:10;-1:-1:-1;;;;;53966:20:0;;53942:44;53938:94;;;54010:10;54003:17;;;;;;;53938:94;-1:-1:-1;;;;;54046:26:0;;54075:1;54046:26;;;:18;:26;;;;;;:30;54042:433;;-1:-1:-1;;;;;54115:26:0;;54144:1;54115:26;;;:18;:26;;;;;;:30;;;;:101;;;54167:49;54197:10;54209:6;54167:29;:49::i;:::-;54166:50;54115:101;:171;;;;;54237:49;54267:10;54279:6;54237:29;:49::i;:::-;54093:343;;;54414:6;-1:-1:-1;54407:13:0;;-1:-1:-1;;54407:13:0;54093:343;-1:-1:-1;54457:6:0;-1:-1:-1;54450:13:0;;-1:-1:-1;54450:13:0;54042:433;-1:-1:-1;;;;;54489:26:0;;54518:1;54489:26;;;:18;:26;;;;;;:30;54485:76;;54543:6;-1:-1:-1;54536:13:0;;-1:-1:-1;;54536:13:0;54485:76;-1:-1:-1;;;;;54589:30:0;;54622:1;54589:30;;;:18;:30;;;;;;:34;;;;:100;;;54640:49;54670:10;54682:6;54640:29;:49::i;:::-;54589:166;;;;;54706:49;54736:10;54748:6;54706:29;:49::i;:::-;54571:240;;;54789:10;54782:17;;;;;;;54571:240;54821:29;;54861:629;54885:21;:28;54881:32;;54861:629;;;54935:25;54963:21;54985:1;54963:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;54963:24:0;;-1:-1:-1;55024:56:0;54963:24;55073:6;55024:29;:56::i;:::-;:133;;;;;55101:56;55131:17;55150:6;55101:29;:56::i;:::-;55002:477;;;55196:60;55226:10;55238:17;55196:29;:60::i;:::-;55192:133;;;55288:17;-1:-1:-1;55281:24:0;;-1:-1:-1;;;;;55281:24:0;55192:133;-1:-1:-1;;;;;55347:31:0;;;55343:121;;55427:17;55403:41;;55343:121;-1:-1:-1;54915:3:0;;;;:::i;:::-;;;;54861:629;;;-1:-1:-1;;;;;;55504:35:0;;;55500:96;;55563:21;-1:-1:-1;55556:28:0;;-1:-1:-1;;;55556:28:0;55500:96;55606:75;;-1:-1:-1;;;55606:75:0;;17959:2:1;55606:75:0;;;17941:21:1;17998:2;17978:18;;;17971:30;18037:34;18017:18;;;18010:62;18108:34;18088:18;;;18081:62;-1:-1:-1;;;18159:19:1;;;18152:32;18201:19;;55606:75:0;17757:469:1;26607:191:0;26681:16;26700:6;;-1:-1:-1;;;;;26717:17:0;;;-1:-1:-1;;;;;;26717:17:0;;;;;;26750:40;;26700:6;;;;;;;26750:40;;26681:16;26750:40;26670:128;26607:191;:::o;20295:248::-;20466:68;;-1:-1:-1;;;;;18489:15:1;;;20466:68:0;;;18471:34:1;18541:15;;18521:18;;;18514:43;18573:18;;;18566:34;;;20439:96:0;;20459:5;;-1:-1:-1;;;20489:27:0;18406:18:1;;20466:68:0;;;;-1:-1:-1;;20466:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20466:68:0;-1:-1:-1;;;;;;20466:68:0;;;;;;;;;;20439:19;:96::i;48174:399::-;48323:7;48343:28;48365:5;48343:21;:28::i;:::-;48386:9;48391:3;48386:4;:9::i;:::-;48382:184;;;48419:46;48434:5;48441:7;48450:3;48455:9;48419:14;:46::i;:::-;48412:53;;;;48382:184;48505:49;48523:5;48530:7;48539:3;48544:9;48505:17;:49::i;48382:184::-;48174:399;;;;;;:::o;48581:226::-;48650:55;;-1:-1:-1;;;48650:55:0;;48682:4;48650:55;;;11892:34:1;-1:-1:-1;;;;;48697:6:0;11962:15:1;;11942:18;;;11935:43;48650:23:0;;;;;11827:18:1;;48650:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48646:154;;48727:61;-1:-1:-1;;;;;48727:25:0;;48761:6;-1:-1:-1;;48727:25:0;:61::i;47172:994::-;47332:7;47360:9;47365:3;47360:4;:9::i;:::-;47352:75;;;;-1:-1:-1;;;47352:75:0;;18813:2:1;47352:75:0;;;18795:21:1;18852:2;18832:18;;;18825:30;18891:34;18871:18;;;18864:62;-1:-1:-1;;;18942:18:1;;;18935:51;19003:19;;47352:75:0;18611:417:1;47352:75:0;47438:13;47463:3;47438:29;;47478:14;47495:4;-1:-1:-1;;;;;47495:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47478:30;;47519:14;47536:4;-1:-1:-1;;;;;47536:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47607:187;;-1:-1:-1;;;47607:187:0;;-1:-1:-1;;;;;19420:15:1;;;47607:187:0;;;19402:34:1;19472:15;;;19452:18;;;19445:43;19504:18;;;19497:34;;;-1:-1:-1;19547:18:1;;;19540:34;;;19590:19;;;19583:35;;;47748:4:0;19634:19:1;;;19627:44;47768:15:0;19687:19:1;;;19680:35;19472:15;;-1:-1:-1;;;47607:6:0;:22;;;;;;19336:19:1;;47607:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47560:234;;;;47805:20;47971:8;-1:-1:-1;;;;;47961:18:0;:6;-1:-1:-1;;;;;47961:18:0;;47960:102;;47998:64;48016:6;48024:12;48038:8;48056:4;47998:17;:64::i;:::-;47960:102;;;47983:12;47960:102;47854:8;-1:-1:-1;;;;;47844:18:0;:6;-1:-1:-1;;;;;47844:18:0;;47843:102;;47881:64;47899:6;47907:12;47921:8;47939:4;47881:17;:64::i;:::-;47843:102;;;47866:12;47843:102;47828:235;;;;:::i;:::-;47805:258;-1:-1:-1;48074:54:0;-1:-1:-1;;;;;48074:29:0;;48104:9;47805:258;48074:29;:54::i;:::-;48146:12;47172:994;-1:-1:-1;;;;;;;;;;47172:994:0:o;56866:412::-;-1:-1:-1;;;;;56956:27:0;;56948:87;;;;-1:-1:-1;;;56948:87:0;;20178:2:1;56948:87:0;;;20160:21:1;20217:2;20197:18;;;20190:30;20256:34;20236:18;;;20229:62;-1:-1:-1;;;20307:18:1;;;20300:45;20362:19;;56948:87:0;19976:411:1;56948:87:0;57054:19;57059:13;57054:4;:19::i;:::-;:28;57046:78;;;;-1:-1:-1;;;57046:78:0;;20594:2:1;57046:78:0;;;20576:21:1;20633:2;20613:18;;;20606:30;20672:34;20652:18;;;20645:62;-1:-1:-1;;;20723:18:1;;;20716:35;20768:19;;57046:78:0;20392:401:1;57046:78:0;57135:9;:29;;;;;;;;;;;-1:-1:-1;;;;;;57135:29:0;-1:-1:-1;;;;;57135:29:0;;;;;;;;57199:16;;-1:-1:-1;57175:21:0;;;:6;57135:29;57175:21;;;;;;;;:40;;;;57231:39;1692:14:1;;1685:22;1667:41;;57231:39:0;;1640:18:1;57231:39:0;;;;;;;56866:412;;:::o;58087:459::-;-1:-1:-1;;;;;58168:27:0;;58160:99;;;;-1:-1:-1;;;58160:99:0;;21000:2:1;58160:99:0;;;20982:21:1;21039:2;21019:18;;;21012:30;21078:34;21058:18;;;21051:62;21149:29;21129:18;;;21122:57;21196:19;;58160:99:0;20798:423:1;58160:99:0;58278:19;58283:13;58278:4;:19::i;:::-;:28;58270:90;;;;-1:-1:-1;;;58270:90:0;;21428:2:1;58270:90:0;;;21410:21:1;21467:2;21447:18;;;21440:30;21506:34;21486:18;;;21479:62;-1:-1:-1;;;21557:18:1;;;21550:47;21614:19;;58270:90:0;21226:413:1;58270:90:0;58371:21;:41;;;;;;;;;;;-1:-1:-1;;;;;;58371:41:0;-1:-1:-1;;;;;58371:41:0;;;;;;;;58459:28;;-1:-1:-1;58423:33:0;;;:18;58371:41;58423:33;;;;;:64;;;;58503:35;;;;-1:-1:-1;58503:35:0;58087:459;:::o;22649:716::-;23073:23;23099:69;23127:4;23099:69;;;;;;;;;;;;;;;;;23107:5;-1:-1:-1;;;;;23099:27:0;;;:69;;;;;:::i;:::-;23183:17;;23073:95;;-1:-1:-1;23183:21:0;23179:179;;23280:10;23269:30;;;;;;;;;;;;:::i;:::-;23261:85;;;;-1:-1:-1;;;23261:85:0;;21846:2:1;23261:85:0;;;21828:21:1;21885:2;21865:18;;;21858:30;21924:34;21904:18;;;21897:62;-1:-1:-1;;;21975:18:1;;;21968:40;22025:19;;23261:85:0;21644:406:1;48815:647:0;48977:7;49005:9;49010:3;49005:4;:9::i;:::-;48997:66;;;;-1:-1:-1;;;48997:66:0;;22257:2:1;48997:66:0;;;22239:21:1;22296:2;22276:18;;;22269:30;22335:34;22315:18;;;22308:62;-1:-1:-1;;;22386:18:1;;;22379:42;22438:19;;48997:66:0;22055:408:1;48997:66:0;49075:14;49091:20;49113:14;49129:20;49153:111;49194:10;49219:16;49250:3;49153:26;:111::i;:::-;49074:190;;;;;;;;49275:29;49297:6;49275:21;:29::i;:::-;49315;49337:6;49315:21;:29::i;:::-;49362:92;49400:6;49408;49416:12;49430;49444:9;49362:37;:92::i;:::-;49355:99;48815:647;-1:-1:-1;;;;;;;;;48815:647:0:o;52187:640::-;52352:7;52372:21;52396:45;52420:10;52432:8;52396:23;:45::i;:::-;52372:69;;52452:33;52474:10;52452:21;:33::i;:::-;52523:81;;-1:-1:-1;;;52523:81:0;;52496:24;;-1:-1:-1;;;;;52523:6:0;:31;;;;:81;;52555:11;;52496:24;;52571:4;;52577:9;;52588:15;;52523:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52523:81:0;;;;;;;;;;;;:::i;:::-;52496:108;;52653:1;52623:7;52648:1;52631:7;:14;:18;;;;:::i;:::-;52623:27;;;;;;;;:::i;:::-;;;;;;;:31;52615:104;;;;-1:-1:-1;;;52615:104:0;;24143:2:1;52615:104:0;;;24125:21:1;24182:2;24162:18;;;24155:30;24221:34;24201:18;;;24194:62;24292:30;24272:18;;;24265:58;24340:19;;52615:104:0;23941:424:1;52615:104:0;52735:39;52760:4;52766:7;52735:39;;;;;;;:::i;:::-;;;;;;;;52792:7;52817:1;52800:7;:14;:18;;;;:::i;:::-;52792:27;;;;;;;;:::i;:::-;;;;;;;52785:34;;;;52187:640;;;;;;:::o;20812:616::-;21176:10;;;21175:62;;-1:-1:-1;21192:39:0;;-1:-1:-1;;;21192:39:0;;21216:4;21192:39;;;11892:34:1;-1:-1:-1;;;;;11962:15:1;;;11942:18;;;11935:43;21192:15:0;;;;;11827:18:1;;21192:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;21175:62;21153:166;;;;-1:-1:-1;;;21153:166:0;;25381:2:1;21153:166:0;;;25363:21:1;25420:2;25400:18;;;25393:30;25459:34;25439:18;;;25432:62;-1:-1:-1;;;25510:18:1;;;25503:52;25572:19;;21153:166:0;25179:418:1;21153:166:0;21357:62;;-1:-1:-1;;;;;7469:32:1;;21357:62:0;;;7451:51:1;7518:18;;;7511:34;;;21330:90:0;;21350:5;;-1:-1:-1;;;21380:22:0;7424:18:1;;21357:62:0;7277:274:1;20076:211:0;20220:58;;-1:-1:-1;;;;;7469:32:1;;20220:58:0;;;7451:51:1;7518:18;;;7511:34;;;20193:86:0;;20213:5;;-1:-1:-1;;;20243:23:0;7424:18:1;;20220:58:0;7277:274:1;14850:229:0;14987:12;15019:52;15041:6;15049:4;15055:1;15058:12;15019:21;:52::i;50266:1913::-;50444:7;50466;50488;50510;50545:13;50570:3;50545:29;;50585:14;50602:4;-1:-1:-1;;;;;50602:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50585:30;;50626:14;50643:4;-1:-1:-1;;;;;50643:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50626:30;;50667:20;50698;50747:6;-1:-1:-1;;;;;50733:20:0;:10;-1:-1:-1;;;;;50733:20:0;;50729:1381;;;50785:20;50804:1;50785:16;:20;:::i;:::-;50770:35;-1:-1:-1;50835:85:0;50853:10;50865:31;50770:35;50865:16;:31;:::i;:::-;50898:6;50914:4;50835:17;:85::i;:::-;50820:100;;50729:1381;;;50956:6;-1:-1:-1;;;;;50942:20:0;:10;-1:-1:-1;;;;;50942:20:0;;50938:1172;;;50994:20;51013:1;50994:16;:20;:::i;:::-;50979:35;-1:-1:-1;51044:85:0;51062:10;51074:31;50979:35;51074:16;:31;:::i;:::-;51107:6;51123:4;51044:17;:85::i;:::-;51029:100;;50938:1172;;;51162:25;51190:46;51220:10;51232:3;51190:29;:46::i;:::-;51162:74;;51251:31;51299:17;-1:-1:-1;;;;;51285:31:0;:10;-1:-1:-1;;;;;51285:31:0;;:168;;51372:81;51390:10;51402:16;51420:17;51447:4;51372:17;:81::i;:::-;51285:168;;;51336:16;51285:168;51251:202;-1:-1:-1;51468:40:0;51511:27;51537:1;51251:202;51511:27;:::i;:::-;51468:70;-1:-1:-1;51553:40:0;51596:58;51468:70;51596:23;:58;:::i;:::-;51553:101;;51694:17;-1:-1:-1;;;;;51684:27:0;:6;-1:-1:-1;;;;;51684:27:0;;:192;;51783:93;51801:17;51820:32;51854:6;51870:4;51783:17;:93::i;:::-;51684:192;;;51731:32;51684:192;51669:207;;51916:17;-1:-1:-1;;;;;51906:27:0;:6;-1:-1:-1;;;;;51906:27:0;;:192;;52005:93;52023:17;52042:32;52076:6;52092:4;52005:17;:93::i;:::-;51906:192;;;51953:32;51906:192;51891:207;;51147:963;;;;50938:1172;52128:6;;-1:-1:-1;52136:12:0;-1:-1:-1;52150:6:0;-1:-1:-1;52158:12:0;-1:-1:-1;;50266:1913:0;;;;;;;:::o;49470:788::-;49757:212;;-1:-1:-1;;;49757:212:0;;-1:-1:-1;;;;;26239:15:1;;;49757:212:0;;;26221:34:1;26291:15;;;26271:18;;;26264:43;26323:18;;;26316:34;;;26366:18;;;26359:34;;;49681:7:0;26409:19:1;;;26402:35;;;26453:19;;;26446:35;;;26518:15;;;26497:19;;;26490:44;49943:15:0;26550:19:1;;;26543:35;49681:7:0;;;;;;;49757:6;:19;;;;26155::1;;49757:212:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49701:268;;-1:-1:-1;49701:268:0;-1:-1:-1;49701:268:0;-1:-1:-1;50009:1:0;49984:22;49701:268;49984:12;:22;:::i;:::-;:26;49980:117;;;-1:-1:-1;;;;;50027:23:0;;;50051:9;50062:22;50077:7;50062:12;:22;:::i;:::-;50027:58;;-1:-1:-1;;;;;;50027:58:0;;;;;;;-1:-1:-1;;;;;7469:32:1;;;50027:58:0;;;7451:51:1;7518:18;;;7511:34;7424:18;;50027:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49980:117;50136:1;50111:22;50126:7;50111:12;:22;:::i;:::-;:26;50107:117;;;-1:-1:-1;;;;;50154:23:0;;;50178:9;50189:22;50204:7;50189:12;:22;:::i;:::-;50154:58;;-1:-1:-1;;;;;;50154:58:0;;;;;;;-1:-1:-1;;;;;7469:32:1;;;50154:58:0;;;7451:51:1;7518:18;;;7511:34;7424:18;;50154:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50107:117;50241:9;49470:788;-1:-1:-1;;;;;;;;49470:788:0:o;15970:510::-;16140:12;16198:5;16173:21;:30;;16165:81;;;;-1:-1:-1;;;16165:81:0;;27102:2:1;16165:81:0;;;27084:21:1;27141:2;27121:18;;;27114:30;27180:34;27160:18;;;27153:62;-1:-1:-1;;;27231:18:1;;;27224:36;27277:19;;16165:81:0;26900:402:1;16165:81:0;12367:20;;16257:60;;;;-1:-1:-1;;;16257:60:0;;27509:2:1;16257:60:0;;;27491:21:1;27548:2;27528:18;;;27521:30;27587:31;27567:18;;;27560:59;27636:18;;16257:60:0;27307:353:1;16257:60:0;16331:12;16345:23;16372:6;-1:-1:-1;;;;;16372:11:0;16391:5;16398:4;16372:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16330:73;;;;16421:51;16438:7;16447:10;16459:12;16421:16;:51::i;:::-;16414:58;15970:510;-1:-1:-1;;;;;;;15970:510:0:o;18656:712::-;18806:12;18835:7;18831:530;;;-1:-1:-1;18866:10:0;18859:17;;18831:530;18980:17;;:21;18976:374;;19178:10;19172:17;19239:15;19226:10;19222:2;19218:19;19211:44;18976:374;19321:12;19314:20;;-1:-1:-1;;;19314:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:388;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;-1:-1:-1;460:2:1;445:18;;432:32;473:33;432:32;473:33;:::i;:::-;525:7;515:17;;;150:388;;;;;:::o;543:461::-;596:3;634:5;628:12;661:6;656:3;649:19;687:4;716:2;711:3;707:12;700:19;;753:2;746:5;742:14;774:1;784:195;798:6;795:1;792:13;784:195;;;863:13;;-1:-1:-1;;;;;859:39:1;847:52;;919:12;;;;954:15;;;;895:1;813:9;784:195;;;-1:-1:-1;995:3:1;;543:461;-1:-1:-1;;;;;543:461:1:o;1009:261::-;1188:2;1177:9;1170:21;1151:4;1208:56;1260:2;1249:9;1245:18;1237:6;1208:56;:::i;1275:247::-;1334:6;1387:2;1375:9;1366:7;1362:23;1358:32;1355:52;;;1403:1;1400;1393:12;1355:52;1442:9;1429:23;1461:31;1486:5;1461:31;:::i;1719:315::-;1787:6;1795;1848:2;1836:9;1827:7;1823:23;1819:32;1816:52;;;1864:1;1861;1854:12;1816:52;1903:9;1890:23;1922:31;1947:5;1922:31;:::i;:::-;1972:5;2024:2;2009:18;;;;1996:32;;-1:-1:-1;;;1719:315:1:o;2247:127::-;2308:10;2303:3;2299:20;2296:1;2289:31;2339:4;2336:1;2329:15;2363:4;2360:1;2353:15;2379:275;2450:2;2444:9;2515:2;2496:13;;-1:-1:-1;;2492:27:1;2480:40;;2550:18;2535:34;;2571:22;;;2532:62;2529:88;;;2597:18;;:::i;:::-;2633:2;2626:22;2379:275;;-1:-1:-1;2379:275:1:o;2659:183::-;2719:4;2752:18;2744:6;2741:30;2738:56;;;2774:18;;:::i;:::-;-1:-1:-1;2819:1:1;2815:14;2831:4;2811:25;;2659:183::o;2847:1248::-;2949:6;2957;2965;3018:2;3006:9;2997:7;2993:23;2989:32;2986:52;;;3034:1;3031;3024:12;2986:52;3073:9;3060:23;3092:31;3117:5;3092:31;:::i;:::-;3142:5;-1:-1:-1;3166:2:1;3205:18;;;3192:32;3233:33;3192:32;3233:33;:::i;:::-;3285:7;-1:-1:-1;3343:2:1;3328:18;;3315:32;3370:18;3359:30;;3356:50;;;3402:1;3399;3392:12;3356:50;3425:22;;3478:4;3470:13;;3466:27;-1:-1:-1;3456:55:1;;3507:1;3504;3497:12;3456:55;3543:2;3530:16;3566:60;3582:43;3622:2;3582:43;:::i;:::-;3566:60;:::i;:::-;3660:15;;;3742:1;3738:10;;;;3730:19;;3726:28;;;3691:12;;;;3766:19;;;3763:39;;;3798:1;3795;3788:12;3763:39;3822:11;;;;3842:223;3858:6;3853:3;3850:15;3842:223;;;3940:3;3927:17;3957:33;3982:7;3957:33;:::i;:::-;4003:20;;3875:12;;;;4043;;;;3842:223;;;4084:5;4074:15;;;;;;;2847:1248;;;;;:::o;4100:248::-;4168:6;4176;4229:2;4217:9;4208:7;4204:23;4200:32;4197:52;;;4245:1;4242;4235:12;4197:52;-1:-1:-1;;4268:23:1;;;4338:2;4323:18;;;4310:32;;-1:-1:-1;4100:248:1:o;4992:180::-;5051:6;5104:2;5092:9;5083:7;5079:23;5075:32;5072:52;;;5120:1;5117;5110:12;5072:52;-1:-1:-1;5143:23:1;;4992:180;-1:-1:-1;4992:180:1:o;5177:525::-;5263:6;5271;5279;5287;5340:3;5328:9;5319:7;5315:23;5311:33;5308:53;;;5357:1;5354;5347:12;5308:53;5396:9;5383:23;5415:31;5440:5;5415:31;:::i;:::-;5465:5;-1:-1:-1;5517:2:1;5502:18;;5489:32;;-1:-1:-1;5573:2:1;5558:18;;5545:32;5586:33;5545:32;5586:33;:::i;:::-;5177:525;;;;-1:-1:-1;5638:7:1;;5692:2;5677:18;5664:32;;-1:-1:-1;;5177:525:1:o;5707:456::-;5784:6;5792;5800;5853:2;5841:9;5832:7;5828:23;5824:32;5821:52;;;5869:1;5866;5859:12;5821:52;5908:9;5895:23;5927:31;5952:5;5927:31;:::i;:::-;5977:5;-1:-1:-1;6034:2:1;6019:18;;6006:32;6047:33;6006:32;6047:33;:::i;:::-;5707:456;;6099:7;;-1:-1:-1;;;6153:2:1;6138:18;;;;6125:32;;5707:456::o;6168:356::-;6370:2;6352:21;;;6389:18;;;6382:30;6448:34;6443:2;6428:18;;6421:62;6515:2;6500:18;;6168:356::o;7088:184::-;7158:6;7211:2;7199:9;7190:7;7186:23;7182:32;7179:52;;;7227:1;7224;7217:12;7179:52;-1:-1:-1;7250:16:1;;7088:184;-1:-1:-1;7088:184:1:o;7556:277::-;7623:6;7676:2;7664:9;7655:7;7651:23;7647:32;7644:52;;;7692:1;7689;7682:12;7644:52;7724:9;7718:16;7777:5;7770:13;7763:21;7756:5;7753:32;7743:60;;7799:1;7796;7789:12;8341:127;8402:10;8397:3;8393:20;8390:1;8383:31;8433:4;8430:1;8423:15;8457:4;8454:1;8447:15;8473:128;8513:3;8544:1;8540:6;8537:1;8534:13;8531:39;;;8550:18;;:::i;:::-;-1:-1:-1;8586:9:1;;8473:128::o;8606:251::-;8676:6;8729:2;8717:9;8708:7;8704:23;8700:32;8697:52;;;8745:1;8742;8735:12;8697:52;8777:9;8771:16;8796:31;8821:5;8796:31;:::i;8862:135::-;8901:3;-1:-1:-1;;8922:17:1;;8919:43;;;8942:18;;:::i;:::-;-1:-1:-1;8989:1:1;8978:13;;8862:135::o;9002:125::-;9042:4;9070:1;9067;9064:8;9061:34;;;9075:18;;:::i;:::-;-1:-1:-1;9112:9:1;;9002:125::o;9385:127::-;9446:10;9441:3;9437:20;9434:1;9427:31;9477:4;9474:1;9467:15;9501:4;9498:1;9491:15;9517:127;9578:10;9573:3;9569:20;9566:1;9559:31;9609:4;9606:1;9599:15;9633:4;9630:1;9623:15;9649:355;9851:2;9833:21;;;9890:2;9870:18;;;9863:30;9929:33;9924:2;9909:18;;9902:61;9995:2;9980:18;;9649:355::o;13589:410::-;13791:2;13773:21;;;13830:2;13810:18;;;13803:30;13869:34;13864:2;13849:18;;13842:62;-1:-1:-1;;;13935:2:1;13920:18;;13913:44;13989:3;13974:19;;13589:410::o;16989:342::-;17190:2;17179:9;17172:21;17153:4;17210:56;17262:2;17251:9;17247:18;17239:6;17210:56;:::i;:::-;17202:64;;17316:6;17309:14;17302:22;17297:2;17286:9;17282:18;17275:50;16989:342;;;;;:::o;19726:245::-;19805:6;19813;19866:2;19854:9;19845:7;19841:23;19837:32;19834:52;;;19882:1;19879;19872:12;19834:52;-1:-1:-1;;19905:16:1;;19961:2;19946:18;;;19940:25;19905:16;;19940:25;;-1:-1:-1;19726:245:1:o;22468:582::-;22767:6;22756:9;22749:25;22810:6;22805:2;22794:9;22790:18;22783:34;22853:3;22848:2;22837:9;22833:18;22826:31;22730:4;22874:57;22926:3;22915:9;22911:19;22903:6;22874:57;:::i;:::-;-1:-1:-1;;;;;22967:32:1;;;;22962:2;22947:18;;22940:60;-1:-1:-1;23031:3:1;23016:19;23009:35;22866:65;22468:582;-1:-1:-1;;;22468:582:1:o;23055:881::-;23150:6;23181:2;23224;23212:9;23203:7;23199:23;23195:32;23192:52;;;23240:1;23237;23230:12;23192:52;23273:9;23267:16;23306:18;23298:6;23295:30;23292:50;;;23338:1;23335;23328:12;23292:50;23361:22;;23414:4;23406:13;;23402:27;-1:-1:-1;23392:55:1;;23443:1;23440;23433:12;23392:55;23472:2;23466:9;23495:60;23511:43;23551:2;23511:43;:::i;23495:60::-;23589:15;;;23671:1;23667:10;;;;23659:19;;23655:28;;;23620:12;;;;23695:19;;;23692:39;;;23727:1;23724;23717:12;23692:39;23751:11;;;;23771:135;23787:6;23782:3;23779:15;23771:135;;;23853:10;;23841:23;;23804:12;;;;23884;;;;23771:135;;24370:804;24627:2;24616:9;24609:21;24590:4;24653:56;24705:2;24694:9;24690:18;24682:6;24653:56;:::i;:::-;24766:22;;;24728:2;24746:18;;;24739:50;;;;24838:13;;24860:22;;;24936:15;;;;24898;;;24969:1;24979:169;24993:6;24990:1;24987:13;24979:169;;;25054:13;;25042:26;;25123:15;;;;25088:12;;;;25015:1;25008:9;24979:169;;;-1:-1:-1;25165:3:1;;24370:804;-1:-1:-1;;;;;;;24370:804:1:o;25602:217::-;25642:1;25668;25658:132;;25712:10;25707:3;25703:20;25700:1;25693:31;25747:4;25744:1;25737:15;25775:4;25772:1;25765:15;25658:132;-1:-1:-1;25804:9:1;;25602:217::o;26589:306::-;26677:6;26685;26693;26746:2;26734:9;26725:7;26721:23;26717:32;26714:52;;;26762:1;26759;26752:12;26714:52;26791:9;26785:16;26775:26;;26841:2;26830:9;26826:18;26820:25;26810:35;;26885:2;26874:9;26870:18;26864:25;26854:35;;26589:306;;;;;:::o;27665:258::-;27737:1;27747:113;27761:6;27758:1;27755:13;27747:113;;;27837:11;;;27831:18;27818:11;;;27811:39;27783:2;27776:10;27747:113;;;27878:6;27875:1;27872:13;27869:48;;;-1:-1:-1;;27913:1:1;27895:16;;27888:27;27665:258::o;27928:274::-;28057:3;28095:6;28089:13;28111:53;28157:6;28152:3;28145:4;28137:6;28133:17;28111:53;:::i;:::-;28180:16;;;;;27928:274;-1:-1:-1;;27928:274:1:o;28207:383::-;28356:2;28345:9;28338:21;28319:4;28388:6;28382:13;28431:6;28426:2;28415:9;28411:18;28404:34;28447:66;28506:6;28501:2;28490:9;28486:18;28481:2;28473:6;28469:15;28447:66;:::i;:::-;28574:2;28553:15;-1:-1:-1;;28549:29:1;28534:45;;;;28581:2;28530:54;;28207:383;-1:-1:-1;;28207:383:1:o
Swarm Source
ipfs://04d95cba6f71967ebb69ad52c89ff82a67744bb249faf57016d8d4e3a8424667
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.