ERC-20
Overview
Max Total Supply
253.410819272714073756 ERC20 ***
Holders
19
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.972451297248573532 ERC20 ***Value
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
IdleDAI
Compiler Version
v0.5.2+commit.1df8f40c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-08-15 */ // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through `transferFrom`. This is * zero by default. * * This value changes when `approve` or `transferFrom` are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * > Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an `Approval` event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to `approve`. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the `IERC20` interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using `_mint`. * For a generic mechanism see `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an `Approval` event is emitted on calls to `transferFrom`. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` * functions have been added to mitigate the well-known issues around setting * allowances. See `IERC20.approve`. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See `IERC20.transfer`. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @dev See `IERC20.transferFrom`. * * Emits an `Approval` event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of `ERC20`; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to `transfer`, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a `Transfer` event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a `Transfer` event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destoys `amount` tokens from `account`, reducing the * total supply. * * Emits a `Transfer` event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an `Approval` event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See `_burn` and `_approve`. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); } } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * > Note that this information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * `IERC20.balanceOf` and `IERC20.transfer`. */ function decimals() public view returns (uint8) { return _decimals; } } // File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier * available, which can be aplied 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. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.5.0; /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/interfaces/CERC20.sol pragma solidity ^0.5.2; interface CERC20 { function mint(uint256 mintAmount) external returns (uint256); function redeem(uint256 redeemTokens) external returns (uint256); function exchangeRateStored() external view returns (uint256); function supplyRatePerBlock() external view returns (uint256); function borrowRatePerBlock() external view returns (uint256); function totalReserves() external view returns (uint256); function getCash() external view returns (uint256); function totalBorrows() external view returns (uint256); function reserveFactorMantissa() external view returns (uint256); } // File: contracts/interfaces/iERC20.sol pragma solidity ^0.5.2; interface iERC20 { function mint( address receiver, uint256 depositAmount) external returns (uint256 mintAmount); function burn( address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function tokenPrice() external view returns (uint256 price); function supplyInterestRate() external view returns (uint256); function rateMultiplier() external view returns (uint256); function baseRate() external view returns (uint256); function borrowInterestRate() external view returns (uint256); function totalAssetBorrow() external view returns (uint256); function totalAssetSupply() external view returns (uint256); function nextSupplyInterestRate(uint256) external view returns (uint256); function nextBorrowInterestRate(uint256) external view returns (uint256); function nextLoanInterestRate(uint256) external view returns (uint256); function claimLoanToken() external returns (uint256 claimedAmount); /* function burnToEther( address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid); function supplyInterestRate() external view returns (uint256); function assetBalanceOf( address _owner) external view returns (uint256); function claimLoanToken() external returns (uint256 claimedAmount); */ } // File: contracts/IdleHelp.sol pragma solidity ^0.5.2; library IdleHelp { using SafeMath for uint256; function getPriceInToken(address cToken, address iToken, address bestToken, uint256 totalSupply, uint256 poolSupply) public view returns (uint256 tokenPrice) { // 1Token = net_asset_value / total_Token_liquidity // net_asset_value = (rate of 1(cToken || iToken) in underlying_Token) * balanceOf((cToken || iToken)) uint256 navPool; uint256 price; // rate if (bestToken == cToken) { // exchangeRateStored is the rate (in wei, 8 decimals) of 1cDAI in DAI * 10**18 price = CERC20(cToken).exchangeRateStored(); // 202487304197710837666727644 -> } else { price = iERC20(iToken).tokenPrice(); // eg 1001495070730287403 -> 1iToken in wei = 1001495070730287403 Token } navPool = price.mul(poolSupply); // eg 43388429749999990000 in DAI tokenPrice = navPool.div(totalSupply); // idleToken price in token wei } function getAPRs(address cToken, address iToken, uint256 blocksInAYear) public view returns (uint256 cApr, uint256 iApr) { uint256 cRate = CERC20(cToken).supplyRatePerBlock(); // interest % per block cApr = cRate.mul(blocksInAYear).mul(100); iApr = iERC20(iToken).supplyInterestRate(); // APR in wei 18 decimals } function getBestRateToken(address cToken, address iToken, uint256 blocksInAYear) public view returns (address bestRateToken, uint256 bestRate, uint256 worstRate) { (uint256 cApr, uint256 iApr) = getAPRs(cToken, iToken, blocksInAYear); bestRateToken = cToken; bestRate = cApr; worstRate = iApr; if (iApr > cApr) { worstRate = cApr; bestRate = iApr; bestRateToken = iToken; } } function rebalanceCheck(address cToken, address iToken, address bestToken, uint256 blocksInAYear, uint256 minRateDifference) public view returns (bool shouldRebalance, address bestTokenAddr) { shouldRebalance = false; uint256 _bestRate; uint256 _worstRate; (bestTokenAddr, _bestRate, _worstRate) = getBestRateToken(cToken, iToken, blocksInAYear); if ( bestToken == address(0) || (bestTokenAddr != bestToken && (_worstRate.add(minRateDifference) < _bestRate))) { shouldRebalance = true; return (shouldRebalance, bestTokenAddr); } return (shouldRebalance, bestTokenAddr); } } // File: contracts/IdleDAI.sol pragma solidity ^0.5.2; contract IdleDAI is ERC20, ERC20Detailed, ReentrancyGuard, Ownable { using SafeERC20 for IERC20; using SafeMath for uint256; address public cToken; // cTokens have 8 decimals address public iToken; // iTokens have 18 decimals address public token; address public bestToken; uint256 public blocksInAYear; uint256 public minRateDifference; /** * @dev constructor */ constructor(address _cToken, address _iToken, address _token) public ERC20Detailed("IdleDAI", "IDLEDAI", 18) { cToken = _cToken; iToken = _iToken; token = _token; blocksInAYear = 2102400; // ~15 sec per block minRateDifference = 100000000000000000; // 0.1% min } // onlyOwner function setMinRateDifference(uint256 _rate) external onlyOwner { minRateDifference = _rate; } function setBlocksInAYear(uint256 _blocks) external onlyOwner { blocksInAYear = _blocks; } function setToken(address _token) external onlyOwner { token = _token; } function setIToken(address _iToken) external onlyOwner { iToken = _iToken; } function setCToken(address _cToken) external onlyOwner { cToken = _cToken; } // This should never be called, only in case of contract failure // after an audit this should be removed function emergencyWithdraw(address _token, uint256 _value) external onlyOwner { IERC20 underlying = IERC20(_token); if (_value != 0) { underlying.safeTransfer(msg.sender, _value); } else { underlying.safeTransfer(msg.sender, underlying.balanceOf(address(this))); } } // view function tokenPrice() public view returns (uint256 price) { uint256 poolSupply = IERC20(cToken).balanceOf(address(this)); if (bestToken == iToken) { poolSupply = IERC20(iToken).balanceOf(address(this)); } price = IdleHelp.getPriceInToken( cToken, iToken, bestToken, this.totalSupply(), poolSupply ); } function rebalanceCheck() public view returns (bool, address) { return IdleHelp.rebalanceCheck(cToken, iToken, bestToken, blocksInAYear, minRateDifference); } function getAPRs() external view returns (uint256, uint256) { return IdleHelp.getAPRs(cToken, iToken, blocksInAYear); } // public /** * @dev User should 'approve' _amount tokens before calling mintIdleToken */ function mintIdleToken(uint256 _amount) external nonReentrant returns (uint256 mintedTokens) { require(_amount > 0, "Amount is not > 0"); // First rebalance the current pool if needed rebalance(); // get a handle for the underlying asset contract IERC20 underlying = IERC20(token); // transfer to this contract underlying.safeTransferFrom(msg.sender, address(this), _amount); uint256 idlePrice = 10**18; uint256 totalSupply = this.totalSupply(); if (totalSupply != 0) { idlePrice = tokenPrice(); } if (bestToken == cToken) { _mintCTokens(_amount); } else { _mintITokens(_amount); } if (totalSupply == 0) { mintedTokens = _amount; // 1:1 } else { mintedTokens = _amount.mul(10**18).div(idlePrice); } _mint(msg.sender, mintedTokens); } /** * @dev here we calc the pool share of the cTokens | iTokens one can withdraw */ function redeemIdleToken(uint256 _amount) external nonReentrant returns (uint256 tokensRedeemed) { uint256 idleSupply = this.totalSupply(); require(idleSupply > 0, 'No IDLEDAI have been issued'); if (bestToken == cToken) { uint256 cPoolBalance = IERC20(cToken).balanceOf(address(this)); uint256 cDAItoRedeem = _amount.mul(cPoolBalance).div(idleSupply); tokensRedeemed = _redeemCTokens(cDAItoRedeem, msg.sender); } else { uint256 iPoolBalance = IERC20(iToken).balanceOf(address(this)); uint256 iDAItoRedeem = _amount.mul(iPoolBalance).div(idleSupply); // TODO we should inform the user of the eventual excess of token that can be redeemed directly in Fulcrum tokensRedeemed = _redeemITokens(iDAItoRedeem, msg.sender); } _burn(msg.sender, _amount); rebalance(); } /** * @dev Convert cToken pool in iToken pool (or the contrary) if needed * Everyone should be incentivized in calling this method */ function rebalance() public { (bool shouldRebalance, address newBestTokenAddr) = rebalanceCheck(); if (!shouldRebalance) { return; } if (bestToken != address(0)) { // bestToken here is the 'old' best token if (bestToken == cToken) { _redeemCTokens(IERC20(cToken).balanceOf(address(this)), address(this)); // token are now in this contract _mintITokens(IERC20(token).balanceOf(address(this))); } else { _redeemITokens(IERC20(iToken).balanceOf(address(this)), address(this)); _mintCTokens(IERC20(token).balanceOf(address(this))); } } // Update best token address bestToken = newBestTokenAddr; } /** * @dev here we are redeeming unclaimed token (from iToken contract) to this contracts * then converting the claimedTokens in the bestToken after rebalancing * Everyone should be incentivized in calling this method */ function claimITokens() external returns (uint256 claimedTokens) { claimedTokens = iERC20(iToken).claimLoanToken(); if (claimedTokens == 0) { return claimedTokens; } rebalance(); if (bestToken == cToken) { _mintCTokens(claimedTokens); } else { _mintITokens(claimedTokens); } return claimedTokens; } // internal function _mintCTokens(uint256 _amount) internal returns (uint256 cTokens) { if (IERC20(token).balanceOf(address(this)) == 0) { return cTokens; } // approve the transfer to cToken contract IERC20(token).safeIncreaseAllowance(cToken, _amount); // get a handle for the corresponding cToken contract CERC20 _cToken = CERC20(cToken); // mint the cTokens and assert there is no error require(_cToken.mint(_amount) == 0, "Error minting"); // cTokens are now in this contract // generic solidity formula is exchangeRateMantissa = (underlying / cTokens) * 1e18 uint256 exchangeRateMantissa = _cToken.exchangeRateStored(); // (exchange_rate * 1e18) // so cTokens = (underlying * 1e18) / exchangeRateMantissa cTokens = _amount.mul(10**18).div(exchangeRateMantissa); } function _mintITokens(uint256 _amount) internal returns (uint256 iTokens) { if (IERC20(token).balanceOf(address(this)) == 0) { return iTokens; } // approve the transfer to iToken contract IERC20(token).safeIncreaseAllowance(iToken, _amount); // get a handle for the corresponding iToken contract iERC20 _iToken = iERC20(iToken); // mint the iTokens iTokens = _iToken.mint(address(this), _amount); } function _redeemCTokens(uint256 _amount, address _account) internal returns (uint256 tokens) { CERC20 _cToken = CERC20(cToken); // redeem all user's underlying require(_cToken.redeem(_amount) == 0, "Something went wrong when redeeming in cTokens"); // generic solidity formula is exchangeRateMantissa = (underlying / cTokens) * 1e18 uint256 exchangeRateMantissa = _cToken.exchangeRateStored(); // exchange_rate * 1e18 // so underlying = (exchangeRateMantissa * cTokens) / 1e18 tokens = _amount.mul(exchangeRateMantissa).div(10**18); if (_account != address(this)) { IERC20(token).safeTransfer(_account, tokens); } } function _redeemITokens(uint256 _amount, address _account) internal returns (uint256 tokens) { tokens = iERC20(iToken).burn(_account, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"mintIdleToken","outputs":[{"name":"mintedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setMinRateDifference","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minRateDifference","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"iToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceCheck","outputs":[{"name":"","type":"bool"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cToken","type":"address"}],"name":"setCToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"blocksInAYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bestToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimITokens","outputs":[{"name":"claimedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blocks","type":"uint256"}],"name":"setBlocksInAYear","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_iToken","type":"address"}],"name":"setIToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"redeemIdleToken","outputs":[{"name":"tokensRedeemed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_value","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAPRs","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_cToken","type":"address"},{"name":"_iToken","type":"address"},{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160608062004e73833981018060405260608110156200003357600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050506040805190810160405280600781526020017f49646c65444149000000000000000000000000000000000000000000000000008152506040805190810160405280600781526020017f49444c454441490000000000000000000000000000000000000000000000000081525060128260039080519060200190620000de929190620002c1565b508160049080519060200190620000f7929190620002c1565b5080600560006101000a81548160ff021916908360ff160217905550505050600160068190555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a382600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062201480600c8190555067016345785d8a0000600d8190555050505062000370565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200030457805160ff191683800117855562000335565b8280016001018555821562000335579182015b828111156200033457825182559160200191906001019062000317565b5b50905062000344919062000348565b5090565b6200036d91905b80821115620003695760008160009055506001016200034f565b5090565b90565b614af380620003806000396000f3fe608060405234801561001057600080fd5b5060043610610223576000357c01000000000000000000000000000000000000000000000000000000009004806369e527da116101375780638f32d59b116100ca578063a9059cbb11610099578063a9059cbb146109a5578063b13bd49114610a0b578063dd62ed3e14610a30578063f2fde38b14610aa8578063fc0c546a14610aec57610223565b80638f32d59b1461084c57806395ccea671461086e57806395d89b41146108bc578063a457c2d71461093f57610223565b80637e2a53af116101065780637e2a53af1461075e5780637ff9b596146107a25780638b30b516146107c05780638da5cb5b1461080257610223565b806369e527da146106a857806370a08231146106f2578063715018a61461074a5780637d7c2a1c1461075457610223565b8063313ce567116101ba5780634cb71222116101895780634cb71222146105b05780634d02f1c2146105f457806351707e4614610612578063621eb0931461065c57806367f8d85d1461067a57610223565b8063313ce5671461048757806339509351146104ab578063408cfe24146105115780634732376d1461055b57610223565b806318160ddd116101f657806318160ddd146103975780631aaa4a18146103b557806322c9f971146103e357806323b872dd1461040157610223565b806306fdde031461022857806308677d7e146102ab578063095ea7b3146102ed578063144fa6d714610353575b600080fd5b610230610b36565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d7600480360360208110156102c157600080fd5b8101908080359060200190929190505050610bd8565b6040518082815260200191505060405180910390f35b6103396004803603604081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ee8565b604051808215151515815260200191505060405180910390f35b6103956004803603602081101561036957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610eff565b005b61039f610fbf565b6040518082815260200191505060405180910390f35b6103e1600480360360208110156103cb57600080fd5b8101908080359060200190929190505050610fc9565b005b6103eb61104f565b6040518082815260200191505060405180910390f35b61046d6004803603606081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611055565b604051808215151515815260200191505060405180910390f35b61048f611106565b604051808260ff1660ff16815260200191505060405180910390f35b6104f7600480360360408110156104c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061111d565b604051808215151515815260200191505060405180910390f35b6105196111c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105636111e8565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6105f2600480360360208110156105c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b0565b005b6105fc611470565b6040518082815260200191505060405180910390f35b61061a611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066461149c565b6040518082815260200191505060405180910390f35b6106a66004803603602081101561069057600080fd5b8101908080359060200190929190505050611613565b005b6106b0611699565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107346004803603602081101561070857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bf565b6040518082815260200191505060405180910390f35b610752611707565b005b61075c611844565b005b6107a06004803603602081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d7c565b005b6107aa611e3c565b6040518082815260200191505060405180910390f35b6107ec600480360360208110156107d657600080fd5b81019080803590602001909291905050506122fa565b6040518082815260200191505060405180910390f35b61080a61279f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108546127c9565b604051808215151515815260200191505060405180910390f35b6108ba6004803603604081101561088457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612821565b005b6108c46129e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109045780820151818401526020810190506108e9565b50505050905090810190601f1680156109315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61098b6004803603604081101561095557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a82565b604051808215151515815260200191505060405180910390f35b6109f1600480360360408110156109bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b27565b604051808215151515815260200191505060405180910390f35b610a13612b3e565b604051808381526020018281526020019250505060405180910390f35b610a9260048036036040811015610a4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ca6565b6040518082815260200191505060405180910390f35b610aea60048036036020811015610abe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d2d565b005b610af4612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b5050505050905090565b6000600160066000828254019250508190555060006006549050600083111515610c6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f416d6f756e74206973206e6f74203e203000000000000000000000000000000081525060200191505060405180910390fd5b610c72611844565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610cc63330868473ffffffffffffffffffffffffffffffffffffffff16612ddb909392919063ffffffff16565b6000670de0b6b3a7640000905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d6020811015610d6157600080fd5b81019080805190602001909291905050509050600081141515610d8957610d86611e3c565b91505b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e1057610e0a86612efd565b50610e1b565b610e1986613293565b505b6000811415610e2c57859450610e5c565b610e5982610e4b670de0b6b3a76400008961351790919063ffffffff16565b6135a190919063ffffffff16565b94505b610e663386613634565b50505060065481141515610ee2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000610ef53384846137f1565b6001905092915050565b610f076127c9565b1515610f7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600254905090565b610fd16127c9565b1515611045576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b600d5481565b60006110628484846139ec565b6110fb84336110f685600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006111b833846111b385600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6137f1565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563a5ae97da600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54600d546040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200195505050505050604080518083038186803b15801561136357600080fd5b505af4158015611377573d6000803e3d6000fd5b505050506040513d604081101561138d57600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6113b86127c9565b151561142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663087fc48b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561152457600080fd5b505af1158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b81019080805190602001909291905050509050600081141561157257809050611610565b61157a611844565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611601576115fb81612efd565b5061160c565b61160a81613293565b505b8090505b90565b61161b6127c9565b151561168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61170f6127c9565b1515611783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061184f6111e8565b91509150811515611861575050611d7a565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611d3657600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b3557611a30600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ef57600080fd5b505afa158015611a03573d6000803e3d6000fd5b505050506040513d6020811015611a1957600080fd5b810190808051906020019092919050505030613da1565b50611b2f600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d6020811015611b1957600080fd5b8101908080519060200190929190505050613293565b50611d35565b611c34600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf357600080fd5b505afa158015611c07573d6000803e3d6000fd5b505050506040513d6020811015611c1d57600080fd5b810190808051906020019092919050505030614028565b50611d33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cf357600080fd5b505afa158015611d07573d6000803e3d6000fd5b505050506040513d6020811015611d1d57600080fd5b8101908080519060200190929190505050612efd565b505b5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505b565b611d846127c9565b1515611df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611efa57600080fd5b505afa158015611f0e573d6000803e3d6000fd5b505050506040513d6020811015611f2457600080fd5b81019080805190602001909291905050509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120a857600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b810190808051906020019092919050505090505b73e66127a3539e1a415cfaae8a43cb9d73e65042956379d88372600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561218d57600080fd5b505afa1580156121a1573d6000803e3d6000fd5b505050506040513d60208110156121b757600080fd5b8101908080519060200190929190505050866040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019550505050505060206040518083038186803b1580156122b957600080fd5b505af41580156122cd573d6000803e3d6000fd5b505050506040513d60208110156122e357600080fd5b810190808051906020019092919050505091505090565b600060016006600082825401925050819055506000600654905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561237857600080fd5b505afa15801561238c573d6000803e3d6000fd5b505050506040513d60208110156123a257600080fd5b8101908080519060200190929190505050905060008111151561242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e6f2049444c454441492068617665206265656e20697373756564000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125db576000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b8101908080519060200190929190505050905060006125c6836125b8848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506125d28133613da1565b9450505061270d565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561269857600080fd5b505afa1580156126ac573d6000803e3d6000fd5b505050506040513d60208110156126c257600080fd5b8101908080519060200190929190505050905060006126fc836126ee848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506127088133614028565b945050505b6127173385614132565b61271f611844565b5060065481141515612799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6128296127c9565b151561289d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008290506000821415156128dc576128d733838373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b6129db565b6129da338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a785780601f10612a4d57610100808354040283529160200191612a78565b820191906000526020600020905b815481529060010190602001808311612a5b57829003601f168201915b5050505050905090565b6000612b1d3384612b1885600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b6001905092915050565b6000612b343384846139ec565b6001905092915050565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563fe26dc40600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c546040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604080518083038186803b158015612c5957600080fd5b505af4158015612c6d573d6000803e3d6000fd5b505050506040513d6040811015612c8357600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612d356127c9565b1515612da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612db2816143bf565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612ef7848573ffffffffffffffffffffffffffffffffffffffff166323b872dd90507c010000000000000000000000000000000000000000000000000000000002858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fbb57600080fd5b505afa158015612fcf573d6000803e3d6000fd5b505050506040513d6020811015612fe557600080fd5b810190808051906020019092919050505014156130045780905061328e565b613073600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b505050506040513d602081101561313557600080fd5b81019080805190602001909291905050501415156131bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4572726f72206d696e74696e670000000000000000000000000000000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561321f57600080fd5b505afa158015613233573d6000803e3d6000fd5b505050506040513d602081101561324957600080fd5b810190808051906020019092919050505090506132898161327b670de0b6b3a76400008761351790919063ffffffff16565b6135a190919063ffffffff16565b925050505b919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561335157600080fd5b505afa158015613365573d6000803e3d6000fd5b505050506040513d602081101561337b57600080fd5b8101908080519060200190929190505050141561339a57809050613512565b613409600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156134d357600080fd5b505af11580156134e7573d6000803e3d6000fd5b505050506040513d60208110156134fd57600080fd5b81019080805190602001909291905050509150505b919050565b60008083141561352a576000905061359b565b6000828402905082848281151561353d57fe5b04141515613596576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149e56021913960400191505060405180910390fd5b809150505b92915050565b6000808211151561361a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561362757fe5b0490508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6136ee81600254613d1790919063ffffffff16565b600281905550613745816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a4c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149c36022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a276025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613afc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061497a6023913960400191505060405180910390fd5b613b4d816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613be0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211151515613d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110151515613d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015613e3a57600080fd5b505af1158015613e4e573d6000803e3d6000fd5b505050506040513d6020811015613e6457600080fd5b8101908080519060200190929190505050141515613ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614a9a602e913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015613f3157600080fd5b505afa158015613f45573d6000803e3d6000fd5b505050506040513d6020811015613f5b57600080fd5b81019080805190602001909291905050509050613f9b670de0b6b3a7640000613f8d838861351790919063ffffffff16565b6135a190919063ffffffff16565b92503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415156140205761401f8484600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac83856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156140ef57600080fd5b505af1158015614103573d6000803e3d6000fd5b505050506040513d602081101561411957600080fd5b8101908080519060200190929190505050905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614a066021913960400191505060405180910390fd5b6141cf81600254613c8c90919063ffffffff16565b600281905550614226816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6143ba838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb90507c0100000000000000000000000000000000000000000000000000000000028484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061499d6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6145268273ffffffffffffffffffffffffffffffffffffffff16614966565b151561459a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831015156145eb57805182526020820191506020810190506020830392506145c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461464d576040519150601f19603f3d011682016040523d82523d6000602084013e614652565b606091505b50915091508115156146cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115614754578080602001905160208110156146eb57600080fd5b81019080805190602001909291905050501515614753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a70602a913960400191505060405180910390fd5b5b50505050565b6000614876828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561482d57600080fd5b505afa158015614841573d6000803e3d6000fd5b505050506040513d602081101561485757600080fd5b8101908080519060200190929190505050613d1790919063ffffffff16565b9050614960848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b390507c0100000000000000000000000000000000000000000000000000000000028584604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080823b90506000811191505091905056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564536f6d657468696e672077656e742077726f6e67207768656e2072656465656d696e6720696e2063546f6b656e73a165627a7a723058203971eb9d650d67af8872478aefb583b93ffd3f6422f1b4601f7254024586fef50029000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000014094949152eddbfcd073717200da82fed8dc96000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Deployed Bytecode
0x608060405234801561001057600080fd5b5060043610610223576000357c01000000000000000000000000000000000000000000000000000000009004806369e527da116101375780638f32d59b116100ca578063a9059cbb11610099578063a9059cbb146109a5578063b13bd49114610a0b578063dd62ed3e14610a30578063f2fde38b14610aa8578063fc0c546a14610aec57610223565b80638f32d59b1461084c57806395ccea671461086e57806395d89b41146108bc578063a457c2d71461093f57610223565b80637e2a53af116101065780637e2a53af1461075e5780637ff9b596146107a25780638b30b516146107c05780638da5cb5b1461080257610223565b806369e527da146106a857806370a08231146106f2578063715018a61461074a5780637d7c2a1c1461075457610223565b8063313ce567116101ba5780634cb71222116101895780634cb71222146105b05780634d02f1c2146105f457806351707e4614610612578063621eb0931461065c57806367f8d85d1461067a57610223565b8063313ce5671461048757806339509351146104ab578063408cfe24146105115780634732376d1461055b57610223565b806318160ddd116101f657806318160ddd146103975780631aaa4a18146103b557806322c9f971146103e357806323b872dd1461040157610223565b806306fdde031461022857806308677d7e146102ab578063095ea7b3146102ed578063144fa6d714610353575b600080fd5b610230610b36565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d7600480360360208110156102c157600080fd5b8101908080359060200190929190505050610bd8565b6040518082815260200191505060405180910390f35b6103396004803603604081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ee8565b604051808215151515815260200191505060405180910390f35b6103956004803603602081101561036957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610eff565b005b61039f610fbf565b6040518082815260200191505060405180910390f35b6103e1600480360360208110156103cb57600080fd5b8101908080359060200190929190505050610fc9565b005b6103eb61104f565b6040518082815260200191505060405180910390f35b61046d6004803603606081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611055565b604051808215151515815260200191505060405180910390f35b61048f611106565b604051808260ff1660ff16815260200191505060405180910390f35b6104f7600480360360408110156104c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061111d565b604051808215151515815260200191505060405180910390f35b6105196111c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105636111e8565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6105f2600480360360208110156105c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b0565b005b6105fc611470565b6040518082815260200191505060405180910390f35b61061a611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066461149c565b6040518082815260200191505060405180910390f35b6106a66004803603602081101561069057600080fd5b8101908080359060200190929190505050611613565b005b6106b0611699565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107346004803603602081101561070857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bf565b6040518082815260200191505060405180910390f35b610752611707565b005b61075c611844565b005b6107a06004803603602081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d7c565b005b6107aa611e3c565b6040518082815260200191505060405180910390f35b6107ec600480360360208110156107d657600080fd5b81019080803590602001909291905050506122fa565b6040518082815260200191505060405180910390f35b61080a61279f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108546127c9565b604051808215151515815260200191505060405180910390f35b6108ba6004803603604081101561088457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612821565b005b6108c46129e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109045780820151818401526020810190506108e9565b50505050905090810190601f1680156109315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61098b6004803603604081101561095557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a82565b604051808215151515815260200191505060405180910390f35b6109f1600480360360408110156109bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b27565b604051808215151515815260200191505060405180910390f35b610a13612b3e565b604051808381526020018281526020019250505060405180910390f35b610a9260048036036040811015610a4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ca6565b6040518082815260200191505060405180910390f35b610aea60048036036020811015610abe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d2d565b005b610af4612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b5050505050905090565b6000600160066000828254019250508190555060006006549050600083111515610c6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f416d6f756e74206973206e6f74203e203000000000000000000000000000000081525060200191505060405180910390fd5b610c72611844565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610cc63330868473ffffffffffffffffffffffffffffffffffffffff16612ddb909392919063ffffffff16565b6000670de0b6b3a7640000905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d6020811015610d6157600080fd5b81019080805190602001909291905050509050600081141515610d8957610d86611e3c565b91505b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e1057610e0a86612efd565b50610e1b565b610e1986613293565b505b6000811415610e2c57859450610e5c565b610e5982610e4b670de0b6b3a76400008961351790919063ffffffff16565b6135a190919063ffffffff16565b94505b610e663386613634565b50505060065481141515610ee2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000610ef53384846137f1565b6001905092915050565b610f076127c9565b1515610f7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600254905090565b610fd16127c9565b1515611045576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b600d5481565b60006110628484846139ec565b6110fb84336110f685600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006111b833846111b385600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6137f1565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563a5ae97da600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54600d546040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200195505050505050604080518083038186803b15801561136357600080fd5b505af4158015611377573d6000803e3d6000fd5b505050506040513d604081101561138d57600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6113b86127c9565b151561142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663087fc48b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561152457600080fd5b505af1158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b81019080805190602001909291905050509050600081141561157257809050611610565b61157a611844565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611601576115fb81612efd565b5061160c565b61160a81613293565b505b8090505b90565b61161b6127c9565b151561168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61170f6127c9565b1515611783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061184f6111e8565b91509150811515611861575050611d7a565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611d3657600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b3557611a30600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ef57600080fd5b505afa158015611a03573d6000803e3d6000fd5b505050506040513d6020811015611a1957600080fd5b810190808051906020019092919050505030613da1565b50611b2f600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d6020811015611b1957600080fd5b8101908080519060200190929190505050613293565b50611d35565b611c34600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf357600080fd5b505afa158015611c07573d6000803e3d6000fd5b505050506040513d6020811015611c1d57600080fd5b810190808051906020019092919050505030614028565b50611d33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cf357600080fd5b505afa158015611d07573d6000803e3d6000fd5b505050506040513d6020811015611d1d57600080fd5b8101908080519060200190929190505050612efd565b505b5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505b565b611d846127c9565b1515611df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611efa57600080fd5b505afa158015611f0e573d6000803e3d6000fd5b505050506040513d6020811015611f2457600080fd5b81019080805190602001909291905050509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120a857600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b810190808051906020019092919050505090505b73e66127a3539e1a415cfaae8a43cb9d73e65042956379d88372600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561218d57600080fd5b505afa1580156121a1573d6000803e3d6000fd5b505050506040513d60208110156121b757600080fd5b8101908080519060200190929190505050866040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019550505050505060206040518083038186803b1580156122b957600080fd5b505af41580156122cd573d6000803e3d6000fd5b505050506040513d60208110156122e357600080fd5b810190808051906020019092919050505091505090565b600060016006600082825401925050819055506000600654905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561237857600080fd5b505afa15801561238c573d6000803e3d6000fd5b505050506040513d60208110156123a257600080fd5b8101908080519060200190929190505050905060008111151561242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e6f2049444c454441492068617665206265656e20697373756564000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125db576000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b8101908080519060200190929190505050905060006125c6836125b8848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506125d28133613da1565b9450505061270d565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561269857600080fd5b505afa1580156126ac573d6000803e3d6000fd5b505050506040513d60208110156126c257600080fd5b8101908080519060200190929190505050905060006126fc836126ee848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506127088133614028565b945050505b6127173385614132565b61271f611844565b5060065481141515612799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6128296127c9565b151561289d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008290506000821415156128dc576128d733838373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b6129db565b6129da338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a785780601f10612a4d57610100808354040283529160200191612a78565b820191906000526020600020905b815481529060010190602001808311612a5b57829003601f168201915b5050505050905090565b6000612b1d3384612b1885600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b6001905092915050565b6000612b343384846139ec565b6001905092915050565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563fe26dc40600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c546040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604080518083038186803b158015612c5957600080fd5b505af4158015612c6d573d6000803e3d6000fd5b505050506040513d6040811015612c8357600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612d356127c9565b1515612da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612db2816143bf565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612ef7848573ffffffffffffffffffffffffffffffffffffffff166323b872dd90507c010000000000000000000000000000000000000000000000000000000002858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fbb57600080fd5b505afa158015612fcf573d6000803e3d6000fd5b505050506040513d6020811015612fe557600080fd5b810190808051906020019092919050505014156130045780905061328e565b613073600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b505050506040513d602081101561313557600080fd5b81019080805190602001909291905050501415156131bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4572726f72206d696e74696e670000000000000000000000000000000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561321f57600080fd5b505afa158015613233573d6000803e3d6000fd5b505050506040513d602081101561324957600080fd5b810190808051906020019092919050505090506132898161327b670de0b6b3a76400008761351790919063ffffffff16565b6135a190919063ffffffff16565b925050505b919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561335157600080fd5b505afa158015613365573d6000803e3d6000fd5b505050506040513d602081101561337b57600080fd5b8101908080519060200190929190505050141561339a57809050613512565b613409600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156134d357600080fd5b505af11580156134e7573d6000803e3d6000fd5b505050506040513d60208110156134fd57600080fd5b81019080805190602001909291905050509150505b919050565b60008083141561352a576000905061359b565b6000828402905082848281151561353d57fe5b04141515613596576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149e56021913960400191505060405180910390fd5b809150505b92915050565b6000808211151561361a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561362757fe5b0490508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6136ee81600254613d1790919063ffffffff16565b600281905550613745816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a4c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149c36022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a276025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613afc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061497a6023913960400191505060405180910390fd5b613b4d816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613be0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211151515613d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110151515613d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015613e3a57600080fd5b505af1158015613e4e573d6000803e3d6000fd5b505050506040513d6020811015613e6457600080fd5b8101908080519060200190929190505050141515613ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614a9a602e913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015613f3157600080fd5b505afa158015613f45573d6000803e3d6000fd5b505050506040513d6020811015613f5b57600080fd5b81019080805190602001909291905050509050613f9b670de0b6b3a7640000613f8d838861351790919063ffffffff16565b6135a190919063ffffffff16565b92503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415156140205761401f8484600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac83856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156140ef57600080fd5b505af1158015614103573d6000803e3d6000fd5b505050506040513d602081101561411957600080fd5b8101908080519060200190929190505050905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614a066021913960400191505060405180910390fd5b6141cf81600254613c8c90919063ffffffff16565b600281905550614226816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6143ba838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb90507c0100000000000000000000000000000000000000000000000000000000028484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061499d6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6145268273ffffffffffffffffffffffffffffffffffffffff16614966565b151561459a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831015156145eb57805182526020820191506020810190506020830392506145c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461464d576040519150601f19603f3d011682016040523d82523d6000602084013e614652565b606091505b50915091508115156146cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115614754578080602001905160208110156146eb57600080fd5b81019080805190602001909291905050501515614753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a70602a913960400191505060405180910390fd5b5b50505050565b6000614876828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561482d57600080fd5b505afa158015614841573d6000803e3d6000fd5b505050506040513d602081101561485757600080fd5b8101908080519060200190929190505050613d1790919063ffffffff16565b9050614960848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b390507c0100000000000000000000000000000000000000000000000000000000028584604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080823b90506000811191505091905056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564536f6d657468696e672077656e742077726f6e67207768656e2072656465656d696e6720696e2063546f6b656e73a165627a7a723058203971eb9d650d67af8872478aefb583b93ffd3f6422f1b4601f7254024586fef50029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000014094949152eddbfcd073717200da82fed8dc96000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
-----Decoded View---------------
Arg [0] : _cToken (address): 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC
Arg [1] : _iToken (address): 0x14094949152EDDBFcd073717200DA82fEd8dC960
Arg [2] : _token (address): 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc
Arg [1] : 00000000000000000000000014094949152eddbfcd073717200da82fed8dc960
Arg [2] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Deployed Bytecode Sourcemap
30111:8215:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30111:8215:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15348:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15348:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32643:927;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32643:927:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9118:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9118:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31073:87;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31073:87:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;8141:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30851:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30851:109:0;;;;;;;;;;;;;;;;;:::i;:::-;;30443:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9737:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9737:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16206:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10402:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10402:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30300:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32212:178;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31259:91;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31259:91:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30410:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30379:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35672:398;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30964:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30964:105:0;;;;;;;;;;;;;;;;;:::i;:::-;;30247:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8295:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8295:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19593:140;;;:::i;:::-;;34686:742;;;:::i;:::-;;31164:91;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31164:91:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;31803:405;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33671:860;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33671:860:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18782:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19148:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31466:320;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31466:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15550:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15550:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11111:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11111:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8618:156;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8618:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32394:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8837:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8837:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19888:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19888:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30354:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15348:83;15385:13;15418:5;15411:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15348:83;:::o;32643:927::-;32724:20;17716:1;17699:13;;:18;;;;;;;;;;;17728:20;17751:13;;17728:36;;32773:1;32763:7;:11;32755:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32860:11;:9;:11::i;:::-;32939:17;32966:5;;;;;;;;;;;32939:33;;33017:63;33045:10;33065:4;33072:7;33017:10;:27;;;;:63;;;;;;:::i;:::-;33091:17;33111:6;33091:26;;33126:19;33148:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33148:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33148:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33148:18:0;;;;;;;;;;;;;;;;33126:40;;33196:1;33181:11;:16;;33177:67;;;33222:12;:10;:12::i;:::-;33210:24;;33177:67;33271:6;;;;;;;;;;;33258:19;;:9;;;;;;;;;;;:19;;;33254:115;;;33290:21;33303:7;33290:12;:21::i;:::-;;33254:115;;;33338:21;33351:7;33338:12;:21::i;:::-;;33254:115;33396:1;33381:11;:16;33377:148;;;33425:7;33410:22;;33377:148;;;33481:34;33505:9;33481:19;33493:6;33481:7;:11;;:19;;;;:::i;:::-;:23;;:34;;;;:::i;:::-;33466:49;;33377:148;33533:31;33539:10;33551:12;33533:5;:31::i;:::-;17775:1;;;17811:13;;17795:12;:29;17787:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32643:927;;;;:::o;9118:148::-;9183:4;9200:36;9209:10;9221:7;9230:5;9200:8;:36::i;:::-;9254:4;9247:11;;9118:148;;;;:::o;31073:87::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31148:6;31140:5;;:14;;;;;;;;;;;;;;;;;;31073:87;:::o;8141:91::-;8185:7;8212:12;;8205:19;;8141:91;:::o;30851:109::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30949:5;30929:17;:25;;;;30851:109;:::o;30443:32::-;;;;:::o;9737:256::-;9826:4;9843:36;9853:6;9861:9;9872:6;9843:9;:36::i;:::-;9890:73;9899:6;9907:10;9919:43;9955:6;9919:11;:19;9931:6;9919:19;;;;;;;;;;;;;;;:31;9939:10;9919:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;9890:8;:73::i;:::-;9981:4;9974:11;;9737:256;;;;;:::o;16206:83::-;16247:5;16272:9;;;;;;;;;;;16265:16;;16206:83;:::o;10402:206::-;10482:4;10499:79;10508:10;10520:7;10529:48;10566:10;10529:11;:23;10541:10;10529:23;;;;;;;;;;;;;;;:32;10553:7;10529:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;10499:8;:79::i;:::-;10596:4;10589:11;;10402:206;;;;:::o;30300:21::-;;;;;;;;;;;;;:::o;32212:178::-;32269:4;32275:7;32300:8;:23;32324:6;;;;;;;;;;;32332;;;;;;;;;;;32340:9;;;;;;;;;;;32351:13;;32366:17;;32300:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32300:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32300:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32300:84:0;;;;;;;;;;;;;;;;;;;;;;;;;32293:91;;;;32212:178;;:::o;31259:91::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31337:7;31328:6;;:16;;;;;;;;;;;;;;;;;;31259:91;:::o;30410:28::-;;;;:::o;30379:24::-;;;;;;;;;;;;;:::o;35672:398::-;35724:21;35779:6;;;;;;;;;;;35772:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35772:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35772:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35772:31:0;;;;;;;;;;;;;;;;35756:47;;35833:1;35816:13;:18;35812:65;;;35854:13;35847:20;;;;35812:65;35887:11;:9;:11::i;:::-;35924:6;;;;;;;;;;;35911:19;;:9;;;;;;;;;;;:19;;;35907:127;;;35943:27;35956:13;35943:12;:27::i;:::-;;35907:127;;;35997:27;36010:13;35997:12;:27::i;:::-;;35907:127;36051:13;36044:20;;35672:398;;:::o;30964:105::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31056:7;31040:13;:23;;;;30964:105;:::o;30247:21::-;;;;;;;;;;;;;:::o;8295:110::-;8352:7;8379:9;:18;8389:7;8379:18;;;;;;;;;;;;;;;;8372:25;;8295:110;;;:::o;19593:140::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19692:1;19655:40;;19676:6;;;;;;;;;;;19655:40;;;;;;;;;;;;19723:1;19706:6;;:19;;;;;;;;;;;;;;;;;;19593:140::o;34686:742::-;34729:20;34751:24;34779:16;:14;:16::i;:::-;34728:67;;;;34809:15;34808:16;34804:49;;;34837:7;;;;34804:49;34888:1;34867:23;;:9;;;;;;;;;;;:23;;;;34863:485;;;34971:6;;;;;;;;;;;34958:19;;:9;;;;;;;;;;;:19;;;34954:385;;;34992:70;35014:6;;;;;;;;;;;35007:24;;;35040:4;35007:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35007:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35007:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35007:39:0;;;;;;;;;;;;;;;;35056:4;34992:14;:70::i;:::-;;35109:52;35129:5;;;;;;;;;;;35122:23;;;35154:4;35122:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35122:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35122:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35122:38:0;;;;;;;;;;;;;;;;35109:12;:52::i;:::-;;34954:385;;;35192:70;35214:6;;;;;;;;;;;35207:24;;;35240:4;35207:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35207:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35207:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35207:39:0;;;;;;;;;;;;;;;;35256:4;35192:14;:70::i;:::-;;35275:52;35295:5;;;;;;;;;;;35288:23;;;35320:4;35288:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35288:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35288:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35288:38:0;;;;;;;;;;;;;;;;35275:12;:52::i;:::-;;34954:385;34863:485;35406:16;35394:9;;:28;;;;;;;;;;;;;;;;;;34686:742;;;:::o;31164:91::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31242:7;31233:6;;:16;;;;;;;;;;;;;;;;;;31164:91;:::o;31803:405::-;31856:13;31880:18;31908:6;;;;;;;;;;;31901:24;;;31934:4;31901:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31901:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31901:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31901:39:0;;;;;;;;;;;;;;;;31880:60;;31966:6;;;;;;;;;;;31953:19;;:9;;;;;;;;;;;:19;;;31949:98;;;32005:6;;;;;;;;;;;31998:24;;;32031:4;31998:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31998:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31998:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31998:39:0;;;;;;;;;;;;;;;;31985:52;;31949:98;32065:8;:24;32100:6;;;;;;;;;;;32117;;;;;;;;;;;32134:9;;;;;;;;;;;32154:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32154:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32154:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32154:18:0;;;;;;;;;;;;;;;;32183:10;32065:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32065:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32065:137:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32065:137:0;;;;;;;;;;;;;;;;32057:145;;31803:405;;:::o;33671:860::-;33754:22;17716:1;17699:13;;:18;;;;;;;;;;;17728:20;17751:13;;17728:36;;33785:18;33806:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33806:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33806:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33806:18:0;;;;;;;;;;;;;;;;33785:39;;33852:1;33839:10;:14;33831:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33911:6;;;;;;;;;;;33898:19;;:9;;;;;;;;;;;:19;;;33894:581;;;33928:20;33958:6;;;;;;;;;;;33951:24;;;33984:4;33951:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33951:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33951:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33951:39:0;;;;;;;;;;;;;;;;33928:62;;33999:20;34022:41;34052:10;34022:25;34034:12;34022:7;:11;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;33999:64;;34089:40;34104:12;34118:10;34089:14;:40::i;:::-;34072:57;;33894:581;;;;;34152:20;34182:6;;;;;;;;;;;34175:24;;;34208:4;34175:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34175:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34175:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34175:39:0;;;;;;;;;;;;;;;;34152:62;;34223:20;34246:41;34276:10;34246:25;34258:12;34246:7;:11;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;34223:64;;34427:40;34442:12;34456:10;34427:14;:40::i;:::-;34410:57;;33894:581;;;34481:26;34487:10;34499:7;34481:5;:26::i;:::-;34514:11;:9;:11::i;:::-;17775:1;17811:13;;17795:12;:29;17787:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33671:860;;;;:::o;18782:79::-;18820:7;18847:6;;;;;;;;;;;18840:13;;18782:79;:::o;19148:92::-;19188:4;19226:6;;;;;;;;;;;19212:20;;:10;:20;;;19205:27;;19148:92;:::o;31466:320::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31558:17;31585:6;31558:34;;31615:1;31605:6;:11;;31601:180;;;31629:43;31653:10;31665:6;31629:10;:23;;;;:43;;;;;:::i;:::-;31601:180;;;31699:72;31723:10;31735;:20;;;31764:4;31735:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31735:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31735:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31735:35:0;;;;;;;;;;;;;;;;31699:10;:23;;;;:72;;;;;:::i;:::-;31601:180;19051:1;31466:320;;:::o;15550:87::-;15589:13;15622:7;15615:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15550:87;:::o;11111:216::-;11196:4;11213:84;11222:10;11234:7;11243:53;11280:15;11243:11;:23;11255:10;11243:23;;;;;;;;;;;;;;;:32;11267:7;11243:32;;;;;;;;;;;;;;;;:36;;:53;;;;:::i;:::-;11213:8;:84::i;:::-;11315:4;11308:11;;11111:216;;;;:::o;8618:156::-;8687:4;8704:40;8714:10;8726:9;8737:6;8704:9;:40::i;:::-;8762:4;8755:11;;8618:156;;;;:::o;32394:139::-;32446:7;32455;32480:8;:16;32497:6;;;;;;;;;;;32505;;;;;;;;;;;32513:13;;32480:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32480:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32480:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32480:47:0;;;;;;;;;;;;;;;;;;;;;;;;;32473:54;;;;32394:139;;:::o;8837:134::-;8909:7;8936:11;:18;8948:5;8936:18;;;;;;;;;;;;;;;:27;8955:7;8936:27;;;;;;;;;;;;;;;;8929:34;;8837:134;;;;:::o;19888:109::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19961:28;19980:8;19961:18;:28::i;:::-;19888:109;:::o;30354:20::-;;;;;;;;;;;;;:::o;22233:204::-;22334:95;22353:5;22383;:18;;;:27;;;;22412:4;22418:2;22422:5;22360:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22360:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22360:68:0;22334:18;:95::i;:::-;22233:204;;;;:::o;36091:873::-;36158:15;36230:1;36195:5;;;;;;;;;;;36188:23;;;36220:4;36188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36188:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36188:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36188:38:0;;;;;;;;;;;;;;;;:43;36184:84;;;36251:7;36244:14;;;;36184:84;36326:52;36362:6;;;;;;;;;;;36370:7;36333:5;;;;;;;;;;;36326:35;;;;:52;;;;;:::i;:::-;36450:14;36474:6;;;;;;;;;;;36450:31;;36579:1;36554:7;:12;;;36567:7;36554:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36554:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36554:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36554:21:0;;;;;;;;;;;;;;;;:26;36546:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36743:28;36774:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36774:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36774:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36774:28:0;;;;;;;;;;;;;;;;36743:59;;36913:45;36937:20;36913:19;36925:6;36913:7;:11;;:19;;;;:::i;:::-;:23;;:45;;;;:::i;:::-;36903:55;;36091:873;;;;;;:::o;36968:476::-;37035:15;37107:1;37072:5;;;;;;;;;;;37065:23;;;37097:4;37065:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37065:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37065:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37065:38:0;;;;;;;;;;;;;;;;:43;37061:84;;;37128:7;37121:14;;;;37061:84;37203:52;37239:6;;;;;;;;;;;37247:7;37210:5;;;;;;;;;;;37203:35;;;;:52;;;;;:::i;:::-;37325:14;37349:6;;;;;;;;;;;37325:31;;37402:7;:12;;;37423:4;37430:7;37402:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37402:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37402:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37402:36:0;;;;;;;;;;;;;;;;37392:46;;36968:476;;;;;:::o;4691:470::-;4749:7;4998:1;4993;:6;4989:47;;;5023:1;5016:8;;;;4989:47;5048:9;5064:1;5060;:5;5048:17;;5093:1;5088;5084;:5;;;;;;;;:10;5076:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5152:1;5145:8;;;4691:470;;;;;:::o;5629:333::-;5687:7;5786:1;5782;:5;5774:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5829:9;5845:1;5841;:5;;;;;;;;5829:17;;5953:1;5946:8;;;5629:333;;;;:::o;12527:308::-;12622:1;12603:21;;:7;:21;;;;12595:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12688:24;12705:6;12688:12;;:16;;:24;;;;:::i;:::-;12673:12;:39;;;;12744:30;12767:6;12744:9;:18;12754:7;12744:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;12723:9;:18;12733:7;12723:18;;;;;;;;;;;;;;;:51;;;;12811:7;12790:37;;12807:1;12790:37;;;12820:6;12790:37;;;;;;;;;;;;;;;;;;12527:308;;:::o;13913:335::-;14023:1;14006:19;;:5;:19;;;;13998:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14104:1;14085:21;;:7;:21;;;;14077:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14188:5;14158:11;:18;14170:5;14158:18;;;;;;;;;;;;;;;:27;14177:7;14158:27;;;;;;;;;;;;;;;:35;;;;14225:7;14209:31;;14218:5;14209:31;;;14234:5;14209:31;;;;;;;;;;;;;;;;;;13913:335;;;:::o;11817:429::-;11933:1;11915:20;;:6;:20;;;;11907:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12017:1;11996:23;;:9;:23;;;;11988:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12092:29;12114:6;12092:9;:17;12102:6;12092:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;12072:9;:17;12082:6;12072:17;;;;;;;;;;;;;;;:49;;;;12155:32;12180:6;12155:9;:20;12165:9;12155:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;12132:9;:20;12142:9;12132:20;;;;;;;;;;;;;;;:55;;;;12220:9;12203:35;;12212:6;12203:35;;;12231:6;12203:35;;;;;;;;;;;;;;;;;;11817:429;;;:::o;4256:184::-;4314:7;4347:1;4342;:6;;4334:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4394:9;4410:1;4406;:5;4394:17;;4431:1;4424:8;;;4256:184;;;;:::o;3800:181::-;3858:7;3878:9;3894:1;3890;:5;3878:17;;3919:1;3914;:6;;3906:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3972:1;3965:8;;;3800:181;;;;:::o;37450:704::-;37537:14;37562;37586:6;;;;;;;;;;;37562:31;;37676:1;37649:7;:14;;;37664:7;37649:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37649:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37649:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37649:23:0;;;;;;;;;;;;;;;;:28;37641:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37830:28;37861:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37861:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37861:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37861:28:0;;;;;;;;;;;;;;;;37830:59;;37997:45;38035:6;37997:33;38009:20;37997:7;:11;;:33;;;;:::i;:::-;:37;;:45;;;;:::i;:::-;37988:54;;38077:4;38057:25;;:8;:25;;;;38053:96;;;38095:44;38122:8;38132:6;38102:5;;;;;;;;;;;38095:26;;;;:44;;;;;:::i;:::-;38053:96;37450:704;;;;;;:::o;38158:165::-;38245:14;38286:6;;;;;;;;;;;38279:19;;;38299:8;38309:7;38279:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38279:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38279:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38279:38:0;;;;;;;;;;;;;;;;38270:47;;38158:165;;;;:::o;13167:306::-;13261:1;13242:21;;:7;:21;;;;13234:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13329:23;13346:5;13329:12;;:16;;:23;;;;:::i;:::-;13314:12;:38;;;;13384:29;13407:5;13384:9;:18;13394:7;13384:18;;;;;;;;;;;;;;;;:22;;:29;;;;:::i;:::-;13363:9;:18;13373:7;13363:18;;;;;;;;;;;;;;;:50;;;;13455:1;13429:36;;13438:7;13429:36;;;13459:5;13429:36;;;;;;;;;;;;;;;;;;13167:306;;:::o;22049:176::-;22132:85;22151:5;22181;:14;;;:23;;;;22206:2;22210:5;22158:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22158:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22158:58:0;22132:18;:85::i;:::-;22049:176;;;:::o;20103:229::-;20197:1;20177:22;;:8;:22;;;;20169:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20287:8;20258:38;;20279:6;;;;;;;;;;;20258:38;;;;;;;;;;;;20316:8;20307:6;;:17;;;;;;;;;;;;;;;;;;20103:229;:::o;24043:1114::-;24647:27;24655:5;24647:25;;;:27::i;:::-;24639:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24784:12;24798:23;24833:5;24825:19;;24845:4;24825:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24825:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;24783:67:0;;;;24869:7;24861:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24950:1;24930:10;:17;:21;24926:224;;;25072:10;25061:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25061:30:0;;;;;;;;;;;;;;;;25053:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24926:224;24043:1114;;;;:::o;23074:285::-;23171:20;23194:50;23238:5;23194;:15;;;23218:4;23225:7;23194:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23194:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23194:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23194:39:0;;;;;;;;;;;;;;;;:43;;:50;;;;:::i;:::-;23171:73;;23255:96;23274:5;23304;:13;;;:22;;;;23328:7;23337:12;23281:69;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23281:69:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;23281:69:0;23255:18;:96::i;:::-;23074:285;;;;:::o;20959:422::-;21019:4;21227:12;21338:7;21326:20;21318:28;;21372:1;21365:4;:8;21358:15;;;20959:422;;;:::o
Swarm Source
bzzr://3971eb9d650d67af8872478aefb583b93ffd3f6422f1b4601f7254024586fef5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.