Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11259754 | 1397 days ago | IN | 0 ETH | 0.05545092 |
Loading...
Loading
Contract Name:
FlashArbitrageController
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-15 */ // Sources flattened with hardhat v2.0.1 https://hardhat.org // File @uniswap/v2-core/contracts/interfaces/[email protected] // _________ ________ _____________________ // \_ ___ \ \_____ \\______ \_ _____/ // / \ \/ / | \| _/| __)_ // \ \____/ | \ | \| \ // \______ /\_______ /____|_ /_______ / // \/ \/ \/ \/ // ___________.____ _____ _________ ___ ___ // \_ _____/| | / _ \ / _____// | \ // | __) | | / /_\ \ \_____ \/ ~ \ // | \ | |___/ | \/ \ Y / // \___ / |_______ \____|__ /_______ /\___|_ / // \/ \/ \/ \/ \/ // _____ ____________________.________________________ _____ ___________________ // / _ \\______ \______ \ \__ ___/\______ \ / _ \ / _____/\_ _____/ // / /_\ \| _/| | _/ | | | | _/ / /_\ \/ \ ___ | __)_ // / | \ | \| | \ | | | | | \/ | \ \_\ \| \ // \____|__ /____|_ /|______ /___| |____| |____|_ /\____|__ /\______ /_______ / // \/ \/ \/ \/ \/ \/ \/ // Controller // // This contract checks for opportunities to gain profit for all of DEXs out there // But especially the CORE ecosystem because this contract can tell another contrac to turn feeOff for the duration of its trades // By arbitraging all existing pools, and transfering profits to FeeSplitter // That will add rewards to specific pools to keep them at X% APY // And add liquidity and subsequently burn the liquidity tokens after all pools reach this threashold // // .edee... ..... .eeec. ..eee.. // .d*" """"*e..d*"""""**e..e*"" "*c.d"" ""*e. // z" "$ $"" *F **e. // z" "c d" *. "$. // .F " " 'F // d J% // 3 . e" // 4r e" . d" // $ .d" . .F z ..zeeeeed" // "*beeeP" P d e. $**"" " // "*b. Jbc. z*%e.. .$**eeeeP" // "*beee* "$$eeed" ^$$$"" " // '$$. .$$$c // "$$. e$$*$$c // "$$..$$P" '$$r // "$$$$" "$$. .d // z. .$$$" "$$. .dP" // ^*e e$$" "$$. .e$" // *b. .$$P" "$$. z$" // "$c e$$" "$$.z$*" // ^*e$$P" "$$$" // *$$ "$$r // '$$F .$$P // $$$ z$$" // 4$$ d$$b. // .$$% .$$*"*$$e. // e$$$*" z$$" "*$$e. // 4$$" d$P" "*$$e. // $P .d$$$c "*$$e.. // d$" z$$" *$b. "*$L // 4$" e$P" "*$c ^$$ // $" .d$" "$$. ^$r // dP z$$" ^*$e. "b // 4$ e$P "$$ " // J$F $$ // $$ .$F // 4$" $P" // $" dP kjRWG0tKD4A // // I'll have you know... pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File @uniswap/lib/contracts/libraries/[email protected] // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.5.0; library AddressStringUtil { // converts an address to the uppercase hex string, extracting only len bytes (up to 20, multiple of 2) function toAsciiString(address addr, uint len) pure internal returns (string memory) { require(len % 2 == 0 && len > 0 && len <= 40, "AddressStringUtil: INVALID_LEN"); bytes memory s = new bytes(len); uint addrNum = uint(addr); for (uint i = 0; i < len / 2; i++) { // shift right and truncate all but the least significant byte to extract the byte at position 19-i uint8 b = uint8(addrNum >> (8 * (19 - i))); // first hex character is the most significant 4 bits uint8 hi = b >> 4; // second hex character is the least significant 4 bits uint8 lo = b - (hi << 4); s[2 * i] = char(hi); s[2 * i + 1] = char(lo); } return string(s); } // hi and lo are only 4 bits and between 0 and 16 // this method converts those values to the unicode/ascii code point for the hex representation // uses upper case for the characters function char(uint8 b) pure private returns (byte c) { if (b < 10) { return byte(b + 0x30); } else { return byte(b + 0x37); } } } // File @uniswap/lib/contracts/libraries/[email protected] pragma solidity >=0.5.0; // produces token descriptors from inconsistent or absent ERC20 symbol implementations that can return string or bytes32 // this library will always produce a string symbol to represent the token library SafeERC20Namer { function bytes32ToString(bytes32 x) pure private returns (string memory) { bytes memory bytesString = new bytes(32); uint charCount = 0; for (uint j = 0; j < 32; j++) { byte char = x[j]; if (char != 0) { bytesString[charCount] = char; charCount++; } } bytes memory bytesStringTrimmed = new bytes(charCount); for (uint j = 0; j < charCount; j++) { bytesStringTrimmed[j] = bytesString[j]; } return string(bytesStringTrimmed); } // assumes the data is in position 2 function parseStringData(bytes memory b) pure private returns (string memory) { uint charCount = 0; // first parse the charCount out of the data for (uint i = 32; i < 64; i++) { charCount <<= 8; charCount += uint8(b[i]); } bytes memory bytesStringTrimmed = new bytes(charCount); for (uint i = 0; i < charCount; i++) { bytesStringTrimmed[i] = b[i + 64]; } return string(bytesStringTrimmed); } // uses a heuristic to produce a token name from the address // the heuristic returns the full hex of the address string in upper case function addressToName(address token) pure private returns (string memory) { return AddressStringUtil.toAsciiString(token, 40); } // uses a heuristic to produce a token symbol from the address // the heuristic returns the first 6 hex of the address string in upper case function addressToSymbol(address token) pure private returns (string memory) { return AddressStringUtil.toAsciiString(token, 6); } // calls an external view token contract method that returns a symbol or name, and parses the output into a string function callAndParseStringReturn(address token, bytes4 selector) view private returns (string memory) { (bool success, bytes memory data) = token.staticcall(abi.encodeWithSelector(selector)); // if not implemented, or returns empty data, return empty string if (!success || data.length == 0) { return ""; } // bytes32 data always has length 32 if (data.length == 32) { bytes32 decoded = abi.decode(data, (bytes32)); return bytes32ToString(decoded); } else if (data.length > 64) { return abi.decode(data, (string)); } return ""; } // attempts to extract the token symbol. if it does not implement symbol, returns a symbol derived from the address function tokenSymbol(address token) internal view returns (string memory) { // 0x95d89b41 = bytes4(keccak256("symbol()")) string memory symbol = callAndParseStringReturn(token, 0x95d89b41); if (bytes(symbol).length == 0) { // fallback to 6 uppercase hex of address return addressToSymbol(token); } return symbol; } // attempts to extract the token name. if it does not implement name, returns a name derived from the address function tokenName(address token) internal view returns (string memory) { // 0x06fdde03 = bytes4(keccak256("name()")) string memory name = callAndParseStringReturn(token, 0x06fdde03); if (bytes(name).length == 0) { // fallback to full hex of address return addressToName(token); } return name; } } // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts-ethereum-package/contracts/math/[email protected] pragma solidity ^0.6.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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); 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-contracts/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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File @openzeppelin/contracts-ethereum-package/contracts/[email protected] pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/GSN/[email protected] pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-ethereum-package/contracts/access/[email protected] pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/v612/FlashArbitrageController.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // import "hardhat/console.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; interface IFlashArbitrageExecutor { function getStrategyProfitInReturnToken(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out) external view returns (uint256); function executeStrategy(uint256) external; // Strategy that self calculates best input but costs gas function executeStrategy(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external; // strategy that does not calculate the best input meant for miners function executeStrategy(uint256 borrowAmt, address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external; function getOptimalInput(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out) external view returns (uint256); } contract FlashArbitrageController is OwnableUpgradeSafe { using SafeMath for uint256; event StrategyAdded(string indexed name, uint256 indexed id, address[] pairs, bool feeOff, address indexed originator); struct Strategy { string strategyName; bool[] token0Out; // An array saying if token 0 should be out in this step address[] pairs; // Array of pair addresses uint256[] feeOnTransfers; //Array of fee on transfers 1% = 10 bool cBTCSupport; // Should the algorithm check for cBTC and wrap/unwrap it // Note not checking saves gas bool feeOff; // Allows for adding CORE strategies - where there is no fee on the executor } uint256 public revenueSplitFeeOffStrategy; uint256 public revenueSplitFeeOnStrategy; address public distributor; IFlashArbitrageExecutor public executor; address public cBTC; address public CORE; address public wBTC; bool depreciated; // This contract can be upgraded to a new one // But we don't want people to add new strategies if its depreciated uint8 MAX_STEPS_LEN; // This variable is responsible to minimsing risk of gas limit strategies being added // Which would always have 0 gas cost because they could never complete Strategy[] public strategies; function initialize(address _executor, address _distributor) initializer public { require(tx.origin == address(0x5A16552f59ea34E44ec81E58b3817833E9fD5436)); OwnableUpgradeSafe.__Ownable_init(); cBTC = 0x7b5982dcAB054C377517759d0D2a3a5D02615AB8; CORE = 0x62359Ed7505Efc61FF1D56fEF82158CcaffA23D7; wBTC = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; distributor = _distributor; // we dont hard set it because its not live yet // So can't easily mock it in tests executor = IFlashArbitrageExecutor(_executor); revenueSplitFeeOffStrategy = 100; // 10% revenueSplitFeeOnStrategy = 650; // 65% MAX_STEPS_LEN = 20; } ///////////////// //// ADMIN SETTERS ////////////////// //In case executor needs to be updated function setExecutor(address _executor) onlyOwner public { executor = IFlashArbitrageExecutor(_executor); } //In case executor needs to be updated function setDistributor(address _distributor) onlyOwner public { distributor = _distributor; } function setMaxStrategySteps(uint8 _maxSteps) onlyOwner public { MAX_STEPS_LEN = _maxSteps; } function setDepreciated(bool _depreciated) onlyOwner public { depreciated = _depreciated; } function setFeeSplit(uint256 _revenueSplitFeeOffStrategy, uint256 _revenueSplitFeeOnStrategy) onlyOwner public { // We cap both fee splits to 20% max and 95% max // This means people calling feeOff strategies get max 20% revenue // And people calling feeOn strategies get max 95% require(revenueSplitFeeOffStrategy <= 200, "FA : 20% max fee for feeOff revenue split"); require(revenueSplitFeeOnStrategy <= 950, "FA : 95% max fee for feeOff revenue split"); revenueSplitFeeOffStrategy = _revenueSplitFeeOffStrategy; revenueSplitFeeOnStrategy = _revenueSplitFeeOnStrategy; } ///////////////// //// Views for strategies ////////////////// function getOptimalInput(uint256 strategyPID) public view returns (uint256) { Strategy memory currentStrategy = strategies[strategyPID]; return executor.getOptimalInput(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out); } // Returns the current profit of strateg if it was executed // In return token - this means if you borrow CORE from CORe/cBTC pair // This profit would be denominated in cBTC // Since thats what you have to return function strategyProfitInReturnToken(uint256 strategyID) public view returns (uint256 profit) { Strategy memory currentStrategy = strategies[strategyID]; return executor.getStrategyProfitInReturnToken(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out); } // Returns information about the strategy function strategyInfo(uint256 strategyPID) public view returns (Strategy memory){ return strategies[strategyPID]; } function numberOfStrategies() public view returns (uint256) { return strategies.length; } /////////////////// //// Strategy execution //// And profit assurances ////////////////// // Public function that executes a strategy // since its all a flash swap // the strategies can't lose money only gain // so its appropriate that they are public here // I don't think its possible that one of the strategies that is less profitable // takes away money from the more profitable one // Otherwise people would be able to do it anyway with their own contracts function executeStrategy(uint256 strategyPID) public { // function executeStrategy(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external; require(!depreciated, "This Contract is depreciated"); Strategy memory currentStrategy = strategies[strategyPID]; executor.executeStrategy(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out, currentStrategy.cBTCSupport); splitProfit(currentStrategy); } // Miner-friendly strategy executor function executeStrategy(uint256 inputAmount, uint256 strategyPID) public { require(!depreciated, "This Contract is depreciated"); Strategy memory currentStrategy = strategies[strategyPID]; executor.executeStrategy(inputAmount ,currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out, currentStrategy.cBTCSupport); splitProfit(currentStrategy); } function splitProfit(Strategy memory currentStrategy) internal { // Eg. Token 0 was out so profit token is token 1 address profitToken = currentStrategy.token0Out[0] ? IUniswapV2Pair(currentStrategy.pairs[0]).token1() : IUniswapV2Pair(currentStrategy.pairs[0]).token0(); // console.log("Profit token", profitToken); uint256 profit = IERC20(profitToken).balanceOf(address(this)); // console.log("Profit ", profit); // We split the profit based on the strategy if(currentStrategy.feeOff) { safeTransfer(profitToken, msg.sender, profit.mul(revenueSplitFeeOffStrategy).div(1000)); } else { safeTransfer(profitToken, msg.sender, profit.mul(revenueSplitFeeOnStrategy).div(1000)); } // console.log("Send revenue split now have ", IERC20(profitToken).balanceOf(address(this)) ); safeTransfer(profitToken, distributor, IERC20(profitToken).balanceOf(address(this))); } /////////////////// //// Adding strategies ////////////////// // Normal add without Fee Ontrasnfer being specified function addNewStrategy(bool borrowToken0, address[] memory pairs) public returns (uint256 strategyID) { uint256[] memory feeOnTransfers = new uint256[](pairs.length); strategyID = addNewStrategyWithFeeOnTransferTokens(borrowToken0, pairs, feeOnTransfers); } //Adding strategy with fee on transfer support function addNewStrategyWithFeeOnTransferTokens(bool borrowToken0, address[] memory pairs, uint256[] memory feeOnTransfers) public returns (uint256 strategyID) { require(!depreciated, "This Contract is depreciated"); require(pairs.length <= MAX_STEPS_LEN, "FA Controller - too many steps"); require(pairs.length > 1, "FA Controller - Specifying one pair is not arbitage"); require(pairs.length == feeOnTransfers.length, "FA Controller: Malformed Input - pairs and feeontransfers should equal"); bool[] memory token0Out = new bool[](pairs.length); // First token out is the same as borrowTokenOut token0Out[0] = borrowToken0; address token0 = IUniswapV2Pair(pairs[0]).token0(); address token1 = IUniswapV2Pair(pairs[0]).token1(); if(msg.sender != owner()) { require(token0 != CORE && token1 != CORE, "FA Controller: CORE strategies can be only added by an admin"); } bool cBTCSupport; // We turn on cbtc support if any of the borrow token pair has cbtc if(token0 == cBTC || token1 == cBTC) cBTCSupport = true; // Establish the first token out address lastToken = borrowToken0 ? token0 : token1; // console.log("Borrowing Token", lastToken); string memory strategyName = append( SafeERC20Namer.tokenSymbol(lastToken), " price too low. In ", SafeERC20Namer.tokenSymbol(token0), "/", SafeERC20Namer.tokenSymbol(token1), " pair"); // console.log(strategyName); // Loop over all other pairs for (uint256 i = 1; i < token0Out.length; i++) { address token0 = IUniswapV2Pair(pairs[i]).token0(); address token1 = IUniswapV2Pair(pairs[i]).token1(); if(msg.sender != owner()) { require(token0 != CORE && token1 != CORE, "FA Controller: CORE strategies can be only added by an admin"); } // console.log("Last token is", lastToken); // console.log("pair is",pairs[i]); // We turn on cbtc support if any of the pairs have cbts if(lastToken == cBTC || lastToken == wBTC){ require(token0 == cBTC || token1 == cBTC || token0 == wBTC || token1 == wBTC, "FA Controller: Malformed Input - pair does not contain previous token"); } else{ // We check if the token is in the next pair // If its not then its a wrong input // console.log("Last token", lastToken); require(token0 == lastToken || token1 == lastToken, "FA Controller: Malformed Input - pair does not contain previous token"); } // If last token is cBTC // And the this pair has wBTC in it // Then we should have the last token as wBTC if(lastToken == cBTC) { // console.log("Flipping here"); cBTCSupport = true; // If last token is cBTC and this pair has wBTC and no cBTC // Then we are inputting wBTC after unwrapping if(token0 == wBTC || token1 == wBTC && token0 != cBTC && token1 != cBTC){ // The token we take out here is opposite of wbtc // Token 0 is out if wBTC is token1 // Because we are inputting wBTC token0Out[i] = wBTC == token1; lastToken = wBTC == token1 ? token0 : token1; } } // If last token is wBTC // And cbtc is in this pair // And wbtc isn't in this pair // Then we wrapped cBTC else if(lastToken == wBTC && token0 == cBTC || token1 == cBTC && token0 != wBTC && token1 != wBTC){ // explained above with cbtc cBTCSupport = true; token0Out[i] = cBTC == token1; lastToken = cBTC == token1 ? token0 : token1; // console.log("Token0 out from last wBTC"); } //Default case with no cBTC support else { // If token 0 is the token we are inputting, the last one // Then we take the opposite here token0Out[i] = token1 == lastToken; // We take the opposite // So if we input token1 // Then token0 is out lastToken = token0 == lastToken ? token1 : token0; // console.log("Basic branch last token is ", lastToken); // console.log("Basic branch last token1 is ", token1); // console.log("Basic branch last token0 is ", token0); // console.log("Token0 out from basic branch"); } // console.log("Last token is", lastToken); } // address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport strategies.push( Strategy({ strategyName : strategyName, token0Out : token0Out, pairs : pairs, feeOnTransfers : feeOnTransfers, cBTCSupport : cBTCSupport, feeOff : msg.sender == owner() }) ); strategyID = strategies.length; emit StrategyAdded(strategyName, strategyID, pairs, msg.sender == owner(), msg.sender); } /////////////////// //// Helper functions ////////////////// function sendETH(address payable to, uint256 amt) internal { // console.log("I'm transfering ETH", amt/1e18, to); // throw exception on failure to.transfer(amt); } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'FA Controller: TRANSFER_FAILED'); } function getTokenSafeName(address token) public view returns (string memory) { return SafeERC20Namer.tokenSymbol(token); } // A function that lets owner remove any tokens from this addrss // note this address shoudn't hold any tokens // And if it does that means someting already went wrong or someone send them to this address function rescueTokens(address token, uint256 amt) public onlyOwner { IERC20(token).transfer(owner(), amt); } function rescueETH(uint256 amt) public { sendETH(0xd5b47B80668840e7164C1D1d81aF8a9d9727B421, amt); } // appends two strings together function append(string memory a, string memory b, string memory c, string memory d, string memory e, string memory f) internal pure returns (string memory) { return string(abi.encodePacked(a, b,c,d,e,f)); } /////////////////// //// Additional functions ////////////////// // This function is for people who do not want to reveal their strategies // Note we can do this function because executor requires this contract to be a caller when doing feeoff stratgies function skimToken(address _token) public { IERC20 token = IERC20(_token); uint256 balToken = token.balanceOf(address(this)); safeTransfer(_token, msg.sender, balToken.mul(revenueSplitFeeOffStrategy).div(1000)); safeTransfer(_token, distributor, token.balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"pairs","type":"address[]"},{"indexed":false,"internalType":"bool","name":"feeOff","type":"bool"},{"indexed":true,"internalType":"address","name":"originator","type":"address"}],"name":"StrategyAdded","type":"event"},{"inputs":[],"name":"CORE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"borrowToken0","type":"bool"},{"internalType":"address[]","name":"pairs","type":"address[]"}],"name":"addNewStrategy","outputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"borrowToken0","type":"bool"},{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"feeOnTransfers","type":"uint256[]"}],"name":"addNewStrategyWithFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"executeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"executeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"contract IFlashArbitrageExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"getOptimalInput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenSafeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numberOfStrategies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueSplitFeeOffStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueSplitFeeOnStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_depreciated","type":"bool"}],"name":"setDepreciated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"setExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_revenueSplitFeeOffStrategy","type":"uint256"},{"internalType":"uint256","name":"_revenueSplitFeeOnStrategy","type":"uint256"}],"name":"setFeeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxSteps","type":"uint8"}],"name":"setMaxStrategySteps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"skimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"string","name":"strategyName","type":"string"},{"internalType":"bool","name":"cBTCSupport","type":"bool"},{"internalType":"bool","name":"feeOff","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"strategyInfo","outputs":[{"components":[{"internalType":"string","name":"strategyName","type":"string"},{"internalType":"bool[]","name":"token0Out","type":"bool[]"},{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"feeOnTransfers","type":"uint256[]"},{"internalType":"bool","name":"cBTCSupport","type":"bool"},{"internalType":"bool","name":"feeOff","type":"bool"}],"internalType":"struct FlashArbitrageController.Strategy","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"name":"strategyProfitInReturnToken","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613a08806100206000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063bfe10928116100a2578063dfe3647811610071578063dfe364781461038f578063f101e82b146103a2578063f2fde38b146103b5578063fc8f3656146103c8576101cf565b8063bfe109281461034a578063c34c08e514610352578063d574ea3d1461035a578063d92f59991461037c576101cf565b80639e252f00116100de5780639e252f00146102f1578063b474858514610304578063bb91c33914610317578063bee9906714610337576101cf565b80638da5cb5b146102d9578063950fcfbe146102e15780639b452931146102e9576101cf565b80635737619811610171578063715018a61161014b578063715018a61461029857806375619ab5146102a05780637e6335c7146102b3578063887a2f72146102c6576101cf565b8063573761981461026a5780636b6c07741461027d5780636d651e2a14610285576101cf565b80631888153d116101ad5780631888153d146102275780631c3c0ea81461022f57806320d6c58014610244578063485cc95514610257576101cf565b80630956e5a6146101d45780630ae8c4dc146101f25780631780ab9814610207575b600080fd5b6101dc6103db565b6040516101e991906138db565b60405180910390f35b6101fa6103e1565b6040516101e99190613323565b61021a610215366004612ed9565b6103f0565b6040516101e99190613404565b6101dc610403565b61024261023d366004612ed9565b610409565b005b610242610252366004612ed9565b610469565b610242610265366004612f11565b6105a5565b610242610278366004612f49565b6106f9565b6101fa6107b5565b6101dc610293366004612fac565b6107c4565b610242610820565b6102426102ae366004612ed9565b61089f565b6102426102c1366004613177565b6108f6565b6102426102d436600461315f565b61097d565b6101fa610c42565b6101dc610c51565b6101fa610c57565b6102426102ff36600461315f565b610c66565b610242610312366004612f74565b610c87565b61032a61032536600461315f565b610cda565b6040516101e99190613841565b6101dc610345366004612ffa565b610ef4565b6101fa611834565b6101fa611843565b61036d61036836600461315f565b611852565b6040516101e993929190613417565b6101dc61038a36600461315f565b611914565b61024261039d366004613198565b611bc3565b6102426103b0366004613177565b611c18565b6102426103c3366004612ed9565b611edb565b6101dc6103d636600461315f565b611f92565b609e5490565b609b546001600160a01b031681565b60606103fb826121ea565b90505b919050565b60985481565b61041161221b565b6065546001600160a01b039081169116146104475760405162461bcd60e51b815260040161043e90613734565b60405180910390fd5b609a80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319061049a903090600401613323565b60206040518083038186803b1580156104b257600080fd5b505afa1580156104c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ea91906130c4565b905061051783336105126103e861050c6097548761221f90919063ffffffff16565b90612262565b6122a4565b6099546040516370a0823160e01b81526105a09185916001600160a01b03918216918616906370a0823190610550903090600401613323565b60206040518083038186803b15801561056857600080fd5b505afa15801561057c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051291906130c4565b505050565b600054610100900460ff16806105be57506105be612392565b806105cc575060005460ff16155b6105e85760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015610613576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd54361461063357600080fd5b61063b612398565b609b8054737b5982dcab054c377517759d0d2a3a5d02615ab86001600160a01b031991821617909155609c80547362359ed7505efc61ff1d56fef82158ccaffa23d7908316179055609d80546099805484166001600160a01b0387811691909117909155609a80548516918816919091179055606460975561028a609855732260fac5e5542a773aa44fbcfedf7c193bc2c59992169190911760ff60a81b1916600560aa1b17905580156105a0576000805461ff0019169055505050565b61070161221b565b6065546001600160a01b0390811691161461072e5760405162461bcd60e51b815260040161043e90613734565b816001600160a01b031663a9059cbb610745610c42565b836040518363ffffffff1660e01b8152600401610763929190613337565b602060405180830381600087803b15801561077d57600080fd5b505af1158015610791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a09190612f90565b609c546001600160a01b031681565b60006060825167ffffffffffffffff811180156107e057600080fd5b5060405190808252806020026020018201604052801561080a578160200160208202803683370190505b509050610818848483610ef4565b949350505050565b61082861221b565b6065546001600160a01b039081169116146108555760405162461bcd60e51b815260040161043e90613734565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6108a761221b565b6065546001600160a01b039081169116146108d45760405162461bcd60e51b815260040161043e90613734565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6108fe61221b565b6065546001600160a01b0390811691161461092b5760405162461bcd60e51b815260040161043e90613734565b60c8609754111561094e5760405162461bcd60e51b815260040161043e90613680565b6103b660985411156109725760405162461bcd60e51b815260040161043e906134e4565b609791909155609855565b609d54600160a01b900460ff16156109a75760405162461bcd60e51b815260040161043e906135d1565b6109af612c21565b609e82815481106109bc57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ad757602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610aa65790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610b3957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b1b575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610b9157602002820191906000526020600020905b815481526020019060010190808311610b7d575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a548483015160608601519286015160808701519451638ed36a4f60e01b81529697506001600160a01b0390921695638ed36a4f95610c0395929493929101613393565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c3e8161242a565b5050565b6065546001600160a01b031690565b60975481565b609d546001600160a01b031681565b610c8473d5b47b80668840e7164c1d1d81af8a9d9727b4218261266a565b50565b610c8f61221b565b6065546001600160a01b03908116911614610cbc5760405162461bcd60e51b815260040161043e90613734565b609d8054911515600160a01b0260ff60a01b19909216919091179055565b610ce2612c21565b609e8281548110610cef57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610e0a57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610dd95790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e6c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e4e575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610ec457602002820191906000526020600020905b815481526020019060010190808311610eb0575b50505091835250506004919091015460ff8082161515602084015261010090910416151560409091015292915050565b609d54600090600160a01b900460ff1615610f215760405162461bcd60e51b815260040161043e906135d1565b609d548351600160a81b90910460ff161015610f4f5760405162461bcd60e51b815260040161043e9061359a565b6001835111610f705760405162461bcd60e51b815260040161043e906137b7565b8151835114610f915760405162461bcd60e51b815260040161043e9061352d565b6060835167ffffffffffffffff81118015610fab57600080fd5b50604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b5090508481600081518110610fe657fe5b60200260200101901515908115158152505060008460008151811061100757fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561104757600080fd5b505afa15801561105b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107f9190612ef5565b905060008560008151811061109057fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d057600080fd5b505afa1580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111089190612ef5565b9050611112610c42565b6001600160a01b0316336001600160a01b03161461117257609c546001600160a01b038381169116148015906111565750609c546001600160a01b03828116911614155b6111725760405162461bcd60e51b815260040161043e90613441565b609b546000906001600160a01b038481169116148061119e5750609b546001600160a01b038381169116145b156111a7575060015b6000886111b457826111b6565b835b905060606112416111c6836121ea565b60405180604001604052806013815260200172010383934b1b2903a37b7903637bb971024b71606d1b8152506111fb886121ea565b604051806040016040528060018152602001602f60f81b81525061121e896121ea565b60405180604001604052806005815260200164103830b4b960d91b8152506126a0565b905060015b86518110156116bc5760008a828151811061125d57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561129d57600080fd5b505afa1580156112b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d59190612ef5565b905060008b83815181106112e557fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561132557600080fd5b505afa158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d9190612ef5565b9050611367610c42565b6001600160a01b0316336001600160a01b0316146113c757609c546001600160a01b038381169116148015906113ab5750609c546001600160a01b03828116911614155b6113c75760405162461bcd60e51b815260040161043e90613441565b609b546001600160a01b03868116911614806113f05750609d546001600160a01b038681169116145b1561146f57609b546001600160a01b038381169116148061141e5750609b546001600160a01b038281169116145b806114365750609d546001600160a01b038381169116145b8061144e5750609d546001600160a01b038281169116145b61146a5760405162461bcd60e51b815260040161043e906136c9565b6114bc565b846001600160a01b0316826001600160a01b031614806114a05750846001600160a01b0316816001600160a01b0316145b6114bc5760405162461bcd60e51b815260040161043e906136c9565b609b546001600160a01b038681169116141561158f57609d54600196506001600160a01b03838116911614806115325750609d546001600160a01b0382811691161480156115185750609b546001600160a01b03838116911614155b80156115325750609b546001600160a01b03828116911614155b1561158a57609d5489516001600160a01b03838116921691909114908a908590811061155a57fe5b91151560209283029190910190910152609d546001600160a01b038281169116146115855780611587565b815b94505b6116b2565b609d546001600160a01b0386811691161480156115b95750609b546001600160a01b038381169116145b806116045750609b546001600160a01b0382811691161480156115ea5750609d546001600160a01b03838116911614155b80156116045750609d546001600160a01b03828116911614155b1561165b57609b548951600197506001600160a01b03838116921691909114908a908590811061163057fe5b91151560209283029190910190910152609b546001600160a01b038281169116146115855780611587565b846001600160a01b0316816001600160a01b03161489848151811061167c57fe5b602002602001019015159081151581525050846001600160a01b0316826001600160a01b0316146116ad57816116af565b805b94505b5050600101611246565b50609e6040518060c001604052808381526020018881526020018b81526020018a815260200185151581526020016116f2610c42565b6001600160a01b0316331490528154600181018355600092835260209283902082518051939460059093029091019261172e9284920190612c5b565b5060208281015180516117479260018501920190612cd9565b5060408201518051611763916002840191602090910190612d7a565b506060820151805161177f916003840191602090910190612ddb565b5060808201516004909101805460a09093015115156101000261ff001992151560ff199094169390931791909116919091179055609e54604051909750339088906117cb908490613288565b60405180910390207f632fac0a1589b0f3641eb91e60fc7b1e2668673a1c95837e8bb6c7b5335a6e158c6117fd610c42565b6001600160a01b0316336001600160a01b03161460405161181f9291906133e0565b60405180910390a45050505050509392505050565b6099546001600160a01b031681565b609a546001600160a01b031681565b609e818154811061185f57fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f8101859004850283018501909152808252919350918391908301828280156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050506004909301549192505060ff8082169161010090041683565b600061191e612c21565b609e838154811061192b57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c08301848152929390928492909184918401828280156119ce5780601f106119a3576101008083540402835291602001916119ce565b820191906000526020600020905b8154815290600101906020018083116119b157829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a4657602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611a155790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611aa857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a8a575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611b0057602002820191906000526020600020905b815481526020019060010190808311611aec575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c90cc44d60e01b81529596506001600160a01b039091169463c90cc44d94611b6c949293929101613350565b60206040518083038186803b158015611b8457600080fd5b505afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc91906130c4565b9392505050565b611bcb61221b565b6065546001600160a01b03908116911614611bf85760405162461bcd60e51b815260040161043e90613734565b609d805460ff909216600160a81b0260ff60a81b19909216919091179055565b609d54600160a01b900460ff1615611c425760405162461bcd60e51b815260040161043e906135d1565b611c4a612c21565b609e8281548110611c5757fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611d7257602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611d415790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611dd457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611db6575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e2c57602002820191906000526020600020905b815481526020019060010190808311611e18575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151608087015194516316f5c5e960e21b81529697506001600160a01b0390921695635bd717a495611ea0958b959394929091016138e4565b600060405180830381600087803b158015611eba57600080fd5b505af1158015611ece573d6000803e3d6000fd5b505050506105a08161242a565b611ee361221b565b6065546001600160a01b03908116911614611f105760405162461bcd60e51b815260040161043e90613734565b6001600160a01b038116611f365760405162461bcd60e51b815260040161043e9061349e565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611f9c612c21565b609e8381548110611fa957fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c083018481529293909284929091849184018282801561204c5780601f106120215761010080835404028352916020019161204c565b820191906000526020600020905b81548152906001019060200180831161202f57829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156120c457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116120935790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561212657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612108575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561217e57602002820191906000526020600020905b81548152602001906001019080831161216a575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c0c06fef60e01b81529596506001600160a01b039091169463c0c06fef94611b6c949293929101613350565b6060806121fe836395d89b4160e01b6126d8565b90508051600014156103fb5761221383612805565b9150506103fe565b3390565b60008261222e5750600061225c565b8282028284828161223b57fe5b04146122595760405162461bcd60e51b815260040161043e9061363f565b90505b92915050565b600061225983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612812565b60006060846001600160a01b031663a9059cbb85856040516024016122ca929190613337565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516123039190613288565b6000604051808303816000865af19150503d8060008114612340576040519150601f19603f3d011682016040523d82523d6000602084013e612345565b606091505b509150915081801561236f57508051158061236f57508080602001905181019061236f9190612f90565b61238b5760405162461bcd60e51b815260040161043e90613608565b5050505050565b303b1590565b600054610100900460ff16806123b157506123b1612392565b806123bf575060005460ff16155b6123db5760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015612406576000805460ff1961ff0019909116610100171660011790555b61240e612849565b6124166128ca565b8015610c84576000805461ff001916905550565b6000816020015160008151811061243d57fe5b60200260200101516124d757816040015160008151811061245a57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561249a57600080fd5b505afa1580156124ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d29190612ef5565b612560565b81604001516000815181106124e857fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561252857600080fd5b505afa15801561253c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125609190612ef5565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016125909190613323565b60206040518083038186803b1580156125a857600080fd5b505afa1580156125bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e091906130c4565b90508260a00151156126115761260c82336105126103e861050c6097548761221f90919063ffffffff16565b612631565b61263182336105126103e861050c6098548761221f90919063ffffffff16565b6099546040516370a0823160e01b81526105a09184916001600160a01b03918216918316906370a0823190610550903090600401613323565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156105a0573d6000803e3d6000fd5b60608686868686866040516020016126bd969594939291906132a4565b60405160208183030381529060405290509695505050505050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160609160009183916001600160a01b038716916127229190613288565b600060405180830381855afa9150503d806000811461275d576040519150601f19603f3d011682016040523d82523d6000602084013e612762565b606091505b509150915081158061277357508051155b1561279157604051806020016040528060008152509250505061225c565b8051602014156127c6576000818060200190518101906127b191906130c4565b90506127bc816129a4565b935050505061225c565b6040815111156127ed57808060200190518101906127e491906130dc565b9250505061225c565b50506040805160208101909152600081529392505050565b60606103fb826006612acb565b600081836128335760405162461bcd60e51b815260040161043e9190613404565b50600083858161283f57fe5b0495945050505050565b600054610100900460ff16806128625750612862612392565b80612870575060005460ff16155b61288c5760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015612416576000805460ff1961ff0019909116610100171660011790558015610c84576000805461ff001916905550565b600054610100900460ff16806128e357506128e3612392565b806128f1575060005460ff16155b61290d5760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015612938576000805460ff1961ff0019909116610100171660011790555b600061294261221b565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610c84576000805461ff001916905550565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b6020811015612a2d5760008582602081106129e357fe5b1a60f81b90506001600160f81b0319811615612a245780848481518110612a0657fe5b60200101906001600160f81b031916908160001a9053506001909201915b506001016129cc565b5060608167ffffffffffffffff81118015612a4757600080fd5b506040519080825280601f01601f191660200182016040528015612a72576020820181803683370190505b50905060005b82811015612ac257838181518110612a8c57fe5b602001015160f81c60f81b828281518110612aa357fe5b60200101906001600160f81b031916908160001a905350600101612a78565b50949350505050565b606060028206158015612ade5750600082115b8015612aeb575060288211155b612b075760405162461bcd60e51b815260040161043e9061380a565b60608267ffffffffffffffff81118015612b2057600080fd5b506040519080825280601f01601f191660200182016040528015612b4b576020820181803683370190505b5090506001600160a01b03841660005b60028504811015612bef57600860138290030282901c600f600482901c1660f082168203612b8882612bf9565b868560020281518110612b9757fe5b60200101906001600160f81b031916908160001a905350612bb781612bf9565b868560020260010181518110612bc957fe5b60200101906001600160f81b031916908160001a9053505060019092019150612b5b9050565b5090949350505050565b6000600a8260ff161015612c1457506030810160f81b6103fe565b506037810160f81b6103fe565b6040518060c00160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612c9c57805160ff1916838001178555612cc9565b82800160010185558215612cc9579182015b82811115612cc9578251825591602001919060010190612cae565b50612cd5929150612e15565b5090565b82805482825590600052602060002090601f01602090048101928215612d6e5791602002820160005b83821115612d3f57835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612d02565b8015612d6c5782816101000a81549060ff0219169055600101602081600001049283019260010302612d3f565b505b50612cd5929150612e2a565b828054828255906000526020600020908101928215612dcf579160200282015b82811115612dcf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612d9a565b50612cd5929150612e43565b828054828255906000526020600020908101928215612cc95791602002820182811115612cc9578251825591602001919060010190612cae565b5b80821115612cd55760008155600101612e16565b5b80821115612cd557805460ff19168155600101612e2b565b5b80821115612cd55780546001600160a01b0319168155600101612e44565b600082601f830112612e72578081fd5b8135612e85612e808261395f565b613938565b818152915060208083019084810181840286018201871015612ea657600080fd5b60005b84811015612ece578135612ebc816139af565b84529282019290820190600101612ea9565b505050505092915050565b600060208284031215612eea578081fd5b8135612259816139af565b600060208284031215612f06578081fd5b8151612259816139af565b60008060408385031215612f23578081fd5b8235612f2e816139af565b91506020830135612f3e816139af565b809150509250929050565b60008060408385031215612f5b578182fd5b8235612f66816139af565b946020939093013593505050565b600060208284031215612f85578081fd5b8135612259816139c4565b600060208284031215612fa1578081fd5b8151612259816139c4565b60008060408385031215612fbe578182fd5b8235612fc9816139c4565b9150602083013567ffffffffffffffff811115612fe4578182fd5b612ff085828601612e62565b9150509250929050565b60008060006060848603121561300e578081fd5b8335613019816139c4565b925060208481013567ffffffffffffffff80821115613036578384fd5b61304288838901612e62565b94506040870135915080821115613057578384fd5b508501601f81018713613068578283fd5b8035613076612e808261395f565b81815283810190838501858402850186018b1015613092578687fd5b8694505b838510156130b4578035835260019490940193918501918501613096565b5080955050505050509250925092565b6000602082840312156130d5578081fd5b5051919050565b6000602082840312156130ed578081fd5b815167ffffffffffffffff80821115613104578283fd5b818401915084601f830112613117578283fd5b815181811115613125578384fd5b613138601f8201601f1916602001613938565b915080825285602082850101111561314e578384fd5b612ac281602084016020860161397f565b600060208284031215613170578081fd5b5035919050565b60008060408385031215613189578182fd5b50508035926020909101359150565b6000602082840312156131a9578081fd5b813560ff81168114612259578182fd5b6000815180845260208085019450808401835b838110156131f15781516001600160a01b0316875295820195908201906001016131cc565b509495945050505050565b6000815180845260208085019450808401835b838110156131f157815115158752958201959082019060010161320f565b6000815180845260208085019450808401835b838110156131f157815187529582019590820190600101613240565b6000815180845261327481602086016020860161397f565b601f01601f19169290920160200192915050565b6000825161329a81846020870161397f565b9190910192915050565b6000875160206132b78285838d0161397f565b8851918401916132ca8184848d0161397f565b88519201916132dc8184848c0161397f565b87519201916132ee8184848b0161397f565b86519201916133008184848a0161397f565b8551920191613312818484890161397f565b919091019998505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60006060825261336360608301866131b9565b8281036020840152613375818661322d565b9050828103604084015261338981856131fc565b9695505050505050565b6000608082526133a660808301876131b9565b82810360208401526133b8818761322d565b905082810360408401526133cc81866131fc565b915050821515606083015295945050505050565b6000604082526133f360408301856131b9565b905082151560208301529392505050565b600060208252612259602083018461325c565b60006060825261342a606083018661325c565b931515602083015250901515604090910152919050565b6020808252603c908201527f464120436f6e74726f6c6c65723a20434f52452073747261746567696573206360408201527f616e206265206f6e6c7920616464656420627920616e2061646d696e00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f4641203a20393525206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526047908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f2020706169727320616e64206665656f6e7472616e73666572732073686f756c6060820152661908195c5d585b60ca1b608082015260a00190565b6020808252601e908201527f464120436f6e74726f6c6c6572202d20746f6f206d616e792073746570730000604082015260600190565b6020808252601c908201527f5468697320436f6e747261637420697320646570726563696174656400000000604082015260600190565b6020808252601e908201527f464120436f6e74726f6c6c65723a205452414e534645525f4641494c45440000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526029908201527f4641203a20323025206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526045908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f207061697220646f6573206e6f7420636f6e7461696e2070726576696f7573206060820152643a37b5b2b760d91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526033908201527f464120436f6e74726f6c6c6572202d2053706563696679696e67206f6e652070604082015272616972206973206e6f7420617262697461676560681b606082015260800190565b6020808252601e908201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604082015260600190565b600060208252825160c0602084015261385d60e084018261325c565b90506020840151601f198085840301604086015261387b83836131fc565b9250604086015191508085840301606086015261389883836131b9565b92506060860151915080858403016080860152506138b6828261322d565b9150506080840151151560a084015260a0840151151560c08401528091505092915050565b90815260200190565b600086825260a060208301526138fd60a08301876131b9565b828103604084015261390f818761322d565b9050828103606084015261392381866131fc565b91505082151560808301529695505050505050565b60405181810167ffffffffffffffff8111828210171561395757600080fd5b604052919050565b600067ffffffffffffffff821115613975578081fd5b5060209081020190565b60005b8381101561399a578181015183820152602001613982565b838111156139a9576000848401525b50505050565b6001600160a01b0381168114610c8457600080fd5b8015158114610c8457600080fdfea2646970667358221220025dab63695b3f2d9955670ad345ee76f624bbf9dc07eeb57d677f005ffbb14b64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063bfe10928116100a2578063dfe3647811610071578063dfe364781461038f578063f101e82b146103a2578063f2fde38b146103b5578063fc8f3656146103c8576101cf565b8063bfe109281461034a578063c34c08e514610352578063d574ea3d1461035a578063d92f59991461037c576101cf565b80639e252f00116100de5780639e252f00146102f1578063b474858514610304578063bb91c33914610317578063bee9906714610337576101cf565b80638da5cb5b146102d9578063950fcfbe146102e15780639b452931146102e9576101cf565b80635737619811610171578063715018a61161014b578063715018a61461029857806375619ab5146102a05780637e6335c7146102b3578063887a2f72146102c6576101cf565b8063573761981461026a5780636b6c07741461027d5780636d651e2a14610285576101cf565b80631888153d116101ad5780631888153d146102275780631c3c0ea81461022f57806320d6c58014610244578063485cc95514610257576101cf565b80630956e5a6146101d45780630ae8c4dc146101f25780631780ab9814610207575b600080fd5b6101dc6103db565b6040516101e991906138db565b60405180910390f35b6101fa6103e1565b6040516101e99190613323565b61021a610215366004612ed9565b6103f0565b6040516101e99190613404565b6101dc610403565b61024261023d366004612ed9565b610409565b005b610242610252366004612ed9565b610469565b610242610265366004612f11565b6105a5565b610242610278366004612f49565b6106f9565b6101fa6107b5565b6101dc610293366004612fac565b6107c4565b610242610820565b6102426102ae366004612ed9565b61089f565b6102426102c1366004613177565b6108f6565b6102426102d436600461315f565b61097d565b6101fa610c42565b6101dc610c51565b6101fa610c57565b6102426102ff36600461315f565b610c66565b610242610312366004612f74565b610c87565b61032a61032536600461315f565b610cda565b6040516101e99190613841565b6101dc610345366004612ffa565b610ef4565b6101fa611834565b6101fa611843565b61036d61036836600461315f565b611852565b6040516101e993929190613417565b6101dc61038a36600461315f565b611914565b61024261039d366004613198565b611bc3565b6102426103b0366004613177565b611c18565b6102426103c3366004612ed9565b611edb565b6101dc6103d636600461315f565b611f92565b609e5490565b609b546001600160a01b031681565b60606103fb826121ea565b90505b919050565b60985481565b61041161221b565b6065546001600160a01b039081169116146104475760405162461bcd60e51b815260040161043e90613734565b60405180910390fd5b609a80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319061049a903090600401613323565b60206040518083038186803b1580156104b257600080fd5b505afa1580156104c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ea91906130c4565b905061051783336105126103e861050c6097548761221f90919063ffffffff16565b90612262565b6122a4565b6099546040516370a0823160e01b81526105a09185916001600160a01b03918216918616906370a0823190610550903090600401613323565b60206040518083038186803b15801561056857600080fd5b505afa15801561057c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051291906130c4565b505050565b600054610100900460ff16806105be57506105be612392565b806105cc575060005460ff16155b6105e85760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015610613576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd54361461063357600080fd5b61063b612398565b609b8054737b5982dcab054c377517759d0d2a3a5d02615ab86001600160a01b031991821617909155609c80547362359ed7505efc61ff1d56fef82158ccaffa23d7908316179055609d80546099805484166001600160a01b0387811691909117909155609a80548516918816919091179055606460975561028a609855732260fac5e5542a773aa44fbcfedf7c193bc2c59992169190911760ff60a81b1916600560aa1b17905580156105a0576000805461ff0019169055505050565b61070161221b565b6065546001600160a01b0390811691161461072e5760405162461bcd60e51b815260040161043e90613734565b816001600160a01b031663a9059cbb610745610c42565b836040518363ffffffff1660e01b8152600401610763929190613337565b602060405180830381600087803b15801561077d57600080fd5b505af1158015610791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a09190612f90565b609c546001600160a01b031681565b60006060825167ffffffffffffffff811180156107e057600080fd5b5060405190808252806020026020018201604052801561080a578160200160208202803683370190505b509050610818848483610ef4565b949350505050565b61082861221b565b6065546001600160a01b039081169116146108555760405162461bcd60e51b815260040161043e90613734565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6108a761221b565b6065546001600160a01b039081169116146108d45760405162461bcd60e51b815260040161043e90613734565b609980546001600160a01b0319166001600160a01b0392909216919091179055565b6108fe61221b565b6065546001600160a01b0390811691161461092b5760405162461bcd60e51b815260040161043e90613734565b60c8609754111561094e5760405162461bcd60e51b815260040161043e90613680565b6103b660985411156109725760405162461bcd60e51b815260040161043e906134e4565b609791909155609855565b609d54600160a01b900460ff16156109a75760405162461bcd60e51b815260040161043e906135d1565b6109af612c21565b609e82815481106109bc57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610a5f5780601f10610a3457610100808354040283529160200191610a5f565b820191906000526020600020905b815481529060010190602001808311610a4257829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ad757602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610aa65790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610b3957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b1b575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610b9157602002820191906000526020600020905b815481526020019060010190808311610b7d575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a548483015160608601519286015160808701519451638ed36a4f60e01b81529697506001600160a01b0390921695638ed36a4f95610c0395929493929101613393565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b50505050610c3e8161242a565b5050565b6065546001600160a01b031690565b60975481565b609d546001600160a01b031681565b610c8473d5b47b80668840e7164c1d1d81af8a9d9727b4218261266a565b50565b610c8f61221b565b6065546001600160a01b03908116911614610cbc5760405162461bcd60e51b815260040161043e90613734565b609d8054911515600160a01b0260ff60a01b19909216919091179055565b610ce2612c21565b609e8281548110610cef57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610e0a57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610dd95790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e6c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e4e575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610ec457602002820191906000526020600020905b815481526020019060010190808311610eb0575b50505091835250506004919091015460ff8082161515602084015261010090910416151560409091015292915050565b609d54600090600160a01b900460ff1615610f215760405162461bcd60e51b815260040161043e906135d1565b609d548351600160a81b90910460ff161015610f4f5760405162461bcd60e51b815260040161043e9061359a565b6001835111610f705760405162461bcd60e51b815260040161043e906137b7565b8151835114610f915760405162461bcd60e51b815260040161043e9061352d565b6060835167ffffffffffffffff81118015610fab57600080fd5b50604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b5090508481600081518110610fe657fe5b60200260200101901515908115158152505060008460008151811061100757fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561104757600080fd5b505afa15801561105b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107f9190612ef5565b905060008560008151811061109057fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d057600080fd5b505afa1580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111089190612ef5565b9050611112610c42565b6001600160a01b0316336001600160a01b03161461117257609c546001600160a01b038381169116148015906111565750609c546001600160a01b03828116911614155b6111725760405162461bcd60e51b815260040161043e90613441565b609b546000906001600160a01b038481169116148061119e5750609b546001600160a01b038381169116145b156111a7575060015b6000886111b457826111b6565b835b905060606112416111c6836121ea565b60405180604001604052806013815260200172010383934b1b2903a37b7903637bb971024b71606d1b8152506111fb886121ea565b604051806040016040528060018152602001602f60f81b81525061121e896121ea565b60405180604001604052806005815260200164103830b4b960d91b8152506126a0565b905060015b86518110156116bc5760008a828151811061125d57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561129d57600080fd5b505afa1580156112b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d59190612ef5565b905060008b83815181106112e557fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561132557600080fd5b505afa158015611339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135d9190612ef5565b9050611367610c42565b6001600160a01b0316336001600160a01b0316146113c757609c546001600160a01b038381169116148015906113ab5750609c546001600160a01b03828116911614155b6113c75760405162461bcd60e51b815260040161043e90613441565b609b546001600160a01b03868116911614806113f05750609d546001600160a01b038681169116145b1561146f57609b546001600160a01b038381169116148061141e5750609b546001600160a01b038281169116145b806114365750609d546001600160a01b038381169116145b8061144e5750609d546001600160a01b038281169116145b61146a5760405162461bcd60e51b815260040161043e906136c9565b6114bc565b846001600160a01b0316826001600160a01b031614806114a05750846001600160a01b0316816001600160a01b0316145b6114bc5760405162461bcd60e51b815260040161043e906136c9565b609b546001600160a01b038681169116141561158f57609d54600196506001600160a01b03838116911614806115325750609d546001600160a01b0382811691161480156115185750609b546001600160a01b03838116911614155b80156115325750609b546001600160a01b03828116911614155b1561158a57609d5489516001600160a01b03838116921691909114908a908590811061155a57fe5b91151560209283029190910190910152609d546001600160a01b038281169116146115855780611587565b815b94505b6116b2565b609d546001600160a01b0386811691161480156115b95750609b546001600160a01b038381169116145b806116045750609b546001600160a01b0382811691161480156115ea5750609d546001600160a01b03838116911614155b80156116045750609d546001600160a01b03828116911614155b1561165b57609b548951600197506001600160a01b03838116921691909114908a908590811061163057fe5b91151560209283029190910190910152609b546001600160a01b038281169116146115855780611587565b846001600160a01b0316816001600160a01b03161489848151811061167c57fe5b602002602001019015159081151581525050846001600160a01b0316826001600160a01b0316146116ad57816116af565b805b94505b5050600101611246565b50609e6040518060c001604052808381526020018881526020018b81526020018a815260200185151581526020016116f2610c42565b6001600160a01b0316331490528154600181018355600092835260209283902082518051939460059093029091019261172e9284920190612c5b565b5060208281015180516117479260018501920190612cd9565b5060408201518051611763916002840191602090910190612d7a565b506060820151805161177f916003840191602090910190612ddb565b5060808201516004909101805460a09093015115156101000261ff001992151560ff199094169390931791909116919091179055609e54604051909750339088906117cb908490613288565b60405180910390207f632fac0a1589b0f3641eb91e60fc7b1e2668673a1c95837e8bb6c7b5335a6e158c6117fd610c42565b6001600160a01b0316336001600160a01b03161460405161181f9291906133e0565b60405180910390a45050505050509392505050565b6099546001600160a01b031681565b609a546001600160a01b031681565b609e818154811061185f57fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f8101859004850283018501909152808252919350918391908301828280156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050506004909301549192505060ff8082169161010090041683565b600061191e612c21565b609e838154811061192b57fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c08301848152929390928492909184918401828280156119ce5780601f106119a3576101008083540402835291602001916119ce565b820191906000526020600020905b8154815290600101906020018083116119b157829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a4657602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611a155790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611aa857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a8a575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611b0057602002820191906000526020600020905b815481526020019060010190808311611aec575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c90cc44d60e01b81529596506001600160a01b039091169463c90cc44d94611b6c949293929101613350565b60206040518083038186803b158015611b8457600080fd5b505afa158015611b98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbc91906130c4565b9392505050565b611bcb61221b565b6065546001600160a01b03908116911614611bf85760405162461bcd60e51b815260040161043e90613734565b609d805460ff909216600160a81b0260ff60a81b19909216919091179055565b609d54600160a01b900460ff1615611c425760405162461bcd60e51b815260040161043e906135d1565b611c4a612c21565b609e8281548110611c5757fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611d7257602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611d415790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611dd457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611db6575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e2c57602002820191906000526020600020905b815481526020019060010190808311611e18575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151608087015194516316f5c5e960e21b81529697506001600160a01b0390921695635bd717a495611ea0958b959394929091016138e4565b600060405180830381600087803b158015611eba57600080fd5b505af1158015611ece573d6000803e3d6000fd5b505050506105a08161242a565b611ee361221b565b6065546001600160a01b03908116911614611f105760405162461bcd60e51b815260040161043e90613734565b6001600160a01b038116611f365760405162461bcd60e51b815260040161043e9061349e565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611f9c612c21565b609e8381548110611fa957fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c083018481529293909284929091849184018282801561204c5780601f106120215761010080835404028352916020019161204c565b820191906000526020600020905b81548152906001019060200180831161202f57829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156120c457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116120935790505b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561212657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612108575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561217e57602002820191906000526020600020905b81548152602001906001019080831161216a575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152609a5484830151606086015192860151935163c0c06fef60e01b81529596506001600160a01b039091169463c0c06fef94611b6c949293929101613350565b6060806121fe836395d89b4160e01b6126d8565b90508051600014156103fb5761221383612805565b9150506103fe565b3390565b60008261222e5750600061225c565b8282028284828161223b57fe5b04146122595760405162461bcd60e51b815260040161043e9061363f565b90505b92915050565b600061225983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612812565b60006060846001600160a01b031663a9059cbb85856040516024016122ca929190613337565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516123039190613288565b6000604051808303816000865af19150503d8060008114612340576040519150601f19603f3d011682016040523d82523d6000602084013e612345565b606091505b509150915081801561236f57508051158061236f57508080602001905181019061236f9190612f90565b61238b5760405162461bcd60e51b815260040161043e90613608565b5050505050565b303b1590565b600054610100900460ff16806123b157506123b1612392565b806123bf575060005460ff16155b6123db5760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015612406576000805460ff1961ff0019909116610100171660011790555b61240e612849565b6124166128ca565b8015610c84576000805461ff001916905550565b6000816020015160008151811061243d57fe5b60200260200101516124d757816040015160008151811061245a57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561249a57600080fd5b505afa1580156124ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d29190612ef5565b612560565b81604001516000815181106124e857fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561252857600080fd5b505afa15801561253c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125609190612ef5565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016125909190613323565b60206040518083038186803b1580156125a857600080fd5b505afa1580156125bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e091906130c4565b90508260a00151156126115761260c82336105126103e861050c6097548761221f90919063ffffffff16565b612631565b61263182336105126103e861050c6098548761221f90919063ffffffff16565b6099546040516370a0823160e01b81526105a09184916001600160a01b03918216918316906370a0823190610550903090600401613323565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156105a0573d6000803e3d6000fd5b60608686868686866040516020016126bd969594939291906132a4565b60405160208183030381529060405290509695505050505050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160609160009183916001600160a01b038716916127229190613288565b600060405180830381855afa9150503d806000811461275d576040519150601f19603f3d011682016040523d82523d6000602084013e612762565b606091505b509150915081158061277357508051155b1561279157604051806020016040528060008152509250505061225c565b8051602014156127c6576000818060200190518101906127b191906130c4565b90506127bc816129a4565b935050505061225c565b6040815111156127ed57808060200190518101906127e491906130dc565b9250505061225c565b50506040805160208101909152600081529392505050565b60606103fb826006612acb565b600081836128335760405162461bcd60e51b815260040161043e9190613404565b50600083858161283f57fe5b0495945050505050565b600054610100900460ff16806128625750612862612392565b80612870575060005460ff16155b61288c5760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015612416576000805460ff1961ff0019909116610100171660011790558015610c84576000805461ff001916905550565b600054610100900460ff16806128e357506128e3612392565b806128f1575060005460ff16155b61290d5760405162461bcd60e51b815260040161043e90613769565b600054610100900460ff16158015612938576000805460ff1961ff0019909116610100171660011790555b600061294261221b565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610c84576000805461ff001916905550565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b6020811015612a2d5760008582602081106129e357fe5b1a60f81b90506001600160f81b0319811615612a245780848481518110612a0657fe5b60200101906001600160f81b031916908160001a9053506001909201915b506001016129cc565b5060608167ffffffffffffffff81118015612a4757600080fd5b506040519080825280601f01601f191660200182016040528015612a72576020820181803683370190505b50905060005b82811015612ac257838181518110612a8c57fe5b602001015160f81c60f81b828281518110612aa357fe5b60200101906001600160f81b031916908160001a905350600101612a78565b50949350505050565b606060028206158015612ade5750600082115b8015612aeb575060288211155b612b075760405162461bcd60e51b815260040161043e9061380a565b60608267ffffffffffffffff81118015612b2057600080fd5b506040519080825280601f01601f191660200182016040528015612b4b576020820181803683370190505b5090506001600160a01b03841660005b60028504811015612bef57600860138290030282901c600f600482901c1660f082168203612b8882612bf9565b868560020281518110612b9757fe5b60200101906001600160f81b031916908160001a905350612bb781612bf9565b868560020260010181518110612bc957fe5b60200101906001600160f81b031916908160001a9053505060019092019150612b5b9050565b5090949350505050565b6000600a8260ff161015612c1457506030810160f81b6103fe565b506037810160f81b6103fe565b6040518060c00160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612c9c57805160ff1916838001178555612cc9565b82800160010185558215612cc9579182015b82811115612cc9578251825591602001919060010190612cae565b50612cd5929150612e15565b5090565b82805482825590600052602060002090601f01602090048101928215612d6e5791602002820160005b83821115612d3f57835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612d02565b8015612d6c5782816101000a81549060ff0219169055600101602081600001049283019260010302612d3f565b505b50612cd5929150612e2a565b828054828255906000526020600020908101928215612dcf579160200282015b82811115612dcf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612d9a565b50612cd5929150612e43565b828054828255906000526020600020908101928215612cc95791602002820182811115612cc9578251825591602001919060010190612cae565b5b80821115612cd55760008155600101612e16565b5b80821115612cd557805460ff19168155600101612e2b565b5b80821115612cd55780546001600160a01b0319168155600101612e44565b600082601f830112612e72578081fd5b8135612e85612e808261395f565b613938565b818152915060208083019084810181840286018201871015612ea657600080fd5b60005b84811015612ece578135612ebc816139af565b84529282019290820190600101612ea9565b505050505092915050565b600060208284031215612eea578081fd5b8135612259816139af565b600060208284031215612f06578081fd5b8151612259816139af565b60008060408385031215612f23578081fd5b8235612f2e816139af565b91506020830135612f3e816139af565b809150509250929050565b60008060408385031215612f5b578182fd5b8235612f66816139af565b946020939093013593505050565b600060208284031215612f85578081fd5b8135612259816139c4565b600060208284031215612fa1578081fd5b8151612259816139c4565b60008060408385031215612fbe578182fd5b8235612fc9816139c4565b9150602083013567ffffffffffffffff811115612fe4578182fd5b612ff085828601612e62565b9150509250929050565b60008060006060848603121561300e578081fd5b8335613019816139c4565b925060208481013567ffffffffffffffff80821115613036578384fd5b61304288838901612e62565b94506040870135915080821115613057578384fd5b508501601f81018713613068578283fd5b8035613076612e808261395f565b81815283810190838501858402850186018b1015613092578687fd5b8694505b838510156130b4578035835260019490940193918501918501613096565b5080955050505050509250925092565b6000602082840312156130d5578081fd5b5051919050565b6000602082840312156130ed578081fd5b815167ffffffffffffffff80821115613104578283fd5b818401915084601f830112613117578283fd5b815181811115613125578384fd5b613138601f8201601f1916602001613938565b915080825285602082850101111561314e578384fd5b612ac281602084016020860161397f565b600060208284031215613170578081fd5b5035919050565b60008060408385031215613189578182fd5b50508035926020909101359150565b6000602082840312156131a9578081fd5b813560ff81168114612259578182fd5b6000815180845260208085019450808401835b838110156131f15781516001600160a01b0316875295820195908201906001016131cc565b509495945050505050565b6000815180845260208085019450808401835b838110156131f157815115158752958201959082019060010161320f565b6000815180845260208085019450808401835b838110156131f157815187529582019590820190600101613240565b6000815180845261327481602086016020860161397f565b601f01601f19169290920160200192915050565b6000825161329a81846020870161397f565b9190910192915050565b6000875160206132b78285838d0161397f565b8851918401916132ca8184848d0161397f565b88519201916132dc8184848c0161397f565b87519201916132ee8184848b0161397f565b86519201916133008184848a0161397f565b8551920191613312818484890161397f565b919091019998505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b60006060825261336360608301866131b9565b8281036020840152613375818661322d565b9050828103604084015261338981856131fc565b9695505050505050565b6000608082526133a660808301876131b9565b82810360208401526133b8818761322d565b905082810360408401526133cc81866131fc565b915050821515606083015295945050505050565b6000604082526133f360408301856131b9565b905082151560208301529392505050565b600060208252612259602083018461325c565b60006060825261342a606083018661325c565b931515602083015250901515604090910152919050565b6020808252603c908201527f464120436f6e74726f6c6c65723a20434f52452073747261746567696573206360408201527f616e206265206f6e6c7920616464656420627920616e2061646d696e00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f4641203a20393525206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526047908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f2020706169727320616e64206665656f6e7472616e73666572732073686f756c6060820152661908195c5d585b60ca1b608082015260a00190565b6020808252601e908201527f464120436f6e74726f6c6c6572202d20746f6f206d616e792073746570730000604082015260600190565b6020808252601c908201527f5468697320436f6e747261637420697320646570726563696174656400000000604082015260600190565b6020808252601e908201527f464120436f6e74726f6c6c65723a205452414e534645525f4641494c45440000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526029908201527f4641203a20323025206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526045908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f207061697220646f6573206e6f7420636f6e7461696e2070726576696f7573206060820152643a37b5b2b760d91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526033908201527f464120436f6e74726f6c6c6572202d2053706563696679696e67206f6e652070604082015272616972206973206e6f7420617262697461676560681b606082015260800190565b6020808252601e908201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604082015260600190565b600060208252825160c0602084015261385d60e084018261325c565b90506020840151601f198085840301604086015261387b83836131fc565b9250604086015191508085840301606086015261389883836131b9565b92506060860151915080858403016080860152506138b6828261322d565b9150506080840151151560a084015260a0840151151560c08401528091505092915050565b90815260200190565b600086825260a060208301526138fd60a08301876131b9565b828103604084015261390f818761322d565b9050828103606084015261392381866131fc565b91505082151560808301529695505050505050565b60405181810167ffffffffffffffff8111828210171561395757600080fd5b604052919050565b600067ffffffffffffffff821115613975578081fd5b5060209081020190565b60005b8381101561399a578181015183820152602001613982565b838111156139a9576000848401525b50505050565b6001600160a01b0381168114610c8457600080fd5b8015158114610c8457600080fdfea2646970667358221220025dab63695b3f2d9955670ad345ee76f624bbf9dc07eeb57d677f005ffbb14b64736f6c634300060c0033
Deployed Bytecode Sourcemap
27515:15601:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32054:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28427:19;;;:::i;:::-;;;;;;;:::i;41624:136::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28298:40::-;;;:::i;29788:121::-;;;;;;:::i;:::-;;:::i;:::-;;42788:321;;;;;;:::i;:::-;;:::i;28914:743::-;;;;;;:::i;:::-;;:::i;41988:122::-;;;;;;:::i;:::-;;:::i;28453:19::-;;;:::i;34890:285::-;;;;;;:::i;:::-;;:::i;25874:148::-;;;:::i;29961:108::-;;;;;;:::i;:::-;;:::i;30305:640::-;;;;;;:::i;:::-;;:::i;32688:529::-;;;;;;:::i;:::-;;:::i;25232:79::-;;;:::i;28250:41::-;;;:::i;28479:19::-;;;:::i;42118:114::-;;;;;;:::i;:::-;;:::i;30192:105::-;;;;;;:::i;:::-;;:::i;31917:129::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35235:5715::-;;;;;;:::i;:::-;;:::i;28347:27::-;;;:::i;28381:39::-;;;:::i;28875:28::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;31552:308::-;;;;;;:::i;:::-;;:::i;30077:107::-;;;;;;:::i;:::-;;:::i;33266:416::-;;;;;;:::i;:::-;;:::i;26177:244::-;;;;;;:::i;:::-;;:::i;31033:276::-;;;;;;:::i;:::-;;:::i;32054:103::-;32132:10;:17;32054:103;:::o;28427:19::-;;;-1:-1:-1;;;;;28427:19:0;;:::o;41624:136::-;41686:13;41719:33;41746:5;41719:26;:33::i;:::-;41712:40;;41624:136;;;;:::o;28298:40::-;;;;:::o;29788:121::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;;;;;;;;;29856:8:::1;:45:::0;;-1:-1:-1;;;;;;29856:45:0::1;-1:-1:-1::0;;;;;29856:45:0;;;::::1;::::0;;;::::1;::::0;;29788:121::o;42788:321::-;42900:30;;-1:-1:-1;;;42900:30:0;;42863:6;;42841:12;;-1:-1:-1;;;;;42900:15:0;;;;;:30;;42924:4;;42900:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42881:49;;42941:84;42954:6;42962:10;42974:50;43019:4;42974:40;42987:26;;42974:8;:12;;:40;;;;:::i;:::-;:44;;:50::i;:::-;42941:12;:84::i;:::-;43057:11;;43070:30;;-1:-1:-1;;;43070:30:0;;43036:65;;43049:6;;-1:-1:-1;;;;;43057:11:0;;;;43070:15;;;;;:30;;43094:4;;43070:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43036:65::-;42788:321;;;:::o;28914:743::-;21463:12;;;;;;;;:31;;;21479:15;:13;:15::i;:::-;21463:47;;;-1:-1:-1;21499:11:0;;;;21498:12;21463:47;21455:106;;;;-1:-1:-1;;;21455:106:0;;;;;;;:::i;:::-;21570:19;21593:12;;;;;;21592:13;21612:83;;;;21641:12;:19;;-1:-1:-1;;;;21641:19:0;;;;;21669:18;21656:4;21669:18;;;21612:83;29014:9:::1;29035:42;29014:64;29006:73;;;::::0;::::1;;29090:35;:33;:35::i;:::-;29138:4;:49:::0;;29145:42:::1;-1:-1:-1::0;;;;;;29138:49:0;;::::1;;::::0;;;29198:4:::1;:49:::0;;29205:42:::1;29198:49:::0;;::::1;;::::0;;29258:4:::1;:49:::0;;29318:11:::1;:26:::0;;;::::1;-1:-1:-1::0;;;;;29318:26:0;;::::1;::::0;;;::::1;::::0;;;29476:8:::1;:45:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;29561:3:::1;29532:26;:32:::0;29610:3:::1;29582:25;:31:::0;29265:42:::1;29258:49:::0;::::1;::::0;;;::::1;-1:-1:-1::0;;;;29631:18:0::1;-1:-1:-1::0;;;29631:18:0::1;::::0;;21713:57;;;;21757:5;21742:20;;-1:-1:-1;;21742:20:0;;;28914:743;;;:::o;41988:122::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;42073:5:::1;-1:-1:-1::0;;;;;42066:22:0::1;;42089:7;:5;:7::i;:::-;42098:3;42066:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28453:19::-:0;;;-1:-1:-1;;;;;28453:19:0;;:::o;34890:285::-;34973:18;35006:31;35054:5;:12;35040:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35040:27:0;;35006:61;;35091:74;35129:12;35143:5;35150:14;35091:37;:74::i;:::-;35078:87;34890:285;-1:-1:-1;;;;34890:285:0:o;25874:148::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;25965:6:::1;::::0;25944:40:::1;::::0;25981:1:::1;::::0;-1:-1:-1;;;;;25965:6:0::1;::::0;25944:40:::1;::::0;25981:1;;25944:40:::1;25995:6;:19:::0;;-1:-1:-1;;;;;;25995:19:0::1;::::0;;25874:148::o;29961:108::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;30035:11:::1;:26:::0;;-1:-1:-1;;;;;;30035:26:0::1;-1:-1:-1::0;;;;;30035:26:0;;;::::1;::::0;;;::::1;::::0;;29961:108::o;30305:640::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;30659:3:::1;30629:26;;:33;;30621:87;;;;-1:-1:-1::0;;;30621:87:0::1;;;;;;;:::i;:::-;30756:3;30727:25;;:32;;30719:86;;;;-1:-1:-1::0;;;30719:86:0::1;;;;;;;:::i;:::-;30816:26;:56:::0;;;;30883:25:::1;:54:::0;30305:640::o;32688:529::-;32908:11;;-1:-1:-1;;;32908:11:0;;;;32907:12;32899:53;;;;-1:-1:-1;;;32899:53:0;;;;;;;:::i;:::-;32963:31;;:::i;:::-;32997:10;33008:11;32997:23;;;;;;;;;;;;;;;;;32963:57;;;32997:23;;;;;;;;32963:57;;;;;;;;;-1:-1:-1;;32963:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32997:23;;32963:57;;;;32997:23;;32963:57;;32997:23;32963:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32963:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32963:57:0;;;-1:-1:-1;;32963:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33033:8;;33058:21;;;;33081:30;;;;33113:25;;;;33140:27;;;;33033:135;;-1:-1:-1;;;33033:135:0;;32963:57;;-1:-1:-1;;;;;;33033:8:0;;;;:24;;:135;;33058:21;;33081:30;33113:25;33140:27;33033:135;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33181:28;33193:15;33181:11;:28::i;:::-;32688:529;;:::o;25232:79::-;25297:6;;-1:-1:-1;;;;;25297:6:0;25232:79;:::o;28250:41::-;;;;:::o;28479:19::-;;;-1:-1:-1;;;;;28479:19:0;;:::o;42118:114::-;42168:56;42176:42;42220:3;42168:7;:56::i;:::-;42118:114;:::o;30192:105::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;30263:11:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;30263:26:0::1;-1:-1:-1::0;;;;30263:26:0;;::::1;::::0;;;::::1;::::0;;30192:105::o;31917:129::-;31981:15;;:::i;:::-;32015:10;32026:11;32015:23;;;;;;;;;;;;;;;;;32008:30;;;32015:23;;;;;;;;32008:30;;;;;;;;;-1:-1:-1;;32008:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32015:23;;32008:30;;;;32015:23;;32008:30;;32015:23;32008:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32008:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32008:30:0;;;-1:-1:-1;;32008:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31917:129;-1:-1:-1;;31917:129:0:o;35235:5715::-;35414:11;;35374:18;;-1:-1:-1;;;35414:11:0;;;;35413:12;35405:53;;;;-1:-1:-1;;;35405:53:0;;;;;;;:::i;:::-;35493:13;;35477:12;;-1:-1:-1;;;35493:13:0;;;;;-1:-1:-1;35477:29:0;35469:72;;;;-1:-1:-1;;;35469:72:0;;;;;;;:::i;:::-;35575:1;35560:5;:12;:16;35552:80;;;;-1:-1:-1;;;35552:80:0;;;;;;;:::i;:::-;35667:14;:21;35651:5;:12;:37;35643:121;;;;-1:-1:-1;;;35643:121:0;;;;;;;:::i;:::-;35775:23;35812:5;:12;35801:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35801:24:0;;35775:50;;35909:12;35894:9;35904:1;35894:12;;;;;;;;;;;;;:27;;;;;;;;;;;35934:14;35966:5;35972:1;35966:8;;;;;;;;;;;;;;-1:-1:-1;;;;;35951:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35934:50;;35995:14;36027:5;36033:1;36027:8;;;;;;;;;;;;;;-1:-1:-1;;;;;36012:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35995:50;;36073:7;:5;:7::i;:::-;-1:-1:-1;;;;;36059:21:0;:10;-1:-1:-1;;;;;36059:21:0;;36056:158;;36115:4;;-1:-1:-1;;;;;36105:14:0;;;36115:4;;36105:14;;;;:32;;-1:-1:-1;36133:4:0;;-1:-1:-1;;;;;36123:14:0;;;36133:4;;36123:14;;36105:32;36097:105;;;;-1:-1:-1;;;36097:105:0;;;;;;;:::i;:::-;36359:4;;36242:16;;-1:-1:-1;;;;;36349:14:0;;;36359:4;;36349:14;;:32;;-1:-1:-1;36377:4:0;;-1:-1:-1;;;;;36367:14:0;;;36377:4;;36367:14;36349:32;36346:55;;;-1:-1:-1;36397:4:0;36346:55;36456:17;36476:12;:30;;36500:6;36476:30;;;36491:6;36476:30;36456:50;;36583:26;36612:209;36633:37;36660:9;36633:26;:37::i;:::-;36612:209;;;;;;;;;;;;;-1:-1:-1;;;36612:209:0;;;36722:34;36749:6;36722:26;:34::i;:::-;36612:209;;;;;;;;;;;;;-1:-1:-1;;;36612:209:0;;;36777:34;36804:6;36777:26;:34::i;:::-;36612:209;;;;;;;;;;;;;-1:-1:-1;;;36612:209:0;;;:6;:209::i;:::-;36583:238;-1:-1:-1;36930:1:0;36913:3429;36937:9;:16;36933:1;:20;36913:3429;;;36977:14;37009:5;37015:1;37009:8;;;;;;;;;;;;;;-1:-1:-1;;;;;36994:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36977:50;;37042:14;37074:5;37080:1;37074:8;;;;;;;;;;;;;;-1:-1:-1;;;;;37059:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37042:50;;37126:7;:5;:7::i;:::-;-1:-1:-1;;;;;37112:21:0;:10;-1:-1:-1;;;;;37112:21:0;;37109:166;;37172:4;;-1:-1:-1;;;;;37162:14:0;;;37172:4;;37162:14;;;;:32;;-1:-1:-1;37190:4:0;;-1:-1:-1;;;;;37180:14:0;;;37190:4;;37180:14;;37162:32;37154:105;;;;-1:-1:-1;;;37154:105:0;;;;;;;:::i;:::-;37501:4;;-1:-1:-1;;;;;37488:17:0;;;37501:4;;37488:17;;:38;;-1:-1:-1;37522:4:0;;-1:-1:-1;;;;;37509:17:0;;;37522:4;;37509:17;37488:38;37485:597;;;37571:4;;-1:-1:-1;;;;;37561:14:0;;;37571:4;;37561:14;;:32;;-1:-1:-1;37589:4:0;;-1:-1:-1;;;;;37579:14:0;;;37589:4;;37579:14;37561:32;:50;;;-1:-1:-1;37607:4:0;;-1:-1:-1;;;;;37597:14:0;;;37607:4;;37597:14;37561:50;:68;;;-1:-1:-1;37625:4:0;;-1:-1:-1;;;;;37615:14:0;;;37625:4;;37615:14;37561:68;37553:171;;;;-1:-1:-1;;;37553:171:0;;;;;;;:::i;:::-;37485:597;;;37958:9;-1:-1:-1;;;;;37948:19:0;:6;-1:-1:-1;;;;;37948:19:0;;:42;;;;37981:9;-1:-1:-1;;;;;37971:19:0;:6;-1:-1:-1;;;;;37971:19:0;;37948:42;37940:124;;;;-1:-1:-1;;;37940:124:0;;;;;;;:::i;:::-;38266:4;;-1:-1:-1;;;;;38253:17:0;;;38266:4;;38253:17;38250:1999;;;38533:4;;38355;;-1:-1:-1;;;;;;38523:14:0;;;38533:4;;38523:14;;:68;;-1:-1:-1;38551:4:0;;-1:-1:-1;;;;;38541:14:0;;;38551:4;;38541:14;:32;;;;-1:-1:-1;38569:4:0;;-1:-1:-1;;;;;38559:14:0;;;38569:4;;38559:14;;38541:32;:50;;;;-1:-1:-1;38587:4:0;;-1:-1:-1;;;;;38577:14:0;;;38587:4;;38577:14;;38541:50;38520:422;;;38839:4;;38824:12;;-1:-1:-1;;;;;38839:14:0;;;:4;;:14;;;;;38824:12;;38834:1;;38824:12;;;;;;:29;;;:12;;;;;;;;;;;:29;38889:4;;-1:-1:-1;;;;;38889:14:0;;;:4;;:14;:32;;38915:6;38889:32;;;38906:6;38889:32;38877:44;;38520:422;38250:1999;;;39155:4;;-1:-1:-1;;;;;39142:17:0;;;39155:4;;39142:17;:35;;;;-1:-1:-1;39173:4:0;;-1:-1:-1;;;;;39163:14:0;;;39173:4;;39163:14;39142:35;:89;;;-1:-1:-1;39191:4:0;;-1:-1:-1;;;;;39181:14:0;;;39191:4;;39181:14;:32;;;;-1:-1:-1;39209:4:0;;-1:-1:-1;;;;;39199:14:0;;;39209:4;;39199:14;;39181:32;:50;;;;-1:-1:-1;39227:4:0;;-1:-1:-1;;;;;39217:14:0;;;39227:4;;39217:14;;39181:50;39139:1110;;;39349:4;;39334:12;;39311:4;;-1:-1:-1;;;;;;39349:14:0;;;:4;;:14;;;;;39334:12;;39344:1;;39334:12;;;;;;:29;;;:12;;;;;;;;;;;:29;39394:4;;-1:-1:-1;;;;;39394:14:0;;;:4;;:14;:32;;39420:6;39394:32;;39139:1110;39742:9;-1:-1:-1;;;;;39732:19:0;:6;-1:-1:-1;;;;;39732:19:0;;39717:9;39727:1;39717:12;;;;;;;;;;;;;:34;;;;;;;;;;;39916:9;-1:-1:-1;;;;;39906:19:0;:6;-1:-1:-1;;;;;39906:19:0;;:37;;39937:6;39906:37;;;39928:6;39906:37;39894:49;;39139:1110;-1:-1:-1;;36955:3:0;;36913:3429;;;;40473:10;40503:286;;;;;;;;40546:12;40503:286;;;;40589:9;40503:286;;;;40625:5;40503:286;;;;40666:14;40503:286;;;;40713:11;40503:286;;;;;;40766:7;:5;:7::i;:::-;-1:-1:-1;;;;;40752:21:0;:10;:21;40503:286;;40473:327;;;;;;;-1:-1:-1;40473:327:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40473:327:0;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40473:327:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40473:327:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40473:327:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40473:327:0;;;-1:-1:-1;;40473:327:0;;;;;;;;;;;;;;;;;40826:10;:17;40861:81;;40826:17;;-1:-1:-1;40931:10:0;;40826:17;;40861:81;;40875:12;;40861:81;:::i;:::-;;;;;;;;;40901:5;40922:7;:5;:7::i;:::-;-1:-1:-1;;;;;40908:21:0;:10;-1:-1:-1;;;;;40908:21:0;;40861:81;;;;;;;:::i;:::-;;;;;;;;35235:5715;;;;;;;;;;;:::o;28347:27::-;;;-1:-1:-1;;;;;28347:27:0;;:::o;28381:39::-;;;-1:-1:-1;;;;;28381:39:0;;:::o;28875:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28875:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28875:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28875:28:0;;;;;;;-1:-1:-1;;28875:28:0;;;;;;;;;;:::o;31552:308::-;31630:14;31657:31;;:::i;:::-;31691:10;31702;31691:22;;;;;;;;;;;;;;;;;31657:56;;;31691:22;;;;;;;;31657:56;;;;;;;;;-1:-1:-1;;31657:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31691:22;;31657:56;;;;31691:22;;31657:56;;31691:22;31657:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31657:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31657:56:0;;;-1:-1:-1;;31657:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31731:8;;31771:21;;;;31794:30;;;;31826:25;;;;31731:121;;-1:-1:-1;;;31731:121:0;;31657:56;;-1:-1:-1;;;;;;31731:8:0;;;;:39;;:121;;31771:21;;31794:30;31826:25;31731:121;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31724:128;31552:308;-1:-1:-1;;;31552:308:0:o;30077:107::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;30151:13:::1;:25:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;30151:25:0::1;-1:-1:-1::0;;;;30151:25:0;;::::1;::::0;;;::::1;::::0;;30077:107::o;33266:416::-;33360:11;;-1:-1:-1;;;33360:11:0;;;;33359:12;33351:53;;;;-1:-1:-1;;;33351:53:0;;;;;;;:::i;:::-;33415:31;;:::i;:::-;33449:10;33460:11;33449:23;;;;;;;;;;;;;;;;;33415:57;;;33449:23;;;;;;;;33415:57;;;;;;;;;-1:-1:-1;;33415:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33449:23;;33415:57;;;;33449:23;;33415:57;;33449:23;33415:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33415:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33415:57:0;;;-1:-1:-1;;33415:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33485:8;;33523:21;;;;33546:30;;;;33578:25;;;;33605:27;;;;33485:148;;-1:-1:-1;;;33485:148:0;;33415:57;;-1:-1:-1;;;;;;33485:8:0;;;;:24;;:148;;33510:11;;33523:21;;33578:25;33605:27;;33485:148;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33646:28;33658:15;33646:11;:28::i;26177:244::-;25454:12;:10;:12::i;:::-;25444:6;;-1:-1:-1;;;;;25444:6:0;;;:22;;;25436:67;;;;-1:-1:-1;;;25436:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26266:22:0;::::1;26258:73;;;;-1:-1:-1::0;;;26258:73:0::1;;;;;;;:::i;:::-;26368:6;::::0;26347:38:::1;::::0;-1:-1:-1;;;;;26347:38:0;;::::1;::::0;26368:6:::1;::::0;26347:38:::1;::::0;26368:6:::1;::::0;26347:38:::1;26396:6;:17:::0;;-1:-1:-1;;;;;;26396:17:0::1;-1:-1:-1::0;;;;;26396:17:0;;;::::1;::::0;;;::::1;::::0;;26177:244::o;31033:276::-;31100:7;31120:31;;:::i;:::-;31154:10;31165:11;31154:23;;;;;;;;;;;;;;;;;31120:57;;;31154:23;;;;;;;;31120:57;;;;;;;;;-1:-1:-1;;31120:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31154:23;;31120:57;;;;31154:23;;31120:57;;31154:23;31120:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31120:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31120:57:0;;;-1:-1:-1;;31120:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31195:8;;31220:21;;;;31243:30;;;;31275:25;;;;31195:106;;-1:-1:-1;;;31195:106:0;;31120:57;;-1:-1:-1;;;;;;31195:8:0;;;;:24;;:106;;31220:21;;31243:30;31275:25;31195:106;;:::i;11175:390::-;11234:13;;11338:43;11363:5;-1:-1:-1;;;11338:24:0;:43::i;:::-;11315:66;;11402:6;11396:20;11420:1;11396:25;11392:142;;;11500:22;11516:5;11500:15;:22::i;:::-;11493:29;;;;;23500:106;23588:10;23500:106;:::o;17178:471::-;17236:7;17481:6;17477:47;;-1:-1:-1;17511:1:0;17504:8;;17477:47;17548:5;;;17552:1;17548;:5;:1;17572:5;;;;;:10;17564:56;;;;-1:-1:-1;;;17564:56:0;;;;;;;:::i;:::-;17640:1;-1:-1:-1;17178:471:0;;;;;:::o;18117:132::-;18175:7;18202:39;18206:1;18209;18202:39;;;;;;;;;;;;;;;;;:3;:39::i;41241:375::-;41401:12;41415:17;41436:5;-1:-1:-1;;;;;41436:10:0;41470;41482:2;41486:5;41447:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41447:45:0;;;;;;;;;;;41436:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41400:93;;;;41516:7;:57;;;;-1:-1:-1;41528:11:0;;:16;;:44;;;41559:4;41548:24;;;;;;;;;;;;:::i;:::-;41508:100;;;;-1:-1:-1;;;41508:100:0;;;;;;;:::i;:::-;41241:375;;;;;:::o;21864:508::-;22281:4;22327:17;22359:7;21864:508;:::o;24810:129::-;21463:12;;;;;;;;:31;;;21479:15;:13;:15::i;:::-;21463:47;;;-1:-1:-1;21499:11:0;;;;21498:12;21463:47;21455:106;;;;-1:-1:-1;;;21455:106:0;;;;;;;:::i;:::-;21570:19;21593:12;;;;;;21592:13;21612:83;;;;21641:12;:19;;-1:-1:-1;;;;21641:19:0;;;;;21669:18;21656:4;21669:18;;;21612:83;24868:26:::1;:24;:26::i;:::-;24905;:24;:26::i;:::-;21717:14:::0;21713:57;;;21757:5;21742:20;;-1:-1:-1;;21742:20:0;;;24810:129;:::o;33690:1051::-;33823:19;33845:15;:25;;;33871:1;33845:28;;;;;;;;;;;;;;:178;;33989:15;:21;;;34011:1;33989:24;;;;;;;;;;;;;;-1:-1:-1;;;;;33974:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33845:178;;;33905:15;:21;;;33927:1;33905:24;;;;;;;;;;;;;;-1:-1:-1;;;;;33890:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33823:200;;34092:14;34116:11;-1:-1:-1;;;;;34109:29:0;;34147:4;34109:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34092:61;;34267:15;:22;;;34264:269;;;34306:87;34319:11;34332:10;34344:48;34387:4;34344:38;34355:26;;34344:6;:10;;:38;;;;:::i;34306:87::-;34264:269;;;34435:86;34448:11;34461:10;34473:47;34515:4;34473:37;34484:25;;34473:6;:10;;:37;;;;:::i;34435:86::-;34675:11;;34688:44;;-1:-1:-1;;;34688:44:0;;34649:84;;34662:11;;-1:-1:-1;;;;;34675:11:0;;;;34688:29;;;;;:44;;34726:4;;34688:44;;;:::i;41038:195::-;41209:16;;-1:-1:-1;;;;;41209:11:0;;;:16;;;;;41221:3;;41209:16;;;;41221:3;41209:11;:16;;;;;;;;;;;;;;;;;;;42277:220;42418:13;42475:1;42478;42480;42482;42484;42486;42458:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42444:45;;42277:220;;;;;;;;:::o;10378:668::-;10545:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10545:32:0;-1:-1:-1;;;;;;10545:32:0;;;;;10528:50;;10466:13;;10493:12;;10466:13;;-1:-1:-1;;;;;10528:16:0;;;:50;;10545:32;10528:50;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10492:86;;;;10669:7;10668:8;:28;;;-1:-1:-1;10680:11:0;;:16;10668:28;10664:70;;;10713:9;;;;;;;;;;;;;;;;;;10664:70;10794:4;:11;10809:2;10794:17;10790:229;;;10828:15;10857:4;10846:27;;;;;;;;;;;;:::i;:::-;10828:45;;10895:24;10911:7;10895:15;:24::i;:::-;10888:31;;;;;;;10790:229;10955:2;10941:4;:11;:16;10937:82;;;10992:4;10981:26;;;;;;;;;;;;:::i;:::-;10974:33;;;;;;10937:82;-1:-1:-1;;11029:9:0;;;;;;;;;-1:-1:-1;11029:9:0;;;10378:668;-1:-1:-1;;;10378:668:0:o;10106:144::-;10168:13;10201:41;10233:5;10240:1;10201:31;:41::i;18737:345::-;18823:7;18925:12;18918:5;18910:28;;;;-1:-1:-1;;;18910:28:0;;;;;;;;:::i;:::-;;18949:9;18965:1;18961;:5;;;;;;;18737:345;-1:-1:-1;;;;;18737:345:0:o;23421:69::-;21463:12;;;;;;;;:31;;;21479:15;:13;:15::i;:::-;21463:47;;;-1:-1:-1;21499:11:0;;;;21498:12;21463:47;21455:106;;;;-1:-1:-1;;;21455:106:0;;;;;;;:::i;:::-;21570:19;21593:12;;;;;;21592:13;21612:83;;;;21641:12;:19;;-1:-1:-1;;;;21641:19:0;;;;;21669:18;21656:4;21669:18;;;21717:14;21713:57;;;21757:5;21742:20;;-1:-1:-1;;21742:20:0;;;23421:69;:::o;24947:202::-;21463:12;;;;;;;;:31;;;21479:15;:13;:15::i;:::-;21463:47;;;-1:-1:-1;21499:11:0;;;;21498:12;21463:47;21455:106;;;;-1:-1:-1;;;21455:106:0;;;;;;;:::i;:::-;21570:19;21593:12;;;;;;21592:13;21612:83;;;;21641:12;:19;;-1:-1:-1;;;;21641:19:0;;;;;21669:18;21656:4;21669:18;;;21612:83;25019:17:::1;25039:12;:10;:12::i;:::-;25062:6;:18:::0;;-1:-1:-1;;;;;;25062:18:0::1;-1:-1:-1::0;;;;;25062:18:0;::::1;::::0;;::::1;::::0;;;25096:43:::1;::::0;25062:18;;-1:-1:-1;25062:18:0;-1:-1:-1;;25096:43:0::1;::::0;-1:-1:-1;;25096:43:0::1;21703:1;21717:14:::0;21713:57;;;21757:5;21742:20;;-1:-1:-1;;21742:20:0;;;24947:202;:::o;8503:588::-;8614:13;;;8624:2;8614:13;;;;;;;;;8561;;;;8614;;;;;;;;;;;-1:-1:-1;8614:13:0;8587:40;;8638:14;8672:6;8667:196;8688:2;8684:1;:6;8667:196;;;8712:9;8724:1;8726;8724:4;;;;;;;;;;;-1:-1:-1;;;;;;;8747:9:0;;;8743:109;;8802:4;8777:11;8789:9;8777:22;;;;;;;;;;;:29;-1:-1:-1;;;;;8777:29:0;;;;;;;;-1:-1:-1;8825:11:0;;;;;8743:109;-1:-1:-1;8692:3:0;;8667:196;;;;8873:31;8917:9;8907:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8907:20:0;;8873:54;;8943:6;8938:102;8959:9;8955:1;:13;8938:102;;;9014:11;9026:1;9014:14;;;;;;;;;;;;;;;;8990:18;9009:1;8990:21;;;;;;;;;;;:38;-1:-1:-1;;;;;8990:38:0;;;;;;;;-1:-1:-1;8970:3:0;;8938:102;;;-1:-1:-1;9064:18:0;8503:588;-1:-1:-1;;;;8503:588:0:o;6978:796::-;7048:13;7088:1;7082:3;:7;:12;:23;;;;;7104:1;7098:3;:7;7082:23;:36;;;;;7116:2;7109:3;:9;;7082:36;7074:79;;;;-1:-1:-1;;;7074:79:0;;;;;;;:::i;:::-;7166:14;7193:3;7183:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7183:14:0;-1:-1:-1;7166:31:0;-1:-1:-1;;;;;;7223:10:0;;7208:12;7244:496;7271:1;7265:3;:7;7261:1;:11;7244:496;;;7435:1;7440:2;:6;;;7435:12;7423:25;;;7542:6;7547:1;7542:6;;;;7648:7;;;7643:13;;7682:8;7542:6;7682:4;:8::i;:::-;7671:1;7677;7673;:5;7671:8;;;;;;;;;;;:19;-1:-1:-1;;;;;7671:19:0;;;;;;;;;7720:8;7725:2;7720:4;:8::i;:::-;7705:1;7711;7707;:5;7715:1;7707:9;7705:12;;;;;;;;;;;:23;-1:-1:-1;;;;;7705:23:0;;;;;;;;-1:-1:-1;;7274:3:0;;;;;-1:-1:-1;7244:496:0;;-1:-1:-1;7244:496:0;;-1:-1:-1;7764:1:0;;6978:796;-1:-1:-1;;;;6978:796:0:o;7981:185::-;8026:6;8053:2;8049:1;:6;;;8045:114;;;-1:-1:-1;8088:4:0;8084:8;;8079:14;;8072:21;;8045:114;-1:-1:-1;8142:4:0;8138:8;;8133:14;;8126:21;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;301:707;;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;:::-;495:80;:::i;:::-;603:21;;;486:89;-1:-1;647:4;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;786:1;;776:12;734:2;811:1;796:206;821:6;818:1;815:13;796:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;889:50;;953:14;;;;981;;;;843:1;836:9;796:206;;;800:14;;;;;378:630;;;;:::o;3020:241::-;;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;-1:-1;;3130:12;3092:2;85:6;72:20;97:33;124:5;97:33;:::i;3268:263::-;;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;-1:-1;;3389:12;3351:2;226:6;220:13;238:33;265:5;238:33;:::i;3538:366::-;;;3659:2;3647:9;3638:7;3634:23;3630:32;3627:2;;;-1:-1;;3665:12;3627:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3717:63;-1:-1;3817:2;3856:22;;72:20;97:33;72:20;97:33;:::i;:::-;3825:63;;;;3621:283;;;;;:::o;3911:366::-;;;4032:2;4020:9;4011:7;4007:23;4003:32;4000:2;;;-1:-1;;4038:12;4000:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4090:63;4190:2;4229:22;;;;2676:20;;-1:-1;;;3994:283::o;4284:235::-;;4385:2;4373:9;4364:7;4360:23;4356:32;4353:2;;;-1:-1;;4391:12;4353:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;4526:257::-;;4638:2;4626:9;4617:7;4613:23;4609:32;4606:2;;;-1:-1;;4644:12;4606:2;1961:6;1955:13;1973:30;1997:5;1973:30;:::i;4790:496::-;;;4933:2;4921:9;4912:7;4908:23;4904:32;4901:2;;;-1:-1;;4939:12;4901:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;:::-;4991:60;-1:-1;5116:2;5101:18;;5088:32;5140:18;5129:30;;5126:2;;;-1:-1;;5162:12;5126:2;5192:78;5262:7;5253:6;5242:9;5238:22;5192:78;:::i;:::-;5182:88;;;4895:391;;;;;:::o;5293:757::-;;;;5478:2;5466:9;5457:7;5453:23;5449:32;5446:2;;;-1:-1;;5484:12;5446:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;:::-;5536:60;-1:-1;5661:2;5646:18;;;5633:32;5685:18;5674:30;;;5671:2;;;-1:-1;;5707:12;5671:2;5737:78;5807:7;5798:6;5787:9;5783:22;5737:78;:::i;:::-;5727:88;;5880:2;5869:9;5865:18;5852:32;5838:46;;5685:18;5896:6;5893:30;5890:2;;;-1:-1;;5926:12;5890:2;-1:-1;6002:22;;1144:4;1132:17;;1128:27;-1:-1;1118:2;;-1:-1;;1159:12;1118:2;1206:6;1193:20;1228:80;1243:64;1300:6;1243:64;:::i;1228:80::-;1336:21;;;1393:14;;;;1368:17;;;1482;;;1473:27;;;;1470:36;-1:-1;1467:2;;;-1:-1;;1509:12;1467:2;-1:-1;1535:10;;1529:206;1554:6;1551:1;1548:13;1529:206;;;2676:20;;1622:50;;1576:1;1569:9;;;;;1686:14;;;;1714;;1529:206;;;1533:14;5946:88;;;;;;;;5440:610;;;;;:::o;6057:263::-;;6172:2;6160:9;6151:7;6147:23;6143:32;6140:2;;;-1:-1;;6178:12;6140:2;-1:-1;2093:13;;6134:186;-1:-1;6134:186::o;6327:362::-;;6452:2;6440:9;6431:7;6427:23;6423:32;6420:2;;;-1:-1;;6458:12;6420:2;6509:17;6503:24;6547:18;;6539:6;6536:30;6533:2;;;-1:-1;;6569:12;6533:2;6656:6;6645:9;6641:22;;;2270:3;2263:4;2255:6;2251:17;2247:27;2237:2;;-1:-1;;2278:12;2237:2;2318:6;2312:13;6547:18;36190:6;36187:30;36184:2;;;-1:-1;;36220:12;36184:2;2340:65;36293:9;36274:17;;-1:-1;;36270:33;6452:2;36351:15;2340:65;:::i;:::-;2331:74;;2425:6;2418:5;2411:21;2529:3;6452:2;2520:6;2453;2511:16;;2508:25;2505:2;;;-1:-1;;2536:12;2505:2;2556:39;2588:6;6452:2;2487:5;2483:16;6452:2;2453:6;2449:17;2556:39;:::i;6696:241::-;;6800:2;6788:9;6779:7;6775:23;6771:32;6768:2;;;-1:-1;;6806:12;6768:2;-1:-1;2676:20;;6762:175;-1:-1;6762:175::o;7214:366::-;;;7335:2;7323:9;7314:7;7310:23;7306:32;7303:2;;;-1:-1;;7341:12;7303:2;-1:-1;;2676:20;;;7493:2;7532:22;;;2676:20;;-1:-1;7297:283::o;7587:237::-;;7689:2;7677:9;7668:7;7664:23;7660:32;7657:2;;;-1:-1;;7695:12;7657:2;2965:6;2952:20;40156:4;41467:5;40145:16;41444:5;41441:33;41431:2;;-1:-1;;41478:12;8626:670;;8809:5;36957:12;38003:6;37998:3;37991:19;38040:4;;38035:3;38031:14;8821:83;;38040:4;8975:5;36498:14;-1:-1;9014:260;9039:6;9036:1;9033:13;9014:260;;;9100:13;;-1:-1;;;;;39940:54;8426:37;;7985:14;;;;37629;;;;5140:18;9054:9;9014:260;;;-1:-1;9280:10;;8740:556;-1:-1;;;;;8740:556::o;10058:646::-;;10232:5;36957:12;38003:6;37998:3;37991:19;38040:4;;38035:3;38031:14;10244:80;;38040:4;10392:5;36498:14;-1:-1;10431:251;10456:6;10453:1;10450:13;10431:251;;;10517:13;;39773;39766:21;12904:34;;8155:14;;;;37629;;;;10478:1;10471:9;10431:251;;11442:670;;11625:5;36957:12;38003:6;37998:3;37991:19;38040:4;;38035:3;38031:14;11637:83;;38040:4;11791:5;36498:14;-1:-1;11830:260;11855:6;11852:1;11849:13;11830:260;;;11916:13;;21690:37;;8337:14;;;;37629;;;;11877:1;11870:9;11830:260;;13621:327;;13756:5;36957:12;38003:6;37998:3;37991:19;13840:52;13885:6;38040:4;38035:3;38031:14;38040:4;13866:5;13862:16;13840:52;:::i;:::-;36293:9;40857:14;-1:-1;;40853:28;13904:39;;;;38040:4;13904:39;;13703:245;-1:-1;;13703:245::o;21859:271::-;;13221:5;36957:12;13332:52;13377:6;13372:3;13365:4;13358:5;13354:16;13332:52;:::i;:::-;13396:16;;;;;21993:137;-1:-1;;21993:137::o;22419:1080::-;;13221:5;36957:12;13365:4;13332:52;13377:6;13372:3;13365:4;13358:5;13354:16;13332:52;:::i;:::-;36957:12;;13396:16;;;;13332:52;36957:12;13396:16;13354;;;13332:52;:::i;:::-;36957:12;;13396:16;;;13332:52;36957:12;13396:16;13354;;;13332:52;:::i;:::-;36957:12;;13396:16;;;13332:52;36957:12;13396:16;13354;;;13332:52;:::i;:::-;36957:12;;13396:16;;;13332:52;36957:12;13396:16;13354;;;13332:52;:::i;:::-;36957:12;;13396:16;;;13332:52;36957:12;13396:16;13354;;;13332:52;:::i;:::-;13396:16;;;;;22795:704;-1:-1;;;;;;;;;22795:704::o;23506:222::-;-1:-1;;;;;39940:54;;;;8426:37;;23633:2;23618:18;;23604:124::o;23735:333::-;-1:-1;;;;;39940:54;;;;8426:37;;24054:2;24039:18;;21690:37;23890:2;23875:18;;23861:207::o;24075:876::-;;24402:2;24423:17;24416:47;24477:108;24402:2;24391:9;24387:18;24571:6;24477:108;:::i;:::-;24633:9;24627:4;24623:20;24618:2;24607:9;24603:18;24596:48;24658:108;24761:4;24752:6;24658:108;:::i;:::-;24650:116;;24814:9;24808:4;24804:20;24799:2;24788:9;24784:18;24777:48;24839:102;24936:4;24927:6;24839:102;:::i;:::-;24831:110;24373:578;-1:-1;;;;;;24373:578::o;24958:976::-;;25307:3;25329:17;25322:47;25383:108;25307:3;25296:9;25292:19;25477:6;25383:108;:::i;:::-;25539:9;25533:4;25529:20;25524:2;25513:9;25509:18;25502:48;25564:108;25667:4;25658:6;25564:108;:::i;:::-;25556:116;;25720:9;25714:4;25710:20;25705:2;25694:9;25690:18;25683:48;25745:102;25842:4;25833:6;25745:102;:::i;:::-;25737:110;;;12931:5;39773:13;39766:21;25920:2;25909:9;25905:18;12904:34;25278:656;;;;;;;:::o;25941:469::-;;26140:2;26161:17;26154:47;26215:108;26140:2;26129:9;26125:18;26309:6;26215:108;:::i;:::-;26207:116;;12931:5;39773:13;39766:21;26396:2;26385:9;26381:18;12904:34;26111:299;;;;;:::o;26710:310::-;;26857:2;26878:17;26871:47;26932:78;26857:2;26846:9;26842:18;26996:6;26932:78;:::i;27027:508::-;;27218:2;27239:17;27232:47;27293:78;27218:2;27207:9;27203:18;27357:6;27293:78;:::i;:::-;39773:13;;39766:21;27444:2;27429:18;;12904:34;-1:-1;39773:13;;39766:21;27521:2;27506:18;;;12904:34;27285:86;27189:346;-1:-1;27189:346::o;27542:416::-;27742:2;27756:47;;;14901:2;27727:18;;;37991:19;14937:34;38031:14;;;14917:55;15006:30;14992:12;;;14985:52;15056:12;;;27713:245::o;27965:416::-;28165:2;28179:47;;;15307:2;28150:18;;;37991:19;15343:34;38031:14;;;15323:55;-1:-1;;;15398:12;;;15391:30;15440:12;;;28136:245::o;28388:416::-;28588:2;28602:47;;;15691:2;28573:18;;;37991:19;15727:34;38031:14;;;15707:55;-1:-1;;;15782:12;;;15775:33;15827:12;;;28559:245::o;28811:416::-;29011:2;29025:47;;;16078:2;28996:18;;;37991:19;16114:34;38031:14;;;16094:55;16183:34;16169:12;;;16162:56;-1:-1;;;16238:12;;;16231:31;16281:12;;;28982:245::o;29234:416::-;29434:2;29448:47;;;16532:2;29419:18;;;37991:19;16568:32;38031:14;;;16548:53;16620:12;;;29405:245::o;29657:416::-;29857:2;29871:47;;;16871:2;29842:18;;;37991:19;16907:30;38031:14;;;16887:51;16957:12;;;29828:245::o;30080:416::-;30280:2;30294:47;;;17208:2;30265:18;;;37991:19;17244:32;38031:14;;;17224:53;17296:12;;;30251:245::o;30503:416::-;30703:2;30717:47;;;17547:2;30688:18;;;37991:19;17583:34;38031:14;;;17563:55;-1:-1;;;17638:12;;;17631:25;17675:12;;;30674:245::o;30926:416::-;31126:2;31140:47;;;17926:2;31111:18;;;37991:19;17962:34;38031:14;;;17942:55;-1:-1;;;18017:12;;;18010:33;18062:12;;;31097:245::o;31349:416::-;31549:2;31563:47;;;18313:2;31534:18;;;37991:19;18349:34;38031:14;;;18329:55;18418:34;18404:12;;;18397:56;-1:-1;;;18473:12;;;18466:29;18514:12;;;31520:245::o;31772:416::-;31972:2;31986:47;;;31957:18;;;37991:19;18801:34;38031:14;;;18781:55;18855:12;;;31943:245::o;32195:416::-;32395:2;32409:47;;;19106:2;32380:18;;;37991:19;19142:34;38031:14;;;19122:55;-1:-1;;;19197:12;;;19190:38;19247:12;;;32366:245::o;32618:416::-;32818:2;32832:47;;;19498:2;32803:18;;;37991:19;19534:34;38031:14;;;19514:55;-1:-1;;;19589:12;;;19582:43;19644:12;;;32789:245::o;33041:416::-;33241:2;33255:47;;;19895:2;33226:18;;;37991:19;19931:32;38031:14;;;19911:53;19983:12;;;33212:245::o;33464:374::-;;33643:2;33664:17;33657:47;20333:16;20327:23;20253:4;33643:2;33632:9;33628:18;20363:38;20416:73;20244:14;33632:9;20244:14;20470:12;20416:73;:::i;:::-;20408:81;;33643:2;20572:5;20568:16;20562:23;36293:9;;20621:14;33632:9;20625:4;20621:14;;20605;33632:9;20605:14;20598:38;20651:97;20743:4;20729:12;20651:97;:::i;:::-;20643:105;;20605:14;20827:5;20823:16;20817:23;20797:43;;20621:14;33632:9;20880:4;20876:14;;20860;33632:9;20860:14;20853:38;20906:103;21004:4;20990:12;20906:103;:::i;:::-;20898:111;;20860:14;21097:5;21093:16;21087:23;21067:43;;20621:14;33632:9;21150:4;21146:14;;21130;33632:9;21130:14;21123:38;;21176:103;21274:4;21260:12;21176:103;:::i;:::-;21168:111;;;21130:14;21364:5;21360:16;21354:23;39773:13;39766:21;21425:14;33632:9;21425:14;12904:34;21425:14;21514:5;21510:16;21504:23;39773:13;39766:21;20253:4;33632:9;21575:14;12904:34;33710:118;;;;33614:224;;;;:::o;33845:222::-;21690:37;;;33972:2;33957:18;;33943:124::o;34074:1088::-;;21720:5;21697:3;21690:37;34451:3;34570:2;34559:9;34555:18;34548:48;34610:108;34451:3;34440:9;34436:19;34704:6;34610:108;:::i;:::-;34766:9;34760:4;34756:20;34751:2;34740:9;34736:18;34729:48;34791:108;34894:4;34885:6;34791:108;:::i;:::-;34783:116;;34947:9;34941:4;34937:20;34932:2;34921:9;34917:18;34910:48;34972:102;35069:4;35060:6;34972:102;:::i;:::-;34964:110;;;12931:5;39773:13;39766:21;35147:3;35136:9;35132:19;12904:34;34422:740;;;;;;;;:::o;35169:256::-;35231:2;35225:9;35257:17;;;35332:18;35317:34;;35353:22;;;35314:62;35311:2;;;35389:1;;35379:12;35311:2;35231;35398:22;35209:216;;-1:-1;35209:216::o;35432:304::-;;35591:18;35583:6;35580:30;35577:2;;;-1:-1;;35613:12;35577:2;-1:-1;35658:4;35646:17;;;35711:15;;35514:222::o;40513:268::-;40578:1;40585:101;40599:6;40596:1;40593:13;40585:101;;;40666:11;;;40660:18;40647:11;;;40640:39;40621:2;40614:10;40585:101;;;40701:6;40698:1;40695:13;40692:2;;;40578:1;40757:6;40752:3;40748:16;40741:27;40692:2;;40562:219;;;:::o;40894:117::-;-1:-1;;;;;39940:54;;40953:35;;40943:2;;41002:1;;40992:12;41018:111;41099:5;39773:13;39766:21;41077:5;41074:32;41064:2;;41120:1;;41110:12
Swarm Source
ipfs://025dab63695b3f2d9955670ad345ee76f624bbf9dc07eeb57d677f005ffbb14b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.