Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 18691788 | 234 days ago | IN | Create: PresaleV3 | 0 ETH | 0.19536798 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PresaleV3
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-01 */ //SPDX-License-Identifier: MIT // _ _____ _ // __ _____| |__|___ / _ __ __ _ _ _ _ __ ___ ___ _ __ | |_ ___ // \ \ /\ / / _ \ '_ \ |_ \| '_ \ / _` | | | | '_ ` _ \ / _ \ '_ \| __/ __| // \ V V / __/ |_) |__) | |_) | (_| | |_| | | | | | | __/ | | | |_\__ \ // \_/\_/ \___|_.__/____/| .__/ \__,_|\__, |_| |_| |_|\___|_| |_|\__|___/ // |_| |___/ // pragma solidity 0.8.9; // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } interface Aggregator { function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } interface StakingManager { function depositByPresale(address _user, uint256 _amount) external; } contract PresaleV3 is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable, PausableUpgradeable { uint256 public totalTokensSold; uint256 public startTime; uint256 public endTime; uint256 public claimStart; address public saleToken; uint256 public baseDecimals; uint256 public maxTokensToBuy; uint256 public currentStep; uint256[][3] public rounds; uint256 public checkPoint; uint256 public usdRaised; uint256[] public prevCheckpoints; uint256[] public remainingTokensTracker; uint256 public timeConstant; address public paymentWallet; bool public dynamicTimeFlag; bool public whitelistClaimOnly; IERC20Upgradeable public USDTInterface; Aggregator public aggregatorInterface; mapping(address => uint256) public userDeposits; mapping(address => bool) public hasClaimed; mapping(address => bool) public isBlacklisted; mapping(address => bool) public isWhitelisted; mapping(address => bool) public wertWhitelisted; StakingManager public stakingManagerInterface; bool public stakeingWhitelistStatus; uint256 public totalBoughtAndStaked; address public admin; uint256[] public percentages; address[] public wallets; event SaleTimeSet(uint256 _start, uint256 _end, uint256 timestamp); event SaleTimeUpdated(bytes32 indexed key, uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBought(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensAdded(address indexed token, uint256 noOfTokens, uint256 timestamp); event TokensClaimed(address indexed user, uint256 amount, uint256 timestamp); event ClaimStartUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); event MaxTokensUpdated(uint256 prevValue, uint256 newValue, uint256 timestamp); event TokensBoughtAndStaked(address indexed user, uint256 indexed tokensBought, address indexed purchaseToken, uint256 amountPaid, uint256 usdEq, uint256 timestamp); event TokensClaimedAndStaked(address indexed user, uint256 amount, uint256 timestamp); /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} /** * @dev To pause the presale */ function pause() external onlyOwner { _pause(); } /** * @dev To unpause the presale */ function unpause() external onlyOwner { _unpause(); } /** * @dev To calculate the price in USD for given amount of tokens. * @param _amount No of tokens */ function calculatePrice(uint256 _amount) public view returns (uint256) { uint256 USDTAmount; uint256 total = checkPoint == 0 ? totalTokensSold : checkPoint; require(_amount <= maxTokensToBuy, 'Amount exceeds max tokens to buy'); if (_amount + total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { require(currentStep < (rounds[0].length - 1), 'Wrong params'); if (block.timestamp >= rounds[2][currentStep]) { require(rounds[0][currentStep] + _amount <= rounds[0][currentStep + 1], 'Cant Purchase More in individual tx'); USDTAmount = _amount * rounds[1][currentStep + 1]; } else { uint256 tokenAmountForCurrentPrice = rounds[0][currentStep] - total; USDTAmount = tokenAmountForCurrentPrice * rounds[1][currentStep] + (_amount - tokenAmountForCurrentPrice) * rounds[1][currentStep + 1]; } } else USDTAmount = _amount * rounds[1][currentStep]; return USDTAmount; } /** * @dev To update the sale times * @param _startTime New start time * @param _endTime New end time */ function changeSaleTimes(uint256 _startTime, uint256 _endTime) external onlyOwner { require(_startTime > 0 || _endTime > 0, 'Invalid parameters'); if (_startTime > 0) { require(block.timestamp < startTime, 'Sale already started'); require(block.timestamp < _startTime, 'Sale time in past'); uint256 prevValue = startTime; startTime = _startTime; emit SaleTimeUpdated(bytes32('START'), prevValue, _startTime, block.timestamp); } if (_endTime > 0) { require(_endTime > startTime, 'Invalid endTime'); uint256 prevValue = endTime; endTime = _endTime; emit SaleTimeUpdated(bytes32('END'), prevValue, _endTime, block.timestamp); } } /** * @dev To get latest ETH price in 10**18 format */ function getLatestPrice() public view returns (uint256) { (, int256 price, , , ) = aggregatorInterface.latestRoundData(); price = (price * (10 ** 10)); return uint256(price); } function setSplits(address[] memory _wallets, uint256[] memory _percentages) public onlyOwner { require(_wallets.length == _percentages.length, 'Mismatched arrays'); delete wallets; delete percentages; uint256 totalPercentage = 0; for (uint256 i = 0; i < _wallets.length; i++) { require(_percentages[i] > 0, 'Percentage must be greater than 0'); totalPercentage += _percentages[i]; wallets.push(_wallets[i]); percentages.push(_percentages[i]); } require(totalPercentage == 100, 'Total percentage must equal 100'); } modifier checkSaleState(uint256 amount) { require(block.timestamp >= startTime && block.timestamp <= endTime, 'Invalid time for buying'); require(amount > 0, 'Invalid sale amount'); _; } /** * @dev To buy into a presale using USDT * @param amount No of tokens to buy * @param stake boolean flag for token staking */ function buyWithUSDT(uint256 amount, bool stake) external checkSaleState(amount) whenNotPaused returns (bool) { uint256 usdPrice = calculatePrice(amount); totalTokensSold += amount; uint256 price = usdPrice / (10 ** 12); if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakeingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(USDTInterface), price, usdPrice, block.timestamp); } usdRaised += usdPrice; uint256 ourAllowance = USDTInterface.allowance(_msgSender(), address(this)); require(price <= ourAllowance, 'Make sure to add enough allowance'); splitUSDTValue(price); return true; } /** * @dev To buy into a presale using ETH * @param amount No of tokens to buy * @param stake boolean flag for token staking */ function buyWithEth(uint256 amount, bool stake) external payable checkSaleState(amount) whenNotPaused nonReentrant returns (bool) { uint256 usdPrice = calculatePrice(amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; totalTokensSold += amount; if (checkPoint != 0) checkPoint += amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakeingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_msgSender(), amount * baseDecimals); totalBoughtAndStaked += amount; emit TokensBoughtAndStaked(_msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp); } else { userDeposits[_msgSender()] += (amount * baseDecimals); emit TokensBought(_msgSender(), amount, address(0), ethAmount, usdPrice, block.timestamp); } usdRaised += usdPrice; splitETHValue(ethAmount); if (excess > 0) sendValue(payable(_msgSender()), excess); return true; } /** * @dev To buy ETH directly from wert .*wert contract address should be whitelisted if wertBuyRestrictionStatus is set true * @param _user address of the user * @param _amount No of ETH to buy * @param stake boolean flag for token staking */ function buyWithETHWert(address _user, uint256 _amount, bool stake) external payable checkSaleState(_amount) whenNotPaused nonReentrant returns (bool) { require(wertWhitelisted[_msgSender()], 'User not whitelisted for this tx'); uint256 usdPrice = calculatePrice(_amount); uint256 ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); require(msg.value >= ethAmount, 'Less payment'); uint256 excess = msg.value - ethAmount; totalTokensSold += _amount; if (checkPoint != 0) checkPoint += _amount; uint256 total = totalTokensSold > checkPoint ? totalTokensSold : checkPoint; if (total > rounds[0][currentStep] || block.timestamp >= rounds[2][currentStep]) { if (block.timestamp >= rounds[2][currentStep]) { checkPoint = rounds[0][currentStep] + _amount; } if (dynamicTimeFlag) { manageTimeDiff(); } uint256 unsoldTokens = total > rounds[0][currentStep] ? 0 : rounds[0][currentStep] - total; remainingTokensTracker.push(unsoldTokens); currentStep += 1; } if (stake) { if (stakeingWhitelistStatus) { require(isWhitelisted[_user], 'User not whitelisted for stake'); } stakingManagerInterface.depositByPresale(_user, _amount * baseDecimals); totalBoughtAndStaked += _amount; emit TokensBoughtAndStaked(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); } else { userDeposits[_user] += (_amount * baseDecimals); emit TokensBought(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); } usdRaised += usdPrice; splitETHValue(ethAmount); if (excess > 0) sendValue(payable(_user), excess); emit TokensBought(_user, _amount, address(0), ethAmount, usdPrice, block.timestamp); return true; } /** * @dev Helper funtion to get ETH price for given amount * @param amount No of tokens to buy */ function ethBuyHelper(uint256 amount) external view returns (uint256 ethAmount) { uint256 usdPrice = calculatePrice(amount); ethAmount = (usdPrice * baseDecimals) / getLatestPrice(); } /** * @dev Helper funtion to get USDT price for given amount * @param amount No of tokens to buy */ function usdtBuyHelper(uint256 amount) external view returns (uint256 usdPrice) { usdPrice = calculatePrice(amount); usdPrice = usdPrice / (10 ** 12); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Low balance'); (bool success, ) = recipient.call{value: amount}(''); require(success, 'ETH Payment failed'); } function splitETHValue(uint256 _amount) internal { if (wallets.length == 0) { require(paymentWallet != address(0), 'Payment wallet not set'); sendValue(payable(paymentWallet), _amount); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100; sendValue(payable(wallets[i]), amountToTransfer); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { sendValue(payable(wallets[wallets.length - 1]), _amount - tempCalc); } } } function splitUSDTValue(uint256 _amount) internal { if (wallets.length == 0) { require(paymentWallet != address(0), 'Payment wallet not set'); (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), paymentWallet, _amount)); require(success, 'Token payment failed'); } else { uint256 tempCalc; for (uint256 i = 0; i < wallets.length; i++) { uint256 amountToTransfer = (_amount * percentages[i]) / 100; (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), wallets[i], amountToTransfer)); require(success, 'Token payment failed'); tempCalc += amountToTransfer; } if ((_amount - tempCalc) > 0) { (bool success, ) = address(USDTInterface).call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _msgSender(), wallets[wallets.length - 1], _amount - tempCalc)); require(success, 'Token payment failed'); } } } /** * @dev to initialize staking manager with new addredd * @param _stakingManagerAddress address of the staking smartcontract */ function setStakingManager(address _stakingManagerAddress) external onlyOwner { require(_stakingManagerAddress != address(0), 'staking manager cannot be inatialized with zero address'); stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20Upgradeable(saleToken).approve(_stakingManagerAddress, type(uint256).max); } /** * @dev To set the claim start time and sale token address by the owner * @param _claimStart claim start time * @param noOfTokens no of tokens to add to the contract * @param _saleToken sale toke address */ function startClaim(uint256 _claimStart, uint256 noOfTokens, address _saleToken, address _stakingManagerAddress) external onlyOwner returns (bool) { require(_saleToken != address(0), 'Zero token address'); require(claimStart == 0, 'Claim already set'); claimStart = _claimStart; saleToken = _saleToken; whitelistClaimOnly = true; stakingManagerInterface = StakingManager(_stakingManagerAddress); IERC20Upgradeable(_saleToken).approve(_stakingManagerAddress, type(uint256).max); bool success = IERC20Upgradeable(_saleToken).transferFrom(_msgSender(), address(this), noOfTokens); require(success, 'Token transfer failed'); emit TokensAdded(_saleToken, noOfTokens, block.timestamp); return true; } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setStakeingWhitelistStatus(bool _status) external onlyOwner { stakeingWhitelistStatus = _status; } /** * @dev To change the claim start time by the owner * @param _claimStart new claim start time */ function changeClaimStart(uint256 _claimStart) external onlyOwner returns (bool) { require(claimStart > 0, 'Initial claim data not set'); require(_claimStart > endTime, 'Sale in progress'); require(_claimStart > block.timestamp, 'Claim start in past'); uint256 prevValue = claimStart; claimStart = _claimStart; emit ClaimStartUpdated(prevValue, _claimStart, block.timestamp); return true; } /** * @dev To claim tokens after claiming starts */ function claim() external whenNotPaused returns (bool) { require(saleToken != address(0), 'Sale token not added'); require(!isBlacklisted[_msgSender()], 'This Address is Blacklisted'); if (whitelistClaimOnly) { require(isWhitelisted[_msgSender()], 'User not whitelisted for claim'); } require(block.timestamp >= claimStart, 'Claim has not started yet'); require(!hasClaimed[_msgSender()], 'Already claimed'); hasClaimed[_msgSender()] = true; uint256 amount = userDeposits[_msgSender()]; require(amount > 0, 'Nothing to claim'); delete userDeposits[_msgSender()]; bool success = IERC20Upgradeable(saleToken).transfer(_msgSender(), amount); require(success, 'Token transfer failed'); emit TokensClaimed(_msgSender(), amount, block.timestamp); return true; } function claimAndStake() external whenNotPaused returns (bool) { require(saleToken != address(0), 'Sale token not added'); require(!isBlacklisted[_msgSender()], 'This Address is Blacklisted'); if (stakeingWhitelistStatus) { require(isWhitelisted[_msgSender()], 'User not whitelisted for stake'); } uint256 amount = userDeposits[_msgSender()]; require(amount > 0, 'Nothing to stake'); stakingManagerInterface.depositByPresale(_msgSender(), amount); delete userDeposits[_msgSender()]; emit TokensClaimedAndStaked(_msgSender(), amount, block.timestamp); return true; } /** * @dev To add wert contract addresses to whitelist * @param _addressesToWhitelist addresses of the contract */ function whitelistUsersForWERT(address[] calldata _addressesToWhitelist) external onlyOwner { for (uint256 i = 0; i < _addressesToWhitelist.length; i++) { wertWhitelisted[_addressesToWhitelist[i]] = true; } } /** * @dev To remove wert contract addresses to whitelist * @param _addressesToRemoveFromWhitelist addresses of the contracts */ function removeFromWhitelistForWERT(address[] calldata _addressesToRemoveFromWhitelist) external onlyOwner { for (uint256 i = 0; i < _addressesToRemoveFromWhitelist.length; i++) { wertWhitelisted[_addressesToRemoveFromWhitelist[i]] = false; } } function changeMaxTokensToBuy(uint256 _maxTokensToBuy) external onlyOwner { require(_maxTokensToBuy > 0, 'Zero max tokens to buy value'); uint256 prevValue = maxTokensToBuy; maxTokensToBuy = _maxTokensToBuy; emit MaxTokensUpdated(prevValue, _maxTokensToBuy, block.timestamp); } function changeRoundsData(uint256[][3] memory _rounds) external onlyOwner { rounds = _rounds; } /** * @dev To add users to blacklist which restricts blacklisted users from claiming * @param _usersToBlacklist addresses of the users */ function blacklistUsers(address[] calldata _usersToBlacklist) external onlyOwner { for (uint256 i = 0; i < _usersToBlacklist.length; i++) { isBlacklisted[_usersToBlacklist[i]] = true; } } /** * @dev To remove users from blacklist which restricts blacklisted users from claiming * @param _userToRemoveFromBlacklist addresses of the users */ function removeFromBlacklist(address[] calldata _userToRemoveFromBlacklist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromBlacklist.length; i++) { isBlacklisted[_userToRemoveFromBlacklist[i]] = false; } } /** * @dev To add users to whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _usersToWhitelist addresses of the users */ function whitelistUsers(address[] calldata _usersToWhitelist) external onlyOwner { for (uint256 i = 0; i < _usersToWhitelist.length; i++) { isWhitelisted[_usersToWhitelist[i]] = true; } } /** * @dev To remove users from whitelist which restricts users from claiming if claimWhitelistStatus is true * @param _userToRemoveFromWhitelist addresses of the users */ function removeFromWhitelist(address[] calldata _userToRemoveFromWhitelist) external onlyOwner { for (uint256 i = 0; i < _userToRemoveFromWhitelist.length; i++) { isWhitelisted[_userToRemoveFromWhitelist[i]] = false; } } /** * @dev To set status for claim whitelisting * @param _status bool value */ function setClaimWhitelistStatus(bool _status) external onlyOwner { whitelistClaimOnly = _status; } /** * @dev To set payment wallet address * @param _newPaymentWallet new payment wallet address */ function changePaymentWallet(address _newPaymentWallet) external onlyOwner { require(_newPaymentWallet != address(0), 'address cannot be zero'); paymentWallet = _newPaymentWallet; } /** * @dev To manage time gap between two rounds */ function manageTimeDiff() internal { for (uint256 i; i < rounds[2].length - currentStep; i++) { rounds[2][currentStep + i] = block.timestamp + i * timeConstant; } } /** * @dev To set time constant for manageTimeDiff() * @param _timeConstant time in <days>*24*60*60 format */ function setTimeConstant(uint256 _timeConstant) external onlyOwner { timeConstant = _timeConstant; } /** * @dev To get array of round details at once * @param _no array index */ function roundDetails(uint256 _no) external view returns (uint256[] memory) { return rounds[_no]; } /** * @dev to update userDeposits for purchases made on BSC * @param _users array of users * @param _userDeposits array of userDeposits associated with users */ function updateFromBSC(address[] calldata _users, uint256[] calldata _userDeposits) external onlyOwner { require(_users.length == _userDeposits.length, 'Length mismatch'); for (uint256 i = 0; i < _users.length; i++) { userDeposits[_users[i]] += _userDeposits[i]; } } /** * @dev To increment the rounds from backend */ function incrementCurrentStep() external { require(msg.sender == admin || msg.sender == owner(), 'caller not admin or owner'); prevCheckpoints.push(checkPoint); if (dynamicTimeFlag) { manageTimeDiff(); } if (checkPoint < rounds[0][currentStep]) { remainingTokensTracker.push(rounds[0][currentStep] - checkPoint); checkPoint = rounds[0][currentStep]; } currentStep++; } /** * @dev To set admin * @param _admin new admin wallet address */ function setAdmin(address _admin) external onlyOwner { admin = _admin; } /** * @dev To change details of the round * @param _step round for which you want to change the details * @param _checkpoint token tracker amount */ function setCurrentStep(uint256 _step, uint256 _checkpoint) external onlyOwner { currentStep = _step; checkPoint = _checkpoint; } /** * @dev To set time shift functionality on/off * @param _dynamicTimeFlag bool value */ function setDynamicTimeFlag(bool _dynamicTimeFlag) external onlyOwner { dynamicTimeFlag = _dynamicTimeFlag; } function trackRemainingTokens() external view returns (uint256[] memory) { return remainingTokensTracker; } /** * @dev To set time shift functionality on/off * @param _index index of the round we need to change * @param _newNoOfTokens number of tokens to be sold * @param _newPrice price for the round * @param _newTime new end time */ function changeIndividualRoundData(uint256 _index, uint256 _newNoOfTokens, uint256 _newPrice, uint256 _newTime) external onlyOwner returns (bool) { require(_index <= rounds[0].length, 'invalid index'); if (_newNoOfTokens > 0) { rounds[0][_index] = _newNoOfTokens; } if (_newPrice > 0) { rounds[1][_index] = _newPrice; } if (_newTime > 0) { rounds[2][_index] = _newTime; } return true; } /** * @dev To set time shift functionality on/off * @param _newNoOfTokens number of tokens to be sold * @param _newPrice price for the round * @param _newTime new end time */ function addNewRound(uint256 _newNoOfTokens, uint256 _newPrice, uint256 _newTime) external onlyOwner returns (bool) { require(_newNoOfTokens > 0, 'invalid no of tokens'); require(_newPrice > 0, 'invalid new price'); require(_newTime > 0, 'invalid new time'); rounds[0].push(_newNoOfTokens); rounds[1].push(_newPrice); rounds[2].push(_newTime); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MaxTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SaleTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokensBought","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdEq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensBoughtAndStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokensClaimedAndStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"USDTInterface","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newNoOfTokens","type":"uint256"},{"internalType":"uint256","name":"_newPrice","type":"uint256"},{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"addNewRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregatorInterface","outputs":[{"internalType":"contract Aggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToBlacklist","type":"address[]"}],"name":"blacklistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"buyWithETHWert","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"buyWithEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"buyWithUSDT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"}],"name":"changeClaimStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_newNoOfTokens","type":"uint256"},{"internalType":"uint256","name":"_newPrice","type":"uint256"},{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"changeIndividualRoundData","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokensToBuy","type":"uint256"}],"name":"changeMaxTokensToBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPaymentWallet","type":"address"}],"name":"changePaymentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[][3]","name":"_rounds","type":"uint256[][3]"}],"name":"changeRoundsData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"changeSaleTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTimeFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ethBuyHelper","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incrementCurrentStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensToBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"percentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prevCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"remainingTokensTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromBlacklist","type":"address[]"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_userToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToRemoveFromWhitelist","type":"address[]"}],"name":"removeFromWhitelistForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_no","type":"uint256"}],"name":"roundDetails","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setClaimWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"},{"internalType":"uint256","name":"_checkpoint","type":"uint256"}],"name":"setCurrentStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_dynamicTimeFlag","type":"bool"}],"name":"setDynamicTimeFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"},{"internalType":"uint256[]","name":"_percentages","type":"uint256[]"}],"name":"setSplits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setStakeingWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingManagerAddress","type":"address"}],"name":"setStakingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeConstant","type":"uint256"}],"name":"setTimeConstant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeingWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingManagerInterface","outputs":[{"internalType":"contract StakingManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStart","type":"uint256"},{"internalType":"uint256","name":"noOfTokens","type":"uint256"},{"internalType":"address","name":"_saleToken","type":"address"},{"internalType":"address","name":"_stakingManagerAddress","type":"address"}],"name":"startClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBoughtAndStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trackRemainingTokens","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_userDeposits","type":"uint256[]"}],"name":"updateFromBSC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"usdtBuyHelper","outputs":[{"internalType":"uint256","name":"usdPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wertWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistClaimOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_usersToWhitelist","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressesToWhitelist","type":"address[]"}],"name":"whitelistUsersForWERT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600054610100900460ff1615808015620000335750600054600160ff909116105b8062000063575062000050306200013d60201b620039851760201c565b15801562000063575060005460ff166001145b620000cb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff191660011790558015620000ef576000805461ff0019166101001790555b801562000136576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b506200014c565b6001600160a01b03163b151590565b614b57806200015c6000396000f3fe6080604052600436106104105760003560e01c80638456cb591161021e578063cad0055611610123578063edec5f27116100ab578063f597573f1161007a578063f597573f14610bf5578063f851a44014610c15578063f885838614610c35578063fb9a4acd14610c55578063fe575a8714610c7557600080fd5b8063edec5f2714610b7f578063f04d688f14610b9f578063f2fde38b14610bb5578063f446374314610bd557600080fd5b8063e19648db116100f2578063e19648db14610ae9578063e32204dd14610b09578063e6da921314610b29578063e985e36714610b49578063eadd94ec14610b6957600080fd5b8063cad0055614610a7d578063cb1a4fc014610a9d578063cff805ab14610ab2578063dad80e8614610ac857600080fd5b8063ae4e0a18116101a6578063ba166a3911610175578063ba166a39146109db578063bb3d676a14610a08578063c23326f314610a28578063c49cc64514610a48578063c8adff0114610a6857600080fd5b8063ae4e0a1814610968578063b00bba6a1461097b578063b02538471461099b578063b8977d6d146109bb57600080fd5b80638e15f473116101ed5780638e15f473146108dd5780639a89c1fb146108f25780639cfa0f7c14610912578063a6d42e4e14610928578063ae1042651461094857600080fd5b80638456cb591461086a57806389daf7991461087f5780638ac080821461089f5780638da5cb5b146108bf57600080fd5b80633f4ba83a1161032457806363b20117116102ac578063715018a61161027b578063715018a6146107d957806373b2e80e146107ee57806378e979251461081e5780637ad71f72146108345780637f6fb2531461085457600080fd5b806363b201171461076e57806363e4087914610784578063641046f4146107a4578063704b6c02146107b957600080fd5b8063548db174116102f3578063548db174146106d05780635bc34f71146106f05780635c975abb146107065780635ddc56881461071e5780635df4f3531461073e57600080fd5b80633f4ba83a1461066f57806343568eae146106845780634e71d92d1461069a57806353d99207146106af57600080fd5b806323a8f1c0116103a75780633197cbb6116103765780633197cbb6146105bb57806333f76178146105d157806338646608146105e75780633af32abf1461061f5780633d9c8d8b1461064f57600080fd5b806323a8f1c014610548578063278c278b1461056857806329a5a0b6146105885780632c65169e146105a857600080fd5b80630dc9c838116103e35780630dc9c838146104c7578063136021d9146104e75780631ddc6091146105075780631fa2bc921461052757600080fd5b806303b9c5ad1461041557806307f18082146104375780630a200fc71461046c5780630ba36dcd1461048c575b600080fd5b34801561042157600080fd5b50610435610430366004614305565b610ca5565b005b34801561044357600080fd5b50610457610452366004614347565b610d24565b60405190151581526020015b60405180910390f35b34801561047857600080fd5b5061043561048736600461436e565b610e60565b34801561049857600080fd5b506104b96104a73660046143a2565b60dc6020526000908152604090205481565b604051908152602001610463565b3480156104d357600080fd5b506104356104e23660046143bd565b610e86565b3480156104f357600080fd5b506104576105023660046143df565b611062565b34801561051357600080fd5b5061043561052236600461436e565b611597565b34801561053357600080fd5b5060d95461045790600160a01b900460ff1681565b34801561055457600080fd5b50610435610563366004614347565b6115bd565b34801561057457600080fd5b50610435610583366004614347565b6115ca565b34801561059457600080fd5b506104b96105a3366004614347565b61166d565b6104576105b63660046143df565b6116a1565b3480156105c757600080fd5b506104b960cb5481565b3480156105dd57600080fd5b506104b960ce5481565b3480156105f357600080fd5b5060e154610607906001600160a01b031681565b6040516001600160a01b039091168152602001610463565b34801561062b57600080fd5b5061045761063a3660046143a2565b60df6020526000908152604090205460ff1681565b34801561065b57600080fd5b5061045761066a36600461440f565b611b24565b34801561067b57600080fd5b50610435611bf9565b34801561069057600080fd5b506104b960d85481565b3480156106a657600080fd5b50610457611c0b565b3480156106bb57600080fd5b5060d95461045790600160a81b900460ff1681565b3480156106dc57600080fd5b506104356106eb366004614305565b611f67565b3480156106fc57600080fd5b506104b960d05481565b34801561071257600080fd5b5060975460ff16610457565b34801561072a57600080fd5b50610435610739366004614540565b611fe1565b34801561074a57600080fd5b506104576107593660046143a2565b60e06020526000908152604090205460ff1681565b34801561077a57600080fd5b506104b960c95481565b34801561079057600080fd5b506104b961079f366004614347565b6121d5565b3480156107b057600080fd5b506104356121f7565b3480156107c557600080fd5b506104356107d43660046143a2565b612365565b3480156107e557600080fd5b5061043561238f565b3480156107fa57600080fd5b506104576108093660046143a2565b60dd6020526000908152604090205460ff1681565b34801561082a57600080fd5b506104b960ca5481565b34801561084057600080fd5b5061060761084f366004614347565b6123a1565b34801561086057600080fd5b506104b960e25481565b34801561087657600080fd5b506104356123cb565b34801561088b57600080fd5b5061043561089a366004614305565b6123db565b3480156108ab57600080fd5b506104576108ba366004614600565b612455565b3480156108cb57600080fd5b506065546001600160a01b0316610607565b3480156108e957600080fd5b506104b96126ca565b3480156108fe57600080fd5b5061043561090d3660046143bd565b61276a565b34801561091e57600080fd5b506104b960cf5481565b34801561093457600080fd5b50610435610943366004614646565b61277d565b34801561095457600080fd5b506104b9610963366004614347565b612792565b6104576109763660046146e1565b612ac6565b34801561098757600080fd5b506104356109963660046143a2565b613017565b3480156109a757600080fd5b506104576109b6366004614721565b613139565b3480156109c757600080fd5b506104356109d636600461436e565b6132a9565b3480156109e757600080fd5b506109fb6109f6366004614347565b6132cf565b604051610463919061474d565b348015610a1457600080fd5b50610435610a23366004614305565b61333b565b348015610a3457600080fd5b506104b9610a43366004614347565b6133b5565b348015610a5457600080fd5b5060db54610607906001600160a01b031681565b348015610a7457600080fd5b506109fb6133d6565b348015610a8957600080fd5b50610435610a983660046143a2565b61342e565b348015610aa957600080fd5b506104576134a7565b348015610abe57600080fd5b506104b960d45481565b348015610ad457600080fd5b5060e15461045790600160a01b900460ff1681565b348015610af557600080fd5b506104b9610b04366004614347565b6136de565b348015610b1557600080fd5b5060d954610607906001600160a01b031681565b348015610b3557600080fd5b506104b9610b443660046143bd565b6136ee565b348015610b5557600080fd5b5060cd54610607906001600160a01b031681565b348015610b7557600080fd5b506104b960d55481565b348015610b8b57600080fd5b50610435610b9a366004614305565b613722565b348015610bab57600080fd5b506104b960cc5481565b348015610bc157600080fd5b50610435610bd03660046143a2565b61379c565b348015610be157600080fd5b50610435610bf0366004614305565b613815565b348015610c0157600080fd5b5060da54610607906001600160a01b031681565b348015610c2157600080fd5b5060e354610607906001600160a01b031681565b348015610c4157600080fd5b506104b9610c50366004614347565b61388f565b348015610c6157600080fd5b50610435610c70366004614791565b61389f565b348015610c8157600080fd5b50610457610c903660046143a2565b60de6020526000908152604090205460ff1681565b610cad613994565b60005b81811015610d1f57600160e06000858585818110610cd057610cd06147fd565b9050602002016020810190610ce591906143a2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d1781614829565b915050610cb0565b505050565b6000610d2e613994565b600060cc5411610d855760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b60cb548211610dc95760405162461bcd60e51b815260206004820152601060248201526f53616c6520696e2070726f677265737360801b6044820152606401610d7c565b428211610e0e5760405162461bcd60e51b815260206004820152601360248201527210db185a5b481cdd185c9d081a5b881c185cdd606a1b6044820152606401610d7c565b60cc8054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a160019150505b919050565b610e68613994565b60d98054911515600160a01b0260ff60a01b19909216919091179055565b610e8e613994565b6000821180610e9d5750600081115b610ede5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610d7c565b8115610fc35760ca544210610f2c5760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610d7c565b814210610f6f5760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401610d7c565b60ca8054908390556040805182815260208101859052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b801561105e5760ca54811161100c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420656e6454696d6560881b6044820152606401610d7c565b60cb8054908290556040805182815260208101849052428183015290516211539160ea1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b5050565b60008260ca544210158015611079575060cb544211155b6110955760405162461bcd60e51b8152600401610d7c90614844565b600081116110b55760405162461bcd60e51b8152600401610d7c9061487b565b6110bd6139ee565b60006110c885612792565b90508460c960008282546110dc91906148a8565b90915550600090506110f364e8d4a51000836148c0565b905060d454600014611117578560d4600082825461111191906148a8565b90915550505b600060d45460c9541161112c5760d454611130565b60c9545b905060d160000160d0548154811061114a5761114a6147fd565b9060005260206000200154811180611184575060d160020160d05481548110611175576111756147fd565b90600052602060002001544210155b156112b35760d160020160d054815481106111a1576111a16147fd565b906000526020600020015442106111e4578660d160000160d054815481106111cb576111cb6147fd565b90600052602060002001546111e091906148a8565b60d4555b60d954600160a01b900460ff16156111fe576111fe613a34565b600060d1810160d05481548110611217576112176147fd565b9060005260206000200154821161125b578160d160000160d05481548110611241576112416147fd565b906000526020600020015461125691906148e2565b61125e565b60005b60d780546001818101835560009283527f8a012a6de2943a5aa4d77acf5e695d4456760a3f1f30a5d6dc2079599187a07190910183905560d0805493945090929091906112ac9084906148a8565b9091555050505b85156113f65760e154600160a01b900460ff16156112fa5733600090815260df602052604090205460ff166112fa5760405162461bcd60e51b8152600401610d7c906148f9565b60e1546001600160a01b03166391c619663360ce54611319908b614930565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561135f57600080fd5b505af1158015611373573d6000803e3d6000fd5b505050508660e2600082825461138991906148a8565b909155505060da546001600160a01b031687336001600160a01b03167f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a8587426040516113e9939291909283526020830191909152604082015260600190565b60405180910390a4611479565b60ce546114039088614930565b33600090815260dc6020526040812080549091906114229084906148a8565b909155505060da546001600160a01b031687336001600160a01b0316600080516020614b02833981519152858742604051611470939291909283526020830191909152604082015260600190565b60405180910390a45b8260d5600082825461148b91906148a8565b909155505060da546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156114ea57600080fd5b505afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611522919061494f565b90508083111561157e5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610d7c565b61158783613aa4565b60019550505050505b5092915050565b61159f613994565b60d98054911515600160a81b0260ff60a81b19909216919091179055565b6115c5613994565b60d855565b6115d2613994565b600081116116225760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610d7c565b60cf8054908290556040805182815260208101849052428183015290517f76f9e5e1f6af6a9f180708b77a5c99210fbf19b91f1f194f3918c262b8edf77c9181900360600190a15050565b60008061167983612792565b90506116836126ca565b60ce546116909083614930565b61169a91906148c0565b9392505050565b60008260ca5442101580156116b8575060cb544211155b6116d45760405162461bcd60e51b8152600401610d7c90614844565b600081116116f45760405162461bcd60e51b8152600401610d7c9061487b565b6116fc6139ee565b611704613e1b565b600061170f85612792565b9050600061171b6126ca565b60ce546117289084614930565b61173291906148c0565b9050803410156117735760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d7c565b600061177f82346148e2565b90508660c9600082825461179391906148a8565b909155505060d454156117b8578660d460008282546117b291906148a8565b90915550505b600060d45460c954116117cd5760d4546117d1565b60c9545b905060d160000160d054815481106117eb576117eb6147fd565b9060005260206000200154811180611825575060d160020160d05481548110611816576118166147fd565b90600052602060002001544210155b156119545760d160020160d05481548110611842576118426147fd565b90600052602060002001544210611885578760d160000160d0548154811061186c5761186c6147fd565b906000526020600020015461188191906148a8565b60d4555b60d954600160a01b900460ff161561189f5761189f613a34565b600060d1810160d054815481106118b8576118b86147fd565b906000526020600020015482116118fc578160d160000160d054815481106118e2576118e26147fd565b90600052602060002001546118f791906148e2565b6118ff565b60005b60d780546001818101835560009283527f8a012a6de2943a5aa4d77acf5e695d4456760a3f1f30a5d6dc2079599187a07190910183905560d08054939450909290919061194d9084906148a8565b9091555050505b8615611a7b5760e154600160a01b900460ff161561199b5733600090815260df602052604090205460ff1661199b5760405162461bcd60e51b8152600401610d7c906148f9565b60e1546001600160a01b03166391c619663360ce546119ba908c614930565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a0057600080fd5b505af1158015611a14573d6000803e3d6000fd5b505050508760e26000828254611a2a91906148a8565b90915550506040805184815260208101869052428183015290516000918a9133917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a4611ae2565b60ce54611a889089614930565b33600090815260dc602052604081208054909190611aa79084906148a8565b90915550506040805184815260208101869052428183015290516000918a913391600080516020614b02833981519152919081900360600190a45b8360d56000828254611af491906148a8565b90915550611b03905083613e75565b8115611b1357611b133383613fd2565b600195505050505061159060018055565b6000611b2e613994565b60d154851115611b705760405162461bcd60e51b815260206004820152600d60248201526c0d2dcecc2d8d2c840d2dcc8caf609b1b6044820152606401610d7c565b8315611b9a578360d16000018681548110611b8d57611b8d6147fd565b6000918252602090912001555b8215611bc4578260d16001018681548110611bb757611bb76147fd565b6000918252602090912001555b8115611bee578160d16002018681548110611be157611be16147fd565b6000918252602090912001555b506001949350505050565b611c01613994565b611c096140a8565b565b6000611c156139ee565b60cd546001600160a01b0316611c645760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d7c565b33600090815260de602052604090205460ff1615611cc45760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d7c565b60d954600160a81b900460ff1615611d355733600090815260df602052604090205460ff16611d355760405162461bcd60e51b815260206004820152601e60248201527f55736572206e6f742077686974656c697374656420666f7220636c61696d00006044820152606401610d7c565b60cc54421015611d875760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401610d7c565b33600090815260dd602052604090205460ff1615611dd95760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610d7c565b33600090815260dd60209081526040808320805460ff1916600117905560dc90915290205480611e3e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610d7c565b33600081815260dc6020908152604080832083905560cd54815163a9059cbb60e01b8152600481019590955260248501869052905192936001600160a01b039091169263a9059cbb9260448084019391929182900301818787803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edd9190614968565b905080611f245760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610d7c565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a260019250505090565b611f6f613994565b60005b81811015610d1f57600060df6000858585818110611f9257611f926147fd565b9050602002016020810190611fa791906143a2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611fd981614829565b915050611f72565b611fe9613994565b805182511461202e5760405162461bcd60e51b81526020600482015260116024820152704d69736d6174636865642061727261797360781b6044820152606401610d7c565b61203a60e560006141d2565b61204660e460006141d2565b6000805b8351811015612184576000838281518110612067576120676147fd565b6020026020010151116120c65760405162461bcd60e51b815260206004820152602160248201527f50657263656e74616765206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401610d7c565b8281815181106120d8576120d86147fd565b6020026020010151826120eb91906148a8565b915060e5848281518110612101576121016147fd565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03909216919091179055825160e490849083908110612153576121536147fd565b602090810291909101810151825460018101845560009384529190922001558061217c81614829565b91505061204a565b5080606414610d1f5760405162461bcd60e51b815260206004820152601f60248201527f546f74616c2070657263656e74616765206d75737420657175616c20313030006044820152606401610d7c565b60006121e082612792565b90506121f164e8d4a51000826148c0565b92915050565b60e3546001600160a01b031633148061221a57506065546001600160a01b031633145b6122665760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206e6f742061646d696e206f72206f776e6572000000000000006044820152606401610d7c565b60d45460d680546001810182556000919091527fe767803f8ecf1dee6bb0345811f7312cda556058b19db6389ad9ae3568643ddd015560d954600160a01b900460ff16156122b6576122b6613a34565b60d160000160d054815481106122ce576122ce6147fd565b906000526020600020015460d454101561234e5760d45460d79060d160000160d05481548110612300576123006147fd565b906000526020600020015461231591906148e2565b8154600181018355600092835260208320015560d10160d0548154811061233e5761233e6147fd565b60009182526020909120015460d4555b60d0805490600061235e83614829565b9190505550565b61236d613994565b60e380546001600160a01b0319166001600160a01b0392909216919091179055565b612397613994565b611c0960006140fa565b60e581815481106123b157600080fd5b6000918252602090912001546001600160a01b0316905081565b6123d3613994565b611c0961414c565b6123e3613994565b60005b81811015610d1f57600060de6000858585818110612406576124066147fd565b905060200201602081019061241b91906143a2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061244d81614829565b9150506123e6565b600061245f613994565b6001600160a01b0383166124aa5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610d7c565b60cc54156124ee5760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610d7c565b60cc85905560cd80546001600160a01b038581166001600160a01b0319928316811790935560d9805460ff60a81b1916600160a81b17905560e1805491861691909216811790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b15801561257657600080fd5b505af115801561258a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ae9190614968565b506040516323b872dd60e01b81526000906001600160a01b038516906323b872dd906125e290339030908a90600401614985565b602060405180830381600087803b1580156125fc57600080fd5b505af1158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190614968565b90508061267b5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610d7c565b604080518681524260208201526001600160a01b038616917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a250600195945050505050565b60008060db60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561271b57600080fd5b505afa15801561272f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275391906149c3565b505050915050806402540be4006121f19190614a13565b612772613994565b60d09190915560d455565b612785613994565b61105e60d18260036141f0565b600080600060d4546000146127a95760d4546127ad565b60c9545b905060cf548411156128015760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401610d7c565b60d160000160d05481548110612819576128196147fd565b9060005260206000200154818561283091906148a8565b118061285e575060d160020160d0548154811061284f5761284f6147fd565b90600052602060002001544210155b15612a905760d154612872906001906148e2565b60d054106128b15760405162461bcd60e51b815260206004820152600c60248201526b57726f6e6720706172616d7360a01b6044820152606401610d7c565b60d160020160d054815481106128c9576128c96147fd565b906000526020600020015442106129dc5760d05460d1906128eb9060016148a8565b815481106128fb576128fb6147fd565b90600052602060002001548460d160006003811061291b5761291b6147fd565b0160d0548154811061292f5761292f6147fd565b906000526020600020015461294491906148a8565b111561299e5760405162461bcd60e51b815260206004820152602360248201527f43616e74205075726368617365204d6f726520696e20696e646976696475616c604482015262040e8f60eb1b6064820152608401610d7c565b60d05460d2906129af9060016148a8565b815481106129bf576129bf6147fd565b9060005260206000200154846129d59190614930565b9150611590565b60008160d1820160d054815481106129f6576129f66147fd565b9060005260206000200154612a0b91906148e2565b60d05490915060d290612a1f9060016148a8565b81548110612a2f57612a2f6147fd565b90600052602060002001548186612a4691906148e2565b612a509190614930565b60d160010160d05481548110612a6857612a686147fd565b906000526020600020015482612a7e9190614930565b612a8891906148a8565b925050611590565b60d160010160d05481548110612aa857612aa86147fd565b906000526020600020015484612abe9190614930565b949350505050565b60008260ca544210158015612add575060cb544211155b612af95760405162461bcd60e51b8152600401610d7c90614844565b60008111612b195760405162461bcd60e51b8152600401610d7c9061487b565b612b216139ee565b612b29613e1b565b33600090815260e0602052604090205460ff16612b885760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401610d7c565b6000612b9385612792565b90506000612b9f6126ca565b60ce54612bac9084614930565b612bb691906148c0565b905080341015612bf75760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d7c565b6000612c0382346148e2565b90508660c96000828254612c1791906148a8565b909155505060d45415612c3c578660d46000828254612c3691906148a8565b90915550505b600060d45460c95411612c515760d454612c55565b60c9545b905060d160000160d05481548110612c6f57612c6f6147fd565b9060005260206000200154811180612ca9575060d160020160d05481548110612c9a57612c9a6147fd565b90600052602060002001544210155b15612dd85760d160020160d05481548110612cc657612cc66147fd565b90600052602060002001544210612d09578760d160000160d05481548110612cf057612cf06147fd565b9060005260206000200154612d0591906148a8565b60d4555b60d954600160a01b900460ff1615612d2357612d23613a34565b600060d1810160d05481548110612d3c57612d3c6147fd565b90600052602060002001548211612d80578160d160000160d05481548110612d6657612d666147fd565b9060005260206000200154612d7b91906148e2565b612d83565b60005b60d780546001818101835560009283527f8a012a6de2943a5aa4d77acf5e695d4456760a3f1f30a5d6dc2079599187a07190910183905560d080549394509092909190612dd19084906148a8565b9091555050505b8615612f165760e154600160a01b900460ff1615612e28576001600160a01b038916600090815260df602052604090205460ff16612e285760405162461bcd60e51b8152600401610d7c906148f9565b60e15460ce546001600160a01b03909116906391c61966908b90612e4c908c614930565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b505050508760e26000828254612ebc91906148a8565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d16917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a4612f8f565b60ce54612f239089614930565b6001600160a01b038a16600090815260dc602052604081208054909190612f4b9084906148a8565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d1691600080516020614b02833981519152919081900360600190a45b8360d56000828254612fa191906148a8565b90915550612fb0905083613e75565b8115612fc057612fc08983613fd2565b6040805184815260208101869052428183015290516000918a916001600160a01b038d1691600080516020614b02833981519152919081900360600190a4600195505050505061300f60018055565b509392505050565b61301f613994565b6001600160a01b03811661309b5760405162461bcd60e51b815260206004820152603760248201527f7374616b696e67206d616e616765722063616e6e6f7420626520696e6174696160448201527f6c697a65642077697468207a65726f20616464726573730000000000000000006064820152608401610d7c565b60e180546001600160a01b0319166001600160a01b0383811691821790925560cd5460405163095ea7b360e01b8152600481019290925260001960248301529091169063095ea7b390604401602060405180830381600087803b15801561310157600080fd5b505af1158015613115573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e9190614968565b6000613143613994565b6000841161318a5760405162461bcd60e51b8152602060048201526014602482015273696e76616c6964206e6f206f6620746f6b656e7360601b6044820152606401610d7c565b600083116131ce5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206e657720707269636560781b6044820152606401610d7c565b600082116132115760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206e65772074696d6560801b6044820152606401610d7c565b5060d1805460018082019092557f695fb3134ad82c3b8022bc5464edd0bcc9424ef672b52245dcb6ab2374327ce3019390935560d280548085019091557ff2192e1030363415d7b4fb0406540a0060e8e2fc8982f3f32289379e11fa6546019190915560d3805480840182556000919091527f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a6015590565b6132b1613994565b60e18054911515600160a01b0260ff60a01b19909216919091179055565b606060d182600381106132e4576132e46147fd565b0180548060200260200160405190810160405280929190818152602001828054801561332f57602002820191906000526020600020905b81548152602001906001019080831161331b575b50505050509050919050565b613343613994565b60005b81811015610d1f57600160de6000858585818110613366576133666147fd565b905060200201602081019061337b91906143a2565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806133ad81614829565b915050613346565b60d781815481106133c557600080fd5b600091825260209091200154905081565b606060d780548060200260200160405190810160405280929190818152602001828054801561342457602002820191906000526020600020905b815481526020019060010190808311613410575b5050505050905090565b613436613994565b6001600160a01b0381166134855760405162461bcd60e51b8152602060048201526016602482015275616464726573732063616e6e6f74206265207a65726f60501b6044820152606401610d7c565b60d980546001600160a01b0319166001600160a01b0392909216919091179055565b60006134b16139ee565b60cd546001600160a01b03166135005760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d7c565b33600090815260de602052604090205460ff16156135605760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d7c565b60e154600160a01b900460ff16156135a15733600090815260df602052604090205460ff166135a15760405162461bcd60e51b8152600401610d7c906148f9565b33600090815260dc6020526040902054806135f15760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b6044820152606401610d7c565b60e1546001600160a01b03166391c61966336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561364b57600080fd5b505af115801561365f573d6000803e3d6000fd5b5050505060dc600061366e3390565b6001600160a01b031681526020810191909152604001600090812055336001600160a01b03167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b82426040516136ce929190918252602082015260400190565b60405180910390a2600191505090565b60d681815481106133c557600080fd5b60d182600381106136fe57600080fd5b01818154811061370d57600080fd5b90600052602060002001600091509150505481565b61372a613994565b60005b81811015610d1f57600160df600085858581811061374d5761374d6147fd565b905060200201602081019061376291906143a2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061379481614829565b91505061372d565b6137a4613994565b6001600160a01b0381166138095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d7c565b613812816140fa565b50565b61381d613994565b60005b81811015610d1f57600060e06000858585818110613840576138406147fd565b905060200201602081019061385591906143a2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061388781614829565b915050613820565b60e481815481106133c557600080fd5b6138a7613994565b8281146138e85760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610d7c565b60005b8381101561397e57828282818110613905576139056147fd565b9050602002013560dc6000878785818110613922576139226147fd565b905060200201602081019061393791906143a2565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461396691906148a8565b9091555081905061397681614829565b9150506138eb565b5050505050565b6001600160a01b03163b151590565b6065546001600160a01b03163314611c095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d7c565b60975460ff1615611c095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d7c565b60005b60d05460d354613a4791906148e2565b8110156138125760d854613a5b9082614930565b613a6590426148a8565b60d05460d390613a769084906148a8565b81548110613a8657613a866147fd565b60009182526020909120015580613a9c81614829565b915050613a37565b60e554613bc35760d9546001600160a01b0316613afc5760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d7c565b60da546000906001600160a01b03163360d954604051613b2b92916001600160a01b0316908690602401614985565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613b609190614a98565b6000604051808303816000865af19150503d8060008114613b9d576040519150601f19603f3d011682016040523d82523d6000602084013e613ba2565b606091505b505090508061105e5760405162461bcd60e51b8152600401610d7c90614ad3565b6000805b60e554811015613d0f576000606460e48381548110613be857613be86147fd565b906000526020600020015485613bfe9190614930565b613c0891906148c0565b60da549091506000906001600160a01b03163360e58581548110613c2e57613c2e6147fd565b600091825260209091200154604051613c5692916001600160a01b0316908690602401614985565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613c8b9190614a98565b6000604051808303816000865af19150503d8060008114613cc8576040519150601f19603f3d011682016040523d82523d6000602084013e613ccd565b606091505b5050905080613cee5760405162461bcd60e51b8152600401610d7c90614ad3565b613cf882856148a8565b935050508080613d0790614829565b915050613bc7565b506000613d1c82846148e2565b111561105e5760da546000906001600160a01b03163360e58054613d42906001906148e2565b81548110613d5257613d526147fd565b6000918252602090912001546001600160a01b0316613d7185876148e2565b604051602401613d8393929190614985565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613db89190614a98565b6000604051808303816000865af19150503d8060008114613df5576040519150601f19603f3d011682016040523d82523d6000602084013e613dfa565b606091505b5050905080610d1f5760405162461bcd60e51b8152600401610d7c90614ad3565b60026001541415613e6e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d7c565b6002600155565b60e554613ee35760d9546001600160a01b0316613ecd5760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d7c565b60d954613812906001600160a01b031682613fd2565b6000805b60e554811015613f7b576000606460e48381548110613f0857613f086147fd565b906000526020600020015485613f1e9190614930565b613f2891906148c0565b9050613f5b60e58381548110613f4057613f406147fd565b6000918252602090912001546001600160a01b031682613fd2565b613f6581846148a8565b9250508080613f7390614829565b915050613ee7565b506000613f8882846148e2565b111561105e5760e5805461105e9190613fa3906001906148e2565b81548110613fb357613fb36147fd565b6000918252602090912001546001600160a01b0316613fd283856148e2565b804710156140105760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610d7c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461405d576040519150601f19603f3d011682016040523d82523d6000602084013e614062565b606091505b5050905080610d1f5760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610d7c565b6140b0614189565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6141546139ee565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586140dd3390565b60975460ff16611c095760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d7c565b50805460008255906000526020600020908101906138129190614240565b8260038101928215614230579160200282015b828111156142305782518051614220918491602090910190614255565b5091602001919060010190614203565b5061423c92915061429c565b5090565b5b8082111561423c5760008155600101614241565b828054828255906000526020600020908101928215614290579160200282015b82811115614290578251825591602001919060010190614275565b5061423c929150614240565b8082111561423c5760006142b082826141d2565b5060010161429c565b60008083601f8401126142cb57600080fd5b50813567ffffffffffffffff8111156142e357600080fd5b6020830191508360208260051b85010111156142fe57600080fd5b9250929050565b6000806020838503121561431857600080fd5b823567ffffffffffffffff81111561432f57600080fd5b61433b858286016142b9565b90969095509350505050565b60006020828403121561435957600080fd5b5035919050565b801515811461381257600080fd5b60006020828403121561438057600080fd5b813561169a81614360565b80356001600160a01b0381168114610e5b57600080fd5b6000602082840312156143b457600080fd5b61169a8261438b565b600080604083850312156143d057600080fd5b50508035926020909101359150565b600080604083850312156143f257600080fd5b82359150602083013561440481614360565b809150509250929050565b6000806000806080858703121561442557600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561447a5761447a614441565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156144a9576144a9614441565b604052919050565b600067ffffffffffffffff8211156144cb576144cb614441565b5060051b60200190565b600082601f8301126144e657600080fd5b813560206144fb6144f6836144b1565b614480565b82815260059290921b8401810191818101908684111561451a57600080fd5b8286015b84811015614535578035835291830191830161451e565b509695505050505050565b6000806040838503121561455357600080fd5b823567ffffffffffffffff8082111561456b57600080fd5b818501915085601f83011261457f57600080fd5b8135602061458f6144f6836144b1565b82815260059290921b840181019181810190898411156145ae57600080fd5b948201945b838610156145d3576145c48661438b565b825294820194908201906145b3565b965050860135925050808211156145e957600080fd5b506145f6858286016144d5565b9150509250929050565b6000806000806080858703121561461657600080fd5b843593506020850135925061462d6040860161438b565b915061463b6060860161438b565b905092959194509250565b6000602080838503121561465957600080fd5b823567ffffffffffffffff8082111561467157600080fd5b818501915085601f83011261468557600080fd5b61468d614457565b80606084018881111561469f57600080fd5b845b818110156146d3578035858111156146b95760008081fd5b6146c58b8289016144d5565b8552509286019286016146a1565b509098975050505050505050565b6000806000606084860312156146f657600080fd5b6146ff8461438b565b925060208401359150604084013561471681614360565b809150509250925092565b60008060006060848603121561473657600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b8181101561478557835183529284019291840191600101614769565b50909695505050505050565b600080600080604085870312156147a757600080fd5b843567ffffffffffffffff808211156147bf57600080fd5b6147cb888389016142b9565b909650945060208701359150808211156147e457600080fd5b506147f1878288016142b9565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561483d5761483d614813565b5060010190565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b600082198211156148bb576148bb614813565b500190565b6000826148dd57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156148f4576148f4614813565b500390565b6020808252601e908201527f55736572206e6f742077686974656c697374656420666f72207374616b650000604082015260600190565b600081600019048311821515161561494a5761494a614813565b500290565b60006020828403121561496157600080fd5b5051919050565b60006020828403121561497a57600080fd5b815161169a81614360565b6001600160a01b039384168152919092166020820152604081019190915260600190565b805169ffffffffffffffffffff81168114610e5b57600080fd5b600080600080600060a086880312156149db57600080fd5b6149e4866149a9565b9450602086015193506040860151925060608601519150614a07608087016149a9565b90509295509295909350565b60006001600160ff1b0381841382841380821686840486111615614a3957614a39614813565b600160ff1b6000871282811687830589121615614a5857614a58614813565b60008712925087820587128484161615614a7457614a74614813565b87850587128184161615614a8a57614a8a614813565b505050929093029392505050565b6000825160005b81811015614ab95760208186018101518583015201614a9f565b81811115614ac8576000828501525b509190910192915050565b602080825260149082015273151bdad95b881c185e5b595b9d0819985a5b195960621b60408201526060019056fe4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36a2646970667358221220b27a31a98994ede868ad21a3853b07a636386da8eb024be283a2a01ec39eebd264736f6c63430008090033
Deployed Bytecode
0x6080604052600436106104105760003560e01c80638456cb591161021e578063cad0055611610123578063edec5f27116100ab578063f597573f1161007a578063f597573f14610bf5578063f851a44014610c15578063f885838614610c35578063fb9a4acd14610c55578063fe575a8714610c7557600080fd5b8063edec5f2714610b7f578063f04d688f14610b9f578063f2fde38b14610bb5578063f446374314610bd557600080fd5b8063e19648db116100f2578063e19648db14610ae9578063e32204dd14610b09578063e6da921314610b29578063e985e36714610b49578063eadd94ec14610b6957600080fd5b8063cad0055614610a7d578063cb1a4fc014610a9d578063cff805ab14610ab2578063dad80e8614610ac857600080fd5b8063ae4e0a18116101a6578063ba166a3911610175578063ba166a39146109db578063bb3d676a14610a08578063c23326f314610a28578063c49cc64514610a48578063c8adff0114610a6857600080fd5b8063ae4e0a1814610968578063b00bba6a1461097b578063b02538471461099b578063b8977d6d146109bb57600080fd5b80638e15f473116101ed5780638e15f473146108dd5780639a89c1fb146108f25780639cfa0f7c14610912578063a6d42e4e14610928578063ae1042651461094857600080fd5b80638456cb591461086a57806389daf7991461087f5780638ac080821461089f5780638da5cb5b146108bf57600080fd5b80633f4ba83a1161032457806363b20117116102ac578063715018a61161027b578063715018a6146107d957806373b2e80e146107ee57806378e979251461081e5780637ad71f72146108345780637f6fb2531461085457600080fd5b806363b201171461076e57806363e4087914610784578063641046f4146107a4578063704b6c02146107b957600080fd5b8063548db174116102f3578063548db174146106d05780635bc34f71146106f05780635c975abb146107065780635ddc56881461071e5780635df4f3531461073e57600080fd5b80633f4ba83a1461066f57806343568eae146106845780634e71d92d1461069a57806353d99207146106af57600080fd5b806323a8f1c0116103a75780633197cbb6116103765780633197cbb6146105bb57806333f76178146105d157806338646608146105e75780633af32abf1461061f5780633d9c8d8b1461064f57600080fd5b806323a8f1c014610548578063278c278b1461056857806329a5a0b6146105885780632c65169e146105a857600080fd5b80630dc9c838116103e35780630dc9c838146104c7578063136021d9146104e75780631ddc6091146105075780631fa2bc921461052757600080fd5b806303b9c5ad1461041557806307f18082146104375780630a200fc71461046c5780630ba36dcd1461048c575b600080fd5b34801561042157600080fd5b50610435610430366004614305565b610ca5565b005b34801561044357600080fd5b50610457610452366004614347565b610d24565b60405190151581526020015b60405180910390f35b34801561047857600080fd5b5061043561048736600461436e565b610e60565b34801561049857600080fd5b506104b96104a73660046143a2565b60dc6020526000908152604090205481565b604051908152602001610463565b3480156104d357600080fd5b506104356104e23660046143bd565b610e86565b3480156104f357600080fd5b506104576105023660046143df565b611062565b34801561051357600080fd5b5061043561052236600461436e565b611597565b34801561053357600080fd5b5060d95461045790600160a01b900460ff1681565b34801561055457600080fd5b50610435610563366004614347565b6115bd565b34801561057457600080fd5b50610435610583366004614347565b6115ca565b34801561059457600080fd5b506104b96105a3366004614347565b61166d565b6104576105b63660046143df565b6116a1565b3480156105c757600080fd5b506104b960cb5481565b3480156105dd57600080fd5b506104b960ce5481565b3480156105f357600080fd5b5060e154610607906001600160a01b031681565b6040516001600160a01b039091168152602001610463565b34801561062b57600080fd5b5061045761063a3660046143a2565b60df6020526000908152604090205460ff1681565b34801561065b57600080fd5b5061045761066a36600461440f565b611b24565b34801561067b57600080fd5b50610435611bf9565b34801561069057600080fd5b506104b960d85481565b3480156106a657600080fd5b50610457611c0b565b3480156106bb57600080fd5b5060d95461045790600160a81b900460ff1681565b3480156106dc57600080fd5b506104356106eb366004614305565b611f67565b3480156106fc57600080fd5b506104b960d05481565b34801561071257600080fd5b5060975460ff16610457565b34801561072a57600080fd5b50610435610739366004614540565b611fe1565b34801561074a57600080fd5b506104576107593660046143a2565b60e06020526000908152604090205460ff1681565b34801561077a57600080fd5b506104b960c95481565b34801561079057600080fd5b506104b961079f366004614347565b6121d5565b3480156107b057600080fd5b506104356121f7565b3480156107c557600080fd5b506104356107d43660046143a2565b612365565b3480156107e557600080fd5b5061043561238f565b3480156107fa57600080fd5b506104576108093660046143a2565b60dd6020526000908152604090205460ff1681565b34801561082a57600080fd5b506104b960ca5481565b34801561084057600080fd5b5061060761084f366004614347565b6123a1565b34801561086057600080fd5b506104b960e25481565b34801561087657600080fd5b506104356123cb565b34801561088b57600080fd5b5061043561089a366004614305565b6123db565b3480156108ab57600080fd5b506104576108ba366004614600565b612455565b3480156108cb57600080fd5b506065546001600160a01b0316610607565b3480156108e957600080fd5b506104b96126ca565b3480156108fe57600080fd5b5061043561090d3660046143bd565b61276a565b34801561091e57600080fd5b506104b960cf5481565b34801561093457600080fd5b50610435610943366004614646565b61277d565b34801561095457600080fd5b506104b9610963366004614347565b612792565b6104576109763660046146e1565b612ac6565b34801561098757600080fd5b506104356109963660046143a2565b613017565b3480156109a757600080fd5b506104576109b6366004614721565b613139565b3480156109c757600080fd5b506104356109d636600461436e565b6132a9565b3480156109e757600080fd5b506109fb6109f6366004614347565b6132cf565b604051610463919061474d565b348015610a1457600080fd5b50610435610a23366004614305565b61333b565b348015610a3457600080fd5b506104b9610a43366004614347565b6133b5565b348015610a5457600080fd5b5060db54610607906001600160a01b031681565b348015610a7457600080fd5b506109fb6133d6565b348015610a8957600080fd5b50610435610a983660046143a2565b61342e565b348015610aa957600080fd5b506104576134a7565b348015610abe57600080fd5b506104b960d45481565b348015610ad457600080fd5b5060e15461045790600160a01b900460ff1681565b348015610af557600080fd5b506104b9610b04366004614347565b6136de565b348015610b1557600080fd5b5060d954610607906001600160a01b031681565b348015610b3557600080fd5b506104b9610b443660046143bd565b6136ee565b348015610b5557600080fd5b5060cd54610607906001600160a01b031681565b348015610b7557600080fd5b506104b960d55481565b348015610b8b57600080fd5b50610435610b9a366004614305565b613722565b348015610bab57600080fd5b506104b960cc5481565b348015610bc157600080fd5b50610435610bd03660046143a2565b61379c565b348015610be157600080fd5b50610435610bf0366004614305565b613815565b348015610c0157600080fd5b5060da54610607906001600160a01b031681565b348015610c2157600080fd5b5060e354610607906001600160a01b031681565b348015610c4157600080fd5b506104b9610c50366004614347565b61388f565b348015610c6157600080fd5b50610435610c70366004614791565b61389f565b348015610c8157600080fd5b50610457610c903660046143a2565b60de6020526000908152604090205460ff1681565b610cad613994565b60005b81811015610d1f57600160e06000858585818110610cd057610cd06147fd565b9050602002016020810190610ce591906143a2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d1781614829565b915050610cb0565b505050565b6000610d2e613994565b600060cc5411610d855760405162461bcd60e51b815260206004820152601a60248201527f496e697469616c20636c61696d2064617461206e6f742073657400000000000060448201526064015b60405180910390fd5b60cb548211610dc95760405162461bcd60e51b815260206004820152601060248201526f53616c6520696e2070726f677265737360801b6044820152606401610d7c565b428211610e0e5760405162461bcd60e51b815260206004820152601360248201527210db185a5b481cdd185c9d081a5b881c185cdd606a1b6044820152606401610d7c565b60cc8054908390556040805182815260208101859052428183015290517f5f3a900c85949962b4cc192dd3714dae64071dc2e907049ec720b023270905a49181900360600190a160019150505b919050565b610e68613994565b60d98054911515600160a01b0260ff60a01b19909216919091179055565b610e8e613994565b6000821180610e9d5750600081115b610ede5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b6044820152606401610d7c565b8115610fc35760ca544210610f2c5760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606401610d7c565b814210610f6f5760405162461bcd60e51b815260206004820152601160248201527014d85b19481d1a5b59481a5b881c185cdd607a1b6044820152606401610d7c565b60ca8054908390556040805182815260208101859052428183015290516414d510549560da1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b801561105e5760ca54811161100c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420656e6454696d6560881b6044820152606401610d7c565b60cb8054908290556040805182815260208101849052428183015290516211539160ea1b917fddd2ed237e6993c9380182683f2c8bec486aaaa429528852cd74dbdb96cea0b2919081900360600190a2505b5050565b60008260ca544210158015611079575060cb544211155b6110955760405162461bcd60e51b8152600401610d7c90614844565b600081116110b55760405162461bcd60e51b8152600401610d7c9061487b565b6110bd6139ee565b60006110c885612792565b90508460c960008282546110dc91906148a8565b90915550600090506110f364e8d4a51000836148c0565b905060d454600014611117578560d4600082825461111191906148a8565b90915550505b600060d45460c9541161112c5760d454611130565b60c9545b905060d160000160d0548154811061114a5761114a6147fd565b9060005260206000200154811180611184575060d160020160d05481548110611175576111756147fd565b90600052602060002001544210155b156112b35760d160020160d054815481106111a1576111a16147fd565b906000526020600020015442106111e4578660d160000160d054815481106111cb576111cb6147fd565b90600052602060002001546111e091906148a8565b60d4555b60d954600160a01b900460ff16156111fe576111fe613a34565b600060d1810160d05481548110611217576112176147fd565b9060005260206000200154821161125b578160d160000160d05481548110611241576112416147fd565b906000526020600020015461125691906148e2565b61125e565b60005b60d780546001818101835560009283527f8a012a6de2943a5aa4d77acf5e695d4456760a3f1f30a5d6dc2079599187a07190910183905560d0805493945090929091906112ac9084906148a8565b9091555050505b85156113f65760e154600160a01b900460ff16156112fa5733600090815260df602052604090205460ff166112fa5760405162461bcd60e51b8152600401610d7c906148f9565b60e1546001600160a01b03166391c619663360ce54611319908b614930565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561135f57600080fd5b505af1158015611373573d6000803e3d6000fd5b505050508660e2600082825461138991906148a8565b909155505060da546001600160a01b031687336001600160a01b03167f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a8587426040516113e9939291909283526020830191909152604082015260600190565b60405180910390a4611479565b60ce546114039088614930565b33600090815260dc6020526040812080549091906114229084906148a8565b909155505060da546001600160a01b031687336001600160a01b0316600080516020614b02833981519152858742604051611470939291909283526020830191909152604082015260600190565b60405180910390a45b8260d5600082825461148b91906148a8565b909155505060da546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156114ea57600080fd5b505afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611522919061494f565b90508083111561157e5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b6064820152608401610d7c565b61158783613aa4565b60019550505050505b5092915050565b61159f613994565b60d98054911515600160a81b0260ff60a81b19909216919091179055565b6115c5613994565b60d855565b6115d2613994565b600081116116225760405162461bcd60e51b815260206004820152601c60248201527f5a65726f206d617820746f6b656e7320746f206275792076616c7565000000006044820152606401610d7c565b60cf8054908290556040805182815260208101849052428183015290517f76f9e5e1f6af6a9f180708b77a5c99210fbf19b91f1f194f3918c262b8edf77c9181900360600190a15050565b60008061167983612792565b90506116836126ca565b60ce546116909083614930565b61169a91906148c0565b9392505050565b60008260ca5442101580156116b8575060cb544211155b6116d45760405162461bcd60e51b8152600401610d7c90614844565b600081116116f45760405162461bcd60e51b8152600401610d7c9061487b565b6116fc6139ee565b611704613e1b565b600061170f85612792565b9050600061171b6126ca565b60ce546117289084614930565b61173291906148c0565b9050803410156117735760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d7c565b600061177f82346148e2565b90508660c9600082825461179391906148a8565b909155505060d454156117b8578660d460008282546117b291906148a8565b90915550505b600060d45460c954116117cd5760d4546117d1565b60c9545b905060d160000160d054815481106117eb576117eb6147fd565b9060005260206000200154811180611825575060d160020160d05481548110611816576118166147fd565b90600052602060002001544210155b156119545760d160020160d05481548110611842576118426147fd565b90600052602060002001544210611885578760d160000160d0548154811061186c5761186c6147fd565b906000526020600020015461188191906148a8565b60d4555b60d954600160a01b900460ff161561189f5761189f613a34565b600060d1810160d054815481106118b8576118b86147fd565b906000526020600020015482116118fc578160d160000160d054815481106118e2576118e26147fd565b90600052602060002001546118f791906148e2565b6118ff565b60005b60d780546001818101835560009283527f8a012a6de2943a5aa4d77acf5e695d4456760a3f1f30a5d6dc2079599187a07190910183905560d08054939450909290919061194d9084906148a8565b9091555050505b8615611a7b5760e154600160a01b900460ff161561199b5733600090815260df602052604090205460ff1661199b5760405162461bcd60e51b8152600401610d7c906148f9565b60e1546001600160a01b03166391c619663360ce546119ba908c614930565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a0057600080fd5b505af1158015611a14573d6000803e3d6000fd5b505050508760e26000828254611a2a91906148a8565b90915550506040805184815260208101869052428183015290516000918a9133917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a4611ae2565b60ce54611a889089614930565b33600090815260dc602052604081208054909190611aa79084906148a8565b90915550506040805184815260208101869052428183015290516000918a913391600080516020614b02833981519152919081900360600190a45b8360d56000828254611af491906148a8565b90915550611b03905083613e75565b8115611b1357611b133383613fd2565b600195505050505061159060018055565b6000611b2e613994565b60d154851115611b705760405162461bcd60e51b815260206004820152600d60248201526c0d2dcecc2d8d2c840d2dcc8caf609b1b6044820152606401610d7c565b8315611b9a578360d16000018681548110611b8d57611b8d6147fd565b6000918252602090912001555b8215611bc4578260d16001018681548110611bb757611bb76147fd565b6000918252602090912001555b8115611bee578160d16002018681548110611be157611be16147fd565b6000918252602090912001555b506001949350505050565b611c01613994565b611c096140a8565b565b6000611c156139ee565b60cd546001600160a01b0316611c645760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d7c565b33600090815260de602052604090205460ff1615611cc45760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d7c565b60d954600160a81b900460ff1615611d355733600090815260df602052604090205460ff16611d355760405162461bcd60e51b815260206004820152601e60248201527f55736572206e6f742077686974656c697374656420666f7220636c61696d00006044820152606401610d7c565b60cc54421015611d875760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f74207374617274656420796574000000000000006044820152606401610d7c565b33600090815260dd602052604090205460ff1615611dd95760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b6044820152606401610d7c565b33600090815260dd60209081526040808320805460ff1916600117905560dc90915290205480611e3e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b6044820152606401610d7c565b33600081815260dc6020908152604080832083905560cd54815163a9059cbb60e01b8152600481019590955260248501869052905192936001600160a01b039091169263a9059cbb9260448084019391929182900301818787803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edd9190614968565b905080611f245760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610d7c565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a260019250505090565b611f6f613994565b60005b81811015610d1f57600060df6000858585818110611f9257611f926147fd565b9050602002016020810190611fa791906143a2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611fd981614829565b915050611f72565b611fe9613994565b805182511461202e5760405162461bcd60e51b81526020600482015260116024820152704d69736d6174636865642061727261797360781b6044820152606401610d7c565b61203a60e560006141d2565b61204660e460006141d2565b6000805b8351811015612184576000838281518110612067576120676147fd565b6020026020010151116120c65760405162461bcd60e51b815260206004820152602160248201527f50657263656e74616765206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608401610d7c565b8281815181106120d8576120d86147fd565b6020026020010151826120eb91906148a8565b915060e5848281518110612101576121016147fd565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03909216919091179055825160e490849083908110612153576121536147fd565b602090810291909101810151825460018101845560009384529190922001558061217c81614829565b91505061204a565b5080606414610d1f5760405162461bcd60e51b815260206004820152601f60248201527f546f74616c2070657263656e74616765206d75737420657175616c20313030006044820152606401610d7c565b60006121e082612792565b90506121f164e8d4a51000826148c0565b92915050565b60e3546001600160a01b031633148061221a57506065546001600160a01b031633145b6122665760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206e6f742061646d696e206f72206f776e6572000000000000006044820152606401610d7c565b60d45460d680546001810182556000919091527fe767803f8ecf1dee6bb0345811f7312cda556058b19db6389ad9ae3568643ddd015560d954600160a01b900460ff16156122b6576122b6613a34565b60d160000160d054815481106122ce576122ce6147fd565b906000526020600020015460d454101561234e5760d45460d79060d160000160d05481548110612300576123006147fd565b906000526020600020015461231591906148e2565b8154600181018355600092835260208320015560d10160d0548154811061233e5761233e6147fd565b60009182526020909120015460d4555b60d0805490600061235e83614829565b9190505550565b61236d613994565b60e380546001600160a01b0319166001600160a01b0392909216919091179055565b612397613994565b611c0960006140fa565b60e581815481106123b157600080fd5b6000918252602090912001546001600160a01b0316905081565b6123d3613994565b611c0961414c565b6123e3613994565b60005b81811015610d1f57600060de6000858585818110612406576124066147fd565b905060200201602081019061241b91906143a2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061244d81614829565b9150506123e6565b600061245f613994565b6001600160a01b0383166124aa5760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b6044820152606401610d7c565b60cc54156124ee5760405162461bcd60e51b815260206004820152601160248201527010db185a5b48185b1c9958591e481cd95d607a1b6044820152606401610d7c565b60cc85905560cd80546001600160a01b038581166001600160a01b0319928316811790935560d9805460ff60a81b1916600160a81b17905560e1805491861691909216811790915560405163095ea7b360e01b81526004810191909152600019602482015263095ea7b390604401602060405180830381600087803b15801561257657600080fd5b505af115801561258a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ae9190614968565b506040516323b872dd60e01b81526000906001600160a01b038516906323b872dd906125e290339030908a90600401614985565b602060405180830381600087803b1580156125fc57600080fd5b505af1158015612610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126349190614968565b90508061267b5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610d7c565b604080518681524260208201526001600160a01b038616917fdc9670dbabdd488b372eb16ebe49a39b3124a12cdffdcefbc89834a408bf8ff8910160405180910390a250600195945050505050565b60008060db60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561271b57600080fd5b505afa15801561272f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275391906149c3565b505050915050806402540be4006121f19190614a13565b612772613994565b60d09190915560d455565b612785613994565b61105e60d18260036141f0565b600080600060d4546000146127a95760d4546127ad565b60c9545b905060cf548411156128015760405162461bcd60e51b815260206004820181905260248201527f416d6f756e742065786365656473206d617820746f6b656e7320746f206275796044820152606401610d7c565b60d160000160d05481548110612819576128196147fd565b9060005260206000200154818561283091906148a8565b118061285e575060d160020160d0548154811061284f5761284f6147fd565b90600052602060002001544210155b15612a905760d154612872906001906148e2565b60d054106128b15760405162461bcd60e51b815260206004820152600c60248201526b57726f6e6720706172616d7360a01b6044820152606401610d7c565b60d160020160d054815481106128c9576128c96147fd565b906000526020600020015442106129dc5760d05460d1906128eb9060016148a8565b815481106128fb576128fb6147fd565b90600052602060002001548460d160006003811061291b5761291b6147fd565b0160d0548154811061292f5761292f6147fd565b906000526020600020015461294491906148a8565b111561299e5760405162461bcd60e51b815260206004820152602360248201527f43616e74205075726368617365204d6f726520696e20696e646976696475616c604482015262040e8f60eb1b6064820152608401610d7c565b60d05460d2906129af9060016148a8565b815481106129bf576129bf6147fd565b9060005260206000200154846129d59190614930565b9150611590565b60008160d1820160d054815481106129f6576129f66147fd565b9060005260206000200154612a0b91906148e2565b60d05490915060d290612a1f9060016148a8565b81548110612a2f57612a2f6147fd565b90600052602060002001548186612a4691906148e2565b612a509190614930565b60d160010160d05481548110612a6857612a686147fd565b906000526020600020015482612a7e9190614930565b612a8891906148a8565b925050611590565b60d160010160d05481548110612aa857612aa86147fd565b906000526020600020015484612abe9190614930565b949350505050565b60008260ca544210158015612add575060cb544211155b612af95760405162461bcd60e51b8152600401610d7c90614844565b60008111612b195760405162461bcd60e51b8152600401610d7c9061487b565b612b216139ee565b612b29613e1b565b33600090815260e0602052604090205460ff16612b885760405162461bcd60e51b815260206004820181905260248201527f55736572206e6f742077686974656c697374656420666f7220746869732074786044820152606401610d7c565b6000612b9385612792565b90506000612b9f6126ca565b60ce54612bac9084614930565b612bb691906148c0565b905080341015612bf75760405162461bcd60e51b815260206004820152600c60248201526b13195cdcc81c185e5b595b9d60a21b6044820152606401610d7c565b6000612c0382346148e2565b90508660c96000828254612c1791906148a8565b909155505060d45415612c3c578660d46000828254612c3691906148a8565b90915550505b600060d45460c95411612c515760d454612c55565b60c9545b905060d160000160d05481548110612c6f57612c6f6147fd565b9060005260206000200154811180612ca9575060d160020160d05481548110612c9a57612c9a6147fd565b90600052602060002001544210155b15612dd85760d160020160d05481548110612cc657612cc66147fd565b90600052602060002001544210612d09578760d160000160d05481548110612cf057612cf06147fd565b9060005260206000200154612d0591906148a8565b60d4555b60d954600160a01b900460ff1615612d2357612d23613a34565b600060d1810160d05481548110612d3c57612d3c6147fd565b90600052602060002001548211612d80578160d160000160d05481548110612d6657612d666147fd565b9060005260206000200154612d7b91906148e2565b612d83565b60005b60d780546001818101835560009283527f8a012a6de2943a5aa4d77acf5e695d4456760a3f1f30a5d6dc2079599187a07190910183905560d080549394509092909190612dd19084906148a8565b9091555050505b8615612f165760e154600160a01b900460ff1615612e28576001600160a01b038916600090815260df602052604090205460ff16612e285760405162461bcd60e51b8152600401610d7c906148f9565b60e15460ce546001600160a01b03909116906391c61966908b90612e4c908c614930565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b505050508760e26000828254612ebc91906148a8565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d16917f6f225532a9c33b023b8e48247ad8df9d98f132ae17c769b97ff22d2b278fa73a919081900360600190a4612f8f565b60ce54612f239089614930565b6001600160a01b038a16600090815260dc602052604081208054909190612f4b9084906148a8565b90915550506040805184815260208101869052428183015290516000918a916001600160a01b038d1691600080516020614b02833981519152919081900360600190a45b8360d56000828254612fa191906148a8565b90915550612fb0905083613e75565b8115612fc057612fc08983613fd2565b6040805184815260208101869052428183015290516000918a916001600160a01b038d1691600080516020614b02833981519152919081900360600190a4600195505050505061300f60018055565b509392505050565b61301f613994565b6001600160a01b03811661309b5760405162461bcd60e51b815260206004820152603760248201527f7374616b696e67206d616e616765722063616e6e6f7420626520696e6174696160448201527f6c697a65642077697468207a65726f20616464726573730000000000000000006064820152608401610d7c565b60e180546001600160a01b0319166001600160a01b0383811691821790925560cd5460405163095ea7b360e01b8152600481019290925260001960248301529091169063095ea7b390604401602060405180830381600087803b15801561310157600080fd5b505af1158015613115573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e9190614968565b6000613143613994565b6000841161318a5760405162461bcd60e51b8152602060048201526014602482015273696e76616c6964206e6f206f6620746f6b656e7360601b6044820152606401610d7c565b600083116131ce5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206e657720707269636560781b6044820152606401610d7c565b600082116132115760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206e65772074696d6560801b6044820152606401610d7c565b5060d1805460018082019092557f695fb3134ad82c3b8022bc5464edd0bcc9424ef672b52245dcb6ab2374327ce3019390935560d280548085019091557ff2192e1030363415d7b4fb0406540a0060e8e2fc8982f3f32289379e11fa6546019190915560d3805480840182556000919091527f915c3eb987b20e1af620c1403197bf687fb7f18513b3a73fde6e78c7072c41a6015590565b6132b1613994565b60e18054911515600160a01b0260ff60a01b19909216919091179055565b606060d182600381106132e4576132e46147fd565b0180548060200260200160405190810160405280929190818152602001828054801561332f57602002820191906000526020600020905b81548152602001906001019080831161331b575b50505050509050919050565b613343613994565b60005b81811015610d1f57600160de6000858585818110613366576133666147fd565b905060200201602081019061337b91906143a2565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806133ad81614829565b915050613346565b60d781815481106133c557600080fd5b600091825260209091200154905081565b606060d780548060200260200160405190810160405280929190818152602001828054801561342457602002820191906000526020600020905b815481526020019060010190808311613410575b5050505050905090565b613436613994565b6001600160a01b0381166134855760405162461bcd60e51b8152602060048201526016602482015275616464726573732063616e6e6f74206265207a65726f60501b6044820152606401610d7c565b60d980546001600160a01b0319166001600160a01b0392909216919091179055565b60006134b16139ee565b60cd546001600160a01b03166135005760405162461bcd60e51b815260206004820152601460248201527314d85b19481d1bdad95b881b9bdd08185919195960621b6044820152606401610d7c565b33600090815260de602052604090205460ff16156135605760405162461bcd60e51b815260206004820152601b60248201527f54686973204164647265737320697320426c61636b6c697374656400000000006044820152606401610d7c565b60e154600160a01b900460ff16156135a15733600090815260df602052604090205460ff166135a15760405162461bcd60e51b8152600401610d7c906148f9565b33600090815260dc6020526040902054806135f15760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f207374616b6560801b6044820152606401610d7c565b60e1546001600160a01b03166391c61966336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561364b57600080fd5b505af115801561365f573d6000803e3d6000fd5b5050505060dc600061366e3390565b6001600160a01b031681526020810191909152604001600090812055336001600160a01b03167ffa4ec67f9254455933eb145bae864b26f29dd0a7bbb76eb11e4d6b8b9b184c2b82426040516136ce929190918252602082015260400190565b60405180910390a2600191505090565b60d681815481106133c557600080fd5b60d182600381106136fe57600080fd5b01818154811061370d57600080fd5b90600052602060002001600091509150505481565b61372a613994565b60005b81811015610d1f57600160df600085858581811061374d5761374d6147fd565b905060200201602081019061376291906143a2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061379481614829565b91505061372d565b6137a4613994565b6001600160a01b0381166138095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d7c565b613812816140fa565b50565b61381d613994565b60005b81811015610d1f57600060e06000858585818110613840576138406147fd565b905060200201602081019061385591906143a2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061388781614829565b915050613820565b60e481815481106133c557600080fd5b6138a7613994565b8281146138e85760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610d7c565b60005b8381101561397e57828282818110613905576139056147fd565b9050602002013560dc6000878785818110613922576139226147fd565b905060200201602081019061393791906143a2565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461396691906148a8565b9091555081905061397681614829565b9150506138eb565b5050505050565b6001600160a01b03163b151590565b6065546001600160a01b03163314611c095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d7c565b60975460ff1615611c095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d7c565b60005b60d05460d354613a4791906148e2565b8110156138125760d854613a5b9082614930565b613a6590426148a8565b60d05460d390613a769084906148a8565b81548110613a8657613a866147fd565b60009182526020909120015580613a9c81614829565b915050613a37565b60e554613bc35760d9546001600160a01b0316613afc5760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d7c565b60da546000906001600160a01b03163360d954604051613b2b92916001600160a01b0316908690602401614985565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613b609190614a98565b6000604051808303816000865af19150503d8060008114613b9d576040519150601f19603f3d011682016040523d82523d6000602084013e613ba2565b606091505b505090508061105e5760405162461bcd60e51b8152600401610d7c90614ad3565b6000805b60e554811015613d0f576000606460e48381548110613be857613be86147fd565b906000526020600020015485613bfe9190614930565b613c0891906148c0565b60da549091506000906001600160a01b03163360e58581548110613c2e57613c2e6147fd565b600091825260209091200154604051613c5692916001600160a01b0316908690602401614985565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613c8b9190614a98565b6000604051808303816000865af19150503d8060008114613cc8576040519150601f19603f3d011682016040523d82523d6000602084013e613ccd565b606091505b5050905080613cee5760405162461bcd60e51b8152600401610d7c90614ad3565b613cf882856148a8565b935050508080613d0790614829565b915050613bc7565b506000613d1c82846148e2565b111561105e5760da546000906001600160a01b03163360e58054613d42906001906148e2565b81548110613d5257613d526147fd565b6000918252602090912001546001600160a01b0316613d7185876148e2565b604051602401613d8393929190614985565b60408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251613db89190614a98565b6000604051808303816000865af19150503d8060008114613df5576040519150601f19603f3d011682016040523d82523d6000602084013e613dfa565b606091505b5050905080610d1f5760405162461bcd60e51b8152600401610d7c90614ad3565b60026001541415613e6e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d7c565b6002600155565b60e554613ee35760d9546001600160a01b0316613ecd5760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d081dd85b1b195d081b9bdd081cd95d60521b6044820152606401610d7c565b60d954613812906001600160a01b031682613fd2565b6000805b60e554811015613f7b576000606460e48381548110613f0857613f086147fd565b906000526020600020015485613f1e9190614930565b613f2891906148c0565b9050613f5b60e58381548110613f4057613f406147fd565b6000918252602090912001546001600160a01b031682613fd2565b613f6581846148a8565b9250508080613f7390614829565b915050613ee7565b506000613f8882846148e2565b111561105e5760e5805461105e9190613fa3906001906148e2565b81548110613fb357613fb36147fd565b6000918252602090912001546001600160a01b0316613fd283856148e2565b804710156140105760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b6044820152606401610d7c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461405d576040519150601f19603f3d011682016040523d82523d6000602084013e614062565b606091505b5050905080610d1f5760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b6044820152606401610d7c565b6140b0614189565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6141546139ee565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586140dd3390565b60975460ff16611c095760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d7c565b50805460008255906000526020600020908101906138129190614240565b8260038101928215614230579160200282015b828111156142305782518051614220918491602090910190614255565b5091602001919060010190614203565b5061423c92915061429c565b5090565b5b8082111561423c5760008155600101614241565b828054828255906000526020600020908101928215614290579160200282015b82811115614290578251825591602001919060010190614275565b5061423c929150614240565b8082111561423c5760006142b082826141d2565b5060010161429c565b60008083601f8401126142cb57600080fd5b50813567ffffffffffffffff8111156142e357600080fd5b6020830191508360208260051b85010111156142fe57600080fd5b9250929050565b6000806020838503121561431857600080fd5b823567ffffffffffffffff81111561432f57600080fd5b61433b858286016142b9565b90969095509350505050565b60006020828403121561435957600080fd5b5035919050565b801515811461381257600080fd5b60006020828403121561438057600080fd5b813561169a81614360565b80356001600160a01b0381168114610e5b57600080fd5b6000602082840312156143b457600080fd5b61169a8261438b565b600080604083850312156143d057600080fd5b50508035926020909101359150565b600080604083850312156143f257600080fd5b82359150602083013561440481614360565b809150509250929050565b6000806000806080858703121561442557600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561447a5761447a614441565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156144a9576144a9614441565b604052919050565b600067ffffffffffffffff8211156144cb576144cb614441565b5060051b60200190565b600082601f8301126144e657600080fd5b813560206144fb6144f6836144b1565b614480565b82815260059290921b8401810191818101908684111561451a57600080fd5b8286015b84811015614535578035835291830191830161451e565b509695505050505050565b6000806040838503121561455357600080fd5b823567ffffffffffffffff8082111561456b57600080fd5b818501915085601f83011261457f57600080fd5b8135602061458f6144f6836144b1565b82815260059290921b840181019181810190898411156145ae57600080fd5b948201945b838610156145d3576145c48661438b565b825294820194908201906145b3565b965050860135925050808211156145e957600080fd5b506145f6858286016144d5565b9150509250929050565b6000806000806080858703121561461657600080fd5b843593506020850135925061462d6040860161438b565b915061463b6060860161438b565b905092959194509250565b6000602080838503121561465957600080fd5b823567ffffffffffffffff8082111561467157600080fd5b818501915085601f83011261468557600080fd5b61468d614457565b80606084018881111561469f57600080fd5b845b818110156146d3578035858111156146b95760008081fd5b6146c58b8289016144d5565b8552509286019286016146a1565b509098975050505050505050565b6000806000606084860312156146f657600080fd5b6146ff8461438b565b925060208401359150604084013561471681614360565b809150509250925092565b60008060006060848603121561473657600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b8181101561478557835183529284019291840191600101614769565b50909695505050505050565b600080600080604085870312156147a757600080fd5b843567ffffffffffffffff808211156147bf57600080fd5b6147cb888389016142b9565b909650945060208701359150808211156147e457600080fd5b506147f1878288016142b9565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561483d5761483d614813565b5060010190565b60208082526017908201527f496e76616c69642074696d6520666f7220627579696e67000000000000000000604082015260600190565b602080825260139082015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b604082015260600190565b600082198211156148bb576148bb614813565b500190565b6000826148dd57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156148f4576148f4614813565b500390565b6020808252601e908201527f55736572206e6f742077686974656c697374656420666f72207374616b650000604082015260600190565b600081600019048311821515161561494a5761494a614813565b500290565b60006020828403121561496157600080fd5b5051919050565b60006020828403121561497a57600080fd5b815161169a81614360565b6001600160a01b039384168152919092166020820152604081019190915260600190565b805169ffffffffffffffffffff81168114610e5b57600080fd5b600080600080600060a086880312156149db57600080fd5b6149e4866149a9565b9450602086015193506040860151925060608601519150614a07608087016149a9565b90509295509295909350565b60006001600160ff1b0381841382841380821686840486111615614a3957614a39614813565b600160ff1b6000871282811687830589121615614a5857614a58614813565b60008712925087820587128484161615614a7457614a74614813565b87850587128184161615614a8a57614a8a614813565b505050929093029392505050565b6000825160005b81811015614ab95760208186018101518583015201614a9f565b81811115614ac8576000828501525b509190910192915050565b602080825260149082015273151bdad95b881c185e5b595b9d0819985a5b195960621b60408201526060019056fe4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36a2646970667358221220b27a31a98994ede868ad21a3853b07a636386da8eb024be283a2a01ec39eebd264736f6c63430008090033
Deployed Bytecode Sourcemap
29507:24666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47181:228;;;;;;;;;;-1:-1:-1;47181:228:0;;;;;:::i;:::-;;:::i;:::-;;45082:428;;;;;;;;;;-1:-1:-1;45082:428:0;;;;;:::i;:::-;;:::i;:::-;;;1178:14:1;;1171:22;1153:41;;1141:2;1126:18;45082:428:0;;;;;;;;52621:117;;;;;;;;;;-1:-1:-1;52621:117:0;;;;;:::i;:::-;;:::i;30252:47::-;;;;;;;;;;-1:-1:-1;30252:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2089:25:1;;;2077:2;2062:18;30252:47:0;1943:177:1;33192:717:0;;;;;;;;;;-1:-1:-1;33192:717:0;;;;;:::i;:::-;;:::i;35130:1632::-;;;;;;;;;;-1:-1:-1;35130:1632:0;;;;;:::i;:::-;;:::i;49936:107::-;;;;;;;;;;-1:-1:-1;49936:107:0;;;;;:::i;:::-;;:::i;30100:27::-;;;;;;;;;;-1:-1:-1;30100:27:0;;;;-1:-1:-1;;;30100:27:0;;;;;;50740:108;;;;;;;;;;-1:-1:-1;50740:108:0;;;;;:::i;:::-;;:::i;47829:300::-;;;;;;;;;;-1:-1:-1;47829:300:0;;;;;:::i;:::-;;:::i;40808:197::-;;;;;;;;;;-1:-1:-1;40808:197:0;;;;;:::i;:::-;;:::i;36915:1670::-;;;;;;:::i;:::-;;:::i;29681:22::-;;;;;;;;;;;;;;;;29767:27;;;;;;;;;;;;;;;;30505:45;;;;;;;;;;-1:-1:-1;30505:45:0;;;;-1:-1:-1;;;;;30505:45:0;;;;;;-1:-1:-1;;;;;2878:32:1;;;2860:51;;2848:2;2833:18;30505:45:0;2692:225:1;30401:45:0;;;;;;;;;;-1:-1:-1;30401:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53120:450;;;;;;;;;;-1:-1:-1;53120:450:0;;;;;:::i;:::-;;:::i;31894:61::-;;;;;;;;;;;;;:::i;30035:27::-;;;;;;;;;;;;;;;;45579:835;;;;;;;;;;;;;:::i;30132:30::-;;;;;;;;;;-1:-1:-1;30132:30:0;;;;-1:-1:-1;;;30132:30:0;;;;;;49596:240;;;;;;;;;;-1:-1:-1;49596:240:0;;;;;:::i;:::-;;:::i;29833:26::-;;;;;;;;;;;;;;;;21484:86;;;;;;;;;;-1:-1:-1;21555:7:0;;;;21484:86;;34181:585;;;;;;;;;;-1:-1:-1;34181:585:0;;;;;:::i;:::-;;:::i;30451:47::-;;;;;;;;;;-1:-1:-1;30451:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29617:30;;;;;;;;;;;;;;;;41126:165;;;;;;;;;;-1:-1:-1;41126:165:0;;;;;:::i;:::-;;:::i;51598:427::-;;;;;;;;;;;;;:::i;52114:80::-;;;;;;;;;;-1:-1:-1;52114:80:0;;;;;:::i;:::-;;:::i;24753:103::-;;;;;;;;;;;;;:::i;30304:42::-;;;;;;;;;;-1:-1:-1;30304:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29652:24;;;;;;;;;;;;;;;;30693;;;;;;;;;;-1:-1:-1;30693:24:0;;;;;:::i;:::-;;:::i;30595:35::-;;;;;;;;;;;;;;;;31783:57;;;;;;;;;;;;;:::i;48777:240::-;;;;;;;;;;-1:-1:-1;48777:240:0;;;;;:::i;:::-;;:::i;43994:752::-;;;;;;;;;;-1:-1:-1;43994:752:0;;;;;:::i;:::-;;:::i;24105:87::-;;;;;;;;;;-1:-1:-1;24178:6:0;;-1:-1:-1;;;;;24178:6:0;24105:87;;33981:194;;;;;;;;;;;;;:::i;52368:142::-;;;;;;;;;;-1:-1:-1;52368:142:0;;;;;:::i;:::-;;:::i;29799:29::-;;;;;;;;;;;;;;;;48135:103;;;;;;;;;;-1:-1:-1;48135:103:0;;;;;:::i;:::-;;:::i;32078:984::-;;;;;;;;;;-1:-1:-1;32078:984:0;;;;;:::i;:::-;;:::i;38859:1829::-;;;;;;:::i;:::-;;:::i;43403:352::-;;;;;;;;;;-1:-1:-1;43403:352:0;;;;;:::i;:::-;;:::i;53774:396::-;;;;;;;;;;-1:-1:-1;53774:396:0;;;;;:::i;:::-;;:::i;44846:115::-;;;;;;;;;;-1:-1:-1;44846:115:0;;;;;:::i;:::-;;:::i;50946:107::-;;;;;;;;;;-1:-1:-1;50946:107:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48397:207::-;;;;;;;;;;-1:-1:-1;48397:207:0;;;;;:::i;:::-;;:::i;29991:39::-;;;;;;;;;;-1:-1:-1;29991:39:0;;;;;:::i;:::-;;:::i;30210:37::-;;;;;;;;;;-1:-1:-1;30210:37:0;;;;-1:-1:-1;;;;;30210:37:0;;;52744:115;;;;;;;;;;;;;:::i;50162:194::-;;;;;;;;;;-1:-1:-1;50162:194:0;;;;;:::i;:::-;;:::i;46420:625::-;;;;;;;;;;;;;:::i;29895:25::-;;;;;;;;;;;;;;;;30555:35;;;;;;;;;;-1:-1:-1;30555:35:0;;;;-1:-1:-1;;;30555:35:0;;;;;;29954:32;;;;;;;;;;-1:-1:-1;29954:32:0;;;;;:::i;:::-;;:::i;30067:28::-;;;;;;;;;;-1:-1:-1;30067:28:0;;;;-1:-1:-1;;;;;30067:28:0;;;29864:26;;;;;;;;;;-1:-1:-1;29864:26:0;;;;;:::i;:::-;;:::i;29738:24::-;;;;;;;;;;-1:-1:-1;29738:24:0;;;;-1:-1:-1;;;;;29738:24:0;;;29925;;;;;;;;;;;;;;;;49196:207;;;;;;;;;;-1:-1:-1;49196:207:0;;;;;:::i;:::-;;:::i;29708:25::-;;;;;;;;;;;;;;;;25011:201;;;;;;;;;;-1:-1:-1;25011:201:0;;;;;:::i;:::-;;:::i;47559:264::-;;;;;;;;;;-1:-1:-1;47559:264:0;;;;;:::i;:::-;;:::i;30167:38::-;;;;;;;;;;-1:-1:-1;30167:38:0;;;;-1:-1:-1;;;;;30167:38:0;;;30635:20;;;;;;;;;;-1:-1:-1;30635:20:0;;;;-1:-1:-1;;;;;30635:20:0;;;30660:28;;;;;;;;;;-1:-1:-1;30660:28:0;;;;;:::i;:::-;;:::i;51239:291::-;;;;;;;;;;-1:-1:-1;51239:291:0;;;;;:::i;:::-;;:::i;30351:45::-;;;;;;;;;;-1:-1:-1;30351:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47181:228;23991:13;:11;:13::i;:::-;47285:9:::1;47280:124;47300:32:::0;;::::1;47280:124;;;47392:4;47348:15;:41;47364:21;;47386:1;47364:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47348:41:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47348:41:0;:48;;-1:-1:-1;;47348:48:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47334:3;::::1;::::0;::::1;:::i;:::-;;;;47280:124;;;;47181:228:::0;;:::o;45082:428::-;45157:4;23991:13;:11;:13::i;:::-;45191:1:::1;45178:10;;:14;45170:53;;;::::0;-1:-1:-1;;;45170:53:0;;10786:2:1;45170:53:0::1;::::0;::::1;10768:21:1::0;10825:2;10805:18;;;10798:30;10864:28;10844:18;;;10837:56;10910:18;;45170:53:0::1;;;;;;;;;45252:7;;45238:11;:21;45230:50;;;::::0;-1:-1:-1;;;45230:50:0;;11141:2:1;45230:50:0::1;::::0;::::1;11123:21:1::0;11180:2;11160:18;;;11153:30;-1:-1:-1;;;11199:18:1;;;11192:46;11255:18;;45230:50:0::1;10939:340:1::0;45230:50:0::1;45309:15;45295:11;:29;45287:61;;;::::0;-1:-1:-1;;;45287:61:0;;11486:2:1;45287:61:0::1;::::0;::::1;11468:21:1::0;11525:2;11505:18;;;11498:30;-1:-1:-1;;;11544:18:1;;;11537:49;11603:18;;45287:61:0::1;11284:343:1::0;45287:61:0::1;45375:10;::::0;;45392:24;;;;45428:58:::1;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;45470:15:0::1;11918:18:1::0;;;11911:34;45428:58:0;;::::1;::::0;;;;11822:2:1;45428:58:0;;::::1;45500:4;45493:11;;;24015:1;45082:428:::0;;;:::o;52621:117::-;23991:13;:11;:13::i;:::-;52698:15:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;52698:34:0::1;-1:-1:-1::0;;;;52698:34:0;;::::1;::::0;;;::::1;::::0;;52621:117::o;33192:717::-;23991:13;:11;:13::i;:::-;33302:1:::1;33289:10;:14;:30;;;;33318:1;33307:8;:12;33289:30;33281:61;;;::::0;-1:-1:-1;;;33281:61:0;;12158:2:1;33281:61:0::1;::::0;::::1;12140:21:1::0;12197:2;12177:18;;;12170:30;-1:-1:-1;;;12216:18:1;;;12209:48;12274:18;;33281:61:0::1;11956:342:1::0;33281:61:0::1;33353:14:::0;;33349:320:::1;;33404:9;;33386:15;:27;33378:60;;;::::0;-1:-1:-1;;;33378:60:0;;12505:2:1;33378:60:0::1;::::0;::::1;12487:21:1::0;12544:2;12524:18;;;12517:30;-1:-1:-1;;;12563:18:1;;;12556:50;12623:18;;33378:60:0::1;12303:344:1::0;33378:60:0::1;33473:10;33455:15;:28;33447:58;;;::::0;-1:-1:-1;;;33447:58:0;;12854:2:1;33447:58:0::1;::::0;::::1;12836:21:1::0;12893:2;12873:18;;;12866:30;-1:-1:-1;;;12912:18:1;;;12905:47;12969:18;;33447:58:0::1;12652:341:1::0;33447:58:0::1;33534:9;::::0;;33552:22;;;;33588:73:::1;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;33645:15:0::1;11918:18:1::0;;;11911:34;33588:73:0;;-1:-1:-1;;;33604:16:0;33588:73:::1;::::0;;;;;11822:2:1;33588:73:0;;::::1;33369:300;33349:320;33679:12:::0;;33675:229:::1;;33721:9;;33710:8;:20;33702:48;;;::::0;-1:-1:-1;;;33702:48:0;;13200:2:1;33702:48:0::1;::::0;::::1;13182:21:1::0;13239:2;13219:18;;;13212:30;-1:-1:-1;;;13258:18:1;;;13251:45;13313:18;;33702:48:0::1;12998:339:1::0;33702:48:0::1;33779:7;::::0;;33795:18;;;;33827:69:::1;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;33880:15:0::1;11918:18:1::0;;;11911:34;33827:69:0;;-1:-1:-1;;;33843:14:0;33827:69:::1;::::0;;;;;11822:2:1;33827:69:0;;::::1;33693:211;33675:229;33192:717:::0;;:::o;35130:1632::-;35234:4;35203:6;34846:9;;34827:15;:28;;:58;;;;;34878:7;;34859:15;:26;;34827:58;34819:94;;;;-1:-1:-1;;;34819:94:0;;;;;;;:::i;:::-;34937:1;34928:6;:10;34920:42;;;;-1:-1:-1;;;34920:42:0;;;;;;;:::i;:::-;21089:19:::1;:17;:19::i;:::-;35247:16:::2;35266:22;35281:6;35266:14;:22::i;:::-;35247:41;;35314:6;35295:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;35327:13:0::2;::::0;-1:-1:-1;35343:21:0::2;35355:8;35343::::0;:21:::2;:::i;:::-;35327:37;;35375:10;;35389:1;35375:15;35371:41;;35406:6;35392:10;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35371:41:0::2;35419:13;35453:10;;35435:15;;:28;:59;;35484:10;;35435:59;;;35466:15;;35435:59;35419:75:::0;-1:-1:-1;35513:6:0::2;35520:1;35513:9;35523:11;;35513:22;;;;;;;;:::i;:::-;;;;;;;;;35505:5;:30;:75;;;-1:-1:-1::0;35558:6:0::2;35565:1;35558:9;35568:11;;35558:22;;;;;;;;:::i;:::-;;;;;;;;;35539:15;:41;;35505:75;35501:449;;;35614:6;35621:1;35614:9;35624:11;;35614:22;;;;;;;;:::i;:::-;;;;;;;;;35595:15;:41;35591:112;;35687:6:::0;35662::::2;35669:1;35662:9;35672:11;;35662:22;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;:::i;:::-;35649:10;:44:::0;35591:112:::2;35715:15;::::0;-1:-1:-1;;;35715:15:0;::::2;;;35711:58;;;35743:16;:14;:16::i;:::-;35777:20;35808:6;35777:20:::0;35808:9:::2;35818:11;;35808:22;;;;;;;;:::i;:::-;;;;;;;;;35800:5;:30;:67;;35862:5:::0;35837:6:::2;35844:1;35837:9;35847:11;;35837:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;35800:67;;;35833:1;35800:67;35876:22;:41:::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;35876:41:0;;;;;;::::2;::::0;;;35926:11:::2;:16:::0;;35777:90;;-1:-1:-1;35876:41:0;;35926:11;;-1:-1:-1;35926:16:0::2;::::0;35876:41;;35926:16:::2;:::i;:::-;::::0;;;-1:-1:-1;;;35501:449:0::2;35960:5;35956:569;;;35980:23;::::0;-1:-1:-1;;;35980:23:0;::::2;;;35976:120;;;19273:10:::0;36024:27:::2;::::0;;;:13:::2;:27;::::0;;;;;::::2;;36016:70;;;;-1:-1:-1::0;;;36016:70:0::2;;;;;;;:::i;:::-;36104:23;::::0;-1:-1:-1;;;;;36104:23:0::2;:40;19273:10:::0;36168:12:::2;::::0;36159:21:::2;::::0;:6;:21:::2;:::i;:::-;36104:77;::::0;-1:-1:-1;;;;;;36104:77:0::2;::::0;;;;;;-1:-1:-1;;;;;15251:32:1;;;36104:77:0::2;::::0;::::2;15233:51:1::0;15300:18;;;15293:34;15206:18;;36104:77:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;36214:6;36190:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36286:13:0::2;::::0;-1:-1:-1;;;;;36286:13:0::2;36270:6:::0;19273:10;-1:-1:-1;;;;;36234:101:0::2;;36302:5;36309:8;36319:15;36234:101;;;;;;;11834:25:1::0;;;11890:2;11875:18;;11868:34;;;;11933:2;11918:18;;11911:34;11822:2;11807:18;;11632:319;36234:101:0::2;;;;;;;;35956:569;;;36398:12;::::0;36389:21:::2;::::0;:6;:21:::2;:::i;:::-;19273:10:::0;36358:26:::2;::::0;;;:12:::2;:26;::::0;;;;:53;;:26;;;:53:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;36468:13:0::2;::::0;-1:-1:-1;;;;;36468:13:0::2;36452:6:::0;19273:10;-1:-1:-1;;;;;36425:92:0::2;-1:-1:-1::0;;;;;;;;;;;36484:5:0::2;36491:8;36501:15;36425:92;;;;;;;11834:25:1::0;;;11890:2;11875:18;;11868:34;;;;11933:2;11918:18;;11911:34;11822:2;11807:18;;11632:319;36425:92:0::2;;;;;;;;35956:569;36544:8;36531:9;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36582:13:0::2;::::0;36559:20:::2;::::0;-1:-1:-1;;;;;36582:13:0::2;:23;19273:10:::0;36582:52:::2;::::0;-1:-1:-1;;;;;;36582:52:0::2;::::0;;;;;;-1:-1:-1;;;;;15568:15:1;;;36582:52:0::2;::::0;::::2;15550:34:1::0;36628:4:0::2;15600:18:1::0;;;15593:43;15485:18;;36582:52:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36559:75;;36658:12;36649:5;:21;;36641:67;;;::::0;-1:-1:-1;;;36641:67:0;;16038:2:1;36641:67:0::2;::::0;::::2;16020:21:1::0;16077:2;16057:18;;;16050:30;16116:34;16096:18;;;16089:62;-1:-1:-1;;;16167:18:1;;;16160:31;16208:19;;36641:67:0::2;15836:397:1::0;36641:67:0::2;36715:21;36730:5;36715:14;:21::i;:::-;36752:4;36745:11;;;;;;21119:1;35130:1632:::0;;;;;:::o;49936:107::-;23991:13;:11;:13::i;:::-;50009:18:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;50009:28:0::1;-1:-1:-1::0;;;;50009:28:0;;::::1;::::0;;;::::1;::::0;;49936:107::o;50740:108::-;23991:13;:11;:13::i;:::-;50814:12:::1;:28:::0;50740:108::o;47829:300::-;23991:13;:11;:13::i;:::-;47936:1:::1;47918:15;:19;47910:60;;;::::0;-1:-1:-1;;;47910:60:0;;16440:2:1;47910:60:0::1;::::0;::::1;16422:21:1::0;16479:2;16459:18;;;16452:30;16518;16498:18;;;16491:58;16566:18;;47910:60:0::1;16238:352:1::0;47910:60:0::1;47997:14;::::0;;48018:32;;;;48062:61:::1;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;48107:15:0::1;11918:18:1::0;;;11911:34;48062:61:0;;::::1;::::0;;;;11822:2:1;48062:61:0;;::::1;47903:226;47829:300:::0;:::o;40808:197::-;40869:17;40895:16;40914:22;40929:6;40914:14;:22::i;:::-;40895:41;;40983:16;:14;:16::i;:::-;40967:12;;40956:23;;:8;:23;:::i;:::-;40955:44;;;;:::i;:::-;40943:56;40808:197;-1:-1:-1;;;40808:197:0:o;36915:1670::-;37039:4;36995:6;34846:9;;34827:15;:28;;:58;;;;;34878:7;;34859:15;:26;;34827:58;34819:94;;;;-1:-1:-1;;;34819:94:0;;;;;;;:::i;:::-;34937:1;34928:6;:10;34920:42;;;;-1:-1:-1;;;34920:42:0;;;;;;;:::i;:::-;21089:19:::1;:17;:19::i;:::-;28326:21:::2;:19;:21::i;:::-;37052:16:::3;37071:22;37086:6;37071:14;:22::i;:::-;37052:41;;37100:17;37148:16;:14;:16::i;:::-;37132:12;::::0;37121:23:::3;::::0;:8;:23:::3;:::i;:::-;37120:44;;;;:::i;:::-;37100:64;;37192:9;37179;:22;;37171:47;;;::::0;-1:-1:-1;;;37171:47:0;;16797:2:1;37171:47:0::3;::::0;::::3;16779:21:1::0;16836:2;16816:18;;;16809:30;-1:-1:-1;;;16855:18:1;;;16848:42;16907:18;;37171:47:0::3;16595:336:1::0;37171:47:0::3;37225:14;37242:21;37254:9:::0;37242::::3;:21;:::i;:::-;37225:38;;37289:6;37270:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37306:10:0::3;::::0;:15;37302:41:::3;;37337:6;37323:10;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37302:41:0::3;37350:13;37384:10;;37366:15;;:28;:59;;37415:10;;37366:59;;;37397:15;;37366:59;37350:75:::0;-1:-1:-1;37444:6:0::3;37451:1;37444:9;37454:11;;37444:22;;;;;;;;:::i;:::-;;;;;;;;;37436:5;:30;:75;;;-1:-1:-1::0;37489:6:0::3;37496:1;37489:9;37499:11;;37489:22;;;;;;;;:::i;:::-;;;;;;;;;37470:15;:41;;37436:75;37432:449;;;37545:6;37552:1;37545:9;37555:11;;37545:22;;;;;;;;:::i;:::-;;;;;;;;;37526:15;:41;37522:112;;37618:6:::0;37593::::3;37600:1;37593:9;37603:11;;37593:22;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;:::i;:::-;37580:10;:44:::0;37522:112:::3;37646:15;::::0;-1:-1:-1;;;37646:15:0;::::3;;;37642:58;;;37674:16;:14;:16::i;:::-;37708:20;37739:6;37708:20:::0;37739:9:::3;37749:11;;37739:22;;;;;;;;:::i;:::-;;;;;;;;;37731:5;:30;:67;;37793:5:::0;37768:6:::3;37775:1;37768:9;37778:11;;37768:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;37731:67;;;37764:1;37731:67;37807:22;:41:::0;;::::3;::::0;;::::3;::::0;;-1:-1:-1;37807:41:0;;;;;;::::3;::::0;;;37857:11:::3;:16:::0;;37708:90;;-1:-1:-1;37807:41:0;;37857:11;;-1:-1:-1;37857:16:0::3;::::0;37807:41;;37857:16:::3;:::i;:::-;::::0;;;-1:-1:-1;;;37432:449:0::3;37891:5;37887:553;;;37911:23;::::0;-1:-1:-1;;;37911:23:0;::::3;;;37907:120;;;19273:10:::0;37955:27:::3;::::0;;;:13:::3;:27;::::0;;;;;::::3;;37947:70;;;;-1:-1:-1::0;;;37947:70:0::3;;;;;;;:::i;:::-;38035:23;::::0;-1:-1:-1;;;;;38035:23:0::3;:40;19273:10:::0;38099:12:::3;::::0;38090:21:::3;::::0;:6;:21:::3;:::i;:::-;38035:77;::::0;-1:-1:-1;;;;;;38035:77:0::3;::::0;;;;;;-1:-1:-1;;;;;15251:32:1;;;38035:77:0::3;::::0;::::3;15233:51:1::0;15300:18;;;15293:34;15206:18;;38035:77:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;38145:6;38121:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38165:93:0::3;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;38242:15:0::3;11918:18:1::0;;;11911:34;38165:93:0;;-1:-1:-1;;38201:6:0;;19273:10;;38165:93:::3;::::0;;;;;11822:2:1;38165:93:0;;::::3;37887:553;;;38321:12;::::0;38312:21:::3;::::0;:6;:21:::3;:::i;:::-;19273:10:::0;38281:26:::3;::::0;;;:12:::3;:26;::::0;;;;:53;;:26;;;:53:::3;::::0;;;::::3;:::i;:::-;::::0;;;-1:-1:-1;;38348:84:0::3;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;38416:15:0::3;11918:18:1::0;;;11911:34;38348:84:0;;-1:-1:-1;;38375:6:0;;19273:10;;-1:-1:-1;;;;;;;;;;;38348:84:0;;;;;11822:2:1;38348:84:0;;::::3;37887:553;38459:8;38446:9;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;38474:24:0::3;::::0;-1:-1:-1;38488:9:0;38474:13:::3;:24::i;:::-;38509:10:::0;;38505:56:::3;;38521:40;19273:10:::0;38554:6:::3;38521:9;:40::i;:::-;38575:4;38568:11;;;;;;28370:20:::2;27587:1:::0;28890:22;;28707:213;53120:450;53260:4;23991:13;:11;:13::i;:::-;53291:6:::1;:16:::0;53281:26;::::1;;53273:52;;;::::0;-1:-1:-1;;;53273:52:0;;17138:2:1;53273:52:0::1;::::0;::::1;17120:21:1::0;17177:2;17157:18;;;17150:30;-1:-1:-1;;;17196:18:1;;;17189:43;17249:18;;53273:52:0::1;16936:337:1::0;53273:52:0::1;53336:18:::0;;53332:75:::1;;53385:14:::0;53365:6:::1;53372:1;53365:9;53375:6;53365:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:34:::0;53332:75:::1;53417:13:::0;;53413:65:::1;;53461:9:::0;53441:6:::1;53448:1;53441:9;53451:6;53441:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:29:::0;53413:65:::1;53488:12:::0;;53484:63:::1;;53531:8:::0;53511:6:::1;53518:1;53511:9;53521:6;53511:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:28:::0;53484:63:::1;-1:-1:-1::0;53560:4:0::1;53120:450:::0;;;;;;:::o;31894:61::-;23991:13;:11;:13::i;:::-;31939:10:::1;:8;:10::i;:::-;31894:61::o:0;45579:835::-;45628:4;21089:19;:17;:19::i;:::-;45649:9:::1;::::0;-1:-1:-1;;;;;45649:9:0::1;45641:56;;;::::0;-1:-1:-1;;;45641:56:0;;17480:2:1;45641:56:0::1;::::0;::::1;17462:21:1::0;17519:2;17499:18;;;17492:30;-1:-1:-1;;;17538:18:1;;;17531:50;17598:18;;45641:56:0::1;17278:344:1::0;45641:56:0::1;19273:10:::0;45713:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;45712:28;45704:68;;;::::0;-1:-1:-1;;;45704:68:0;;17829:2:1;45704:68:0::1;::::0;::::1;17811:21:1::0;17868:2;17848:18;;;17841:30;17907:29;17887:18;;;17880:57;17954:18;;45704:68:0::1;17627:351:1::0;45704:68:0::1;45783:18;::::0;-1:-1:-1;;;45783:18:0;::::1;;;45779:111;;;19273:10:::0;45820:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;45812:70;;;::::0;-1:-1:-1;;;45812:70:0;;18185:2:1;45812:70:0::1;::::0;::::1;18167:21:1::0;18224:2;18204:18;;;18197:30;18263:32;18243:18;;;18236:60;18313:18;;45812:70:0::1;17983:354:1::0;45812:70:0::1;45923:10;;45904:15;:29;;45896:67;;;::::0;-1:-1:-1;;;45896:67:0;;18544:2:1;45896:67:0::1;::::0;::::1;18526:21:1::0;18583:2;18563:18;;;18556:30;18622:27;18602:18;;;18595:55;18667:18;;45896:67:0::1;18342:349:1::0;45896:67:0::1;19273:10:::0;45979:24:::1;::::0;;;:10:::1;:24;::::0;;;;;::::1;;45978:25;45970:53;;;::::0;-1:-1:-1;;;45970:53:0;;18898:2:1;45970:53:0::1;::::0;::::1;18880:21:1::0;18937:2;18917:18;;;18910:30;-1:-1:-1;;;18956:18:1;;;18949:45;19011:18;;45970:53:0::1;18696:339:1::0;45970:53:0::1;19273:10:::0;46030:24:::1;::::0;;;:10:::1;:24;::::0;;;;;;;:31;;-1:-1:-1;;46030:31:0::1;46057:4;46030:31;::::0;;46085:12:::1;:26:::0;;;;;;46126:10;46118:39:::1;;;::::0;-1:-1:-1;;;46118:39:0;;19242:2:1;46118:39:0::1;::::0;::::1;19224:21:1::0;19281:2;19261:18;;;19254:30;-1:-1:-1;;;19300:18:1;;;19293:46;19356:18;;46118:39:0::1;19040:340:1::0;46118:39:0::1;19273:10:::0;46171:26:::1;::::0;;;:12:::1;:26;::::0;;;;;;;46164:33;;;46237:9:::1;::::0;46219:59;;-1:-1:-1;;;46219:59:0;;::::1;::::0;::::1;15233:51:1::0;;;;15300:18;;;15293:34;;;46219:59:0;;46171:26;;-1:-1:-1;;;;;46237:9:0;;::::1;::::0;46219:37:::1;::::0;15206:18:1;;;;;46171:26:0;;46219:59;;;;;;46171:26;46237:9;46219:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46204:74;;46293:7;46285:41;;;::::0;-1:-1:-1;;;46285:41:0;;19837:2:1;46285:41:0::1;::::0;::::1;19819:21:1::0;19876:2;19856:18;;;19849:30;-1:-1:-1;;;19895:18:1;;;19888:51;19956:18;;46285:41:0::1;19635:345:1::0;46285:41:0::1;46338:52;::::0;;20159:25:1;;;46374:15:0::1;20215:2:1::0;20200:18;;20193:34;19273:10:0;;46338:52:::1;::::0;20132:18:1;46338:52:0::1;;;;;;;46404:4;46397:11;;;;45579:835:::0;:::o;49596:240::-;23991:13;:11;:13::i;:::-;49703:9:::1;49698:133;49718:37:::0;;::::1;49698:133;;;49818:5;49771:13;:44;49785:26;;49812:1;49785:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49771:44:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49771:44:0;:52;;-1:-1:-1;;49771:52:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49757:3;::::1;::::0;::::1;:::i;:::-;;;;49698:133;;34181:585:::0;23991:13;:11;:13::i;:::-;34309:12:::1;:19;34290:8;:15;:38;34282:68;;;::::0;-1:-1:-1;;;34282:68:0;;20440:2:1;34282:68:0::1;::::0;::::1;20422:21:1::0;20479:2;20459:18;;;20452:30;-1:-1:-1;;;20498:18:1;;;20491:47;20555:18;;34282:68:0::1;20238:341:1::0;34282:68:0::1;34357:14;34364:7;;34357:14;:::i;:::-;34378:18;34385:11;;34378:18;:::i;:::-;34403:23;34444:9:::0;34439:247:::1;34463:8;:15;34459:1;:19;34439:247;;;34520:1;34502:12;34515:1;34502:15;;;;;;;;:::i;:::-;;;;;;;:19;34494:65;;;::::0;-1:-1:-1;;;34494:65:0;;20786:2:1;34494:65:0::1;::::0;::::1;20768:21:1::0;20825:2;20805:18;;;20798:30;20864:34;20844:18;;;20837:62;-1:-1:-1;;;20915:18:1;;;20908:31;20956:19;;34494:65:0::1;20584:397:1::0;34494:65:0::1;34587:12;34600:1;34587:15;;;;;;;;:::i;:::-;;;;;;;34568:34;;;;;:::i;:::-;;;34611:7;34624:8;34633:1;34624:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;34611:25;;::::1;::::0;::::1;::::0;;-1:-1:-1;34611:25:0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;34611:25:0::1;-1:-1:-1::0;;;;;34611:25:0;;::::1;::::0;;;::::1;::::0;;34662:15;;34645:11:::1;::::0;34662:15;;34675:1;;34662:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;34645:33;;::::1;::::0;::::1;::::0;;-1:-1:-1;34645:33:0;;;;;;;::::1;::::0;34480:3;::::1;::::0;::::1;:::i;:::-;;;;34439:247;;;;34702:15;34721:3;34702:22;34694:66;;;::::0;-1:-1:-1;;;34694:66:0;;21188:2:1;34694:66:0::1;::::0;::::1;21170:21:1::0;21227:2;21207:18;;;21200:30;21266:33;21246:18;;;21239:61;21317:18;;34694:66:0::1;20986:355:1::0;41126:165:0;41188:16;41224:22;41239:6;41224:14;:22::i;:::-;41213:33;-1:-1:-1;41264:21:0;41276:8;41213:33;41264:21;:::i;:::-;41253:32;41126:165;-1:-1:-1;;41126:165:0:o;51598:427::-;51668:5;;-1:-1:-1;;;;;51668:5:0;51654:10;:19;;:44;;-1:-1:-1;24178:6:0;;-1:-1:-1;;;;;24178:6:0;51677:10;:21;51654:44;51646:82;;;;-1:-1:-1;;;51646:82:0;;21548:2:1;51646:82:0;;;21530:21:1;21587:2;21567:18;;;21560:30;21626:27;21606:18;;;21599:55;21671:18;;51646:82:0;21346:349:1;51646:82:0;51756:10;;51735:15;:32;;;;;;;-1:-1:-1;51735:32:0;;;;;;;51778:15;;-1:-1:-1;;;51778:15:0;;;;51774:54;;;51804:16;:14;:16::i;:::-;51851:6;51858:1;51851:9;51861:11;;51851:22;;;;;;;;:::i;:::-;;;;;;;;;51838:10;;:35;51834:166;;;51937:10;;51884:22;;51912:6;51919:1;51912:9;51922:11;;51912:22;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;:::i;:::-;51884:64;;;;;;;-1:-1:-1;51884:64:0;;;;;;;;51970:6;:9;51980:11;;51970:22;;;;;;;;:::i;:::-;;;;;;;;;;;51957:10;:35;51834:166;52006:11;:13;;;:11;:13;;;:::i;:::-;;;;;;51598:427::o;52114:80::-;23991:13;:11;:13::i;:::-;52174:5:::1;:14:::0;;-1:-1:-1;;;;;;52174:14:0::1;-1:-1:-1::0;;;;;52174:14:0;;;::::1;::::0;;;::::1;::::0;;52114:80::o;24753:103::-;23991:13;:11;:13::i;:::-;24818:30:::1;24845:1;24818:18;:30::i;30693:24::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30693:24:0;;-1:-1:-1;30693:24:0;:::o;31783:57::-;23991:13;:11;:13::i;:::-;31826:8:::1;:6;:8::i;48777:240::-:0;23991:13;:11;:13::i;:::-;48884:9:::1;48879:133;48899:37:::0;;::::1;48879:133;;;48999:5;48952:13;:44;48966:26;;48993:1;48966:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48952:44:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48952:44:0;:52;;-1:-1:-1;;48952:52:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48938:3;::::1;::::0;::::1;:::i;:::-;;;;48879:133;;43994:752:::0;44135:4;23991:13;:11;:13::i;:::-;-1:-1:-1;;;;;44156:24:0;::::1;44148:55;;;::::0;-1:-1:-1;;;44148:55:0;;21902:2:1;44148:55:0::1;::::0;::::1;21884:21:1::0;21941:2;21921:18;;;21914:30;-1:-1:-1;;;21960:18:1;;;21953:48;22018:18;;44148:55:0::1;21700:342:1::0;44148:55:0::1;44218:10;::::0;:15;44210:45:::1;;;::::0;-1:-1:-1;;;44210:45:0;;22249:2:1;44210:45:0::1;::::0;::::1;22231:21:1::0;22288:2;22268:18;;;22261:30;-1:-1:-1;;;22307:18:1;;;22300:47;22364:18;;44210:45:0::1;22047:341:1::0;44210:45:0::1;44262:10;:24:::0;;;44293:9:::1;:22:::0;;-1:-1:-1;;;;;44293:22:0;;::::1;-1:-1:-1::0;;;;;;44293:22:0;;::::1;::::0;::::1;::::0;;;44322:18:::1;:25:::0;;-1:-1:-1;;;;44322:25:0::1;-1:-1:-1::0;;;44322:25:0::1;::::0;;44354:23:::1;:64:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;44425:80:::1;::::0;-1:-1:-1;;;44425:80:0;;::::1;::::0;::::1;15233:51:1::0;;;;-1:-1:-1;;15300:18:1;;;15293:34;44425:37:0::1;::::0;15206:18:1;;44425:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;44527:83:0::1;::::0;-1:-1:-1;;;44527:83:0;;44512:12:::1;::::0;-1:-1:-1;;;;;44527:42:0;::::1;::::0;::::1;::::0;:83:::1;::::0;19273:10;;44592:4:::1;::::0;44599:10;;44527:83:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44512:98;;44625:7;44617:41;;;::::0;-1:-1:-1;;;44617:41:0;;19837:2:1;44617:41:0::1;::::0;::::1;19819:21:1::0;19876:2;19856:18;;;19849:30;-1:-1:-1;;;19895:18:1;;;19888:51;19956:18;;44617:41:0::1;19635:345:1::0;44617:41:0::1;44670:52;::::0;;20159:25:1;;;44706:15:0::1;20215:2:1::0;20200:18;;20193:34;-1:-1:-1;;;;;44670:52:0;::::1;::::0;::::1;::::0;20132:18:1;44670:52:0::1;;;;;;;-1:-1:-1::0;44736:4:0::1;::::0;43994:752;-1:-1:-1;;;;;43994:752:0:o;33981:194::-;34028:7;34047:12;34069:19;;;;;;;;;-1:-1:-1;;;;;34069:19:0;-1:-1:-1;;;;;34069:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34044:62;;;;;;34122:5;34131:8;34122:18;;;;:::i;52368:142::-;23991:13;:11;:13::i;:::-;52454:11:::1;:19:::0;;;;52480:10:::1;:24:::0;52368:142::o;48135:103::-;23991:13;:11;:13::i;:::-;48216:16:::1;:6;48225:7:::0;48216:16:::1;;:::i;32078:984::-:0;32140:7;32156:18;32181:13;32197:10;;32211:1;32197:15;:46;;32233:10;;32197:46;;;32215:15;;32197:46;32181:62;;32269:14;;32258:7;:25;;32250:70;;;;-1:-1:-1;;;32250:70:0;;24195:2:1;32250:70:0;;;24177:21:1;;;24214:18;;;24207:30;24273:34;24253:18;;;24246:62;24325:18;;32250:70:0;23993:356:1;32250:70:0;32349:6;32356:1;32349:9;32359:11;;32349:22;;;;;;;;:::i;:::-;;;;;;;;;32341:5;32331:7;:15;;;;:::i;:::-;:40;:85;;;-1:-1:-1;32394:6:0;32401:1;32394:9;32404:11;;32394:22;;;;;;;;:::i;:::-;;;;;;;;;32375:15;:41;;32331:85;32327:705;;;32450:6;:16;:20;;32469:1;;32450:20;:::i;:::-;32435:11;;:36;32427:61;;;;-1:-1:-1;;;32427:61:0;;24556:2:1;32427:61:0;;;24538:21:1;24595:2;24575:18;;;24568:30;-1:-1:-1;;;24614:18:1;;;24607:42;24666:18;;32427:61:0;24354:336:1;32427:61:0;32520:6;32527:1;32520:9;32530:11;;32520:22;;;;;;;;:::i;:::-;;;;;;;;;32501:15;:41;32497:477;;32609:11;;32599:6;;32609:15;;32623:1;32609:15;:::i;:::-;32599:26;;;;;;;;:::i;:::-;;;;;;;;;32588:7;32563:6;32570:1;32563:9;;;;;;;:::i;:::-;;32573:11;;32563:22;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;:::i;:::-;:62;;32555:110;;;;-1:-1:-1;;;32555:110:0;;24897:2:1;32555:110:0;;;24879:21:1;24936:2;24916:18;;;24909:30;24975:34;24955:18;;;24948:62;-1:-1:-1;;;25026:18:1;;;25019:33;25069:19;;32555:110:0;24695:399:1;32555:110:0;32709:11;;32699:9;;32709:15;;32706:1;32709:15;:::i;:::-;32699:26;;;;;;;;:::i;:::-;;;;;;;;;32689:7;:36;;;;:::i;:::-;32676:49;;32327:705;;32497:477;32752:34;32814:5;32789:6;32752:34;32789:9;32799:11;;32789:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;32948:11;;32752:67;;-1:-1:-1;32938:9:0;;32948:15;;32945:1;32948:15;:::i;:::-;32938:26;;;;;;;;:::i;:::-;;;;;;;;;32908;32898:7;:36;;;;:::i;:::-;32897:67;;;;:::i;:::-;32872:6;32879:1;32872:9;32882:11;;32872:22;;;;;;;;:::i;:::-;;;;;;;;;32843:26;:51;;;;:::i;:::-;:121;;;;:::i;:::-;32830:134;;32741:233;32327:705;;;33010:6;33017:1;33010:9;33020:11;;33010:22;;;;;;;;:::i;:::-;;;;;;;;;33000:7;:32;;;;:::i;:::-;32987:45;33046:10;-1:-1:-1;;;;32078:984:0:o;38859:1829::-;39004:4;38959:7;34846:9;;34827:15;:28;;:58;;;;;34878:7;;34859:15;:26;;34827:58;34819:94;;;;-1:-1:-1;;;34819:94:0;;;;;;;:::i;:::-;34937:1;34928:6;:10;34920:42;;;;-1:-1:-1;;;34920:42:0;;;;;;;:::i;:::-;21089:19:::1;:17;:19::i;:::-;28326:21:::2;:19;:21::i;:::-;19273:10:::0;39025:29:::3;::::0;;;:15:::3;:29;::::0;;;;;::::3;;39017:74;;;::::0;-1:-1:-1;;;39017:74:0;;25301:2:1;39017:74:0::3;::::0;::::3;25283:21:1::0;;;25320:18;;;25313:30;25379:34;25359:18;;;25352:62;25431:18;;39017:74:0::3;25099:356:1::0;39017:74:0::3;39098:16;39117:23;39132:7;39117:14;:23::i;:::-;39098:42;;39147:17;39195:16;:14;:16::i;:::-;39179:12;::::0;39168:23:::3;::::0;:8;:23:::3;:::i;:::-;39167:44;;;;:::i;:::-;39147:64;;39239:9;39226;:22;;39218:47;;;::::0;-1:-1:-1;;;39218:47:0;;16797:2:1;39218:47:0::3;::::0;::::3;16779:21:1::0;16836:2;16816:18;;;16809:30;-1:-1:-1;;;16855:18:1;;;16848:42;16907:18;;39218:47:0::3;16595:336:1::0;39218:47:0::3;39272:14;39289:21;39301:9:::0;39289::::3;:21;:::i;:::-;39272:38;;39336:7;39317:15;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39354:10:0::3;::::0;:15;39350:42:::3;;39385:7;39371:10;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;39350:42:0::3;39399:13;39433:10;;39415:15;;:28;:59;;39464:10;;39415:59;;;39446:15;;39415:59;39399:75:::0;-1:-1:-1;39493:6:0::3;39500:1;39493:9;39503:11;;39493:22;;;;;;;;:::i;:::-;;;;;;;;;39485:5;:30;:75;;;-1:-1:-1::0;39538:6:0::3;39545:1;39538:9;39548:11;;39538:22;;;;;;;;:::i;:::-;;;;;;;;;39519:15;:41;;39485:75;39481:450;;;39594:6;39601:1;39594:9;39604:11;;39594:22;;;;;;;;:::i;:::-;;;;;;;;;39575:15;:41;39571:113;;39667:7:::0;39642:6:::3;39649:1;39642:9;39652:11;;39642:22;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;:::i;:::-;39629:10;:45:::0;39571:113:::3;39696:15;::::0;-1:-1:-1;;;39696:15:0;::::3;;;39692:58;;;39724:16;:14;:16::i;:::-;39758:20;39789:6;39758:20:::0;39789:9:::3;39799:11;;39789:22;;;;;;;;:::i;:::-;;;;;;;;;39781:5;:30;:67;;39843:5:::0;39818:6:::3;39825:1;39818:9;39828:11;;39818:22;;;;;;;;:::i;:::-;;;;;;;;;:30;;;;:::i;:::-;39781:67;;;39814:1;39781:67;39857:22;:41:::0;;::::3;::::0;;::::3;::::0;;-1:-1:-1;39857:41:0;;;;;;::::3;::::0;;;39907:11:::3;:16:::0;;39758:90;;-1:-1:-1;39857:41:0;;39907:11;;-1:-1:-1;39907:16:0::3;::::0;39857:41;;39907:16:::3;:::i;:::-;::::0;;;-1:-1:-1;;;39481:450:0::3;39941:5;39937:523;;;39961:23;::::0;-1:-1:-1;;;39961:23:0;::::3;;;39957:113;;;-1:-1:-1::0;;;;;40005:20:0;::::3;;::::0;;;:13:::3;:20;::::0;;;;;::::3;;39997:63;;;;-1:-1:-1::0;;;39997:63:0::3;;;;;;;:::i;:::-;40078:23;::::0;40136:12:::3;::::0;-1:-1:-1;;;;;40078:23:0;;::::3;::::0;:40:::3;::::0;40119:5;;40126:22:::3;::::0;:7;:22:::3;:::i;:::-;40078:71;::::0;-1:-1:-1;;;;;;40078:71:0::3;::::0;;;;;;-1:-1:-1;;;;;15251:32:1;;;40078:71:0::3;::::0;::::3;15233:51:1::0;15300:18;;;15293:34;15206:18;;40078:71:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;40182:7;40158:20;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40203:87:0::3;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;40274:15:0::3;11918:18:1::0;;;11911:34;40203:87:0;;-1:-1:-1;;40232:7:0;;-1:-1:-1;;;;;40203:87:0;::::3;::::0;::::3;::::0;;;;;11822:2:1;40203:87:0;;::::3;39937:523;;;40347:12;::::0;40337:22:::3;::::0;:7;:22:::3;:::i;:::-;-1:-1:-1::0;;;;;40313:19:0;::::3;;::::0;;;:12:::3;:19;::::0;;;;:47;;:19;;;:47:::3;::::0;;;::::3;:::i;:::-;::::0;;;-1:-1:-1;;40374:78:0::3;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;40436:15:0::3;11918:18:1::0;;;11911:34;40374:78:0;;-1:-1:-1;;40394:7:0;;-1:-1:-1;;;;;40374:78:0;::::3;::::0;-1:-1:-1;;;;;;;;;;;40374:78:0;;;;;11822:2:1;40374:78:0;;::::3;39937:523;40479:8;40466:9;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;40494:24:0::3;::::0;-1:-1:-1;40508:9:0;40494:13:::3;:24::i;:::-;40529:10:::0;;40525:49:::3;;40541:33;40559:5;40567:6;40541:9;:33::i;:::-;40586:78;::::0;;11834:25:1;;;11890:2;11875:18;;11868:34;;;40648:15:0::3;11918:18:1::0;;;11911:34;40586:78:0;;-1:-1:-1;;40606:7:0;;-1:-1:-1;;;;;40586:78:0;::::3;::::0;-1:-1:-1;;;;;;;;;;;40586:78:0;;;;;11822:2:1;40586:78:0;;::::3;40678:4;40671:11;;;;;;28370:20:::2;27587:1:::0;28890:22;;28707:213;28370:20:::2;38859:1829:::0;;;;;;:::o;43403:352::-;23991:13;:11;:13::i;:::-;-1:-1:-1;;;;;43496:36:0;::::1;43488:104;;;::::0;-1:-1:-1;;;43488:104:0;;25662:2:1;43488:104:0::1;::::0;::::1;25644:21:1::0;25701:2;25681:18;;;25674:30;25740:34;25720:18;;;25713:62;25811:25;25791:18;;;25784:53;25854:19;;43488:104:0::1;25460:419:1::0;43488:104:0::1;43599:23;:64:::0;;-1:-1:-1;;;;;;43599:64:0::1;-1:-1:-1::0;;;;;43599:64:0;;::::1;::::0;;::::1;::::0;;;43688:9:::1;::::0;43670:79:::1;::::0;-1:-1:-1;;;43670:79:0;;::::1;::::0;::::1;15233:51:1::0;;;;-1:-1:-1;;15300:18:1;;;15293:34;43688:9:0;;::::1;::::0;43670:36:::1;::::0;15206:18:1;;43670:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53774:396::-:0;53884:4;23991:13;:11;:13::i;:::-;53922:1:::1;53905:14;:18;53897:51;;;::::0;-1:-1:-1;;;53897:51:0;;26086:2:1;53897:51:0::1;::::0;::::1;26068:21:1::0;26125:2;26105:18;;;26098:30;-1:-1:-1;;;26144:18:1;;;26137:50;26204:18;;53897:51:0::1;25884:344:1::0;53897:51:0::1;53975:1;53963:9;:13;53955:43;;;::::0;-1:-1:-1;;;53955:43:0;;26435:2:1;53955:43:0::1;::::0;::::1;26417:21:1::0;26474:2;26454:18;;;26447:30;-1:-1:-1;;;26493:18:1;;;26486:47;26550:18;;53955:43:0::1;26233:341:1::0;53955:43:0::1;54024:1;54013:8;:12;54005:41;;;::::0;-1:-1:-1;;;54005:41:0;;26781:2:1;54005:41:0::1;::::0;::::1;26763:21:1::0;26820:2;26800:18;;;26793:30;-1:-1:-1;;;26839:18:1;;;26832:46;26895:18;;54005:41:0::1;26579:340:1::0;54005:41:0::1;-1:-1:-1::0;54053:6:0::1;:30:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;54090:9;:25;;;;::::1;::::0;;;;::::1;::::0;;;;54122:9;:24;;;;::::1;::::0;;54060:1:::1;54122:24:::0;;;;;::::1;::::0;54053:30;53774:396::o;44846:115::-;23991:13;:11;:13::i;:::-;44922:23:::1;:33:::0;;;::::1;;-1:-1:-1::0;;;44922:33:0::1;-1:-1:-1::0;;;;44922:33:0;;::::1;::::0;;;::::1;::::0;;44846:115::o;50946:107::-;51004:16;51036:6;51043:3;51036:11;;;;;;;:::i;:::-;;51029:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50946:107;;;:::o;48397:207::-;23991:13;:11;:13::i;:::-;48490:9:::1;48485:114;48505:28:::0;;::::1;48485:114;;;48587:4;48549:13;:35;48563:17;;48581:1;48563:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48549:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48549:35:0;:42;;-1:-1:-1;;48549:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48535:3;::::1;::::0;::::1;:::i;:::-;;;;48485:114;;29991:39:::0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29991:39:0;:::o;52744:115::-;52799:16;52831:22;52824:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52744:115;:::o;50162:194::-;23991:13;:11;:13::i;:::-;-1:-1:-1;;;;;50252:31:0;::::1;50244:66;;;::::0;-1:-1:-1;;;50244:66:0;;27126:2:1;50244:66:0::1;::::0;::::1;27108:21:1::0;27165:2;27145:18;;;27138:30;-1:-1:-1;;;27184:18:1;;;27177:52;27246:18;;50244:66:0::1;26924:346:1::0;50244:66:0::1;50317:13;:33:::0;;-1:-1:-1;;;;;;50317:33:0::1;-1:-1:-1::0;;;;;50317:33:0;;;::::1;::::0;;;::::1;::::0;;50162:194::o;46420:625::-;46477:4;21089:19;:17;:19::i;:::-;46498:9:::1;::::0;-1:-1:-1;;;;;46498:9:0::1;46490:56;;;::::0;-1:-1:-1;;;46490:56:0;;17480:2:1;46490:56:0::1;::::0;::::1;17462:21:1::0;17519:2;17499:18;;;17492:30;-1:-1:-1;;;17538:18:1;;;17531:50;17598:18;;46490:56:0::1;17278:344:1::0;46490:56:0::1;19273:10:::0;46562:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;46561:28;46553:68;;;::::0;-1:-1:-1;;;46553:68:0;;17829:2:1;46553:68:0::1;::::0;::::1;17811:21:1::0;17868:2;17848:18;;;17841:30;17907:29;17887:18;;;17880:57;17954:18;;46553:68:0::1;17627:351:1::0;46553:68:0::1;46632:23;::::0;-1:-1:-1;;;46632:23:0;::::1;;;46628:116;;;19273:10:::0;46674:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;46666:70;;;;-1:-1:-1::0;;;46666:70:0::1;;;;;;;:::i;:::-;19273:10:::0;46750:14:::1;46767:26:::0;;;:12:::1;:26;::::0;;;;;46808:10;46800:39:::1;;;::::0;-1:-1:-1;;;46800:39:0;;27477:2:1;46800:39:0::1;::::0;::::1;27459:21:1::0;27516:2;27496:18;;;27489:30;-1:-1:-1;;;27535:18:1;;;27528:46;27591:18;;46800:39:0::1;27275:340:1::0;46800:39:0::1;46846:23;::::0;-1:-1:-1;;;;;46846:23:0::1;:40;19273:10:::0;46846:62:::1;::::0;-1:-1:-1;;;;;;46846:62:0::1;::::0;;;;;;-1:-1:-1;;;;;15251:32:1;;;46846:62:0::1;::::0;::::1;15233:51:1::0;15300:18;;;15293:34;;;15206:18;;46846:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46922:12;:26;46935:12;19273:10:::0;;19193:98;46935:12:::1;-1:-1:-1::0;;;;;46922:26:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;46922:26:0;;;46915:33;19273:10;-1:-1:-1;;;;;46960:61:0::1;;46997:6;47005:15;46960:61;;;;;;20159:25:1::0;;;20215:2;20200:18;;20193:34;20147:2;20132:18;;19985:248;46960:61:0::1;;;;;;;;47035:4;47028:11;;;46420:625:::0;:::o;29954:32::-;;;;;;;;;;;;29864:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49196:207::-;23991:13;:11;:13::i;:::-;49289:9:::1;49284:114;49304:28:::0;;::::1;49284:114;;;49386:4;49348:13;:35;49362:17;;49380:1;49362:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49348:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49348:35:0;:42;;-1:-1:-1;;49348:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49334:3;::::1;::::0;::::1;:::i;:::-;;;;49284:114;;25011:201:::0;23991:13;:11;:13::i;:::-;-1:-1:-1;;;;;25100:22:0;::::1;25092:73;;;::::0;-1:-1:-1;;;25092:73:0;;27822:2:1;25092:73:0::1;::::0;::::1;27804:21:1::0;27861:2;27841:18;;;27834:30;27900:34;27880:18;;;27873:62;-1:-1:-1;;;27951:18:1;;;27944:36;27997:19;;25092:73:0::1;27620:402:1::0;25092:73:0::1;25176:28;25195:8;25176:18;:28::i;:::-;25011:201:::0;:::o;47559:264::-;23991:13;:11;:13::i;:::-;47678:9:::1;47673:145;47693:42:::0;;::::1;47673:145;;;47805:5;47751:15;:51;47767:31;;47799:1;47767:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47751:51:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47751:51:0;:59;;-1:-1:-1;;47751:59:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47737:3;::::1;::::0;::::1;:::i;:::-;;;;47673:145;;30660:28:::0;;;;;;;;;;;;51239:291;23991:13;:11;:13::i;:::-;51357:37;;::::1;51349:65;;;::::0;-1:-1:-1;;;51349:65:0;;28229:2:1;51349:65:0::1;::::0;::::1;28211:21:1::0;28268:2;28248:18;;;28241:30;-1:-1:-1;;;28287:18:1;;;28280:45;28342:18;;51349:65:0::1;28027:339:1::0;51349:65:0::1;51426:9;51421:104;51441:17:::0;;::::1;51421:104;;;51501:13;;51515:1;51501:16;;;;;;;:::i;:::-;;;;;;;51474:12;:23;51487:6;;51494:1;51487:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51474:23:0::1;-1:-1:-1::0;;;;;51474:23:0::1;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;51460:3:0;;-1:-1:-1;51460:3:0::1;::::0;::::1;:::i;:::-;;;;51421:104;;;;51239:291:::0;;;;:::o;4451:326::-;-1:-1:-1;;;;;4746:19:0;;:23;;;4451:326::o;24270:132::-;24178:6;;-1:-1:-1;;;;;24178:6:0;19273:10;24334:23;24326:68;;;;-1:-1:-1;;;24326:68:0;;28573:2:1;24326:68:0;;;28555:21:1;;;28592:18;;;28585:30;28651:34;28631:18;;;28624:62;28703:18;;24326:68:0;28371:356:1;21643:108:0;21555:7;;;;21713:9;21705:38;;;;-1:-1:-1;;;21705:38:0;;28934:2:1;21705:38:0;;;28916:21:1;28973:2;28953:18;;;28946:30;-1:-1:-1;;;28992:18:1;;;28985:46;29048:18;;21705:38:0;28732:340:1;50425:184:0;50472:9;50467:137;50506:11;;50487:9;:16;:30;;50506:11;50487:30;:::i;:::-;50483:1;:34;50467:137;;;50584:12;;50580:16;;:1;:16;:::i;:::-;50562:34;;:15;:34;:::i;:::-;50543:11;;50533:9;;50543:15;;50557:1;;50543:15;:::i;:::-;50533:26;;;;;;;;:::i;:::-;;;;;;;;;;:63;50519:3;;;;:::i;:::-;;;;50467:137;;42164:1088;42225:7;:14;42221:1026;;42263:13;;-1:-1:-1;;;;;42263:13:0;42255:62;;;;-1:-1:-1;;;42255:62:0;;29279:2:1;42255:62:0;;;29261:21:1;29318:2;29298:18;;;29291:30;-1:-1:-1;;;29337:18:1;;;29330:52;29399:18;;42255:62:0;29077:346:1;42255:62:0;42353:13;;42327:12;;-1:-1:-1;;;;;42353:13:0;19273:10;42452:13;;42373:102;;;;;-1:-1:-1;;;;;42452:13:0;;42467:7;;42373:102;;;:::i;:::-;;;;-1:-1:-1;;42373:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;42373:102:0;-1:-1:-1;;;42373:102:0;;;42345:131;;;42373:102;42345:131;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42326:150;;;42493:7;42485:40;;;;-1:-1:-1;;;42485:40:0;;;;;;;:::i;42221:1026::-;42548:16;;42573:382;42597:7;:14;42593:18;;42573:382;;;42629:24;42685:3;42667:11;42679:1;42667:14;;;;;;;;:::i;:::-;;;;;;;;;42657:7;:24;;;;:::i;:::-;42656:32;;;;:::i;:::-;42726:13;;42629:59;;-1:-1:-1;42700:12:0;;-1:-1:-1;;;;;42726:13:0;19273:10;42825:7;42833:1;42825:10;;;;;;;;:::i;:::-;;;;;;;;;;;42746:108;;;;;-1:-1:-1;;;;;42825:10:0;;42837:16;;42746:108;;;:::i;:::-;;;;-1:-1:-1;;42746:108:0;;;;;;;;;;;;;;-1:-1:-1;;;;;42746:108:0;-1:-1:-1;;;42746:108:0;;;42718:137;;;42746:108;42718:137;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42699:156;;;42874:7;42866:40;;;;-1:-1:-1;;;42866:40:0;;;;;;;:::i;:::-;42917:28;42929:16;42917:28;;:::i;:::-;;;42618:337;;42613:3;;;;;:::i;:::-;;;;42573:382;;;-1:-1:-1;42990:1:0;42968:18;42978:8;42968:7;:18;:::i;:::-;42967:24;42963:277;;;43031:13;;43005:12;;-1:-1:-1;;;;;43031:13:0;19273:10;43130:7;43138:14;;:18;;43155:1;;43138:18;:::i;:::-;43130:27;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43130:27:0;43159:18;43169:8;43159:7;:18;:::i;:::-;43051:127;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43051:127:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43051:127:0;-1:-1:-1;;;43051:127:0;;;43023:156;;;43051:127;43023:156;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43004:175;;;43198:7;43190:40;;;;-1:-1:-1;;;43190:40:0;;;;;;;:::i;28406:293::-;27631:1;28540:7;;:19;;28532:63;;;;-1:-1:-1;;;28532:63:0;;30410:2:1;28532:63:0;;;30392:21:1;30449:2;30429:18;;;30422:30;30488:33;30468:18;;;30461:61;30539:18;;28532:63:0;30208:355:1;28532:63:0;27631:1;28673:7;:18;28406:293::o;41546:612::-;41606:7;:14;41602:551;;41644:13;;-1:-1:-1;;;;;41644:13:0;41636:62;;;;-1:-1:-1;;;41636:62:0;;29279:2:1;41636:62:0;;;29261:21:1;29318:2;29298:18;;;29291:30;-1:-1:-1;;;29337:18:1;;;29330:52;29399:18;;41636:62:0;29077:346:1;41636:62:0;41725:13;;41707:42;;-1:-1:-1;;;;;41725:13:0;41741:7;41707:9;:42::i;41602:551::-;41772:16;;41797:223;41821:7;:14;41817:18;;41797:223;;;41853:24;41909:3;41891:11;41903:1;41891:14;;;;;;;;:::i;:::-;;;;;;;;;41881:7;:24;;;;:::i;:::-;41880:32;;;;:::i;:::-;41853:59;;41923:48;41941:7;41949:1;41941:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;41941:10:0;41954:16;41923:9;:48::i;:::-;41982:28;41994:16;41982:28;;:::i;:::-;;;41842:178;41837:3;;;;;:::i;:::-;;;;41797:223;;;-1:-1:-1;42055:1:0;42033:18;42043:8;42033:7;:18;:::i;:::-;42032:24;42028:118;;;42087:7;42095:14;;42069:67;;42087:7;42095:18;;42112:1;;42095:18;:::i;:::-;42087:27;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;42087:27:0;42117:18;42127:8;42117:7;:18;:::i;:::-;41408:6;41383:21;:31;;41375:55;;;;-1:-1:-1;;;41375:55:0;;30770:2:1;41375:55:0;;;30752:21:1;30809:2;30789:18;;;30782:30;-1:-1:-1;;;30828:18:1;;;30821:41;30879:18;;41375:55:0;30568:335:1;41375:55:0;41438:12;41456:9;-1:-1:-1;;;;;41456:14:0;41478:6;41456:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41437:52;;;41504:7;41496:38;;;;-1:-1:-1;;;41496:38:0;;31320:2:1;41496:38:0;;;31302:21:1;31359:2;31339:18;;;31332:30;-1:-1:-1;;;31378:18:1;;;31371:48;31436:18;;41496:38:0;31118:342:1;22339:120:0;21348:16;:14;:16::i;:::-;22398:7:::1;:15:::0;;-1:-1:-1;;22398:15:0::1;::::0;;22429:22:::1;19273:10:::0;22438:12:::1;22429:22;::::0;-1:-1:-1;;;;;2878:32:1;;;2860:51;;2848:2;2833:18;22429:22:0::1;;;;;;;22339:120::o:0;25372:191::-;25465:6;;;-1:-1:-1;;;;;25482:17:0;;;-1:-1:-1;;;;;;25482:17:0;;;;;;;25515:40;;25465:6;;;25482:17;25465:6;;25515:40;;25446:16;;25515:40;25435:128;25372:191;:::o;22080:118::-;21089:19;:17;:19::i;:::-;22140:7:::1;:14:::0;;-1:-1:-1;;22140:14:0::1;22150:4;22140:14;::::0;;22170:20:::1;22177:12;19273:10:::0;;19193:98;21828:108;21555:7;;;;21887:41;;;;-1:-1:-1;;;21887:41:0;;31667:2:1;21887:41:0;;;31649:21:1;31706:2;31686:18;;;31679:30;-1:-1:-1;;;31725:18:1;;;31718:50;31785:18;;21887:41:0;31465:344:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:437::-;472:6;480;533:2;521:9;512:7;508:23;504:32;501:52;;;549:1;546;539:12;501:52;589:9;576:23;622:18;614:6;611:30;608:50;;;654:1;651;644:12;608:50;693:70;755:7;746:6;735:9;731:22;693:70;:::i;:::-;782:8;;667:96;;-1:-1:-1;386:437:1;-1:-1:-1;;;;386:437:1:o;828:180::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;-1:-1:-1;979:23:1;;828:180;-1:-1:-1;828:180:1:o;1205:118::-;1291:5;1284:13;1277:21;1270:5;1267:32;1257:60;;1313:1;1310;1303:12;1328:241;1384:6;1437:2;1425:9;1416:7;1412:23;1408:32;1405:52;;;1453:1;1450;1443:12;1405:52;1492:9;1479:23;1511:28;1533:5;1511:28;:::i;1574:173::-;1642:20;;-1:-1:-1;;;;;1691:31:1;;1681:42;;1671:70;;1737:1;1734;1727:12;1752:186;1811:6;1864:2;1852:9;1843:7;1839:23;1835:32;1832:52;;;1880:1;1877;1870:12;1832:52;1903:29;1922:9;1903:29;:::i;2125:248::-;2193:6;2201;2254:2;2242:9;2233:7;2229:23;2225:32;2222:52;;;2270:1;2267;2260:12;2222:52;-1:-1:-1;;2293:23:1;;;2363:2;2348:18;;;2335:32;;-1:-1:-1;2125:248:1:o;2378:309::-;2443:6;2451;2504:2;2492:9;2483:7;2479:23;2475:32;2472:52;;;2520:1;2517;2510:12;2472:52;2556:9;2543:23;2533:33;;2616:2;2605:9;2601:18;2588:32;2629:28;2651:5;2629:28;:::i;:::-;2676:5;2666:15;;;2378:309;;;;;:::o;2922:385::-;3008:6;3016;3024;3032;3085:3;3073:9;3064:7;3060:23;3056:33;3053:53;;;3102:1;3099;3092:12;3053:53;-1:-1:-1;;3125:23:1;;;3195:2;3180:18;;3167:32;;-1:-1:-1;3246:2:1;3231:18;;3218:32;;3297:2;3282:18;3269:32;;-1:-1:-1;2922:385:1;-1:-1:-1;2922:385:1:o;3312:127::-;3373:10;3368:3;3364:20;3361:1;3354:31;3404:4;3401:1;3394:15;3428:4;3425:1;3418:15;3444:251;3516:2;3510:9;3558:2;3546:15;;3591:18;3576:34;;3612:22;;;3573:62;3570:88;;;3638:18;;:::i;:::-;3674:2;3667:22;3444:251;:::o;3700:275::-;3771:2;3765:9;3836:2;3817:13;;-1:-1:-1;;3813:27:1;3801:40;;3871:18;3856:34;;3892:22;;;3853:62;3850:88;;;3918:18;;:::i;:::-;3954:2;3947:22;3700:275;;-1:-1:-1;3700:275:1:o;3980:183::-;4040:4;4073:18;4065:6;4062:30;4059:56;;;4095:18;;:::i;:::-;-1:-1:-1;4140:1:1;4136:14;4152:4;4132:25;;3980:183::o;4168:662::-;4222:5;4275:3;4268:4;4260:6;4256:17;4252:27;4242:55;;4293:1;4290;4283:12;4242:55;4329:6;4316:20;4355:4;4379:60;4395:43;4435:2;4395:43;:::i;:::-;4379:60;:::i;:::-;4473:15;;;4559:1;4555:10;;;;4543:23;;4539:32;;;4504:12;;;;4583:15;;;4580:35;;;4611:1;4608;4601:12;4580:35;4647:2;4639:6;4635:15;4659:142;4675:6;4670:3;4667:15;4659:142;;;4741:17;;4729:30;;4779:12;;;;4692;;4659:142;;;-1:-1:-1;4819:5:1;4168:662;-1:-1:-1;;;;;;4168:662:1:o;4835:1146::-;4953:6;4961;5014:2;5002:9;4993:7;4989:23;4985:32;4982:52;;;5030:1;5027;5020:12;4982:52;5070:9;5057:23;5099:18;5140:2;5132:6;5129:14;5126:34;;;5156:1;5153;5146:12;5126:34;5194:6;5183:9;5179:22;5169:32;;5239:7;5232:4;5228:2;5224:13;5220:27;5210:55;;5261:1;5258;5251:12;5210:55;5297:2;5284:16;5319:4;5343:60;5359:43;5399:2;5359:43;:::i;5343:60::-;5437:15;;;5519:1;5515:10;;;;5507:19;;5503:28;;;5468:12;;;;5543:19;;;5540:39;;;5575:1;5572;5565:12;5540:39;5599:11;;;;5619:148;5635:6;5630:3;5627:15;5619:148;;;5701:23;5720:3;5701:23;:::i;:::-;5689:36;;5652:12;;;;5745;;;;5619:148;;;5786:5;-1:-1:-1;;5829:18:1;;5816:32;;-1:-1:-1;;5860:16:1;;;5857:36;;;5889:1;5886;5879:12;5857:36;;5912:63;5967:7;5956:8;5945:9;5941:24;5912:63;:::i;:::-;5902:73;;;4835:1146;;;;;:::o;6194:397::-;6280:6;6288;6296;6304;6357:3;6345:9;6336:7;6332:23;6328:33;6325:53;;;6374:1;6371;6364:12;6325:53;6410:9;6397:23;6387:33;;6467:2;6456:9;6452:18;6439:32;6429:42;;6490:38;6524:2;6513:9;6509:18;6490:38;:::i;:::-;6480:48;;6547:38;6581:2;6570:9;6566:18;6547:38;:::i;:::-;6537:48;;6194:397;;;;;;;:::o;6596:997::-;6703:6;6734:2;6777;6765:9;6756:7;6752:23;6748:32;6745:52;;;6793:1;6790;6783:12;6745:52;6833:9;6820:23;6862:18;6903:2;6895:6;6892:14;6889:34;;;6919:1;6916;6909:12;6889:34;6957:6;6946:9;6942:22;6932:32;;7002:7;6995:4;6991:2;6987:13;6983:27;6973:55;;7024:1;7021;7014:12;6973:55;7048:22;;:::i;:::-;7092:3;7126:2;7122;7118:11;7152:7;7144:6;7141:19;7138:39;;;7173:1;7170;7163:12;7138:39;7197:2;7208:355;7224:6;7219:3;7216:15;7208:355;;;7310:3;7297:17;7346:2;7333:11;7330:19;7327:109;;;7390:1;7419:2;7415;7408:14;7327:109;7461:59;7512:7;7498:11;7494:2;7490:20;7461:59;:::i;:::-;7449:72;;-1:-1:-1;7541:12:1;;;;7241;;7208:355;;;-1:-1:-1;7582:5:1;;6596:997;-1:-1:-1;;;;;;;;6596:997:1:o;7598:383::-;7672:6;7680;7688;7741:2;7729:9;7720:7;7716:23;7712:32;7709:52;;;7757:1;7754;7747:12;7709:52;7780:29;7799:9;7780:29;:::i;:::-;7770:39;;7856:2;7845:9;7841:18;7828:32;7818:42;;7910:2;7899:9;7895:18;7882:32;7923:28;7945:5;7923:28;:::i;:::-;7970:5;7960:15;;;7598:383;;;;;:::o;7986:316::-;8063:6;8071;8079;8132:2;8120:9;8111:7;8107:23;8103:32;8100:52;;;8148:1;8145;8138:12;8100:52;-1:-1:-1;;8171:23:1;;;8241:2;8226:18;;8213:32;;-1:-1:-1;8292:2:1;8277:18;;;8264:32;;7986:316;-1:-1:-1;7986:316:1:o;8307:632::-;8478:2;8530:21;;;8600:13;;8503:18;;;8622:22;;;8449:4;;8478:2;8701:15;;;;8675:2;8660:18;;;8449:4;8744:169;8758:6;8755:1;8752:13;8744:169;;;8819:13;;8807:26;;8888:15;;;;8853:12;;;;8780:1;8773:9;8744:169;;;-1:-1:-1;8930:3:1;;8307:632;-1:-1:-1;;;;;;8307:632:1:o;9402:773::-;9524:6;9532;9540;9548;9601:2;9589:9;9580:7;9576:23;9572:32;9569:52;;;9617:1;9614;9607:12;9569:52;9657:9;9644:23;9686:18;9727:2;9719:6;9716:14;9713:34;;;9743:1;9740;9733:12;9713:34;9782:70;9844:7;9835:6;9824:9;9820:22;9782:70;:::i;:::-;9871:8;;-1:-1:-1;9756:96:1;-1:-1:-1;9959:2:1;9944:18;;9931:32;;-1:-1:-1;9975:16:1;;;9972:36;;;10004:1;10001;9994:12;9972:36;;10043:72;10107:7;10096:8;10085:9;10081:24;10043:72;:::i;:::-;9402:773;;;;-1:-1:-1;10134:8:1;-1:-1:-1;;;;9402:773:1:o;10180:127::-;10241:10;10236:3;10232:20;10229:1;10222:31;10272:4;10269:1;10262:15;10296:4;10293:1;10286:15;10312:127;10373:10;10368:3;10364:20;10361:1;10354:31;10404:4;10401:1;10394:15;10428:4;10425:1;10418:15;10444:135;10483:3;-1:-1:-1;;10504:17:1;;10501:43;;;10524:18;;:::i;:::-;-1:-1:-1;10571:1:1;10560:13;;10444:135::o;13342:347::-;13544:2;13526:21;;;13583:2;13563:18;;;13556:30;13622:25;13617:2;13602:18;;13595:53;13680:2;13665:18;;13342:347::o;13694:343::-;13896:2;13878:21;;;13935:2;13915:18;;;13908:30;-1:-1:-1;;;13969:2:1;13954:18;;13947:49;14028:2;14013:18;;13694:343::o;14042:128::-;14082:3;14113:1;14109:6;14106:1;14103:13;14100:39;;;14119:18;;:::i;:::-;-1:-1:-1;14155:9:1;;14042:128::o;14175:217::-;14215:1;14241;14231:132;;14285:10;14280:3;14276:20;14273:1;14266:31;14320:4;14317:1;14310:15;14348:4;14345:1;14338:15;14231:132;-1:-1:-1;14377:9:1;;14175:217::o;14397:125::-;14437:4;14465:1;14462;14459:8;14456:34;;;14470:18;;:::i;:::-;-1:-1:-1;14507:9:1;;14397:125::o;14527:354::-;14729:2;14711:21;;;14768:2;14748:18;;;14741:30;14807:32;14802:2;14787:18;;14780:60;14872:2;14857:18;;14527:354::o;14886:168::-;14926:7;14992:1;14988;14984:6;14980:14;14977:1;14974:21;14969:1;14962:9;14955:17;14951:45;14948:71;;;14999:18;;:::i;:::-;-1:-1:-1;15039:9:1;;14886:168::o;15647:184::-;15717:6;15770:2;15758:9;15749:7;15745:23;15741:32;15738:52;;;15786:1;15783;15776:12;15738:52;-1:-1:-1;15809:16:1;;15647:184;-1:-1:-1;15647:184:1:o;19385:245::-;19452:6;19505:2;19493:9;19484:7;19480:23;19476:32;19473:52;;;19521:1;19518;19511:12;19473:52;19553:9;19547:16;19572:28;19594:5;19572:28;:::i;22393:375::-;-1:-1:-1;;;;;22651:15:1;;;22633:34;;22703:15;;;;22698:2;22683:18;;22676:43;22750:2;22735:18;;22728:34;;;;22583:2;22568:18;;22393:375::o;22773:179::-;22851:13;;22904:22;22893:34;;22883:45;;22873:73;;22942:1;22939;22932:12;22957:473;23060:6;23068;23076;23084;23092;23145:3;23133:9;23124:7;23120:23;23116:33;23113:53;;;23162:1;23159;23152:12;23113:53;23185:39;23214:9;23185:39;:::i;:::-;23175:49;;23264:2;23253:9;23249:18;23243:25;23233:35;;23308:2;23297:9;23293:18;23287:25;23277:35;;23352:2;23341:9;23337:18;23331:25;23321:35;;23375:49;23419:3;23408:9;23404:19;23375:49;:::i;:::-;23365:59;;22957:473;;;;;;;;:::o;23435:553::-;23474:7;-1:-1:-1;;;;;23544:9:1;;;23572;;;23597:11;;;23616:10;;;23610:17;;23593:35;23590:61;;;23631:18;;:::i;:::-;-1:-1:-1;;;23707:1:1;23700:9;;23725:11;;;23745;;;23738:19;;23721:37;23718:63;;;23761:18;;:::i;:::-;23807:1;23804;23800:9;23790:19;;23854:1;23850:2;23845:11;23842:1;23838:19;23833:2;23829;23825:11;23821:37;23818:63;;;23861:18;;:::i;:::-;23926:1;23922:2;23917:11;23914:1;23910:19;23905:2;23901;23897:11;23893:37;23890:63;;;23933:18;;:::i;:::-;-1:-1:-1;;;23973:9:1;;;;;23435:553;-1:-1:-1;;;23435:553:1:o;29428:426::-;29557:3;29595:6;29589:13;29620:1;29630:129;29644:6;29641:1;29638:13;29630:129;;;29742:4;29726:14;;;29722:25;;29716:32;29703:11;;;29696:53;29659:12;29630:129;;;29777:6;29774:1;29771:13;29768:48;;;29812:1;29803:6;29798:3;29794:16;29787:27;29768:48;-1:-1:-1;29832:16:1;;;;;29428:426;-1:-1:-1;;29428:426:1:o;29859:344::-;30061:2;30043:21;;;30100:2;30080:18;;;30073:30;-1:-1:-1;;;30134:2:1;30119:18;;30112:50;30194:2;30179:18;;29859:344::o
Swarm Source
ipfs://b27a31a98994ede868ad21a3853b07a636386da8eb024be283a2a01ec39eebd2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.