Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x5fe6c5ef3e497872bb4a3ddd78f6ec217aa44c6c460e6879f1d3319206f0a326 | Set Fee To | 229516 | 514 days 13 hrs ago | 0x32464be3d71ed9105c142fb6bdee98a0c649cdd3 | IN | 0xa010ee0226cd071bebd8919a1f675cae1f1f5d3e | 0 ETH | 0.001026310969 ETH | |
0x7cfe9056d9982b005b8214e2dd3b4d4142c7e8f7a9301a90d913af8e49a3e59a | Set Swapper | 229505 | 514 days 14 hrs ago | 0x32464be3d71ed9105c142fb6bdee98a0c649cdd3 | IN | 0xa010ee0226cd071bebd8919a1f675cae1f1f5d3e | 0 ETH | 0.001057232758 ETH | |
0xfbcc411b508a4974dcbb91e45d166b7cc7816239089e8ff57ed36f4813854171 | 0x61010060 | 229441 | 514 days 14 hrs ago | 0x32464be3d71ed9105c142fb6bdee98a0c649cdd3 | IN | Create: KashiPairMediumRiskV1 | 0 ETH | 0.231666768185 ETH |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
KashiPairMediumRiskV1
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2022-09-01 */ /** *Submitted for verification at Etherscan.io on 2021-03-27 */ // SPDX-License-Identifier: UNLICENSED // Kashi Lending Medium Risk // __ __ __ __ _____ __ __ // | |/ .---.-.-----| |--|__| | |_.-----.-----.--| |__.-----.-----. // | <| _ |__ --| | | | | -__| | _ | | | _ | // |__|\__|___._|_____|__|__|__| |_______|_____|__|__|_____|__|__|__|___ | // |_____| // Copyright (c) 2021 BoringCrypto - All rights reserved // Twitter: @Boring_Crypto // Special thanks to: // @0xKeno - for all his invaluable contributions // @burger_crypto - for the idea of trying to let the LPs benefit from liquidations // Version: 22-Feb-2021 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // solhint-disable avoid-low-level-calls // solhint-disable no-inline-assembly // solhint-disable not-rely-on-time // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // License-Identifier: MIT /// @notice A library for performing overflow-/underflow-safe math, /// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math). library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) { require((c = a + b) >= b, "BoringMath: Add Overflow"); } function sub(uint256 a, uint256 b) internal pure returns (uint256 c) { require((c = a - b) <= a, "BoringMath: Underflow"); } function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow"); } function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } /// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128. library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) { require((c = a + b) >= b, "BoringMath: Add Overflow"); } function sub(uint128 a, uint128 b) internal pure returns (uint128 c) { require((c = a - b) <= a, "BoringMath: Underflow"); } } // File @boringcrypto/boring-solidity/contracts/[email protected] // License-Identifier: MIT // Audit on 5-Jan-2021 by Keno and BoringCrypto // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto contract BoringOwnableData { address public owner; address public pendingOwner; } contract BoringOwnable is BoringOwnableData { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @notice `owner` defaults to msg.sender on construction. constructor() public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. /// Can only be invoked by the current `owner`. /// @param newOwner Address of the new owner. /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`. /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise. function transferOwnership( address newOwner, bool direct, bool renounce ) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } /// @notice Needs to be called by `pendingOwner` to claim ownership. function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } /// @notice Only allows the `owner` to execute the function. modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } } // File @boringcrypto/boring-solidity/contracts/[email protected] // License-Identifier: MIT // Based on code and smartness by Ross Campbell and Keno // Uses immutable to store the domain separator to reduce gas usage // If the chain id changes due to a fork, the forked chain will calculate on the fly. contract Domain { bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(uint256 chainId,address verifyingContract)"); // See https://eips.ethereum.org/EIPS/eip-191 string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01"; // solhint-disable var-name-mixedcase bytes32 private immutable _DOMAIN_SEPARATOR; uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID; /// @dev Calculate the DOMAIN_SEPARATOR function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) { return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this))); } constructor() public { uint256 chainId; assembly { chainId := chainid() } _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId); } /// @dev Return the DOMAIN_SEPARATOR // It's named internal to allow making it public from the contract that uses it by creating a simple view function // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator. // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId); } function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) { digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash)); } } // File @boringcrypto/boring-solidity/contracts/[email protected] // License-Identifier: MIT // solhint-disable no-inline-assembly // solhint-disable not-rely-on-time // Data part taken out for building of contracts that receive delegate calls contract ERC20Data { /// @notice owner > balance mapping. mapping(address => uint256) public balanceOf; /// @notice owner > spender > allowance mapping. mapping(address => mapping(address => uint256)) public allowance; /// @notice owner > nonce mapping. Used in `permit`. mapping(address => uint256) public nonces; } contract ERC20 is ERC20Data, Domain { event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); /// @notice Transfers `amount` tokens from `msg.sender` to `to`. /// @param to The address to move the tokens. /// @param amount of the tokens to move. /// @return (bool) Returns True if succeeded. function transfer(address to, uint256 amount) public returns (bool) { // If `amount` is 0, or `msg.sender` is `to` nothing happens if (amount != 0) { uint256 srcBalance = balanceOf[msg.sender]; require(srcBalance >= amount, "ERC20: balance too low"); if (msg.sender != to) { require(to != address(0), "ERC20: no zero address"); // Moved down so low balance calls safe some gas balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1 } } emit Transfer(msg.sender, to, amount); return true; } /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`. /// @param from Address to draw tokens from. /// @param to The address to move the tokens. /// @param amount The token amount to move. /// @return (bool) Returns True if succeeded. function transferFrom( address from, address to, uint256 amount ) public returns (bool) { // If `amount` is 0, or `from` is `to` nothing happens if (amount != 0) { uint256 srcBalance = balanceOf[from]; require(srcBalance >= amount, "ERC20: balance too low"); if (from != to) { uint256 spenderAllowance = allowance[from][msg.sender]; // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20). if (spenderAllowance != type(uint256).max) { require(spenderAllowance >= amount, "ERC20: allowance too low"); allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked } require(to != address(0), "ERC20: no zero address"); // Moved down so other failed calls safe some gas balanceOf[from] = srcBalance - amount; // Underflow is checked balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1 } } emit Transfer(from, to, amount); return true; } /// @notice Approves `amount` from sender to be spend by `spender`. /// @param spender Address of the party that can draw from msg.sender's account. /// @param amount The maximum collective amount that `spender` can draw. /// @return (bool) Returns True if approved. function approve(address spender, uint256 amount) public returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; /// @notice Approves `value` from `owner_` to be spend by `spender`. /// @param owner_ Address of the owner. /// @param spender The address of the spender that gets approved to draw from `owner_`. /// @param value The maximum collective amount that `spender` can draw. /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds). function permit( address owner_, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(owner_ != address(0), "ERC20: Owner cannot be 0"); require(block.timestamp < deadline, "ERC20: Expired"); require( ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) == owner_, "ERC20: Invalid Signature" ); allowance[owner_][spender] = value; emit Approval(owner_, spender, value); } } // File @boringcrypto/boring-solidity/contracts/interfaces/[email protected] // License-Identifier: MIT interface IMasterContract { /// @notice Init function that gets called from `BoringFactory.deploy`. /// Also kown as the constructor for cloned contracts. /// Any ETH send to `BoringFactory.deploy` ends up here. /// @param data Can be abi encoded arguments or anything else. function init(bytes calldata data) external payable; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // License-Identifier: MIT struct Rebase { uint128 elastic; uint128 base; } /// @notice A rebasing library using overflow-/underflow-safe math. library RebaseLibrary { using BoringMath for uint256; using BoringMath128 for uint128; /// @notice Calculates the base value in relationship to `elastic` and `total`. function toBase( Rebase memory total, uint256 elastic, bool roundUp ) internal pure returns (uint256 base) { if (total.elastic == 0) { base = elastic; } else { base = elastic.mul(total.base) / total.elastic; if (roundUp && base.mul(total.elastic) / total.base < elastic) { base = base.add(1); } } } /// @notice Calculates the elastic value in relationship to `base` and `total`. function toElastic( Rebase memory total, uint256 base, bool roundUp ) internal pure returns (uint256 elastic) { if (total.base == 0) { elastic = base; } else { elastic = base.mul(total.elastic) / total.base; if (roundUp && elastic.mul(total.base) / total.elastic < base) { elastic = elastic.add(1); } } } /// @notice Add `elastic` to `total` and doubles `total.base`. /// @return (Rebase) The new total. /// @return base in relationship to `elastic`. function add( Rebase memory total, uint256 elastic, bool roundUp ) internal pure returns (Rebase memory, uint256 base) { base = toBase(total, elastic, roundUp); total.elastic = total.elastic.add(elastic.to128()); total.base = total.base.add(base.to128()); return (total, base); } /// @notice Sub `base` from `total` and update `total.elastic`. /// @return (Rebase) The new total. /// @return elastic in relationship to `base`. function sub( Rebase memory total, uint256 base, bool roundUp ) internal pure returns (Rebase memory, uint256 elastic) { elastic = toElastic(total, base, roundUp); total.elastic = total.elastic.sub(elastic.to128()); total.base = total.base.sub(base.to128()); return (total, elastic); } /// @notice Add `elastic` and `base` to `total`. function add( Rebase memory total, uint256 elastic, uint256 base ) internal pure returns (Rebase memory) { total.elastic = total.elastic.add(elastic.to128()); total.base = total.base.add(base.to128()); return total; } /// @notice Subtract `elastic` and `base` to `total`. function sub( Rebase memory total, uint256 elastic, uint256 base ) internal pure returns (Rebase memory) { total.elastic = total.elastic.sub(elastic.to128()); total.base = total.base.sub(base.to128()); return total; } } // File @boringcrypto/boring-solidity/contracts/interfaces/[email protected] // License-Identifier: MIT interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice EIP 2612 function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // License-Identifier: MIT library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL)); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME)); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IBatchFlashBorrower { function onBatchFlashLoan( address sender, IERC20[] calldata tokens, uint256[] calldata amounts, uint256[] calldata fees, bytes calldata data ) external; } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IFlashBorrower { function onFlashLoan( address sender, IERC20 token, uint256 amount, uint256 fee, bytes calldata data ) external; } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IStrategy { // Send the assets to the Strategy and call skim to invest them function skim(uint256 amount) external; // Harvest any profits made converted to the asset and pass them to the caller function harvest(uint256 balance, address sender) external returns (int256 amountAdded); // Withdraw assets. The returned amount can differ from the requested amount due to rounding. // The actualAmount should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for. function withdraw(uint256 amount) external returns (uint256 actualAmount); // Withdraw all assets in the safest way possible. This shouldn't fail. function exit(uint256 balance) external returns (int256 amountAdded); } // File @sushiswap/bentobox-sdk/contracts/[email protected] // License-Identifier: MIT interface IBentoBoxV1 { event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress); event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share); event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver); event LogRegisterProtocol(address indexed protocol); event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved); event LogStrategyDivest(address indexed token, uint256 amount); event LogStrategyInvest(address indexed token, uint256 amount); event LogStrategyLoss(address indexed token, uint256 amount); event LogStrategyProfit(address indexed token, uint256 amount); event LogStrategyQueued(address indexed token, address indexed strategy); event LogStrategySet(address indexed token, address indexed strategy); event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage); event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share); event LogWhiteListMasterContract(address indexed masterContract, bool approved); event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function balanceOf(IERC20, address) external view returns (uint256); function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results); function batchFlashLoan( IBatchFlashBorrower borrower, address[] calldata receivers, IERC20[] calldata tokens, uint256[] calldata amounts, bytes calldata data ) external; function claimOwnership() external; function deploy( address masterContract, bytes calldata data, bool useCreate2 ) external payable; function deposit( IERC20 token_, address from, address to, uint256 amount, uint256 share ) external payable returns (uint256 amountOut, uint256 shareOut); function flashLoan( IFlashBorrower borrower, address receiver, IERC20 token, uint256 amount, bytes calldata data ) external; function harvest( IERC20 token, bool balance, uint256 maxChangeAmount ) external; function masterContractApproved(address, address) external view returns (bool); function masterContractOf(address) external view returns (address); function nonces(address) external view returns (uint256); function owner() external view returns (address); function pendingOwner() external view returns (address); function pendingStrategy(IERC20) external view returns (IStrategy); function permitToken( IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function registerProtocol() external; function setMasterContractApproval( address user, address masterContract, bool approved, uint8 v, bytes32 r, bytes32 s ) external; function setStrategy(IERC20 token, IStrategy newStrategy) external; function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external; function strategy(IERC20) external view returns (IStrategy); function strategyData(IERC20) external view returns ( uint64 strategyStartDate, uint64 targetPercentage, uint128 balance ); function toAmount( IERC20 token, uint256 share, bool roundUp ) external view returns (uint256 amount); function toShare( IERC20 token, uint256 amount, bool roundUp ) external view returns (uint256 share); function totals(IERC20) external view returns (Rebase memory totals_); function transfer( IERC20 token, address from, address to, uint256 share ) external; function transferMultiple( IERC20 token, address from, address[] calldata tos, uint256[] calldata shares ) external; function transferOwnership( address newOwner, bool direct, bool renounce ) external; function whitelistMasterContract(address masterContract, bool approved) external; function whitelistedMasterContracts(address) external view returns (bool); function withdraw( IERC20 token_, address from, address to, uint256 amount, uint256 share ) external returns (uint256 amountOut, uint256 shareOut); } // File contracts/interfaces/IOracle.sol // License-Identifier: MIT interface IOracle { /// @notice Get the latest exchange rate. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return success if no valid (recent) rate is available, return false else true. /// @return rate The rate of the requested asset / pair / pool. function get(bytes calldata data) external returns (bool success, uint256 rate); /// @notice Check the last exchange rate without any state changes. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return success if no valid (recent) rate is available, return false else true. /// @return rate The rate of the requested asset / pair / pool. function peek(bytes calldata data) external view returns (bool success, uint256 rate); /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek(). /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return rate The rate of the requested asset / pair / pool. function peekSpot(bytes calldata data) external view returns (uint256 rate); /// @notice Returns a human readable (short) name about this oracle. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return (string) A human readable symbol name about this oracle. function symbol(bytes calldata data) external view returns (string memory); /// @notice Returns a human readable name about this oracle. /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. /// For example: /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256)); /// @return (string) A human readable name about this oracle. function name(bytes calldata data) external view returns (string memory); } // File contracts/interfaces/ISwapper.sol // License-Identifier: MIT interface ISwapper { /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. /// Swaps it for at least 'amountToMin' of token 'to'. /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. /// Returns the amount of tokens 'to' transferred to BentoBox. /// (The BentoBox skim function will be used by the caller to get the swapped funds). function swap( IERC20 fromToken, IERC20 toToken, address recipient, uint256 shareToMin, uint256 shareFrom ) external returns (uint256 extraShare, uint256 shareReturned); /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom), /// this should be less than or equal to amountFromMax. /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. /// Swaps it for exactly 'exactAmountTo' of token 'to'. /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom). /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom). /// (The BentoBox skim function will be used by the caller to get the swapped funds). function swapExact( IERC20 fromToken, IERC20 toToken, address recipient, address refundTo, uint256 shareFromSupplied, uint256 shareToExact ) external returns (uint256 shareUsed, uint256 shareReturned); } // File contracts/KashiPair.sol // License-Identifier: UNLICENSED // Kashi Lending Medium Risk /// @title KashiPair /// @dev This contract allows contract calls to any contract (except BentoBox) /// from arbitrary callers thus, don't trust calls from this contract in any circumstances. contract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract { using BoringMath for uint256; using BoringMath128 for uint128; using RebaseLibrary for Rebase; using BoringERC20 for IERC20; event LogExchangeRate(uint256 rate); event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization); event LogAddCollateral(address indexed from, address indexed to, uint256 share); event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction); event LogRemoveCollateral(address indexed from, address indexed to, uint256 share); event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction); event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part); event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part); event LogFeeTo(address indexed newFeeTo); event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction); // Immutables (for MasterContract and all clones) IBentoBoxV1 public immutable bentoBox; KashiPairMediumRiskV1 public immutable masterContract; // MasterContract variables address public feeTo; mapping(ISwapper => bool) public swappers; // Per clone variables // Clone init settings IERC20 public collateral; IERC20 public asset; IOracle public oracle; bytes public oracleData; // Total amounts uint256 public totalCollateralShare; // Total collateral supplied Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers // User balances mapping(address => uint256) public userCollateralShare; // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol) mapping(address => uint256) public userBorrowPart; /// @notice Exchange and interest rate tracking. /// This is 'cached' here because calls to Oracles can be very expensive. uint256 public exchangeRate; struct AccrueInfo { uint64 interestPerSecond; uint64 lastAccrued; uint128 feesEarnedFraction; } AccrueInfo public accrueInfo; // ERC20 'variables' function symbol() external view returns (string memory) { return string(abi.encodePacked("km", collateral.safeSymbol(), "/", asset.safeSymbol(), "-", oracle.symbol(oracleData))); } function name() external view returns (string memory) { return string(abi.encodePacked("Kashi Medium Risk ", collateral.safeName(), "/", asset.safeName(), "-", oracle.name(oracleData))); } function decimals() external view returns (uint8) { return asset.safeDecimals(); } // totalSupply for ERC20 compatibility function totalSupply() public view returns (uint256) { return totalAsset.base; } // Settings for the Medium Risk KashiPair uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75% uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77% uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math) uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70% uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80% uint256 private constant UTILIZATION_PRECISION = 1e18; uint256 private constant FULL_UTILIZATION = 1e18; uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION; uint256 private constant FACTOR_PRECISION = 1e18; uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear uint256 private constant EXCHANGE_RATE_PRECISION = 1e18; uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12% uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5; // Fees uint256 private constant PROTOCOL_FEE = 10000; // 10% uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5; uint256 private constant BORROW_OPENING_FEE = 50; // 0.05% uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5; /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`. constructor(IBentoBoxV1 bentoBox_) public { bentoBox = bentoBox_; masterContract = this; } /// @notice Serves as the constructor for clones, as clones can't have a regular constructor /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData) function init(bytes calldata data) public payable override { require(address(collateral) == address(0), "KashiPair: already initialized"); (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes)); require(address(collateral) != address(0), "KashiPair: bad pair"); accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100% } /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees. function accrue() public { AccrueInfo memory _accrueInfo = accrueInfo; // Number of seconds since accrue was called uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued; if (elapsedTime == 0) { return; } _accrueInfo.lastAccrued = uint64(block.timestamp); Rebase memory _totalBorrow = totalBorrow; if (_totalBorrow.base == 0) { // If there are no borrows, reset the interest rate if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) { _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND; emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0); } accrueInfo = _accrueInfo; return; } uint256 extraAmount = 0; uint256 feeFraction = 0; Rebase memory _totalAsset = totalAsset; // Accrue interest extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18; _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128()); uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic); uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount; _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128()); totalAsset.base = _totalAsset.base.add(feeFraction.to128()); totalBorrow = _totalBorrow; // Update interest rate uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount; if (utilization < MINIMUM_TARGET_UTILIZATION) { uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION; uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime)); _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale); if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) { _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum } } else if (utilization > MAXIMUM_TARGET_UTILIZATION) { uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX; uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime)); uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY; if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) { newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum } _accrueInfo.interestPerSecond = uint64(newInterestPerSecond); } emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization); accrueInfo = _accrueInfo; } /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`. /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls. function _isSolvent( address user, bool open, uint256 _exchangeRate ) internal view returns (bool) { // accrue must have already been called! uint256 borrowPart = userBorrowPart[user]; if (borrowPart == 0) return true; uint256 collateralShare = userCollateralShare[user]; if (collateralShare == 0) return false; Rebase memory _totalBorrow = totalBorrow; return bentoBox.toAmount( collateral, collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul( open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE ), false ) >= // Moved exchangeRate here instead of dividing the other side to preserve more precision borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base; } /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body. modifier solvent() { _; require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent"); } /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset. /// This function is supposed to be invoked if needed because Oracle queries can be expensive. /// @return updated True if `exchangeRate` was updated. /// @return rate The new exchange rate. function updateExchangeRate() public returns (bool updated, uint256 rate) { (updated, rate) = oracle.get(oracleData); if (updated) { exchangeRate = rate; emit LogExchangeRate(rate); } else { // Return the old rate if fetching wasn't successful rate = exchangeRate; } } /// @dev Helper function to move tokens. /// @param token The ERC-20 token. /// @param share The amount in shares to add. /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True. /// Only used for accounting checks. /// @param skim If True, only does a balance check on this contract. /// False if tokens from msg.sender in `bentoBox` should be transferred. function _addTokens( IERC20 token, uint256 share, uint256 total, bool skim ) internal { if (skim) { require(share <= bentoBox.balanceOf(token, address(this)).sub(total), "KashiPair: Skim too much"); } else { bentoBox.transfer(token, msg.sender, address(this), share); } } /// @notice Adds `collateral` from msg.sender to the account `to`. /// @param to The receiver of the tokens. /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender. /// False if tokens from msg.sender in `bentoBox` should be transferred. /// @param share The amount of shares to add for `to`. function addCollateral( address to, bool skim, uint256 share ) public { userCollateralShare[to] = userCollateralShare[to].add(share); uint256 oldTotalCollateralShare = totalCollateralShare; totalCollateralShare = oldTotalCollateralShare.add(share); _addTokens(collateral, share, oldTotalCollateralShare, skim); emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share); } /// @dev Concrete implementation of `removeCollateral`. function _removeCollateral(address to, uint256 share) internal { userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share); totalCollateralShare = totalCollateralShare.sub(share); emit LogRemoveCollateral(msg.sender, to, share); bentoBox.transfer(collateral, address(this), to, share); } /// @notice Removes `share` amount of collateral and transfers it to `to`. /// @param to The receiver of the shares. /// @param share Amount of shares to remove. function removeCollateral(address to, uint256 share) public solvent { // accrue must be called because we check solvency accrue(); _removeCollateral(to, share); } /// @dev Concrete implementation of `addAsset`. function _addAsset( address to, bool skim, uint256 share ) internal returns (uint256 fraction) { Rebase memory _totalAsset = totalAsset; uint256 totalAssetShare = _totalAsset.elastic; uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true); fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare; if (_totalAsset.base.add(fraction.to128()) < 1000) { return 0; } totalAsset = _totalAsset.add(share, fraction); balanceOf[to] = balanceOf[to].add(fraction); emit Transfer(address(0), to, fraction); _addTokens(asset, share, totalAssetShare, skim); emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction); } /// @notice Adds assets to the lending pair. /// @param to The address of the user to receive the assets. /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender. /// False if tokens from msg.sender in `bentoBox` should be transferred. /// @param share The amount of shares to add. /// @return fraction Total fractions added. function addAsset( address to, bool skim, uint256 share ) public returns (uint256 fraction) { accrue(); fraction = _addAsset(to, skim, share); } /// @dev Concrete implementation of `removeAsset`. function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) { Rebase memory _totalAsset = totalAsset; uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true); share = fraction.mul(allShare) / _totalAsset.base; balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction); emit Transfer(msg.sender, address(0), fraction); _totalAsset.elastic = _totalAsset.elastic.sub(share.to128()); _totalAsset.base = _totalAsset.base.sub(fraction.to128()); require(_totalAsset.base >= 1000, "Kashi: below minimum"); totalAsset = _totalAsset; emit LogRemoveAsset(msg.sender, to, share, fraction); bentoBox.transfer(asset, address(this), to, share); } /// @notice Removes an asset from msg.sender and transfers it to `to`. /// @param to The user that receives the removed assets. /// @param fraction The amount/fraction of assets held to remove. /// @return share The amount of shares transferred to `to`. function removeAsset(address to, uint256 fraction) public returns (uint256 share) { accrue(); share = _removeAsset(to, fraction); } /// @dev Concrete implementation of `borrow`. function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) { uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true); userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part); emit LogBorrow(msg.sender, to, amount, feeAmount, part); share = bentoBox.toShare(asset, amount, false); Rebase memory _totalAsset = totalAsset; require(_totalAsset.base >= 1000, "Kashi: below minimum"); _totalAsset.elastic = _totalAsset.elastic.sub(share.to128()); totalAsset = _totalAsset; bentoBox.transfer(asset, address(this), to, share); } /// @notice Sender borrows `amount` and transfers it to `to`. /// @return part Total part of the debt held by borrowers. /// @return share Total amount in shares borrowed. function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) { accrue(); (part, share) = _borrow(to, amount); } /// @dev Concrete implementation of `repay`. function _repay( address to, bool skim, uint256 part ) internal returns (uint256 amount) { (totalBorrow, amount) = totalBorrow.sub(part, true); userBorrowPart[to] = userBorrowPart[to].sub(part); uint256 share = bentoBox.toShare(asset, amount, true); uint128 totalShare = totalAsset.elastic; _addTokens(asset, share, uint256(totalShare), skim); totalAsset.elastic = totalShare.add(share.to128()); emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part); } /// @notice Repays a loan. /// @param to Address of the user this payment should go. /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender. /// False if tokens from msg.sender in `bentoBox` should be transferred. /// @param part The amount to repay. See `userBorrowPart`. /// @return amount The total amount repayed. function repay( address to, bool skim, uint256 part ) public returns (uint256 amount) { accrue(); amount = _repay(to, skim, part); } // Functions that need accrue to be called uint8 internal constant ACTION_ADD_ASSET = 1; uint8 internal constant ACTION_REPAY = 2; uint8 internal constant ACTION_REMOVE_ASSET = 3; uint8 internal constant ACTION_REMOVE_COLLATERAL = 4; uint8 internal constant ACTION_BORROW = 5; uint8 internal constant ACTION_GET_REPAY_SHARE = 6; uint8 internal constant ACTION_GET_REPAY_PART = 7; uint8 internal constant ACTION_ACCRUE = 8; // Functions that don't need accrue to be called uint8 internal constant ACTION_ADD_COLLATERAL = 10; uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11; // Function on BentoBox uint8 internal constant ACTION_BENTO_DEPOSIT = 20; uint8 internal constant ACTION_BENTO_WITHDRAW = 21; uint8 internal constant ACTION_BENTO_TRANSFER = 22; uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23; uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24; // Any external call (except to BentoBox) uint8 internal constant ACTION_CALL = 30; int256 internal constant USE_VALUE1 = -1; int256 internal constant USE_VALUE2 = -2; /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`. function _num( int256 inNum, uint256 value1, uint256 value2 ) internal pure returns (uint256 outNum) { outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2); } /// @dev Helper function for depositing into `bentoBox`. function _bentoDeposit( bytes memory data, uint256 value, uint256 value1, uint256 value2 ) internal returns (uint256, uint256) { (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256)); amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors share = int256(_num(share, value1, value2)); return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share)); } /// @dev Helper function to withdraw from the `bentoBox`. function _bentoWithdraw( bytes memory data, uint256 value1, uint256 value2 ) internal returns (uint256, uint256) { (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256)); return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2)); } /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure. /// Calls to `bentoBox` are not allowed for obvious security reasons. /// This also means that calls made from this contract shall *not* be trusted. function _call( uint256 value, bytes memory data, uint256 value1, uint256 value2 ) internal returns (bytes memory, uint8) { (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) = abi.decode(data, (address, bytes, bool, bool, uint8)); if (useValue1 && !useValue2) { callData = abi.encodePacked(callData, value1); } else if (!useValue1 && useValue2) { callData = abi.encodePacked(callData, value2); } else if (useValue1 && useValue2) { callData = abi.encodePacked(callData, value1, value2); } require(callee != address(bentoBox) && callee != address(this), "KashiPair: can't call"); (bool success, bytes memory returnData) = callee.call{value: value}(callData); require(success, "KashiPair: call failed"); return (returnData, returnValues); } struct CookStatus { bool needsSolvencyCheck; bool hasAccrued; } /// @notice Executes a set of actions and allows composability (contract calls) to other contracts. /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations). /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions. /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`. /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments. /// @return value1 May contain the first positioned return value of the last executed action (if applicable). /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable). function cook( uint8[] calldata actions, uint256[] calldata values, bytes[] calldata datas ) external payable returns (uint256 value1, uint256 value2) { CookStatus memory status; for (uint256 i = 0; i < actions.length; i++) { uint8 action = actions[i]; if (!status.hasAccrued && action < 10) { accrue(); status.hasAccrued = true; } if (action == ACTION_ADD_COLLATERAL) { (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool)); addCollateral(to, skim, _num(share, value1, value2)); } else if (action == ACTION_ADD_ASSET) { (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool)); value1 = _addAsset(to, skim, _num(share, value1, value2)); } else if (action == ACTION_REPAY) { (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool)); _repay(to, skim, _num(part, value1, value2)); } else if (action == ACTION_REMOVE_ASSET) { (int256 fraction, address to) = abi.decode(datas[i], (int256, address)); value1 = _removeAsset(to, _num(fraction, value1, value2)); } else if (action == ACTION_REMOVE_COLLATERAL) { (int256 share, address to) = abi.decode(datas[i], (int256, address)); _removeCollateral(to, _num(share, value1, value2)); status.needsSolvencyCheck = true; } else if (action == ACTION_BORROW) { (int256 amount, address to) = abi.decode(datas[i], (int256, address)); (value1, value2) = _borrow(to, _num(amount, value1, value2)); status.needsSolvencyCheck = true; } else if (action == ACTION_UPDATE_EXCHANGE_RATE) { (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256)); (bool updated, uint256 rate) = updateExchangeRate(); require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), "KashiPair: rate not ok"); } else if (action == ACTION_BENTO_SETAPPROVAL) { (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) = abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32)); bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s); } else if (action == ACTION_BENTO_DEPOSIT) { (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2); } else if (action == ACTION_BENTO_WITHDRAW) { (value1, value2) = _bentoWithdraw(datas[i], value1, value2); } else if (action == ACTION_BENTO_TRANSFER) { (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256)); bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2)); } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) { (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[])); bentoBox.transferMultiple(token, msg.sender, tos, shares); } else if (action == ACTION_CALL) { (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2); if (returnValues == 1) { (value1) = abi.decode(returnData, (uint256)); } else if (returnValues == 2) { (value1, value2) = abi.decode(returnData, (uint256, uint256)); } } else if (action == ACTION_GET_REPAY_SHARE) { int256 part = abi.decode(datas[i], (int256)); value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true); } else if (action == ACTION_GET_REPAY_PART) { int256 amount = abi.decode(datas[i], (int256)); value1 = totalBorrow.toBase(_num(amount, value1, value2), false); } } if (status.needsSolvencyCheck) { require(_isSolvent(msg.sender, false, exchangeRate), "KashiPair: user insolvent"); } } /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low. /// @param users An array of user addresses. /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user. /// @param to Address of the receiver in open liquidations if `swapper` is zero. /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`. /// @param open True to perform a open liquidation else False. function liquidate( address[] calldata users, uint256[] calldata maxBorrowParts, address to, ISwapper swapper, bool open ) public { // Oracle can fail but we still need to allow liquidations (, uint256 _exchangeRate) = updateExchangeRate(); accrue(); uint256 allCollateralShare; uint256 allBorrowAmount; uint256 allBorrowPart; Rebase memory _totalBorrow = totalBorrow; Rebase memory bentoBoxTotals = bentoBox.totals(collateral); for (uint256 i = 0; i < users.length; i++) { address user = users[i]; if (!_isSolvent(user, open, _exchangeRate)) { uint256 borrowPart; { uint256 availableBorrowPart = userBorrowPart[user]; borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i]; userBorrowPart[user] = availableBorrowPart.sub(borrowPart); } uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false); uint256 collateralShare = bentoBoxTotals.toBase( borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) / (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION), false ); userCollateralShare[user] = userCollateralShare[user].sub(collateralShare); emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare); emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart); // Keep totals allCollateralShare = allCollateralShare.add(collateralShare); allBorrowAmount = allBorrowAmount.add(borrowAmount); allBorrowPart = allBorrowPart.add(borrowPart); } } require(allBorrowAmount != 0, "KashiPair: all are solvent"); _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128()); _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128()); totalBorrow = _totalBorrow; totalCollateralShare = totalCollateralShare.sub(allCollateralShare); uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true); if (!open) { // Closed liquidation using a pre-approved swapper for the benefit of the LPs require(masterContract.swappers(swapper), "KashiPair: Invalid swapper"); // Swaps the users' collateral for the borrowed asset bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare); swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare); uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic)); uint256 extraShare = returnedShare.sub(allBorrowShare); uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee // solhint-disable-next-line reentrancy bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare); totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128()); emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0); } else { // Swap using a swapper freely chosen by the caller // Open (flash) liquidation: get proceeds first and provide the borrow after bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare); if (swapper != ISwapper(0)) { swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare); } bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare); totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128()); } } /// @notice Withdraws the fees accumulated. function withdrawFees() public { accrue(); address _feeTo = masterContract.feeTo(); uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction; balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction); emit Transfer(address(0), _feeTo, _feesEarnedFraction); accrueInfo.feesEarnedFraction = 0; emit LogWithdrawFees(_feeTo, _feesEarnedFraction); } /// @notice Used to register and enable or disable swapper contracts used in closed liquidations. /// MasterContract Only Admin function. /// @param swapper The address of the swapper contract that conforms to `ISwapper`. /// @param enable True to enable the swapper. To disable use False. function setSwapper(ISwapper swapper, bool enable) public onlyOwner { swappers[swapper] = enable; } /// @notice Sets the beneficiary of fees accrued in liquidations. /// MasterContract Only Admin function. /// @param newFeeTo The address of the receiver. function setFeeTo(address newFeeTo) public onlyOwner { feeTo = newFeeTo; emit LogFeeTo(newFeeTo); } }
[{"inputs":[{"internalType":"contract IBentoBoxV1","name":"bentoBox_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"accruedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeFraction","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"rate","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"utilization","type":"uint256"}],"name":"LogAccrue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fraction","type":"uint256"}],"name":"LogAddAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"LogAddCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"part","type":"uint256"}],"name":"LogBorrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"LogExchangeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeTo","type":"address"}],"name":"LogFeeTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fraction","type":"uint256"}],"name":"LogRemoveAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"LogRemoveCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"part","type":"uint256"}],"name":"LogRepay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"feesEarnedFraction","type":"uint256"}],"name":"LogWithdrawFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accrue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accrueInfo","outputs":[{"internalType":"uint64","name":"interestPerSecond","type":"uint64"},{"internalType":"uint64","name":"lastAccrued","type":"uint64"},{"internalType":"uint128","name":"feesEarnedFraction","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"skim","type":"bool"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"addAsset","outputs":[{"internalType":"uint256","name":"fraction","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"skim","type":"bool"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"addCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bentoBox","outputs":[{"internalType":"contract IBentoBoxV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"part","type":"uint256"},{"internalType":"uint256","name":"share","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"actions","type":"uint8[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"datas","type":"bytes[]"}],"name":"cook","outputs":[{"internalType":"uint256","name":"value1","type":"uint256"},{"internalType":"uint256","name":"value2","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"init","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"maxBorrowParts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"contract ISwapper","name":"swapper","type":"address"},{"internalType":"bool","name":"open","type":"bool"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterContract","outputs":[{"internalType":"contract KashiPairMediumRiskV1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"fraction","type":"uint256"}],"name":"removeAsset","outputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"share","type":"uint256"}],"name":"removeCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"skim","type":"bool"},{"internalType":"uint256","name":"part","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISwapper","name":"swapper","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISwapper","name":"","type":"address"}],"name":"swappers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAsset","outputs":[{"internalType":"uint128","name":"elastic","type":"uint128"},{"internalType":"uint128","name":"base","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrow","outputs":[{"internalType":"uint128","name":"elastic","type":"uint128"},{"internalType":"uint128","name":"base","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCollateralShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateExchangeRate","outputs":[{"internalType":"bool","name":"updated","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBorrowPart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCollateralShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620061d2380380620061d28339810160408190526200003591620000fe565b4660a08190526200004681620000a8565b60805250600380546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606091821b1660c05230901b60e0526200014d565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001620000e1939291906200012e565b604051602081830303815290604052805190602001209050919050565b60006020828403121562000110578081fd5b81516001600160a01b038116811462000127578182fd5b9392505050565b92835260208301919091526001600160a01b0316604082015260600190565b60805160a05160c05160601c60e05160601c615fae6200022460003980610dca5280611f9052806122805280612949525080611487528061164f5280611727528061189a5280611a3f5280611b6e5280611ee7528061204b528061217b528061223a5280612414528061255d52806126c15280612dd7528061332c528061343452806134f652806136de528061379e52806139985280613c665280613db55280613ede528061406b528061412152806141fd5280614382528061467d5280614704525080610cf3525080610d285250615fae6000f3fe6080604052600436106102c25760003560e01c8063656f3d641161017f5780638da5cb5b116100e1578063d8dfeb451161008a578063f46901ed11610064578063f46901ed1461078b578063f8ba4cff146107ab578063f9557ccb146107c0576102c2565b8063d8dfeb4514610741578063dd62ed3e14610756578063e30c397814610776576102c2565b8063b27c0e74116100bb578063b27c0e74146106e8578063cd446e221461070c578063d505accf14610721576102c2565b80638da5cb5b1461069e57806395d89b41146106b3578063a9059cbb146106c8576102c2565b80637dc0d1d011610143578063860ffea11161011d578063860ffea11461063e578063876467f81461065e5780638cad7fbe1461067e576102c2565b80637dc0d1d0146105e65780637ecebe00146105fb5780638285ef401461061b576102c2565b8063656f3d64146105695780636b2ace871461057c57806370a082311461059157806374645ff3146105b157806376ee101b146105c6576102c2565b8063313ce56711610228578063473e3ce7116101ec5780634b8a3529116101c65780634b8a3529146105135780634ddf47d4146105415780634e71e0c814610554576102c2565b8063473e3ce7146104c9578063476343ee146104de57806348e4163e146104f3576102c2565b8063313ce567146104485780633644e5151461046a57806338d52e0f1461047f5780633ba0b9a9146104945780633f2617cb146104a9576102c2565b806315294c401161028a5780631c9e379b116102645780631c9e379b146103e85780632317ef671461040857806323b872dd14610428576102c2565b806315294c401461038657806318160ddd146103b35780631b51e940146103c8576102c2565b8063017e7e58146102c757806302ce728f146102f257806306fdde0314610315578063078dfbe714610337578063095ea7b314610359575b600080fd5b3480156102d357600080fd5b506102dc6107d5565b6040516102e991906155d0565b60405180910390f35b3480156102fe57600080fd5b506103076107e4565b6040516102e9929190615628565b34801561032157600080fd5b5061032a6108c1565b6040516102e991906156b2565b34801561034357600080fd5b50610357610352366004614e55565b610999565b005b34801561036557600080fd5b50610379610374366004614ece565b610a89565b6040516102e9919061561d565b34801561039257600080fd5b506103a66103a1366004614e9f565b610af4565b6040516102e99190615638565b3480156103bf57600080fd5b506103a6610b11565b3480156103d457600080fd5b506103a66103e3366004614e9f565b610b27565b3480156103f457600080fd5b506103a6610403366004614c3e565b610b3c565b34801561041457600080fd5b506103a6610423366004614ece565b610b4e565b34801561043457600080fd5b50610379610443366004614da5565b610b69565b34801561045457600080fd5b5061045d610cd1565b6040516102e99190615e1c565b34801561047657600080fd5b506103a6610cee565b34801561048b57600080fd5b506102dc610d4e565b3480156104a057600080fd5b506103a6610d5d565b3480156104b557600080fd5b506103576104c43660046152df565b610d63565b3480156104d557600080fd5b506103a6610db8565b3480156104ea57600080fd5b50610357610dbe565b3480156104ff57600080fd5b506103a661050e366004614c3e565b610f2e565b34801561051f57600080fd5b5061053361052e366004614ece565b610f40565b6040516102e9929190615dcc565b61035761054f3660046150b0565b610f8e565b34801561056057600080fd5b50610357611071565b610533610577366004614f9e565b6110ff565b34801561058857600080fd5b506102dc611a3d565b34801561059d57600080fd5b506103a66105ac366004614c3e565b611a61565b3480156105bd57600080fd5b5061032a611a73565b3480156105d257600080fd5b506103576105e1366004614ef9565b611b01565b3480156105f257600080fd5b506102dc61260b565b34801561060757600080fd5b506103a6610616366004614c3e565b61261a565b34801561062757600080fd5b5061063061262c565b6040516102e9929190615db2565b34801561064a57600080fd5b50610357610659366004614e9f565b612646565b34801561066a57600080fd5b50610357610679366004614ece565b612727565b34801561068a57600080fd5b50610379610699366004614c3e565b612767565b3480156106aa57600080fd5b506102dc61277c565b3480156106bf57600080fd5b5061032a61278b565b3480156106d457600080fd5b506103796106e3366004614ece565b61284f565b3480156106f457600080fd5b506106fd61291a565b6040516102e993929190615df0565b34801561071857600080fd5b506102dc612947565b34801561072d57600080fd5b5061035761073c366004614de5565b61296b565b34801561074d57600080fd5b506102dc612b0c565b34801561076257600080fd5b506103a6610771366004614d6d565b612b1b565b34801561078257600080fd5b506102dc612b38565b34801561079757600080fd5b506103576107a6366004614c3e565b612b47565b3480156107b757600080fd5b50610357612bbb565b3480156107cc57600080fd5b50610630613187565b6005546001600160a01b031681565b60095460405163d6d7d52560e01b815260009182916001600160a01b039091169063d6d7d5259061081a90600a906004016156c5565b6040805180830381600087803b15801561083357600080fd5b505af1158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b919061504f565b909250905081156108b85760108190556040517f9f9192b5edb17356c524e08d9e025c8e2f6307e6ea52fb7968faa3081f51c3c8906108ab908390615638565b60405180910390a16108bd565b506010545b9091565b6007546060906108d9906001600160a01b03166131a1565b6008546108ee906001600160a01b03166131a1565b60095460405163355a219b60e21b81526001600160a01b039091169063d568866c9061091f90600a906004016156c5565b60006040518083038186803b15801561093757600080fd5b505afa15801561094b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610973919081019061536e565b604051602001610985939291906154e6565b604051602081830303815290604052905090565b6003546001600160a01b031633146109cc5760405162461bcd60e51b81526004016109c390615b90565b60405180910390fd5b8115610a68576001600160a01b0383161515806109e65750805b610a025760405162461bcd60e51b81526004016109c3906159b0565b6003546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0385166001600160a01b031991821617909155600480549091169055610a84565b600480546001600160a01b0319166001600160a01b0385161790555b505050565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ae2908690615638565b60405180910390a35060015b92915050565b6000610afe612bbb565b610b09848484613266565b949350505050565b600c54600160801b90046001600160801b031690565b6000610b31612bbb565b610b0984848461349f565b600e6020526000908152604090205481565b6000610b58612bbb565b610b62838361374a565b9392505050565b60008115610c8e576001600160a01b03841660009081526020819052604090205482811015610baa5760405162461bcd60e51b81526004016109c390615c68565b836001600160a01b0316856001600160a01b031614610c8c576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610c395783811015610c105760405162461bcd60e51b81526004016109c390615ac3565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b038516610c5f5760405162461bcd60e51b81526004016109c390615942565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b0316600080516020615f5983398151915284604051610cbf9190615638565b60405180910390a35060019392505050565b600854600090610ce9906001600160a01b0316613a11565b905090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610d2657610d2181613aca565b610d48565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6008546001600160a01b031681565b60105481565b6003546001600160a01b03163314610d8d5760405162461bcd60e51b81526004016109c390615b90565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600b5481565b610dc6612bbb565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2157600080fd5b505afa158015610e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e599190614c5a565b6011546001600160a01b038216600090815260208190526040902054919250600160801b90046001600160801b031690610e939082613b1e565b6001600160a01b038316600081815260208190526040808220939093559151909190600080516020615f5983398151915290610ed0908590615638565b60405180910390a3601180546001600160801b031690556040516001600160a01b038316907fbe641c3ffc44b2d6c184f023fa4ed7bda4b6ffa71e03b3c98ae0c776da1f17e790610f22908490615638565b60405180910390a25050565b600f6020526000908152604090205481565b600080610f4b612bbb565b610f558484613b41565b8092508193505050610f6b336000601054613e2f565b610f875760405162461bcd60e51b81526004016109c390615b59565b9250929050565b6007546001600160a01b031615610fb75760405162461bcd60e51b81526004016109c39061590b565b610fc381830183615235565b805160079060009060089082906009908290610fe690600a9060208a0190614a71565b5081546001600160a01b0398891661010092830a908102908a021990911617909155825497871691810a918202918702199097161790558154958416940a938402938302199094169290921790925550600754166110565760405162461bcd60e51b81526004016109c390615a8c565b50506011805467ffffffffffffffff19166312e687c0179055565b6004546001600160a01b031633811461109c5760405162461bcd60e51b81526004016109c390615bc5565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b039092166001600160a01b0319928316179055600480549091169055565b60008061110a614aeb565b60005b888110156119ff5760008a8a8381811061112357fe5b9050602002016020810190611138919061541d565b9050826020015115801561114f5750600a8160ff16105b156111645761115c612bbb565b600160208401525b60ff8116600a14156111be57600080600089898681811061118157fe5b90506020028101906111939190615e2a565b8101906111a09190615348565b9250925092506111b68282610659868c8c613faa565b5050506119f6565b60ff81166001141561121f5760008060008989868181106111db57fe5b90506020028101906111ed9190615e2a565b8101906111fa9190615348565b9250925092506112158282611210868c8c613faa565b61349f565b97505050506119f6565b60ff81166002141561127f57600080600089898681811061123c57fe5b905060200281019061124e9190615e2a565b81019061125b9190615348565b9250925092506112768282611271868c8c613faa565b613266565b505050506119f6565b60ff8116600314156112da5760008088888581811061129a57fe5b90506020028101906112ac9190615e2a565b8101906112b99190615324565b915091506112d1816112cc848a8a613faa565b61374a565b965050506119f6565b60ff811660041415611337576000808888858181106112f557fe5b90506020028101906113079190615e2a565b8101906113149190615324565b9150915061132c81611327848a8a613faa565b613fd2565b5050600183526119f6565b60ff81166005141561139a5760008088888581811061135257fe5b90506020028101906113649190615e2a565b8101906113719190615324565b9150915061138981611384848a8a613faa565b613b41565b6001875290975095506119f6915050565b60ff8116600b14156114395760008060008989868181106113b757fe5b90506020028101906113c99190615e2a565b8101906113d6919061507c565b9250925092506000806113e76107e4565b915091508415806113f55750815b801561140057508381115b8015611413575082158061141357508281115b61142f5760405162461bcd60e51b81526004016109c390615d44565b50505050506119f6565b60ff811660181415611518576000806000806000808c8c8981811061145a57fe5b905060200281019061146c9190615e2a565b8101906114799190614c76565b9550955095509550955095507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c0a47c938787878787876040518763ffffffff1660e01b81526004016114db969594939291906155e4565b600060405180830381600087803b1580156114f557600080fd5b505af1158015611509573d6000803e3d6000fd5b505050505050505050506119f6565b60ff8116601414156115a05761159687878481811061153357fe5b90506020028101906115459190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c915086905081811061158857fe5b9050602002013587876140e0565b90955093506119f6565b60ff81166015141561160b576115968787848181106115bb57fe5b90506020028101906115cd9190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992508891506141d69050565b60ff8116601614156116e357600080600089898681811061162857fe5b905060200281019061163a9190615e2a565b8101906116479190614da5565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc84338561168a868e8e613faa565b6040518563ffffffff1660e01b81526004016116a99493929190615769565b600060405180830381600087803b1580156116c357600080fd5b505af11580156116d7573d6000803e3d6000fd5b505050505050506119f6565b60ff81166017141561177757600060608089898681811061170057fe5b90506020028101906117129190615e2a565b81019061171f9190615163565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fca8843843385856040518563ffffffff1660e01b81526004016116a994939291906157c7565b60ff8116601e141561185157606060006117f98b8b8681811061179657fe5b905060200201358a8a878181106117a957fe5b90506020028101906117bb9190615e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508b91506142c49050565b915091508060ff1660011415611824578180602001905181019061181d91906153e2565b965061184a565b8060ff166002141561184a578180602001905181019061184491906153fa565b90975095505b50506119f6565b60ff81166006141561197957600087878481811061186b57fe5b905060200281019061187d9190615e2a565b81019061188a919061530c565b6008549091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163da5139ca91166119016118d1858b8b613faa565b60408051808201909152600d546001600160801b038082168352600160801b90910416602082015290600161447a565b60016040518463ffffffff1660e01b81526004016119219392919061588d565b60206040518083038186803b15801561193957600080fd5b505afa15801561194d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197191906153e2565b9550506119f6565b60ff8116600714156119f657600087878481811061199357fe5b90506020028101906119a59190615e2a565b8101906119b2919061530c565b90506119f26119c2828888613faa565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906000614513565b9550505b5060010161110d565b50805115611a3157611a15336000601054613e2f565b611a315760405162461bcd60e51b81526004016109c390615b59565b50965096945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020819052908152604090205481565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505081565b6000611b0b6107e4565b915050611b16612bbb565b6000806000611b23614aeb565b5060408051808201909152600d546001600160801b038082168352600160801b909104166020820152611b54614aeb565b600754604051634ffe34db60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692634ffe34db92611ba79291909116906004016155d0565b604080518083038186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf691906153a0565b905060005b8c811015611e1d5760008e8e83818110611c1157fe5b9050602002016020810190611c269190614c3e565b9050611c33818a8a613e2f565b611e14576001600160a01b0381166000908152600f6020526040812054808f8f86818110611c5d57fe5b9050602002013511611c81578e8e85818110611c7557fe5b90506020020135611c83565b805b9150611c8f818361458c565b6001600160a01b0384166000908152600f60205260408120919091559050611cb886838361447a565b90506000611cf369152d02c7e14af6800000611ce18d611cdb866201b5806145af565b906145af565b81611ce857fe5b889190046000614513565b6001600160a01b0385166000908152600e6020526040902054909150611d19908261458c565b6001600160a01b038086166000908152600e60205260409020919091558d1615611d43578c611d45565b8d5b6001600160a01b0316846001600160a01b03167f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40283604051611d879190615638565b60405180910390a36001600160a01b03808516908e1615611da8578d611daa565b335b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8486604051611de4929190615dcc565b60405180910390a3611df68a82613b1e565b9950611e028983613b1e565b9850611e0e8884613b1e565b97505050505b50600101611bfb565b5083611e3b5760405162461bcd60e51b81526004016109c390615979565b611e58611e47856145e6565b83516001600160801b031690614613565b6001600160801b03168252611e83611e6f846145e6565b60208401516001600160801b031690614613565b6001600160801b03908116602084018190528351600d80546001600160801b03191691841691909117909216600160801b909102179055600b54611ec7908661458c565b600b55600854604051636d289ce560e11b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92611f22921690899060019060040161588d565b60206040518083038186803b158015611f3a57600080fd5b505afa158015611f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7291906153e2565b90508761240757604051634656bfdf60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638cad7fbe90611fc5908c906004016155d0565b60206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120159190615033565b6120315760405162461bcd60e51b81526004016109c390615cd6565b600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261208a92919091169030908e908c90600401615769565b600060405180830381600087803b1580156120a457600080fd5b505af11580156120b8573d6000803e3d6000fd5b50506007546008546040516371a1ff0960e11b81526001600160a01b03808f16955063e343fe1294506120f8938116921690309087908d90600401615793565b6040805180830381600087803b15801561211157600080fd5b505af1158015612125573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214991906153fa565b5050600c54600854604051633de222bb60e21b815260009261220c926001600160801b03909116916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f7888aec926121b6929190911690309060040161574f565b60206040518083038186803b1580156121ce57600080fd5b505afa1580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906153e2565b9061458c565b9050600061221a828461458c565b90506000620186a061222e836127106145af565b8161223557fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc600860009054906101000a90046001600160a01b0316307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190614c5a565b856040518563ffffffff1660e01b815260040161232f9493929190615769565b600060405180830381600087803b15801561234957600080fd5b505af115801561235d573d6000803e3d6000fd5b5050505061239161237f61237a838661458c90919063ffffffff16565b6145e6565b600c546001600160801b031690614642565b600c80546001600160801b0319166001600160801b0392909216919091179055306001600160a01b038d167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e386123e7858561458c565b60006040516123f7929190615dcc565b60405180910390a35050506125fb565b6007546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163f18d03cc919081169030908d161561244f578c612451565b8d5b8a6040518563ffffffff1660e01b81526004016124719493929190615769565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050506001600160a01b03891615612543576007546008546040516371a1ff0960e11b81526001600160a01b03808d169363e343fe12936124ef93918316921690339087908d90600401615793565b6040805180830381600087803b15801561250857600080fd5b505af115801561251c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254091906153fa565b50505b600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261259c929190911690339030908790600401615769565b600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b505050506125da61237f826145e6565b600c80546001600160801b0319166001600160801b03929092169190911790555b5050505050505050505050505050565b6009546001600160a01b031681565b60026020526000908152604090205481565b600d546001600160801b0380821691600160801b90041682565b6001600160a01b0383166000908152600e60205260409020546126699082613b1e565b6001600160a01b0384166000908152600e6020526040902055600b5461268f8183613b1e565b600b556007546126aa906001600160a01b0316838386614671565b836001600160a01b0316836126bf57336126e1565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f9ed03113de523cebfe5e49d5f8e12894b1c0d42ce805990461726444c90eab87846040516127199190615638565b60405180910390a350505050565b61272f612bbb565b6127398282613fd2565b612747336000601054613e2f565b6127635760405162461bcd60e51b81526004016109c390615b59565b5050565b60066020526000908152604090205460ff1681565b6003546001600160a01b031681565b6007546060906127a3906001600160a01b0316614778565b6008546127b8906001600160a01b0316614778565b60095460405163634ce26b60e11b81526001600160a01b039091169063c699c4d6906127e990600a906004016156c5565b60006040518083038186803b15801561280157600080fd5b505afa158015612815573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261283d919081019061536e565b60405160200161098593929190615563565b600081156128e95733600090815260208190526040902054828110156128875760405162461bcd60e51b81526004016109c390615c68565b336001600160a01b038516146128e7576001600160a01b0384166128bd5760405162461bcd60e51b81526004016109c390615942565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b0316600080516020615f5983398151915284604051610ae29190615638565b6011546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0387166129915760405162461bcd60e51b81526004016109c390615bfa565b8342106129b05760405162461bcd60e51b81526004016109c390615b31565b6001600160a01b0387166000818152600260209081526040918290208054600181810190925592519092612a2e92612a13927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e9101615641565b604051602081830303815290604052805190602001206147bf565b85858560405160008152602001604052604051612a4e9493929190615694565b6020604051602081039080840390855afa158015612a70573d6000803e3d6000fd5b505050602060405103516001600160a01b031614612aa05760405162461bcd60e51b81526004016109c390615d7b565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612afb908990615638565b60405180910390a350505050505050565b6007546001600160a01b031681565b600160209081526000928352604080842090915290825290205481565b6004546001600160a01b031681565b6003546001600160a01b03163314612b715760405162461bcd60e51b81526004016109c390615b90565b600580546001600160a01b0319166001600160a01b0383169081179091556040517fcf1d3f17e521c635e0d20b8acba94ba170afc041d0546d46dafa09d3c9c19eb390600090a250565b612bc3614b02565b50604080516060810182526011546001600160401b038082168352600160401b82041660208301819052600160801b9091046001600160801b03169282019290925290420380612c14575050613185565b6001600160401b0342166020830152612c2b614aeb565b5060408051808201909152600d546001600160801b038082168352600160801b9091041660208201819052612d225782516001600160401b03166312e687c014612cb5576312e687c08084526040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b91612cac91600091829182906158b0565b60405180910390a15b5050805160118054602084015160409094015167ffffffffffffffff199091166001600160401b03938416176fffffffffffffffff00000000000000001916600160401b9390941692909202929092176001600160801b03908116600160801b9190921602179055613185565b600080612d2d614aeb565b5060408051808201909152600c546001600160801b038082168352600160801b9091048116602083015286518551670de0b6b3a764000092612d7f928992611cdb9216906001600160401b03166145af565b81612d8657fe5b049250612da6612d95846145e6565b85516001600160801b031690614642565b6001600160801b03168085526008548251604051630acc462360e31b8152600093612e679390926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811693635662311893612e1193921691908890600401615861565b60206040518083038186803b158015612e2957600080fd5b505afa158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6191906153e2565b90613b1e565b90506000620186a0612e7b866127106145af565b81612e8257fe5b04905081612ea684602001516001600160801b0316836145af90919063ffffffff16565b81612ead57fe5b049350612ed0612ebc856145e6565b60408a01516001600160801b031690614642565b6001600160801b03166040890152612efe612eea856145e6565b60208501516001600160801b031690614642565b600c80546001600160801b03908116600160801b9382168402179091558751600d805460208b01516001600160801b031990911692841692831784169316909302919091179091556000908390612f5d90670de0b6b3a76400006145af565b81612f6457fe5b0490506709b6e64a8ec600008110156130265760006709b6e64a8ec60000612f98670de0b6b3a7640000611cdb838661458c565b81612f9f57fe5b0490506000612fcd612fb58b611cdb85806145af565b7054a2b63d65d79d094abb6688000000000090613b1e565b8b519091508190612ff8906001600160401b03167054a2b63d65d79d094abb668800000000006145af565b81612fff57fe5b046001600160401b0316808c526304b9a1f0111561301f576304b9a1f08b525b50506130d7565b670b1a2bc2ec5000008111156130d75760006702c68af0bb14000061305f670de0b6b3a7640000611cdb85670b1a2bc2ec50000061458c565b8161306657fe5b049050600061307c612fb58b611cdb85806145af565b8b519091506000907054a2b63d65d79d094abb66880000000000906130aa906001600160401b0316846145af565b816130b157fe5b0490506449d48246008111156130c957506449d48246005b6001600160401b03168b5250505b88516040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b9161310d918991899186906158b0565b60405180910390a1505086516011805460208a01516040909a015167ffffffffffffffff199091166001600160401b03938416176fffffffffffffffff00000000000000001916600160401b93909a1692909202989098176001600160801b03908116600160801b9190921602179096555050505050505b565b600c546001600160801b0380821691600160801b90041682565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009183916001600160a01b038616916131e89190615481565b600060405180830381855afa9150503d8060008114613223576040519150601f19603f3d011682016040523d82523d6000602084013e613228565b606091505b50915091508161325357604051806040016040528060038152602001623f3f3f60e81b81525061325c565b61325c816147f7565b925050505b919050565b60408051808201909152600d546001600160801b038082168352600160801b90910416602082015260009061329d9083600161495c565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b0386166000908152600f9092526040909120549091506132fb908361458c565b6001600160a01b038086166000908152600f6020526040808220939093556008549251636d289ce560e11b815290927f000000000000000000000000000000000000000000000000000000000000000083169263da5139ca926133699290911690869060019060040161588d565b60206040518083038186803b15801561338157600080fd5b505afa158015613395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b991906153e2565b600c546008549192506001600160801b0316906133e1906001600160a01b0316838388614671565b6133fd6133ed836145e6565b6001600160801b03831690614642565b600c80546001600160801b0319166001600160801b03929092169190911790556001600160a01b038616856134325733613454565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e858760405161348e929190615dcc565b60405180910390a350509392505050565b60006134a9614aeb565b50604080518082018252600c546001600160801b03808216808452600160801b90920481166020840152600854600d549451636d289ce560e11b8152939492936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca94613532949216921690600190600401615861565b60206040518083038186803b15801561354a57600080fd5b505afa15801561355e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358291906153e2565b83516001600160801b031601905080156135c457806135b784602001516001600160801b0316876145af90919063ffffffff16565b816135be57fe5b046135c6565b845b93506103e86135eb6135d7866145e6565b60208601516001600160801b031690614642565b6001600160801b031610156136065760009350505050610b62565b6136118386866149d1565b8051600c80546020938401516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b038816600090815290819052604090205461366a9085613b1e565b6001600160a01b038816600081815260208190526040808220939093559151909190600080516020615f59833981519152906136a7908890615638565b60405180910390a36008546136c7906001600160a01b0316868489614671565b866001600160a01b0316866136dc57336136fe565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e388787604051613738929190615dcc565b60405180910390a35050509392505050565b6000613754614aeb565b50604080518082018252600c546001600160801b038082168352600160801b90910481166020830152600854600d549351636d289ce560e11b815292936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca946137db94921692911690600190600401615861565b60206040518083038186803b1580156137f357600080fd5b505afa158015613807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382b91906153e2565b825160208401516001600160801b039182169290920192501661384e85836145af565b8161385557fe5b336000908152602081905260409020549190049350613874908561458c565b33600081815260208190526040808220939093559151600080516020615f59833981519152906138a5908890615638565b60405180910390a36138b9611e47846145e6565b6001600160801b031682526138d0611e6f856145e6565b6001600160801b0316602083018190526103e811156139015760405162461bcd60e51b81526004016109c390615c31565b8151600c805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040516001600160a01b0386169033907f6e853a5fd6b51d773691f542ebac8513c9992a51380d4c342031056a64114228906139769087908990615dcc565b60405180910390a3600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc926139d792919091169030908a908990600401615769565b600060405180830381600087803b1580156139f157600080fd5b505af1158015613a05573d6000803e3d6000fd5b50505050505092915050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916060916001600160a01b03861691613a589190615481565b600060405180830381855afa9150503d8060008114613a93576040519150601f19603f3d011682016040523d82523d6000602084013e613a98565b606091505b5091509150818015613aab575080516020145b613ab657601261325c565b8080602001905181019061325c9190615439565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001613b0193929190615675565b604051602081830303815290604052805190602001209050919050565b81810181811015610aee5760405162461bcd60e51b81526004016109c390615a55565b60008080620186a0613b548560326145af565b81613b5b57fe5b049050613b9b613b6b8583613b1e565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906001614a12565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b03199092169190911716919091179055336000908152600f909252604090912054909350613bf09084613b1e565b336000818152600f6020526040908190209290925590516001600160a01b03871691907f3a5151e57d3bc9798e7853034ac52293d1a0e12a2b44725e75b03b21f86477a690613c4490889086908990615dda565b60405180910390a3600854604051636d289ce560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92613ca4929190911690889060009060040161588d565b60206040518083038186803b158015613cbc57600080fd5b505afa158015613cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf491906153e2565b9150613cfe614aeb565b5060408051808201909152600c546001600160801b038082168352600160801b90910416602082018190526103e81115613d4a5760405162461bcd60e51b81526004016109c390615c31565b613d67613d56846145e6565b82516001600160801b031690614613565b6001600160801b03908116808352600c805460208501518416600160801b026001600160801b0319909116909217909216179055600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc92613df492919091169030908b908990600401615769565b600060405180830381600087803b158015613e0e57600080fd5b505af1158015613e22573d6000803e3d6000fd5b5050505050509250929050565b6001600160a01b0383166000908152600f602052604081205480613e57576001915050610b62565b6001600160a01b0385166000908152600e602052604090205480613e8057600092505050610b62565b613e88614aeb565b5060408051808201909152600d546001600160801b03808216808452600160801b909204166020830181905290613ec6908790611cdb9087906145af565b81613ecd57fe5b600754919004906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163566231189116613f2d8a613f1857620124f8613f1d565b62012cc85b611cdb886509184e72a0006145af565b60006040518463ffffffff1660e01b8152600401613f4d9392919061588d565b60206040518083038186803b158015613f6557600080fd5b505afa158015613f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9d91906153e2565b1015979650505050505050565b600080841215613fca576000198414613fc35781613fc5565b825b610b09565b509192915050565b336000908152600e6020526040902054613fec908261458c565b336000908152600e6020526040902055600b54614009908261458c565b600b556040516001600160a01b0383169033907f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40290614049908590615638565b60405180910390a3600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc926140aa929190911690309087908790600401615769565b600060405180830381600087803b1580156140c457600080fd5b505af11580156140d8573d6000803e3d6000fd5b505050505050565b600080600080600080898060200190518101906140fd919061511c565b9350935093509350614110828989613faa565b915061411d818989613faa565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302b9446c8a86338787876040518763ffffffff1660e01b8152600401614174959493929190615793565b60408051808303818588803b15801561418c57600080fd5b505af11580156141a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141c591906153fa565b955095505050505094509492505050565b600080600080600080888060200190518101906141f3919061511c565b93509350935093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166397da6d30853386614238878e8e613faa565b614243878f8f613faa565b6040518663ffffffff1660e01b8152600401614263959493929190615793565b6040805180830381600087803b15801561427c57600080fd5b505af1158015614290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b491906153fa565b9550955050505050935093915050565b606060008060606000806000898060200190518101906142e49190614ce3565b945094509450945094508280156142f9575081155b1561432757838960405160200161431192919061549d565b6040516020818303038152906040529350614380565b821580156143325750815b1561434a57838860405160200161431192919061549d565b8280156143545750815b156143805783898960405160200161436e939291906154bf565b60405160208183030381529060405293505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316141580156143cb57506001600160a01b0385163014155b6143e75760405162461bcd60e51b81526004016109c390615afa565b60006060866001600160a01b03168d876040516144049190615481565b60006040518083038185875af1925050503d8060008114614441576040519150601f19603f3d011682016040523d82523d6000602084013e614446565b606091505b5091509150816144685760405162461bcd60e51b81526004016109c3906159e7565b9c919b50909950505050505050505050565b600083602001516001600160801b031660001415614499575081610b62565b602084015184516001600160801b03918216916144b8918691166145af565b816144bf57fe5b04905081801561450357508284600001516001600160801b03166144f986602001516001600160801b0316846145af90919063ffffffff16565b8161450057fe5b04105b15610b6257610b09816001613b1e565b82516000906001600160801b031661452c575081610b62565b835160208501516001600160801b039182169161454b918691166145af565b8161455257fe5b04905081801561450357508284602001516001600160801b03166144f986600001516001600160801b0316846145af90919063ffffffff16565b80820382811115610aee5760405162461bcd60e51b81526004016109c3906158d4565b60008115806145ca575050808202828282816145c757fe5b04145b610aee5760405162461bcd60e51b81526004016109c390615d0d565b60006001600160801b0382111561460f5760405162461bcd60e51b81526004016109c390615a1e565b5090565b8082036001600160801b038084169082161115610aee5760405162461bcd60e51b81526004016109c3906158d4565b8181016001600160801b038083169082161015610aee5760405162461bcd60e51b81526004016109c390615a55565b80156146ed576146c9827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f7888aec87306040518363ffffffff1660e01b81526004016121b692919061574f565b8311156146e85760405162461bcd60e51b81526004016109c390615c9f565b614772565b604051633c6340f360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc9061473f908790339030908990600401615769565b600060405180830381600087803b15801561475957600080fd5b505af115801561476d573d6000803e3d6000fd5b505050505b50505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009183916001600160a01b038616916131e89190615481565b600060405180604001604052806002815260200161190160f01b8152506147e4610cee565b83604051602001613b01939291906154bf565b6060604082511061481d5781806020019051810190614816919061536e565b9050613261565b81516020141561493c5760005b60208160ff161080156148595750828160ff168151811061484757fe5b01602001516001600160f81b03191615155b156148665760010161482a565b60608160ff166001600160401b038111801561488157600080fd5b506040519080825280601f01601f1916602001820160405280156148ac576020820181803683370190505b509050600091505b60208260ff161080156148e35750838260ff16815181106148d157fe5b01602001516001600160f81b03191615155b1561493357838260ff16815181106148f757fe5b602001015160f81c60f81b818360ff168151811061491157fe5b60200101906001600160f81b031916908160001a9053506001909101906148b4565b91506132619050565b506040805180820190915260038152623f3f3f60e81b6020820152613261565b614964614aeb565b600061497185858561447a565b905061499061497f826145e6565b86516001600160801b031690614613565b6001600160801b031685526149bb6149a7856145e6565b60208701516001600160801b031690614613565b6001600160801b03166020860152939492505050565b6149d9614aeb565b6149e5612d95846145e6565b6001600160801b031684526149fc6135d7836145e6565b6001600160801b03166020850152509192915050565b614a1a614aeb565b6000614a27858585614513565b9050614a46614a35856145e6565b86516001600160801b031690614642565b6001600160801b031685526149bb614a5d826145e6565b60208701516001600160801b031690614642565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614ab257805160ff1916838001178555614adf565b82800160010185558215614adf579182015b82811115614adf578251825591602001919060010190614ac4565b5061460f929150614b22565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b5b8082111561460f5760008155600101614b23565b8035610aee81615f0e565b60008083601f840112614b53578182fd5b5081356001600160401b03811115614b69578182fd5b6020830191508360208083028501011115610f8757600080fd5b600082601f830112614b93578081fd5b8135614ba6614ba182615e94565b615e6e565b818152915060208083019084810181840286018201871015614bc757600080fd5b60005b84811015614be657813584529282019290820190600101614bca565b505050505092915050565b600082601f830112614c01578081fd5b8151614c0f614ba182615eb3565b9150808252836020828501011115614c2657600080fd5b614c37816020840160208601615ee2565b5092915050565b600060208284031215614c4f578081fd5b8135610b6281615f0e565b600060208284031215614c6b578081fd5b8151610b6281615f0e565b60008060008060008060c08789031215614c8e578182fd5b8635614c9981615f0e565b95506020870135614ca981615f0e565b94506040870135614cb981615f26565b93506060870135614cc981615f49565b9598949750929560808101359460a0909101359350915050565b600080600080600060a08688031215614cfa578283fd5b8551614d0581615f0e565b60208701519095506001600160401b03811115614d20578384fd5b614d2c88828901614bf1565b9450506040860151614d3d81615f26565b6060870151909350614d4e81615f26565b6080870151909250614d5f81615f49565b809150509295509295909350565b60008060408385031215614d7f578182fd5b8235614d8a81615f0e565b91506020830135614d9a81615f0e565b809150509250929050565b600080600060608486031215614db9578081fd5b8335614dc481615f0e565b92506020840135614dd481615f0e565b929592945050506040919091013590565b600080600080600080600060e0888a031215614dff578485fd5b8735614e0a81615f0e565b96506020880135614e1a81615f0e565b955060408801359450606088013593506080880135614e3881615f49565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614e69578081fd5b8335614e7481615f0e565b92506020840135614e8481615f26565b91506040840135614e9481615f26565b809150509250925092565b600080600060608486031215614eb3578081fd5b8335614ebe81615f0e565b92506020840135614dd481615f26565b60008060408385031215614ee0578182fd5b8235614eeb81615f0e565b946020939093013593505050565b600080600080600080600060a0888a031215614f13578081fd5b87356001600160401b0380821115614f29578283fd5b614f358b838c01614b42565b909950975060208a0135915080821115614f4d578283fd5b50614f5a8a828b01614b42565b9096509450506040880135614f6e81615f0e565b92506060880135614f7e81615f0e565b91506080880135614f8e81615f26565b8091505092959891949750929550565b60008060008060008060608789031215614fb6578384fd5b86356001600160401b0380821115614fcc578586fd5b614fd88a838b01614b42565b90985096506020890135915080821115614ff0578586fd5b614ffc8a838b01614b42565b90965094506040890135915080821115615014578384fd5b5061502189828a01614b42565b979a9699509497509295939492505050565b600060208284031215615044578081fd5b8151610b6281615f26565b60008060408385031215615061578182fd5b825161506c81615f26565b6020939093015192949293505050565b600080600060608486031215615090578081fd5b833561509b81615f26565b95602085013595506040909401359392505050565b600080602083850312156150c2578182fd5b82356001600160401b03808211156150d8578384fd5b818501915085601f8301126150eb578384fd5b8135818111156150f9578485fd5b86602082850101111561510a578485fd5b60209290920196919550909350505050565b60008060008060808587031215615131578182fd5b845161513c81615f0e565b602086015190945061514d81615f0e565b6040860151606090960151949790965092505050565b600080600060608486031215615177578081fd5b833561518281615f0e565b92506020848101356001600160401b038082111561519e578384fd5b818701915087601f8301126151b1578384fd5b81356151bf614ba182615e94565b81815284810190848601868402860187018c10156151db578788fd5b8795505b83861015615205576151f18c82614b37565b8352600195909501949186019186016151df565b5096505050604087013592508083111561521d578384fd5b505061522b86828701614b83565b9150509250925092565b6000806000806080858703121561524a578182fd5b843561525581615f0e565b9350602085013561526581615f0e565b9250604085013561527581615f0e565b915060608501356001600160401b0381111561528f578182fd5b8501601f8101871361529f578182fd5b80356152ad614ba182615eb3565b8181528860208385010111156152c1578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156152f1578182fd5b82356152fc81615f0e565b91506020830135614d9a81615f26565b60006020828403121561531d578081fd5b5035919050565b60008060408385031215615336578182fd5b823591506020830135614d9a81615f0e565b60008060006060848603121561535c578081fd5b833592506020840135614e8481615f0e565b60006020828403121561537f578081fd5b81516001600160401b03811115615394578182fd5b610b0984828501614bf1565b6000604082840312156153b1578081fd5b6153bb6040615e6e565b82516153c681615f34565b815260208301516153d681615f34565b60208201529392505050565b6000602082840312156153f3578081fd5b5051919050565b6000806040838503121561540c578182fd5b505080516020909101519092909150565b60006020828403121561542e578081fd5b8135610b6281615f49565b60006020828403121561544a578081fd5b8151610b6281615f49565b6000815180845261546d816020860160208601615ee2565b601f01601f19169290920160200192915050565b60008251615493818460208701615ee2565b9190910192915050565b600083516154af818460208801615ee2565b9190910191825250602001919050565b600084516154d1818460208901615ee2565b91909101928352506020820152604001919050565b600071025b0b9b4349026b2b234bab6902934b9b5960751b82528451615513816012850160208901615ee2565b602f60f81b6012918401918201528451615534816013840160208901615ee2565b602d60f81b601392909101918201528351615556816014840160208801615ee2565b0160140195945050505050565b6000616b6d60f01b82528451615580816002850160208901615ee2565b602f60f81b60029184019182015284516155a1816003840160208901615ee2565b602d60f81b6003929091019182015283516155c3816004840160208801615ee2565b0160040195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b901515815260200190565b9115158252602082015260400190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b626020830184615455565b600060208083018184528285546001808216600081146156ec576001811461570a57615742565b60028304607f16855260ff1983166040890152606088019350615742565b6002830480865261571a8a615ed6565b885b828110156157385781548b82016040015290840190880161571c565b8a01604001955050505b5091979650505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6000608082016001600160a01b0380881684526020818816818601526080604086015282875180855260a0870191508289019450855b8181101561581b5785518516835294830194918301916001016157fd565b50508581036060870152865180825290820193509150808601845b8381101561585257815185529382019390820190600101615836565b50929998505050505050505050565b6001600160a01b039390931683526001600160801b039190911660208301521515604082015260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b93845260208401929092526001600160401b03166040830152606082015260800190565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b6020808252601e908201527f4b61736869506169723a20616c726561647920696e697469616c697a65640000604082015260600190565b60208082526016908201527f45524332303a206e6f207a65726f206164647265737300000000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20616c6c2061726520736f6c76656e74000000000000604082015260600190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526016908201527f4b61736869506169723a2063616c6c206661696c656400000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526013908201527f4b61736869506169723a20626164207061697200000000000000000000000000604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b60208082526015908201527f4b61736869506169723a2063616e27742063616c6c0000000000000000000000604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526019908201527f4b61736869506169723a207573657220696e736f6c76656e7400000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b60208082526014908201527f4b617368693a2062656c6f77206d696e696d756d000000000000000000000000604082015260600190565b60208082526016908201527f45524332303a2062616c616e636520746f6f206c6f7700000000000000000000604082015260600190565b60208082526018908201527f4b61736869506169723a20536b696d20746f6f206d7563680000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20496e76616c69642073776170706572000000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b60208082526016908201527f4b61736869506169723a2072617465206e6f74206f6b00000000000000000000604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b60ff91909116815260200190565b6000808335601e19843603018112615e40578283fd5b8301803591506001600160401b03821115615e59578283fd5b602001915036819003821315610f8757600080fd5b6040518181016001600160401b0381118282101715615e8c57600080fd5b604052919050565b60006001600160401b03821115615ea9578081fd5b5060209081020190565b60006001600160401b03821115615ec8578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b83811015615efd578181015183820152602001615ee5565b838111156147725750506000910152565b6001600160a01b0381168114615f2357600080fd5b50565b8015158114615f2357600080fd5b6001600160801b0381168114615f2357600080fd5b60ff81168114615f2357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220835168e79bafbae4901d883291eac38a26a10a8b0acdc2ff0497426776e52e8f64736f6c634300060c003300000000000000000000000074c764d41b77dbbb4fe771dab1939b00b146894a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000074c764d41b77dbbb4fe771dab1939b00b146894a
-----Decoded View---------------
Arg [0] : bentoBox_ (address): 0x74c764d41b77dbbb4fe771dab1939b00b146894a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000074c764d41b77dbbb4fe771dab1939b00b146894a
Deployed ByteCode Sourcemap
30665:33988:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31937:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41405:363;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;33353:202::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3849:506::-;;;;;;;;;;-1:-1:-1;3849:506:0;;;;;:::i;:::-;;:::i;:::-;;10585:205;;;;;;;;;;-1:-1:-1;10585:205:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49247:187::-;;;;;;;;;;-1:-1:-1;49247:187:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33711:94::-;;;;;;;;;;;;;:::i;45506:199::-;;;;;;;;;;-1:-1:-1;45506:199:0;;;;;:::i;:::-;;:::i;32575:54::-;;;;;;;;;;-1:-1:-1;32575:54:0;;;;;:::i;:::-;;:::i;46849:154::-;;;;;;;;;;-1:-1:-1;46849:154:0;;;;;:::i;:::-;;:::i;9071:1219::-;;;;;;;;;;-1:-1:-1;9071:1219:0;;;;;:::i;:::-;;:::i;33563:96::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6492:268::-;;;;;;;;;;;;;:::i;32101:19::-;;;;;;;;;;;;;:::i;32917:27::-;;;;;;;;;;;;;:::i;64237:113::-;;;;;;;;;;-1:-1:-1;64237:113:0;;;;;:::i;:::-;;:::i;32209:35::-;;;;;;;;;;;;;:::i;63497:422::-;;;;;;;;;;;;;:::i;32726:49::-;;;;;;;;;;-1:-1:-1;32726:49:0;;;;;:::i;:::-;;:::i;48055:170::-;;;;;;;;;;-1:-1:-1;48055:170:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;35895:445::-;;;;;;:::i;:::-;;:::i;4437:340::-;;;;;;;;;;;;;:::i;54119:4503::-;;;;;;:::i;:::-;;:::i;31798:37::-;;;;;;;;;;;;;:::i;7299:44::-;;;;;;;;;;-1:-1:-1;7299:44:0;;;;;:::i;:::-;;:::i;32155:23::-;;;;;;;;;;;;;:::i;59231:4209::-;;;;;;;;;;-1:-1:-1;59231:4209:0;;;;;:::i;:::-;;:::i;32127:21::-;;;;;;;;;;;;;:::i;7533:41::-;;;;;;;;;;-1:-1:-1;7533:41:0;;;;;:::i;:::-;;:::i;32410:25::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;42956:467::-;;;;;;;;;;-1:-1:-1;42956:467:0;;;;;:::i;:::-;;:::i;44024:194::-;;;;;;;;;;-1:-1:-1;44024:194:0;;;;;:::i;:::-;;:::i;31964:41::-;;;;;;;;;;-1:-1:-1;31964:41:0;;;;;:::i;:::-;;:::i;2995:20::-;;;;;;;;;;;;;:::i;33151:194::-;;;;;;;;;;;;;:::i;8013:751::-;;;;;;;;;;-1:-1:-1;8013:751:0;;;;;:::i;:::-;;:::i;33088:28::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;31842:53::-;;;;;;;;;;;;;:::i;11419:665::-;;;;;;;;;;-1:-1:-1;11419:665:0;;;;;:::i;:::-;;:::i;32070:24::-;;;;;;;;;;;;;:::i;7404:64::-;;;;;;;;;;-1:-1:-1;7404:64:0;;;;;:::i;:::-;;:::i;3022:27::-;;;;;;;;;;;;;:::i;64528:122::-;;;;;;;;;;-1:-1:-1;64528:122:0;;;;;:::i;:::-;;:::i;36447:3227::-;;;;;;;;;;;;;:::i;32280:24::-;;;;;;;;;;;;;:::i;31937:20::-;;;-1:-1:-1;;;;;31937:20:0;;:::o;41405:363::-;41508:6;;:22;;-1:-1:-1;;;41508:22:0;;41451:12;;;;-1:-1:-1;;;;;41508:6:0;;;;:10;;:22;;41519:10;;41508:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41490:40;;-1:-1:-1;41490:40:0;-1:-1:-1;41543:218:0;;;;41571:12;:19;;;41610:21;;;;;;41586:4;;41610:21;:::i;:::-;;;;;;;;41543:218;;;-1:-1:-1;41737:12:0;;41543:218;41405:363;;:::o;33353:202::-;33471:10;;33392:13;;33471:21;;-1:-1:-1;;;;;33471:10:0;:19;:21::i;:::-;33499:5;;:16;;-1:-1:-1;;;;;33499:5:0;:14;:16::i;:::-;33522:6;;:23;;-1:-1:-1;;;33522:23:0;;-1:-1:-1;;;;;33522:6:0;;;;:11;;:23;;33534:10;;33522:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33522:23:0;;;;;;;;;;;;:::i;:::-;33432:114;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33418:129;;33353:202;:::o;3849:506::-;4905:5;;-1:-1:-1;;;;;4905:5:0;4891:10;:19;4883:64;;;;-1:-1:-1;;;4883:64:0;;;;;;;:::i;:::-;;;;;;;;;3988:6:::1;3984:364;;;-1:-1:-1::0;;;;;4042:22:0;::::1;::::0;::::1;::::0;:34:::1;;;4068:8;4042:34;4034:68;;;;-1:-1:-1::0;;;4034:68:0::1;;;;;;;:::i;:::-;4169:5;::::0;4148:37:::1;::::0;-1:-1:-1;;;;;4148:37:0;;::::1;::::0;4169:5:::1;::::0;4148:37:::1;::::0;4169:5:::1;::::0;4148:37:::1;4200:5;:16:::0;;-1:-1:-1;;;;;4200:16:0;::::1;-1:-1:-1::0;;;;;;4200:16:0;;::::1;;::::0;;;4231:12:::1;:25:::0;;;;::::1;::::0;;3984:364:::1;;;4313:12;:23:::0;;-1:-1:-1;;;;;;4313:23:0::1;-1:-1:-1::0;;;;;4313:23:0;::::1;;::::0;;3984:364:::1;3849:506:::0;;;:::o;10585:205::-;10678:10;10651:4;10668:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;10668:30:0;;;;;;;;;;:39;;;10723:37;10651:4;;10668:30;;10723:37;;;;10701:6;;10723:37;:::i;:::-;;;;;;;;-1:-1:-1;10778:4:0;10585:205;;;;;:::o;49247:187::-;49349:14;49376:8;:6;:8::i;:::-;49404:22;49411:2;49415:4;49421;49404:6;:22::i;:::-;49395:31;49247:187;-1:-1:-1;;;;49247:187:0:o;33711:94::-;33782:10;:15;-1:-1:-1;;;33782:15:0;;-1:-1:-1;;;;;33782:15:0;;33711:94::o;45506:199::-;45612:16;45641:8;:6;:8::i;:::-;45671:26;45681:2;45685:4;45691:5;45671:9;:26::i;32575:54::-;;;;;;;;;;;;;:::o;46849:154::-;46916:13;46942:8;:6;:8::i;:::-;46969:26;46982:2;46986:8;46969:12;:26::i;:::-;46961:34;46849:154;-1:-1:-1;;;46849:154:0:o;9071:1219::-;9185:4;9270:11;;9266:953;;-1:-1:-1;;;;;9319:15:0;;9298:18;9319:15;;;;;;;;;;;9357:20;;;;9349:55;;;;-1:-1:-1;;;9349:55:0;;;;;;;:::i;:::-;9433:2;-1:-1:-1;;;;;9425:10:0;:4;-1:-1:-1;;;;;9425:10:0;;9421:787;;-1:-1:-1;;;;;9483:15:0;;9456:24;9483:15;;;:9;:15;;;;;;;;9499:10;9483:27;;;;;;;;-1:-1:-1;;9634:37:0;;9630:251;;9724:6;9704:16;:26;;9696:63;;;;-1:-1:-1;;;9696:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9782:15:0;;;;;;:9;:15;;;;;;;;9798:10;9782:27;;;;;;;9812:25;;;9782:55;;9630:251;-1:-1:-1;;;;;9907:16:0;;9899:51;;;;-1:-1:-1;;;9899:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;10021:15:0;;;:9;:15;;;;;;;;;;;10039:19;;;10021:37;;10101:13;;;;;;:23;;;;;;9421:787;9266:953;;10249:2;-1:-1:-1;;;;;10234:26:0;10243:4;-1:-1:-1;;;;;10234:26:0;-1:-1:-1;;;;;;;;;;;10253:6:0;10234:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;10278:4:0;9071:1219;;;;;:::o;33563:96::-;33631:5;;33606;;33631:20;;-1:-1:-1;;;;;33631:5:0;:18;:20::i;:::-;33624:27;;33563:96;:::o;6492:268::-;6541:7;6622:9;6670:25;6659:36;;:93;;6718:34;6744:7;6718:25;:34::i;:::-;6659:93;;;6698:17;6659:93;6652:100;;;6492:268;:::o;32101:19::-;;;-1:-1:-1;;;;;32101:19:0;;:::o;32917:27::-;;;;:::o;64237:113::-;4905:5;;-1:-1:-1;;;;;4905:5:0;4891:10;:19;4883:64;;;;-1:-1:-1;;;4883:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64316:17:0;;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;-1:-1:-1;;64316:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64237:113::o;32209:35::-;;;;:::o;63497:422::-;63539:8;:6;:8::i;:::-;63558:14;63575;-1:-1:-1;;;;;63575:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63638:10;:29;-1:-1:-1;;;;;63698:17:0;;63608:27;63698:17;;;;;;;;;;;;;-1:-1:-1;;;;63638:29:0;;-1:-1:-1;;;;;63638:29:0;;63698:42;;63638:29;63698:21;:42::i;:::-;-1:-1:-1;;;;;63678:17:0;;:9;:17;;;;;;;;;;;:62;;;;63756:49;;63678:17;;:9;-1:-1:-1;;;;;;;;;;;63756:49:0;;;63785:19;;63756:49;:::i;:::-;;;;;;;;63816:10;:33;;-1:-1:-1;;;;;63816:33:0;;;63867:44;;-1:-1:-1;;;;;63867:44:0;;;;;;;63891:19;;63867:44;:::i;:::-;;;;;;;;63497:422;;:::o;32726:49::-;;;;;;;;;;;;;:::o;48055:170::-;48123:12;48137:13;48163:8:::1;:6;:8::i;:::-;48198:19;48206:2;48210:6;48198:7;:19::i;:::-;48182:35;;;;;;;;41026:43:::0;41037:10;41049:5;41056:12;;41026:10;:43::i;:::-;41018:81;;;;-1:-1:-1;;;41018:81:0;;;;;;;:::i;:::-;48055:170;;;;;:::o;35895:445::-;35981:10;;-1:-1:-1;;;;;35981:10:0;35973:33;35965:76;;;;-1:-1:-1;;;35965:76:0;;;;;;;:::i;:::-;36094:50;;;;36105:4;36094:50;:::i;:::-;36052:92;;36053:10;;;;36065:5;;36053:10;;36072:6;;36053:10;;36052:92;;36080:10;;36052:92;;;;;:::i;:::-;-1:-1:-1;36052:92:0;;-1:-1:-1;;;;;36052:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36171:10:0;;;36155:65;;;;-1:-1:-1;;;36155:65:0;;;;;;;:::i;:::-;-1:-1:-1;;36233:10:0;:67;;-1:-1:-1;;36233:67:0;34626:9;36233:67;;;35895:445::o;4437:340::-;4505:12;;-1:-1:-1;;;;;4505:12:0;4557:10;:27;;4549:72;;;;-1:-1:-1;;;4549:72:0;;;;;;;:::i;:::-;4680:5;;4659:42;;-1:-1:-1;;;;;4659:42:0;;;;4680:5;;4659:42;;4680:5;;4659:42;4712:5;:21;;-1:-1:-1;;;;;4712:21:0;;;-1:-1:-1;;;;;;4712:21:0;;;;;;4744:12;:25;;;;;;;4437:340::o;54119:4503::-;54270:14;54286;54313:24;;:::i;:::-;54353:9;54348:4116;54368:18;;;54348:4116;;;54408:12;54423:7;;54431:1;54423:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;54408:25;;54453:6;:17;;;54452:18;:33;;;;;54483:2;54474:6;:11;;;54452:33;54448:125;;;54506:8;:6;:8::i;:::-;54553:4;54533:17;;;:24;54448:125;54591:31;;;50014:2;54591:31;54587:3866;;;54644:12;54658:10;54670:9;54694:5;;54700:1;54694:8;;;;;;;;;;;;;;;;;;:::i;:::-;54683:45;;;;;;;:::i;:::-;54643:85;;;;;;54747:52;54761:2;54765:4;54771:27;54776:5;54783:6;54791;54771:4;:27::i;54747:52::-;54587:3866;;;;;;54825:26;;;49533:1;54825:26;54821:3632;;;54873:12;54887:10;54899:9;54923:5;;54929:1;54923:8;;;;;;;;;;;;;;;;;;:::i;:::-;54912:45;;;;;;;:::i;:::-;54872:85;;;;;;54985:48;54995:2;54999:4;55005:27;55010:5;55017:6;55025;55005:4;:27::i;:::-;54985:9;:48::i;:::-;54976:57;;54821:3632;;;;;;55059:22;;;49580:1;55059:22;55055:3398;;;55103:11;55116:10;55128:9;55152:5;;55158:1;55152:8;;;;;;;;;;;;;;;;;;:::i;:::-;55141:45;;;;;;;:::i;:::-;55102:84;;;;;;55205:44;55212:2;55216:4;55222:26;55227:4;55233:6;55241;55222:4;:26::i;:::-;55205:6;:44::i;:::-;;55055:3398;;;;;;55275:29;;;49634:1;55275:29;55271:3182;;;55326:15;55343:10;55368:5;;55374:1;55368:8;;;;;;;;;;;;;;;;;;:::i;:::-;55357:39;;;;;;;:::i;:::-;55325:71;;;;55424:48;55437:2;55441:30;55446:8;55456:6;55464;55441:4;:30::i;:::-;55424:12;:48::i;:::-;55415:57;;55271:3182;;;;;55498:34;;;49693:1;55498:34;55494:2959;;;55554:12;55568:10;55593:5;;55599:1;55593:8;;;;;;;;;;;;;;;;;;:::i;:::-;55582:39;;;;;;;:::i;:::-;55553:68;;;;55640:50;55658:2;55662:27;55667:5;55674:6;55682;55662:4;:27::i;:::-;55640:17;:50::i;:::-;-1:-1:-1;;55737:4:0;55709:32;;55494:2959;;;55767:23;;;49741:1;55767:23;55763:2690;;;55812:13;55827:10;55852:5;;55858:1;55852:8;;;;;;;;;;;;;;;;;;:::i;:::-;55841:39;;;;;;;:::i;:::-;55811:69;;;;55918:41;55926:2;55930:28;55935:6;55943;55951;55930:4;:28::i;:::-;55918:7;:41::i;:::-;56006:4;55978:32;;55899:60;;-1:-1:-1;55899:60:0;-1:-1:-1;55763:2690:0;;-1:-1:-1;;55763:2690:0;;56036:37;;;50077:2;56036:37;56032:2421;;;56095:16;56113:15;56130;56160:5;;56166:1;56160:8;;;;;;;;;;;;;;;;;;:::i;:::-;56149:46;;;;;;;:::i;:::-;56094:101;;;;;;56215:12;56229;56245:20;:18;:20::i;:::-;56214:51;;;;56294:11;56293:12;:23;;;;56309:7;56293:23;56292:43;;;;;56328:7;56321:4;:14;56292:43;:79;;;;-1:-1:-1;56340:12:0;;;:30;;;56363:7;56356:4;:14;56340:30;56284:114;;;;-1:-1:-1;;;56284:114:0;;;;;;;:::i;:::-;56032:2421;;;;;;;;56424:34;;;50404:2;56424:34;56420:2033;;;56480:12;56494:23;56519:13;56534:7;56543:9;56554;56599:5;;56605:1;56599:8;;;;;;;;;;;;;;;;;;:::i;:::-;56588:71;;;;;;;:::i;:::-;56479:180;;;;;;;;;;;;56678:8;-1:-1:-1;;;;;56678:34:0;;56713:4;56719:15;56736:8;56746:1;56749;56752;56678:76;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56420:2033;;;;;;;;;56780:30;;;50164:2;56780:30;56776:1677;;;56850:50;56864:5;;56870:1;56864:8;;;;;;;;;;;;;;;;;;:::i;:::-;56850:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56874:6:0;;-1:-1:-1;56874:6:0;;-1:-1:-1;56881:1:0;;-1:-1:-1;56874:9:0;;;;;;;;;;;;;56885:6;56893;56850:13;:50::i;:::-;56831:69;;-1:-1:-1;56831:69:0;-1:-1:-1;56776:1677:0;;;56926:31;;;50221:2;56926:31;56922:1531;;;56997:40;57012:5;;57018:1;57012:8;;;;;;;;;;;;;;;;;;:::i;:::-;56997:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57022:6:0;;-1:-1:-1;57030:6:0;;-1:-1:-1;56997:14:0;;-1:-1:-1;56997:40:0:i;56922:1531::-;57063:31;;;50278:2;57063:31;57059:1394;;;57116:12;57130:10;57142:12;57169:5;;57175:1;57169:8;;;;;;;;;;;;;;;;;;:::i;:::-;57158:47;;;;;;;:::i;:::-;57115:90;;;;;;57224:8;-1:-1:-1;;;;;57224:17:0;;57242:5;57249:10;57261:2;57265:27;57270:5;57277:6;57285;57265:4;:27::i;:::-;57224:69;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57059:1394;;;;;;57319:40;;;50344:2;57319:40;57315:1138;;;57381:12;57395:20;57417:23;57455:5;;57461:1;57455:8;;;;;;;;;;;;;;;;;;:::i;:::-;57444:52;;;;;;;:::i;:::-;57380:116;;;;;;57515:8;-1:-1:-1;;;;;57515:25:0;;57541:5;57548:10;57560:3;57565:6;57515:57;;;;;;;;;;;;;;;;;;:::i;57315:1138::-;57598:21;;;50500:2;57598:21;57594:859;;;57641:23;57666:18;57688:42;57694:6;;57701:1;57694:9;;;;;;;;;;;;;57705:5;;57711:1;57705:8;;;;;;;;;;;;;;;;;;:::i;:::-;57688:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57715:6:0;;-1:-1:-1;57723:6:0;;-1:-1:-1;57688:5:0;;-1:-1:-1;57688:42:0:i;:::-;57640:90;;;;57755:12;:17;;57771:1;57755:17;57751:243;;;57819:10;57808:33;;;;;;;;;;;;:::i;:::-;57797:44;;57751:243;;;57871:12;:17;;57887:1;57871:17;57867:127;;;57943:10;57932:42;;;;;;;;;;;;:::i;:::-;57913:61;;-1:-1:-1;57913:61:0;-1:-1:-1;57867:127:0;57594:859;;;;;58019:32;;;49798:1;58019:32;58015:438;;;58072:11;58097:5;;58103:1;58097:8;;;;;;;;;;;;;;;;;;:::i;:::-;58086:30;;;;;;;:::i;:::-;58161:5;;58072:44;;-1:-1:-1;;;;;;58144:8:0;:16;;;;;58161:5;58168:55;58190:26;58072:44;58201:6;58209;58190:4;:26::i;:::-;58168:21;;;;;;;;;:11;:21;-1:-1:-1;;;;;58168:21:0;;;;;-1:-1:-1;;;58168:21:0;;;;;;;;;58218:4;58168:21;:55::i;:::-;58225:4;58144:86;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58135:95;;58015:438;;;;58256:31;;;49854:1;58256:31;58252:201;;;58308:13;58335:5;;58341:1;58335:8;;;;;;;;;;;;;;;;;;:::i;:::-;58324:30;;;;;;;:::i;:::-;58308:46;;58382:55;58401:28;58406:6;58414;58422;58401:4;:28::i;:::-;58382:18;;;;;;;;;:11;:18;-1:-1:-1;;;;;58382:18:0;;;;;-1:-1:-1;;;58382:18:0;;;;;;;;;58431:5;58382:18;:55::i;:::-;58373:64;;58252:201;;-1:-1:-1;54388:3:0;;54348:4116;;;-1:-1:-1;58480:25:0;;58476:139;;;58530:43;58541:10;58553:5;58560:12;;58530:10;:43::i;:::-;58522:81;;;;-1:-1:-1;;;58522:81:0;;;;;;;:::i;:::-;54119:4503;;;;;;;;;;:::o;31798:37::-;;;:::o;7299:44::-;;;;;;;;;;;;;;:::o;32155:23::-;;;;;;;;;;;;;;;-1:-1:-1;;32155:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59231:4209::-;59493:21;59518:20;:18;:20::i;:::-;59490:48;;;59549:8;:6;:8::i;:::-;59570:26;59607:23;59641:21;59673:26;;:::i;:::-;-1:-1:-1;59673:40:0;;;;;;;;;59702:11;59673:40;-1:-1:-1;;;;;59673:40:0;;;;;-1:-1:-1;;;59673:40:0;;;;;;;;59724:28;;:::i;:::-;59771:10;;59755:27;;-1:-1:-1;;;59755:27:0;;-1:-1:-1;;;;;59755:8:0;:15;;;;;:27;;59771:10;;;;;59755:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59724:58;;59798:9;59793:1492;59813:16;;;59793:1492;;;59851:12;59866:5;;59872:1;59866:8;;;;;;;;;;;;;;;;;;;;:::i;:::-;59851:23;;59894:37;59905:4;59911;59917:13;59894:10;:37::i;:::-;59889:1385;;-1:-1:-1;;;;;60042:20:0;;59952:18;60042:20;;;:14;:20;;;;;;;60098:14;;60113:1;60098:17;;;;;;;;;;;;;:39;:81;;60162:14;;60177:1;60162:17;;;;;;;;;;;;;60098:81;;;60140:19;60098:81;60085:94;-1:-1:-1;60225:35:0;:19;60085:94;60225:23;:35::i;:::-;-1:-1:-1;;;;;60202:20:0;;;;;;:14;:20;;;;;:58;;;;:20;-1:-1:-1;60321:41:0;:12;60344:10;60202:20;60321:22;:41::i;:::-;60298:64;-1:-1:-1;60381:23:0;60428:254;60568:58;60476:59;60521:13;60476:40;60298:64;35074:6;60476:16;:40::i;:::-;:44;;:59::i;:::-;:151;;;;;60428:14;;60476:151;;60654:5;60428:21;:254::i;:::-;-1:-1:-1;;;;;60731:25:0;;;;;;:19;:25;;;;;;60381:301;;-1:-1:-1;60731:46:0;;60381:301;60731:29;:46::i;:::-;-1:-1:-1;;;;;60703:25:0;;;;;;;:19;:25;;;;;:74;;;;60827:22;;;:46;;60865:7;60827:46;;;60852:2;60827:46;-1:-1:-1;;;;;60801:90:0;60821:4;-1:-1:-1;;;;;60801:90:0;;60875:15;60801:90;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;60915:96:0;;;;60924:22;;;:54;;60970:7;60924:54;;;60949:10;60924:54;-1:-1:-1;;;;;60915:96:0;;60986:12;61000:10;60915:96;;;;;;;:::i;:::-;;;;;;;;61085:39;:18;61108:15;61085:22;:39::i;:::-;61064:60;-1:-1:-1;61161:33:0;:15;61181:12;61161:19;:33::i;:::-;61143:51;-1:-1:-1;61229:29:0;:13;61247:10;61229:17;:29::i;:::-;61213:45;;59889:1385;;;;-1:-1:-1;59831:3:0;;59793:1492;;;-1:-1:-1;61303:20:0;61295:59;;;;-1:-1:-1;;;61295:59:0;;;;;;;:::i;:::-;61388:49;61413:23;:15;:21;:23::i;:::-;61388:20;;-1:-1:-1;;;;;61388:24:0;;;:49::i;:::-;-1:-1:-1;;;;;61365:72:0;;;61468:44;61490:21;:13;:19;:21::i;:::-;61468:17;;;;-1:-1:-1;;;;;61468:21:0;;;:44::i;:::-;-1:-1:-1;;;;;61448:64:0;;;:17;;;:64;;;61523:26;;:11;:26;;-1:-1:-1;;;;;;61523:26:0;;;;;;;;;;;-1:-1:-1;;;61523:26:0;;;;;;61583:20;;:44;;61608:18;61583:24;:44::i;:::-;61560:20;:67;61682:5;;61665:46;;-1:-1:-1;;;61665:46:0;;61640:22;;-1:-1:-1;;;;;61665:8:0;:16;;;;;:46;;61682:5;;61689:15;;61682:5;;61665:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61640:71;;61729:4;61724:1709;;61849:32;;-1:-1:-1;;;61849:32:0;;-1:-1:-1;;;;;61849:14:0;:23;;;;:32;;61873:7;;61849:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61841:71;;;;-1:-1:-1;;;61841:71:0;;;;;;;:::i;:::-;62014:10;;61996:82;;-1:-1:-1;;;61996:82:0;;-1:-1:-1;;;;;61996:8:0;:17;;;;;:82;;62014:10;;;;;62034:4;;62049:7;;62059:18;;61996:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62106:10:0;;62118:5;;62093:82;;-1:-1:-1;;;62093:82:0;;-1:-1:-1;;;;;62093:12:0;;;;-1:-1:-1;62093:12:0;;-1:-1:-1;62093:82:0;;62106:10;;;62118:5;;62133:4;;62140:14;;62156:18;;62093:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;62269:10:0;:18;62235:5;;62216:40;;-1:-1:-1;;;62216:40:0;;62192:21;;62216:73;;-1:-1:-1;;;;;62269:18:0;;;;-1:-1:-1;;;;;62216:8:0;:18;;;;;:40;;62235:5;;;;;62250:4;;62216:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;:73::i;:::-;62192:97;-1:-1:-1;62304:18:0;62325:33;62192:97;62343:14;62325:17;:33::i;:::-;62304:54;-1:-1:-1;62373:16:0;35290:3;62392:28;62304:54;35223:5;62392:14;:28::i;:::-;:51;;;;;;62373:70;;62538:8;-1:-1:-1;;;;;62538:17:0;;62556:5;;;;;;;;;-1:-1:-1;;;;;62556:5:0;62571:4;62578:14;-1:-1:-1;;;;;62578:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62602:8;62538:73;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62647:59;62670:35;:27;62688:8;62670:13;:17;;:27;;;;:::i;:::-;:33;:35::i;:::-;62647:10;:18;-1:-1:-1;;;;;62647:18:0;;:22;:59::i;:::-;62626:10;:80;;-1:-1:-1;;;;;;62626:80:0;-1:-1:-1;;;;;62626:80:0;;;;;;;;;;62764:4;-1:-1:-1;;;;;62726:73:0;;;62771:24;:10;62786:8;62771:14;:24::i;:::-;62797:1;62726:73;;;;;;;:::i;:::-;;;;;;;;61724:1709;;;;;;63005:10;;-1:-1:-1;;;;;62987:8:0;:17;;;;;63005:10;;;;63025:4;;63032:22;;;:46;;63070:7;63032:46;;;63057:2;63032:46;63080:18;62987:112;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;63118:22:0;;;63114:142;;63174:10;;63186:5;;63161:79;;-1:-1:-1;;;63161:79:0;;-1:-1:-1;;;;;63161:12:0;;;;;;:79;;63174:10;;;;63186:5;;63193:10;;63205:14;;63221:18;;63161:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63114:142;63290:5;;63272:67;;-1:-1:-1;;;63272:67:0;;-1:-1:-1;;;;;63272:8:0;:17;;;;;:67;;63290:5;;;;;63297:10;;63317:4;;63324:14;;63272:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63375:46;63398:22;:14;:20;:22::i;63375:46::-;63354:10;:67;;-1:-1:-1;;;;;;63354:67:0;-1:-1:-1;;;;;63354:67:0;;;;;;;;;;61724:1709;59231:4209;;;;;;;;;;;;;;:::o;32127:21::-;;;-1:-1:-1;;;;;32127:21:0;;:::o;7533:41::-;;;;;;;;;;;;;:::o;32410:25::-;;;-1:-1:-1;;;;;32410:25:0;;;;-1:-1:-1;;;32410:25:0;;;;:::o;42956:467::-;-1:-1:-1;;;;;43095:23:0;;;;;;:19;:23;;;;;;:34;;43123:5;43095:27;:34::i;:::-;-1:-1:-1;;;;;43069:23:0;;;;;;:19;:23;;;;;:60;43174:20;;43228:34;43174:20;43256:5;43228:27;:34::i;:::-;43205:20;:57;43284:10;;43273:60;;-1:-1:-1;;;;;43284:10:0;43296:5;43303:23;43328:4;43273:10;:60::i;:::-;43405:2;-1:-1:-1;;;;;43349:66:0;43366:4;:37;;43393:10;43366:37;;;43381:8;43366:37;-1:-1:-1;;;;;43349:66:0;;43409:5;43349:66;;;;;;:::i;:::-;;;;;;;;42956:467;;;;:::o;44024:194::-;44163:8:::1;:6;:8::i;:::-;44182:28;44200:2;44204:5;44182:17;:28::i;:::-;41026:43:::0;41037:10;41049:5;41056:12;;41026:10;:43::i;:::-;41018:81;;;;-1:-1:-1;;;41018:81:0;;;;;;;:::i;:::-;44024:194;;:::o;31964:41::-;;;;;;;;;;;;;;;:::o;2995:20::-;;;-1:-1:-1;;;;;2995:20:0;;:::o;33151:194::-;33255:10;;33192:13;;33255:23;;-1:-1:-1;;;;;33255:10:0;:21;:23::i;:::-;33285:5;;:18;;-1:-1:-1;;;;;33285:5:0;:16;:18::i;:::-;33310:6;;:25;;-1:-1:-1;;;33310:25:0;;-1:-1:-1;;;;;33310:6:0;;;;:13;;:25;;33324:10;;33310:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33310:25:0;;;;;;;;;;;;:::i;:::-;33232:104;;;;;;;;;;:::i;8013:751::-;8075:4;8166:11;;8162:525;;8225:10;8194:18;8215:21;;;;;;;;;;;8259:20;;;;8251:55;;;;-1:-1:-1;;;8251:55:0;;;;;;;:::i;:::-;8325:10;-1:-1:-1;;;;;8325:16:0;;;8321:355;;-1:-1:-1;;;;;8370:16:0;;8362:51;;;;-1:-1:-1;;;8362:51:0;;;;;;;:::i;:::-;8493:10;8483:9;:21;;;;;;;;;;;8507:19;;;8483:43;;-1:-1:-1;;;;;8569:13:0;;;;;;:23;;;;;;8321:355;8162:525;;8723:2;-1:-1:-1;;;;;8702:32:0;8711:10;-1:-1:-1;;;;;8702:32:0;-1:-1:-1;;;;;;;;;;;8727:6:0;8702:32;;;;;;:::i;33088:28::-;;;-1:-1:-1;;;;;33088:28:0;;;;-1:-1:-1;;;33088:28:0;;;;;;-1:-1:-1;;;33088:28:0;;-1:-1:-1;;;;;33088:28:0;;:::o;31842:53::-;;;:::o;11419:665::-;-1:-1:-1;;;;;11630:20:0;;11622:57;;;;-1:-1:-1;;;11622:57:0;;;;;;;:::i;:::-;11716:8;11698:15;:26;11690:53;;;;-1:-1:-1;;;11690:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11776:155:0;;11818:21;11865:14;;;:6;:14;;;;;;;;;:16;;11776:128;11865:16;;;;;;11807:85;;11776:128;;11786:108;;11807:85;;10952:66;;11925:6;;11849:7;;11858:5;;11865:16;11883:8;;11807:85;;:::i;:::-;;;;;;;;;;;;;11797:96;;;;;;11786:10;:108::i;:::-;11896:1;11899;11902;11776:128;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11776:155:0;;11754:229;;;;-1:-1:-1;;;11754:229:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11994:17:0;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;;:34;;;12044:32;;;;;12023:5;;12044:32;:::i;:::-;;;;;;;;11419:665;;;;;;;:::o;32070:24::-;;;-1:-1:-1;;;;;32070:24:0;;:::o;7404:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;3022:27::-;;;-1:-1:-1;;;;;3022:27:0;;:::o;64528:122::-;4905:5;;-1:-1:-1;;;;;4905:5:0;4891:10;:19;4883:64;;;;-1:-1:-1;;;4883:64:0;;;;;;;:::i;:::-;64592:5:::1;:16:::0;;-1:-1:-1;;;;;;64592:16:0::1;-1:-1:-1::0;;;;;64592:16:0;::::1;::::0;;::::1;::::0;;;64624:18:::1;::::0;::::1;::::0;-1:-1:-1;;64624:18:0::1;64528:122:::0;:::o;36447:3227::-;36483:29;;:::i;:::-;-1:-1:-1;36483:42:0;;;;;;;;36515:10;36483:42;-1:-1:-1;;;;;36483:42:0;;;;;-1:-1:-1;;;36483:42:0;;;;;;;;;-1:-1:-1;;;36483:42:0;;;-1:-1:-1;;;;;36483:42:0;;;;;;;;;36612:15;:41;;36664:55;;36701:7;;;;36664:55;-1:-1:-1;;;;;36762:15:0;36729:49;:23;;;:49;36791:26;;:::i;:::-;-1:-1:-1;36791:40:0;;;;;;;;;36820:11;36791:40;-1:-1:-1;;;;;36791:40:0;;;;;-1:-1:-1;;;36791:40:0;;;;;;;;;;36842:413;;36954:29;;-1:-1:-1;;;;;36954:61:0;34626:9;36954:61;36950:234;;34626:9;37036:60;;;37120:48;;;;;;37036:29;;;;;;37120:48;:::i;:::-;;;;;;;;36950:234;-1:-1:-1;;37198:24:0;;:10;:24;;;;;;;;;;;-1:-1:-1;;37198:24:0;;;-1:-1:-1;;;;;37198:24:0;;;;-1:-1:-1;;37198:24:0;-1:-1:-1;;;37198:24:0;;;;;;;;;;;;-1:-1:-1;;;;;37198:24:0;;;-1:-1:-1;;;37198:24:0;;;;;;;;37237:7;;36842:413;37267:19;37301;37335:25;;:::i;:::-;-1:-1:-1;37335:38:0;;;;;;;;;37363:10;37335:38;-1:-1:-1;;;;;37335:38:0;;;;;-1:-1:-1;;;37335:38:0;;;;;;;;;37462:29;;37436:20;;37512:4;;37428:81;;37497:11;;37428:64;;:29;;-1:-1:-1;;;;;37428:64:0;:33;:64::i;:81::-;:88;;;;;;37414:102;;37550:45;37575:19;:11;:17;:19::i;:::-;37550:20;;-1:-1:-1;;;;;37550:24:0;;;:45::i;:::-;-1:-1:-1;;;;;37527:68:0;;;;37650:5;;37657:19;;37632:52;;-1:-1:-1;;;37632:52:0;;37527:20;;37632:78;;37527:68;;-1:-1:-1;;;;;37632:8:0;:17;;;;;:52;;37650:5;;;37657:19;37527:20;;37632:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;:78::i;:::-;37606:104;-1:-1:-1;37723:17:0;35290:3;37743:29;:11;35223:5;37743:15;:29::i;:::-;:52;;;;;;37723:72;;37888:15;37854:31;37868:11;:16;;;-1:-1:-1;;;;;37854:31:0;:9;:13;;:31;;;;:::i;:::-;:49;;;;;;37840:63;;37947:55;37982:19;:11;:17;:19::i;:::-;37947:30;;;;-1:-1:-1;;;;;37947:34:0;;;:55::i;:::-;-1:-1:-1;;;;;37914:88:0;:30;;;:88;38031:41;38052:19;:11;:17;:19::i;:::-;38031:16;;;;-1:-1:-1;;;;;38031:20:0;;;:41::i;:::-;38013:10;:59;;-1:-1:-1;;;;;38013:59:0;;;-1:-1:-1;;;38013:59:0;;;;;;;;;38083:26;;:11;:26;;;;;;-1:-1:-1;;;;;;38083:26:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38236:15:0;;38177:56;;34342:4;38177:33;:56::i;:::-;:74;;;;;;38155:96;;34203:4;38266:11;:40;38262:1273;;;38323:19;34203:4;38345:65;34558:4;38345:43;34203:4;38376:11;38345:30;:43::i;:65::-;:94;;;;;;;-1:-1:-1;38454:13:0;38470:70;38494:45;38527:11;38494:28;38345:94;;38494:15;:28::i;:45::-;34888:8;;38470:23;:70::i;:::-;38602:29;;38454:86;;-1:-1:-1;38454:86:0;;38594:63;;-1:-1:-1;;;;;38594:38:0;34888:8;38594:42;:63::i;:::-;:71;;;;;;-1:-1:-1;;;;;38555:111:0;;;;34713:8;-1:-1:-1;38683:180:0;;;34713:8;38767:59;;38683:180;38262:1273;;;;;34275:4;38884:11;:40;38880:655;;;38941:18;34462:45;38962:65;34397:4;38962:43;:11;34275:4;38962:15;:43::i;:65::-;:94;;;;;;;-1:-1:-1;39071:13:0;39087:68;39111:43;39142:11;39111:26;38962:94;;39111:14;:26::i;39087:68::-;39209:29;;39071:84;;-1:-1:-1;39170:28:0;;34888:8;;39201:49;;-1:-1:-1;;;;;39201:38:0;39071:84;39201:42;:49::i;:::-;:71;;;;;;;-1:-1:-1;34802:12:0;39291:50;;39287:162;;;-1:-1:-1;34802:12:0;39287:162;-1:-1:-1;;;;;39463:60:0;;;-1:-1:-1;;38880:655:0;39588:29;;39552:79;;;;;;39562:11;;39575;;39619;;39552:79;:::i;:::-;;;;;;;;-1:-1:-1;;39642:24:0;;:10;:24;;;;;;;;;;;-1:-1:-1;;39642:24:0;;;-1:-1:-1;;;;;39642:24:0;;;;-1:-1:-1;;39642:24:0;-1:-1:-1;;;39642:24:0;;;;;;;;;;;;-1:-1:-1;;;;;39642:24:0;;;-1:-1:-1;;;39642:24:0;;;;;;;;;-1:-1:-1;;;;;;36447:3227:0;:::o;32280:24::-;;;-1:-1:-1;;;;;32280:24:0;;;;-1:-1:-1;;;32280:24:0;;;;:::o;18310:244::-;18453:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18453:32:0;-1:-1:-1;;;18453:32:0;;;18427:59;;18365:13;;18392:12;;18365:13;;-1:-1:-1;;;;;18427:25:0;;;:59;;18453:32;18427:59;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18391:95;;;;18504:7;:42;;;;;;;;;;;;;;;-1:-1:-1;;;18504:42:0;;;;;;18514:24;18533:4;18514:18;:24::i;:::-;18497:49;;;;18310:244;;;;:::o;48283:571::-;48439:15;;;;;;;;;:11;:15;-1:-1:-1;;;;;48439:15:0;;;;;-1:-1:-1;;;48439:15:0;;;;;;;;48388:14;;48439:27;;48455:4;48461;48439:15;:27::i;:::-;48415:51;;48416:11;48415:51;;;;;;;-1:-1:-1;;;;;48415:51:0;;;-1:-1:-1;;;48415:51:0;;;;-1:-1:-1;;;;;;48415:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;48498:18:0;;48416:11;48498:18;;;:14;:18;;;;;;;;48415:51;;-1:-1:-1;48498:28:0;;48521:4;48498:22;:28::i;:::-;-1:-1:-1;;;;;48477:18:0;;;;;;;:14;:18;;;;;;:49;;;;48572:5;;48555:37;;-1:-1:-1;;;48555:37:0;;48477:18;;48555:8;:16;;;;;:37;;48572:5;;;;48579:6;;48572:5;;48555:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48624:10;:18;48664:5;;48539:53;;-1:-1:-1;;;;;;48624:18:0;;48653:51;;-1:-1:-1;;;;;48664:5:0;48539:53;48624:18;48699:4;48653:10;:51::i;:::-;48736:29;48751:13;:5;:11;:13::i;:::-;-1:-1:-1;;;;;48736:14:0;;;;:29::i;:::-;48715:10;:50;;-1:-1:-1;;;;;;48715:50:0;-1:-1:-1;;;;;48715:50:0;;;;;;;;;;-1:-1:-1;;;;;48781:65:0;;48790:4;:37;;48817:10;48790:37;;;48805:8;48790:37;-1:-1:-1;;;;;48781:65:0;;48833:6;48841:4;48781:65;;;;;;;:::i;:::-;;;;;;;;48283:571;;;;;;;:::o;44279:827::-;44388:16;44417:25;;:::i;:::-;-1:-1:-1;44417:38:0;;;;;;;;44445:10;44417:38;-1:-1:-1;;;;;44417:38:0;;;;;;-1:-1:-1;;;44417:38:0;;;;;;;;;44580:5;;44587:11;:19;44563:50;;-1:-1:-1;;;44563:50:0;;44417:38;;;;-1:-1:-1;;;;;;;44563:8:0;:16;;;;;:50;;44580:5;;;44587:19;;44417:38;;44563:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44541:19;;-1:-1:-1;;;;;44541:72:0;;;-1:-1:-1;44635:13:0;;:62;;44689:8;44659:27;44669:11;:16;;;-1:-1:-1;;;;;44659:27:0;:5;:9;;:27;;;;:::i;:::-;:38;;;;;;44635:62;;;44651:5;44635:62;44624:73;;44753:4;44712:38;44733:16;:8;:14;:16::i;:::-;44712;;;;-1:-1:-1;;;;;44712:20:0;;;:38::i;:::-;-1:-1:-1;;;;;44712:45:0;;44708:86;;;44781:1;44774:8;;;;;;;44708:86;44817:32;:11;44833:5;44840:8;44817:15;:32::i;:::-;44804:45;;:10;:45;;;;;;;-1:-1:-1;;;;;44804:45:0;;;-1:-1:-1;;;44804:45:0;;;;-1:-1:-1;;;;;;44804:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;44876:13:0;;44804:45;44876:13;;;;;;;;;;;:27;;44894:8;44876:17;:27::i;:::-;-1:-1:-1;;;;;44860:13:0;;:9;:13;;;;;;;;;;;:43;;;;44919:34;;44860:13;;:9;-1:-1:-1;;;;;;;;;;;44919:34:0;;;44944:8;;44919:34;:::i;:::-;;;;;;;;44975:5;;44964:47;;-1:-1:-1;;;;;44975:5:0;44982;44989:15;45006:4;44964:10;:47::i;:::-;45078:2;-1:-1:-1;;;;;45027:71:0;45039:4;:37;;45066:10;45039:37;;;45054:8;45039:37;-1:-1:-1;;;;;45027:71:0;;45082:5;45089:8;45027:71;;;;;;;:::i;:::-;;;;;;;;44279:827;;;;;;;;:::o;45769:798::-;45839:13;45865:25;;:::i;:::-;-1:-1:-1;45865:38:0;;;;;;;;45893:10;45865:38;-1:-1:-1;;;;;45865:38:0;;;;;-1:-1:-1;;;45865:38:0;;;;;;;;;45972:5;;45979:11;:19;45955:50;;-1:-1:-1;;;45955:50:0;;45865:38;;-1:-1:-1;;;;;;;45955:8:0;:16;;;;;:50;;45972:5;;;45979:19;;;45865:38;;45955:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45933:19;;46049:16;;;;-1:-1:-1;;;;;45933:72:0;;;;;;;;-1:-1:-1;46024:41:0;:22;:8;45933:72;46024:12;:22::i;:::-;:41;;;;;46110:10;46100:9;:21;;;;;;;;;;;46024:41;;;;-1:-1:-1;46100:35:0;;46126:8;46100:25;:35::i;:::-;46086:10;46076:9;:21;;;;;;;;;;;:59;;;;46151:42;;-1:-1:-1;;;;;;;;;;;46151:42:0;;;46184:8;;46151:42;:::i;:::-;;;;;;;;46226:38;46250:13;:5;:11;:13::i;46226:38::-;-1:-1:-1;;;;;46204:60:0;;;46294:38;46315:16;:8;:14;:16::i;46294:38::-;-1:-1:-1;;;;;46275:57:0;:16;;;:57;;;46371:4;-1:-1:-1;46351:24:0;46343:57;;;;-1:-1:-1;;;46343:57:0;;;;;;;:::i;:::-;46411:24;;:10;:24;;;;;;-1:-1:-1;;;;;46411:24:0;;;-1:-1:-1;;;46411:24:0;;;;-1:-1:-1;;;;;;46411:24:0;;;;;;;;;;;;;;46451:47;;-1:-1:-1;;;;;46451:47:0;;;46466:10;;46451:47;;;;46482:5;;46489:8;;46451:47;:::i;:::-;;;;;;;;46527:5;;46509:50;;-1:-1:-1;;;46509:50:0;;-1:-1:-1;;;;;46509:8:0;:17;;;;;:50;;46527:5;;;;;46542:4;;46549:2;;46553:5;;46509:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45769:798;;;;;;:::o;18761:263::-;18900:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18900:36:0;-1:-1:-1;;;18900:36:0;;;18874:63;;18820:5;;;;18853:17;;-1:-1:-1;;;;;18874:25:0;;;:63;;18900:36;18874:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18838:99;;;;18955:7;:28;;;;;18966:4;:11;18981:2;18966:17;18955:28;:61;;19014:2;18955:61;;;18997:4;18986:25;;;;;;;;;;;;:::i;5777:187::-;5851:7;5367:68;5932:7;5949:4;5888:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5878:78;;;;;;5871:85;;5777:187;;;:::o;1278:141::-;1371:5;;;1366:16;;;;1358:53;;;;-1:-1:-1;;;1358:53:0;;;;;;;:::i;47062:798::-;47125:12;;;35420:3;47185:30;:6;35346:2;47185:10;:30::i;:::-;:61;;;;;;;-1:-1:-1;47323:44:0;47339:21;:6;47185:61;47339:10;:21::i;:::-;47323:15;;;;;;;;;:11;:15;-1:-1:-1;;;;;47323:15:0;;;;;-1:-1:-1;;;47323:15:0;;;;;;;;;47362:4;47323:15;:44::i;:::-;47301:66;;47302:11;47301:66;;;;;;;-1:-1:-1;;;;;47301:66:0;;;-1:-1:-1;;;47301:66:0;;;;-1:-1:-1;;;;;;47301:66:0;;;;;;;;;;;;;;47422:10;47302:11;47407:26;;;:14;:26;;;;;;;;47301:66;;-1:-1:-1;47407:36:0;;47301:66;47407:30;:36::i;:::-;47393:10;47378:26;;;;:14;:26;;;;;;;:65;;;;47459:50;;-1:-1:-1;;;;;47459:50:0;;;47393:10;47459:50;;;;47485:6;;47493:9;;47504:4;;47459:50;:::i;:::-;;;;;;;;47547:5;;47530:38;;-1:-1:-1;;;47530:38:0;;-1:-1:-1;;;;;47530:8:0;:16;;;;;:38;;47547:5;;;;;47554:6;;47547:5;;47530:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47522:46;;47579:25;;:::i;:::-;-1:-1:-1;47579:38:0;;;;;;;;;47607:10;47579:38;-1:-1:-1;;;;;47579:38:0;;;;;-1:-1:-1;;;47579:38:0;;;;;;;;;;47656:4;-1:-1:-1;47636:24:0;47628:57;;;;-1:-1:-1;;;47628:57:0;;;;;;;:::i;:::-;47718:38;47742:13;:5;:11;:13::i;:::-;47718:19;;-1:-1:-1;;;;;47718:23:0;;;:38::i;:::-;-1:-1:-1;;;;;47696:60:0;;;;;;47767:10;:24;;;;;;;;-1:-1:-1;;;47767:24:0;-1:-1:-1;;;;;;47767:24:0;;;;;;;;;;;;47820:5;;47802:50;;-1:-1:-1;;;47802:50:0;;-1:-1:-1;;;;;47802:8:0;:17;;;;;:50;;47820:5;;;;;47835:4;;47842:2;;47846:5;;47802:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47062:798;;;;;;;:::o;39896:964::-;-1:-1:-1;;;;;40109:20:0;;40021:4;40109:20;;;:14;:20;;;;;;40144:15;40140:32;;40168:4;40161:11;;;;;40140:32;-1:-1:-1;;;;;40209:25:0;;40183:23;40209:25;;;:19;:25;;;;;;40249:20;40245:38;;40278:5;40271:12;;;;;;40245:38;40296:26;;:::i;:::-;-1:-1:-1;40296:40:0;;;;;;;;;40325:11;40296:40;-1:-1:-1;;;;;40296:40:0;;;;;;-1:-1:-1;;;40296:40:0;;;;;;;;;;;40777:55;;40818:13;;40777:36;;:10;;:14;:36::i;:55::-;:75;;;;;40405:10;;40777:75;;;;-1:-1:-1;;;;;40369:8:0;:17;;;;;40405:10;40434:185;40538:4;:62;;33915:5;40538:62;;;33987:5;40538:62;40434:77;:15;40454:56;40434:19;:77::i;:185::-;40638:5;40369:289;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:483;;;39896:964;-1:-1:-1;;;;;;;39896:964:0:o;50713:230::-;50830:14;50875:1;50866:5;:10;;:69;;-1:-1:-1;;50897:5:0;:19;:37;;50928:6;50897:37;;;50919:6;50897:37;50866:69;;;-1:-1:-1;50887:5:0;;50857:78;-1:-1:-1;;50713:230:0:o;43492:347::-;43620:10;43600:31;;;;:19;:31;;;;;;:42;;43636:5;43600:35;:42::i;:::-;43586:10;43566:31;;;;:19;:31;;;;;:76;43676:20;;:31;;43701:5;43676:24;:31::i;:::-;43653:20;:54;43723:42;;-1:-1:-1;;;;;43723:42:0;;;43743:10;;43723:42;;;;43759:5;;43723:42;:::i;:::-;;;;;;;;43794:10;;43776:55;;-1:-1:-1;;;43776:55:0;;-1:-1:-1;;;;;43776:8:0;:17;;;;;:55;;43794:10;;;;;43814:4;;43821:2;;43825:5;;43776:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43492:347;;:::o;51013:558::-;51163:7;51172;51193:12;51207:10;51219:13;51234:12;51261:4;51250:51;;;;;;;;;;;;:::i;:::-;51192:109;;;;;;;;51328:28;51333:6;51341;51349;51328:4;:28::i;:::-;51312:45;;51431:27;51436:5;51443:6;51451;51431:4;:27::i;:::-;51416:43;;51477:8;-1:-1:-1;;;;;51477:16:0;;51501:5;51508;51515:10;51527:2;51539:6;51556:5;51477:86;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51470:93;;;;;;;;51013:558;;;;;;;:::o;51642:390::-;51769:7;51778;51799:12;51813:10;51825:13;51840:12;51867:4;51856:51;;;;;;;;;;;;:::i;:::-;51798:109;;;;;;;;51925:8;-1:-1:-1;;;;;51925:17:0;;51943:5;51950:10;51962:2;51966:28;51971:6;51979;51987;51966:4;:28::i;:::-;51996:27;52001:5;52008:6;52016;51996:4;:27::i;:::-;51925:99;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51918:106;;;;;;;;51642:390;;;;;;:::o;52310:964::-;52452:12;52466:5;52485:14;52501:21;52524:14;52540;52556:18;52602:4;52591:53;;;;;;;;;;;;:::i;:::-;52484:160;;;;;;;;;;52661:9;:23;;;;;52675:9;52674:10;52661:23;52657:322;;;52729:8;52739:6;52712:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52701:45;;52657:322;;;52769:9;52768:10;:23;;;;;52782:9;52768:23;52764:215;;;52836:8;52846:6;52819:34;;;;;;;;;:::i;52764:215::-;52875:9;:22;;;;;52888:9;52875:22;52871:108;;;52942:8;52952:6;52960;52925:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52914:53;;52871:108;53017:8;-1:-1:-1;;;;;52999:27:0;:6;-1:-1:-1;;;;;52999:27:0;;;:54;;;;-1:-1:-1;;;;;;53030:23:0;;53048:4;53030:23;;52999:54;52991:88;;;;-1:-1:-1;;;52991:88:0;;;;;;;:::i;:::-;53093:12;53107:23;53134:6;-1:-1:-1;;;;;53134:11:0;53153:5;53160:8;53134:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53092:77;;;;53188:7;53180:42;;;;-1:-1:-1;;;53180:42:0;;;;;;;:::i;:::-;53241:10;53253:12;;-1:-1:-1;52310:964:0;;-1:-1:-1;;;;;;;;;;52310:964:0:o;13525:437::-;13650:15;13682:5;:10;;;-1:-1:-1;;;;;13682:15:0;13696:1;13682:15;13678:277;;;-1:-1:-1;13724:4:0;13678:277;;;13797:10;;;;13780:13;;-1:-1:-1;;;;;13771:36:0;;;;:23;;:4;;:23;:8;:23::i;:::-;:36;;;;;;13761:46;;13826:7;:57;;;;;13879:4;13863:5;:13;;;-1:-1:-1;;;;;13837:39:0;:23;13849:5;:10;;;-1:-1:-1;;;;;13837:23:0;:7;:11;;:23;;;;:::i;:::-;:39;;;;;;:46;13826:57;13822:122;;;13914:14;:7;13926:1;13914:11;:14::i;13001:431::-;13155:13;;13126:12;;-1:-1:-1;;;;;13155:18:0;13151:274;;-1:-1:-1;13197:7:0;13151:274;;;13270:13;;13256:10;;;;-1:-1:-1;;;;;13244:39:0;;;;:23;;:7;;:23;:11;:23::i;:::-;:39;;;;;;13237:46;;13302:7;:57;;;;;13352:7;13339:5;:10;;;-1:-1:-1;;;;;13313:36:0;:23;13322:5;:13;;;-1:-1:-1;;;;;13313:23:0;:4;:8;;:23;;;;:::i;1427:138::-;1520:5;;;1515:16;;;;1507:50;;;;-1:-1:-1;;;1507:50:0;;;;;;;:::i;1573:155::-;1631:9;1661:6;;;:30;;-1:-1:-1;;1676:5:0;;;1690:1;1685;1676:5;1685:1;1671:15;;;;;:20;1661:30;1653:67;;;;-1:-1:-1;;;1653:67:0;;;;;;;:::i;1736:161::-;1785:9;-1:-1:-1;;;;;1815:16:0;;;1807:57;;;;-1:-1:-1;;;1807:57:0;;;;;;;:::i;:::-;-1:-1:-1;1887:1:0;1736:161::o;2510:138::-;2603:5;;;-1:-1:-1;;;;;2598:16:0;;;;;;;;2590:50;;;;-1:-1:-1;;;2590:50:0;;;;;;;:::i;2361:141::-;2454:5;;;-1:-1:-1;;;;;2449:16:0;;;;;;;;2441:53;;;;-1:-1:-1;;;2441:53:0;;;;;;;:::i;42223:370::-;42365:4;42361:225;;;42403:51;42448:5;42403:8;-1:-1:-1;;;;;42403:18:0;;42422:5;42437:4;42403:40;;;;;;;;;;;;;;;;:::i;:51::-;42394:5;:60;;42386:97;;;;-1:-1:-1;;;42386:97:0;;;;;;;:::i;:::-;42361:225;;;42516:58;;-1:-1:-1;;;42516:58:0;;-1:-1:-1;;;;;42516:8:0;:17;;;;:58;;42534:5;;42541:10;;42561:4;;42568:5;;42516:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42361:225;42223:370;;;;:::o;17860:248::-;18005:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18005:34:0;-1:-1:-1;;;18005:34:0;;;17979:61;;17917:13;;17944:12;;17917:13;;-1:-1:-1;;;;;17979:25:0;;;:61;;18005:34;17979:61;:::i;6768:204::-;6829:14;6892:40;;;;;;;;;;;;;-1:-1:-1;;;6892:40:0;;;6934:18;:16;:18::i;:::-;6954:8;6875:88;;;;;;;;;;:::i;17067:587::-;17137:13;17182:2;17167:4;:11;:17;17163:484;;17219:4;17208:26;;;;;;;;;;;;:::i;:::-;17201:33;;;;17163:484;17256:4;:11;17271:2;17256:17;17252:395;;;17290:7;17316:69;17327:2;17323:1;:6;;;:22;;;;;17333:4;17338:1;17333:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;17333:7:0;:12;;17323:22;17316:69;;;17366:3;;17316:69;;;17399:23;17435:1;17425:12;;-1:-1:-1;;;;;17425:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17425:12:0;;17399:38;;17461:1;17457:5;;17452:99;17468:2;17464:1;:6;;;:22;;;;;17474:4;17479:1;17474:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;17474:7:0;:12;;17464:22;17452:99;;;17528:4;17533:1;17528:7;;;;;;;;;;;;;;;;;;17512:10;17523:1;17512:13;;;;;;;;;;;;;:23;-1:-1:-1;;;;;17512:23:0;;;;;;;;-1:-1:-1;17488:3:0;;;;;17452:99;;;17579:10;-1:-1:-1;17565:25:0;;-1:-1:-1;17565:25:0;17252:395;-1:-1:-1;17623:12:0;;;;;;;;;;;;-1:-1:-1;;;17623:12:0;;;;;;14653:358;14772:13;;:::i;:::-;14787:15;14825:31;14835:5;14842:4;14848:7;14825:9;:31::i;:::-;14815:41;;14883:34;14901:15;:7;:13;:15::i;:::-;14883:13;;-1:-1:-1;;;;;14883:17:0;;;:34::i;:::-;-1:-1:-1;;;;;14867:50:0;;;14941:28;14956:12;:4;:10;:12::i;:::-;14941:10;;;;-1:-1:-1;;;;;14941:14:0;;;:28::i;:::-;-1:-1:-1;;;;;14928:41:0;:10;;;:41;:10;;14653:358;-1:-1:-1;;;14653:358:0:o;15073:281::-;15195:13;;:::i;:::-;15237:34;15255:15;:7;:13;:15::i;15237:34::-;-1:-1:-1;;;;;15221:50:0;;;15295:28;15310:12;:4;:10;:12::i;15295:28::-;-1:-1:-1;;;;;15282:41:0;:10;;;:41;-1:-1:-1;15282:10:0;;15073:281;-1:-1:-1;;15073:281:0:o;14131:352::-;14253:13;;:::i;:::-;14268:12;14300:31;14307:5;14314:7;14323;14300:6;:31::i;:::-;14293:38;;14358:34;14376:15;:7;:13;:15::i;:::-;14358:13;;-1:-1:-1;;;;;14358:17:0;;;:34::i;:::-;-1:-1:-1;;;;;14342:50:0;;;14416:28;14431:12;:4;:10;:12::i;:::-;14416:10;;;;-1:-1:-1;;;;;14416:14:0;;;:28::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;611:352::-;;;741:3;734:4;726:6;722:17;718:27;708:2;;-1:-1;;749:12;708:2;-1:-1;779:20;;-1:-1;;;;;808:30;;805:2;;;-1:-1;;841:12;805:2;885:4;877:6;873:17;861:29;;936:3;885:4;;920:6;916:17;877:6;902:32;;899:41;896:2;;;953:1;;943:12;2487:707;;2604:3;2597:4;2589:6;2585:17;2581:27;2571:2;;-1:-1;;2612:12;2571:2;2659:6;2646:20;2681:80;2696:64;2753:6;2696:64;:::i;:::-;2681:80;:::i;:::-;2789:21;;;2672:89;-1:-1;2833:4;2846:14;;;;2821:17;;;2935;;;2926:27;;;;2923:36;-1:-1;2920:2;;;2972:1;;2962:12;2920:2;2997:1;2982:206;3007:6;3004:1;3001:13;2982:206;;;7378:20;;3075:50;;3139:14;;;;3167;;;;3029:1;3022:9;2982:206;;;2986:14;;;;;2564:630;;;;:::o;4787:442::-;;4899:3;4892:4;4884:6;4880:17;4876:27;4866:2;;-1:-1;;4907:12;4866:2;4947:6;4941:13;4969:64;4984:48;5025:6;4984:48;:::i;4969:64::-;4960:73;;5053:6;5046:5;5039:21;5157:3;5089:4;5148:6;5081;5139:16;;5136:25;5133:2;;;5174:1;;5164:12;5133:2;5184:39;5216:6;5089:4;5115:5;5111:16;5089:4;5081:6;5077:17;5184:39;:::i;:::-;;4859:370;;;;:::o;7859:241::-;;7963:2;7951:9;7942:7;7938:23;7934:32;7931:2;;;-1:-1;;7969:12;7931:2;85:6;72:20;97:33;124:5;97:33;:::i;8107:263::-;;8222:2;8210:9;8201:7;8197:23;8193:32;8190:2;;;-1:-1;;8228:12;8190:2;226:6;220:13;238:33;265:5;238:33;:::i;8377:891::-;;;;;;;8577:3;8565:9;8556:7;8552:23;8548:33;8545:2;;;-1:-1;;8584:12;8545:2;371:6;358:20;383:41;418:5;383:41;:::i;:::-;8636:71;-1:-1;8744:2;8791:22;;358:20;383:41;358:20;383:41;:::i;:::-;8752:71;-1:-1;8860:2;8896:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;8868:60;-1:-1;8965:2;9002:22;;7654:20;7679:31;7654:20;7679:31;:::i;:::-;8539:729;;;;-1:-1;8539:729;;9071:3;9111:22;;3909:20;;9180:3;9220:22;;;3909:20;;-1:-1;8539:729;-1:-1;;8539:729::o;9275:906::-;;;;;;9467:3;9455:9;9446:7;9442:23;9438:33;9435:2;;;-1:-1;;9474:12;9435:2;528:6;522:13;540:41;575:5;540:41;:::i;:::-;9666:2;9651:18;;9645:25;9526:82;;-1:-1;;;;;;9679:30;;9676:2;;;-1:-1;;9712:12;9676:2;9742:73;9807:7;9798:6;9787:9;9783:22;9742:73;:::i;:::-;9732:83;;;9852:2;9903:9;9899:22;3782:13;3800:30;3824:5;3800:30;:::i;:::-;9968:2;10015:22;;3782:13;9860:71;;-1:-1;3800:30;3782:13;3800:30;:::i;:::-;10084:3;10133:22;;7798:13;9976:71;;-1:-1;7816:31;7798:13;7816:31;:::i;:::-;10093:72;;;;9429:752;;;;;;;;:::o;10188:366::-;;;10309:2;10297:9;10288:7;10284:23;10280:32;10277:2;;;-1:-1;;10315:12;10277:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10367:63;-1:-1;10467:2;10506:22;;72:20;97:33;72:20;97:33;:::i;:::-;10475:63;;;;10271:283;;;;;:::o;10561:491::-;;;;10699:2;10687:9;10678:7;10674:23;10670:32;10667:2;;;-1:-1;;10705:12;10667:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10757:63;-1:-1;10857:2;10896:22;;72:20;97:33;72:20;97:33;:::i;:::-;10661:391;;10865:63;;-1:-1;;;10965:2;11004:22;;;;7378:20;;10661:391::o;11059:991::-;;;;;;;;11263:3;11251:9;11242:7;11238:23;11234:33;11231:2;;;-1:-1;;11270:12;11231:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;11322:63;-1:-1;11422:2;11461:22;;72:20;97:33;72:20;97:33;:::i;:::-;11430:63;-1:-1;11530:2;11569:22;;7378:20;;-1:-1;11638:2;11677:22;;7378:20;;-1:-1;11746:3;11784:22;;7654:20;7679:31;7654:20;7679:31;:::i;:::-;11225:825;;;;-1:-1;11225:825;;;;11755:61;11853:3;11893:22;;3909:20;;-1:-1;11962:3;12002:22;;;3909:20;;11225:825;-1:-1;;11225:825::o;12057:479::-;;;;12189:2;12177:9;12168:7;12164:23;12160:32;12157:2;;;-1:-1;;12195:12;12157:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;12247:63;-1:-1;12347:2;12383:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;12355:60;-1:-1;12452:2;12488:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;12460:60;;;;12151:385;;;;;:::o;12543:485::-;;;;12678:2;12666:9;12657:7;12653:23;12649:32;12646:2;;;-1:-1;;12684:12;12646:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;12736:63;-1:-1;12836:2;12872:22;;3640:20;3665:30;3640:20;3665:30;:::i;13035:366::-;;;13156:2;13144:9;13135:7;13131:23;13127:32;13124:2;;;-1:-1;;13162:12;13124:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;13214:63;13314:2;13353:22;;;;7378:20;;-1:-1;;;13118:283::o;13408:1083::-;;;;;;;;13664:3;13652:9;13643:7;13639:23;13635:33;13632:2;;;-1:-1;;13671:12;13632:2;13729:17;13716:31;-1:-1;;;;;13767:18;13759:6;13756:30;13753:2;;;-1:-1;;13789:12;13753:2;13827:80;13899:7;13890:6;13879:9;13875:22;13827:80;:::i;:::-;13809:98;;-1:-1;13809:98;-1:-1;13972:2;13957:18;;13944:32;;-1:-1;13985:30;;;13982:2;;;-1:-1;;14018:12;13982:2;;14056:80;14128:7;14119:6;14108:9;14104:22;14056:80;:::i;:::-;14038:98;;-1:-1;14038:98;-1:-1;;14173:2;14212:22;;72:20;97:33;72:20;97:33;:::i;:::-;14181:63;-1:-1;14281:2;14337:22;;5828:20;5853:50;5828:20;5853:50;:::i;:::-;14289:80;-1:-1;14406:3;14443:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;14415:60;;;;13626:865;;;;;;;;;;:::o;14498:977::-;;;;;;;14750:2;14738:9;14729:7;14725:23;14721:32;14718:2;;;-1:-1;;14756:12;14718:2;14814:17;14801:31;-1:-1;;;;;14852:18;14844:6;14841:30;14838:2;;;-1:-1;;14874:12;14838:2;14912:78;14982:7;14973:6;14962:9;14958:22;14912:78;:::i;:::-;14894:96;;-1:-1;14894:96;-1:-1;15055:2;15040:18;;15027:32;;-1:-1;15068:30;;;15065:2;;;-1:-1;;15101:12;15065:2;15139:80;15211:7;15202:6;15191:9;15187:22;15139:80;:::i;:::-;15121:98;;-1:-1;15121:98;-1:-1;15284:2;15269:18;;15256:32;;-1:-1;15297:30;;;15294:2;;;-1:-1;;15330:12;15294:2;;15368:91;15451:7;15442:6;15431:9;15427:22;15368:91;:::i;:::-;14712:763;;;;-1:-1;14712:763;;-1:-1;14712:763;;15350:109;;14712:763;-1:-1;;;14712:763::o;15482:257::-;;15594:2;15582:9;15573:7;15569:23;15565:32;15562:2;;;-1:-1;;15600:12;15562:2;3788:6;3782:13;3800:30;3824:5;3800:30;:::i;15746:393::-;;;15875:2;15863:9;15854:7;15850:23;15846:32;15843:2;;;-1:-1;;15881:12;15843:2;3788:6;3782:13;3800:30;3824:5;3800:30;:::i;:::-;16041:2;16091:22;;;;7526:13;15933:71;;7526:13;;-1:-1;;;15837:302::o;16146:485::-;;;;16281:2;16269:9;16260:7;16256:23;16252:32;16249:2;;;-1:-1;;16287:12;16249:2;3653:6;3640:20;3665:30;3689:5;3665:30;:::i;:::-;16339:60;16436:2;16475:22;;7378:20;;-1:-1;16544:2;16583:22;;;7378:20;;16243:388;-1:-1;;;16243:388::o;16638:365::-;;;16761:2;16749:9;16740:7;16736:23;16732:32;16729:2;;;-1:-1;;16767:12;16729:2;16825:17;16812:31;-1:-1;;;;;16863:18;16855:6;16852:30;16849:2;;;-1:-1;;16885:12;16849:2;16970:6;16959:9;16955:22;;;4107:3;4100:4;4092:6;4088:17;4084:27;4074:2;;-1:-1;;4115:12;4074:2;4158:6;4145:20;16863:18;4177:6;4174:30;4171:2;;;-1:-1;;4207:12;4171:2;4302:3;16761:2;4282:17;4243:6;4268:32;;4265:41;4262:2;;;-1:-1;;4309:12;4262:2;16761;4239:17;;;;;16905:82;;-1:-1;16723:280;;-1:-1;;;;16723:280::o;17552:714::-;;;;;17739:3;17727:9;17718:7;17714:23;17710:33;17707:2;;;-1:-1;;17746:12;17707:2;5503:6;5497:13;5515:48;5557:5;5515:48;:::i;:::-;17924:2;17982:22;;522:13;17798:89;;-1:-1;540:41;522:13;540:41;:::i;:::-;18051:2;18100:22;;6127:13;18169:2;18218:22;;;6127:13;17701:565;;17932:82;;-1:-1;17701:565;-1:-1;;;17701:565::o;18273:793::-;;;;18476:2;18464:9;18455:7;18451:23;18447:32;18444:2;;;-1:-1;;18482:12;18444:2;5332:6;5319:20;5344:48;5386:5;5344:48;:::i;:::-;18534:78;-1:-1;18677:2;18662:18;;;18649:32;-1:-1;;;;;18690:30;;;18687:2;;;-1:-1;;18723:12;18687:2;18814:6;18803:9;18799:22;;;1106:3;1099:4;1091:6;1087:17;1083:27;1073:2;;-1:-1;;1114:12;1073:2;1161:6;1148:20;1183:80;1198:64;1255:6;1198:64;:::i;1183:80::-;1291:21;;;1348:14;;;;1323:17;;;1437;;;1428:27;;;;1425:36;-1:-1;1422:2;;;-1:-1;;1464:12;1422:2;-1:-1;1490:10;;1484:206;1509:6;1506:1;1503:13;1484:206;;;1589:37;1622:3;1610:10;1589:37;:::i;:::-;1577:50;;1531:1;1524:9;;;;;1641:14;;;;1669;;1484:206;;;-1:-1;18743:88;-1:-1;;;18896:2;18881:18;;18868:32;;-1:-1;18909:30;;;18906:2;;;-1:-1;;18942:12;18906:2;;;18972:78;19042:7;19033:6;19022:9;19018:22;18972:78;:::i;:::-;18962:88;;;18438:628;;;;;:::o;19073:813::-;;;;;19283:3;19271:9;19262:7;19258:23;19254:33;19251:2;;;-1:-1;;19290:12;19251:2;5332:6;5319:20;5344:48;5386:5;5344:48;:::i;:::-;19342:78;-1:-1;19457:2;19511:22;;5319:20;5344:48;5319:20;5344:48;:::i;:::-;19465:78;-1:-1;19580:2;19635:22;;5658:20;5683:49;5658:20;5683:49;:::i;:::-;19588:79;-1:-1;19732:2;19717:18;;19704:32;-1:-1;;;;;19745:30;;19742:2;;;-1:-1;;19778:12;19742:2;19838:22;;4432:4;4420:17;;4416:27;-1:-1;4406:2;;-1:-1;;4447:12;4406:2;4494:6;4481:20;4516:64;4531:48;4572:6;4531:48;:::i;4516:64::-;4600:6;4593:5;4586:21;4704:3;19457:2;4695:6;4628;4686:16;;4683:25;4680:2;;;-1:-1;;4711:12;4680:2;76607:6;19457:2;4628:6;4624:17;19457:2;4662:5;4658:16;76584:30;76645:16;;;19457:2;76645:16;76638:27;;;;-1:-1;19245:641;;;;-1:-1;19245:641;-1:-1;19245:641::o;20175:394::-;;;20310:2;20298:9;20289:7;20285:23;20281:32;20278:2;;;-1:-1;;20316:12;20278:2;5841:6;5828:20;5853:50;5897:5;5853:50;:::i;:::-;20368:80;-1:-1;20485:2;20521:22;;3640:20;3665:30;3640:20;3665:30;:::i;20576:239::-;;20679:2;20667:9;20658:7;20654:23;20650:32;20647:2;;;-1:-1;;20685:12;20647:2;-1:-1;5981:20;;20641:174;-1:-1;20641:174::o;20822:380::-;;;20950:2;20938:9;20929:7;20925:23;20921:32;20918:2;;;-1:-1;;20956:12;20918:2;5994:6;5981:20;21008:62;;21107:2;21158:9;21154:22;358:20;383:41;418:5;383:41;:::i;21209:499::-;;;;21351:2;21339:9;21330:7;21326:23;21322:32;21319:2;;;-1:-1;;21357:12;21319:2;5994:6;5981:20;21409:62;;21508:2;21559:9;21555:22;358:20;383:41;418:5;383:41;:::i;21715:362::-;;21840:2;21828:9;21819:7;21815:23;21811:32;21808:2;;;-1:-1;;21846:12;21808:2;21897:17;21891:24;-1:-1;;;;;21927:6;21924:30;21921:2;;;-1:-1;;21957:12;21921:2;21987:74;22053:7;22044:6;22033:9;22029:22;21987:74;:::i;22084:309::-;;22222:2;22210:9;22201:7;22197:23;22193:32;22190:2;;;-1:-1;;22228:12;22190:2;6821:20;22222:2;6821:20;:::i;:::-;7254:6;7248:13;7266:33;7293:5;7266:33;:::i;:::-;6901:86;;7048:2;7113:22;;7248:13;7266:33;7248:13;7266:33;:::i;:::-;7048:2;7063:16;;7056:86;7067:5;22184:209;-1:-1;;;22184:209::o;22400:263::-;;22515:2;22503:9;22494:7;22490:23;22486:32;22483:2;;;-1:-1;;22521:12;22483:2;-1:-1;7526:13;;22477:186;-1:-1;22477:186::o;22670:399::-;;;22802:2;22790:9;22781:7;22777:23;22773:32;22770:2;;;-1:-1;;22808:12;22770:2;-1:-1;;7526:13;;22971:2;23021:22;;;7526:13;;;;;-1:-1;22764:305::o;23076:237::-;;23178:2;23166:9;23157:7;23153:23;23149:32;23146:2;;;-1:-1;;23184:12;23146:2;7667:6;7654:20;7679:31;7704:5;7679:31;:::i;23320:259::-;;23433:2;23421:9;23412:7;23408:23;23404:32;23401:2;;;-1:-1;;23439:12;23401:2;7804:6;7798:13;7816:31;7841:5;7816:31;:::i;26177:343::-;;26319:5;71390:12;72193:6;72188:3;72181:19;26412:52;26457:6;72230:4;72225:3;72221:14;72230:4;26438:5;26434:16;26412:52;:::i;:::-;77202:7;77186:14;-1:-1;;77182:28;26476:39;;;;72230:4;26476:39;;26267:253;-1:-1;;26267:253::o;39393:271::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;;39527:137;-1:-1;;39527:137::o;39671:410::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;25969:37;;;-1:-1;26831:4;40044:12;;39833:248;-1:-1;39833:248::o;40088:549::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;25969:37;;;-1:-1;26831:4;40489:12;;25969:37;40600:12;;;40278:359;-1:-1;40278:359::o;41204:1398::-;;-1:-1;;;30423:11;30416:41;26687:5;71390:12;26798:52;26843:6;30400:2;30480:3;30476:12;26831:4;26824:5;26820:16;26798:52;:::i;:::-;-1:-1;;;30400:2;26862:16;;;;;;38119:24;71390:12;;26798:52;71390:12;38162:11;;;26831:4;26820:16;;26798:52;:::i;:::-;-1:-1;;;38162:11;26862:16;;;;;;;35438:24;71390:12;;26798:52;71390:12;35481:11;;;26831:4;26820:16;;26798:52;:::i;:::-;26862:16;35481:11;26862:16;;41739:863;-1:-1;;;;;41739:863::o;42609:1398::-;;-1:-1;;;35789:11;35782:25;26687:5;71390:12;26798:52;26843:6;35767:1;35830:3;35826:11;26831:4;26824:5;26820:16;26798:52;:::i;:::-;-1:-1;;;35767:1;26862:16;;;;;;38119:24;71390:12;;26798:52;71390:12;38162:11;;;26831:4;26820:16;;26798:52;:::i;:::-;-1:-1;;;38162:11;26862:16;;;;;;;35438:24;71390:12;;26798:52;71390:12;35481:11;;;26831:4;26820:16;;26798:52;:::i;:::-;26862:16;35481:11;26862:16;;43144:863;-1:-1;;;;;43144:863::o;44014:222::-;-1:-1;;;;;74063:54;;;;24160:37;;44141:2;44126:18;;44112:124::o;44243:760::-;-1:-1;;;;;74063:54;;;24160:37;;74063:54;;;;44665:2;44650:18;;24160:37;73356:13;;73349:21;44742:2;44727:18;;25852:34;74382:4;74371:16;44821:2;44806:18;;39346:35;44904:3;44889:19;;25969:37;44988:3;44973:19;;25969:37;;;;44500:3;44485:19;;44471:532::o;45010:210::-;73356:13;;73349:21;25852:34;;45131:2;45116:18;;45102:118::o;45227:321::-;73356:13;;73349:21;25852:34;;45534:2;45519:18;;25969:37;45376:2;45361:18;;45347:201::o;45555:222::-;25969:37;;;45682:2;45667:18;;45653:124::o;45784:780::-;25969:37;;;-1:-1;;;;;74063:54;;;46216:2;46201:18;;24160:37;74063:54;;;;46299:2;46284:18;;24160:37;46382:2;46367:18;;25969:37;46465:3;46450:19;;25969:37;;;;46549:3;46534:19;;25969:37;46051:3;46036:19;;46022:542::o;46571:444::-;25969:37;;;46918:2;46903:18;;25969:37;;;;-1:-1;;;;;74063:54;47001:2;46986:18;;24160:37;46754:2;46739:18;;46725:290::o;47022:548::-;25969:37;;;74382:4;74371:16;;;;47390:2;47375:18;;39346:35;47473:2;47458:18;;25969:37;47556:2;47541:18;;25969:37;47229:3;47214:19;;47200:370::o;47577:306::-;;47722:2;47743:17;47736:47;47797:76;47722:2;47711:9;47707:18;47859:6;47797:76;:::i;47890:300::-;;48032:2;;48021:9;48017:18;48032:2;48053:17;48046:47;-1:-1;27030:5;27024:12;27064:1;;27053:9;27049:17;27077:1;27072:247;;;;27330:1;27325:400;;;;27042:683;;27072:247;27146:1;27131:17;;27150:4;27127:28;72181:19;;-1:-1;;27258:25;;72221:14;;;27246:38;27298:14;;;;-1:-1;27072:247;;27325:400;27394:1;27383:9;27379:17;72193:6;72188:3;72181:19;27502:37;27533:5;27502:37;:::i;:::-;-1:-1;27563:130;27577:6;27574:1;27571:13;27563:130;;;27636:14;;27623:11;;;72221:14;27623:11;27616:35;27670:15;;;;27592:12;;27563:130;;;27707:11;;72221:14;27707:11;;-1:-1;;;27042:683;-1:-1;48099:81;;48003:187;-1:-1;;;;;;;48003:187::o;48725:363::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;49074:2;49059:18;;24160:37;48895:2;48880:18;;48866:222::o;49095:602::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;;49517:2;49502:18;;24029:58;74063:54;;49600:2;49585:18;;24160:37;49683:2;49668:18;;25969:37;;;;49329:3;49314:19;;49300:397::o;49704:714::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;;50154:2;50139:18;;24029:58;74063:54;;;;50237:2;50222:18;;24160:37;50320:2;50305:18;;25969:37;;;;50403:3;50388:19;;25969:37;;;;49966:3;49951:19;;49937:481::o;50425:898::-;;50759:3;50748:9;50744:19;-1:-1;;;;;74074:42;73166:5;74063:54;27837:3;27830:70;50947:2;74074:42;73166:5;74063:54;50947:2;50936:9;50932:18;24029:58;50759:3;50984:2;50973:9;50969:18;50962:48;51024:108;24553:5;71390:12;72193:6;72188:3;72181:19;72221:14;50748:9;72221:14;24565:93;;50947:2;24729:5;70922:14;24741:21;;-1:-1;24768:260;24793:6;24790:1;24787:13;24768:260;;;24854:13;;74063:54;;24160:37;;71921:14;;;;23740;;;;24815:1;24808:9;24768:260;;;-1:-1;;51170:20;;;51165:2;51150:18;;51143:48;71390:12;;72181:19;;;72221:14;;;;-1:-1;71390:12;-1:-1;70922:14;;;-1:-1;25497:260;25522:6;25519:1;25516:13;25497:260;;;25583:13;;25969:37;;23922:14;;;;71921;;;;24815:1;25537:9;25497:260;;;-1:-1;51197:116;;50730:593;-1:-1;;;;;;;;;50730:593::o;53409:462::-;-1:-1;;;;;74063:54;;;;27830:70;;-1:-1;;;;;73943:46;;;;53780:2;53765:18;;38711:50;73356:13;73349:21;53857:2;53842:18;;25852:34;53601:2;53586:18;;53572:299::o;53878:462::-;-1:-1;;;;;74063:54;;;;27830:70;;54249:2;54234:18;;25969:37;;;;73356:13;73349:21;54326:2;54311:18;;25852:34;54070:2;54055:18;;54041:299::o;55160:600::-;28679:58;;;55574:2;55559:18;;28679:58;;;;-1:-1;;;;;74269:30;55655:2;55640:18;;39231:36;55746:2;55731:18;;28679:58;55393:3;55378:19;;55364:396::o;56084:416::-;56284:2;56298:47;;;29695:2;56269:18;;;72181:19;29731:23;72221:14;;;29711:44;29774:12;;;56255:245::o;56507:416::-;56707:2;56721:47;;;30025:2;56692:18;;;72181:19;30061:32;72221:14;;;30041:53;30113:12;;;56678:245::o;56930:416::-;57130:2;57144:47;;;30727:2;57115:18;;;72181:19;30763:24;72221:14;;;30743:45;30807:12;;;57101:245::o;57353:416::-;57553:2;57567:47;;;31058:2;57538:18;;;72181:19;31094:28;72221:14;;;31074:49;31142:12;;;57524:245::o;57776:416::-;57976:2;57990:47;;;31393:2;57961:18;;;72181:19;31429:23;72221:14;;;31409:44;31472:12;;;57947:245::o;58199:416::-;58399:2;58413:47;;;31723:2;58384:18;;;72181:19;31759:24;72221:14;;;31739:45;31803:12;;;58370:245::o;58622:416::-;58822:2;58836:47;;;32054:2;58807:18;;;72181:19;32090:30;72221:14;;;32070:51;32140:12;;;58793:245::o;59045:416::-;59245:2;59259:47;;;32391:2;59230:18;;;72181:19;32427:26;72221:14;;;32407:47;32473:12;;;59216:245::o;59468:416::-;59668:2;59682:47;;;32724:2;59653:18;;;72181:19;32760:21;72221:14;;;32740:42;32801:12;;;59639:245::o;59891:416::-;60091:2;60105:47;;;33052:2;60076:18;;;72181:19;33088:26;72221:14;;;33068:47;33134:12;;;60062:245::o;60314:416::-;60514:2;60528:47;;;33385:2;60499:18;;;72181:19;33421:23;72221:14;;;33401:44;33464:12;;;60485:245::o;60737:416::-;60937:2;60951:47;;;33715:2;60922:18;;;72181:19;-1:-1;;;72221:14;;;33731:37;33787:12;;;60908:245::o;61160:416::-;61360:2;61374:47;;;34038:2;61345:18;;;72181:19;34074:27;72221:14;;;34054:48;34121:12;;;61331:245::o;61583:416::-;61783:2;61797:47;;;61768:18;;;72181:19;34408:34;72221:14;;;34388:55;34462:12;;;61754:245::o;62006:416::-;62206:2;62220:47;;;62191:18;;;72181:19;34749:34;72221:14;;;34729:55;34803:12;;;62177:245::o;62429:416::-;62629:2;62643:47;;;35054:2;62614:18;;;72181:19;35090:26;72221:14;;;35070:47;35136:12;;;62600:245::o;62852:416::-;63052:2;63066:47;;;36076:2;63037:18;;;72181:19;36112:22;72221:14;;;36092:43;36154:12;;;63023:245::o;63275:416::-;63475:2;63489:47;;;36405:2;63460:18;;;72181:19;36441:24;72221:14;;;36421:45;36485:12;;;63446:245::o;63698:416::-;63898:2;63912:47;;;36736:2;63883:18;;;72181:19;36772:26;72221:14;;;36752:47;36818:12;;;63869:245::o;64121:416::-;64321:2;64335:47;;;37069:2;64306:18;;;72181:19;37105:28;72221:14;;;37085:49;37153:12;;;64292:245::o;64544:416::-;64744:2;64758:47;;;37404:2;64729:18;;;72181:19;37440:26;72221:14;;;37420:47;37486:12;;;64715:245::o;64967:416::-;65167:2;65181:47;;;37737:2;65152:18;;;72181:19;37773:24;72221:14;;;37753:45;37817:12;;;65138:245::o;65390:416::-;65590:2;65604:47;;;38412:2;65575:18;;;72181:19;38448:26;72221:14;;;38428:47;38494:12;;;65561:245::o;65813:333::-;-1:-1;;;;;73943:46;;;38591:37;;73943:46;;66132:2;66117:18;;38591:37;65968:2;65953:18;;65939:207::o;66382:349::-;25969:37;;;66717:2;66702:18;;28679:58;66545:2;66530:18;;66516:215::o;67078:444::-;25969:37;;;67425:2;67410:18;;25969:37;;;;67508:2;67493:18;;25969:37;67261:2;67246:18;;67232:290::o;68088:436::-;-1:-1;;;;;74269:30;;;39231:36;;74269:30;;;;68427:2;68412:18;;39231:36;-1:-1;;;;;73943:46;;;68510:2;68495:18;;38591:37;68267:2;68252:18;;68238:286::o;68531:214::-;74382:4;74371:16;;;;39346:35;;68654:2;68639:18;;68625:120::o;68752:506::-;;;68887:11;68874:25;68938:48;;68962:8;68946:14;68942:29;68938:48;68918:18;68914:73;68904:2;;-1:-1;;68991:12;68904:2;69018:33;;69072:18;;;-1:-1;;;;;;69099:30;;69096:2;;;-1:-1;;69132:12;69096:2;68977:4;69160:13;;-1:-1;68946:14;69192:38;;;69182:49;;69179:2;;;69244:1;;69234:12;69265:256;69327:2;69321:9;69353:17;;;-1:-1;;;;;69413:34;;69449:22;;;69410:62;69407:2;;;69485:1;;69475:12;69407:2;69327;69494:22;69305:216;;-1:-1;69305:216::o;69528:304::-;;-1:-1;;;;;69679:6;69676:30;69673:2;;;-1:-1;;69709:12;69673:2;-1:-1;69754:4;69742:17;;;69807:15;;69610:222::o;70150:321::-;;-1:-1;;;;;70285:6;70282:30;70279:2;;;-1:-1;;70315:12;70279:2;-1:-1;77202:7;70369:17;-1:-1;;70365:33;70456:4;70446:15;;70216:255::o;71123:157::-;;71217:14;;;71259:4;71246:18;;;71176:104::o;76680:268::-;76745:1;76752:101;76766:6;76763:1;76760:13;76752:101;;;76833:11;;;76827:18;76814:11;;;76807:39;76788:2;76781:10;76752:101;;;76868:6;76865:1;76862:13;76859:2;;;-1:-1;;76745:1;76915:16;;76908:27;76729:219::o;77223:117::-;-1:-1;;;;;77310:5;74063:54;77285:5;77282:35;77272:2;;77331:1;;77321:12;77272:2;77266:74;:::o;77487:111::-;77568:5;73356:13;73349:21;77546:5;77543:32;77533:2;;77589:1;;77579:12;78319:117;-1:-1;;;;;78406:5;73943:46;78381:5;78378:35;78368:2;;78427:1;;78417:12;78567:113;74382:4;78650:5;74371:16;78627:5;78624:33;78614:2;;78671:1;;78661:12
Metadata Hash
835168e79bafbae4901d883291eac38a26a10a8b0acdc2ff0497426776e52e8f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.