Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Avatar
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-02-26
*/
/*
B.PROTOCOL TERMS OF USE
=======================
THE TERMS OF USE CONTAINED HEREIN (THESE “TERMS”) GOVERN YOUR USE OF B.PROTOCOL, WHICH IS A DECENTRALIZED PROTOCOL ON THE ETHEREUM BLOCKCHAIN (the “PROTOCOL”) THAT enables a backstop liquidity mechanism FOR DECENTRALIZED LENDING PLATFORMS (“DLPs”).
PLEASE READ THESE TERMS CAREFULLY AT https://github.com/backstop-protocol/Terms-and-Conditions, INCLUDING ALL DISCLAIMERS AND RISK FACTORS, BEFORE USING THE PROTOCOL. BY USING THE PROTOCOL, YOU ARE IRREVOCABLY CONSENTING TO BE BOUND BY THESE TERMS.
IF YOU DO NOT AGREE TO ALL OF THESE TERMS, DO NOT USE THE PROTOCOL. YOUR RIGHT TO USE THE PROTOCOL IS SUBJECT AND DEPENDENT BY YOUR AGREEMENT TO ALL TERMS AND CONDITIONS SET FORTH HEREIN, WHICH AGREEMENT SHALL BE EVIDENCED BY YOUR USE OF THE PROTOCOL.
Minors Prohibited: The Protocol is not directed to individuals under the age of eighteen (18) or the age of majority in your jurisdiction if the age of majority is greater. If you are under the age of eighteen or the age of majority (if greater), you are not authorized to access or use the Protocol. By using the Protocol, you represent and warrant that you are above such age.
License; No Warranties; Limitation of Liability;
(a) The software underlying the Protocol is licensed for use in accordance with the 3-clause BSD License, which can be accessed here: https://opensource.org/licenses/BSD-3-Clause.
(b) THE PROTOCOL IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", “WITH ALL FAULTS” and “AS AVAILABLE” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
(c) IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// File: contracts/bprotocol/interfaces/IComptroller.sol
pragma solidity 0.5.16;
interface IComptroller {
// ComptrollerLensInterface.sol
// =============================
function markets(address) external view returns (bool, uint);
function oracle() external view returns (address);
function getAccountLiquidity(address) external view returns (uint, uint, uint);
function getAssetsIn(address) external view returns (address[] memory);
function compAccrued(address) external view returns (uint);
// Claim all the COMP accrued by holder in all markets
function claimComp(address holder) external;
// Claim all the COMP accrued by holder in specific markets
function claimComp(address holder, address[] calldata cTokens) external;
function claimComp(address[] calldata holders, address[] calldata cTokens, bool borrowers, bool suppliers) external;
// Public storage defined in Comptroller contract
// ===============================================
function checkMembership(address account, address cToken) external view returns (bool);
function closeFactorMantissa() external returns (uint256);
function liquidationIncentiveMantissa() external returns (uint256);
// Public/external functions defined in Comptroller contract
// ==========================================================
function enterMarkets(address[] calldata cTokens) external returns (uint[] memory);
function exitMarket(address cToken) external returns (uint);
function mintAllowed(address cToken, address minter, uint mintAmount) external returns (uint);
function borrowAllowed(address cToken, address borrower, uint borrowAmount) external returns (uint);
function getAllMarkets() external view returns (address[] memory);
function liquidateCalculateSeizeTokens(
address cTokenBorrowed,
address cTokenCollateral,
uint actualRepayAmount) external view returns (uint, uint);
function compBorrowState(address cToken) external returns (uint224, uint32);
function compSupplyState(address cToken) external returns (uint224, uint32);
}
// File: contracts/bprotocol/interfaces/IRegistry.sol
pragma solidity 0.5.16;
interface IRegistry {
// Ownable
function transferOwnership(address newOwner) external;
// Compound contracts
function comp() external view returns (address);
function comptroller() external view returns (address);
function cEther() external view returns (address);
// B.Protocol contracts
function bComptroller() external view returns (address);
function score() external view returns (address);
function pool() external view returns (address);
// Avatar functions
function delegate(address avatar, address delegatee) external view returns (bool);
function doesAvatarExist(address avatar) external view returns (bool);
function doesAvatarExistFor(address owner) external view returns (bool);
function ownerOf(address avatar) external view returns (address);
function avatarOf(address owner) external view returns (address);
function newAvatar() external returns (address);
function getAvatar(address owner) external returns (address);
// avatar whitelisted calls
function whitelistedAvatarCalls(address target, bytes4 functionSig) external view returns(bool);
function setPool(address newPool) external;
function setWhitelistAvatarCall(address target, bytes4 functionSig, bool list) external;
}
// File: contracts/bprotocol/interfaces/IScore.sol
pragma solidity 0.5.16;
interface IScore {
function updateDebtScore(address _user, address cToken, int256 amount) external;
function updateCollScore(address _user, address cToken, int256 amount) external;
function slashedScore(address _user, address cToken, int256 amount) external;
}
// File: contracts/bprotocol/lib/CarefulMath.sol
pragma solidity 0.5.16;
/**
* @title Careful Math
* @author Compound
* @notice COPY TAKEN FROM COMPOUND FINANCE
* @notice Derived from OpenZeppelin's SafeMath library
* https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol
*/
contract CarefulMath {
/**
* @dev Possible error codes that we can return
*/
enum MathError {
NO_ERROR,
DIVISION_BY_ZERO,
INTEGER_OVERFLOW,
INTEGER_UNDERFLOW
}
/**
* @dev Multiplies two numbers, returns an error on overflow.
*/
function mulUInt(uint a, uint b) internal pure returns (MathError, uint) {
if (a == 0) {
return (MathError.NO_ERROR, 0);
}
uint c = a * b;
if (c / a != b) {
return (MathError.INTEGER_OVERFLOW, 0);
} else {
return (MathError.NO_ERROR, c);
}
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function divUInt(uint a, uint b) internal pure returns (MathError, uint) {
if (b == 0) {
return (MathError.DIVISION_BY_ZERO, 0);
}
return (MathError.NO_ERROR, a / b);
}
/**
* @dev Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend).
*/
function subUInt(uint a, uint b) internal pure returns (MathError, uint) {
if (b <= a) {
return (MathError.NO_ERROR, a - b);
} else {
return (MathError.INTEGER_UNDERFLOW, 0);
}
}
/**
* @dev Adds two numbers, returns an error on overflow.
*/
function addUInt(uint a, uint b) internal pure returns (MathError, uint) {
uint c = a + b;
if (c >= a) {
return (MathError.NO_ERROR, c);
} else {
return (MathError.INTEGER_OVERFLOW, 0);
}
}
/**
* @dev add a and b and then subtract c
*/
function addThenSubUInt(uint a, uint b, uint c) internal pure returns (MathError, uint) {
(MathError err0, uint sum) = addUInt(a, b);
if (err0 != MathError.NO_ERROR) {
return (err0, 0);
}
return subUInt(sum, c);
}
}
// File: contracts/bprotocol/lib/Exponential.sol
pragma solidity 0.5.16;
/**
* @title Exponential module for storing fixed-precision decimals
* @author Compound
* @notice Exp is a struct which stores decimals with a fixed precision of 18 decimal places.
* Thus, if we wanted to store the 5.1, mantissa would store 5.1e18. That is:
* `Exp({mantissa: 5100000000000000000})`.
*/
contract Exponential is CarefulMath {
uint constant expScale = 1e18;
uint constant doubleScale = 1e36;
uint constant halfExpScale = expScale/2;
uint constant mantissaOne = expScale;
struct Exp {
uint mantissa;
}
struct Double {
uint mantissa;
}
/**
* @dev Creates an exponential from numerator and denominator values.
* Note: Returns an error if (`num` * 10e18) > MAX_INT,
* or if `denom` is zero.
*/
function getExp(uint num, uint denom) pure internal returns (MathError, Exp memory) {
(MathError err0, uint scaledNumerator) = mulUInt(num, expScale);
if (err0 != MathError.NO_ERROR) {
return (err0, Exp({mantissa: 0}));
}
(MathError err1, uint rational) = divUInt(scaledNumerator, denom);
if (err1 != MathError.NO_ERROR) {
return (err1, Exp({mantissa: 0}));
}
return (MathError.NO_ERROR, Exp({mantissa: rational}));
}
/**
* @dev Multiply an Exp by a scalar, returning a new Exp.
*/
function mulScalar(Exp memory a, uint scalar) pure internal returns (MathError, Exp memory) {
(MathError err0, uint scaledMantissa) = mulUInt(a.mantissa, scalar);
if (err0 != MathError.NO_ERROR) {
return (err0, Exp({mantissa: 0}));
}
return (MathError.NO_ERROR, Exp({mantissa: scaledMantissa}));
}
/**
* @dev Multiply an Exp by a scalar, then truncate to return an unsigned integer.
*/
function mulScalarTruncate(Exp memory a, uint scalar) pure internal returns (MathError, uint) {
(MathError err, Exp memory product) = mulScalar(a, scalar);
if (err != MathError.NO_ERROR) {
return (err, 0);
}
return (MathError.NO_ERROR, truncate(product));
}
/**
* @dev Divide a scalar by an Exp, returning a new Exp.
*/
function divScalarByExp(uint scalar, Exp memory divisor) pure internal returns (MathError, Exp memory) {
/*
We are doing this as:
getExp(mulUInt(expScale, scalar), divisor.mantissa)
How it works:
Exp = a / b;
Scalar = s;
`s / (a / b)` = `b * s / a` and since for an Exp `a = mantissa, b = expScale`
*/
(MathError err0, uint numerator) = mulUInt(expScale, scalar);
if (err0 != MathError.NO_ERROR) {
return (err0, Exp({mantissa: 0}));
}
return getExp(numerator, divisor.mantissa);
}
/**
* @dev Multiplies two exponentials, returning a new exponential.
*/
function mulExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
(MathError err0, uint doubleScaledProduct) = mulUInt(a.mantissa, b.mantissa);
if (err0 != MathError.NO_ERROR) {
return (err0, Exp({mantissa: 0}));
}
// We add half the scale before dividing so that we get rounding instead of truncation.
// See "Listing 6" and text above it at https://accu.org/index.php/journals/1717
// Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18.
(MathError err1, uint doubleScaledProductWithHalfScale) = addUInt(halfExpScale, doubleScaledProduct);
if (err1 != MathError.NO_ERROR) {
return (err1, Exp({mantissa: 0}));
}
(MathError err2, uint product) = divUInt(doubleScaledProductWithHalfScale, expScale);
// The only error `div` can return is MathError.DIVISION_BY_ZERO but we control `expScale` and it is not zero.
assert(err2 == MathError.NO_ERROR);
return (MathError.NO_ERROR, Exp({mantissa: product}));
}
/**
* @dev Multiplies two exponentials given their mantissas, returning a new exponential.
*/
function mulExp(uint a, uint b) pure internal returns (MathError, Exp memory) {
return mulExp(Exp({mantissa: a}), Exp({mantissa: b}));
}
/**
* @dev Divides two exponentials, returning a new exponential.
* (a/scale) / (b/scale) = (a/scale) * (scale/b) = a/b,
* which we can scale as an Exp by calling getExp(a.mantissa, b.mantissa)
*/
function divExp(Exp memory a, Exp memory b) pure internal returns (MathError, Exp memory) {
return getExp(a.mantissa, b.mantissa);
}
/**
* @dev Truncates the given exp to a whole number value.
* For example, truncate(Exp{mantissa: 15 * expScale}) = 15
*/
function truncate(Exp memory exp) pure internal returns (uint) {
// Note: We are not using careful math here as we're performing a division that cannot fail
return exp.mantissa / expScale;
}
function safe224(uint n, string memory errorMessage) pure internal returns (uint224) {
require(n < 2**224, errorMessage);
return uint224(n);
}
function add_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
return Exp({mantissa: add_(a.mantissa, b.mantissa)});
}
function add_(Double memory a, Double memory b) pure internal returns (Double memory) {
return Double({mantissa: add_(a.mantissa, b.mantissa)});
}
function add_(uint a, uint b) pure internal returns (uint) {
return add_(a, b, "addition overflow");
}
function add_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
uint c = a + b;
require(c >= a, errorMessage);
return c;
}
function sub_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
return Exp({mantissa: sub_(a.mantissa, b.mantissa)});
}
function sub_(Double memory a, Double memory b) pure internal returns (Double memory) {
return Double({mantissa: sub_(a.mantissa, b.mantissa)});
}
function sub_(uint a, uint b) pure internal returns (uint) {
return sub_(a, b, "subtraction underflow");
}
function sub_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
require(b <= a, errorMessage);
return a - b;
}
function mul_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
return Exp({mantissa: mul_(a.mantissa, b.mantissa) / expScale});
}
function mul_(Exp memory a, uint b) pure internal returns (Exp memory) {
return Exp({mantissa: mul_(a.mantissa, b)});
}
function mul_(uint a, Exp memory b) pure internal returns (uint) {
return mul_(a, b.mantissa) / expScale;
}
function mul_(Double memory a, Double memory b) pure internal returns (Double memory) {
return Double({mantissa: mul_(a.mantissa, b.mantissa) / doubleScale});
}
function mul_(Double memory a, uint b) pure internal returns (Double memory) {
return Double({mantissa: mul_(a.mantissa, b)});
}
function mul_(uint a, Double memory b) pure internal returns (uint) {
return mul_(a, b.mantissa) / doubleScale;
}
function mul_(uint a, uint b) pure internal returns (uint) {
return mul_(a, b, "multiplication overflow");
}
function mul_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
if (a == 0 || b == 0) {
return 0;
}
uint c = a * b;
require(c / a == b, errorMessage);
return c;
}
function div_(Exp memory a, Exp memory b) pure internal returns (Exp memory) {
return Exp({mantissa: div_(mul_(a.mantissa, expScale), b.mantissa)});
}
function div_(Exp memory a, uint b) pure internal returns (Exp memory) {
return Exp({mantissa: div_(a.mantissa, b)});
}
function div_(uint a, Exp memory b) pure internal returns (uint) {
return div_(mul_(a, expScale), b.mantissa);
}
function div_(Double memory a, Double memory b) pure internal returns (Double memory) {
return Double({mantissa: div_(mul_(a.mantissa, doubleScale), b.mantissa)});
}
function div_(Double memory a, uint b) pure internal returns (Double memory) {
return Double({mantissa: div_(a.mantissa, b)});
}
function div_(uint a, Double memory b) pure internal returns (uint) {
return div_(mul_(a, doubleScale), b.mantissa);
}
function div_(uint a, uint b) pure internal returns (uint) {
return div_(a, b, "divide by zero");
}
function div_(uint a, uint b, string memory errorMessage) pure internal returns (uint) {
require(b > 0, errorMessage);
return a / b;
}
function fraction(uint a, uint b) pure internal returns (Double memory) {
return Double({mantissa: div_(mul_(a, doubleScale), b)});
}
// New functions added by BProtocol
// =================================
function mulTrucate(uint a, uint b) internal pure returns (uint) {
return mul_(a, b) / expScale;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* 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/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.5.5;
/**
* @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) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @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].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.5.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "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.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/bprotocol/interfaces/CTokenInterfaces.sol
pragma solidity 0.5.16;
contract CTokenInterface {
/* ERC20 */
function transfer(address dst, uint amount) external returns (bool);
function transferFrom(address src, address dst, uint amount) external returns (bool);
function approve(address spender, uint amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function totalSupply() external view returns (uint256);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
/* User Interface */
function isCToken() external view returns (bool);
function underlying() external view returns (IERC20);
function balanceOfUnderlying(address owner) external returns (uint);
function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint);
function borrowRatePerBlock() external view returns (uint);
function supplyRatePerBlock() external view returns (uint);
function totalBorrowsCurrent() external returns (uint);
function borrowBalanceCurrent(address account) external returns (uint);
function borrowBalanceStored(address account) public view returns (uint);
function exchangeRateCurrent() public returns (uint);
function exchangeRateStored() public view returns (uint);
function getCash() external view returns (uint);
function accrueInterest() public returns (uint);
function seize(address liquidator, address borrower, uint seizeTokens) external returns (uint);
}
contract ICToken is CTokenInterface {
/* User Interface */
function redeem(uint redeemTokens) external returns (uint);
function redeemUnderlying(uint redeemAmount) external returns (uint);
function borrow(uint borrowAmount) external returns (uint);
}
// Workaround for issue https://github.com/ethereum/solidity/issues/526
// Defined separate contract as `mint()` override with `.value()` has issues
contract ICErc20 is ICToken {
function mint(uint mintAmount) external returns (uint);
function repayBorrow(uint repayAmount) external returns (uint);
function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint);
function liquidateBorrow(address borrower, uint repayAmount, address cTokenCollateral) external returns (uint);
}
contract ICEther is ICToken {
function mint() external payable;
function repayBorrow() external payable;
function repayBorrowBehalf(address borrower) external payable;
function liquidateBorrow(address borrower, address cTokenCollateral) external payable;
}
contract IPriceOracle {
/**
* @notice Get the underlying price of a cToken asset
* @param cToken The cToken to get the underlying price of
* @return The underlying asset price mantissa (scaled by 1e18).
* Zero means the price is unavailable.
*/
function getUnderlyingPrice(CTokenInterface cToken) external view returns (uint);
}
// File: contracts/bprotocol/avatar/AbsAvatarBase.sol
pragma solidity 0.5.16;
contract AbsAvatarBase is Exponential {
using SafeERC20 for IERC20;
IRegistry public registry;
bool public quit;
/* Storage for topup details */
// Topped up cToken
ICToken public toppedUpCToken;
// Topped up amount of tokens
uint256 public toppedUpAmount;
// Remaining max amount available for liquidation
uint256 public remainingLiquidationAmount;
// Liquidation cToken
ICToken public liquidationCToken;
modifier onlyAvatarOwner() {
_allowOnlyAvatarOwner();
_;
}
function _allowOnlyAvatarOwner() internal view {
require(msg.sender == registry.ownerOf(address(this)), "sender-not-owner");
}
modifier onlyPool() {
_allowOnlyPool();
_;
}
function _allowOnlyPool() internal view {
require(msg.sender == pool(), "only-pool-authorized");
}
modifier onlyBComptroller() {
_allowOnlyBComptroller();
_;
}
function _allowOnlyBComptroller() internal view {
require(msg.sender == registry.bComptroller(), "only-BComptroller-authorized");
}
modifier postPoolOp(bool debtIncrease) {
_;
_reevaluate(debtIncrease);
}
function _initAvatarBase(address _registry) internal {
require(registry == IRegistry(0x0), "avatar-already-init");
registry = IRegistry(_registry);
}
/**
* @dev Hard check to ensure untop is allowed and then reset remaining liquidation amount
*/
function _hardReevaluate() internal {
// Check: must allowed untop
require(canUntop(), "cannot-untop");
// Reset it to force re-calculation
remainingLiquidationAmount = 0;
}
/**
* @dev Soft check and reset remaining liquidation amount
*/
function _softReevaluate() private {
if(isPartiallyLiquidated()) {
_hardReevaluate();
}
}
function _reevaluate(bool debtIncrease) private {
if(debtIncrease) {
_hardReevaluate();
} else {
_softReevaluate();
}
}
function _isCEther(ICToken cToken) internal view returns (bool) {
return address(cToken) == registry.cEther();
}
function _score() internal view returns (IScore) {
return IScore(registry.score());
}
function toInt256(uint256 value) internal pure returns (int256) {
int256 result = int256(value);
require(result >= 0, "conversion-fail");
return result;
}
function isPartiallyLiquidated() public view returns (bool) {
return remainingLiquidationAmount > 0;
}
function isToppedUp() public view returns (bool) {
return toppedUpAmount > 0;
}
/**
* @dev Checks if this Avatar can untop the amount.
* @return `true` if allowed to borrow, `false` otherwise.
*/
function canUntop() public returns (bool) {
// When not topped up, just return true
if(!isToppedUp()) return true;
IComptroller comptroller = IComptroller(registry.comptroller());
bool result = comptroller.borrowAllowed(address(toppedUpCToken), address(this), toppedUpAmount) == 0;
return result;
}
function pool() public view returns (address payable) {
return address(uint160(registry.pool()));
}
/**
* @dev Returns the status if this Avatar's debt can be liquidated
* @return `true` when this Avatar can be liquidated, `false` otherwise
*/
function canLiquidate() public returns (bool) {
bool result = isToppedUp() && (remainingLiquidationAmount > 0) || (!canUntop());
return result;
}
// function reduce contract size
function _ensureUserNotQuitB() internal view {
require(! quit, "user-quit-B");
}
/**
* @dev Topup this avatar by repaying borrowings with ETH
*/
function topup() external payable onlyPool {
_ensureUserNotQuitB();
address cEtherAddr = registry.cEther();
// when already topped
bool _isToppedUp = isToppedUp();
if(_isToppedUp) {
require(address(toppedUpCToken) == cEtherAddr, "already-topped-other-cToken");
}
// 2. Repay borrows from Pool to topup
ICEther cEther = ICEther(cEtherAddr);
cEther.repayBorrow.value(msg.value)();
// 3. Store Topped-up details
if(! _isToppedUp) toppedUpCToken = cEther;
toppedUpAmount = add_(toppedUpAmount, msg.value);
}
/**
* @dev Topup the borrowed position of this Avatar by repaying borrows from the pool
* @notice Only Pool contract allowed to call the topup.
* @param cToken CToken address to use to RepayBorrows
* @param topupAmount Amount of tokens to Topup
*/
function topup(ICErc20 cToken, uint256 topupAmount) external onlyPool {
_ensureUserNotQuitB();
// when already topped
bool _isToppedUp = isToppedUp();
if(_isToppedUp) {
require(toppedUpCToken == cToken, "already-topped-other-cToken");
}
// 1. Transfer funds from the Pool contract
IERC20 underlying = cToken.underlying();
underlying.safeTransferFrom(pool(), address(this), topupAmount);
underlying.safeApprove(address(cToken), topupAmount);
// 2. Repay borrows from Pool to topup
require(cToken.repayBorrow(topupAmount) == 0, "RepayBorrow-fail");
// 3. Store Topped-up details
if(! _isToppedUp) toppedUpCToken = cToken;
toppedUpAmount = add_(toppedUpAmount, topupAmount);
}
function untop(uint amount) external onlyPool {
_untop(amount, amount);
}
/**
* @dev Untop the borrowed position of this Avatar by borrowing from Compound and transferring
* it to the pool.
* @notice Only Pool contract allowed to call the untop.
*/
function _untop(uint amount, uint amountToBorrow) internal {
// when already untopped
if(!isToppedUp()) return;
// 1. Udpdate storage for toppedUp details
require(toppedUpAmount >= amount, "amount>=toppedUpAmount");
toppedUpAmount = sub_(toppedUpAmount, amount);
if((toppedUpAmount == 0) && (remainingLiquidationAmount > 0)) remainingLiquidationAmount = 0;
// 2. Borrow from Compound and send tokens to Pool
if(amountToBorrow > 0 )
require(toppedUpCToken.borrow(amountToBorrow) == 0, "borrow-fail");
if(address(toppedUpCToken) == registry.cEther()) {
// 3. Send borrowed ETH to Pool contract
// Sending ETH to Pool using `.send()` to avoid DoS attack
bool success = pool().send(amount);
success; // shh: Not checking return value to avoid DoS attack
} else {
// 3. Transfer borrowed amount to Pool contract
IERC20 underlying = toppedUpCToken.underlying();
underlying.safeTransfer(pool(), amount);
}
}
function _untop() internal {
// when already untopped
if(!isToppedUp()) return;
_untop(toppedUpAmount, toppedUpAmount);
}
function _untopBeforeRepay(ICToken cToken, uint256 repayAmount) internal returns (uint256 amtToRepayOnCompound) {
if(toppedUpAmount > 0 && cToken == toppedUpCToken) {
// consume debt from cushion first
uint256 amtToUntopFromB = repayAmount >= toppedUpAmount ? toppedUpAmount : repayAmount;
_untop(toppedUpAmount, sub_(toppedUpAmount, amtToUntopFromB));
amtToRepayOnCompound = sub_(repayAmount, amtToUntopFromB);
} else {
amtToRepayOnCompound = repayAmount;
}
}
function _doLiquidateBorrow(
ICToken debtCToken,
uint256 underlyingAmtToLiquidate,
uint256 amtToDeductFromTopup,
ICToken collCToken
)
internal
onlyPool
returns (uint256)
{
address payable poolContract = pool();
// 1. Is toppedUp OR partially liquidated
bool partiallyLiquidated = isPartiallyLiquidated();
require(isToppedUp() || partiallyLiquidated, "cant-perform-liquidateBorrow");
if(partiallyLiquidated) {
require(debtCToken == liquidationCToken, "debtCToken!=liquidationCToken");
} else {
require(debtCToken == toppedUpCToken, "debtCToken!=toppedUpCToken");
liquidationCToken = debtCToken;
}
if(!partiallyLiquidated) {
remainingLiquidationAmount = getMaxLiquidationAmount(debtCToken);
}
// 2. `underlayingAmtToLiquidate` is under limit
require(underlyingAmtToLiquidate <= remainingLiquidationAmount, "amountToLiquidate-too-big");
// 3. Liquidator perform repayBorrow
require(underlyingAmtToLiquidate >= amtToDeductFromTopup, "amtToDeductFromTopup>underlyingAmtToLiquidate");
uint256 amtToRepayOnCompound = sub_(underlyingAmtToLiquidate, amtToDeductFromTopup);
if(amtToRepayOnCompound > 0) {
bool isCEtherDebt = _isCEther(debtCToken);
if(isCEtherDebt) {
// CEther
require(msg.value == amtToRepayOnCompound, "insuffecient-ETH-sent");
ICEther cEther = ICEther(registry.cEther());
cEther.repayBorrow.value(amtToRepayOnCompound)();
} else {
// CErc20
// take tokens from pool contract
IERC20 underlying = toppedUpCToken.underlying();
underlying.safeTransferFrom(poolContract, address(this), amtToRepayOnCompound);
underlying.safeApprove(address(debtCToken), amtToRepayOnCompound);
require(ICErc20(address(debtCToken)).repayBorrow(amtToRepayOnCompound) == 0, "repayBorrow-fail");
}
}
require(toppedUpAmount >= amtToDeductFromTopup, "amtToDeductFromTopup>toppedUpAmount");
toppedUpAmount = sub_(toppedUpAmount, amtToDeductFromTopup);
// 4.1 Update remaining liquidation amount
remainingLiquidationAmount = sub_(remainingLiquidationAmount, underlyingAmtToLiquidate);
// 5. Calculate premium and transfer to Liquidator
IComptroller comptroller = IComptroller(registry.comptroller());
(uint err, uint seizeTokens) = comptroller.liquidateCalculateSeizeTokens(
address(debtCToken),
address(collCToken),
underlyingAmtToLiquidate
);
require(err == 0, "err-liquidateCalculateSeizeTokens");
// 6. Transfer permiumAmount to liquidator
require(collCToken.transfer(poolContract, seizeTokens), "collCToken-xfr-fail");
return seizeTokens;
}
function getMaxLiquidationAmount(ICToken debtCToken) public returns (uint256) {
if(isPartiallyLiquidated()) return remainingLiquidationAmount;
uint256 avatarDebt = debtCToken.borrowBalanceCurrent(address(this));
// `toppedUpAmount` is also called poolDebt;
uint256 totalDebt = add_(avatarDebt, toppedUpAmount);
// When First time liquidation is performed after topup
// maxLiquidationAmount = closeFactorMantissa * totalDedt / 1e18;
IComptroller comptroller = IComptroller(registry.comptroller());
return mulTrucate(comptroller.closeFactorMantissa(), totalDebt);
}
function splitAmountToLiquidate(
uint256 underlyingAmtToLiquidate,
uint256 maxLiquidationAmount
)
public view returns (uint256 amtToDeductFromTopup, uint256 amtToRepayOnCompound)
{
// underlyingAmtToLiqScalar = underlyingAmtToLiquidate * 1e18
(MathError mErr, Exp memory result) = mulScalar(Exp({mantissa: underlyingAmtToLiquidate}), expScale);
require(mErr == MathError.NO_ERROR, "underlyingAmtToLiqScalar-fail");
uint underlyingAmtToLiqScalar = result.mantissa;
// percent = underlyingAmtToLiqScalar / maxLiquidationAmount
uint256 percentInScale = div_(underlyingAmtToLiqScalar, maxLiquidationAmount);
// amtToDeductFromTopup = toppedUpAmount * percentInScale / 1e18
amtToDeductFromTopup = mulTrucate(toppedUpAmount, percentInScale);
// amtToRepayOnCompound = underlyingAmtToLiquidate - amtToDeductFromTopup
amtToRepayOnCompound = sub_(underlyingAmtToLiquidate, amtToDeductFromTopup);
}
/**
* @dev Off-chain function to calculate `amtToDeductFromTopup` and `amtToRepayOnCompound`
* @notice function is non-view but no-harm as CToken.borrowBalanceCurrent() only updates accured interest
*/
function calcAmountToLiquidate(
ICToken debtCToken,
uint256 underlyingAmtToLiquidate
)
external returns (uint256 amtToDeductFromTopup, uint256 amtToRepayOnCompound)
{
uint256 amountToLiquidate = remainingLiquidationAmount;
if(! isPartiallyLiquidated()) {
amountToLiquidate = getMaxLiquidationAmount(debtCToken);
}
(amtToDeductFromTopup, amtToRepayOnCompound) = splitAmountToLiquidate(underlyingAmtToLiquidate, amountToLiquidate);
}
function quitB() external onlyAvatarOwner() {
quit = true;
_hardReevaluate();
}
}
// File: contracts/bprotocol/interfaces/IBToken.sol
pragma solidity 0.5.16;
interface IBToken {
function cToken() external view returns (address);
function borrowBalanceCurrent(address account) external returns (uint);
function balanceOfUnderlying(address owner) external returns (uint);
}
// File: contracts/bprotocol/avatar/AbsComptroller.sol
pragma solidity 0.5.16;
/**
* @title Abstract Comptroller contract for Avatar
*/
contract AbsComptroller is AbsAvatarBase {
function enterMarket(address bToken) external onlyBComptroller returns (uint256) {
address cToken = IBToken(bToken).cToken();
return _enterMarket(cToken);
}
function _enterMarket(address cToken) internal postPoolOp(false) returns (uint256) {
address[] memory cTokens = new address[](1);
cTokens[0] = cToken;
return _enterMarkets(cTokens)[0];
}
function enterMarkets(address[] calldata bTokens) external onlyBComptroller returns (uint256[] memory) {
address[] memory cTokens = new address[](bTokens.length);
for(uint256 i = 0; i < bTokens.length; i++) {
cTokens[i] = IBToken(bTokens[i]).cToken();
}
return _enterMarkets(cTokens);
}
function _enterMarkets(address[] memory cTokens) internal postPoolOp(false) returns (uint256[] memory) {
IComptroller comptroller = IComptroller(registry.comptroller());
uint256[] memory result = comptroller.enterMarkets(cTokens);
for(uint256 i = 0; i < result.length; i++) {
require(result[i] == 0, "enter-markets-fail");
}
return result;
}
function exitMarket(IBToken bToken) external onlyBComptroller postPoolOp(true) returns (uint256) {
address cToken = bToken.cToken();
IComptroller comptroller = IComptroller(registry.comptroller());
uint result = comptroller.exitMarket(cToken);
_disableCToken(cToken);
return result;
}
function _disableCToken(address cToken) internal {
ICToken(cToken).underlying().safeApprove(cToken, 0);
}
function claimComp() external onlyBComptroller {
IComptroller comptroller = IComptroller(registry.comptroller());
comptroller.claimComp(address(this));
transferCOMP();
}
function claimComp(address[] calldata bTokens) external onlyBComptroller {
address[] memory cTokens = new address[](bTokens.length);
for(uint256 i = 0; i < bTokens.length; i++) {
cTokens[i] = IBToken(bTokens[i]).cToken();
}
IComptroller comptroller = IComptroller(registry.comptroller());
comptroller.claimComp(address(this), cTokens);
transferCOMP();
}
function claimComp(
address[] calldata bTokens,
bool borrowers,
bool suppliers
)
external
onlyBComptroller
{
address[] memory cTokens = new address[](bTokens.length);
for(uint256 i = 0; i < bTokens.length; i++) {
cTokens[i] = IBToken(bTokens[i]).cToken();
}
address[] memory holders = new address[](1);
holders[0] = address(this);
IComptroller comptroller = IComptroller(registry.comptroller());
comptroller.claimComp(holders, cTokens, borrowers, suppliers);
transferCOMP();
}
function transferCOMP() public {
address owner = registry.ownerOf(address(this));
IERC20 comp = IERC20(registry.comp());
comp.safeTransfer(owner, comp.balanceOf(address(this)));
}
function getAccountLiquidity(address oracle) external view returns (uint err, uint liquidity, uint shortFall) {
return _getAccountLiquidity(oracle);
}
function getAccountLiquidity() external view returns (uint err, uint liquidity, uint shortFall) {
IComptroller comptroller = IComptroller(registry.comptroller());
return _getAccountLiquidity(comptroller.oracle());
}
function _getAccountLiquidity(address oracle) internal view returns (uint err, uint liquidity, uint shortFall) {
IComptroller comptroller = IComptroller(registry.comptroller());
// If not topped up, get the account liquidity from Comptroller
(err, liquidity, shortFall) = comptroller.getAccountLiquidity(address(this));
if(!isToppedUp()) {
return (err, liquidity, shortFall);
}
require(err == 0, "Err-in-account-liquidity");
uint256 price = IPriceOracle(oracle).getUnderlyingPrice(toppedUpCToken);
uint256 toppedUpAmtInUSD = mulTrucate(toppedUpAmount, price);
// liquidity = 0 and shortFall = 0
if(liquidity == toppedUpAmtInUSD) return(0, 0, 0);
// when shortFall = 0
if(shortFall == 0 && liquidity > 0) {
if(liquidity > toppedUpAmtInUSD) {
liquidity = sub_(liquidity, toppedUpAmtInUSD);
} else {
shortFall = sub_(toppedUpAmtInUSD, liquidity);
liquidity = 0;
}
} else {
// Handling case when compound returned liquidity = 0 and shortFall >= 0
shortFall = add_(shortFall, toppedUpAmtInUSD);
}
}
}
// File: contracts/bprotocol/interfaces/IAvatar.sol
pragma solidity 0.5.16;
contract IAvatarERC20 {
function transfer(address cToken, address dst, uint256 amount) external returns (bool);
function transferFrom(address cToken, address src, address dst, uint256 amount) external returns (bool);
function approve(address cToken, address spender, uint256 amount) public returns (bool);
}
contract IAvatar is IAvatarERC20 {
function initialize(address _registry, address comp, address compVoter) external;
function quit() external returns (bool);
function canUntop() public returns (bool);
function toppedUpCToken() external returns (address);
function toppedUpAmount() external returns (uint256);
function redeem(address cToken, uint256 redeemTokens, address payable userOrDelegatee) external returns (uint256);
function redeemUnderlying(address cToken, uint256 redeemAmount, address payable userOrDelegatee) external returns (uint256);
function borrow(address cToken, uint256 borrowAmount, address payable userOrDelegatee) external returns (uint256);
function borrowBalanceCurrent(address cToken) external returns (uint256);
function collectCToken(address cToken, address from, uint256 cTokenAmt) public;
function liquidateBorrow(uint repayAmount, address cTokenCollateral) external payable returns (uint256);
// Comptroller functions
function enterMarket(address cToken) external returns (uint256);
function enterMarkets(address[] calldata cTokens) external returns (uint256[] memory);
function exitMarket(address cToken) external returns (uint256);
function claimComp() external;
function claimComp(address[] calldata bTokens) external;
function claimComp(address[] calldata bTokens, bool borrowers, bool suppliers) external;
function getAccountLiquidity() external view returns (uint err, uint liquidity, uint shortFall);
}
// Workaround for issue https://github.com/ethereum/solidity/issues/526
// CEther
contract IAvatarCEther is IAvatar {
function mint() external payable;
function repayBorrow() external payable;
function repayBorrowBehalf(address borrower) external payable;
}
// CErc20
contract IAvatarCErc20 is IAvatar {
function mint(address cToken, uint256 mintAmount) external returns (uint256);
function repayBorrow(address cToken, uint256 repayAmount) external returns (uint256);
function repayBorrowBehalf(address cToken, address borrower, uint256 repayAmount) external returns (uint256);
}
contract ICushion {
function liquidateBorrow(uint256 underlyingAmtToLiquidate, uint256 amtToDeductFromTopup, address cTokenCollateral) external payable returns (uint256);
function canLiquidate() external returns (bool);
function untop(uint amount) external;
function toppedUpAmount() external returns (uint);
function remainingLiquidationAmount() external returns(uint);
function getMaxLiquidationAmount(address debtCToken) public returns (uint256);
}
contract ICushionCErc20 is ICushion {
function topup(address cToken, uint256 topupAmount) external;
}
contract ICushionCEther is ICushion {
function topup() external payable;
}
// File: contracts/bprotocol/interfaces/IBComptroller.sol
pragma solidity 0.5.16;
interface IBComptroller {
function isCToken(address cToken) external view returns (bool);
function isBToken(address bToken) external view returns (bool);
function c2b(address cToken) external view returns (address);
function b2c(address bToken) external view returns (address);
}
// File: contracts/bprotocol/avatar/AbsCToken.sol
pragma solidity 0.5.16;
contract AbsCToken is AbsAvatarBase {
modifier onlyBToken() {
_allowOnlyBToken();
_;
}
function _allowOnlyBToken() internal view {
require(isValidBToken(msg.sender), "only-BToken-authorized");
}
function isValidBToken(address bToken) internal view returns (bool) {
IBComptroller bComptroller = IBComptroller(registry.bComptroller());
return bComptroller.isBToken(bToken);
}
function borrowBalanceCurrent(ICToken cToken) public onlyBToken returns (uint256) {
uint256 borrowBalanceCurr = cToken.borrowBalanceCurrent(address(this));
if(toppedUpCToken == cToken) return add_(borrowBalanceCurr, toppedUpAmount);
return borrowBalanceCurr;
}
function _toUnderlying(ICToken cToken, uint256 redeemTokens) internal returns (uint256) {
uint256 exchangeRate = cToken.exchangeRateCurrent();
return mulTrucate(redeemTokens, exchangeRate);
}
// CEther
// ======
function mint() public payable onlyBToken postPoolOp(false) {
ICEther cEther = ICEther(registry.cEther());
cEther.mint.value(msg.value)(); // fails on compound in case of err
if(! quit) _score().updateCollScore(address(this), address(cEther), toInt256(msg.value));
}
function repayBorrow()
external
payable
onlyBToken
postPoolOp(false)
{
ICEther cEther = ICEther(registry.cEther());
uint256 amtToRepayOnCompound = _untopBeforeRepay(cEther, msg.value);
if(amtToRepayOnCompound > 0) cEther.repayBorrow.value(amtToRepayOnCompound)(); // fails on compound in case of err
if(! quit) _score().updateDebtScore(address(this), address(cEther), -toInt256(msg.value));
}
// CErc20
// ======
function mint(ICErc20 cToken, uint256 mintAmount) public onlyBToken postPoolOp(false) returns (uint256) {
IERC20 underlying = cToken.underlying();
underlying.safeApprove(address(cToken), mintAmount);
uint result = cToken.mint(mintAmount);
require(result == 0, "mint-fail");
if(! quit) _score().updateCollScore(address(this), address(cToken), toInt256(mintAmount));
return result;
}
function repayBorrow(ICErc20 cToken, uint256 repayAmount)
external
onlyBToken
postPoolOp(false)
returns (uint256)
{
uint256 amtToRepayOnCompound = _untopBeforeRepay(cToken, repayAmount);
uint256 result = 0;
if(amtToRepayOnCompound > 0) {
IERC20 underlying = cToken.underlying();
// use resetApprove() in case ERC20.approve() has front-running attack protection
underlying.safeApprove(address(cToken), amtToRepayOnCompound);
result = cToken.repayBorrow(amtToRepayOnCompound);
require(result == 0, "repayBorrow-fail");
if(! quit) _score().updateDebtScore(address(this), address(cToken), -toInt256(repayAmount));
}
return result; // in case of err, tx fails at BToken
}
// CEther / CErc20
// ===============
function liquidateBorrow(
uint256 underlyingAmtToLiquidateDebt,
uint256 amtToDeductFromTopup,
ICToken cTokenColl
) external payable returns (uint256) {
// 1. Can liquidate?
require(canLiquidate(), "cant-liquidate");
ICToken cTokenDebt = toppedUpCToken;
uint256 seizedCTokensColl = _doLiquidateBorrow(cTokenDebt, underlyingAmtToLiquidateDebt, amtToDeductFromTopup, cTokenColl);
// Convert seizedCToken to underlyingTokens
uint256 underlyingSeizedTokensColl = _toUnderlying(cTokenColl, seizedCTokensColl);
if(! quit) {
IScore score = _score();
score.updateCollScore(address(this), address(cTokenColl), -toInt256(underlyingSeizedTokensColl));
score.updateDebtScore(address(this), address(cTokenDebt), -toInt256(underlyingAmtToLiquidateDebt));
}
return 0;
}
function redeem(
ICToken cToken,
uint256 redeemTokens,
address payable userOrDelegatee
) external onlyBToken postPoolOp(true) returns (uint256) {
uint256 result = cToken.redeem(redeemTokens);
require(result == 0, "redeem-fail");
uint256 underlyingRedeemAmount = _toUnderlying(cToken, redeemTokens);
if(! quit) _score().updateCollScore(address(this), address(cToken), -toInt256(underlyingRedeemAmount));
// Do the fund transfer at last
if(_isCEther(cToken)) {
userOrDelegatee.transfer(address(this).balance);
} else {
IERC20 underlying = cToken.underlying();
uint256 redeemedAmount = underlying.balanceOf(address(this));
underlying.safeTransfer(userOrDelegatee, redeemedAmount);
}
return result;
}
function redeemUnderlying(
ICToken cToken,
uint256 redeemAmount,
address payable userOrDelegatee
) external onlyBToken postPoolOp(true) returns (uint256) {
uint256 result = cToken.redeemUnderlying(redeemAmount);
require(result == 0, "redeemUnderlying-fail");
if(! quit) _score().updateCollScore(address(this), address(cToken), -toInt256(redeemAmount));
// Do the fund transfer at last
if(_isCEther(cToken)) {
userOrDelegatee.transfer(redeemAmount);
} else {
IERC20 underlying = cToken.underlying();
underlying.safeTransfer(userOrDelegatee, redeemAmount);
}
return result;
}
function borrow(
ICToken cToken,
uint256 borrowAmount,
address payable userOrDelegatee
) external onlyBToken postPoolOp(true) returns (uint256) {
uint256 result = cToken.borrow(borrowAmount);
require(result == 0, "borrow-fail");
if(! quit) _score().updateDebtScore(address(this), address(cToken), toInt256(borrowAmount));
// send funds at last
if(_isCEther(cToken)) {
userOrDelegatee.transfer(borrowAmount);
} else {
IERC20 underlying = cToken.underlying();
underlying.safeTransfer(userOrDelegatee, borrowAmount);
}
return result;
}
// ERC20
// ======
function transfer(ICToken cToken, address dst, uint256 amount) public onlyBToken postPoolOp(true) returns (bool) {
address dstAvatar = registry.getAvatar(dst);
bool result = cToken.transfer(dstAvatar, amount);
require(result, "transfer-fail");
uint256 underlyingRedeemAmount = _toUnderlying(cToken, amount);
IScore score = _score();
if(! quit) score.updateCollScore(address(this), address(cToken), -toInt256(underlyingRedeemAmount));
if(! IAvatar(dstAvatar).quit()) score.updateCollScore(dstAvatar, address(cToken), toInt256(underlyingRedeemAmount));
return result;
}
function transferFrom(ICToken cToken, address src, address dst, uint256 amount) public onlyBToken postPoolOp(true) returns (bool) {
address srcAvatar = registry.getAvatar(src);
address dstAvatar = registry.getAvatar(dst);
bool result = cToken.transferFrom(srcAvatar, dstAvatar, amount);
require(result, "transferFrom-fail");
require(IAvatar(srcAvatar).canUntop(), "insuffecient-fund-at-src");
uint256 underlyingRedeemAmount = _toUnderlying(cToken, amount);
IScore score = _score();
if(! IAvatar(srcAvatar).quit()) score.updateCollScore(srcAvatar, address(cToken), -toInt256(underlyingRedeemAmount));
if(! IAvatar(dstAvatar).quit()) score.updateCollScore(dstAvatar, address(cToken), toInt256(underlyingRedeemAmount));
return result;
}
function approve(ICToken cToken, address spender, uint256 amount) public onlyBToken returns (bool) {
address spenderAvatar = registry.getAvatar(spender);
return cToken.approve(spenderAvatar, amount);
}
function collectCToken(ICToken cToken, address from, uint256 cTokenAmt) public postPoolOp(false) {
// `from` should not be an avatar
require(registry.ownerOf(from) == address(0), "from-is-an-avatar");
require(cToken.transferFrom(from, address(this), cTokenAmt), "transferFrom-fail");
uint256 underlyingAmt = _toUnderlying(cToken, cTokenAmt);
if(! quit) _score().updateCollScore(address(this), address(cToken), toInt256(underlyingAmt));
}
/**
* @dev Fallback to receieve ETH from CEther contract on `borrow()`, `redeem()`, `redeemUnderlying`
*/
function () external payable {
// Receive ETH
}
}
// File: contracts/bprotocol/interfaces/IComp.sol
pragma solidity 0.5.16;
interface IComp {
function delegate(address delegatee) external;
}
// File: contracts/bprotocol/avatar/Avatar.sol
pragma solidity 0.5.16;
contract ProxyStorage {
address internal masterCopy;
}
/**
* @title An Avatar contract deployed per account. The contract holds cTokens and directly interacts
* with Compound finance.
* @author Smart Future Labs Ltd.
*/
contract Avatar is ProxyStorage, AbsComptroller, AbsCToken {
// @NOTICE: NO CONSTRUCTOR AS ITS USED AS AN IMPLEMENTATION CONTRACT FOR PROXY
/**
* @dev Initialize the contract variables
* @param _registry Registry contract address
*/
function initialize(address _registry, address /*comp*/, address /*compVoter*/) external {
_initAvatarBase(_registry);
}
//override
/**
* @dev Mint cETH using ETH and enter market on Compound
* @notice onlyBToken can call this function, as `super.mint()` is protected with `onlyBToken` modifier
*/
function mint() public payable {
ICEther cEther = ICEther(registry.cEther());
require(_enterMarket(address(cEther)) == 0, "enterMarket-fail");
super.mint();
}
//override
/**
* @dev Mint cToken for ERC20 and enter market on Compound
* @notice onlyBToken can call this function, as `super.mint()` is protected with `onlyBToken` modifier
*/
function mint(ICErc20 cToken, uint256 mintAmount) public returns (uint256) {
require(_enterMarket(address(cToken)) == 0, "enterMarket-fail");
uint256 result = super.mint(cToken, mintAmount);
return result;
}
// EMERGENCY FUNCTIONS
function emergencyCall(address payable target, bytes calldata data) external payable onlyAvatarOwner {
uint first4Bytes = uint(uint8(data[0])) << 24 | uint(uint8(data[1])) << 16 | uint(uint8(data[2])) << 8 | uint(uint8(data[3])) << 0;
bytes4 functionSig = bytes4(uint32(first4Bytes));
require(quit || registry.whitelistedAvatarCalls(target, functionSig), "not-listed");
(bool succ, bytes memory err) = target.call.value(msg.value)(data);
require(succ, string(err));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"address payable","name":"userOrDelegatee","type":"address"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"}],"name":"borrowBalanceCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"debtCToken","type":"address"},{"internalType":"uint256","name":"underlyingAmtToLiquidate","type":"uint256"}],"name":"calcAmountToLiquidate","outputs":[{"internalType":"uint256","name":"amtToDeductFromTopup","type":"uint256"},{"internalType":"uint256","name":"amtToRepayOnCompound","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"canLiquidate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"canUntop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimComp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"bTokens","type":"address[]"},{"internalType":"bool","name":"borrowers","type":"bool"},{"internalType":"bool","name":"suppliers","type":"bool"}],"name":"claimComp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"bTokens","type":"address[]"}],"name":"claimComp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"cTokenAmt","type":"uint256"}],"name":"collectCToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emergencyCall","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"bToken","type":"address"}],"name":"enterMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"bTokens","type":"address[]"}],"name":"enterMarkets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IBToken","name":"bToken","type":"address"}],"name":"exitMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAccountLiquidity","outputs":[{"internalType":"uint256","name":"err","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"shortFall","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"getAccountLiquidity","outputs":[{"internalType":"uint256","name":"err","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"shortFall","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"debtCToken","type":"address"}],"name":"getMaxLiquidationAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_registry","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isPartiallyLiquidated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isToppedUp","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"underlyingAmtToLiquidateDebt","type":"uint256"},{"internalType":"uint256","name":"amtToDeductFromTopup","type":"uint256"},{"internalType":"contract ICToken","name":"cTokenColl","type":"address"}],"name":"liquidateBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"liquidationCToken","outputs":[{"internalType":"contract ICToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mint","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICErc20","name":"cToken","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"quit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"quitB","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"uint256","name":"redeemTokens","type":"uint256"},{"internalType":"address payable","name":"userOrDelegatee","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"internalType":"address payable","name":"userOrDelegatee","type":"address"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"internalType":"contract IRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"remainingLiquidationAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"repayBorrow","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICErc20","name":"cToken","type":"address"},{"internalType":"uint256","name":"repayAmount","type":"uint256"}],"name":"repayBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"underlyingAmtToLiquidate","type":"uint256"},{"internalType":"uint256","name":"maxLiquidationAmount","type":"uint256"}],"name":"splitAmountToLiquidate","outputs":[{"internalType":"uint256","name":"amtToDeductFromTopup","type":"uint256"},{"internalType":"uint256","name":"amtToRepayOnCompound","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"toppedUpAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"toppedUpCToken","outputs":[{"internalType":"contract ICToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICErc20","name":"cToken","type":"address"},{"internalType":"uint256","name":"topupAmount","type":"uint256"}],"name":"topup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"topup","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"transferCOMP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICToken","name":"cToken","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"untop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615c3380620000216000396000f3fe6080604052600436106102515760003560e01c8063601a1ab811610139578063beabacc8116100b6578063da74dba81161007a578063da74dba8146109c7578063dd0c4d3f146109dc578063e0be8d8914610a57578063e1f21c6714610a6c578063ede4edd014610aaf578063fc2b8cc314610ae257610251565b8063beabacc8146107e1578063c0c53b8b14610824578063c299823814610869578063c4bf022014610934578063cd13ee77146109b257610251565b806372be4b3e116100fd57806372be4b3e1461070857806374dc0a631461074b5780637b10399914610760578063abdb5ea814610775578063b4c55f74146107ae57610251565b8063601a1ab814610669578063669a6ba81461069357806369774c2d146106a85780636c4e80b6146106b05780636c665a55146106c557610251565b80632fd4cda7116101d257806340c10f191161019657806340c10f19146105885780634e4d9fea146105c157806358e3b8f8146105c95780635c833bfd146105de5780635eac54aa146106215780635ec88c791461063657610251565b80632fd4cda71461046d57806334f496ab146104a057806338d631a7146104e35780633b0a08a01461051c5780633fe5d4251461055557610251565b806317bfdfbc1161021957806317bfdfbc146103425780631bd85bdb14610375578063209cc5ac1461038a57806329e689de146103d35780632a432c8d1461045857610251565b8063057921f214610253578063077da5ea146102975780631249c58b146102ac57806315dacbea146102b457806316f0115b14610311575b005b6102856004803603606081101561026957600080fd5b50803590602081013590604001356001600160a01b0316610af7565b60408051918252519081900360200190f35b3480156102a357600080fd5b50610285610cac565b610251610cb2565b3480156102c057600080fd5b506102fd600480360360808110156102d757600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610d7d565b604080519115158252519081900360200190f35b34801561031d57600080fd5b5061032661123f565b604080516001600160a01b039092168252519081900360200190f35b34801561034e57600080fd5b506102856004803603602081101561036557600080fd5b50356001600160a01b03166112b6565b34801561038157600080fd5b5061025161136c565b34801561039657600080fd5b506103ba600480360360408110156103ad57600080fd5b5080359060200135611450565b6040805192835260208301919091528051918290030190f35b3480156103df57600080fd5b50610251600480360360608110156103f657600080fd5b810190602081018135600160201b81111561041057600080fd5b82018360208201111561042257600080fd5b803590602001918460208302840111600160201b8311171561044357600080fd5b91935091508035151590602001351515611517565b34801561046457600080fd5b506103266117c8565b34801561047957600080fd5b506104826117d7565b60408051938452602084019290925282820152519081900360600190f35b3480156104ac57600080fd5b50610285600480360360608110156104c357600080fd5b506001600160a01b038135811691602081013591604090910135166118db565b3480156104ef57600080fd5b506102516004803603604081101561050657600080fd5b506001600160a01b038135169060200135611b2b565b34801561052857600080fd5b506103ba6004803603604081101561053f57600080fd5b506001600160a01b038135169060200135611d42565b34801561056157600080fd5b506102856004803603602081101561057857600080fd5b50356001600160a01b0316611d78565b34801561059457600080fd5b50610285600480360360408110156105ab57600080fd5b506001600160a01b038135169060200135611df4565b610251611e5a565b3480156105d557600080fd5b506102fd611ff6565b3480156105ea57600080fd5b506102856004803603606081101561060157600080fd5b506001600160a01b03813581169160208101359160409091013516611ffe565b34801561062d57600080fd5b506102856122c3565b34801561064257600080fd5b506104826004803603602081101561065957600080fd5b50356001600160a01b03166122c9565b34801561067557600080fd5b506102516004803603602081101561068c57600080fd5b50356122e5565b34801561069f57600080fd5b506102516122f7565b61025161247c565b3480156106bc57600080fd5b506102fd612600565b3480156106d157600080fd5b50610285600480360360608110156106e857600080fd5b506001600160a01b03813581169160208101359160409091013516612608565b34801561071457600080fd5b506102516004803603606081101561072b57600080fd5b506001600160a01b03813581169160208101359091169060400135612765565b34801561075757600080fd5b506103266129cb565b34801561076c57600080fd5b506103266129da565b34801561078157600080fd5b506102856004803603604081101561079857600080fd5b506001600160a01b0381351690602001356129e9565b3480156107ba57600080fd5b50610285600480360360208110156107d157600080fd5b50356001600160a01b0316612bfd565b3480156107ed57600080fd5b506102fd6004803603606081101561080457600080fd5b506001600160a01b03813581169160208101359091169060400135612da2565b34801561083057600080fd5b506102516004803603606081101561084757600080fd5b506001600160a01b0381358116916020810135821691604090910135166130bd565b34801561087557600080fd5b506108e46004803603602081101561088c57600080fd5b810190602081018135600160201b8111156108a657600080fd5b8201836020820111156108b857600080fd5b803590602001918460208302840111600160201b831117156108d957600080fd5b5090925090506130cb565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610920578181015183820152602001610908565b505050509050019250505060405180910390f35b6102516004803603604081101561094a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561097457600080fd5b82018360208201111561098657600080fd5b803590602001918460018302840111600160201b831117156109a757600080fd5b5090925090506131c7565b3480156109be57600080fd5b506102fd61342b565b3480156109d357600080fd5b506102fd61345a565b3480156109e857600080fd5b50610251600480360360208110156109ff57600080fd5b810190602081018135600160201b811115610a1957600080fd5b820183602082011115610a2b57600080fd5b803590602001918460208302840111600160201b83111715610a4c57600080fd5b509092509050613579565b348015610a6357600080fd5b5061025161378a565b348015610a7857600080fd5b506102fd60048036036060811015610a8f57600080fd5b506001600160a01b038135811691602081013590911690604001356137af565b348015610abb57600080fd5b5061028560048036036020811015610ad257600080fd5b50356001600160a01b03166138c2565b348015610aee57600080fd5b506102fd613a47565b6000610b0161342b565b610b43576040805162461bcd60e51b815260206004820152600e60248201526d63616e742d6c697175696461746560901b604482015290519081900360640190fd5b6002546001600160a01b03166000610b5d82878787613a57565b90506000610b6b858361419e565b600154909150600160a01b900460ff16610c9d576000610b89614214565b9050806001600160a01b0316637db00adf3088610ba586614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b50505050806001600160a01b03166393c032413086610c2d8c614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50505050505b600093505050505b9392505050565b60045481565b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b158015610cf657600080fd5b505afa158015610d0a573d6000803e3d6000fd5b505050506040513d6020811015610d2057600080fd5b50519050610d2d816142a3565b15610d72576040805162461bcd60e51b815260206004820152601060248201526f195b9d195c93585c9ad95d0b59985a5b60821b604482015290519081900360640190fd5b610d7a614321565b50565b6000610d876144c4565b600180546040805163ce8ac03360e01b81526001600160a01b0388811660048301529151600093929092169163ce8ac0339160248082019260209290919082900301818787803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b505050506040513d6020811015610e0457600080fd5b50516001546040805163ce8ac03360e01b81526001600160a01b0389811660048301529151939450600093919092169163ce8ac03391602480830192602092919082900301818787803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050506040513d6020811015610e8457600080fd5b5051604080516323b872dd60e01b81526001600160a01b0385811660048301528084166024830152604482018990529151929350600092918b16916323b872dd9160648082019260209290919082900301818787803b158015610ee657600080fd5b505af1158015610efa573d6000803e3d6000fd5b505050506040513d6020811015610f1057600080fd5b5051905080610f5a576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c919c9bdb4b59985a5b607a1b604482015290519081900360640190fd5b826001600160a01b031663da74dba86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f9557600080fd5b505af1158015610fa9573d6000803e3d6000fd5b505050506040513d6020811015610fbf57600080fd5b5051611012576040805162461bcd60e51b815260206004820152601860248201527f696e73756666656369656e742d66756e642d61742d7372630000000000000000604482015290519081900360640190fd5b600061101e8a8861419e565b9050600061102a614214565b9050846001600160a01b031663fc2b8cc36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561106757600080fd5b505af115801561107b573d6000803e3d6000fd5b505050506040513d602081101561109157600080fd5b505161112057806001600160a01b0316637db00adf868d6110b186614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b15801561110757600080fd5b505af115801561111b573d6000803e3d6000fd5b505050505b836001600160a01b031663fc2b8cc36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561115b57600080fd5b505af115801561116f573d6000803e3d6000fd5b505050506040513d602081101561118557600080fd5b505161122657806001600160a01b0316637db00adf858d6111a586614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b505050505b5090945050505061123681614517565b50949350505050565b600154604080516316f0115b60e01b815290516000926001600160a01b0316916316f0115b916004808301926020929190829003018186803b15801561128457600080fd5b505afa158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b505190505b90565b60006112c06144c4565b604080516305eff7ef60e21b815230600482015290516000916001600160a01b038516916317bfdfbc9160248082019260209290919082900301818787803b15801561130b57600080fd5b505af115801561131f573d6000803e3d6000fd5b505050506040513d602081101561133557600080fd5b50516002549091506001600160a01b03848116911614156113645761135c81600354614532565b915050611367565b90505b919050565b611374614568565b60015460408051635fe3b56760e01b815290516000926001600160a01b031691635fe3b567916004808301926020929190829003018186803b1580156113b957600080fd5b505afa1580156113cd573d6000803e3d6000fd5b505050506040513d60208110156113e357600080fd5b5051604080516374d7814960e11b815230600482015290519192506001600160a01b0383169163e9af02929160248082019260009290919082900301818387803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b50505050610d7a6122f7565b600080600061145d615b1a565b61147d604051806020016040528088815250670de0b6b3a764000061463e565b9092509050600082600381111561149057fe5b146114e2576040805162461bcd60e51b815260206004820152601d60248201527f756e6465726c79696e67416d74546f4c69715363616c61722d6661696c000000604482015290519081900360640190fd5b805160006114f082886146a8565b90506114fe600354826146db565b955061150a88876146ff565b9450505050509250929050565b61151f614568565b60408051848152602080860282010190915260609084801561154b578160200160208202803883390190505b50905060005b848110156116075785858281811061156557fe5b905060200201356001600160a01b03166001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ad57600080fd5b505afa1580156115c1573d6000803e3d6000fd5b505050506040513d60208110156115d757600080fd5b505182518390839081106115e757fe5b6001600160a01b0390921660209283029190910190910152600101611551565b5060408051600180825281830190925260609160208083019080388339019050509050308160008151811061163857fe5b6001600160a01b0392831660209182029290920181019190915260015460408051635fe3b56760e01b815290516000949290921692635fe3b56792600480840193829003018186803b15801561168d57600080fd5b505afa1580156116a1573d6000803e3d6000fd5b505050506040513d60208110156116b757600080fd5b50516040516334086fd360e11b8152861515604482015285151560648201526080600482019081528451608483015284519293506001600160a01b03841692636810dfa692869288928b928b92918291602481019160a4909101906020898101910280838360005b8381101561173757818101518382015260200161171f565b50505050905001838103825286818151815260200191508051906020019060200280838360005b8381101561177657818101518382015260200161175e565b505050509050019650505050505050600060405180830381600087803b15801561179f57600080fd5b505af11580156117b3573d6000803e3d6000fd5b505050506117bf6122f7565b50505050505050565b6005546001600160a01b031681565b600080600080600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561182b57600080fd5b505afa15801561183f573d6000803e3d6000fd5b505050506040513d602081101561185557600080fd5b5051604080516307dc0d1d60e41b815290519192506118cf916001600160a01b03841691637dc0d1d0916004808301926020929190829003018186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d60208110156118c857600080fd5b5051614739565b93509350935050909192565b60006118e56144c4565b60016000856001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561192f57600080fd5b505af1158015611943573d6000803e3d6000fd5b505050506040513d602081101561195957600080fd5b5051905080156119a8576040805162461bcd60e51b81526020600482015260156024820152741c995919595b555b99195c9b1e5a5b99cb59985a5b605a1b604482015290519081900360640190fd5b600154600160a01b900460ff16611a49576119c1614214565b6001600160a01b0316637db00adf30886119da89614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015611a3057600080fd5b505af1158015611a44573d6000803e3d6000fd5b505050505b611a52866149ab565b15611a93576040516001600160a01b0385169086156108fc029087906000818181858888f19350505050158015611a8d573d6000803e3d6000fd5b50611b18565b6000866001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ace57600080fd5b505afa158015611ae2573d6000803e3d6000fd5b505050506040513d6020811015611af857600080fd5b50519050611b166001600160a01b038216868863ffffffff614a3016565b505b9150611b2381614517565b509392505050565b611b33614a82565b611b3b614ae6565b6000611b45611ff6565b90508015611baf576002546001600160a01b03848116911614611baf576040805162461bcd60e51b815260206004820152601b60248201527f616c72656164792d746f707065642d6f746865722d63546f6b656e0000000000604482015290519081900360640190fd5b6000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611bea57600080fd5b505afa158015611bfe573d6000803e3d6000fd5b505050506040513d6020811015611c1457600080fd5b50519050611c3b611c2361123f565b6001600160a01b03831690308663ffffffff614b3316565b611c556001600160a01b038216858563ffffffff614b8d16565b836001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611c9b57600080fd5b505af1158015611caf573d6000803e3d6000fd5b505050506040513d6020811015611cc557600080fd5b505115611d0c576040805162461bcd60e51b815260206004820152601060248201526f14995c185e509bdc9c9bddcb59985a5b60821b604482015290519081900360640190fd5b81611d2d57600280546001600160a01b0319166001600160a01b0386161790555b611d3960035484614532565b60035550505050565b6004546000908190611d52612600565b611d6257611d5f85612bfd565b90505b611d6c8482611450565b90969095509350505050565b6000611d82614568565b6000826001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b158015611dbd57600080fd5b505afa158015611dd1573d6000803e3d6000fd5b505050506040513d6020811015611de757600080fd5b50519050610ca5816142a3565b6000611dff836142a3565b15611e44576040805162461bcd60e51b815260206004820152601060248201526f195b9d195c93585c9ad95d0b59985a5b60821b604482015290519081900360640190fd5b6000611e508484614ca0565b9150505b92915050565b611e626144c4565b600080600160009054906101000a90046001600160a01b03166001600160a01b03166319b68c006040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb357600080fd5b505afa158015611ec7573d6000803e3d6000fd5b505050506040513d6020811015611edd57600080fd5b505190506000611eed8234614ea1565b90508015611f4a57816001600160a01b0316634e4d9fea826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50505050505b600154600160a01b900460ff16611feb57611f63614214565b6001600160a01b03166393c032413084611f7c34614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015611fd257600080fd5b505af1158015611fe6573d6000803e3d6000fd5b505050505b5050610d7a81614517565b600354151590565b60006120086144c4565b60016000856001600160a01b031663db006a75866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561205257600080fd5b505af1158015612066573d6000803e3d6000fd5b505050506040513d602081101561207c57600080fd5b5051905080156120c1576040805162461bcd60e51b815260206004820152600b60248201526a1c995919595b4b59985a5b60aa1b604482015290519081900360640190fd5b60006120cd878761419e565b600154909150600160a01b900460ff16612171576120e9614214565b6001600160a01b0316637db00adf308961210285614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050505b61217a876149ab565b156121ba576040516001600160a01b038616904780156108fc02916000818181858888f193505050501580156121b4573d6000803e3d6000fd5b50611b16565b6000876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156121f557600080fd5b505afa158015612209573d6000803e3d6000fd5b505050506040513d602081101561221f57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b505190506122b56001600160a01b038316888363ffffffff614a3016565b5050509150611b2381614517565b60035481565b60008060006122d784614739565b9250925092505b9193909250565b6122ed614a82565b610d7a8182614f07565b60015460408051630a57ebcf60e11b815230600482015290516000926001600160a01b0316916314afd79e916024808301926020929190829003018186803b15801561234257600080fd5b505afa158015612356573d6000803e3d6000fd5b505050506040513d602081101561236c57600080fd5b505160015460408051630213a15f60e31b815290519293506000926001600160a01b039092169163109d0af891600480820192602092909190829003018186803b1580156123b957600080fd5b505afa1580156123cd573d6000803e3d6000fd5b505050506040513d60208110156123e357600080fd5b5051604080516370a0823160e01b815230600482015290519192506124789184916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d602081101561245f57600080fd5b50516001600160a01b038416919063ffffffff614a3016565b5050565b612484614a82565b61248c614ae6565b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b1580156124d057600080fd5b505afa1580156124e4573d6000803e3d6000fd5b505050506040513d60208110156124fa57600080fd5b505190506000612508611ff6565b90508015612572576002546001600160a01b03838116911614612572576040805162461bcd60e51b815260206004820152601b60248201527f616c72656164792d746f707065642d6f746865722d63546f6b656e0000000000604482015290519081900360640190fd5b6000829050806001600160a01b0316634e4d9fea346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125b257600080fd5b505af11580156125c6573d6000803e3d6000fd5b5050505050816125ec57600280546001600160a01b0319166001600160a01b0383161790555b6125f860035434614532565b600355505050565b600454151590565b60006126126144c4565b60016000856001600160a01b031663c5ebeaec866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561265c57600080fd5b505af1158015612670573d6000803e3d6000fd5b505050506040513d602081101561268657600080fd5b5051905080156126cb576040805162461bcd60e51b815260206004820152600b60248201526a189bdc9c9bddcb59985a5b60aa1b604482015290519081900360640190fd5b600154600160a01b900460ff16611a49576126e4614214565b6001600160a01b03166393c0324130886126fd89614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611a3057600080fd5b60015460408051630a57ebcf60e11b81526001600160a01b0385811660048301529151600093849316916314afd79e916024808301926020929190829003018186803b1580156127b457600080fd5b505afa1580156127c8573d6000803e3d6000fd5b505050506040513d60208110156127de57600080fd5b50516001600160a01b03161461282f576040805162461bcd60e51b8152602060048201526011602482015270333937b696b4b996b0b716b0bb30ba30b960791b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018590529151918616916323b872dd916064808201926020929091908290030181600087803b15801561288857600080fd5b505af115801561289c573d6000803e3d6000fd5b505050506040513d60208110156128b257600080fd5b50516128f9576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c919c9bdb4b59985a5b607a1b604482015290519081900360640190fd5b6000612905858461419e565b600154909150600160a01b900460ff166129bb57612921614214565b6001600160a01b0316637db00adf308761293a85614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156129a257600080fd5b505af11580156129b6573d6000803e3d6000fd5b505050505b506129c581614517565b50505050565b6002546001600160a01b031681565b6001546001600160a01b031681565b60006129f36144c4565b600080612a008585614ea1565b905060008115612bea576000866001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4557600080fd5b505afa158015612a59573d6000803e3d6000fd5b505050506040513d6020811015612a6f57600080fd5b50519050612a8d6001600160a01b038216888563ffffffff614b8d16565b866001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612ad357600080fd5b505af1158015612ae7573d6000803e3d6000fd5b505050506040513d6020811015612afd57600080fd5b505191508115612b47576040805162461bcd60e51b815260206004820152601060248201526f1c995c185e509bdc9c9bddcb59985a5b60821b604482015290519081900360640190fd5b600154600160a01b900460ff16612be857612b60614214565b6001600160a01b03166393c032413089612b798a614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015612bcf57600080fd5b505af1158015612be3573d6000803e3d6000fd5b505050505b505b925050612bf681614517565b5092915050565b6000612c07612600565b15612c155750600454611367565b604080516305eff7ef60e21b815230600482015290516000916001600160a01b038516916317bfdfbc9160248082019260209290919082900301818787803b158015612c6057600080fd5b505af1158015612c74573d6000803e3d6000fd5b505050506040513d6020811015612c8a57600080fd5b5051600354909150600090612ca0908390614532565b90506000600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d6020811015612d1c57600080fd5b50516040805163743aaa2360e11b81529051919250612d99916001600160a01b0384169163e87554469160048083019260209291908290030181600087803b158015612d6757600080fd5b505af1158015612d7b573d6000803e3d6000fd5b505050506040513d6020811015612d9157600080fd5b5051836146db565b95945050505050565b6000612dac6144c4565b600180546040805163ce8ac03360e01b81526001600160a01b0387811660048301529151600093929092169163ce8ac0339160248082019260209290919082900301818787803b158015612dff57600080fd5b505af1158015612e13573d6000803e3d6000fd5b505050506040513d6020811015612e2957600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0380841660048301526024820188905291519293506000929189169163a9059cbb9160448082019260209290919082900301818787803b158015612e8357600080fd5b505af1158015612e97573d6000803e3d6000fd5b505050506040513d6020811015612ead57600080fd5b5051905080612ef3576040805162461bcd60e51b815260206004820152600d60248201526c1d1c985b9cd9995c8b59985a5b609a1b604482015290519081900360640190fd5b6000612eff888761419e565b90506000612f0b614214565b600154909150600160a01b900460ff16612fa857806001600160a01b0316637db00adf308b612f3986614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015612f8f57600080fd5b505af1158015612fa3573d6000803e3d6000fd5b505050505b836001600160a01b031663fc2b8cc36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612fe357600080fd5b505af1158015612ff7573d6000803e3d6000fd5b505050506040513d602081101561300d57600080fd5b50516130ae57806001600160a01b0316637db00adf858b61302d86614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561309557600080fd5b505af11580156130a9573d6000803e3d6000fd5b505050505b509093505050611b2381614517565b6130c6836151b0565b505050565b60606130d5614568565b604080518381526020808502820101909152606090838015613101578160200160208202803883390190505b50905060005b838110156131bd5784848281811061311b57fe5b905060200201356001600160a01b03166001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b15801561316357600080fd5b505afa158015613177573d6000803e3d6000fd5b505050506040513d602081101561318d57600080fd5b5051825183908390811061319d57fe5b6001600160a01b0390921660209283029190910190910152600101613107565b50611e5081615226565b6131cf615476565b600080838360038181106131df57fe5b919091013560f81c90911b90506008848460028181106131fb57fe5b919091013560f81c90911b905060108585600181811061321757fe5b919091013560f81c90911b90506018868660008161323157fe5b60015492013560f81c90921b92909217929092179290921792505060e082901b90600160a01b900460ff16806132ec575060015460408051635ce38fcb60e01b81526001600160a01b0388811660048301526001600160e01b03198516602483015291519190921691635ce38fcb916044808301926020929190829003018186803b1580156132bf57600080fd5b505afa1580156132d3573d6000803e3d6000fd5b505050506040513d60208110156132e957600080fd5b50515b61332a576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd0b5b1a5cdd195960b21b604482015290519081900360640190fd5b60006060866001600160a01b0316348787604051808383808284376040519201945060009350909150508083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b50915091508181906134215760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133e65781810151838201526020016133ce565b50505050905090810190601f1680156134135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050505050565b600080613436611ff6565b801561344457506000600454115b80613454575061345261345a565b155b91505090565b6000613464611ff6565b613470575060016112b3565b60015460408051635fe3b56760e01b815290516000926001600160a01b031691635fe3b567916004808301926020929190829003018186803b1580156134b557600080fd5b505afa1580156134c9573d6000803e3d6000fd5b505050506040513d60208110156134df57600080fd5b50516002546003546040805163368f515360e21b81526001600160a01b0393841660048201523060248201526044810192909252519293506000929184169163da3d454c9160648082019260209290919082900301818787803b15801561354557600080fd5b505af1158015613559573d6000803e3d6000fd5b505050506040513d602081101561356f57600080fd5b5051159250505090565b613581614568565b6040805182815260208084028201019091526060908280156135ad578160200160208202803883390190505b50905060005b82811015613669578383828181106135c757fe5b905060200201356001600160a01b03166001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b15801561360f57600080fd5b505afa158015613623573d6000803e3d6000fd5b505050506040513d602081101561363957600080fd5b5051825183908390811061364957fe5b6001600160a01b03909216602092830291909101909101526001016135b3565b5060015460408051635fe3b56760e01b815290516000926001600160a01b031691635fe3b567916004808301926020929190829003018186803b1580156136af57600080fd5b505afa1580156136c3573d6000803e3d6000fd5b505050506040513d60208110156136d957600080fd5b50516040805162e1ed9760e51b81523060048201818152602483019384528651604484015286519495506001600160a01b03861694631c3db2e09492938893916064909101906020858101910280838360005b8381101561374457818101518382015260200161372c565b505050509050019350505050600060405180830381600087803b15801561376a57600080fd5b505af115801561377e573d6000803e3d6000fd5b505050506129c56122f7565b613792615476565b6001805460ff60a01b1916600160a01b1790556137ad61553c565b565b60006137b96144c4565b6001546040805163ce8ac03360e01b81526001600160a01b0386811660048301529151600093929092169163ce8ac0339160248082019260209290919082900301818787803b15801561380b57600080fd5b505af115801561381f573d6000803e3d6000fd5b505050506040513d602081101561383557600080fd5b50516040805163095ea7b360e01b81526001600160a01b0380841660048301526024820187905291519293509087169163095ea7b3916044808201926020929091908290030181600087803b15801561388d57600080fd5b505af11580156138a1573d6000803e3d6000fd5b505050506040513d60208110156138b757600080fd5b505195945050505050565b60006138cc614568565b60016000836001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b15801561390957600080fd5b505afa15801561391d573d6000803e3d6000fd5b505050506040513d602081101561393357600080fd5b505160015460408051635fe3b56760e01b815290519293506000926001600160a01b0390921691635fe3b56791600480820192602092909190829003018186803b15801561398057600080fd5b505afa158015613994573d6000803e3d6000fd5b505050506040513d60208110156139aa57600080fd5b505160408051630ede4edd60e41b81526001600160a01b03858116600483015291519293506000929184169163ede4edd09160248082019260209290919082900301818787803b1580156139fd57600080fd5b505af1158015613a11573d6000803e3d6000fd5b505050506040513d6020811015613a2757600080fd5b50519050613a348361558b565b93505050613a4181614517565b50919050565b600154600160a01b900460ff1681565b6000613a61614a82565b6000613a6b61123f565b90506000613a77612600565b9050613a81611ff6565b80613a895750805b613ada576040805162461bcd60e51b815260206004820152601c60248201527f63616e742d706572666f726d2d6c6971756964617465426f72726f7700000000604482015290519081900360640190fd5b8015613b47576005546001600160a01b03888116911614613b42576040805162461bcd60e51b815260206004820152601d60248201527f6465627443546f6b656e213d6c69717569646174696f6e43546f6b656e000000604482015290519081900360640190fd5b613bc5565b6002546001600160a01b03888116911614613ba9576040805162461bcd60e51b815260206004820152601a60248201527f6465627443546f6b656e213d746f70706564557043546f6b656e000000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0389161790555b80613bd757613bd387612bfd565b6004555b600454861115613c2e576040805162461bcd60e51b815260206004820152601960248201527f616d6f756e74546f4c69717569646174652d746f6f2d62696700000000000000604482015290519081900360640190fd5b84861015613c6d5760405162461bcd60e51b815260040180806020018281038252602d815260200180615b72602d913960400191505060405180910390fd5b6000613c7987876146ff565b90508015613f18576000613c8c896149ab565b90508015613db557813414613ce0576040805162461bcd60e51b81526020600482015260156024820152741a5b9cdd59999958da595b9d0b5155120b5cd95b9d605a1b604482015290519081900360640190fd5b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b158015613d2457600080fd5b505afa158015613d38573d6000803e3d6000fd5b505050506040513d6020811015613d4e57600080fd5b505160408051632726cff560e11b815290519192506001600160a01b03831691634e4d9fea918691600480830192600092919082900301818588803b158015613d9657600080fd5b505af1158015613daa573d6000803e3d6000fd5b505050505050613f16565b60025460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015613dfa57600080fd5b505afa158015613e0e573d6000803e3d6000fd5b505050506040513d6020811015613e2457600080fd5b50519050613e436001600160a01b03821686308663ffffffff614b3316565b613e5d6001600160a01b0382168b8563ffffffff614b8d16565b896001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613ea357600080fd5b505af1158015613eb7573d6000803e3d6000fd5b505050506040513d6020811015613ecd57600080fd5b505115613f14576040805162461bcd60e51b815260206004820152601060248201526f1c995c185e509bdc9c9bddcb59985a5b60821b604482015290519081900360640190fd5b505b505b856003541015613f595760405162461bcd60e51b8152600401808060200182810382526023815260200180615b2e6023913960400191505060405180910390fd5b613f65600354876146ff565b600355600454613f7590886146ff565b600490815560015460408051635fe3b56760e01b815290516000936001600160a01b0390931692635fe3b56792808201926020929091829003018186803b158015613fbf57600080fd5b505afa158015613fd3573d6000803e3d6000fd5b505050506040513d6020811015613fe957600080fd5b50516040805163c488847b60e01b81526001600160a01b038c811660048301528981166024830152604482018c9052825193945060009384939186169263c488847b926064808301939192829003018186803b15801561404857600080fd5b505afa15801561405c573d6000803e3d6000fd5b505050506040513d604081101561407257600080fd5b508051602090910151909250905081156140bd5760405162461bcd60e51b8152600401808060200182810382526021815260200180615b516021913960400191505060405180910390fd5b876001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561411d57600080fd5b505af1158015614131573d6000803e3d6000fd5b505050506040513d602081101561414757600080fd5b5051614190576040805162461bcd60e51b815260206004820152601360248201527218dbdb1b10d51bdad95b8b5e199c8b59985a5b606a1b604482015290519081900360640190fd5b9a9950505050505050505050565b600080836001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156141dc57600080fd5b505af11580156141f0573d6000803e3d6000fd5b505050506040513d602081101561420657600080fd5b50519050611e5083826146db565b6001546040805163efedc66960e01b815290516000926001600160a01b03169163efedc669916004808301926020929190829003018186803b15801561128457600080fd5b60008181811215611364576040805162461bcd60e51b815260206004820152600f60248201526e18dbdb9d995c9cda5bdb8b59985a5b608a1b604482015290519081900360640190fd5b60408051600180825281830190925260009182916060916020808301908038833901905050905083816000815181106142d857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061430181615226565b60008151811061430d57fe5b6020026020010151925050613a4181614517565b6143296144c4565b600080600160009054906101000a90046001600160a01b03166001600160a01b03166319b68c006040518163ffffffff1660e01b815260040160206040518083038186803b15801561437a57600080fd5b505afa15801561438e573d6000803e3d6000fd5b505050506040513d60208110156143a457600080fd5b505160408051631249c58b60e01b815290519192506001600160a01b03831691631249c58b913491600480830192600092919082900301818588803b1580156143ec57600080fd5b505af1158015614400573d6000803e3d6000fd5b5050600154600160a01b900460ff1692506144ba91505057614420614214565b6001600160a01b0316637db00adf308361443934614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156144a157600080fd5b505af11580156144b5573d6000803e3d6000fd5b505050505b50610d7a81614517565b6144cd3361560c565b6137ad576040805162461bcd60e51b81526020600482015260166024820152751bdb9b1e4b50951bdad95b8b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b801561452a5761452561553c565b610d7a565b610d7a615709565b6000610ca58383604051806040016040528060118152602001706164646974696f6e206f766572666c6f7760781b81525061571e565b600160009054906101000a90046001600160a01b03166001600160a01b031663eaeec94b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156145b657600080fd5b505afa1580156145ca573d6000803e3d6000fd5b505050506040513d60208110156145e057600080fd5b50516001600160a01b031633146137ad576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c792d42436f6d7074726f6c6c65722d617574686f72697a656400000000604482015290519081900360640190fd5b6000614648615b1a565b600080614659866000015186615773565b9092509050600082600381111561466c57fe5b1461468b575060408051602081019091526000815290925090506146a1565b6040805160208101909152908152600093509150505b9250929050565b6000610ca583836040518060400160405280600e81526020016d646976696465206279207a65726f60901b8152506157b2565b6000670de0b6b3a76400006146f08484615814565b816146f757fe5b049392505050565b6000610ca58383604051806040016040528060158152602001747375627472616374696f6e20756e646572666c6f7760581b815250615856565b600080600080600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561478d57600080fd5b505afa1580156147a1573d6000803e3d6000fd5b505050506040513d60208110156147b757600080fd5b505160408051635ec88c7960e01b815230600482015290519192506001600160a01b03831691635ec88c7991602480820192606092909190829003018186803b15801561480357600080fd5b505afa158015614817573d6000803e3d6000fd5b505050506040513d606081101561482d57600080fd5b5080516020820151604090920151909550909350915061484b611ff6565b61485557506122de565b83156148a8576040805162461bcd60e51b815260206004820152601860248201527f4572722d696e2d6163636f756e742d6c69717569646974790000000000000000604482015290519081900360640190fd5b6002546040805163fc57d4df60e01b81526001600160a01b039283166004820152905160009288169163fc57d4df916024808301926020929190829003018186803b1580156148f657600080fd5b505afa15801561490a573d6000803e3d6000fd5b505050506040513d602081101561492057600080fd5b505160035490915060009061493590836146db565b9050808514156149525750600094508493508392506122de915050565b831580156149605750600085115b15614994578085111561497e5761497785826146ff565b945061498f565b61498881866146ff565b9350600094505b6149a1565b61499e8482614532565b93505b5050509193909250565b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b1580156149ef57600080fd5b505afa158015614a03573d6000803e3d6000fd5b505050506040513d6020811015614a1957600080fd5b50516001600160a01b038381169116149050919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526130c69084906158b0565b614a8a61123f565b6001600160a01b0316336001600160a01b0316146137ad576040805162461bcd60e51b81526020600482015260146024820152731bdb9b1e4b5c1bdbdb0b585d5d1a1bdc9a5e995960621b604482015290519081900360640190fd5b600154600160a01b900460ff16156137ad576040805162461bcd60e51b815260206004820152600b60248201526a3ab9b2b916b8bab4ba16a160a91b604482015290519081900360640190fd5b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526129c59085906158b0565b801580614c13575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614be557600080fd5b505afa158015614bf9573d6000803e3d6000fd5b505050506040513d6020811015614c0f57600080fd5b5051155b614c4e5760405162461bcd60e51b8152600401808060200182810382526036815260200180615bc96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526130c69084906158b0565b6000614caa6144c4565b600080846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015614ce657600080fd5b505afa158015614cfa573d6000803e3d6000fd5b505050506040513d6020811015614d1057600080fd5b50519050614d2e6001600160a01b038216868663ffffffff614b8d16565b6000856001600160a01b031663a0712d68866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015614d7657600080fd5b505af1158015614d8a573d6000803e3d6000fd5b505050506040513d6020811015614da057600080fd5b505190508015614de3576040805162461bcd60e51b81526020600482015260096024820152681b5a5b9d0b59985a5b60ba1b604482015290519081900360640190fd5b600154600160a01b900460ff16612bea57614dfc614214565b6001600160a01b0316637db00adf3088614e1589614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015614e7d57600080fd5b505af1158015614e91573d6000803e3d6000fd5b50505050925050612bf681614517565b600080600354118015614ec157506002546001600160a01b038481169116145b15613a41576000600354831015614ed85782614edc565b6003545b9050614ef5600354614ef0600354846146ff565b614f07565b614eff83826146ff565b915050611e54565b614f0f611ff6565b614f1857612478565b816003541015614f68576040805162461bcd60e51b8152602060048201526016602482015275185b5bdd5b9d0f8f5d1bdc1c1959155c105b5bdd5b9d60521b604482015290519081900360640190fd5b614f74600354836146ff565b6003819055158015614f8857506000600454115b15614f935760006004555b8015615053576002546040805163317afabb60e21b81526004810184905290516001600160a01b039092169163c5ebeaec916024808201926020929091908290030181600087803b158015614fe757600080fd5b505af1158015614ffb573d6000803e3d6000fd5b505050506040513d602081101561501157600080fd5b505115615053576040805162461bcd60e51b815260206004820152600b60248201526a189bdc9c9bddcb59985a5b60aa1b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166319b68c006040518163ffffffff1660e01b815260040160206040518083038186803b1580156150a157600080fd5b505afa1580156150b5573d6000803e3d6000fd5b505050506040513d60208110156150cb57600080fd5b50516002546001600160a01b039081169116141561511b5760006150ed61123f565b6001600160a01b03166108fc849081150290604051600060405180830381858888f150612478945050505050565b60025460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b15801561516057600080fd5b505afa158015615174573d6000803e3d6000fd5b505050506040513d602081101561518a57600080fd5b505190506130c661519961123f565b6001600160a01b038316908563ffffffff614a3016565b6001546001600160a01b031615615204576040805162461bcd60e51b8152602060048201526013602482015272185d985d185c8b585b1c9958591e4b5a5b9a5d606a1b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561527957600080fd5b505afa15801561528d573d6000803e3d6000fd5b505050506040513d60208110156152a357600080fd5b5051604051631853304760e31b81526020600482018181528751602484015287519394506060936001600160a01b0386169363c2998238938a9392839260440191858101910280838360005b838110156153075781810151838201526020016152ef565b5050505090500192505050600060405180830381600087803b15801561532c57600080fd5b505af1158015615340573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561536957600080fd5b8101908080516040519392919084600160201b82111561538857600080fd5b90830190602082018581111561539d57600080fd5b82518660208202830111600160201b821117156153b957600080fd5b82525081516020918201928201910280838360005b838110156153e65781810151838201526020016153ce565b50505050905001604052505050905060008090505b81518110156154695781818151811061541057fe5b6020026020010151600014615461576040805162461bcd60e51b8152602060048201526012602482015271195b9d195c8b5b585c9ad95d1ccb59985a5b60721b604482015290519081900360640190fd5b6001016153fb565b50925050613a4181614517565b60015460408051630a57ebcf60e11b815230600482015290516001600160a01b03909216916314afd79e91602480820192602092909190829003018186803b1580156154c157600080fd5b505afa1580156154d5573d6000803e3d6000fd5b505050506040513d60208110156154eb57600080fd5b50516001600160a01b031633146137ad576040805162461bcd60e51b815260206004820152601060248201526f39b2b73232b916b737ba16b7bbb732b960811b604482015290519081900360640190fd5b61554461345a565b615584576040805162461bcd60e51b815260206004820152600c60248201526b063616e6e6f742d756e746f760a41b604482015290519081900360640190fd5b6000600455565b610d7a816000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156155ca57600080fd5b505afa1580156155de573d6000803e3d6000fd5b505050506040513d60208110156155f457600080fd5b50516001600160a01b0316919063ffffffff614b8d16565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663eaeec94b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561565d57600080fd5b505afa158015615671573d6000803e3d6000fd5b505050506040513d602081101561568757600080fd5b5051604080516326f84feb60e11b81526001600160a01b038681166004830152915192935090831691634df09fd691602480820192602092909190829003018186803b1580156156d657600080fd5b505afa1580156156ea573d6000803e3d6000fd5b505050506040513d602081101561570057600080fd5b50519392505050565b615711612600565b156137ad576137ad61553c565b600083830182858210156112365760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b60008083615786575060009050806146a1565b8383028385828161579357fe5b04146157a7575060029150600090506146a1565b6000925090506146a1565b600081836158015760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b5082848161580b57fe5b04949350505050565b6000610ca583836040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000815250615a68565b600081848411156158a85760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b505050900390565b6158c2826001600160a01b0316615ade565b615913576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106159515780518252601f199092019160209182019101615932565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146159b3576040519150601f19603f3d011682016040523d82523d6000602084013e6159b8565b606091505b509150915081615a0f576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156129c557808060200190516020811015615a2b57600080fd5b50516129c55760405162461bcd60e51b815260040180806020018281038252602a815260200180615b9f602a913960400191505060405180910390fd5b6000831580615a75575082155b15615a8257506000610ca5565b83830283858281615a8f57fe5b041483906112365760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615b1257508115155b949350505050565b604051806020016040528060008152509056fe616d74546f44656475637446726f6d546f7075703e746f707065645570416d6f756e746572722d6c697175696461746543616c63756c6174655365697a65546f6b656e73616d74546f44656475637446726f6d546f7075703e756e6465726c79696e67416d74546f4c69717569646174655361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582074dc8f31228156573484e1529bb7e375a9e2745114b8f857592f7a7bb451fb3a64736f6c63430005100032
Deployed Bytecode
0x6080604052600436106102515760003560e01c8063601a1ab811610139578063beabacc8116100b6578063da74dba81161007a578063da74dba8146109c7578063dd0c4d3f146109dc578063e0be8d8914610a57578063e1f21c6714610a6c578063ede4edd014610aaf578063fc2b8cc314610ae257610251565b8063beabacc8146107e1578063c0c53b8b14610824578063c299823814610869578063c4bf022014610934578063cd13ee77146109b257610251565b806372be4b3e116100fd57806372be4b3e1461070857806374dc0a631461074b5780637b10399914610760578063abdb5ea814610775578063b4c55f74146107ae57610251565b8063601a1ab814610669578063669a6ba81461069357806369774c2d146106a85780636c4e80b6146106b05780636c665a55146106c557610251565b80632fd4cda7116101d257806340c10f191161019657806340c10f19146105885780634e4d9fea146105c157806358e3b8f8146105c95780635c833bfd146105de5780635eac54aa146106215780635ec88c791461063657610251565b80632fd4cda71461046d57806334f496ab146104a057806338d631a7146104e35780633b0a08a01461051c5780633fe5d4251461055557610251565b806317bfdfbc1161021957806317bfdfbc146103425780631bd85bdb14610375578063209cc5ac1461038a57806329e689de146103d35780632a432c8d1461045857610251565b8063057921f214610253578063077da5ea146102975780631249c58b146102ac57806315dacbea146102b457806316f0115b14610311575b005b6102856004803603606081101561026957600080fd5b50803590602081013590604001356001600160a01b0316610af7565b60408051918252519081900360200190f35b3480156102a357600080fd5b50610285610cac565b610251610cb2565b3480156102c057600080fd5b506102fd600480360360808110156102d757600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610d7d565b604080519115158252519081900360200190f35b34801561031d57600080fd5b5061032661123f565b604080516001600160a01b039092168252519081900360200190f35b34801561034e57600080fd5b506102856004803603602081101561036557600080fd5b50356001600160a01b03166112b6565b34801561038157600080fd5b5061025161136c565b34801561039657600080fd5b506103ba600480360360408110156103ad57600080fd5b5080359060200135611450565b6040805192835260208301919091528051918290030190f35b3480156103df57600080fd5b50610251600480360360608110156103f657600080fd5b810190602081018135600160201b81111561041057600080fd5b82018360208201111561042257600080fd5b803590602001918460208302840111600160201b8311171561044357600080fd5b91935091508035151590602001351515611517565b34801561046457600080fd5b506103266117c8565b34801561047957600080fd5b506104826117d7565b60408051938452602084019290925282820152519081900360600190f35b3480156104ac57600080fd5b50610285600480360360608110156104c357600080fd5b506001600160a01b038135811691602081013591604090910135166118db565b3480156104ef57600080fd5b506102516004803603604081101561050657600080fd5b506001600160a01b038135169060200135611b2b565b34801561052857600080fd5b506103ba6004803603604081101561053f57600080fd5b506001600160a01b038135169060200135611d42565b34801561056157600080fd5b506102856004803603602081101561057857600080fd5b50356001600160a01b0316611d78565b34801561059457600080fd5b50610285600480360360408110156105ab57600080fd5b506001600160a01b038135169060200135611df4565b610251611e5a565b3480156105d557600080fd5b506102fd611ff6565b3480156105ea57600080fd5b506102856004803603606081101561060157600080fd5b506001600160a01b03813581169160208101359160409091013516611ffe565b34801561062d57600080fd5b506102856122c3565b34801561064257600080fd5b506104826004803603602081101561065957600080fd5b50356001600160a01b03166122c9565b34801561067557600080fd5b506102516004803603602081101561068c57600080fd5b50356122e5565b34801561069f57600080fd5b506102516122f7565b61025161247c565b3480156106bc57600080fd5b506102fd612600565b3480156106d157600080fd5b50610285600480360360608110156106e857600080fd5b506001600160a01b03813581169160208101359160409091013516612608565b34801561071457600080fd5b506102516004803603606081101561072b57600080fd5b506001600160a01b03813581169160208101359091169060400135612765565b34801561075757600080fd5b506103266129cb565b34801561076c57600080fd5b506103266129da565b34801561078157600080fd5b506102856004803603604081101561079857600080fd5b506001600160a01b0381351690602001356129e9565b3480156107ba57600080fd5b50610285600480360360208110156107d157600080fd5b50356001600160a01b0316612bfd565b3480156107ed57600080fd5b506102fd6004803603606081101561080457600080fd5b506001600160a01b03813581169160208101359091169060400135612da2565b34801561083057600080fd5b506102516004803603606081101561084757600080fd5b506001600160a01b0381358116916020810135821691604090910135166130bd565b34801561087557600080fd5b506108e46004803603602081101561088c57600080fd5b810190602081018135600160201b8111156108a657600080fd5b8201836020820111156108b857600080fd5b803590602001918460208302840111600160201b831117156108d957600080fd5b5090925090506130cb565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610920578181015183820152602001610908565b505050509050019250505060405180910390f35b6102516004803603604081101561094a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561097457600080fd5b82018360208201111561098657600080fd5b803590602001918460018302840111600160201b831117156109a757600080fd5b5090925090506131c7565b3480156109be57600080fd5b506102fd61342b565b3480156109d357600080fd5b506102fd61345a565b3480156109e857600080fd5b50610251600480360360208110156109ff57600080fd5b810190602081018135600160201b811115610a1957600080fd5b820183602082011115610a2b57600080fd5b803590602001918460208302840111600160201b83111715610a4c57600080fd5b509092509050613579565b348015610a6357600080fd5b5061025161378a565b348015610a7857600080fd5b506102fd60048036036060811015610a8f57600080fd5b506001600160a01b038135811691602081013590911690604001356137af565b348015610abb57600080fd5b5061028560048036036020811015610ad257600080fd5b50356001600160a01b03166138c2565b348015610aee57600080fd5b506102fd613a47565b6000610b0161342b565b610b43576040805162461bcd60e51b815260206004820152600e60248201526d63616e742d6c697175696461746560901b604482015290519081900360640190fd5b6002546001600160a01b03166000610b5d82878787613a57565b90506000610b6b858361419e565b600154909150600160a01b900460ff16610c9d576000610b89614214565b9050806001600160a01b0316637db00adf3088610ba586614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b50505050806001600160a01b03166393c032413086610c2d8c614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50505050505b600093505050505b9392505050565b60045481565b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b158015610cf657600080fd5b505afa158015610d0a573d6000803e3d6000fd5b505050506040513d6020811015610d2057600080fd5b50519050610d2d816142a3565b15610d72576040805162461bcd60e51b815260206004820152601060248201526f195b9d195c93585c9ad95d0b59985a5b60821b604482015290519081900360640190fd5b610d7a614321565b50565b6000610d876144c4565b600180546040805163ce8ac03360e01b81526001600160a01b0388811660048301529151600093929092169163ce8ac0339160248082019260209290919082900301818787803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b505050506040513d6020811015610e0457600080fd5b50516001546040805163ce8ac03360e01b81526001600160a01b0389811660048301529151939450600093919092169163ce8ac03391602480830192602092919082900301818787803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050506040513d6020811015610e8457600080fd5b5051604080516323b872dd60e01b81526001600160a01b0385811660048301528084166024830152604482018990529151929350600092918b16916323b872dd9160648082019260209290919082900301818787803b158015610ee657600080fd5b505af1158015610efa573d6000803e3d6000fd5b505050506040513d6020811015610f1057600080fd5b5051905080610f5a576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c919c9bdb4b59985a5b607a1b604482015290519081900360640190fd5b826001600160a01b031663da74dba86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f9557600080fd5b505af1158015610fa9573d6000803e3d6000fd5b505050506040513d6020811015610fbf57600080fd5b5051611012576040805162461bcd60e51b815260206004820152601860248201527f696e73756666656369656e742d66756e642d61742d7372630000000000000000604482015290519081900360640190fd5b600061101e8a8861419e565b9050600061102a614214565b9050846001600160a01b031663fc2b8cc36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561106757600080fd5b505af115801561107b573d6000803e3d6000fd5b505050506040513d602081101561109157600080fd5b505161112057806001600160a01b0316637db00adf868d6110b186614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b15801561110757600080fd5b505af115801561111b573d6000803e3d6000fd5b505050505b836001600160a01b031663fc2b8cc36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561115b57600080fd5b505af115801561116f573d6000803e3d6000fd5b505050506040513d602081101561118557600080fd5b505161122657806001600160a01b0316637db00adf858d6111a586614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b505050505b5090945050505061123681614517565b50949350505050565b600154604080516316f0115b60e01b815290516000926001600160a01b0316916316f0115b916004808301926020929190829003018186803b15801561128457600080fd5b505afa158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b505190505b90565b60006112c06144c4565b604080516305eff7ef60e21b815230600482015290516000916001600160a01b038516916317bfdfbc9160248082019260209290919082900301818787803b15801561130b57600080fd5b505af115801561131f573d6000803e3d6000fd5b505050506040513d602081101561133557600080fd5b50516002549091506001600160a01b03848116911614156113645761135c81600354614532565b915050611367565b90505b919050565b611374614568565b60015460408051635fe3b56760e01b815290516000926001600160a01b031691635fe3b567916004808301926020929190829003018186803b1580156113b957600080fd5b505afa1580156113cd573d6000803e3d6000fd5b505050506040513d60208110156113e357600080fd5b5051604080516374d7814960e11b815230600482015290519192506001600160a01b0383169163e9af02929160248082019260009290919082900301818387803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b50505050610d7a6122f7565b600080600061145d615b1a565b61147d604051806020016040528088815250670de0b6b3a764000061463e565b9092509050600082600381111561149057fe5b146114e2576040805162461bcd60e51b815260206004820152601d60248201527f756e6465726c79696e67416d74546f4c69715363616c61722d6661696c000000604482015290519081900360640190fd5b805160006114f082886146a8565b90506114fe600354826146db565b955061150a88876146ff565b9450505050509250929050565b61151f614568565b60408051848152602080860282010190915260609084801561154b578160200160208202803883390190505b50905060005b848110156116075785858281811061156557fe5b905060200201356001600160a01b03166001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ad57600080fd5b505afa1580156115c1573d6000803e3d6000fd5b505050506040513d60208110156115d757600080fd5b505182518390839081106115e757fe5b6001600160a01b0390921660209283029190910190910152600101611551565b5060408051600180825281830190925260609160208083019080388339019050509050308160008151811061163857fe5b6001600160a01b0392831660209182029290920181019190915260015460408051635fe3b56760e01b815290516000949290921692635fe3b56792600480840193829003018186803b15801561168d57600080fd5b505afa1580156116a1573d6000803e3d6000fd5b505050506040513d60208110156116b757600080fd5b50516040516334086fd360e11b8152861515604482015285151560648201526080600482019081528451608483015284519293506001600160a01b03841692636810dfa692869288928b928b92918291602481019160a4909101906020898101910280838360005b8381101561173757818101518382015260200161171f565b50505050905001838103825286818151815260200191508051906020019060200280838360005b8381101561177657818101518382015260200161175e565b505050509050019650505050505050600060405180830381600087803b15801561179f57600080fd5b505af11580156117b3573d6000803e3d6000fd5b505050506117bf6122f7565b50505050505050565b6005546001600160a01b031681565b600080600080600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561182b57600080fd5b505afa15801561183f573d6000803e3d6000fd5b505050506040513d602081101561185557600080fd5b5051604080516307dc0d1d60e41b815290519192506118cf916001600160a01b03841691637dc0d1d0916004808301926020929190829003018186803b15801561189e57600080fd5b505afa1580156118b2573d6000803e3d6000fd5b505050506040513d60208110156118c857600080fd5b5051614739565b93509350935050909192565b60006118e56144c4565b60016000856001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561192f57600080fd5b505af1158015611943573d6000803e3d6000fd5b505050506040513d602081101561195957600080fd5b5051905080156119a8576040805162461bcd60e51b81526020600482015260156024820152741c995919595b555b99195c9b1e5a5b99cb59985a5b605a1b604482015290519081900360640190fd5b600154600160a01b900460ff16611a49576119c1614214565b6001600160a01b0316637db00adf30886119da89614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015611a3057600080fd5b505af1158015611a44573d6000803e3d6000fd5b505050505b611a52866149ab565b15611a93576040516001600160a01b0385169086156108fc029087906000818181858888f19350505050158015611a8d573d6000803e3d6000fd5b50611b18565b6000866001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ace57600080fd5b505afa158015611ae2573d6000803e3d6000fd5b505050506040513d6020811015611af857600080fd5b50519050611b166001600160a01b038216868863ffffffff614a3016565b505b9150611b2381614517565b509392505050565b611b33614a82565b611b3b614ae6565b6000611b45611ff6565b90508015611baf576002546001600160a01b03848116911614611baf576040805162461bcd60e51b815260206004820152601b60248201527f616c72656164792d746f707065642d6f746865722d63546f6b656e0000000000604482015290519081900360640190fd5b6000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611bea57600080fd5b505afa158015611bfe573d6000803e3d6000fd5b505050506040513d6020811015611c1457600080fd5b50519050611c3b611c2361123f565b6001600160a01b03831690308663ffffffff614b3316565b611c556001600160a01b038216858563ffffffff614b8d16565b836001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611c9b57600080fd5b505af1158015611caf573d6000803e3d6000fd5b505050506040513d6020811015611cc557600080fd5b505115611d0c576040805162461bcd60e51b815260206004820152601060248201526f14995c185e509bdc9c9bddcb59985a5b60821b604482015290519081900360640190fd5b81611d2d57600280546001600160a01b0319166001600160a01b0386161790555b611d3960035484614532565b60035550505050565b6004546000908190611d52612600565b611d6257611d5f85612bfd565b90505b611d6c8482611450565b90969095509350505050565b6000611d82614568565b6000826001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b158015611dbd57600080fd5b505afa158015611dd1573d6000803e3d6000fd5b505050506040513d6020811015611de757600080fd5b50519050610ca5816142a3565b6000611dff836142a3565b15611e44576040805162461bcd60e51b815260206004820152601060248201526f195b9d195c93585c9ad95d0b59985a5b60821b604482015290519081900360640190fd5b6000611e508484614ca0565b9150505b92915050565b611e626144c4565b600080600160009054906101000a90046001600160a01b03166001600160a01b03166319b68c006040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb357600080fd5b505afa158015611ec7573d6000803e3d6000fd5b505050506040513d6020811015611edd57600080fd5b505190506000611eed8234614ea1565b90508015611f4a57816001600160a01b0316634e4d9fea826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f3057600080fd5b505af1158015611f44573d6000803e3d6000fd5b50505050505b600154600160a01b900460ff16611feb57611f63614214565b6001600160a01b03166393c032413084611f7c34614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015611fd257600080fd5b505af1158015611fe6573d6000803e3d6000fd5b505050505b5050610d7a81614517565b600354151590565b60006120086144c4565b60016000856001600160a01b031663db006a75866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561205257600080fd5b505af1158015612066573d6000803e3d6000fd5b505050506040513d602081101561207c57600080fd5b5051905080156120c1576040805162461bcd60e51b815260206004820152600b60248201526a1c995919595b4b59985a5b60aa1b604482015290519081900360640190fd5b60006120cd878761419e565b600154909150600160a01b900460ff16612171576120e9614214565b6001600160a01b0316637db00adf308961210285614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050505b61217a876149ab565b156121ba576040516001600160a01b038616904780156108fc02916000818181858888f193505050501580156121b4573d6000803e3d6000fd5b50611b16565b6000876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156121f557600080fd5b505afa158015612209573d6000803e3d6000fd5b505050506040513d602081101561221f57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b505190506122b56001600160a01b038316888363ffffffff614a3016565b5050509150611b2381614517565b60035481565b60008060006122d784614739565b9250925092505b9193909250565b6122ed614a82565b610d7a8182614f07565b60015460408051630a57ebcf60e11b815230600482015290516000926001600160a01b0316916314afd79e916024808301926020929190829003018186803b15801561234257600080fd5b505afa158015612356573d6000803e3d6000fd5b505050506040513d602081101561236c57600080fd5b505160015460408051630213a15f60e31b815290519293506000926001600160a01b039092169163109d0af891600480820192602092909190829003018186803b1580156123b957600080fd5b505afa1580156123cd573d6000803e3d6000fd5b505050506040513d60208110156123e357600080fd5b5051604080516370a0823160e01b815230600482015290519192506124789184916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561243557600080fd5b505afa158015612449573d6000803e3d6000fd5b505050506040513d602081101561245f57600080fd5b50516001600160a01b038416919063ffffffff614a3016565b5050565b612484614a82565b61248c614ae6565b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b1580156124d057600080fd5b505afa1580156124e4573d6000803e3d6000fd5b505050506040513d60208110156124fa57600080fd5b505190506000612508611ff6565b90508015612572576002546001600160a01b03838116911614612572576040805162461bcd60e51b815260206004820152601b60248201527f616c72656164792d746f707065642d6f746865722d63546f6b656e0000000000604482015290519081900360640190fd5b6000829050806001600160a01b0316634e4d9fea346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125b257600080fd5b505af11580156125c6573d6000803e3d6000fd5b5050505050816125ec57600280546001600160a01b0319166001600160a01b0383161790555b6125f860035434614532565b600355505050565b600454151590565b60006126126144c4565b60016000856001600160a01b031663c5ebeaec866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561265c57600080fd5b505af1158015612670573d6000803e3d6000fd5b505050506040513d602081101561268657600080fd5b5051905080156126cb576040805162461bcd60e51b815260206004820152600b60248201526a189bdc9c9bddcb59985a5b60aa1b604482015290519081900360640190fd5b600154600160a01b900460ff16611a49576126e4614214565b6001600160a01b03166393c0324130886126fd89614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611a3057600080fd5b60015460408051630a57ebcf60e11b81526001600160a01b0385811660048301529151600093849316916314afd79e916024808301926020929190829003018186803b1580156127b457600080fd5b505afa1580156127c8573d6000803e3d6000fd5b505050506040513d60208110156127de57600080fd5b50516001600160a01b03161461282f576040805162461bcd60e51b8152602060048201526011602482015270333937b696b4b996b0b716b0bb30ba30b960791b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038581166004830152306024830152604482018590529151918616916323b872dd916064808201926020929091908290030181600087803b15801561288857600080fd5b505af115801561289c573d6000803e3d6000fd5b505050506040513d60208110156128b257600080fd5b50516128f9576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c919c9bdb4b59985a5b607a1b604482015290519081900360640190fd5b6000612905858461419e565b600154909150600160a01b900460ff166129bb57612921614214565b6001600160a01b0316637db00adf308761293a85614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156129a257600080fd5b505af11580156129b6573d6000803e3d6000fd5b505050505b506129c581614517565b50505050565b6002546001600160a01b031681565b6001546001600160a01b031681565b60006129f36144c4565b600080612a008585614ea1565b905060008115612bea576000866001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4557600080fd5b505afa158015612a59573d6000803e3d6000fd5b505050506040513d6020811015612a6f57600080fd5b50519050612a8d6001600160a01b038216888563ffffffff614b8d16565b866001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612ad357600080fd5b505af1158015612ae7573d6000803e3d6000fd5b505050506040513d6020811015612afd57600080fd5b505191508115612b47576040805162461bcd60e51b815260206004820152601060248201526f1c995c185e509bdc9c9bddcb59985a5b60821b604482015290519081900360640190fd5b600154600160a01b900460ff16612be857612b60614214565b6001600160a01b03166393c032413089612b798a614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015612bcf57600080fd5b505af1158015612be3573d6000803e3d6000fd5b505050505b505b925050612bf681614517565b5092915050565b6000612c07612600565b15612c155750600454611367565b604080516305eff7ef60e21b815230600482015290516000916001600160a01b038516916317bfdfbc9160248082019260209290919082900301818787803b158015612c6057600080fd5b505af1158015612c74573d6000803e3d6000fd5b505050506040513d6020811015612c8a57600080fd5b5051600354909150600090612ca0908390614532565b90506000600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d6020811015612d1c57600080fd5b50516040805163743aaa2360e11b81529051919250612d99916001600160a01b0384169163e87554469160048083019260209291908290030181600087803b158015612d6757600080fd5b505af1158015612d7b573d6000803e3d6000fd5b505050506040513d6020811015612d9157600080fd5b5051836146db565b95945050505050565b6000612dac6144c4565b600180546040805163ce8ac03360e01b81526001600160a01b0387811660048301529151600093929092169163ce8ac0339160248082019260209290919082900301818787803b158015612dff57600080fd5b505af1158015612e13573d6000803e3d6000fd5b505050506040513d6020811015612e2957600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0380841660048301526024820188905291519293506000929189169163a9059cbb9160448082019260209290919082900301818787803b158015612e8357600080fd5b505af1158015612e97573d6000803e3d6000fd5b505050506040513d6020811015612ead57600080fd5b5051905080612ef3576040805162461bcd60e51b815260206004820152600d60248201526c1d1c985b9cd9995c8b59985a5b609a1b604482015290519081900360640190fd5b6000612eff888761419e565b90506000612f0b614214565b600154909150600160a01b900460ff16612fa857806001600160a01b0316637db00adf308b612f3986614259565b604080516001600160e01b031960e087901b1681526001600160a01b0394851660048201529290931660248301526000908103604483015291516064808301939282900301818387803b158015612f8f57600080fd5b505af1158015612fa3573d6000803e3d6000fd5b505050505b836001600160a01b031663fc2b8cc36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612fe357600080fd5b505af1158015612ff7573d6000803e3d6000fd5b505050506040513d602081101561300d57600080fd5b50516130ae57806001600160a01b0316637db00adf858b61302d86614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561309557600080fd5b505af11580156130a9573d6000803e3d6000fd5b505050505b509093505050611b2381614517565b6130c6836151b0565b505050565b60606130d5614568565b604080518381526020808502820101909152606090838015613101578160200160208202803883390190505b50905060005b838110156131bd5784848281811061311b57fe5b905060200201356001600160a01b03166001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b15801561316357600080fd5b505afa158015613177573d6000803e3d6000fd5b505050506040513d602081101561318d57600080fd5b5051825183908390811061319d57fe5b6001600160a01b0390921660209283029190910190910152600101613107565b50611e5081615226565b6131cf615476565b600080838360038181106131df57fe5b919091013560f81c90911b90506008848460028181106131fb57fe5b919091013560f81c90911b905060108585600181811061321757fe5b919091013560f81c90911b90506018868660008161323157fe5b60015492013560f81c90921b92909217929092179290921792505060e082901b90600160a01b900460ff16806132ec575060015460408051635ce38fcb60e01b81526001600160a01b0388811660048301526001600160e01b03198516602483015291519190921691635ce38fcb916044808301926020929190829003018186803b1580156132bf57600080fd5b505afa1580156132d3573d6000803e3d6000fd5b505050506040513d60208110156132e957600080fd5b50515b61332a576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd0b5b1a5cdd195960b21b604482015290519081900360640190fd5b60006060866001600160a01b0316348787604051808383808284376040519201945060009350909150508083038185875af1925050503d806000811461338c576040519150601f19603f3d011682016040523d82523d6000602084013e613391565b606091505b50915091508181906134215760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133e65781810151838201526020016133ce565b50505050905090810190601f1680156134135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050505050565b600080613436611ff6565b801561344457506000600454115b80613454575061345261345a565b155b91505090565b6000613464611ff6565b613470575060016112b3565b60015460408051635fe3b56760e01b815290516000926001600160a01b031691635fe3b567916004808301926020929190829003018186803b1580156134b557600080fd5b505afa1580156134c9573d6000803e3d6000fd5b505050506040513d60208110156134df57600080fd5b50516002546003546040805163368f515360e21b81526001600160a01b0393841660048201523060248201526044810192909252519293506000929184169163da3d454c9160648082019260209290919082900301818787803b15801561354557600080fd5b505af1158015613559573d6000803e3d6000fd5b505050506040513d602081101561356f57600080fd5b5051159250505090565b613581614568565b6040805182815260208084028201019091526060908280156135ad578160200160208202803883390190505b50905060005b82811015613669578383828181106135c757fe5b905060200201356001600160a01b03166001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b15801561360f57600080fd5b505afa158015613623573d6000803e3d6000fd5b505050506040513d602081101561363957600080fd5b5051825183908390811061364957fe5b6001600160a01b03909216602092830291909101909101526001016135b3565b5060015460408051635fe3b56760e01b815290516000926001600160a01b031691635fe3b567916004808301926020929190829003018186803b1580156136af57600080fd5b505afa1580156136c3573d6000803e3d6000fd5b505050506040513d60208110156136d957600080fd5b50516040805162e1ed9760e51b81523060048201818152602483019384528651604484015286519495506001600160a01b03861694631c3db2e09492938893916064909101906020858101910280838360005b8381101561374457818101518382015260200161372c565b505050509050019350505050600060405180830381600087803b15801561376a57600080fd5b505af115801561377e573d6000803e3d6000fd5b505050506129c56122f7565b613792615476565b6001805460ff60a01b1916600160a01b1790556137ad61553c565b565b60006137b96144c4565b6001546040805163ce8ac03360e01b81526001600160a01b0386811660048301529151600093929092169163ce8ac0339160248082019260209290919082900301818787803b15801561380b57600080fd5b505af115801561381f573d6000803e3d6000fd5b505050506040513d602081101561383557600080fd5b50516040805163095ea7b360e01b81526001600160a01b0380841660048301526024820187905291519293509087169163095ea7b3916044808201926020929091908290030181600087803b15801561388d57600080fd5b505af11580156138a1573d6000803e3d6000fd5b505050506040513d60208110156138b757600080fd5b505195945050505050565b60006138cc614568565b60016000836001600160a01b03166369e527da6040518163ffffffff1660e01b815260040160206040518083038186803b15801561390957600080fd5b505afa15801561391d573d6000803e3d6000fd5b505050506040513d602081101561393357600080fd5b505160015460408051635fe3b56760e01b815290519293506000926001600160a01b0390921691635fe3b56791600480820192602092909190829003018186803b15801561398057600080fd5b505afa158015613994573d6000803e3d6000fd5b505050506040513d60208110156139aa57600080fd5b505160408051630ede4edd60e41b81526001600160a01b03858116600483015291519293506000929184169163ede4edd09160248082019260209290919082900301818787803b1580156139fd57600080fd5b505af1158015613a11573d6000803e3d6000fd5b505050506040513d6020811015613a2757600080fd5b50519050613a348361558b565b93505050613a4181614517565b50919050565b600154600160a01b900460ff1681565b6000613a61614a82565b6000613a6b61123f565b90506000613a77612600565b9050613a81611ff6565b80613a895750805b613ada576040805162461bcd60e51b815260206004820152601c60248201527f63616e742d706572666f726d2d6c6971756964617465426f72726f7700000000604482015290519081900360640190fd5b8015613b47576005546001600160a01b03888116911614613b42576040805162461bcd60e51b815260206004820152601d60248201527f6465627443546f6b656e213d6c69717569646174696f6e43546f6b656e000000604482015290519081900360640190fd5b613bc5565b6002546001600160a01b03888116911614613ba9576040805162461bcd60e51b815260206004820152601a60248201527f6465627443546f6b656e213d746f70706564557043546f6b656e000000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0389161790555b80613bd757613bd387612bfd565b6004555b600454861115613c2e576040805162461bcd60e51b815260206004820152601960248201527f616d6f756e74546f4c69717569646174652d746f6f2d62696700000000000000604482015290519081900360640190fd5b84861015613c6d5760405162461bcd60e51b815260040180806020018281038252602d815260200180615b72602d913960400191505060405180910390fd5b6000613c7987876146ff565b90508015613f18576000613c8c896149ab565b90508015613db557813414613ce0576040805162461bcd60e51b81526020600482015260156024820152741a5b9cdd59999958da595b9d0b5155120b5cd95b9d605a1b604482015290519081900360640190fd5b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b158015613d2457600080fd5b505afa158015613d38573d6000803e3d6000fd5b505050506040513d6020811015613d4e57600080fd5b505160408051632726cff560e11b815290519192506001600160a01b03831691634e4d9fea918691600480830192600092919082900301818588803b158015613d9657600080fd5b505af1158015613daa573d6000803e3d6000fd5b505050505050613f16565b60025460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015613dfa57600080fd5b505afa158015613e0e573d6000803e3d6000fd5b505050506040513d6020811015613e2457600080fd5b50519050613e436001600160a01b03821686308663ffffffff614b3316565b613e5d6001600160a01b0382168b8563ffffffff614b8d16565b896001600160a01b0316630e752702846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613ea357600080fd5b505af1158015613eb7573d6000803e3d6000fd5b505050506040513d6020811015613ecd57600080fd5b505115613f14576040805162461bcd60e51b815260206004820152601060248201526f1c995c185e509bdc9c9bddcb59985a5b60821b604482015290519081900360640190fd5b505b505b856003541015613f595760405162461bcd60e51b8152600401808060200182810382526023815260200180615b2e6023913960400191505060405180910390fd5b613f65600354876146ff565b600355600454613f7590886146ff565b600490815560015460408051635fe3b56760e01b815290516000936001600160a01b0390931692635fe3b56792808201926020929091829003018186803b158015613fbf57600080fd5b505afa158015613fd3573d6000803e3d6000fd5b505050506040513d6020811015613fe957600080fd5b50516040805163c488847b60e01b81526001600160a01b038c811660048301528981166024830152604482018c9052825193945060009384939186169263c488847b926064808301939192829003018186803b15801561404857600080fd5b505afa15801561405c573d6000803e3d6000fd5b505050506040513d604081101561407257600080fd5b508051602090910151909250905081156140bd5760405162461bcd60e51b8152600401808060200182810382526021815260200180615b516021913960400191505060405180910390fd5b876001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561411d57600080fd5b505af1158015614131573d6000803e3d6000fd5b505050506040513d602081101561414757600080fd5b5051614190576040805162461bcd60e51b815260206004820152601360248201527218dbdb1b10d51bdad95b8b5e199c8b59985a5b606a1b604482015290519081900360640190fd5b9a9950505050505050505050565b600080836001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156141dc57600080fd5b505af11580156141f0573d6000803e3d6000fd5b505050506040513d602081101561420657600080fd5b50519050611e5083826146db565b6001546040805163efedc66960e01b815290516000926001600160a01b03169163efedc669916004808301926020929190829003018186803b15801561128457600080fd5b60008181811215611364576040805162461bcd60e51b815260206004820152600f60248201526e18dbdb9d995c9cda5bdb8b59985a5b608a1b604482015290519081900360640190fd5b60408051600180825281830190925260009182916060916020808301908038833901905050905083816000815181106142d857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061430181615226565b60008151811061430d57fe5b6020026020010151925050613a4181614517565b6143296144c4565b600080600160009054906101000a90046001600160a01b03166001600160a01b03166319b68c006040518163ffffffff1660e01b815260040160206040518083038186803b15801561437a57600080fd5b505afa15801561438e573d6000803e3d6000fd5b505050506040513d60208110156143a457600080fd5b505160408051631249c58b60e01b815290519192506001600160a01b03831691631249c58b913491600480830192600092919082900301818588803b1580156143ec57600080fd5b505af1158015614400573d6000803e3d6000fd5b5050600154600160a01b900460ff1692506144ba91505057614420614214565b6001600160a01b0316637db00adf308361443934614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156144a157600080fd5b505af11580156144b5573d6000803e3d6000fd5b505050505b50610d7a81614517565b6144cd3361560c565b6137ad576040805162461bcd60e51b81526020600482015260166024820152751bdb9b1e4b50951bdad95b8b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b801561452a5761452561553c565b610d7a565b610d7a615709565b6000610ca58383604051806040016040528060118152602001706164646974696f6e206f766572666c6f7760781b81525061571e565b600160009054906101000a90046001600160a01b03166001600160a01b031663eaeec94b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156145b657600080fd5b505afa1580156145ca573d6000803e3d6000fd5b505050506040513d60208110156145e057600080fd5b50516001600160a01b031633146137ad576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c792d42436f6d7074726f6c6c65722d617574686f72697a656400000000604482015290519081900360640190fd5b6000614648615b1a565b600080614659866000015186615773565b9092509050600082600381111561466c57fe5b1461468b575060408051602081019091526000815290925090506146a1565b6040805160208101909152908152600093509150505b9250929050565b6000610ca583836040518060400160405280600e81526020016d646976696465206279207a65726f60901b8152506157b2565b6000670de0b6b3a76400006146f08484615814565b816146f757fe5b049392505050565b6000610ca58383604051806040016040528060158152602001747375627472616374696f6e20756e646572666c6f7760581b815250615856565b600080600080600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561478d57600080fd5b505afa1580156147a1573d6000803e3d6000fd5b505050506040513d60208110156147b757600080fd5b505160408051635ec88c7960e01b815230600482015290519192506001600160a01b03831691635ec88c7991602480820192606092909190829003018186803b15801561480357600080fd5b505afa158015614817573d6000803e3d6000fd5b505050506040513d606081101561482d57600080fd5b5080516020820151604090920151909550909350915061484b611ff6565b61485557506122de565b83156148a8576040805162461bcd60e51b815260206004820152601860248201527f4572722d696e2d6163636f756e742d6c69717569646974790000000000000000604482015290519081900360640190fd5b6002546040805163fc57d4df60e01b81526001600160a01b039283166004820152905160009288169163fc57d4df916024808301926020929190829003018186803b1580156148f657600080fd5b505afa15801561490a573d6000803e3d6000fd5b505050506040513d602081101561492057600080fd5b505160035490915060009061493590836146db565b9050808514156149525750600094508493508392506122de915050565b831580156149605750600085115b15614994578085111561497e5761497785826146ff565b945061498f565b61498881866146ff565b9350600094505b6149a1565b61499e8482614532565b93505b5050509193909250565b6001546040805162066da360ea1b815290516000926001600160a01b0316916319b68c00916004808301926020929190829003018186803b1580156149ef57600080fd5b505afa158015614a03573d6000803e3d6000fd5b505050506040513d6020811015614a1957600080fd5b50516001600160a01b038381169116149050919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526130c69084906158b0565b614a8a61123f565b6001600160a01b0316336001600160a01b0316146137ad576040805162461bcd60e51b81526020600482015260146024820152731bdb9b1e4b5c1bdbdb0b585d5d1a1bdc9a5e995960621b604482015290519081900360640190fd5b600154600160a01b900460ff16156137ad576040805162461bcd60e51b815260206004820152600b60248201526a3ab9b2b916b8bab4ba16a160a91b604482015290519081900360640190fd5b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526129c59085906158b0565b801580614c13575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614be557600080fd5b505afa158015614bf9573d6000803e3d6000fd5b505050506040513d6020811015614c0f57600080fd5b5051155b614c4e5760405162461bcd60e51b8152600401808060200182810382526036815260200180615bc96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526130c69084906158b0565b6000614caa6144c4565b600080846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015614ce657600080fd5b505afa158015614cfa573d6000803e3d6000fd5b505050506040513d6020811015614d1057600080fd5b50519050614d2e6001600160a01b038216868663ffffffff614b8d16565b6000856001600160a01b031663a0712d68866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015614d7657600080fd5b505af1158015614d8a573d6000803e3d6000fd5b505050506040513d6020811015614da057600080fd5b505190508015614de3576040805162461bcd60e51b81526020600482015260096024820152681b5a5b9d0b59985a5b60ba1b604482015290519081900360640190fd5b600154600160a01b900460ff16612bea57614dfc614214565b6001600160a01b0316637db00adf3088614e1589614259565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015614e7d57600080fd5b505af1158015614e91573d6000803e3d6000fd5b50505050925050612bf681614517565b600080600354118015614ec157506002546001600160a01b038481169116145b15613a41576000600354831015614ed85782614edc565b6003545b9050614ef5600354614ef0600354846146ff565b614f07565b614eff83826146ff565b915050611e54565b614f0f611ff6565b614f1857612478565b816003541015614f68576040805162461bcd60e51b8152602060048201526016602482015275185b5bdd5b9d0f8f5d1bdc1c1959155c105b5bdd5b9d60521b604482015290519081900360640190fd5b614f74600354836146ff565b6003819055158015614f8857506000600454115b15614f935760006004555b8015615053576002546040805163317afabb60e21b81526004810184905290516001600160a01b039092169163c5ebeaec916024808201926020929091908290030181600087803b158015614fe757600080fd5b505af1158015614ffb573d6000803e3d6000fd5b505050506040513d602081101561501157600080fd5b505115615053576040805162461bcd60e51b815260206004820152600b60248201526a189bdc9c9bddcb59985a5b60aa1b604482015290519081900360640190fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166319b68c006040518163ffffffff1660e01b815260040160206040518083038186803b1580156150a157600080fd5b505afa1580156150b5573d6000803e3d6000fd5b505050506040513d60208110156150cb57600080fd5b50516002546001600160a01b039081169116141561511b5760006150ed61123f565b6001600160a01b03166108fc849081150290604051600060405180830381858888f150612478945050505050565b60025460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b15801561516057600080fd5b505afa158015615174573d6000803e3d6000fd5b505050506040513d602081101561518a57600080fd5b505190506130c661519961123f565b6001600160a01b038316908563ffffffff614a3016565b6001546001600160a01b031615615204576040805162461bcd60e51b8152602060048201526013602482015272185d985d185c8b585b1c9958591e4b5a5b9a5d606a1b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080600160009054906101000a90046001600160a01b03166001600160a01b0316635fe3b5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561527957600080fd5b505afa15801561528d573d6000803e3d6000fd5b505050506040513d60208110156152a357600080fd5b5051604051631853304760e31b81526020600482018181528751602484015287519394506060936001600160a01b0386169363c2998238938a9392839260440191858101910280838360005b838110156153075781810151838201526020016152ef565b5050505090500192505050600060405180830381600087803b15801561532c57600080fd5b505af1158015615340573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561536957600080fd5b8101908080516040519392919084600160201b82111561538857600080fd5b90830190602082018581111561539d57600080fd5b82518660208202830111600160201b821117156153b957600080fd5b82525081516020918201928201910280838360005b838110156153e65781810151838201526020016153ce565b50505050905001604052505050905060008090505b81518110156154695781818151811061541057fe5b6020026020010151600014615461576040805162461bcd60e51b8152602060048201526012602482015271195b9d195c8b5b585c9ad95d1ccb59985a5b60721b604482015290519081900360640190fd5b6001016153fb565b50925050613a4181614517565b60015460408051630a57ebcf60e11b815230600482015290516001600160a01b03909216916314afd79e91602480820192602092909190829003018186803b1580156154c157600080fd5b505afa1580156154d5573d6000803e3d6000fd5b505050506040513d60208110156154eb57600080fd5b50516001600160a01b031633146137ad576040805162461bcd60e51b815260206004820152601060248201526f39b2b73232b916b737ba16b7bbb732b960811b604482015290519081900360640190fd5b61554461345a565b615584576040805162461bcd60e51b815260206004820152600c60248201526b063616e6e6f742d756e746f760a41b604482015290519081900360640190fd5b6000600455565b610d7a816000836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156155ca57600080fd5b505afa1580156155de573d6000803e3d6000fd5b505050506040513d60208110156155f457600080fd5b50516001600160a01b0316919063ffffffff614b8d16565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663eaeec94b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561565d57600080fd5b505afa158015615671573d6000803e3d6000fd5b505050506040513d602081101561568757600080fd5b5051604080516326f84feb60e11b81526001600160a01b038681166004830152915192935090831691634df09fd691602480820192602092909190829003018186803b1580156156d657600080fd5b505afa1580156156ea573d6000803e3d6000fd5b505050506040513d602081101561570057600080fd5b50519392505050565b615711612600565b156137ad576137ad61553c565b600083830182858210156112365760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b60008083615786575060009050806146a1565b8383028385828161579357fe5b04146157a7575060029150600090506146a1565b6000925090506146a1565b600081836158015760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b5082848161580b57fe5b04949350505050565b6000610ca583836040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000815250615a68565b600081848411156158a85760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b505050900390565b6158c2826001600160a01b0316615ade565b615913576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106159515780518252601f199092019160209182019101615932565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146159b3576040519150601f19603f3d011682016040523d82523d6000602084013e6159b8565b606091505b509150915081615a0f576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156129c557808060200190516020811015615a2b57600080fd5b50516129c55760405162461bcd60e51b815260040180806020018281038252602a815260200180615b9f602a913960400191505060405180910390fd5b6000831580615a75575082155b15615a8257506000610ca5565b83830283858281615a8f57fe5b041483906112365760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156133e65781810151838201526020016133ce565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590615b1257508115155b949350505050565b604051806020016040528060008152509056fe616d74546f44656475637446726f6d546f7075703e746f707065645570416d6f756e746572722d6c697175696461746543616c63756c6174655365697a65546f6b656e73616d74546f44656475637446726f6d546f7075703e756e6465726c79696e67416d74546f4c69717569646174655361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582074dc8f31228156573484e1529bb7e375a9e2745114b8f857592f7a7bb451fb3a64736f6c63430005100032
Deployed Bytecode Sourcemap
68765:1821:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62605:912;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62605:912:0;;;;;;;;;;;-1:-1:-1;;;;;62605:912:0;;:::i;:::-;;;;;;;;;;;;;;;;37145:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37145:41:0;;;:::i;69382:190::-;;;:::i;66515:836::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66515:836:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;66515:836:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40103:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40103:113:0;;;:::i;:::-;;;;-1:-1:-1;;;;;40103:113:0;;;;;;;;;;;;;;59896:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59896:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59896:292:0;-1:-1:-1;;;;;59896:292:0;;:::i;52516:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52516:201:0;;;:::i;48454:1026::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48454:1026:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48454:1026:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53158:625;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53158:625:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53158:625:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;53158:625:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;53158:625:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;53158:625:0;;-1:-1:-1;53158:625:0;-1:-1:-1;53158:625:0;;;;;;;;;;;:::i;37220:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37220:32:0;;;:::i;54182:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54182:238:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;64403:725;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64403:725:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64403:725:0;;;;;;;;;;;;;;;;;:::i;41714:825::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41714:825:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41714:825:0;;;;;;;;:::i;49713:522::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49713:522:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49713:522:0;;;;;;;;:::i;50874:179::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50874:179:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50874:179:0;-1:-1:-1;;;;;50874:179:0;;:::i;69787:239::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69787:239:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;69787:239:0;;;;;;;;:::i;60754:474::-;;;:::i;39507:93::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39507:93:0;;;:::i;63525:870::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63525:870:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63525:870:0;;;;;;;;;;;;;;;;;:::i;37054:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37054:29:0;;;:::i;54010:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54010:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54010:164:0;-1:-1:-1;;;;;54010:164:0;;:::i;42547:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42547:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42547:87:0;;:::i;53791:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53791:211:0;;;:::i;40788:635::-;;;:::i;39383:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39383:116:0;;;:::i;65136:684::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65136:684:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;65136:684:0;;;;;;;;;;;;;;;;;:::i;67591:487::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67591:487:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67591:487:0;;;;;;;;;;;;;;;;;:::i;36983:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36983:29:0;;;:::i;36864:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36864:25:0;;;:::i;61714:835::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61714:835:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;61714:835:0;;;;;;;;:::i;47803:643::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47803:643:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47803:643:0;-1:-1:-1;;;;;47803:643:0;;:::i;65857:650::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65857:650:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;65857:650:0;;;;;;;;;;;;;;;;;:::i;69035:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69035:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;69035:134:0;;;;;;;;;;;;;;;;;;;:::i;51287:340::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51287:340:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51287:340:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;51287:340:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51287:340:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;51287:340:0;;-1:-1:-1;51287:340:0;-1:-1:-1;51287:340:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51287:340:0;;;;;;;;;;;;;;;;;70062:521;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;70062:521:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;70062:521:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;70062:521:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;70062:521:0;;-1:-1:-1;70062:521:0;-1:-1:-1;70062:521:0;:::i;40391:170::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40391:170:0;;;:::i;39747:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39747:348:0;;;:::i;52725:425::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52725:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52725:425:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;52725:425:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;52725:425:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;52725:425:0;;-1:-1:-1;52725:425:0;-1:-1:-1;52725:425:0;:::i;50243:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50243:102:0;;;:::i;67359:224::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67359:224:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67359:224:0;;;;;;;;;;;;;;;;;:::i;52047:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52047:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52047:334:0;-1:-1:-1;;;;;52047:334:0;;:::i;36896:16::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36896:16:0;;;:::i;62605:912::-;62778:7;62836:14;:12;:14::i;:::-;62828:41;;;;;-1:-1:-1;;;62828:41:0;;;;;;;;;;;;-1:-1:-1;;;62828:41:0;;;;;;;;;;;;;;;62903:14;;-1:-1:-1;;;;;62903:14:0;62882:18;62956:94;62903:14;62987:28;63017:20;63039:10;62956:18;:94::i;:::-;62928:122;;63114:34;63151:44;63165:10;63177:17;63151:13;:44::i;:::-;63211:4;;63114:81;;-1:-1:-1;;;;63211:4:0;;;;63206:285;;63232:12;63247:8;:6;:8::i;:::-;63232:23;;63270:5;-1:-1:-1;;;;;63270:21:0;;63300:4;63315:10;63329:36;63338:26;63329:8;:36::i;:::-;63270:96;;;-1:-1:-1;;;;;;63270:96:0;;;;;;;-1:-1:-1;;;;;63270:96:0;;;;;;;;;;;;;;;63328:37;;;;63270:96;;;;;;;;;;;63328:37;63270:96;;;;;63328:37;63270:96;;;;5:2:-1;;;;30:1;27;20:12;5:2;63270:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63270:96:0;;;;63381:5;-1:-1:-1;;;;;63381:21:0;;63411:4;63426:10;63440:38;63449:28;63440:8;:38::i;:::-;63381:98;;;-1:-1:-1;;;;;;63381:98:0;;;;;;;-1:-1:-1;;;;;63381:98:0;;;;;;;;;;;;;;;63439:39;;;;63381:98;;;;;;;;;;;63439:39;63381:98;;;;;63439:39;63381:98;;;;5:2:-1;;;;30:1;27;20:12;5:2;63381:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63381:98:0;;;;63206:285;;63508:1;63501:8;;;;;62605:912;;;;;;:::o;37145:41::-;;;;:::o;69382:190::-;69449:8;;:17;;;-1:-1:-1;;;69449:17:0;;;;69424:14;;-1:-1:-1;;;;;69449:8:0;;:15;;:17;;;;;;;;;;;;;;:8;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;69449:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69449:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69449:17:0;;-1:-1:-1;69486:29:0;69449:17;69486:12;:29::i;:::-;:34;69478:63;;;;;-1:-1:-1;;;69478:63:0;;;;;;;;;;;;-1:-1:-1;;;69478:63:0;;;;;;;;;;;;;;;69552:12;:10;:12::i;:::-;69382:190;:::o;66515:836::-;66639:4;59512:18;:16;:18::i;:::-;66624:4;66676:8;;:23;;;-1:-1:-1;;;66676:23:0;;-1:-1:-1;;;;;66676:23:0;;;;;;;;;66656:17;;66676:8;;;;;:18;;:23;;;;;;;;;;;;;;;66656:17;66676:8;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;66676:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66676:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66676:23:0;66730:8;;:23;;;-1:-1:-1;;;66730:23:0;;-1:-1:-1;;;;;66730:23:0;;;;;;;;;66676;;-1:-1:-1;66710:17:0;;66730:8;;;;;:18;;:23;;;;;66676;;66730;;;;;;;66710:17;66730:8;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;66730:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66730:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66730:23:0;66780:49;;;-1:-1:-1;;;66780:49:0;;-1:-1:-1;;;;;66780:49:0;;;;;;;;;;;;;;;;;;;;;;66730:23;;-1:-1:-1;66766:11:0;;66780:19;;;;;;:49;;;;;66730:23;;66780:49;;;;;;;;66766:11;66780:19;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;66780:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66780:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66780:49:0;;-1:-1:-1;66780:49:0;66840:36;;;;;-1:-1:-1;;;66840:36:0;;;;;;;;;;;;-1:-1:-1;;;66840:36:0;;;;;;;;;;;;;;;66905:9;-1:-1:-1;;;;;66897:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66897:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66897:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66897:29:0;66889:66;;;;;-1:-1:-1;;;66889:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66966:30;66999:29;67013:6;67021;66999:13;:29::i;:::-;66966:62;;67041:12;67056:8;:6;:8::i;:::-;67041:23;;67088:9;-1:-1:-1;;;;;67080:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67080:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67080:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67080:25:0;67075:116;;67107:5;-1:-1:-1;;;;;67107:21:0;;67129:9;67148:6;67158:32;67167:22;67158:8;:32::i;:::-;67107:84;;;-1:-1:-1;;;;;;67107:84:0;;;;;;;-1:-1:-1;;;;;67107:84:0;;;;;;;;;;;;;;;67157:33;;;;67107:84;;;;;;;;;;;67157:33;67107:84;;;;;67157:33;67107:84;;;;5:2:-1;;;;30:1;27;20:12;5:2;67107:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67107:84:0;;;;67075:116;67215:9;-1:-1:-1;;;;;67207:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67207:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67207:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67207:25:0;67202:115;;67234:5;-1:-1:-1;;;;;67234:21:0;;67256:9;67275:6;67284:32;67293:22;67284:8;:32::i;:::-;67234:83;;;;;;;;;;;;;-1:-1:-1;;;;;67234:83:0;-1:-1:-1;;;;;67234:83:0;;;;;;-1:-1:-1;;;;;67234:83:0;-1:-1:-1;;;;;67234:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67234:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67234:83:0;;;;67202:115;-1:-1:-1;67337:6:0;;-1:-1:-1;;;;37993:25:0;38005:12;37993:11;:25::i;:::-;59541:1;66515:836;;;;;;:::o;40103:113::-;40191:8;;:15;;;-1:-1:-1;;;40191:15:0;;;;40140;;-1:-1:-1;;;;;40191:8:0;;:13;;:15;;;;;;;;;;;;;;:8;:15;;;5:2:-1;;;;30:1;27;20:12;5:2;40191:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40191:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40191:15:0;;-1:-1:-1;40103:113:0;;:::o;59896:292::-;59969:7;59512:18;:16;:18::i;:::-;60017:42;;;-1:-1:-1;;;60017:42:0;;60053:4;60017:42;;;;;;59989:25;;-1:-1:-1;;;;;60017:27:0;;;;;:42;;;;;;;;;;;;;;;59989:25;60017:27;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;60017:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60017:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60017:42:0;60073:14;;60017:42;;-1:-1:-1;;;;;;60073:24:0;;;:14;;:24;60070:75;;;60106:39;60111:17;60130:14;;60106:4;:39::i;:::-;60099:46;;;;;60070:75;60163:17;-1:-1:-1;59541:1:0;59896:292;;;:::o;52516:201::-;37728:24;:22;:24::i;:::-;52614:8;;:22;;;-1:-1:-1;;;52614:22:0;;;;52574:24;;-1:-1:-1;;;;;52614:8:0;;:20;;:22;;;;;;;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;52614:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52614:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52614:22:0;52648:36;;;-1:-1:-1;;;52648:36:0;;52678:4;52648:36;;;;;;52614:22;;-1:-1:-1;;;;;;52648:21:0;;;;;:36;;;;;-1:-1:-1;;52648:36:0;;;;;;;;-1:-1:-1;52648:21:0;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;52648:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52648:36:0;;;;52695:14;:12;:14::i;48454:1026::-;48605:28;48635;48753:14;48769:17;;:::i;:::-;48790:62;48800:41;;;;;;;;48815:24;48800:41;;;9071:4;48790:9;:62::i;:::-;48752:100;;-1:-1:-1;48752:100:0;-1:-1:-1;48879:18:0;48871:4;:26;;;;;;;;;48863:68;;;;;-1:-1:-1;;;48863:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48974:15;;48942:29;49097:52;48974:15;49128:20;49097:4;:52::i;:::-;49072:77;;49259:42;49270:14;;49286;49259:10;:42::i;:::-;49236:65;;49420:52;49425:24;49451:20;49420:4;:52::i;:::-;49397:75;;48454:1026;;;;;;;;;:::o;53158:625::-;37728:24;:22;:24::i;:::-;53358:29;;;;;;;;;;;;;;;;53331:24;;53372:7;53358:29;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53358:29:0;-1:-1:-1;53331:56:0;-1:-1:-1;53402:9:0;53398:112;53417:18;;;53398:112;;;53478:7;;53486:1;53478:10;;;;;;;;;;;;;-1:-1:-1;;;;;53478:10:0;-1:-1:-1;;;;;53470:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53470:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53470:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53470:28:0;53457:10;;:7;;53465:1;;53457:10;;;;;;-1:-1:-1;;;;;53457:41:0;;;:10;;;;;;;;;;;:41;53437:3;;53398:112;;;-1:-1:-1;53549:16:0;;;53563:1;53549:16;;;;;;;;;53522:24;;53549:16;;;;;;105:10:-1;53549:16:0;88:34:-1;136:17;;-1:-1;53549:16:0;53522:43;;53597:4;53576:7;53584:1;53576:10;;;;;;;;-1:-1:-1;;;;;53576:26:0;;;:10;;;;;;;;;;:26;;;;53653:8;;:22;;;-1:-1:-1;;;53653:22:0;;;;53613:24;;53653:8;;;;;:20;;:22;;;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;53653:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53653:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53653:22:0;53687:61;;-1:-1:-1;;;53687:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53653:22;;-1:-1:-1;;;;;;53687:21:0;;;;;53709:7;;53718;;53727:9;;53738;;53687:61;;;;;;;;;;;;53653:22;53687:61;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53687:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53687:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53687:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53687:61:0;;;;53761:14;:12;:14::i;:::-;37763:1;;;53158:625;;;;:::o;37220:32::-;;;-1:-1:-1;;;;;37220:32:0;;:::o;54182:238::-;54236:8;54246:14;54262;54289:24;54329:8;;;;;;;;;-1:-1:-1;;;;;54329:8:0;-1:-1:-1;;;;;54329:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54329:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54329:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54329:22:0;54391:20;;;-1:-1:-1;;;54391:20:0;;;;54329:22;;-1:-1:-1;54370:42:0;;-1:-1:-1;;;;;54391:18:0;;;;;:20;;;;;54329:22;;54391:20;;;;;;;:18;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;54391:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54391:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54391:20:0;54370;:42::i;:::-;54363:49;;;;;;;54182:238;;;:::o;64403:725::-;64580:7;59512:18;:16;:18::i;:::-;64565:4;64600:14;64617:6;-1:-1:-1;;;;;64617:23:0;;64641:12;64617:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64617:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64617:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64617:37:0;;-1:-1:-1;64673:11:0;;64665:45;;;;;-1:-1:-1;;;64665:45:0;;;;;;;;;;;;-1:-1:-1;;;64665:45:0;;;;;;;;;;;;;;;64728:4;;-1:-1:-1;;;64728:4:0;;;;64723:92;;64734:8;:6;:8::i;:::-;-1:-1:-1;;;;;64734:24:0;;64767:4;64782:6;64792:22;64801:12;64792:8;:22::i;:::-;64734:81;;;-1:-1:-1;;;;;;64734:81:0;;;;;;;-1:-1:-1;;;;;64734:81:0;;;;;;;;;;;;;;;64791:23;;;;64734:81;;;;;;;;;;;64791:23;64734:81;;;;;64791:23;64734:81;;;;5:2:-1;;;;30:1;27;20:12;5:2;64734:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64734:81:0;;;;64723:92;64872:17;64882:6;64872:9;:17::i;:::-;64869:228;;;64906:38;;-1:-1:-1;;;;;64906:24:0;;;:38;;;;;64931:12;;64906:38;;;;64931:12;64906:24;:38;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64906:38:0;64869:228;;;64977:17;64997:6;-1:-1:-1;;;;;64997:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64997:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64997:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64997:19:0;;-1:-1:-1;65031:54:0;-1:-1:-1;;;;;65031:23:0;;65055:15;65072:12;65031:54;:23;:54;:::i;:::-;64869:228;;65114:6;-1:-1:-1;37993:25:0;38005:12;37993:11;:25::i;:::-;59541:1;64403:725;;;;;:::o;41714:825::-;37527:16;:14;:16::i;:::-;41795:21;:19;:21::i;:::-;41861:16;41880:12;:10;:12::i;:::-;41861:31;;41906:11;41903:107;;;41942:14;;-1:-1:-1;;;;;41942:24:0;;;:14;;:24;41934:64;;;;;-1:-1:-1;;;41934:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42075:17;42095:6;-1:-1:-1;;;;;42095:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42095:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42095:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42095:19:0;;-1:-1:-1;42125:63:0;42153:6;:4;:6::i;:::-;-1:-1:-1;;;;;42125:27:0;;;42169:4;42176:11;42125:63;:27;:63;:::i;:::-;42199:52;-1:-1:-1;;;;;42199:22:0;;42230:6;42239:11;42199:52;:22;:52;:::i;:::-;42320:6;-1:-1:-1;;;;;42320:18:0;;42339:11;42320:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42320:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42320:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42320:31:0;:36;42312:65;;;;;-1:-1:-1;;;42312:65:0;;;;;;;;;;;;-1:-1:-1;;;42312:65:0;;;;;;;;;;;;;;;42434:11;42429:41;;42447:14;:23;;-1:-1:-1;;;;;;42447:23:0;-1:-1:-1;;;;;42447:23:0;;;;;42429:41;42498:33;42503:14;;42519:11;42498:4;:33::i;:::-;42481:14;:50;-1:-1:-1;;;;41714:825:0:o;49713:522::-;49954:26;;49850:28;;;;49996:23;:21;:23::i;:::-;49991:112;;50056:35;50080:10;50056:23;:35::i;:::-;50036:55;;49991:112;50160:67;50183:24;50209:17;50160:22;:67::i;:::-;50113:114;;;;-1:-1:-1;49713:522:0;-1:-1:-1;;;;49713:522:0:o;50874:179::-;50946:7;37728:24;:22;:24::i;:::-;50966:14;50991:6;-1:-1:-1;;;;;50983:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50983:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50983:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50983:24:0;;-1:-1:-1;51025:20:0;50983:24;51025:12;:20::i;69787:239::-;69853:7;69881:29;69902:6;69881:12;:29::i;:::-;:34;69873:63;;;;;-1:-1:-1;;;69873:63:0;;;;;;;;;;;;-1:-1:-1;;;69873:63:0;;;;;;;;;;;;;;;69947:14;69964:30;69975:6;69983:10;69964;:30::i;:::-;69947:47;-1:-1:-1;;69787:239:0;;;;;:::o;60754:474::-;59512:18;:16;:18::i;:::-;60852:5;60875:14;60900:8;;;;;;;;;-1:-1:-1;;;;;60900:8:0;-1:-1:-1;;;;;60900:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60900:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60900:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60900:17:0;;-1:-1:-1;60929:28:0;60960:36;60900:17;60986:9;60960:17;:36::i;:::-;60929:67;-1:-1:-1;61010:24:0;;61007:77;;61036:6;-1:-1:-1;;;;;61036:18:0;;61061:20;61036:48;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61036:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61036:48:0;;;;;61007:77;61136:4;;-1:-1:-1;;;61136:4:0;;;;61131:89;;61142:8;:6;:8::i;:::-;-1:-1:-1;;;;;61142:24:0;;61175:4;61190:6;61200:19;61209:9;61200:8;:19::i;:::-;61142:78;;;-1:-1:-1;;;;;;61142:78:0;;;;;;;-1:-1:-1;;;;;61142:78:0;;;;;;;;;;;;;;;61199:20;;;;61142:78;;;;;;;;;;;61199:20;61142:78;;;;;61199:20;61142:78;;;;5:2:-1;;;;30:1;27;20:12;5:2;61142:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61142:78:0;;;;61131:89;37981:1;;37993:25;38005:12;37993:11;:25::i;39507:93::-;39574:14;;:18;;39507:93;:::o;63525:870::-;63692:7;59512:18;:16;:18::i;:::-;63677:4;63712:14;63729:6;-1:-1:-1;;;;;63729:13:0;;63743:12;63729:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63729:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63729:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63729:27:0;;-1:-1:-1;63775:11:0;;63767:35;;;;;-1:-1:-1;;;63767:35:0;;;;;;;;;;;;-1:-1:-1;;;63767:35:0;;;;;;;;;;;;;;;63815:30;63848:35;63862:6;63870:12;63848:13;:35::i;:::-;63899:4;;63815:68;;-1:-1:-1;;;;63899:4:0;;;;63894:102;;63905:8;:6;:8::i;:::-;-1:-1:-1;;;;;63905:24:0;;63938:4;63953:6;63963:32;63972:22;63963:8;:32::i;:::-;63905:91;;;-1:-1:-1;;;;;;63905:91:0;;;;;;;-1:-1:-1;;;;;63905:91:0;;;;;;;;;;;;;;;63962:33;;;;63905:91;;;;;;;;;;;63962:33;63905:91;;;;;63962:33;63905:91;;;;5:2:-1;;;;30:1;27;20:12;5:2;63905:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63905:91:0;;;;63894:102;64053:17;64063:6;64053:9;:17::i;:::-;64050:314;;;64087:47;;-1:-1:-1;;;;;64087:24:0;;;64112:21;64087:47;;;;;;;;;64112:21;64087:24;:47;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64087:47:0;64050:314;;;64167:17;64187:6;-1:-1:-1;;;;;64187:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64187:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64187:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64187:19:0;64246:35;;;-1:-1:-1;;;64246:35:0;;64275:4;64246:35;;;;;;64187:19;;-1:-1:-1;64221:22:0;;-1:-1:-1;;;;;64246:20:0;;;;;:35;;;;;64187:19;;64246:35;;;;;;;:20;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;64246:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64246:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64246:35:0;;-1:-1:-1;64296:56:0;-1:-1:-1;;;;;64296:23:0;;64320:15;64246:35;64296:56;:23;:56;:::i;:::-;64050:314;;-1:-1:-1;64381:6:0;-1:-1:-1;37993:25:0;38005:12;37993:11;:25::i;37054:29::-;;;;:::o;54010:164::-;54078:8;54088:14;54104;54138:28;54159:6;54138:20;:28::i;:::-;54131:35;;;;;;54010:164;;;;;;:::o;42547:87::-;37527:16;:14;:16::i;:::-;42604:22;42611:6;42619;42604;:22::i;53791:211::-;53849:8;;:31;;;-1:-1:-1;;;53849:31:0;;53874:4;53849:31;;;;;;53833:13;;-1:-1:-1;;;;;53849:8:0;;:16;;:31;;;;;;;;;;;;;;:8;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;53849:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53849:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53849:31:0;53912:8;;:15;;;-1:-1:-1;;;53912:15:0;;;;53849:31;;-1:-1:-1;53891:11:0;;-1:-1:-1;;;;;53912:8:0;;;;:13;;:15;;;;;53849:31;;53912:15;;;;;;;;:8;:15;;;5:2:-1;;;;30:1;27;20:12;5:2;53912:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53912:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53912:15:0;53964:29;;;-1:-1:-1;;;53964:29:0;;53987:4;53964:29;;;;;;53912:15;;-1:-1:-1;53939:55:0;;53957:5;;-1:-1:-1;;;;;53964:14:0;;;;;:29;;;;;53912:15;;53964:29;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;53964:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53964:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53964:29:0;-1:-1:-1;;;;;53939:17:0;;;:55;;:17;:55;:::i;:::-;53791:211;;:::o;40788:635::-;37527:16;:14;:16::i;:::-;40842:21;:19;:21::i;:::-;40897:8;;:17;;;-1:-1:-1;;;40897:17:0;;;;40876:18;;-1:-1:-1;;;;;40897:8:0;;:15;;:17;;;;;;;;;;;;;;:8;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;40897:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40897:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40897:17:0;;-1:-1:-1;40957:16:0;40976:12;:10;:12::i;:::-;40957:31;;41002:11;40999:120;;;41046:14;;-1:-1:-1;;;;;41038:37:0;;;41046:14;;41038:37;41030:77;;;;;-1:-1:-1;;;41030:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41179:14;41204:10;41179:36;;41226:6;-1:-1:-1;;;;;41226:18:0;;41251:9;41226:37;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41226:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41226:37:0;;;;;41320:11;41315:41;;41333:14;:23;;-1:-1:-1;;;;;;41333:23:0;-1:-1:-1;;;;;41333:23:0;;;;;41315:41;41384:31;41389:14;;41405:9;41384:4;:31::i;:::-;41367:14;:48;-1:-1:-1;;;40788:635:0:o;39383:116::-;39461:26;;:30;;39383:116;:::o;65136:684::-;65303:7;59512:18;:16;:18::i;:::-;65288:4;65323:14;65340:6;-1:-1:-1;;;;;65340:13:0;;65354:12;65340:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65340:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65340:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65340:27:0;;-1:-1:-1;65386:11:0;;65378:35;;;;;-1:-1:-1;;;65378:35:0;;;;;;;;;;;;-1:-1:-1;;;65378:35:0;;;;;;;;;;;;;;;65431:4;;-1:-1:-1;;;65431:4:0;;;;65426:91;;65437:8;:6;:8::i;:::-;-1:-1:-1;;;;;65437:24:0;;65470:4;65485:6;65494:22;65503:12;65494:8;:22::i;:::-;65437:80;;;;;;;;;;;;;-1:-1:-1;;;;;65437:80:0;-1:-1:-1;;;;;65437:80:0;;;;;;-1:-1:-1;;;;;65437:80:0;-1:-1:-1;;;;;65437:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;67591:487:0;67750:8;;:22;;;-1:-1:-1;;;67750:22:0;;-1:-1:-1;;;;;67750:22:0;;;;;;;;;67681:5;;;;67750:8;;:16;;:22;;;;;;;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;67750:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67750:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67750:22:0;-1:-1:-1;;;;;67750:36:0;;67742:66;;;;;-1:-1:-1;;;67742:66:0;;;;;;;;;;;;-1:-1:-1;;;67742:66:0;;;;;;;;;;;;;;;67827:51;;;-1:-1:-1;;;67827:51:0;;-1:-1:-1;;;;;67827:51:0;;;;;;;67861:4;67827:51;;;;;;;;;;;;:19;;;;;;:51;;;;;;;;;;;;;;;-1:-1:-1;67827:19:0;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;67827:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67827:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67827:51:0;67819:81;;;;;-1:-1:-1;;;67819:81:0;;;;;;;;;;;;-1:-1:-1;;;67819:81:0;;;;;;;;;;;;;;;67911:21;67935:32;67949:6;67957:9;67935:13;:32::i;:::-;67983:4;;67911:56;;-1:-1:-1;;;;67983:4:0;;;;67978:92;;67989:8;:6;:8::i;:::-;-1:-1:-1;;;;;67989:24:0;;68022:4;68037:6;68046:23;68055:13;68046:8;:23::i;:::-;67989:81;;;;;;;;;;;;;-1:-1:-1;;;;;67989:81:0;-1:-1:-1;;;;;67989:81:0;;;;;;-1:-1:-1;;;;;67989:81:0;-1:-1:-1;;;;;67989:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67989:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67989:81:0;;;;67978:92;37981:1;37993:25;38005:12;37993:11;:25::i;:::-;67591:487;;;;:::o;36983:29::-;;;-1:-1:-1;;;;;36983:29:0;;:::o;36864:25::-;;;-1:-1:-1;;;;;36864:25:0;;:::o;61714:835::-;61855:7;59512:18;:16;:18::i;:::-;61830:5;61880:28;61911:38;61929:6;61937:11;61911:17;:38::i;:::-;61880:69;-1:-1:-1;61960:14:0;61992:24;;61989:491;;62033:17;62053:6;-1:-1:-1;;;;;62053:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62053:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62053:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62053:19:0;;-1:-1:-1;62182:61:0;-1:-1:-1;;;;;62182:22:0;;62213:6;62222:20;62182:61;:22;:61;:::i;:::-;62267:6;-1:-1:-1;;;;;62267:18:0;;62286:20;62267:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62267:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62267:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62267:40:0;;-1:-1:-1;62330:11:0;;62322:40;;;;;-1:-1:-1;;;62322:40:0;;;;;;;;;;;;-1:-1:-1;;;62322:40:0;;;;;;;;;;;;;;;62382:4;;-1:-1:-1;;;62382:4:0;;;;62377:91;;62388:8;:6;:8::i;:::-;-1:-1:-1;;;;;62388:24:0;;62421:4;62436:6;62446:21;62455:11;62446:8;:21::i;:::-;62388:80;;;-1:-1:-1;;;;;;62388:80:0;;;;;;;-1:-1:-1;;;;;62388:80:0;;;;;;;;;;;;;;;62445:22;;;;62388:80;;;;;;;;;;;62445:22;62388:80;;;;;62445:22;62388:80;;;;5:2:-1;;;;30:1;27;20:12;5:2;62388:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62388:80:0;;;;62377:91;61989:491;;62497:6;-1:-1:-1;;37993:25:0;38005:12;37993:11;:25::i;:::-;59541:1;61714:835;;;;:::o;47803:643::-;47872:7;47895:23;:21;:23::i;:::-;47892:61;;;-1:-1:-1;47927:26:0;;47920:33;;47892:61;47987:46;;;-1:-1:-1;;;47987:46:0;;48027:4;47987:46;;;;;;47966:18;;-1:-1:-1;;;;;47987:31:0;;;;;:46;;;;;;;;;;;;;;;47966:18;47987:31;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;47987:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47987:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47987:46:0;48135:14;;47987:46;;-1:-1:-1;48098:17:0;;48118:32;;47987:46;;48118:4;:32::i;:::-;48098:52;;48301:24;48341:8;;;;;;;;;-1:-1:-1;;;;;48341:8:0;-1:-1:-1;;;;;48341:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48341:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48341:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48341:22:0;48393:33;;;-1:-1:-1;;;48393:33:0;;;;48341:22;;-1:-1:-1;48382:56:0;;-1:-1:-1;;;;;48393:31:0;;;;;:33;;;;;48341:22;;48393:33;;;;;;;;:31;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;48393:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48393:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48393:33:0;48428:9;48382:10;:56::i;:::-;48375:63;47803:643;-1:-1:-1;;;;;47803:643:0:o;65857:650::-;65964:4;59512:18;:16;:18::i;:::-;65949:4;66001:8;;:23;;;-1:-1:-1;;;66001:23:0;;-1:-1:-1;;;;;66001:23:0;;;;;;;;;65981:17;;66001:8;;;;;:18;;:23;;;;;;;;;;;;;;;65981:17;66001:8;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;66001:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66001:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66001:23:0;66049:34;;;-1:-1:-1;;;66049:34:0;;-1:-1:-1;;;;;66049:34:0;;;;;;;;;;;;;;;66001:23;;-1:-1:-1;66035:11:0;;66049:15;;;;;;:34;;;;;66001:23;;66049:34;;;;;;;;66035:11;66049:15;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;66049:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66049:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66049:34:0;;-1:-1:-1;66049:34:0;66094:32;;;;;-1:-1:-1;;;66094:32:0;;;;;;;;;;;;-1:-1:-1;;;66094:32:0;;;;;;;;;;;;;;;66139:30;66172:29;66186:6;66194;66172:13;:29::i;:::-;66139:62;;66214:12;66229:8;:6;:8::i;:::-;66253:4;;66214:23;;-1:-1:-1;;;;66253:4:0;;;;66248:99;;66259:5;-1:-1:-1;;;;;66259:21:0;;66289:4;66304:6;66314:32;66323:22;66314:8;:32::i;:::-;66259:88;;;-1:-1:-1;;;;;;66259:88:0;;;;;;;-1:-1:-1;;;;;66259:88:0;;;;;;;;;;;;;;;66313:33;;;;66259:88;;;;;;;;;;;66313:33;66259:88;;;;;66313:33;66259:88;;;;5:2:-1;;;;30:1;27;20:12;5:2;66259:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66259:88:0;;;;66248:99;66371:9;-1:-1:-1;;;;;66363:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66363:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66363:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66363:25:0;66358:115;;66390:5;-1:-1:-1;;;;;66390:21:0;;66412:9;66431:6;66440:32;66449:22;66440:8;:32::i;:::-;66390:83;;;;;;;;;;;;;-1:-1:-1;;;;;66390:83:0;-1:-1:-1;;;;;66390:83:0;;;;;;-1:-1:-1;;;;;66390:83:0;-1:-1:-1;;;;;66390:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66390:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66390:83:0;;;;66358:115;-1:-1:-1;66493:6:0;;-1:-1:-1;;;37993:25:0;38005:12;37993:11;:25::i;69035:134::-;69135:26;69151:9;69135:15;:26::i;:::-;69035:134;;;:::o;51287:340::-;51372:16;37728:24;:22;:24::i;:::-;51428:29;;;;;;;;;;;;;;;;51401:24;;51442:7;51428:29;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;51428:29:0;-1:-1:-1;51401:56:0;-1:-1:-1;51472:9:0;51468:112;51487:18;;;51468:112;;;51548:7;;51556:1;51548:10;;;;;;;;;;;;;-1:-1:-1;;;;;51548:10:0;-1:-1:-1;;;;;51540:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51540:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51540:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51540:28:0;51527:10;;:7;;51535:1;;51527:10;;;;;;-1:-1:-1;;;;;51527:41:0;;;:10;;;;;;;;;;;:41;51507:3;;51468:112;;;;51597:22;51611:7;51597:13;:22::i;70062:521::-;37299:23;:21;:23::i;:::-;70174:16;70303:1;70290:4;;70295:1;70290:7;;;;;;;;;;;;;;70279:25;;;;-1:-1:-1;70275:1:0;70262:4;;70267:1;70262:7;;;;;;;;;;;;;;70251:25;;;;-1:-1:-1;70246:2:0;70233:4;;70238:1;70233:7;;;;;;;;;;;;;;70222:26;;;;-1:-1:-1;70217:2:0;70204:4;;70209:1;70204:7;;;;;70384:4;;70204:7;;;;;70193:26;;;:55;;;;:83;;;;:111;;;;;-1:-1:-1;;70336:27:0;;;;;-1:-1:-1;;;70384:4:0;;70198:14;70384:4;;:60;;-1:-1:-1;70392:8:0;;:52;;;-1:-1:-1;;;70392:52:0;;-1:-1:-1;;;;;70392:52:0;;;;;;;-1:-1:-1;;;;;;70392:52:0;;;;;;;;:8;;;;;:31;;:52;;;;;;;;;;;;;;:8;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;70392:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70392:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70392:52:0;70384:60;70376:83;;;;;-1:-1:-1;;;70376:83:0;;;;;;;;;;;;-1:-1:-1;;;70376:83:0;;;;;;;;;;;;;;;70471:9;70482:16;70502:6;-1:-1:-1;;;;;70502:11:0;70520:9;70531:4;;70502:34;;;;;30:3:-1;22:6;14;1:33;70502:34:0;;45:16:-1;;;-1:-1;70502:34:0;;-1:-1:-1;70502:34:0;;-1:-1:-1;;70502:34:0;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;70470:66:0;;;;70557:4;70570:3;70549:26;;;;;-1:-1:-1;;;70549:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;70549:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37333:1;;;;70062:521;;;:::o;40391:170::-;40431:4;40448:11;40462:12;:10;:12::i;:::-;:48;;;;;40508:1;40479:26;;:30;40462:48;:65;;;;40516:10;:8;:10::i;:::-;40515:11;40462:65;40448:79;-1:-1:-1;;40391:170:0;:::o;39747:348::-;39783:4;39853:12;:10;:12::i;:::-;39849:29;;-1:-1:-1;39874:4:0;39867:11;;39849:29;39929:8;;:22;;;-1:-1:-1;;;39929:22:0;;;;39889:24;;-1:-1:-1;;;;;39929:8:0;;:20;;:22;;;;;;;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;39929:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39929:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39929:22:0;40011:14;;40043;;39977:81;;;-1:-1:-1;;;39977:81:0;;-1:-1:-1;;;;;40011:14:0;;;39977:81;;;;40036:4;39977:81;;;;;;;;;;;;39929:22;;-1:-1:-1;39963:11:0;;39977:25;;;;;;:81;;;;;39929:22;;39977:81;;;;;;;;39963:11;39977:25;:81;;;5:2:-1;;;;30:1;27;20:12;5:2;39977:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39977:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39977:81:0;:86;;-1:-1:-1;;;39747:348:0;:::o;52725:425::-;37728:24;:22;:24::i;:::-;52836:29;;;;;;;;;;;;;;;;52809:24;;52850:7;52836:29;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;52836:29:0;-1:-1:-1;52809:56:0;-1:-1:-1;52880:9:0;52876:112;52895:18;;;52876:112;;;52956:7;;52964:1;52956:10;;;;;;;;;;;;;-1:-1:-1;;;;;52956:10:0;-1:-1:-1;;;;;52948:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52948:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52948:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52948:28:0;52935:10;;:7;;52943:1;;52935:10;;;;;;-1:-1:-1;;;;;52935:41:0;;;:10;;;;;;;;;;;:41;52915:3;;52876:112;;;-1:-1:-1;53038:8:0;;:22;;;-1:-1:-1;;;53038:22:0;;;;52998:24;;-1:-1:-1;;;;;53038:8:0;;:20;;:22;;;;;;;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;53038:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53038:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53038:22:0;53072:45;;;-1:-1:-1;;;53072:45:0;;53102:4;53072:45;;;;;;;;;;;;;;;;;;;;53038:22;;-1:-1:-1;;;;;;53072:21:0;;;;;53102:4;;53109:7;;53072:45;;;;;;53038:22;53072:45;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53072:45:0;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53072:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53072:45:0;;;;53128:14;:12;:14::i;50243:102::-;37299:23;:21;:23::i;:::-;50305:4;50298:11;;-1:-1:-1;;;;50298:11:0;-1:-1:-1;;;50298:11:0;;;50320:17;:15;:17::i;:::-;50243:102::o;67359:224::-;67452:4;59512:18;:16;:18::i;:::-;67493:8;;:27;;;-1:-1:-1;;;67493:27:0;;-1:-1:-1;;;;;67493:27:0;;;;;;;;;67469:21;;67493:8;;;;;:18;;:27;;;;;;;;;;;;;;;67469:21;67493:8;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;67493:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67493:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67493:27:0;67538:37;;;-1:-1:-1;;;67538:37:0;;-1:-1:-1;;;;;67538:37:0;;;;;;;;;;;;;;;67493:27;;-1:-1:-1;67538:14:0;;;;;;:37;;;;;67493:27;;67538:37;;;;;;;;-1:-1:-1;67538:14:0;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;67538:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67538:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;67538:37:0;;67359:224;-1:-1:-1;;;;;67359:224:0:o;52047:334::-;52135:7;37728:24;:22;:24::i;:::-;52120:4;52155:14;52172:6;-1:-1:-1;;;;;52172:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52172:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52172:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52172:15:0;52238:8;;:22;;;-1:-1:-1;;;52238:22:0;;;;52172:15;;-1:-1:-1;52198:24:0;;-1:-1:-1;;;;;52238:8:0;;;;:20;;:22;;;;;52172:15;;52238:22;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;52238:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52238:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52238:22:0;52286:30;;;-1:-1:-1;;;52286:30:0;;-1:-1:-1;;;;;52286:30:0;;;;;;;;;52238:22;;-1:-1:-1;52272:11:0;;52286:22;;;;;;:30;;;;;52238:22;;52286:30;;;;;;;;52272:11;52286:22;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;52286:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52286:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52286:30:0;;-1:-1:-1;52327:22:0;52342:6;52327:14;:22::i;:::-;52367:6;-1:-1:-1;;;37993:25:0;38005:12;37993:11;:25::i;:::-;37763:1;52047:334;;;:::o;36896:16::-;;;-1:-1:-1;;;36896:16:0;;;;;:::o;44699:3096::-;44928:7;37527:16;:14;:16::i;:::-;44953:28;44984:6;:4;:6::i;:::-;44953:37;;45054:24;45081:23;:21;:23::i;:::-;45054:50;;45123:12;:10;:12::i;:::-;:35;;;;45139:19;45123:35;45115:76;;;;;-1:-1:-1;;;45115:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45207:19;45204:269;;;45265:17;;-1:-1:-1;;;;;45251:31:0;;;45265:17;;45251:31;45243:73;;;;;-1:-1:-1;;;45243:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45204:269;;;45371:14;;-1:-1:-1;;;;;45357:28:0;;;45371:14;;45357:28;45349:67;;;;;-1:-1:-1;;;45349:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45431:17;:30;;-1:-1:-1;;;;;;45431:30:0;-1:-1:-1;;;;;45431:30:0;;;;;45204:269;45489:19;45485:116;;45554:35;45578:10;45554:23;:35::i;:::-;45525:26;:64;45485:116;45707:26;;45679:24;:54;;45671:92;;;;;-1:-1:-1;;;45671:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45858:20;45830:24;:48;;45822:106;;;;-1:-1:-1;;;45822:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45939:28;45970:52;45975:24;46001:20;45970:4;:52::i;:::-;45939:83;-1:-1:-1;46046:24:0;;46043:848;;46087:17;46107:21;46117:10;46107:9;:21::i;:::-;46087:41;;46146:12;46143:737;;;46227:20;46214:9;:33;46206:67;;;;;-1:-1:-1;;;46206:67:0;;;;;;;;;;;;-1:-1:-1;;;46206:67:0;;;;;;;;;;;;;;;46317:8;;:17;;;-1:-1:-1;;;46317:17:0;;;;46292:14;;-1:-1:-1;;;;;46317:8:0;;:15;;:17;;;;;;;;;;;;;;:8;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;46317:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46317:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46317:17:0;46354:48;;;-1:-1:-1;;;46354:48:0;;;;46317:17;;-1:-1:-1;;;;;;46354:18:0;;;;;46379:20;;46354:48;;;;;;;;;;;;;;46379:20;46354:18;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;46354:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46354:48:0;;;;;46143:737;;;;46541:14;;:27;;;-1:-1:-1;;;46541:27:0;;;;46521:17;;-1:-1:-1;;;;;46541:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;46541:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46541:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46541:27:0;;-1:-1:-1;46587:78:0;-1:-1:-1;;;;;46587:27:0;;46615:12;46637:4;46644:20;46587:78;:27;:78;:::i;:::-;46684:65;-1:-1:-1;;;;;46684:22:0;;46715:10;46728:20;46684:65;:22;:65;:::i;:::-;46792:10;-1:-1:-1;;;;;46776:40:0;;46817:20;46776:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46776:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46776:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46776:62:0;:67;46768:96;;;;;-1:-1:-1;;;46768:96:0;;;;;;;;;;;;-1:-1:-1;;;46768:96:0;;;;;;;;;;;;;;;46143:737;;46043:848;;46929:20;46911:14;;:38;;46903:86;;;;-1:-1:-1;;;46903:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47017:42;47022:14;;47038:20;47017:4;:42::i;:::-;47000:14;:59;47158:26;;47153:58;;47186:24;47153:4;:58::i;:::-;47124:26;:87;;;47324:8;;:22;;;-1:-1:-1;;;47324:22:0;;;;47284:24;;-1:-1:-1;;;;;47324:8:0;;;;:20;;:22;;;;;;;;;;;;;:8;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;47324:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47324:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47324:22:0;47389:159;;;-1:-1:-1;;;47389:159:0;;-1:-1:-1;;;;;47389:159:0;;;;;;;;;;;;;;;;;;;;;;47324:22;;-1:-1:-1;47359:8:0;;;;47389:41;;;;;;:159;;;;;;;;;;;;:41;:159;;;5:2:-1;;;;30:1;27;20:12;5:2;47389:159:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47389:159:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47389:159:0;;;;;;;;;-1:-1:-1;47389:159:0;-1:-1:-1;47567:8:0;;47559:54;;;;-1:-1:-1;;;47559:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47686:10;-1:-1:-1;;;;;47686:19:0;;47706:12;47720:11;47686:46;;;;;;;;;;;;;-1:-1:-1;;;;;47686:46:0;-1:-1:-1;;;;;47686:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47686:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47686:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47686:46:0;47678:78;;;;;-1:-1:-1;;;47678:78:0;;;;;;;;;;;;-1:-1:-1;;;47678:78:0;;;;;;;;;;;;;;;47776:11;44699:3096;-1:-1:-1;;;;;;;;;;44699:3096:0:o;60196:214::-;60275:7;60295:20;60318:6;-1:-1:-1;;;;;60318:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60318:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60318:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60318:28:0;;-1:-1:-1;60364:38:0;60375:12;60318:28;60364:10;:38::i;39082:99::-;39156:8;;:16;;;-1:-1:-1;;;39156:16:0;;;;39123:6;;-1:-1:-1;;;;;39156:8:0;;:14;;:16;;;;;;;;;;;;;;:8;:16;;;5:2:-1;;;;30:1;27;20:12;39189:186:0;39245:6;39287:5;39312:11;;;;39304:39;;;;;-1:-1:-1;;;39304:39:0;;;;;;;;;;;;-1:-1:-1;;;39304:39:0;;;;;;;;;;;;;;51061:218;51182:16;;;51196:1;51182:16;;;;;;;;;51135:7;;;;51155:24;;51182:16;;;;;;105:10:-1;51182:16:0;88:34:-1;136:17;;-1:-1;51182:16:0;51155:43;;51222:6;51209:7;51217:1;51209:10;;;;;;;;;;;;;:19;-1:-1:-1;;;;;51209:19:0;;;-1:-1:-1;;;;;51209:19:0;;;;;51246:22;51260:7;51246:13;:22::i;:::-;51269:1;51246:25;;;;;;;;;;;;;;51239:32;;;37993:25;38005:12;37993:11;:25::i;60448:298::-;59512:18;:16;:18::i;:::-;60501:5;60519:14;60544:8;;;;;;;;;-1:-1:-1;;;;;60544:8:0;-1:-1:-1;;;;;60544:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60544:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60544:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60544:17:0;60573:30;;;-1:-1:-1;;;60573:30:0;;;;60544:17;;-1:-1:-1;;;;;;60573:11:0;;;;;60591:9;;60573:30;;;;;;;;;;;;;;60591:9;60573:11;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;60573:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;60655:4:0;;-1:-1:-1;;;60655:4:0;;;;;-1:-1:-1;60650:88:0;;-1:-1:-1;;60650:88:0;60661:8;:6;:8::i;:::-;-1:-1:-1;;;;;60661:24:0;;60694:4;60709:6;60718:19;60727:9;60718:8;:19::i;:::-;60661:77;;;;;;;;;;;;;-1:-1:-1;;;;;60661:77:0;-1:-1:-1;;;;;60661:77:0;;;;;;-1:-1:-1;;;;;60661:77:0;-1:-1:-1;;;;;60661:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60661:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60661:77:0;;;;60650:88;37981:1;37993:25;38005:12;37993:11;:25::i;59558:121::-;59619:25;59633:10;59619:13;:25::i;:::-;59611:60;;;;;-1:-1:-1;;;59611:60:0;;;;;;;;;;;;-1:-1:-1;;;59611:60:0;;;;;;;;;;;;;;38763:177;38825:12;38822:111;;;38854:17;:15;:17::i;:::-;38822:111;;;38904:17;:15;:17::i;14375:116::-;14428:4;14452:31;14457:1;14460;14452:31;;;;;;;;;;;;;-1:-1:-1;;;14452:31:0;;;:4;:31::i;37778:145::-;37859:8;;;;;;;;;-1:-1:-1;;;;;37859:8:0;-1:-1:-1;;;;;37859:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37859:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37859:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37859:23:0;-1:-1:-1;;;;;37845:37:0;:10;:37;37837:78;;;;;-1:-1:-1;;;37837:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10122:353;10191:9;10202:10;;:::i;:::-;10226:14;10242:19;10265:27;10273:1;:10;;;10285:6;10265:7;:27::i;:::-;10225:67;;-1:-1:-1;10225:67:0;-1:-1:-1;10315:18:0;10307:4;:26;;;;;;;;;10303:92;;-1:-1:-1;10364:18:0;;;;;;;;;-1:-1:-1;10364:18:0;;10358:4;;-1:-1:-1;10364:18:0;-1:-1:-1;10350:33:0;;10303:92;10435:31;;;;;;;;;;;;10415:18;;-1:-1:-1;10435:31:0;-1:-1:-1;;10122:353:0;;;;;;:::o;17520:113::-;17573:4;17597:28;17602:1;17605;17597:28;;;;;;;;;;;;;-1:-1:-1;;;17597:28:0;;;:4;:28::i;18046:112::-;18105:4;9071;18129:10;18134:1;18137;18129:4;:10::i;:::-;:21;;;;;;;18046:112;-1:-1:-1;;;18046:112:0:o;15010:120::-;15063:4;15087:35;15092:1;15095;15087:35;;;;;;;;;;;;;-1:-1:-1;;;15087:35:0;;;:4;:35::i;54428:1259::-;54497:8;54507:14;54523;54550:24;54590:8;;;;;;;;;-1:-1:-1;;;;;54590:8:0;-1:-1:-1;;;;;54590:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54590:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54590:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54590:22:0;54727:46;;;-1:-1:-1;;;54727:46:0;;54767:4;54727:46;;;;;;54590:22;;-1:-1:-1;;;;;;54727:31:0;;;;;:46;;;;;;;;;;;;;;;:31;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;54727:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54727:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54727:46:0;;;;;;;;;;;;;-1:-1:-1;54727:46:0;;-1:-1:-1;54727:46:0;-1:-1:-1;54788:12:0;:10;:12::i;:::-;54784:79;;-1:-1:-1;54817:34:0;;54784:79;54881:8;;54873:45;;;;;-1:-1:-1;;;54873:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54987:14;;54947:55;;;-1:-1:-1;;;54947:55:0;;-1:-1:-1;;;;;54987:14:0;;;54947:55;;;;;;54931:13;;54947:39;;;;;:55;;;;;;;;;;;;;;:39;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;54947:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54947:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54947:55:0;55051:14;;54947:55;;-1:-1:-1;55013:24:0;;55040:33;;54947:55;55040:10;:33::i;:::-;55013:60;;55146:16;55133:9;:29;55130:49;;;-1:-1:-1;55171:1:0;;-1:-1:-1;55171:1:0;;-1:-1:-1;55171:1:0;;-1:-1:-1;55164:15:0;;-1:-1:-1;;55164:15:0;55130:49;55226:14;;:31;;;;;55256:1;55244:9;:13;55226:31;55223:457;;;55289:16;55277:9;:28;55274:231;;;55338:33;55343:9;55354:16;55338:4;:33::i;:::-;55326:45;;55274:231;;;55424:33;55429:16;55447:9;55424:4;:33::i;:::-;55412:45;;55488:1;55476:13;;55274:231;55223:457;;;55635:33;55640:9;55651:16;55635:4;:33::i;:::-;55623:45;;55223:457;54428:1259;;;;;;;;:::o;38948:126::-;39049:8;;:17;;;-1:-1:-1;;;39049:17:0;;;;39006:4;;-1:-1:-1;;;;;39049:8:0;;:15;;:17;;;;;;;;;;;;;;:8;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;39049:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39049:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39049:17:0;-1:-1:-1;;;;;39030:36:0;;;;;;;-1:-1:-1;38948:126:0;;;:::o;30289:176::-;30398:58;;;-1:-1:-1;;;;;30398:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;30398:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;30372:85:0;;30391:5;;30372:18;:85::i;37569:112::-;37642:6;:4;:6::i;:::-;-1:-1:-1;;;;;37628:20:0;:10;-1:-1:-1;;;;;37628:20:0;;37620:53;;;;;-1:-1:-1;;;37620:53:0;;;;;;;;;;;;-1:-1:-1;;;37620:53:0;;;;;;;;;;;;;;40607:94;40673:4;;-1:-1:-1;;;40673:4:0;;;;40671:6;40663:30;;;;;-1:-1:-1;;;40663:30:0;;;;;;;;;;;;-1:-1:-1;;;40663:30:0;;;;;;;;;;;;;;30473:204;30600:68;;;-1:-1:-1;;;;;30600:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;30600:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;30574:95:0;;30593:5;;30574:18;:95::i;30685:621::-;31055:10;;;31054:62;;-1:-1:-1;31071:39:0;;;-1:-1:-1;;;31071:39:0;;31095:4;31071:39;;;;-1:-1:-1;;;;;31071:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;31071:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31071:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31071:39:0;:44;31054:62;31046:152;;;;-1:-1:-1;;;31046:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31235:62;;;-1:-1:-1;;;;;31235:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;31235:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;31209:89:0;;31228:5;;31209:18;:89::i;61266:440::-;61361:7;59512:18;:16;:18::i;:::-;61345:5;61381:17;61401:6;-1:-1:-1;;;;;61401:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61401:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61401:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61401:19:0;;-1:-1:-1;61431:51:0;-1:-1:-1;;;;;61431:22:0;;61462:6;61471:10;61431:51;:22;:51;:::i;:::-;61493:11;61507:6;-1:-1:-1;;;;;61507:11:0;;61519:10;61507:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61507:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61507:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61507:23:0;;-1:-1:-1;61549:11:0;;61541:33;;;;;-1:-1:-1;;;61541:33:0;;;;;;;;;;;;-1:-1:-1;;;61541:33:0;;;;;;;;;;;;;;;61590:4;;-1:-1:-1;;;61590:4:0;;;;61585:89;;61596:8;:6;:8::i;:::-;-1:-1:-1;;;;;61596:24:0;;61629:4;61644:6;61653:20;61662:10;61653:8;:20::i;:::-;61596:78;;;;;;;;;;;;;-1:-1:-1;;;;;61596:78:0;-1:-1:-1;;;;;61596:78:0;;;;;;-1:-1:-1;;;;;61596:78:0;-1:-1:-1;;;;;61596:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61596:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61596:78:0;;;;61692:6;-1:-1:-1;;37993:25:0;38005:12;37993:11;:25::i;44134:557::-;44216:28;44277:1;44260:14;;:18;:46;;;;-1:-1:-1;44292:14:0;;-1:-1:-1;;;;;44282:24:0;;;44292:14;;44282:24;44260:46;44257:427;;;44371:23;44412:14;;44397:11;:29;;:60;;44446:11;44397:60;;;44429:14;;44397:60;44371:86;;44472:61;44479:14;;44495:37;44500:14;;44516:15;44495:4;:37::i;:::-;44472:6;:61::i;:::-;44571:34;44576:11;44589:15;44571:4;:34::i;:::-;44548:57;;44257:427;;;42851:1114;42959:12;:10;:12::i;:::-;42955:25;;42973:7;;42955:25;43070:6;43052:14;;:24;;43044:59;;;;;-1:-1:-1;;;43044:59:0;;;;;;;;;;;;-1:-1:-1;;;43044:59:0;;;;;;;;;;;;;;;43131:28;43136:14;;43152:6;43131:4;:28::i;:::-;43114:14;:45;;;43174:19;43173:57;;;;;43228:1;43199:26;;:30;43173:57;43170:92;;;43261:1;43232:26;:30;43170:92;43338:18;;43335:103;;43380:14;;:37;;;-1:-1:-1;;;43380:37:0;;;;;;;;;;-1:-1:-1;;;;;43380:14:0;;;;:21;;:37;;;;;;;;;;;;;;;:14;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;43380:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43380:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43380:37:0;:42;43372:66;;;;;-1:-1:-1;;;43372:66:0;;;;;;;;;;;;-1:-1:-1;;;43372:66:0;;;;;;;;;;;;;;;43481:8;;;;;;;;;-1:-1:-1;;;;;43481:8:0;-1:-1:-1;;;;;43481:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43481:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43481:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43481:17:0;43462:14;;-1:-1:-1;;;;;43462:14:0;;;43454:44;;;43451:507;;;43641:12;43656:6;:4;:6::i;:::-;-1:-1:-1;;;;;43656:11:0;:19;43668:6;43656:19;;;;;;;;;;;;;;;;;;-1:-1:-1;43451:507:0;;-1:-1:-1;;;;;43451:507:0;;43865:14;;:27;;;-1:-1:-1;;;43865:27:0;;;;43845:17;;-1:-1:-1;;;;;43865:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;43865:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43865:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43865:27:0;;-1:-1:-1;43907:39:0;43931:6;:4;:6::i;:::-;-1:-1:-1;;;;;43907:23:0;;;43939:6;43907:39;:23;:39;:::i;38034:172::-;38106:8;;-1:-1:-1;;;;;38106:8:0;:26;38098:58;;;;;-1:-1:-1;;;38098:58:0;;;;;;;;;;;;-1:-1:-1;;;38098:58:0;;;;;;;;;;;;;;;38167:8;:31;;-1:-1:-1;;;;;;38167:31:0;-1:-1:-1;;;;;38167:31:0;;;;;;;;;;38034:172::o;51635:404::-;51720:16;51704:5;51749:24;51789:8;;;;;;;;;-1:-1:-1;;;;;51789:8:0;-1:-1:-1;;;;;51789:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51789:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51789:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51789:22:0;51849:33;;-1:-1:-1;;;51849:33:0;;51789:22;51849:33;;;;;;;;;;;;;;51789:22;;-1:-1:-1;51823:23:0;;-1:-1:-1;;;;;51849:24:0;;;;;51874:7;;51849:33;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51849:33:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51849:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51849:33:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;51849:33:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;51849:33:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;51849:33:0;;421:4:-1;412:14;;;;51849:33:0;;;;;412:14:-1;51849:33:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51849:33:0;;;;;;;;;;;51823:59;;51897:9;51909:1;51897:13;;51893:115;51916:6;:13;51912:1;:17;51893:115;;;51959:6;51966:1;51959:9;;;;;;;;;;;;;;51972:1;51959:14;51951:45;;;;;-1:-1:-1;;;51951:45:0;;;;;;;;;;;;-1:-1:-1;;;51951:45:0;;;;;;;;;;;;;;;51931:3;;51893:115;;;-1:-1:-1;52025:6:0;-1:-1:-1;;37993:25:0;38005:12;37993:11;:25::i;37348:140::-;37428:8;;:31;;;-1:-1:-1;;;37428:31:0;;37453:4;37428:31;;;;;;-1:-1:-1;;;;;37428:8:0;;;;:16;;:31;;;;;;;;;;;;;;;:8;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;37428:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37428:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37428:31:0;-1:-1:-1;;;;;37414:45:0;:10;:45;37406:74;;;;;-1:-1:-1;;;37406:74:0;;;;;;;;;;;;-1:-1:-1;;;37406:74:0;;;;;;;;;;;;;;38327:214;38420:10;:8;:10::i;:::-;38412:35;;;;;-1:-1:-1;;;38412:35:0;;;;;;;;;;;;-1:-1:-1;;;38412:35:0;;;;;;;;;;;;;;;38532:1;38503:26;:30;38327:214::o;52389:119::-;52449:51;52490:6;52498:1;52457:6;-1:-1:-1;;;;;52449:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52449:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52449:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52449:28:0;-1:-1:-1;;;;;52449:40:0;;:51;;:40;:51;:::i;59687:201::-;59749:4;59766:26;59809:8;;;;;;;;;-1:-1:-1;;;;;59809:8:0;-1:-1:-1;;;;;59809:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59809:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59809:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59809:23:0;59851:29;;;-1:-1:-1;;;59851:29:0;;-1:-1:-1;;;;;59851:29:0;;;;;;;;;59809:23;;-1:-1:-1;59851:21:0;;;;;;:29;;;;;59809:23;;59851:29;;;;;;;;:21;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;59851:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59851:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59851:29:0;;59687:201;-1:-1:-1;;;59687:201:0:o;38630:125::-;38679:23;:21;:23::i;:::-;38676:72;;;38719:17;:15;:17::i;14499:179::-;14580:4;14606:5;;;14638:12;14630:6;;;;14622:29;;;;-1:-1:-1;;;14622:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6876:343:0;6932:9;;6964:6;6960:69;;-1:-1:-1;6995:18:0;;-1:-1:-1;6995:18:0;6987:30;;6960:69;7050:5;;;7054:1;7050;:5;:1;7072:5;;;;;:10;7068:144;;-1:-1:-1;7107:26:0;;-1:-1:-1;7135:1:0;;-1:-1:-1;7099:38:0;;7068:144;7178:18;;-1:-1:-1;7198:1:0;-1:-1:-1;7170:30:0;;17641:157;17722:4;17754:12;17747:5;17739:28;;;;-1:-1:-1;;;17739:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;17739:28:0;;17789:1;17785;:5;;;;;;;17641:157;-1:-1:-1;;;;17641:157:0:o;16208:122::-;16261:4;16285:37;16290:1;16293;16285:37;;;;;;;;;;;;;;;;;:4;:37::i;15138:158::-;15219:4;15252:12;15244:6;;;;15236:29;;;;-1:-1:-1;;;15236:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;15236:29:0;-1:-1:-1;;;15283:5:0;;;15138:158::o;32328:1114::-;32932:27;32940:5;-1:-1:-1;;;;;32932:25:0;;:27::i;:::-;32924:71;;;;;-1:-1:-1;;;32924:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33069:12;33083:23;33118:5;-1:-1:-1;;;;;33110:19:0;33130:4;33110:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33110:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33068:67:0;;;;33154:7;33146:52;;;;;-1:-1:-1;;;33146:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33215:17;;:21;33211:224;;33357:10;33346:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33346:30:0;33338:85;;;;-1:-1:-1;;;33338:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16338:250;16419:4;16440:6;;;:16;;-1:-1:-1;16450:6:0;;16440:16;16436:57;;;-1:-1:-1;16480:1:0;16473:8;;16436:57;16512:5;;;16516:1;16512;:5;:1;16536:5;;;;;:10;16548:12;16528:33;;;;;-1:-1:-1;;;16528:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27318:619:0;27378:4;27846:20;;27689:66;27886:23;;;;;;:42;;-1:-1:-1;27913:15:0;;;27886:42;27878:51;27318:619;-1:-1:-1;;;;27318:619:0:o;68765:1821::-;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://74dc8f31228156573484e1529bb7e375a9e2745114b8f857592f7a7bb451fb3a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.