Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
ConvexStakingWrapperFrax
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-01 */ // File: contracts\interfaces\IRewardStaking.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IRewardStaking { function stakeFor(address, uint256) external; function stake( uint256) external; function withdraw(uint256 amount, bool claim) external; function withdrawAndUnwrap(uint256 amount, bool claim) external; function earned(address account) external view returns (uint256); function getReward() external; function getReward(address _account, bool _claimExtras) external; function extraRewardsLength() external view returns (uint256); function extraRewards(uint256 _pid) external view returns (address); function rewardToken() external view returns (address); function balanceOf(address _account) external view returns (uint256); } // File: contracts\interfaces\IConvexDeposits.sol pragma solidity 0.6.12; interface IConvexDeposits { function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns(bool); function deposit(uint256 _amount, bool _lock, address _stakeAddress) external; } // File: contracts\interfaces\ICvx.sol pragma solidity 0.6.12; interface ICvx { function reductionPerCliff() external view returns(uint256); function totalSupply() external view returns(uint256); function totalCliffs() external view returns(uint256); function maxSupply() external view returns(uint256); } // File: contracts\interfaces\CvxMining.sol pragma solidity 0.6.12; library CvxMining{ ICvx public constant cvx = ICvx(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B); function ConvertCrvToCvx(uint256 _amount) external view returns(uint256){ uint256 supply = cvx.totalSupply(); uint256 reductionPerCliff = cvx.reductionPerCliff(); uint256 totalCliffs = cvx.totalCliffs(); uint256 maxSupply = cvx.maxSupply(); uint256 cliff = supply / reductionPerCliff; //mint if below total cliffs if(cliff < totalCliffs){ //for reduction% take inverse of current cliff uint256 reduction = totalCliffs - cliff; //reduce _amount = _amount * reduction / totalCliffs; //supply cap check uint256 amtTillMax = maxSupply - supply; if(_amount > amtTillMax){ _amount = amtTillMax; } //mint return _amount; } return 0; } } // File: contracts\interfaces\IBooster.sol pragma solidity 0.6.12; interface IBooster { function owner() external view returns(address); function setVoteDelegate(address _voteDelegate) external; function vote(uint256 _voteId, address _votingAddress, bool _support) external returns(bool); function voteGaugeWeight(address[] calldata _gauge, uint256[] calldata _weight ) external returns(bool); function poolInfo(uint256 _pid) external returns(address _lptoken, address _token, address _gauge, address _crvRewards, address _stash, bool _shutdown); } // File: @openzeppelin\contracts\math\SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin\contracts\token\ERC20\IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin\contracts\utils\Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\token\ERC20\SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin\contracts\utils\Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { 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; } } // File: @openzeppelin\contracts\token\ERC20\ERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: @openzeppelin\contracts\utils\ReentrancyGuard.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts\wrappers\ConvexStakingWrapper.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; //Example of a tokenize a convex staked position. //if used as collateral some modifications will be needed to fit the specific platform //Based on Curve.fi's gauge wrapper implementations at https://github.com/curvefi/curve-dao-contracts/tree/master/contracts/gauges/wrappers contract ConvexStakingWrapper is ERC20, ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; struct EarnedData { address token; uint256 amount; } struct RewardType { address reward_token; address reward_pool; uint128 reward_integral; uint128 reward_remaining; mapping(address => uint256) reward_integral_for; mapping(address => uint256) claimable_reward; } //constants/immutables address public constant convexBooster = address(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); address public constant crv = address(0xD533a949740bb3306d119CC777fa900bA034cd52); address public constant cvx = address(0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B); address public curveToken; address public convexToken; address public convexPool; uint256 public convexPoolId; address public collateralVault; uint256 private constant CRV_INDEX = 0; uint256 private constant CVX_INDEX = 1; //rewards RewardType[] public rewards; mapping(address => uint256) public registeredRewards; //management bool public isShutdown; bool public isInit; address public owner; string internal _tokenname; string internal _tokensymbol; event Deposited(address indexed _user, address indexed _account, uint256 _amount, bool _wrapped); event Withdrawn(address indexed _user, uint256 _amount, bool _unwrapped); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() public ERC20( "StakedConvexToken", "stkCvx" ){ } function initialize(uint256 _poolId) virtual external { require(!isInit,"already init"); owner = msg.sender; emit OwnershipTransferred(address(0), owner); (address _lptoken, address _token, , address _rewards, , ) = IBooster(convexBooster).poolInfo(_poolId); curveToken = _lptoken; convexToken = _token; convexPool = _rewards; convexPoolId = _poolId; _tokenname = string(abi.encodePacked("Staked ", ERC20(_token).name() )); _tokensymbol = string(abi.encodePacked("stk", ERC20(_token).symbol())); isShutdown = false; isInit = true; // collateralVault = _vault; //add rewards addRewards(); setApprovals(); } function name() public view override returns (string memory) { return _tokenname; } function symbol() public view override returns (string memory) { return _tokensymbol; } function decimals() public view override returns (uint8) { return 18; } modifier onlyOwner() { require(owner == msg.sender, "Ownable: caller is not the 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; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); } function shutdown() external onlyOwner { isShutdown = true; } function setApprovals() public { IERC20(curveToken).safeApprove(convexBooster, 0); IERC20(curveToken).safeApprove(convexBooster, uint256(-1)); IERC20(convexToken).safeApprove(convexPool, 0); IERC20(convexToken).safeApprove(convexPool, uint256(-1)); } function addRewards() public { address mainPool = convexPool; if (rewards.length == 0) { rewards.push( RewardType({ reward_token: crv, reward_pool: mainPool, reward_integral: 0, reward_remaining: 0 }) ); rewards.push( RewardType({ reward_token: cvx, reward_pool: address(0), reward_integral: 0, reward_remaining: 0 }) ); registeredRewards[crv] = CRV_INDEX+1; //mark registered at index+1 registeredRewards[cvx] = CVX_INDEX+1; //mark registered at index+1 //send to self to warmup state IERC20(crv).transfer(address(this),0); //send to self to warmup state IERC20(cvx).transfer(address(this),0); } uint256 extraCount = IRewardStaking(mainPool).extraRewardsLength(); for (uint256 i = 0; i < extraCount; i++) { address extraPool = IRewardStaking(mainPool).extraRewards(i); address extraToken = IRewardStaking(extraPool).rewardToken(); if(extraToken == cvx){ //update cvx reward pool address rewards[CVX_INDEX].reward_pool = extraPool; }else if(registeredRewards[extraToken] == 0){ //add new token to list rewards.push( RewardType({ reward_token: IRewardStaking(extraPool).rewardToken(), reward_pool: extraPool, reward_integral: 0, reward_remaining: 0 }) ); registeredRewards[extraToken] = rewards.length; //mark registered at index+1 } } } function rewardLength() external view returns(uint256) { return rewards.length; } function _getDepositedBalance(address _account) internal virtual view returns(uint256) { if (_account == address(0) || _account == collateralVault) { return 0; } //get balance from collateralVault return balanceOf(_account); } function _getTotalSupply() internal virtual view returns(uint256){ //override and add any supply needed (interest based growth) return totalSupply(); } function _calcRewardIntegral(uint256 _index, address[2] memory _accounts, uint256[2] memory _balances, uint256 _supply, bool _isClaim) internal{ RewardType storage reward = rewards[_index]; //get difference in balance and remaining rewards //getReward is unguarded so we use reward_remaining to keep track of how much was actually claimed uint256 bal = IERC20(reward.reward_token).balanceOf(address(this)); // uint256 d_reward = bal.sub(reward.reward_remaining); if (_supply > 0 && bal.sub(reward.reward_remaining) > 0) { reward.reward_integral = reward.reward_integral + uint128(bal.sub(reward.reward_remaining).mul(1e20).div(_supply)); } //update user integrals for (uint256 u = 0; u < _accounts.length; u++) { //do not give rewards to address 0 if (_accounts[u] == address(0)) continue; if (_accounts[u] == collateralVault) continue; if(_isClaim && u != 0) continue; //only update/claim for first address and use second as forwarding uint userI = reward.reward_integral_for[_accounts[u]]; if(_isClaim || userI < reward.reward_integral){ if(_isClaim){ uint256 receiveable = reward.claimable_reward[_accounts[u]].add(_balances[u].mul( uint256(reward.reward_integral).sub(userI)).div(1e20)); if(receiveable > 0){ reward.claimable_reward[_accounts[u]] = 0; //cheat for gas savings by transfering to the second index in accounts list //if claiming only the 0 index will update so 1 index can hold forwarding info //guaranteed to have an address in u+1 so no need to check IERC20(reward.reward_token).safeTransfer(_accounts[u+1], receiveable); bal = bal.sub(receiveable); } }else{ reward.claimable_reward[_accounts[u]] = reward.claimable_reward[_accounts[u]].add(_balances[u].mul( uint256(reward.reward_integral).sub(userI)).div(1e20)); } reward.reward_integral_for[_accounts[u]] = reward.reward_integral; } } //update remaining reward here since balance could have changed if claiming if(bal != reward.reward_remaining){ reward.reward_remaining = uint128(bal); } } function _checkpoint(address[2] memory _accounts) internal nonReentrant{ //if shutdown, no longer checkpoint in case there are problems if(isShutdown) return; uint256 supply = _getTotalSupply(); uint256[2] memory depositedBalance; depositedBalance[0] = _getDepositedBalance(_accounts[0]); depositedBalance[1] = _getDepositedBalance(_accounts[1]); IRewardStaking(convexPool).getReward(address(this), true); _claimExtras(); uint256 rewardCount = rewards.length; for (uint256 i = 0; i < rewardCount; i++) { _calcRewardIntegral(i,_accounts,depositedBalance,supply,false); } } function _checkpointAndClaim(address[2] memory _accounts) internal nonReentrant{ uint256 supply = _getTotalSupply(); uint256[2] memory depositedBalance; depositedBalance[0] = _getDepositedBalance(_accounts[0]); //only do first slot IRewardStaking(convexPool).getReward(address(this), true); _claimExtras(); uint256 rewardCount = rewards.length; for (uint256 i = 0; i < rewardCount; i++) { _calcRewardIntegral(i,_accounts,depositedBalance,supply,true); } } //claim any rewards not part of the convex pool function _claimExtras() internal virtual{ //override and add external reward claiming } function user_checkpoint(address _account) external returns(bool) { _checkpoint([_account, address(0)]); return true; } function totalBalanceOf(address _account) external view returns(uint256){ return _getDepositedBalance(_account); } //run earned as a mutable function to claim everything before calculating earned rewards function earned(address _account) external returns(EarnedData[] memory claimable) { IRewardStaking(convexPool).getReward(address(this), true); _claimExtras(); return _earned(_account); } //run earned as a non-mutative function that may not claim everything, but should report standard convex rewards function earnedView(address _account) external view returns(EarnedData[] memory claimable) { return _earned(_account); } function _earned(address _account) internal view returns(EarnedData[] memory claimable) { uint256 supply = _getTotalSupply(); // uint256 depositedBalance = _getDepositedBalance(_account); uint256 rewardCount = rewards.length; claimable = new EarnedData[](rewardCount); for (uint256 i = 0; i < rewardCount; i++) { RewardType storage reward = rewards[i]; //change in reward is current balance - remaining reward + earned uint256 bal = IERC20(reward.reward_token).balanceOf(address(this)); uint256 d_reward = bal.sub(reward.reward_remaining); //some rewards (like minted cvx) may not have a reward pool directly on the convex pool so check if it exists if(reward.reward_pool != address(0)){ //add earned from the convex reward pool for the given token d_reward = d_reward.add(IRewardStaking(reward.reward_pool).earned(address(this))); } uint256 I = reward.reward_integral; if (supply > 0) { I = I + d_reward.mul(1e20).div(supply); } uint256 newlyClaimable = _getDepositedBalance(_account).mul(I.sub(reward.reward_integral_for[_account])).div(1e20); claimable[i].amount = claimable[i].amount.add(reward.claimable_reward[_account].add(newlyClaimable)); claimable[i].token = reward.reward_token; //calc cvx minted from crv and add to cvx claimables //note: crv is always index 0 so will always run before cvx if(i == CRV_INDEX){ //because someone can call claim for the pool outside of checkpoints, need to recalculate crv without the local balance I = reward.reward_integral; if (supply > 0) { I = I + IRewardStaking(reward.reward_pool).earned(address(this)).mul(1e20).div(supply); } newlyClaimable = _getDepositedBalance(_account).mul(I.sub(reward.reward_integral_for[_account])).div(1e20); claimable[CVX_INDEX].amount = CvxMining.ConvertCrvToCvx(newlyClaimable); claimable[CVX_INDEX].token = cvx; } } return claimable; } function getReward(address _account) external { //claim directly in checkpoint logic to save a bit of gas _checkpointAndClaim([_account, _account]); } function getReward(address _account, address _forwardTo) external { require(msg.sender == _account, "!self"); //claim directly in checkpoint logic to save a bit of gas //pack forwardTo into account array to save gas so that a proxy etc doesnt have to double transfer _checkpointAndClaim([_account,_forwardTo]); } //deposit a curve token function deposit(uint256 _amount, address _to) external { require(!isShutdown, "shutdown"); //dont need to call checkpoint since _mint() will if (_amount > 0) { _mint(_to, _amount); IERC20(curveToken).safeTransferFrom(msg.sender, address(this), _amount); IConvexDeposits(convexBooster).deposit(convexPoolId, _amount, true); } emit Deposited(msg.sender, _to, _amount, true); } //stake a convex token function stake(uint256 _amount, address _to) external { require(!isShutdown, "shutdown"); //dont need to call checkpoint since _mint() will if (_amount > 0) { _mint(_to, _amount); IERC20(convexToken).safeTransferFrom(msg.sender, address(this), _amount); IRewardStaking(convexPool).stake(_amount); } emit Deposited(msg.sender, _to, _amount, false); } //withdraw to convex deposit token function withdraw(uint256 _amount) external { //dont need to call checkpoint since _burn() will if (_amount > 0) { _burn(msg.sender, _amount); IRewardStaking(convexPool).withdraw(_amount, false); IERC20(convexToken).safeTransfer(msg.sender, _amount); } emit Withdrawn(msg.sender, _amount, false); } //withdraw to underlying curve lp token function withdrawAndUnwrap(uint256 _amount) external { //dont need to call checkpoint since _burn() will if (_amount > 0) { _burn(msg.sender, _amount); IRewardStaking(convexPool).withdrawAndUnwrap(_amount, false); IERC20(curveToken).safeTransfer(msg.sender, _amount); } //events emit Withdrawn(msg.sender, _amount, true); } function _beforeTokenTransfer(address _from, address _to, uint256 _amount) internal override { _checkpoint([_from, _to]); } } // File: contracts\wrappers\ConvexStakingWrapperFrax.sol pragma solidity 0.6.12; interface IFraxFarm { function lockedLiquidityOf(address account) external view returns (uint256 amount); } //Staking wrapper for Frax Finance platform //use convex LP positions as collateral while still receiving rewards contract ConvexStakingWrapperFrax is ConvexStakingWrapper { using SafeERC20 for IERC20; using SafeMath for uint256; constructor() public{} function initialize(uint256 _poolId) override external { require(!isInit,"already init"); owner = msg.sender; emit OwnershipTransferred(address(0), owner); (address _lptoken, address _token, , address _rewards, , ) = IBooster(convexBooster).poolInfo(_poolId); curveToken = _lptoken; convexToken = _token; convexPool = _rewards; convexPoolId = _poolId; _tokenname = string(abi.encodePacked("Staked ", ERC20(_token).name(), " Frax" )); _tokensymbol = string(abi.encodePacked("stk", ERC20(_token).symbol(), "-frax")); isShutdown = false; isInit = true; //set vault later // collateralVault = _vault; //add rewards addRewards(); setApprovals(); } function setVault(address _vault) external onlyOwner{ require(collateralVault == address(0), "already set"); collateralVault = _vault; } function _getDepositedBalance(address _account) internal override view returns(uint256) { if (_account == address(0) || _account == collateralVault) { return 0; } uint256 collateral; if(collateralVault != address(0)){ collateral = IFraxFarm(collateralVault).lockedLiquidityOf(_account); } return balanceOf(_account).add(collateral); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_wrapped","type":"bool"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_unwrapped","type":"bool"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"addRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexBooster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"earned","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ConvexStakingWrapper.EarnedData[]","name":"claimable","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"earnedView","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ConvexStakingWrapper.EarnedData[]","name":"claimable","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_forwardTo","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"registeredRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"reward_token","type":"address"},{"internalType":"address","name":"reward_pool","type":"address"},{"internalType":"uint128","name":"reward_integral","type":"uint128"},{"internalType":"uint128","name":"reward_remaining","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"user_checkpoint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAndUnwrap","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252601181527029ba30b5b2b221b7b73b32bc2a37b5b2b760791b6020808301918252835180850190945260068452650e6e8d686ecf60d31b90840152815191929162000069916003916200009a565b5080516200007f9060049060208401906200009a565b50506005805460ff1916601217905550600160065562000136565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000dd57805160ff19168380011785556200010d565b828001600101855582156200010d579182015b828111156200010d578251825591602001919060010190620000f0565b506200011b9291506200011f565b5090565b5b808211156200011b576000815560010162000120565b61393680620001466000396000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80637acb775711610146578063bf86d690116100c3578063e89133b211610087578063e89133b2146104a1578063f2fde38b146104a9578063f301af42146104bc578063fc0e74d1146104df578063fe4b84df146104e7578063ff833485146104fa5761025d565b8063bf86d69014610463578063c00007b01461046b578063cc7d510e1461047e578063dd62ed3e14610486578063e529ee95146104995761025d565b8063a457c2d71161010a578063a457c2d71461041a578063a9059cbb1461042d578063b145a5b814610440578063b277e8f014610448578063b95c57461461045b5761025d565b80637acb7757146103e75780638757b15b146103fa5780638da5cb5b14610402578063923c1d611461040a57806395d89b41146104125761025d565b806339509351116101df5780636817031b116101a35780636817031b1461038b5780636a4874a11461039e5780636b091695146103a65780636e553f65146103b957806370a08231146103cc578063715018a6146103df5761025d565b806339509351146103375780633969dfb41461034a5780634b0ee02a1461035d5780634b820093146103705780634f39059c146103835761025d565b806318160ddd1161022657806318160ddd146102df57806323b872dd146102f45780632cdacb50146103075780632e1a7d4d1461030f578063313ce567146103225761025d565b80628cc2621461026257806306fdde031461028b578063095ea7b3146102a05780630bece79c146102c057806314d6aed0146102d5575b600080fd5b610275610270366004612ecc565b61050d565b604051610282919061328e565b60405180910390f35b61029361058c565b60405161028291906132f1565b6102b36102ae366004613006565b610622565b60405161028291906132e6565b6102c8610640565b60405161028291906131d4565b6102dd61064f565b005b6102e7610dce565b60405161028291906137eb565b6102b3610302366004612fc6565b610dd4565b6102c8610e5c565b6102dd61031d3660046130ec565b610e74565b61032a610f48565b604051610282919061381c565b6102b3610345366004613006565b610f4d565b6102dd6103583660046130ec565b610f9b565b6102e761036b366004612ecc565b611064565b6102b361037e366004612ecc565b61106f565b6102c86110a0565b6102dd610399366004612ecc565b6110af565b6102c8611133565b6102dd6103b4366004612f04565b61114b565b6102dd6103c736600461311c565b61119e565b6102e76103da366004612ecc565b6112cd565b6102dd6112e8565b6102dd6103f536600461311c565b61136a565b6102dd61145e565b6102c86114f6565b6102c861150b565b610293611523565b6102b3610428366004613006565b611584565b6102b361043b366004613006565b6115ec565b6102b3611600565b610275610456366004612ecc565b61160e565b6102e7611619565b6102b361161f565b6102dd610479366004612ecc565b611628565b6102c8611650565b6102e7610494366004612f04565b61165f565b6102e761168a565b6102c8611690565b6102dd6104b7366004612ecc565b61169f565b6104cf6104ca3660046130ec565b61175f565b6040516102829493929190613202565b6102dd6117b0565b6102dd6104f53660046130ec565b6117ef565b6102e7610508366004612ecc565b611ac4565b600954604051637050ccd960e01b81526060916001600160a01b031690637050ccd99061054190309060019060040161325a565b600060405180830381600087803b15801561055b57600080fd5b505af115801561056f573d6000803e3d6000fd5b5050505061057b6114f4565b61058482611ad6565b90505b919050565b600f8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b600061063661062f611fb1565b8484611fb5565b5060015b92915050565b600b546001600160a01b031681565b600954600c546001600160a01b0390911690610a8557600c604051806080016040528073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b03168152602001836001600160a01b0316815260200160006001600160801b0316815260200160006001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600c6040518060800160405280734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b0316815260200160006001600160a01b0316815260200160006001600160801b0316815260200160006001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160106101000a8154816001600160801b0302191690836001600160801b0316021790555050506000600101600d600073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b03166001600160a01b031681526020019081526020016000208190555060018001600d6000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166001600160a01b031681526020019081526020016000208190555073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663a9059cbb3060006040518363ffffffff1660e01b81526004016109a4929190613275565b602060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613031565b5060405163a9059cbb60e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063a9059cbb90610a31903090600090600401613275565b602060405180830381600087803b158015610a4b57600080fd5b505af1158015610a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a839190613031565b505b6000816001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac057600080fd5b505afa158015610ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af89190613104565b905060005b81811015610dc957604051632061aa2360e11b81526000906001600160a01b038516906340c3544690610b349085906004016137eb565b60206040518083038186803b158015610b4c57600080fd5b505afa158015610b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b849190612ee8565b90506000816001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf99190612ee8565b90506001600160a01b038116734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b1415610c695781600c600181548110610c2f57fe5b906000526020600020906005020160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610dbf565b6001600160a01b0381166000908152600d6020526040902054610dbf57600c6040518060800160405280846001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015610ccc57600080fd5b505afa158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d049190612ee8565b6001600160a01b039081168252858116602080840191909152600060408085018290526060948501829052865460018181018955978352838320875160059092020180549186166001600160a01b031992831617815587850151988101805499871699909216989098179055858101516002909701805496909501516001600160801b03908116600160801b029781166001600160801b03199097169690961790951695909517909255600c549085168452600d9091529120555b5050600101610afd565b505050565b60025490565b6000610de1848484612069565b610e5184610ded611fb1565b610e4c856040518060600160405280602881526020016138b4602891396001600160a01b038a16600090815260016020526040812090610e2b611fb1565b6001600160a01b03168152602081019190915260400160002054919061217e565b611fb5565b5060015b9392505050565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b8015610f0157610e8433826121aa565b600954604051631c683a1b60e11b81526001600160a01b03909116906338d0743690610eb79084906000906004016137f4565b600060405180830381600087803b158015610ed157600080fd5b505af1158015610ee5573d6000803e3d6000fd5b5050600854610f0192506001600160a01b031690503383612280565b336001600160a01b03167f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5826000604051610f3d9291906137f4565b60405180910390a250565b601290565b6000610636610f5a611fb1565b84610e4c8560016000610f6b611fb1565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906122d6565b801561102857610fab33826121aa565b600954604051636197390160e11b81526001600160a01b039091169063c32e720290610fde9084906000906004016137f4565b600060405180830381600087803b158015610ff857600080fd5b505af115801561100c573d6000803e3d6000fd5b505060075461102892506001600160a01b031690503383612280565b336001600160a01b03167f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5826001604051610f3d9291906137f4565b6000610584826122fb565b604080518082019091526001600160a01b038216815260006020820181905290611098906123d7565b506001919050565b6007546001600160a01b031681565b600e546201000090046001600160a01b031633146110e85760405162461bcd60e51b81526004016110df90613541565b60405180910390fd5b600b546001600160a01b0316156111115760405162461bcd60e51b81526004016110df9061378f565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b73d533a949740bb3306d119cc777fa900ba034cd5281565b336001600160a01b038316146111735760405162461bcd60e51b81526004016110df90613576565b604080518082019091526001600160a01b0380841682528216602082015261119a906124e4565b5050565b600e5460ff16156111c15760405162461bcd60e51b81526004016110df9061361b565b811561127b576111d181836125be565b6007546111e9906001600160a01b0316333085612672565b600a546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669161122791908690600190600401613804565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112799190613031565b505b806001600160a01b0316336001600160a01b03167fb32af138549e2a71563d1f2b1f7f0a139b3cdbc83d877d13603de1c3c5fd487a8460016040516112c19291906137f4565b60405180910390a35050565b6001600160a01b031660009081526020819052604090205490565b600e546201000090046001600160a01b031633146113185760405162461bcd60e51b81526004016110df90613541565b600e546040516000916201000090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600e805462010000600160b01b0319169055565b600e5460ff161561138d5760405162461bcd60e51b81526004016110df9061361b565b81156114185761139d81836125be565b6008546113b5906001600160a01b0316333085612672565b60095460405163534a7e1d60e11b81526001600160a01b039091169063a694fc3a906113e59085906004016137eb565b600060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050505b806001600160a01b0316336001600160a01b03167fb32af138549e2a71563d1f2b1f7f0a139b3cdbc83d877d13603de1c3c5fd487a8460006040516112c19291906137f4565b60075461148a906001600160a01b031673f403c135812408bfbe8713b5a23a04b3d48aae316000612693565b6007546114b7906001600160a01b031673f403c135812408bfbe8713b5a23a04b3d48aae31600019612693565b6009546008546114d5916001600160a01b0391821691166000612693565b6009546008546114f4916001600160a01b039182169116600019612693565b565b600e546201000090046001600160a01b031681565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b60108054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106185780601f106105ed57610100808354040283529160200191610618565b6000610636611591611fb1565b84610e4c856040518060600160405280602581526020016138dc60259139600160006115bb611fb1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061217e565b60006106366115f9611fb1565b8484612069565b600e54610100900460ff1681565b606061058482611ad6565b600c5490565b600e5460ff1681565b604080518082019091526001600160a01b038216808252602082015261164d906124e4565b50565b6009546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a5481565b6008546001600160a01b031681565b600e546201000090046001600160a01b031633146116cf5760405162461bcd60e51b81526004016110df90613541565b6001600160a01b0381166116f55760405162461bcd60e51b81526004016110df90613367565b600e546040516001600160a01b038084169262010000900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600e80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600c818154811061176c57fe5b60009182526020909120600590910201805460018201546002909201546001600160a01b0391821693509116906001600160801b0380821691600160801b90041684565b600e546201000090046001600160a01b031633146117e05760405162461bcd60e51b81526004016110df90613541565b600e805460ff19166001179055565b600e54610100900460ff16156118175760405162461bcd60e51b81526004016110df906134da565b600e80546201000033810262010000600160b01b0319909216919091179182905560405191046001600160a01b0316906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3604051631526fe2760e01b81526000908190819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe27906118ad9087906004016137eb565b60c060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190612f3c565b5050600780546001600160a01b038087166001600160a01b0319928316179092556008805483871690831681179091556009805493851693909216929092179055600a899055604080516306fdde0360e01b81529051959850939650909450926306fdde03926004808201935060009291829003018186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119c09190810190613051565b6040516020016119d0919061315c565b604051602081830303815290604052600f90805190602001906119f4929190612e04565b50816001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611a2e57600080fd5b505afa158015611a42573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a6a9190810190613051565b604051602001611a7a919061319a565b60405160208183030381529060405260109080519060200190611a9e929190612e04565b50600e805461ffff1916610100179055611ab661064f565b611abe61145e565b50505050565b600d6020526000908152604090205481565b60606000611ae2612756565b600c549091508067ffffffffffffffff81118015611aff57600080fd5b50604051908082528060200260200182016040528015611b3957816020015b611b26612e82565b815260200190600190039081611b1e5790505b50925060005b81811015611fa9576000600c8281548110611b5657fe5b60009182526020822060059091020180546040516370a0823160e01b81529193506001600160a01b0316906370a0823190611b959030906004016131d4565b60206040518083038186803b158015611bad57600080fd5b505afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be59190613104565b6002830154909150600090611c0b908390600160801b90046001600160801b0316612765565b60018401549091506001600160a01b031615611cad5760018301546040516246613160e11b8152611caa916001600160a01b031690628cc26290611c539030906004016131d4565b60206040518083038186803b158015611c6b57600080fd5b505afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190613104565b82906122d6565b90505b60028301546001600160801b03168615611ce057611cde87611cd88468056bc75e2d6310000061278d565b906127c7565b015b6001600160a01b0389166000908152600385016020526040812054611d289068056bc75e2d6310000090611cd890611d19908690612765565b611d228e6122fb565b9061278d565b6001600160a01b038b166000908152600487016020526040902054909150611d7a90611d5490836122d6565b8a8881518110611d6057fe5b6020026020010151602001516122d690919063ffffffff16565b898781518110611d8657fe5b6020908102919091018101510152845489516001600160a01b03909116908a9088908110611db057fe5b60209081029190910101516001600160a01b03909116905285611f985760028501546001600160801b031691508715611e7d5760018501546040516246613160e11b8152611e78918a91611cd89168056bc75e2d63100000916001600160a01b0390911690628cc26290611e289030906004016131d4565b60206040518083038186803b158015611e4057600080fd5b505afa158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d229190613104565b820191505b6001600160a01b038a166000908152600386016020526040902054611eb69068056bc75e2d6310000090611cd890611d19908690612765565b604051638487474560e01b8152909150733c75bfe6fbfda3a94e7e7e8c2216afc684de534390638487474590611ef09084906004016137eb565b60206040518083038186803b158015611f0857600080fd5b505af4158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613104565b89600181518110611f4d57fe5b60200260200101516020018181525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b89600181518110611f7f57fe5b60209081029190910101516001600160a01b0390911690525b505060019093019250611b3f915050565b505050919050565b3390565b6001600160a01b038316611fdb5760405162461bcd60e51b81526004016110df9061363d565b6001600160a01b0382166120015760405162461bcd60e51b81526004016110df906133ad565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061205c9085906137eb565b60405180910390a3505050565b6001600160a01b03831661208f5760405162461bcd60e51b81526004016110df906135d6565b6001600160a01b0382166120b55760405162461bcd60e51b81526004016110df90613324565b6120c08383836127f9565b6120fd8160405180606001604052806026815260200161388e602691396001600160a01b038616600090815260208190526040902054919061217e565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461212c90826122d6565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061205c9085906137eb565b600081848411156121a25760405162461bcd60e51b81526004016110df91906132f1565b505050900390565b6001600160a01b0382166121d05760405162461bcd60e51b81526004016110df90613595565b6121dc826000836127f9565b6122198160405180606001604052806022815260200161386c602291396001600160a01b038516600090815260208190526040902054919061217e565b6001600160a01b03831660009081526020819052604090205560025461223f9082612765565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112c19085906137eb565b610dc98363a9059cbb60e01b848460405160240161229f929190613275565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612820565b600082820183811015610e555760405162461bcd60e51b81526004016110df906133ef565b60006001600160a01b03821615806123205750600b546001600160a01b038381169116145b1561232d57506000610587565b600b546000906001600160a01b0316156123c457600b5460405163d9f96e8d60e01b81526001600160a01b039091169063d9f96e8d906123719086906004016131d4565b60206040518083038186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c19190613104565b90505b610e55816123d1856112cd565b906122d6565b600260065414156123fa5760405162461bcd60e51b81526004016110df90613702565b6002600655600e5460ff161561240f576124dc565b6000612419612756565b9050612423612e99565b6124348360005b60200201516122fb565b815261244183600161242a565b6020820152600954604051637050ccd960e01b81526001600160a01b0390911690637050ccd99061247990309060019060040161325a565b600060405180830381600087803b15801561249357600080fd5b505af11580156124a7573d6000803e3d6000fd5b505050506124b36114f4565b600c5460005b818110156124d7576124cf8186858760006128af565b6001016124b9565b505050505b506001600655565b600260065414156125075760405162461bcd60e51b81526004016110df90613702565b60026006556000612516612756565b9050612520612e99565b61252b83600061242a565b8152600954604051637050ccd960e01b81526001600160a01b0390911690637050ccd99061256090309060019060040161325a565b600060405180830381600087803b15801561257a57600080fd5b505af115801561258e573d6000803e3d6000fd5b5050505061259a6114f4565b600c5460005b818110156124d7576125b68186858760016128af565b6001016125a0565b6001600160a01b0382166125e45760405162461bcd60e51b81526004016110df906137b4565b6125f0600083836127f9565b6002546125fd90826122d6565b6002556001600160a01b03821660009081526020819052604090205461262390826122d6565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112c19085906137eb565b611abe846323b872dd60e01b85858560405160240161229f93929190613236565b80158061271b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906126c990309086906004016131e8565b60206040518083038186803b1580156126e157600080fd5b505afa1580156126f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127199190613104565b155b6127375760405162461bcd60e51b81526004016110df90613739565b610dc98363095ea7b360e01b848460405160240161229f929190613275565b6000612760610dce565b905090565b6000828211156127875760405162461bcd60e51b81526004016110df90613426565b50900390565b60008261279c5750600061063a565b828202828482816127a957fe5b0414610e555760405162461bcd60e51b81526004016110df90613500565b60008082116127e85760405162461bcd60e51b81526004016110df906134a3565b8183816127f157fe5b049392505050565b604080518082019091526001600160a01b03808516825283166020820152610dc9906123d7565b6060612875826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ced9092919063ffffffff16565b805190915015610dc957808060200190518101906128939190613031565b610dc95760405162461bcd60e51b81526004016110df906136b8565b6000600c86815481106128be57fe5b60009182526020822060059091020180546040516370a0823160e01b81529193506001600160a01b0316906370a08231906128fd9030906004016131d4565b60206040518083038186803b15801561291557600080fd5b505afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190613104565b905060008411801561297f5750600282015460009061297d908390600160801b90046001600160801b0316612765565b115b156129e15760028201546129b9908590611cd89068056bc75e2d6310000090611d22908690600160801b90046001600160801b0316612765565b6002830180546001600160801b031981166001600160801b0391821693909301169190911790555b60005b6002811015612cab5760008782600281106129fb57fe5b60200201516001600160a01b03161415612a1457612ca3565b600b546001600160a01b0316878260028110612a2c57fe5b60200201516001600160a01b03161415612a4557612ca3565b838015612a5157508015155b15612a5b57612ca3565b6000836003016000898460028110612a6f57fe5b60200201516001600160a01b03166001600160a01b031681526020019081526020016000205490508480612aaf575060028401546001600160801b031681105b15612ca1578415612bca576002840154600090612b4990612b039068056bc75e2d6310000090611cd890612aec906001600160801b031687612765565b8c8860028110612af857fe5b60200201519061278d565b8660040160008c8760028110612b1557fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020546122d690919063ffffffff16565b90508015612bc45760008560040160008b8660028110612b6557fe5b60200201516001600160a01b03166001600160a01b0316815260200190815260200160002081905550612bb7898460010160028110612ba057fe5b602002015186546001600160a01b03169083612280565b612bc18482612765565b93505b50612c53565b6002840154612c1790612c059068056bc75e2d6310000090611cd890612bf9906001600160801b031686612765565b8b8760028110612af857fe5b8560040160008b8660028110612b1557fe5b8460040160008a8560028110612c2957fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6002808501546001600160801b03169060038601906000908b9086908110612c7757fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b505b6001016129e4565b506002820154600160801b90046001600160801b03168114612ce4576002820180546001600160801b03808416600160801b0291161790555b50505050505050565b6060612cfc8484600085612d04565b949350505050565b606082471015612d265760405162461bcd60e51b81526004016110df9061345d565b612d2f85612dc5565b612d4b5760405162461bcd60e51b81526004016110df90613681565b60006060866001600160a01b03168587604051612d689190613140565b60006040518083038185875af1925050503d8060008114612da5576040519150601f19603f3d011682016040523d82523d6000602084013e612daa565b606091505b5091509150612dba828286612dcb565b979650505050505050565b3b151590565b60608315612dda575081610e55565b825115612dea5782518084602001fd5b8160405162461bcd60e51b81526004016110df91906132f1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e4557805160ff1916838001178555612e72565b82800160010185558215612e72579182015b82811115612e72578251825591602001919060010190612e57565b50612e7e929150612eb7565b5090565b604080518082019091526000808252602082015290565b60405180604001604052806002906020820280368337509192915050565b5b80821115612e7e5760008155600101612eb8565b600060208284031215612edd578081fd5b8135610e5581613856565b600060208284031215612ef9578081fd5b8151610e5581613856565b60008060408385031215612f16578081fd5b8235612f2181613856565b91506020830135612f3181613856565b809150509250929050565b60008060008060008060c08789031215612f54578182fd5b8651612f5f81613856565b6020880151909650612f7081613856565b6040880151909550612f8181613856565b6060880151909450612f9281613856565b6080880151909350612fa381613856565b60a08801519092508015158114612fb8578182fd5b809150509295509295509295565b600080600060608486031215612fda578283fd5b8335612fe581613856565b92506020840135612ff581613856565b929592945050506040919091013590565b60008060408385031215613018578182fd5b823561302381613856565b946020939093013593505050565b600060208284031215613042578081fd5b81518015158114610e55578182fd5b600060208284031215613062578081fd5b815167ffffffffffffffff80821115613079578283fd5b818401915084601f83011261308c578283fd5b81518181111561309a578384fd5b604051601f8201601f1916810160200183811182821017156130ba578586fd5b6040528181528382016020018710156130d1578485fd5b6130e282602083016020870161382a565b9695505050505050565b6000602082840312156130fd578081fd5b5035919050565b600060208284031215613115578081fd5b5051919050565b6000806040838503121561312e578182fd5b823591506020830135612f3181613856565b6000825161315281846020870161382a565b9190910192915050565b600066029ba30b5b2b2160cd1b8252825161317e81600785016020870161382a565b640408ce4c2f60db1b6007939091019283015250600c01919050565b60006273746b60e81b825282516131b881600385016020870161382a565b6405acce4c2f60db1b6003939091019283015250600801919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526001600160801b039081166040830152909116606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156132d957815180516001600160a01b031685528601518685015292840192908501906001016132ab565b5091979650505050505050565b901515815260200190565b600060208252825180602084015261331081604085016020870161382a565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600c908201526b185b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526005908201526410b9b2b63360d91b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526008908201526739b43aba3237bbb760c11b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252600b908201526a185b1c9958591e481cd95d60aa1b604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b9182521515602082015260400190565b92835260208301919091521515604082015260600190565b60ff91909116815260200190565b60005b8381101561384557818101518382015260200161382d565b83811115611abe5750506000910152565b6001600160a01b038116811461164d57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cf4ef3e9927ffda3fc30df161533cab9f403f2994468883d2f7d5cad546840fb64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637acb775711610146578063bf86d690116100c3578063e89133b211610087578063e89133b2146104a1578063f2fde38b146104a9578063f301af42146104bc578063fc0e74d1146104df578063fe4b84df146104e7578063ff833485146104fa5761025d565b8063bf86d69014610463578063c00007b01461046b578063cc7d510e1461047e578063dd62ed3e14610486578063e529ee95146104995761025d565b8063a457c2d71161010a578063a457c2d71461041a578063a9059cbb1461042d578063b145a5b814610440578063b277e8f014610448578063b95c57461461045b5761025d565b80637acb7757146103e75780638757b15b146103fa5780638da5cb5b14610402578063923c1d611461040a57806395d89b41146104125761025d565b806339509351116101df5780636817031b116101a35780636817031b1461038b5780636a4874a11461039e5780636b091695146103a65780636e553f65146103b957806370a08231146103cc578063715018a6146103df5761025d565b806339509351146103375780633969dfb41461034a5780634b0ee02a1461035d5780634b820093146103705780634f39059c146103835761025d565b806318160ddd1161022657806318160ddd146102df57806323b872dd146102f45780632cdacb50146103075780632e1a7d4d1461030f578063313ce567146103225761025d565b80628cc2621461026257806306fdde031461028b578063095ea7b3146102a05780630bece79c146102c057806314d6aed0146102d5575b600080fd5b610275610270366004612ecc565b61050d565b604051610282919061328e565b60405180910390f35b61029361058c565b60405161028291906132f1565b6102b36102ae366004613006565b610622565b60405161028291906132e6565b6102c8610640565b60405161028291906131d4565b6102dd61064f565b005b6102e7610dce565b60405161028291906137eb565b6102b3610302366004612fc6565b610dd4565b6102c8610e5c565b6102dd61031d3660046130ec565b610e74565b61032a610f48565b604051610282919061381c565b6102b3610345366004613006565b610f4d565b6102dd6103583660046130ec565b610f9b565b6102e761036b366004612ecc565b611064565b6102b361037e366004612ecc565b61106f565b6102c86110a0565b6102dd610399366004612ecc565b6110af565b6102c8611133565b6102dd6103b4366004612f04565b61114b565b6102dd6103c736600461311c565b61119e565b6102e76103da366004612ecc565b6112cd565b6102dd6112e8565b6102dd6103f536600461311c565b61136a565b6102dd61145e565b6102c86114f6565b6102c861150b565b610293611523565b6102b3610428366004613006565b611584565b6102b361043b366004613006565b6115ec565b6102b3611600565b610275610456366004612ecc565b61160e565b6102e7611619565b6102b361161f565b6102dd610479366004612ecc565b611628565b6102c8611650565b6102e7610494366004612f04565b61165f565b6102e761168a565b6102c8611690565b6102dd6104b7366004612ecc565b61169f565b6104cf6104ca3660046130ec565b61175f565b6040516102829493929190613202565b6102dd6117b0565b6102dd6104f53660046130ec565b6117ef565b6102e7610508366004612ecc565b611ac4565b600954604051637050ccd960e01b81526060916001600160a01b031690637050ccd99061054190309060019060040161325a565b600060405180830381600087803b15801561055b57600080fd5b505af115801561056f573d6000803e3d6000fd5b5050505061057b6114f4565b61058482611ad6565b90505b919050565b600f8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b600061063661062f611fb1565b8484611fb5565b5060015b92915050565b600b546001600160a01b031681565b600954600c546001600160a01b0390911690610a8557600c604051806080016040528073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b03168152602001836001600160a01b0316815260200160006001600160801b0316815260200160006001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600c6040518060800160405280734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b0316815260200160006001600160a01b0316815260200160006001600160801b0316815260200160006001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160020160106101000a8154816001600160801b0302191690836001600160801b0316021790555050506000600101600d600073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b03166001600160a01b031681526020019081526020016000208190555060018001600d6000734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166001600160a01b031681526020019081526020016000208190555073d533a949740bb3306d119cc777fa900ba034cd526001600160a01b031663a9059cbb3060006040518363ffffffff1660e01b81526004016109a4929190613275565b602060405180830381600087803b1580156109be57600080fd5b505af11580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613031565b5060405163a9059cbb60e01b8152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b9063a9059cbb90610a31903090600090600401613275565b602060405180830381600087803b158015610a4b57600080fd5b505af1158015610a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a839190613031565b505b6000816001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b158015610ac057600080fd5b505afa158015610ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af89190613104565b905060005b81811015610dc957604051632061aa2360e11b81526000906001600160a01b038516906340c3544690610b349085906004016137eb565b60206040518083038186803b158015610b4c57600080fd5b505afa158015610b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b849190612ee8565b90506000816001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc157600080fd5b505afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf99190612ee8565b90506001600160a01b038116734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b1415610c695781600c600181548110610c2f57fe5b906000526020600020906005020160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610dbf565b6001600160a01b0381166000908152600d6020526040902054610dbf57600c6040518060800160405280846001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015610ccc57600080fd5b505afa158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d049190612ee8565b6001600160a01b039081168252858116602080840191909152600060408085018290526060948501829052865460018181018955978352838320875160059092020180549186166001600160a01b031992831617815587850151988101805499871699909216989098179055858101516002909701805496909501516001600160801b03908116600160801b029781166001600160801b03199097169690961790951695909517909255600c549085168452600d9091529120555b5050600101610afd565b505050565b60025490565b6000610de1848484612069565b610e5184610ded611fb1565b610e4c856040518060600160405280602881526020016138b4602891396001600160a01b038a16600090815260016020526040812090610e2b611fb1565b6001600160a01b03168152602081019190915260400160002054919061217e565b611fb5565b5060015b9392505050565b73f403c135812408bfbe8713b5a23a04b3d48aae3181565b8015610f0157610e8433826121aa565b600954604051631c683a1b60e11b81526001600160a01b03909116906338d0743690610eb79084906000906004016137f4565b600060405180830381600087803b158015610ed157600080fd5b505af1158015610ee5573d6000803e3d6000fd5b5050600854610f0192506001600160a01b031690503383612280565b336001600160a01b03167f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5826000604051610f3d9291906137f4565b60405180910390a250565b601290565b6000610636610f5a611fb1565b84610e4c8560016000610f6b611fb1565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906122d6565b801561102857610fab33826121aa565b600954604051636197390160e11b81526001600160a01b039091169063c32e720290610fde9084906000906004016137f4565b600060405180830381600087803b158015610ff857600080fd5b505af115801561100c573d6000803e3d6000fd5b505060075461102892506001600160a01b031690503383612280565b336001600160a01b03167f2fd83d5e9f5d240bed47a97a24cf354e4047e25edc2da27b01fd95e5e8a0c9a5826001604051610f3d9291906137f4565b6000610584826122fb565b604080518082019091526001600160a01b038216815260006020820181905290611098906123d7565b506001919050565b6007546001600160a01b031681565b600e546201000090046001600160a01b031633146110e85760405162461bcd60e51b81526004016110df90613541565b60405180910390fd5b600b546001600160a01b0316156111115760405162461bcd60e51b81526004016110df9061378f565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b73d533a949740bb3306d119cc777fa900ba034cd5281565b336001600160a01b038316146111735760405162461bcd60e51b81526004016110df90613576565b604080518082019091526001600160a01b0380841682528216602082015261119a906124e4565b5050565b600e5460ff16156111c15760405162461bcd60e51b81526004016110df9061361b565b811561127b576111d181836125be565b6007546111e9906001600160a01b0316333085612672565b600a546040516321d0683360e11b815273f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669161122791908690600190600401613804565b602060405180830381600087803b15801561124157600080fd5b505af1158015611255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112799190613031565b505b806001600160a01b0316336001600160a01b03167fb32af138549e2a71563d1f2b1f7f0a139b3cdbc83d877d13603de1c3c5fd487a8460016040516112c19291906137f4565b60405180910390a35050565b6001600160a01b031660009081526020819052604090205490565b600e546201000090046001600160a01b031633146113185760405162461bcd60e51b81526004016110df90613541565b600e546040516000916201000090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600e805462010000600160b01b0319169055565b600e5460ff161561138d5760405162461bcd60e51b81526004016110df9061361b565b81156114185761139d81836125be565b6008546113b5906001600160a01b0316333085612672565b60095460405163534a7e1d60e11b81526001600160a01b039091169063a694fc3a906113e59085906004016137eb565b600060405180830381600087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050505b806001600160a01b0316336001600160a01b03167fb32af138549e2a71563d1f2b1f7f0a139b3cdbc83d877d13603de1c3c5fd487a8460006040516112c19291906137f4565b60075461148a906001600160a01b031673f403c135812408bfbe8713b5a23a04b3d48aae316000612693565b6007546114b7906001600160a01b031673f403c135812408bfbe8713b5a23a04b3d48aae31600019612693565b6009546008546114d5916001600160a01b0391821691166000612693565b6009546008546114f4916001600160a01b039182169116600019612693565b565b600e546201000090046001600160a01b031681565b734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b60108054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106185780601f106105ed57610100808354040283529160200191610618565b6000610636611591611fb1565b84610e4c856040518060600160405280602581526020016138dc60259139600160006115bb611fb1565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061217e565b60006106366115f9611fb1565b8484612069565b600e54610100900460ff1681565b606061058482611ad6565b600c5490565b600e5460ff1681565b604080518082019091526001600160a01b038216808252602082015261164d906124e4565b50565b6009546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a5481565b6008546001600160a01b031681565b600e546201000090046001600160a01b031633146116cf5760405162461bcd60e51b81526004016110df90613541565b6001600160a01b0381166116f55760405162461bcd60e51b81526004016110df90613367565b600e546040516001600160a01b038084169262010000900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600e80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600c818154811061176c57fe5b60009182526020909120600590910201805460018201546002909201546001600160a01b0391821693509116906001600160801b0380821691600160801b90041684565b600e546201000090046001600160a01b031633146117e05760405162461bcd60e51b81526004016110df90613541565b600e805460ff19166001179055565b600e54610100900460ff16156118175760405162461bcd60e51b81526004016110df906134da565b600e80546201000033810262010000600160b01b0319909216919091179182905560405191046001600160a01b0316906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3604051631526fe2760e01b81526000908190819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe27906118ad9087906004016137eb565b60c060405180830381600087803b1580156118c757600080fd5b505af11580156118db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ff9190612f3c565b5050600780546001600160a01b038087166001600160a01b0319928316179092556008805483871690831681179091556009805493851693909216929092179055600a899055604080516306fdde0360e01b81529051959850939650909450926306fdde03926004808201935060009291829003018186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119c09190810190613051565b6040516020016119d0919061315c565b604051602081830303815290604052600f90805190602001906119f4929190612e04565b50816001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015611a2e57600080fd5b505afa158015611a42573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a6a9190810190613051565b604051602001611a7a919061319a565b60405160208183030381529060405260109080519060200190611a9e929190612e04565b50600e805461ffff1916610100179055611ab661064f565b611abe61145e565b50505050565b600d6020526000908152604090205481565b60606000611ae2612756565b600c549091508067ffffffffffffffff81118015611aff57600080fd5b50604051908082528060200260200182016040528015611b3957816020015b611b26612e82565b815260200190600190039081611b1e5790505b50925060005b81811015611fa9576000600c8281548110611b5657fe5b60009182526020822060059091020180546040516370a0823160e01b81529193506001600160a01b0316906370a0823190611b959030906004016131d4565b60206040518083038186803b158015611bad57600080fd5b505afa158015611bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be59190613104565b6002830154909150600090611c0b908390600160801b90046001600160801b0316612765565b60018401549091506001600160a01b031615611cad5760018301546040516246613160e11b8152611caa916001600160a01b031690628cc26290611c539030906004016131d4565b60206040518083038186803b158015611c6b57600080fd5b505afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190613104565b82906122d6565b90505b60028301546001600160801b03168615611ce057611cde87611cd88468056bc75e2d6310000061278d565b906127c7565b015b6001600160a01b0389166000908152600385016020526040812054611d289068056bc75e2d6310000090611cd890611d19908690612765565b611d228e6122fb565b9061278d565b6001600160a01b038b166000908152600487016020526040902054909150611d7a90611d5490836122d6565b8a8881518110611d6057fe5b6020026020010151602001516122d690919063ffffffff16565b898781518110611d8657fe5b6020908102919091018101510152845489516001600160a01b03909116908a9088908110611db057fe5b60209081029190910101516001600160a01b03909116905285611f985760028501546001600160801b031691508715611e7d5760018501546040516246613160e11b8152611e78918a91611cd89168056bc75e2d63100000916001600160a01b0390911690628cc26290611e289030906004016131d4565b60206040518083038186803b158015611e4057600080fd5b505afa158015611e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d229190613104565b820191505b6001600160a01b038a166000908152600386016020526040902054611eb69068056bc75e2d6310000090611cd890611d19908690612765565b604051638487474560e01b8152909150733c75bfe6fbfda3a94e7e7e8c2216afc684de534390638487474590611ef09084906004016137eb565b60206040518083038186803b158015611f0857600080fd5b505af4158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613104565b89600181518110611f4d57fe5b60200260200101516020018181525050734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b89600181518110611f7f57fe5b60209081029190910101516001600160a01b0390911690525b505060019093019250611b3f915050565b505050919050565b3390565b6001600160a01b038316611fdb5760405162461bcd60e51b81526004016110df9061363d565b6001600160a01b0382166120015760405162461bcd60e51b81526004016110df906133ad565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061205c9085906137eb565b60405180910390a3505050565b6001600160a01b03831661208f5760405162461bcd60e51b81526004016110df906135d6565b6001600160a01b0382166120b55760405162461bcd60e51b81526004016110df90613324565b6120c08383836127f9565b6120fd8160405180606001604052806026815260200161388e602691396001600160a01b038616600090815260208190526040902054919061217e565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461212c90826122d6565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061205c9085906137eb565b600081848411156121a25760405162461bcd60e51b81526004016110df91906132f1565b505050900390565b6001600160a01b0382166121d05760405162461bcd60e51b81526004016110df90613595565b6121dc826000836127f9565b6122198160405180606001604052806022815260200161386c602291396001600160a01b038516600090815260208190526040902054919061217e565b6001600160a01b03831660009081526020819052604090205560025461223f9082612765565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112c19085906137eb565b610dc98363a9059cbb60e01b848460405160240161229f929190613275565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612820565b600082820183811015610e555760405162461bcd60e51b81526004016110df906133ef565b60006001600160a01b03821615806123205750600b546001600160a01b038381169116145b1561232d57506000610587565b600b546000906001600160a01b0316156123c457600b5460405163d9f96e8d60e01b81526001600160a01b039091169063d9f96e8d906123719086906004016131d4565b60206040518083038186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c19190613104565b90505b610e55816123d1856112cd565b906122d6565b600260065414156123fa5760405162461bcd60e51b81526004016110df90613702565b6002600655600e5460ff161561240f576124dc565b6000612419612756565b9050612423612e99565b6124348360005b60200201516122fb565b815261244183600161242a565b6020820152600954604051637050ccd960e01b81526001600160a01b0390911690637050ccd99061247990309060019060040161325a565b600060405180830381600087803b15801561249357600080fd5b505af11580156124a7573d6000803e3d6000fd5b505050506124b36114f4565b600c5460005b818110156124d7576124cf8186858760006128af565b6001016124b9565b505050505b506001600655565b600260065414156125075760405162461bcd60e51b81526004016110df90613702565b60026006556000612516612756565b9050612520612e99565b61252b83600061242a565b8152600954604051637050ccd960e01b81526001600160a01b0390911690637050ccd99061256090309060019060040161325a565b600060405180830381600087803b15801561257a57600080fd5b505af115801561258e573d6000803e3d6000fd5b5050505061259a6114f4565b600c5460005b818110156124d7576125b68186858760016128af565b6001016125a0565b6001600160a01b0382166125e45760405162461bcd60e51b81526004016110df906137b4565b6125f0600083836127f9565b6002546125fd90826122d6565b6002556001600160a01b03821660009081526020819052604090205461262390826122d6565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112c19085906137eb565b611abe846323b872dd60e01b85858560405160240161229f93929190613236565b80158061271b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906126c990309086906004016131e8565b60206040518083038186803b1580156126e157600080fd5b505afa1580156126f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127199190613104565b155b6127375760405162461bcd60e51b81526004016110df90613739565b610dc98363095ea7b360e01b848460405160240161229f929190613275565b6000612760610dce565b905090565b6000828211156127875760405162461bcd60e51b81526004016110df90613426565b50900390565b60008261279c5750600061063a565b828202828482816127a957fe5b0414610e555760405162461bcd60e51b81526004016110df90613500565b60008082116127e85760405162461bcd60e51b81526004016110df906134a3565b8183816127f157fe5b049392505050565b604080518082019091526001600160a01b03808516825283166020820152610dc9906123d7565b6060612875826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612ced9092919063ffffffff16565b805190915015610dc957808060200190518101906128939190613031565b610dc95760405162461bcd60e51b81526004016110df906136b8565b6000600c86815481106128be57fe5b60009182526020822060059091020180546040516370a0823160e01b81529193506001600160a01b0316906370a08231906128fd9030906004016131d4565b60206040518083038186803b15801561291557600080fd5b505afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190613104565b905060008411801561297f5750600282015460009061297d908390600160801b90046001600160801b0316612765565b115b156129e15760028201546129b9908590611cd89068056bc75e2d6310000090611d22908690600160801b90046001600160801b0316612765565b6002830180546001600160801b031981166001600160801b0391821693909301169190911790555b60005b6002811015612cab5760008782600281106129fb57fe5b60200201516001600160a01b03161415612a1457612ca3565b600b546001600160a01b0316878260028110612a2c57fe5b60200201516001600160a01b03161415612a4557612ca3565b838015612a5157508015155b15612a5b57612ca3565b6000836003016000898460028110612a6f57fe5b60200201516001600160a01b03166001600160a01b031681526020019081526020016000205490508480612aaf575060028401546001600160801b031681105b15612ca1578415612bca576002840154600090612b4990612b039068056bc75e2d6310000090611cd890612aec906001600160801b031687612765565b8c8860028110612af857fe5b60200201519061278d565b8660040160008c8760028110612b1557fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020546122d690919063ffffffff16565b90508015612bc45760008560040160008b8660028110612b6557fe5b60200201516001600160a01b03166001600160a01b0316815260200190815260200160002081905550612bb7898460010160028110612ba057fe5b602002015186546001600160a01b03169083612280565b612bc18482612765565b93505b50612c53565b6002840154612c1790612c059068056bc75e2d6310000090611cd890612bf9906001600160801b031686612765565b8b8760028110612af857fe5b8560040160008b8660028110612b1557fe5b8460040160008a8560028110612c2957fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6002808501546001600160801b03169060038601906000908b9086908110612c7757fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b505b6001016129e4565b506002820154600160801b90046001600160801b03168114612ce4576002820180546001600160801b03808416600160801b0291161790555b50505050505050565b6060612cfc8484600085612d04565b949350505050565b606082471015612d265760405162461bcd60e51b81526004016110df9061345d565b612d2f85612dc5565b612d4b5760405162461bcd60e51b81526004016110df90613681565b60006060866001600160a01b03168587604051612d689190613140565b60006040518083038185875af1925050503d8060008114612da5576040519150601f19603f3d011682016040523d82523d6000602084013e612daa565b606091505b5091509150612dba828286612dcb565b979650505050505050565b3b151590565b60608315612dda575081610e55565b825115612dea5782518084602001fd5b8160405162461bcd60e51b81526004016110df91906132f1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612e4557805160ff1916838001178555612e72565b82800160010185558215612e72579182015b82811115612e72578251825591602001919060010190612e57565b50612e7e929150612eb7565b5090565b604080518082019091526000808252602082015290565b60405180604001604052806002906020820280368337509192915050565b5b80821115612e7e5760008155600101612eb8565b600060208284031215612edd578081fd5b8135610e5581613856565b600060208284031215612ef9578081fd5b8151610e5581613856565b60008060408385031215612f16578081fd5b8235612f2181613856565b91506020830135612f3181613856565b809150509250929050565b60008060008060008060c08789031215612f54578182fd5b8651612f5f81613856565b6020880151909650612f7081613856565b6040880151909550612f8181613856565b6060880151909450612f9281613856565b6080880151909350612fa381613856565b60a08801519092508015158114612fb8578182fd5b809150509295509295509295565b600080600060608486031215612fda578283fd5b8335612fe581613856565b92506020840135612ff581613856565b929592945050506040919091013590565b60008060408385031215613018578182fd5b823561302381613856565b946020939093013593505050565b600060208284031215613042578081fd5b81518015158114610e55578182fd5b600060208284031215613062578081fd5b815167ffffffffffffffff80821115613079578283fd5b818401915084601f83011261308c578283fd5b81518181111561309a578384fd5b604051601f8201601f1916810160200183811182821017156130ba578586fd5b6040528181528382016020018710156130d1578485fd5b6130e282602083016020870161382a565b9695505050505050565b6000602082840312156130fd578081fd5b5035919050565b600060208284031215613115578081fd5b5051919050565b6000806040838503121561312e578182fd5b823591506020830135612f3181613856565b6000825161315281846020870161382a565b9190910192915050565b600066029ba30b5b2b2160cd1b8252825161317e81600785016020870161382a565b640408ce4c2f60db1b6007939091019283015250600c01919050565b60006273746b60e81b825282516131b881600385016020870161382a565b6405acce4c2f60db1b6003939091019283015250600801919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526001600160801b039081166040830152909116606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156132d957815180516001600160a01b031685528601518685015292840192908501906001016132ab565b5091979650505050505050565b901515815260200190565b600060208252825180602084015261331081604085016020870161382a565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600c908201526b185b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526005908201526410b9b2b63360d91b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526008908201526739b43aba3237bbb760c11b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252600b908201526a185b1c9958591e481cd95d60aa1b604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b9182521515602082015260400190565b92835260208301919091521515604082015260600190565b60ff91909116815260200190565b60005b8381101561384557818101518382015260200161382d565b83811115611abe5750506000910152565b6001600160a01b038116811461164d57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cf4ef3e9927ffda3fc30df161533cab9f403f2994468883d2f7d5cad546840fb64736f6c634300060c0033
Deployed Bytecode Sourcemap
56575:1590:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50868:218;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42747:97;;;:::i;:::-;;;;;;;:::i;30405:169::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41169:30::-;;;:::i;:::-;;;;;;;:::i;43964:1974::-;;;:::i;:::-;;29358:108;;;:::i;:::-;;;;;;;:::i;31056:321::-;;;;;;:::i;:::-;;:::i;40764:91::-;;;:::i;55240:384::-;;;;;;:::i;:::-;;:::i;42961:85::-;;;:::i;:::-;;;;;;;:::i;31786:218::-;;;;;;:::i;:::-;;:::i;55677:426::-;;;;;;:::i;:::-;;:::i;50638:128::-;;;;;;:::i;:::-;;:::i;50488:142::-;;;;;;:::i;:::-;;:::i;41038:25::-;;;:::i;57571:161::-;;;;;;:::i;:::-;;:::i;40862:81::-;;;:::i;53852:353::-;;;;;;:::i;:::-;;:::i;54242:470::-;;;;;;:::i;:::-;;:::i;29529:127::-;;;;;;:::i;:::-;;:::i;43428:146::-;;;:::i;54748:444::-;;;;;;:::i;:::-;;:::i;43665:291::-;;;:::i;41480:20::-;;;:::i;40950:81::-;;;:::i;42852:101::-;;;:::i;32507:269::-;;;;;;:::i;:::-;;:::i;29869:175::-;;;;;;:::i;:::-;;:::i;41455:18::-;;;:::i;51212:134::-;;;;;;:::i;:::-;;:::i;45946:95::-;;;:::i;41426:22::-;;;:::i;53671:173::-;;;;;;:::i;:::-;;:::i;41103:25::-;;;:::i;30107:151::-;;;;;;:::i;:::-;;:::i;41135:27::-;;;:::i;41070:26::-;;;:::i;43178:242::-;;;;;;:::i;:::-;;:::i;41313:27::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;43582:75::-;;;:::i;56748:815::-;;;;;;:::i;:::-;;:::i;41347:52::-;;;;;;:::i;:::-;;:::i;50868:218::-;50976:10;;50961:57;;-1:-1:-1;;;50961:57:0;;50919:29;;-1:-1:-1;;;;;50976:10:0;;50961:36;;:57;;51006:4;;50976:10;;50961:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51029:14;:12;:14::i;:::-;51061:17;51069:8;51061:7;:17::i;:::-;51054:24;;50868:218;;;;:::o;42747:97::-;42826:10;42819:17;;;;;;;;-1:-1:-1;;42819:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42793:13;;42819:17;;42826:10;;42819:17;;42826:10;42819:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42747:97;:::o;30405:169::-;30488:4;30505:39;30514:12;:10;:12::i;:::-;30528:7;30537:6;30505:8;:39::i;:::-;-1:-1:-1;30562:4:0;30405:169;;;;;:::o;41169:30::-;;;-1:-1:-1;;;;;41169:30:0;;:::o;43964:1974::-;44023:10;;44050:7;:14;-1:-1:-1;;;;;44023:10:0;;;;44046:909;;44086:7;44117:198;;;;;;;;40900:42;-1:-1:-1;;;;;44117:198:0;;;;;44204:8;-1:-1:-1;;;;;44117:198:0;;;;;44252:1;-1:-1:-1;;;;;44117:198:0;;;;;44294:1;-1:-1:-1;;;;;44117:198:0;;;;44086:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44086:244:0;;;;;-1:-1:-1;;;;;44086:244:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44086:244:0;;;;;-1:-1:-1;;;;;44086:244:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44086:244:0;;;;;-1:-1:-1;;;;;44086:244:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44086:244:0;;;;;-1:-1:-1;;;;;44086:244:0;;;;;;;;44345:7;44376:200;;;;;;;;40988:42;-1:-1:-1;;;;;44376:200:0;;;;;44471:1;-1:-1:-1;;;;;44376:200:0;;;;;44513:1;-1:-1:-1;;;;;44376:200:0;;;;;44555:1;-1:-1:-1;;;;;44376:200:0;;;;44345:246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44345:246:0;;;;;-1:-1:-1;;;;;44345:246:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44345:246:0;;;;;-1:-1:-1;;;;;44345:246:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44345:246:0;;;;;-1:-1:-1;;;;;44345:246:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44345:246:0;;;;;-1:-1:-1;;;;;44345:246:0;;;;;;;;41243:1;44641;44631:11;44606:17;:22;40900:42;-1:-1:-1;;;;;44606:22:0;-1:-1:-1;;;;;44606:22:0;;;;;;;;;;;;:36;;;;41288:1;44721;44711:11;44686:17;:22;40988:42;-1:-1:-1;;;;;44686:22:0;-1:-1:-1;;;;;44686:22:0;;;;;;;;;;;;:36;;;;40900:42;-1:-1:-1;;;;;44810:20:0;;44839:4;44845:1;44810:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44906:37:0;;-1:-1:-1;;;44906:37:0;;40988:42;;44906:20;;:37;;44935:4;;44941:1;;44906:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44046:909;44967:18;45003:8;-1:-1:-1;;;;;44988:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44967:66;;45049:9;45044:887;45068:10;45064:1;:14;45044:887;;;45120:40;;-1:-1:-1;;;45120:40:0;;45100:17;;-1:-1:-1;;;;;45120:37:0;;;;;:40;;45158:1;;45120:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45100:60;;45175:18;45211:9;-1:-1:-1;;;;;45196:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45175:60;-1:-1:-1;;;;;;45253:17:0;;40988:42;45253:17;45250:670;;;45373:9;45340:7;41288:1;45340:18;;;;;;;;;;;;;;;;;;:30;;;:42;;;;;-1:-1:-1;;;;;45340:42:0;;;;;-1:-1:-1;;;;;45340:42:0;;;;;;45250:670;;;-1:-1:-1;;;;;45406:29:0;;;;;;:17;:29;;;;;;45403:517;;45501:7;45536:255;;;;;;;;45603:9;-1:-1:-1;;;;;45588:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45536:255:0;;;;;;;;;;;;;;;;-1:-1:-1;45536:255:0;;;;;;;;;;;;;;45501:309;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45501:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45501:309:0;;;-1:-1:-1;;;45501:309:0;;;;-1:-1:-1;;;;;;45501:309:0;;;;;;;;;;;;;;;;;45861:7;:14;45829:29;;;;;:17;:29;;;;;:46;45403:517;-1:-1:-1;;45080:3:0;;45044:887;;;;43964:1974;;:::o;29358:108::-;29446:12;;29358:108;:::o;31056:321::-;31162:4;31179:36;31189:6;31197:9;31208:6;31179:9;:36::i;:::-;31226:121;31235:6;31243:12;:10;:12::i;:::-;31257:89;31295:6;31257:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31257:19:0;;;;;;:11;:19;;;;;;31277:12;:10;:12::i;:::-;-1:-1:-1;;;;;31257:33:0;;;;;;;;;;;;-1:-1:-1;31257:33:0;;;:89;:37;:89::i;:::-;31226:8;:121::i;:::-;-1:-1:-1;31365:4:0;31056:321;;;;;;:::o;40764:91::-;40812:42;40764:91;:::o;55240:384::-;55362:11;;55358:204;;55390:26;55396:10;55408:7;55390:5;:26::i;:::-;55446:10;;55431:51;;-1:-1:-1;;;55431:51:0;;-1:-1:-1;;;;;55446:10:0;;;;55431:35;;:51;;55467:7;;55446:10;;55431:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55504:11:0;;55497:53;;-1:-1:-1;;;;;;55504:11:0;;-1:-1:-1;55530:10:0;55542:7;55497:32;:53::i;:::-;55589:10;-1:-1:-1;;;;;55579:37:0;;55601:7;55610:5;55579:37;;;;;;;:::i;:::-;;;;;;;;55240:384;:::o;42961:85::-;43036:2;42961:85;:::o;31786:218::-;31874:4;31891:83;31900:12;:10;:12::i;:::-;31914:7;31923:50;31962:10;31923:11;:25;31935:12;:10;:12::i;:::-;-1:-1:-1;;;;;31923:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;31923:25:0;;;:34;;;;;;;;;;;:38;:50::i;55677:426::-;55816:11;;55812:212;;55844:26;55850:10;55862:7;55844:5;:26::i;:::-;55900:10;;55885:60;;-1:-1:-1;;;55885:60:0;;-1:-1:-1;;;;;55900:10:0;;;;55885:44;;:60;;55930:7;;55900:10;;55885:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55967:10:0;;55960:52;;-1:-1:-1;;;;;;55967:10:0;;-1:-1:-1;55992:10:0;56004:7;55960:31;:52::i;:::-;56069:10;-1:-1:-1;;;;;56059:36:0;;56081:7;56090:4;56059:36;;;;;;;:::i;50638:128::-;50702:7;50728:30;50749:8;50728:20;:30::i;50488:142::-;50565:35;;;;;;;;;-1:-1:-1;;;;;50565:35:0;;;;50548:4;50565:35;;;;;;50548:4;50565:35;;:11;:35::i;:::-;-1:-1:-1;50618:4:0;50488:142;;;:::o;41038:25::-;;;-1:-1:-1;;;;;41038:25:0;;:::o;57571:161::-;43094:5;;;;;-1:-1:-1;;;;;43094:5:0;43103:10;43094:19;43086:64;;;;-1:-1:-1;;;43086:64:0;;;;;;;:::i;:::-;;;;;;;;;57642:15:::1;::::0;-1:-1:-1;;;;;57642:15:0::1;:29:::0;57634:53:::1;;;;-1:-1:-1::0;;;57634:53:0::1;;;;;;;:::i;:::-;57700:15;:24:::0;;-1:-1:-1;;;;;;57700:24:0::1;-1:-1:-1::0;;;;;57700:24:0;;;::::1;::::0;;;::::1;::::0;;57571:161::o;40862:81::-;40900:42;40862:81;:::o;53852:353::-;53937:10;-1:-1:-1;;;;;53937:22:0;;;53929:40;;;;-1:-1:-1;;;53929:40:0;;;;;;;:::i;:::-;54155:42;;;;;;;;;-1:-1:-1;;;;;54155:42:0;;;;;;;;;;;;;:19;:42::i;:::-;53852:353;;:::o;54242:470::-;54318:10;;;;54317:11;54309:32;;;;-1:-1:-1;;;54309:32:0;;;;;;;:::i;:::-;54419:11;;54415:231;;54447:19;54453:3;54458:7;54447:5;:19::i;:::-;54488:10;;54481:71;;-1:-1:-1;;;;;54488:10:0;54517;54537:4;54544:7;54481:35;:71::i;:::-;54606:12;;54567:67;;-1:-1:-1;;;54567:67:0;;40812:42;;54567:38;;:67;;54606:12;54620:7;;54629:4;;54567:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54415:231;54685:3;-1:-1:-1;;;;;54663:41:0;54673:10;-1:-1:-1;;;;;54663:41:0;;54690:7;54699:4;54663:41;;;;;;;:::i;:::-;;;;;;;;54242:470;;:::o;29529:127::-;-1:-1:-1;;;;;29630:18:0;29603:7;29630:18;;;;;;;;;;;;29529:127::o;43428:146::-;43094:5;;;;;-1:-1:-1;;;;;43094:5:0;43103:10;43094:19;43086:64;;;;-1:-1:-1;;;43086:64:0;;;;;;;:::i;:::-;43519:5:::1;::::0;43498:39:::1;::::0;43534:1:::1;::::0;43519:5;;::::1;-1:-1:-1::0;;;;;43519:5:0::1;::::0;43498:39:::1;::::0;43534:1;;43498:39:::1;43548:5;:18:::0;;-1:-1:-1;;;;;;43548:18:0::1;::::0;;43428:146::o;54748:444::-;54822:10;;;;54821:11;54813:32;;;;-1:-1:-1;;;54813:32:0;;;;;;;:::i;:::-;54923:11;;54919:206;;54951:19;54957:3;54962:7;54951:5;:19::i;:::-;54992:11;;54985:72;;-1:-1:-1;;;;;54992:11:0;55022:10;55042:4;55049:7;54985:36;:72::i;:::-;55087:10;;55072:41;;-1:-1:-1;;;55072:41:0;;-1:-1:-1;;;;;55087:10:0;;;;55072:32;;:41;;55105:7;;55072:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54919:206;55164:3;-1:-1:-1;;;;;55142:42:0;55152:10;-1:-1:-1;;;;;55142:42:0;;55169:7;55178:5;55142:42;;;;;;;:::i;43665:291::-;43714:10;;43707:48;;-1:-1:-1;;;;;43714:10:0;40812:42;43753:1;43707:30;:48::i;:::-;43773:10;;43766:58;;-1:-1:-1;;;;;43773:10:0;40812:42;-1:-1:-1;;43766:30:0;:58::i;:::-;43867:10;;43842:11;;43835:46;;-1:-1:-1;;;;;43842:11:0;;;;43867:10;;43835:31;:46::i;:::-;43924:10;;43899:11;;43892:56;;-1:-1:-1;;;;;43899:11:0;;;;43924:10;-1:-1:-1;;43892:31:0;:56::i;:::-;43665:291::o;41480:20::-;;;;;;-1:-1:-1;;;;;41480:20:0;;:::o;40950:81::-;40988:42;40950:81;:::o;42852:101::-;42933:12;42926:19;;;;;;;;-1:-1:-1;;42926:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42900:13;;42926:19;;42933:12;;42926:19;;42933:12;42926:19;;;;;;;;;;;;;;;;;;;;;;;;32507:269;32600:4;32617:129;32626:12;:10;:12::i;:::-;32640:7;32649:96;32688:15;32649:96;;;;;;;;;;;;;;;;;:11;:25;32661:12;:10;:12::i;:::-;-1:-1:-1;;;;;32649:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;32649:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;29869:175::-;29955:4;29972:42;29982:12;:10;:12::i;:::-;29996:9;30007:6;29972:9;:42::i;41455:18::-;;;;;;;;;:::o;51212:134::-;51272:29;51321:17;51329:8;51321:7;:17::i;45946:95::-;46019:7;:14;45946:95;:::o;41426:22::-;;;;;;:::o;53671:173::-;53795:41;;;;;;;;;-1:-1:-1;;;;;53795:41:0;;;;;;;;;;;:19;:41::i;:::-;53671:173;:::o;41103:25::-;;;-1:-1:-1;;;;;41103:25:0;;:::o;30107:151::-;-1:-1:-1;;;;;30223:18:0;;;30196:7;30223:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;30107:151::o;41135:27::-;;;;:::o;41070:26::-;;;-1:-1:-1;;;;;41070:26:0;;:::o;43178:242::-;43094:5;;;;;-1:-1:-1;;;;;43094:5:0;43103:10;43094:19;43086:64;;;;-1:-1:-1;;;43086:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43267:22:0;::::1;43259:73;;;;-1:-1:-1::0;;;43259:73:0::1;;;;;;;:::i;:::-;43369:5;::::0;43348:37:::1;::::0;-1:-1:-1;;;;;43348:37:0;;::::1;::::0;43369:5;;::::1;;::::0;43348:37:::1;::::0;;;::::1;43396:5;:16:::0;;-1:-1:-1;;;;;43396:16:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;43396:16:0;;::::1;::::0;;;::::1;::::0;;43178:242::o;41313:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41313:27:0;;;;-1:-1:-1;41313:27:0;;;-1:-1:-1;;;;;41313:27:0;;;;-1:-1:-1;;;41313:27:0;;;;:::o;43582:75::-;43094:5;;;;;-1:-1:-1;;;;;43094:5:0;43103:10;43094:19;43086:64;;;;-1:-1:-1;;;43086:64:0;;;;;;;:::i;:::-;43632:10:::1;:17:::0;;-1:-1:-1;;43632:17:0::1;43645:4;43632:17;::::0;;43582:75::o;56748:815::-;56828:6;;;;;;;56827:7;56819:31;;;;-1:-1:-1;;;56819:31:0;;;;;;;:::i;:::-;56861:5;:18;;;56869:10;56861:18;;-1:-1:-1;;;;;;56861:18:0;;;;;;;;;;;56895:39;;56928:5;;-1:-1:-1;;;;;56928:5:0;;-1:-1:-1;;56895:39:0;;-1:-1:-1;;56895:39:0;57008:41;;-1:-1:-1;;;57008:41:0;;56948:16;;;;;;40812:42;;57008:32;;:41;;57041:7;;57008:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;57060:10:0;:21;;-1:-1:-1;;;;;57060:21:0;;;-1:-1:-1;;;;;;57060:21:0;;;;;;;57092:11;:20;;;;;;;;;;;;;57123:10;:21;;;;;;;;;;;;;;;57155:12;:22;;;57238:20;;;-1:-1:-1;;;57238:20:0;;;;56947:102;;-1:-1:-1;56947:102:0;;-1:-1:-1;56947:102:0;;-1:-1:-1;57092:20:0;57238:18;;:20;;;;;-1:-1:-1;57060:10:0;;57238:20;;;;;;57092;57238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57238:20:0;;;;;;;;;;;;:::i;:::-;57210:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;57190:10;:80;;;;;;;;;;;;:::i;:::-;;57333:6;-1:-1:-1;;;;;57327:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57327:22:0;;;;;;;;;;;;:::i;:::-;57303:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;57281:12;:79;;;;;;;;;;;;:::i;:::-;-1:-1:-1;57371:10:0;:18;;-1:-1:-1;;57400:13:0;57371:18;57400:13;;;57518:12;:10;:12::i;:::-;57541:14;:12;:14::i;:::-;56748:815;;;;:::o;41347:52::-;;;;;;;;;;;;;:::o;51354:2309::-;51411:29;51453:14;51470:17;:15;:17::i;:::-;51591:7;:14;51453:34;;-1:-1:-1;51591:14:0;51628:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;51616:41;;51675:9;51670:1959;51694:11;51690:1;:15;51670:1959;;;51727:25;51755:7;51763:1;51755:10;;;;;;;;;;;;;;;;;;;;51882:19;;51875:52;;-1:-1:-1;;;51875:52:0;;51755:10;;-1:-1:-1;;;;;;51882:19:0;;51875:37;;:52;;51921:4;;51875:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51969:23;;;;51861:66;;-1:-1:-1;51942:16:0;;51961:32;;51861:66;;-1:-1:-1;;;51969:23:0;;-1:-1:-1;;;;;51969:23:0;51961:7;:32::i;:::-;52136:18;;;;51942:51;;-1:-1:-1;;;;;;52136:18:0;:32;52133:230;;52305:18;;;;52290:56;;-1:-1:-1;;;52290:56:0;;52277:70;;-1:-1:-1;;;;;52305:18:0;;52290:41;;:56;;52340:4;;52290:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52277:8;;:12;:70::i;:::-;52266:81;;52133:230;52391:22;;;;-1:-1:-1;;;;;52391:22:0;52432:10;;52428:89;;52471:30;52494:6;52471:18;:8;52484:4;52471:12;:18::i;:::-;:22;;:30::i;:::-;52467:34;52428:89;-1:-1:-1;;;;;52599:36:0;;52533:22;52599:36;;;:26;;;:36;;;;;;52558:89;;52642:4;;52558:79;;52593:43;;:1;;:5;:43::i;:::-;52558:30;52579:8;52558:20;:30::i;:::-;:34;;:79::i;:89::-;-1:-1:-1;;;;;52708:33:0;;;;;;:23;;;:33;;;;;;52533:114;;-1:-1:-1;52684:78:0;;52708:53;;52533:114;52708:37;:53::i;:::-;52684:9;52694:1;52684:12;;;;;;;;;;;;;;:19;;;:23;;:78;;;;:::i;:::-;52662:9;52672:1;52662:12;;;;;;;;;;;;;;;;;;;:19;:100;52798:19;;52777:12;;-1:-1:-1;;;;;52798:19:0;;;;52777:9;;52787:1;;52777:12;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52777:40:0;;;;;52976:14;52973:645;;53151:22;;;;-1:-1:-1;;;;;53151:22:0;;-1:-1:-1;53196:10:0;;53192:145;;53254:18;;;;53239:56;;-1:-1:-1;;;53239:56:0;;:78;;53310:6;;53239:66;;53300:4;;-1:-1:-1;;;;;53254:18:0;;;;53239:41;;:56;;53289:4;;53239:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:78::-;53235:1;:82;53231:86;;53192:145;-1:-1:-1;;;;;53413:36:0;;;;;;:26;;;:36;;;;;;53372:89;;53456:4;;53372:79;;53407:43;;:1;;:5;:43::i;53372:89::-;53510:41;;-1:-1:-1;;;53510:41:0;;53355:106;;-1:-1:-1;53510:9:0;;:25;;:41;;53355:106;;53510:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53480:9;41288:1;53480:20;;;;;;;;;;;;;;:27;;:71;;;;;40988:42;53570:9;41288:1;53570:20;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53570:32:0;;;;;52973:645;-1:-1:-1;;51707:3:0;;;;;-1:-1:-1;51670:1959:0;;-1:-1:-1;;51670:1959:0;;;53639:16;;51354:2309;;;:::o;25745:106::-;25833:10;25745:106;:::o;35654:346::-;-1:-1:-1;;;;;35756:19:0;;35748:68;;;;-1:-1:-1;;;35748:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35835:21:0;;35827:68;;;;-1:-1:-1;;;35827:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35908:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;35960:32;;;;;35938:6;;35960:32;:::i;:::-;;;;;;;;35654:346;;;:::o;33266:539::-;-1:-1:-1;;;;;33372:20:0;;33364:70;;;;-1:-1:-1;;;33364:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33453:23:0;;33445:71;;;;-1:-1:-1;;;33445:71:0;;;;;;;:::i;:::-;33529:47;33550:6;33558:9;33569:6;33529:20;:47::i;:::-;33609:71;33631:6;33609:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33609:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;33589:17:0;;;:9;:17;;;;;;;;;;;:91;;;;33714:20;;;;;;;:32;;33739:6;33714:24;:32::i;:::-;-1:-1:-1;;;;;33691:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;33762:35;;;;;;;;;;33790:6;;33762:35;:::i;8706:166::-;8792:7;8828:12;8820:6;;;;8812:29;;;;-1:-1:-1;;;8812:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8859:5:0;;;8706:166::o;34798:418::-;-1:-1:-1;;;;;34882:21:0;;34874:67;;;;-1:-1:-1;;;34874:67:0;;;;;;;:::i;:::-;34954:49;34975:7;34992:1;34996:6;34954:20;:49::i;:::-;35037:68;35060:6;35037:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35037:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;35016:18:0;;:9;:18;;;;;;;;;;:89;35131:12;;:24;;35148:6;35131:16;:24::i;:::-;35116:12;:39;35171:37;;35197:1;;-1:-1:-1;;;;;35171:37:0;;;;;;;35201:6;;35171:37;:::i;22040:177::-;22123:86;22143:5;22173:23;;;22198:2;22202:5;22150:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22150:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22150:58:0;-1:-1:-1;;;;;;22150:58:0;;;;;;;;;;22123:19;:86::i;5879:179::-;5937:7;5969:5;;;5993:6;;;;5985:46;;;;-1:-1:-1;;;5985:46:0;;;;;;;:::i;57740:422::-;57819:7;-1:-1:-1;;;;;57843:22:0;;;;:53;;-1:-1:-1;57881:15:0;;-1:-1:-1;;;;;57869:27:0;;;57881:15;;57869:27;57843:53;57839:94;;;-1:-1:-1;57920:1:0;57913:8;;57839:94;57977:15;;57945:18;;-1:-1:-1;;;;;57977:15:0;:29;57974:126;;58044:15;;58034:54;;-1:-1:-1;;;58034:54:0;;-1:-1:-1;;;;;58044:15:0;;;;58034:44;;:54;;58079:8;;58034:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58021:67;;57974:126;58119:35;58143:10;58119:19;58129:8;58119:9;:19::i;:::-;:23;;:35::i;49047:703::-;38880:1;39486:7;;:19;;39478:63;;;;-1:-1:-1;;;39478:63:0;;;;;;;:::i;:::-;38880:1;39619:7;:18;49204:10:::1;::::0;::::1;;49201:22;;;49216:7;;49201:22;49235:14;49252:17;:15;:17::i;:::-;49235:34;;49280;;:::i;:::-;49347;49368:9:::0;49378:1:::1;49368:12;;;;;49347:20;:34::i;:::-;49325:56:::0;;49414:34:::1;49435:9:::0;49445:1:::1;49435:12;::::0;49414:34:::1;49392:19;::::0;::::1;:56:::0;49484:10:::1;::::0;49469:57:::1;::::0;-1:-1:-1;;;49469:57:0;;-1:-1:-1;;;;;49484:10:0;;::::1;::::0;49469:36:::1;::::0;:57:::1;::::0;49514:4:::1;::::0;49409:1:::1;::::0;49469:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49539:14;:12;:14::i;:::-;49588:7;:14:::0;49566:19:::1;49613:130;49637:11;49633:1;:15;49613:130;;;49669:62;49689:1;49691:9;49701:16;49718:6;49725:5;49669:19;:62::i;:::-;49650:3;;49613:130;;;;39650:1;;;;-1:-1:-1::0;38836:1:0;39798:7;:22;49047:703::o;49758:560::-;38880:1;39486:7;;:19;;39478:63;;;;-1:-1:-1;;;39478:63:0;;;;;;;:::i;:::-;38880:1;39619:7;:18;49850:14:::1;49867:17;:15;:17::i;:::-;49850:34;;49895;;:::i;:::-;49962;49983:9:::0;49993:1:::1;49983:12;::::0;49962:34:::1;49940:56:::0;;50053:10:::1;::::0;50038:57:::1;::::0;-1:-1:-1;;;50038:57:0;;-1:-1:-1;;;;;50053:10:0;;::::1;::::0;50038:36:::1;::::0;:57:::1;::::0;50083:4:::1;::::0;50053:10;;50038:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50108:14;:12;:14::i;:::-;50157:7;:14:::0;50135:19:::1;50182:129;50206:11;50202:1;:15;50182:129;;;50238:61;50258:1;50260:9;50270:16;50287:6;50294:4;50238:19;:61::i;:::-;50219:3;;50182:129;;34087:378:::0;-1:-1:-1;;;;;34171:21:0;;34163:65;;;;-1:-1:-1;;;34163:65:0;;;;;;;:::i;:::-;34241:49;34270:1;34274:7;34283:6;34241:20;:49::i;:::-;34318:12;;:24;;34335:6;34318:16;:24::i;:::-;34303:12;:39;-1:-1:-1;;;;;34374:18:0;;:9;:18;;;;;;;;;;;:30;;34397:6;34374:22;:30::i;:::-;-1:-1:-1;;;;;34353:18:0;;:9;:18;;;;;;;;;;;:51;;;;34420:37;;34353:18;;:9;34420:37;;;;34450:6;;34420:37;:::i;22225:205::-;22326:96;22346:5;22376:27;;;22405:4;22411:2;22415:5;22353:68;;;;;;;;;;:::i;22699:622::-;23069:10;;;23068:62;;-1:-1:-1;23085:39:0;;-1:-1:-1;;;23085:39:0;;-1:-1:-1;;;;;23085:15:0;;;;;:39;;23109:4;;23116:7;;23085:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23068:62;23060:152;;;;-1:-1:-1;;;23060:152:0;;;;;;;:::i;:::-;23223:90;23243:5;23273:22;;;23297:7;23306:5;23250:62;;;;;;;;;:::i;46339:178::-;46396:7;46496:13;:11;:13::i;:::-;46489:20;;46339:178;:::o;6341:158::-;6399:7;6432:1;6427;:6;;6419:49;;;;-1:-1:-1;;;6419:49:0;;;;;;;:::i;:::-;-1:-1:-1;6486:5:0;;;6341:158::o;6758:220::-;6816:7;6840:6;6836:20;;-1:-1:-1;6855:1:0;6848:8;;6836:20;6879:5;;;6883:1;6879;:5;:1;6903:5;;;;;:10;6895:56;;;;-1:-1:-1;;;6895:56:0;;;;;;;:::i;7456:153::-;7514:7;7546:1;7542;:5;7534:44;;;;-1:-1:-1;;;7534:44:0;;;;;;;:::i;:::-;7600:1;7596;:5;;;;;;;7456:153;-1:-1:-1;;;7456:153:0:o;56111:137::-;56215:25;;;;;;;;;-1:-1:-1;;;;;56215:25:0;;;;;;;;;;;;;:11;:25::i;24345:761::-;24769:23;24795:69;24823:4;24795:69;;;;;;;;;;;;;;;;;24803:5;-1:-1:-1;;;;;24795:27:0;;;:69;;;;;:::i;:::-;24879:17;;24769:95;;-1:-1:-1;24879:21:0;24875:224;;25021:10;25010:30;;;;;;;;;;;;:::i;:::-;25002:85;;;;-1:-1:-1;;;25002:85:0;;;;;;;:::i;46525:2514::-;46680:25;46708:7;46716:6;46708:15;;;;;;;;;;;;;;;;;;;;46924:19;;46917:52;;-1:-1:-1;;;46917:52:0;;46708:15;;-1:-1:-1;;;;;;46924:19:0;;46917:37;;:52;;46963:4;;46917:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46903:66;;47061:1;47051:7;:11;:51;;;;-1:-1:-1;47074:23:0;;;;47101:1;;47066:32;;:3;;-1:-1:-1;;;47074:23:0;;-1:-1:-1;;;;;47074:23:0;47066:7;:32::i;:::-;:36;47051:51;47047:198;;;47185:23;;;;47177:55;;47224:7;;47177:42;;47214:4;;47177:32;;:3;;-1:-1:-1;;;47185:23:0;;-1:-1:-1;;;;;47185:23:0;47177:7;:32::i;:55::-;47144:22;;;;;-1:-1:-1;;;;;;47119:114:0;;-1:-1:-1;;;;;47144:22:0;;;:89;;;;47119:114;;;;;;;47047:198;47295:9;47290:1546;47314:16;47310:1;:20;47290:1546;;;47428:1;47404:9;47414:1;47404:12;;;;;;;;;;;-1:-1:-1;;;;;47404:26:0;;47400:40;;;47432:8;;47400:40;47475:15;;-1:-1:-1;;;;;47475:15:0;47459:9;47469:1;47459:12;;;;;;;;;;;-1:-1:-1;;;;;47459:31:0;;47455:45;;;47492:8;;47455:45;47518:8;:18;;;;-1:-1:-1;47530:6:0;;;47518:18;47515:31;;;47538:8;;47515:31;47630:10;47643:6;:26;;:40;47670:9;47680:1;47670:12;;;;;;;;;;;-1:-1:-1;;;;;47643:40:0;-1:-1:-1;;;;;47643:40:0;;;;;;;;;;;;;47630:53;;47701:8;:42;;;-1:-1:-1;47721:22:0;;;;-1:-1:-1;;;;;47721:22:0;47713:30;;47701:42;47698:1127;;;47766:8;47763:963;;;47888:22;;;;47798:19;;47820:114;;47862:71;;47928:4;;47862:61;;47880:42;;-1:-1:-1;;;;;47888:22:0;47916:5;47880:35;:42::i;:::-;47862:9;47872:1;47862:12;;;;;;;;;;;;:16;:61::i;:71::-;47820:6;:23;;:37;47844:9;47854:1;47844:12;;;;;;;;;;;-1:-1:-1;;;;;47820:37:0;-1:-1:-1;;;;;47820:37:0;;;;;;;;;;;;;:41;;:114;;;;:::i;:::-;47798:136;-1:-1:-1;47960:15:0;;47957:549;;48043:1;48003:6;:23;;:37;48027:9;48037:1;48027:12;;;;;;;;;;;-1:-1:-1;;;;;48003:37:0;-1:-1:-1;;;;;48003:37:0;;;;;;;;;;;;:41;;;;48360:69;48401:9;48411:1;48413;48411:3;48401:14;;;;;;;;;;;48367:19;;-1:-1:-1;;;;;48367:19:0;;48417:11;48360:40;:69::i;:::-;48462:20;:3;48470:11;48462:7;:20::i;:::-;48456:26;;47957:549;47763:963;;;;48660:22;;;;48592:114;;48634:71;;48700:4;;48634:61;;48652:42;;-1:-1:-1;;;;;48660:22:0;48688:5;48652:35;:42::i;:::-;48634:9;48644:1;48634:12;;;;;;:71;48592:6;:23;;:37;48616:9;48626:1;48616:12;;;;;;48592:114;48552:6;:23;;:37;48576:9;48586:1;48576:12;;;;;;;;;;;-1:-1:-1;;;;;48552:37:0;-1:-1:-1;;;;;48552:37:0;;;;;;;;;;;;:154;;;;47763:963;48787:22;;;;;-1:-1:-1;;;;;48787:22:0;;48744:26;;;;48787:22;;48771:9;;48781:1;;48771:12;;;;;;;;;;-1:-1:-1;;;;;48744:40:0;-1:-1:-1;;;;;48744:40:0;;;;;;;;;;;;:65;;;;47698:1127;47290:1546;;47332:3;;47290:1546;;;-1:-1:-1;48943:23:0;;;;-1:-1:-1;;;48943:23:0;;-1:-1:-1;;;;;48943:23:0;48936:30;;48933:99;;48982:23;;;:38;;-1:-1:-1;;;;;48982:38:0;;;-1:-1:-1;;;48982:38:0;;;;;;48933:99;46525:2514;;;;;;;:::o;17041:195::-;17144:12;17176:52;17198:6;17206:4;17212:1;17215:12;17176:21;:52::i;:::-;17169:59;17041:195;-1:-1:-1;;;;17041:195:0:o;18093:530::-;18220:12;18278:5;18253:21;:30;;18245:81;;;;-1:-1:-1;;;18245:81:0;;;;;;;:::i;:::-;18345:18;18356:6;18345:10;:18::i;:::-;18337:60;;;;-1:-1:-1;;;18337:60:0;;;;;;;:::i;:::-;18471:12;18485:23;18512:6;-1:-1:-1;;;;;18512:11:0;18532:5;18540:4;18512:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18470:75;;;;18563:52;18581:7;18590:10;18602:12;18563:17;:52::i;:::-;18556:59;18093:530;-1:-1:-1;;;;;;;18093:530:0:o;14123:422::-;14490:20;14529:8;;;14123:422::o;20633:742::-;20748:12;20777:7;20773:595;;;-1:-1:-1;20808:10:0;20801:17;;20773:595;20922:17;;:21;20918:439;;21185:10;21179:17;21246:15;21233:10;21229:2;21225:19;21218:44;21133:148;21328:12;21321:20;;-1:-1:-1;;;21321:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;1149:241;;1253:2;1241:9;1232:7;1228:23;1224:32;1221:2;;;-1:-1;;1259:12;1221:2;85:6;72:20;97:33;124:5;97:33;:::i;1397:263::-;;1512:2;1500:9;1491:7;1487:23;1483:32;1480:2;;;-1:-1;;1518:12;1480:2;226:6;220:13;238:33;265:5;238:33;:::i;1667:366::-;;;1788:2;1776:9;1767:7;1763:23;1759:32;1756:2;;;-1:-1;;1794:12;1756:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1846:63;-1:-1;1946:2;1985:22;;72:20;97:33;72:20;97:33;:::i;:::-;1954:63;;;;1750:283;;;;;:::o;2040:940::-;;;;;;;2237:3;2225:9;2216:7;2212:23;2208:33;2205:2;;;-1:-1;;2244:12;2205:2;226:6;220:13;238:33;265:5;238:33;:::i;:::-;2407:2;2457:22;;220:13;2296:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;2526:2;2576:22;;220:13;2415:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;2645:2;2695:22;;220:13;2534:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;2764:3;2815:22;;220:13;2653:74;;-1:-1;238:33;220:13;238:33;:::i;:::-;2884:3;2932:22;;358:13;2773:74;;-1:-1;36390:13;;36383:21;37516:32;;37506:2;;-1:-1;;37552:12;37506:2;2893:71;;;;2199:781;;;;;;;;:::o;2987:491::-;;;;3125:2;3113:9;3104:7;3100:23;3096:32;3093:2;;;-1:-1;;3131:12;3093:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3183:63;-1:-1;3283:2;3322:22;;72:20;97:33;72:20;97:33;:::i;:::-;3087:391;;3291:63;;-1:-1;;;3391:2;3430:22;;;;938:20;;3087:391::o;3485:366::-;;;3606:2;3594:9;3585:7;3581:23;3577:32;3574:2;;;-1:-1;;3612:12;3574:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3664:63;3764:2;3803:22;;;;938:20;;-1:-1;;;3568:283::o;3858:257::-;;3970:2;3958:9;3949:7;3945:23;3941:32;3938:2;;;-1:-1;;3976:12;3938:2;364:6;358:13;37541:5;36390:13;36383:21;37519:5;37516:32;37506:2;;-1:-1;;37552:12;4122:362;;4247:2;4235:9;4226:7;4222:23;4218:32;4215:2;;;-1:-1;;4253:12;4215:2;4304:17;4298:24;4342:18;;4334:6;4331:30;4328:2;;;-1:-1;;4364:12;4328:2;4451:6;4440:9;4436:22;;;532:3;525:4;517:6;513:17;509:27;499:2;;-1:-1;;540:12;499:2;580:6;574:13;4342:18;34581:6;34578:30;34575:2;;;-1:-1;;34611:12;34575:2;34244;34238:9;34684;34665:17;;-1:-1;;34661:33;34270:17;;4247:2;34270:17;34330:34;;;34366:22;;;34327:62;34324:2;;;-1:-1;;34392:12;34324:2;34244;34411:22;673:21;;;773:16;;;4247:2;773:16;770:25;-1:-1;767:2;;;-1:-1;;798:12;767:2;818:39;850:6;4247:2;749:5;745:16;4247:2;715:6;711:17;818:39;:::i;:::-;4384:84;4209:275;-1:-1;;;;;;4209:275::o;4491:241::-;;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;-1:-1;;4601:12;4563:2;-1:-1;938:20;;4557:175;-1:-1;4557:175::o;4739:263::-;;4854:2;4842:9;4833:7;4829:23;4825:32;4822:2;;;-1:-1;;4860:12;4822:2;-1:-1;1086:13;;4816:186;-1:-1;4816:186::o;5009:366::-;;;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;-1:-1;;5136:12;5098:2;951:6;938:20;5188:63;;5288:2;5331:9;5327:22;72:20;97:33;124:5;97:33;:::i;18297:271::-;;7192:5;35091:12;7303:52;7348:6;7343:3;7336:4;7329:5;7325:16;7303:52;:::i;:::-;7367:16;;;;;18431:137;-1:-1;;18431:137::o;18575:809::-;;-1:-1;;;10716:11;10709:30;7192:5;35091:12;7303:52;7348:6;10694:1;10762:3;10758:11;7336:4;7329:5;7325:16;7303:52;:::i;:::-;-1:-1;;;10694:1;7367:16;;;;;;;10022:28;-1:-1;10069:11;;;18913:471;-1:-1;18913:471::o;19391:809::-;;-1:-1;;;14249:11;14242:26;7192:5;35091:12;7303:52;7348:6;14227:1;14291:3;14287:11;7336:4;7329:5;7325:16;7303:52;:::i;:::-;-1:-1;;;14227:1;7367:16;;;;;;;11778:28;-1:-1;11825:11;;;19729:471;-1:-1;19729:471::o;20207:222::-;-1:-1;;;;;36598:54;;;;5737:37;;20334:2;20319:18;;20305:124::o;20436:333::-;-1:-1;;;;;36598:54;;;5737:37;;36598:54;;20755:2;20740:18;;5737:37;20591:2;20576:18;;20562:207::o;20776:556::-;-1:-1;;;;;36598:54;;;5737:37;;36598:54;;;;21152:2;21137:18;;5737:37;-1:-1;;;;;36478:46;;;21235:2;21220:18;;17776:37;36478:46;;;21318:2;21303:18;;17776:37;20987:3;20972:19;;20958:374::o;21339:444::-;-1:-1;;;;;36598:54;;;5737:37;;36598:54;;;;21686:2;21671:18;;5737:37;21769:2;21754:18;;17886:37;;;;21522:2;21507:18;;21493:290::o;21790:321::-;-1:-1;;;;;36598:54;;;;5737:37;;36390:13;36383:21;22097:2;22082:18;;6986:34;21939:2;21924:18;;21910:201::o;22118:349::-;-1:-1;;;;;36598:54;;;;5737:37;;22453:2;22438:18;;7474:58;22281:2;22266:18;;22252:215::o;22814:482::-;23047:2;23061:47;;;35091:12;;23032:18;;;35679:19;;;22814:482;;23047:2;35719:14;;;;;;34917;;;22814:482;6547:344;6572:6;6569:1;6566:13;6547:344;;;6633:13;;17429:23;;-1:-1;;;;;36598:54;5737:37;;17591:16;;17585:23;17662:14;;;17886:37;5648:14;;;;35506;;;;4342:18;6587:9;6547:344;;;-1:-1;23114:172;;23018:278;-1:-1;;;;;;;23018:278::o;23303:210::-;36390:13;;36383:21;6986:34;;23424:2;23409:18;;23395:118::o;23520:310::-;;23667:2;23688:17;23681:47;7689:5;35091:12;35691:6;23667:2;23656:9;23652:18;35679:19;7783:52;7828:6;35719:14;23656:9;35719:14;23667:2;7809:5;7805:16;7783:52;:::i;:::-;34684:9;37299:14;-1:-1;;37295:28;7847:39;;;;35719:14;7847:39;;23638:192;-1:-1;;23638:192::o;23837:416::-;24037:2;24051:47;;;8490:2;24022:18;;;35679:19;8526:34;35719:14;;;8506:55;-1:-1;;;8581:12;;;8574:27;8620:12;;;24008:245::o;24260:416::-;24460:2;24474:47;;;8871:2;24445:18;;;35679:19;8907:34;35719:14;;;8887:55;-1:-1;;;8962:12;;;8955:30;9004:12;;;24431:245::o;24683:416::-;24883:2;24897:47;;;9255:2;24868:18;;;35679:19;9291:34;35719:14;;;9271:55;-1:-1;;;9346:12;;;9339:26;9384:12;;;24854:245::o;25106:416::-;25306:2;25320:47;;;9635:2;25291:18;;;35679:19;9671:29;35719:14;;;9651:50;9720:12;;;25277:245::o;25529:416::-;25729:2;25743:47;;;10319:2;25714:18;;;35679:19;10355:32;35719:14;;;10335:53;10407:12;;;25700:245::o;25952:416::-;26152:2;26166:47;;;11008:2;26137:18;;;35679:19;11044:34;35719:14;;;11024:55;-1:-1;;;11099:12;;;11092:30;11141:12;;;26123:245::o;26375:416::-;26575:2;26589:47;;;11392:2;26560:18;;;35679:19;11428:28;35719:14;;;11408:49;11476:12;;;26546:245::o;26798:416::-;26998:2;27012:47;;;12075:2;26983:18;;;35679:19;-1:-1;;;35719:14;;;12091:35;12145:12;;;26969:245::o;27221:416::-;27421:2;27435:47;;;12396:2;27406:18;;;35679:19;12432:34;35719:14;;;12412:55;-1:-1;;;12487:12;;;12480:25;12524:12;;;27392:245::o;27644:416::-;27844:2;27858:47;;;27829:18;;;35679:19;12811:34;35719:14;;;12791:55;12865:12;;;27815:245::o;28067:416::-;28267:2;28281:47;;;13116:1;28252:18;;;35679:19;-1:-1;;;35719:14;;;13131:28;13178:12;;;28238:245::o;28490:416::-;28690:2;28704:47;;;13429:2;28675:18;;;35679:19;13465:34;35719:14;;;13445:55;-1:-1;;;13520:12;;;13513:25;13557:12;;;28661:245::o;28913:416::-;29113:2;29127:47;;;13808:2;29098:18;;;35679:19;13844:34;35719:14;;;13824:55;-1:-1;;;13899:12;;;13892:29;13940:12;;;29084:245::o;29336:416::-;29536:2;29550:47;;;14537:1;29521:18;;;35679:19;-1:-1;;;35719:14;;;14552:31;14602:12;;;29507:245::o;29759:416::-;29959:2;29973:47;;;14853:2;29944:18;;;35679:19;14889:34;35719:14;;;14869:55;-1:-1;;;14944:12;;;14937:28;14984:12;;;29930:245::o;30182:416::-;30382:2;30396:47;;;15235:2;30367:18;;;35679:19;15271:31;35719:14;;;15251:52;15322:12;;;30353:245::o;30605:416::-;30805:2;30819:47;;;15573:2;30790:18;;;35679:19;15609:34;35719:14;;;15589:55;-1:-1;;;15664:12;;;15657:34;15710:12;;;30776:245::o;31028:416::-;31228:2;31242:47;;;15961:2;31213:18;;;35679:19;15997:33;35719:14;;;15977:54;16050:12;;;31199:245::o;31451:416::-;31651:2;31665:47;;;16301:2;31636:18;;;35679:19;16337:34;35719:14;;;16317:55;-1:-1;;;16392:12;;;16385:46;16450:12;;;31622:245::o;31874:416::-;32074:2;32088:47;;;16701:2;32059:18;;;35679:19;-1:-1;;;35719:14;;;16717:34;16770:12;;;32045:245::o;32297:416::-;32497:2;32511:47;;;17021:2;32482:18;;;35679:19;17057:33;35719:14;;;17037:54;17110:12;;;32468:245::o;32720:238::-;17886:37;;;32855:2;32840:18;;32826:132::o;33194:321::-;17886:37;;;36390:13;36383:21;33501:2;33486:18;;6986:34;33343:2;33328:18;;33314:201::o;33522:432::-;17886:37;;;33863:2;33848:18;;17886:37;;;;36390:13;36383:21;33940:2;33925:18;;6986:34;33699:2;33684:18;;33670:284::o;33961:214::-;36814:4;36803:16;;;;18250:35;;34084:2;34069:18;;34055:120::o;36955:268::-;37020:1;37027:101;37041:6;37038:1;37035:13;37027:101;;;37108:11;;;37102:18;37089:11;;;37082:39;37063:2;37056:10;37027:101;;;37143:6;37140:1;37137:13;37134:2;;;-1:-1;;37020:1;37190:16;;37183:27;37004:219::o;37336:117::-;-1:-1;;;;;36598:54;;37395:35;;37385:2;;37444:1;;37434:12
Swarm Source
ipfs://cf4ef3e9927ffda3fc30df161533cab9f403f2994468883d2f7d5cad546840fb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.