More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,707 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Change Package R... | 21564446 | 2 days ago | IN | 0 ETH | 0.00212056 | ||||
Change Package R... | 21564438 | 2 days ago | IN | 0 ETH | 0.00198587 | ||||
Set Map | 21564434 | 2 days ago | IN | 0 ETH | 0.00023696 | ||||
Withdraw | 21559593 | 3 days ago | IN | 0 ETH | 0.00426061 | ||||
Withdraw | 21555739 | 4 days ago | IN | 0 ETH | 0.00258953 | ||||
Withdraw | 21463126 | 16 days ago | IN | 0 ETH | 0.00339417 | ||||
Withdraw | 21458418 | 17 days ago | IN | 0 ETH | 0.0021275 | ||||
Withdraw | 21386273 | 27 days ago | IN | 0 ETH | 0.00535806 | ||||
Withdraw | 21356986 | 31 days ago | IN | 0 ETH | 0.00407154 | ||||
Withdraw | 21356967 | 31 days ago | IN | 0 ETH | 0.0045366 | ||||
Withdraw | 21300556 | 39 days ago | IN | 0 ETH | 0.00422005 | ||||
Withdraw | 21279949 | 42 days ago | IN | 0 ETH | 0.01158704 | ||||
Withdraw | 21213130 | 51 days ago | IN | 0 ETH | 0.0049081 | ||||
Withdraw | 21213113 | 51 days ago | IN | 0 ETH | 0.00310547 | ||||
Withdraw | 21213110 | 51 days ago | IN | 0 ETH | 0.00624471 | ||||
Withdraw | 21213102 | 51 days ago | IN | 0 ETH | 0.00516964 | ||||
Withdraw | 21213097 | 51 days ago | IN | 0 ETH | 0.0058925 | ||||
Change Package R... | 21193605 | 54 days ago | IN | 0 ETH | 0.00803283 | ||||
Change Package R... | 21193599 | 54 days ago | IN | 0 ETH | 0.00837013 | ||||
Change Package R... | 21193590 | 54 days ago | IN | 0 ETH | 0.00825374 | ||||
Change Package R... | 21193579 | 54 days ago | IN | 0 ETH | 0.00783496 | ||||
Change Package R... | 21193545 | 54 days ago | IN | 0 ETH | 0.00756484 | ||||
Change CRFI Mine... | 21193489 | 54 days ago | IN | 0 ETH | 0.009316 | ||||
Change Package R... | 21193354 | 54 days ago | IN | 0 ETH | 0.00461371 | ||||
Change Package R... | 21193333 | 54 days ago | IN | 0 ETH | 0.00427616 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CrossLend
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-17 */ // File: @openzeppelin/contracts/token/ERC777/IERC777.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC777Token standard as defined in the EIP. * * This contract uses the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let * token holders and recipients react to token movements by using setting implementers * for the associated interfaces in said registry. See {IERC1820Registry} and * {ERC1820Implementer}. */ interface IERC777 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view returns (string memory); /** * @dev Returns the smallest part of the token that is not divisible. This * means all token operations (creation, movement and destruction) must have * amounts that are a multiple of this number. * * For most token contracts, this value will equal 1. */ function granularity() external view returns (uint256); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by an account (`owner`). */ function balanceOf(address owner) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * If send or receive hooks are registered for the caller and `recipient`, * the corresponding functions will be called with `data` and empty * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. * * Emits a {Sent} event. * * Requirements * * - the caller must have at least `amount` tokens. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ function send(address recipient, uint256 amount, bytes calldata data) external; /** * @dev Destroys `amount` tokens from the caller's account, reducing the * total supply. * * If a send hook is registered for the caller, the corresponding function * will be called with `data` and empty `operatorData`. See {IERC777Sender}. * * Emits a {Burned} event. * * Requirements * * - the caller must have at least `amount` tokens. */ function burn(uint256 amount, bytes calldata data) external; /** * @dev Returns true if an account is an operator of `tokenHolder`. * Operators can send and burn tokens on behalf of their owners. All * accounts are their own operator. * * See {operatorSend} and {operatorBurn}. */ function isOperatorFor(address operator, address tokenHolder) external view returns (bool); /** * @dev Make an account an operator of the caller. * * See {isOperatorFor}. * * Emits an {AuthorizedOperator} event. * * Requirements * * - `operator` cannot be calling address. */ function authorizeOperator(address operator) external; /** * @dev Revoke an account's operator status for the caller. * * See {isOperatorFor} and {defaultOperators}. * * Emits a {RevokedOperator} event. * * Requirements * * - `operator` cannot be calling address. */ function revokeOperator(address operator) external; /** * @dev Returns the list of default operators. These accounts are operators * for all token holders, even if {authorizeOperator} was never called on * them. * * This list is immutable, but individual holders may revoke these via * {revokeOperator}, in which case {isOperatorFor} will return false. */ function defaultOperators() external view returns (address[] memory); /** * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must * be an operator of `sender`. * * If send or receive hooks are registered for `sender` and `recipient`, * the corresponding functions will be called with `data` and * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. * * Emits a {Sent} event. * * Requirements * * - `sender` cannot be the zero address. * - `sender` must have at least `amount` tokens. * - the caller must be an operator for `sender`. * - `recipient` cannot be the zero address. * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ function operatorSend( address sender, address recipient, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; /** * @dev Destroys `amount` tokens from `account`, reducing the total supply. * The caller must be an operator of `account`. * * If a send hook is registered for `account`, the corresponding function * will be called with `data` and `operatorData`. See {IERC777Sender}. * * Emits a {Burned} event. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. * - the caller must be an operator for `account`. */ function operatorBurn( address account, uint256 amount, bytes calldata data, bytes calldata operatorData ) external; event Sent( address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData ); event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); event AuthorizedOperator(address indexed operator, address indexed tokenHolder); event RevokedOperator(address indexed operator, address indexed tokenHolder); } // File: @openzeppelin/contracts/token/ERC777/IERC777Recipient.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. * * Accounts can be notified of {IERC777} tokens being sent to them by having a * contract implement this interface (contract holders can be their own * implementer) and registering it on the * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. * * See {IERC1820Registry} and {ERC1820Implementer}. */ interface IERC777Recipient { /** * @dev Called by an {IERC777} token contract whenever tokens are being * moved or created into a registered account (`to`). The type of operation * is conveyed by `from` being the zero address or not. * * This call occurs _after_ the token contract's state is updated, so * {IERC777-balanceOf}, etc., can be used to query the post-operation state. * * This function may revert to prevent the operation from being executed. */ function tokensReceived( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData ) external; } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/introspection/IERC1820Registry.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the global ERC1820 Registry, as defined in the * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register * implementers for interfaces in this registry, as well as query support. * * Implementers may be shared by multiple accounts, and can also implement more * than a single interface for each account. Contracts can implement interfaces * for themselves, but externally-owned accounts (EOA) must delegate this to a * contract. * * {IERC165} interfaces can also be queried via the registry. * * For an in-depth explanation and source code analysis, see the EIP text. */ interface IERC1820Registry { /** * @dev Sets `newManager` as the manager for `account`. A manager of an * account is able to set interface implementers for it. * * By default, each account is its own manager. Passing a value of `0x0` in * `newManager` will reset the manager to this initial state. * * Emits a {ManagerChanged} event. * * Requirements: * * - the caller must be the current manager for `account`. */ function setManager(address account, address newManager) external; /** * @dev Returns the manager for `account`. * * See {setManager}. */ function getManager(address account) external view returns (address); /** * @dev Sets the `implementer` contract as ``account``'s implementer for * `interfaceHash`. * * `account` being the zero address is an alias for the caller's address. * The zero address can also be used in `implementer` to remove an old one. * * See {interfaceHash} to learn how these are created. * * Emits an {InterfaceImplementerSet} event. * * Requirements: * * - the caller must be the current manager for `account`. * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not * end in 28 zeroes). * - `implementer` must implement {IERC1820Implementer} and return true when * queried for support, unless `implementer` is the caller. See * {IERC1820Implementer-canImplementInterfaceForAddress}. */ function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external; /** * @dev Returns the implementer of `interfaceHash` for `account`. If no such * implementer is registered, returns the zero address. * * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28 * zeroes), `account` will be queried for support of it. * * `account` being the zero address is an alias for the caller's address. */ function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address); /** * @dev Returns the interface hash for an `interfaceName`, as defined in the * corresponding * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP]. */ function interfaceHash(string calldata interfaceName) external pure returns (bytes32); /** * @notice Updates the cache with whether the contract implements an ERC165 interface or not. * @param account Address of the contract for which to update the cache. * @param interfaceId ERC165 interface for which to update the cache. */ function updateERC165Cache(address account, bytes4 interfaceId) external; /** * @notice Checks whether a contract implements an ERC165 interface or not. * If the result is not cached a direct lookup on the contract address is performed. * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling * {updateERC165Cache} with the contract address. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); /** * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache. * @param account Address of the contract to check. * @param interfaceId ERC165 interface to check. * @return True if `account` implements `interfaceId`, false otherwise. */ function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); event ManagerChanged(address indexed account, address indexed newManager); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: crosslend/data.sol pragma solidity >=0.6.2 <0.8.0; enum FinancialType{CRFI, CFil} struct FinancialPackage { FinancialType Type; uint256 Days; uint256 CFilInterestRate; uint256 CRFIInterestRateDyn; uint256 ID; uint256 Weight; uint256 ParamCRFI; uint256 ParamCFil; uint256 Total; } struct LoanCFilPackage { uint256 APY; uint256 PledgeRate; uint256 PaymentDue; uint256 PaymentDue99; uint256 UpdateTime; uint256 Param; } struct ViewSystemInfo{ FinancialPackage[] Packages; uint256 AffRate; uint256 AffRequire; uint256 EnableAffCFil; LoanCFilPackage LoanCFil; ChainManager ChainM; // invest uint256 NewInvestID; mapping(uint256 => InvestInfo) Invests; mapping(address => uint256) InvestAddrID; // setting power address SuperAdmin; mapping(address => bool) Admins; // statistic uint256 nowInvestCRFI; uint256 nowInvestCFil; uint256 cfilInterestPool; uint256 crfiInterestPool; uint256 cfilLendingTotal; uint256 crfiRewardTotal; uint256 avaiCFilAmount; uint256 totalWeightCFil; uint256 totalWeightCRFI; uint256 crfiMinerPerDayCFil; uint256 crfiMinerPerDayCRFI; uint256 ParamUpdateTime; } struct SystemInfoView { uint256 AffRate; uint256 AffRequire; uint256 EnableAffCFil; // invest uint256 NewInvestID; // statistic uint256 nowInvestCRFI; uint256 nowInvestCFil; uint256 cfilInterestPool; uint256 crfiInterestPool; uint256 cfilLendingTotal; uint256 crfiRewardTotal; uint256 avaiCFilAmount; uint256 totalWeightCFil; uint256 totalWeightCRFI; uint256 crfiMinerPerDayCFil; uint256 crfiMinerPerDayCRFI; uint256 ParamUpdateTime; } struct SystemInfo { FinancialPackage[] Packages; uint256 AffRate; uint256 AffRequire; uint256 EnableAffCFil; LoanCFilPackage LoanCFil; ChainManager ChainM; // invest uint256 NewInvestID; mapping(uint256 => InvestInfo) Invests; mapping(address => uint256) InvestAddrID; // setting power address SuperAdmin; mapping(address => bool) Admins; // statistic uint256 nowInvestCRFI; uint256 nowInvestCFil; uint256 cfilInterestPool; uint256 crfiInterestPool; uint256 cfilLendingTotal; uint256 crfiRewardTotal; uint256 avaiCFilAmount; uint256 totalWeightCFil; uint256 totalWeightCRFI; uint256 crfiMinerPerDayCFil; uint256 crfiMinerPerDayCRFI; uint256 ParamUpdateTime; mapping(string => string) kvMap; } struct InterestDetail{ uint256 crfiInterest; uint256 cfilInterest; } struct LoanInvest{ uint256 Lending; uint256 Pledge; uint256 Param; uint256 NowInterest; } struct InvestInfoView { address Addr; uint256 ID; uint256 affID; // statistic for financial uint256 totalAffTimes; uint256 totalAffPackageTimes; uint256 totalAffCRFI; uint256 totalAffCFil; uint256 nowInvestFinCRFI; uint256 nowInvestFinCFil; } struct InvestInfo { mapping(uint256 => ChainQueue) InvestRecords; address Addr; uint256 ID; uint256 affID; LoanInvest LoanCFil; // statistic for financial uint256 totalAffTimes; uint256 totalAffPackageTimes; uint256 totalAffCRFI; uint256 totalAffCFil; uint256 nowInvestFinCRFI; uint256 nowInvestFinCFil; } //////////////////// queue struct QueueData { uint256 RecordID; FinancialType Type; uint256 PackageID; uint256 Days; uint256 EndTime; uint256 AffID; uint256 Amount; uint256 ParamCRFI; uint256 ParamCFil; } struct ChainItem { uint256 Next; uint256 Prev; uint256 My; QueueData Data; } struct ChainQueue{ uint256 First; uint256 End; uint256 Size; } struct ChainManager{ ChainItem[] rawQueue; ChainQueue avaiQueue; } library ChainQueueLib{ //////////////////// item function GetNullItem(ChainManager storage chainM) internal view returns(ChainItem storage item){ return chainM.rawQueue[0]; } function HasNext(ChainManager storage chainM, ChainItem storage item) internal view returns(bool has){ if(item.Next == 0){ return false; } return true; } function Next(ChainManager storage chainM, ChainItem storage item) internal view returns(ChainItem storage nextItem){ uint256 nextIdx = item.Next; require(nextIdx > 0, "no next item"); return chainM.rawQueue[uint256(nextIdx)]; } //////////////////// chain function GetFirstItem(ChainManager storage chainM, ChainQueue storage chain) internal view returns(ChainItem storage item){ require(chain.Size > 0, "chain is empty"); return chainM.rawQueue[chain.First]; } function GetEndItem(ChainManager storage chainM, ChainQueue storage chain) internal view returns(ChainItem storage item){ require(chain.Size > 0, "chain is empty"); return chainM.rawQueue[chain.End]; } // need ensure the item is in chain function DeleteItem(ChainManager storage chainM, ChainQueue storage chain, ChainItem storage item) internal{ if(chain.First == item.My){ PopPutFirst(chainM, chain); return; } else if (chain.End == item.My){ PopPutEnd(chainM, chain); return; } ChainItem storage next = chainM.rawQueue[item.Next]; ChainItem storage prev = chainM.rawQueue[item.Prev]; next.Prev = item.Prev; prev.Next = item.Next; item.Prev = 0; item.Next = 0; chain.Size--; PutItem(chainM, item); } function PopPutFirst(ChainManager storage chainM, ChainQueue storage chain) internal{ ChainItem storage item = PopFirstItem(chainM, chain); PutItem(chainM, item); } function PopPutEnd(ChainManager storage chainM, ChainQueue storage chain) internal{ ChainItem storage item = PopEndItem(chainM, chain); PutItem(chainM, item); } function PopEndItem(ChainManager storage chainM, ChainQueue storage chain) internal returns(ChainItem storage item){ require(chain.Size >0, "chain is empty"); uint256 itemIdx = chain.End; chain.End = chainM.rawQueue[itemIdx].Prev; if(chain.End > 0){ chainM.rawQueue[chain.End].Next = 0; } else { chain.First = 0; } chain.Size--; item = chainM.rawQueue[itemIdx]; item.Prev = 0; return item; } function PopFirstItem(ChainManager storage chainM, ChainQueue storage chain) internal returns(ChainItem storage item){ require(chain.Size > 0, "chain is empty"); uint256 itemIdx = chain.First; chain.First = chainM.rawQueue[itemIdx].Next; if(chain.First > 0){ chainM.rawQueue[chain.First].Prev = 0; } else { chain.End = 0; } chain.Size--; item = chainM.rawQueue[itemIdx]; item.Next = 0; return item; } function PushEndItem(ChainManager storage chainM, ChainQueue storage chain, ChainItem storage item) internal{ item.Prev = chain.End; item.Next = 0; if(chain.Size == 0){ chain.First = item.My; chain.End = item.My; } else { chainM.rawQueue[chain.End].Next = item.My; chain.End = item.My; } chain.Size++; } //////////////////// chain manager function InitChainManager(ChainManager storage chainM) internal{ if(chainM.rawQueue.length == 0){ chainM.rawQueue.push(); } } function GetAvaiItem(ChainManager storage chainM) internal returns(ChainItem storage item){ if(chainM.avaiQueue.Size == 0){ if(chainM.rawQueue.length == 0){ chainM.rawQueue.push(); } uint256 itemIdx = chainM.rawQueue.length; chainM.rawQueue.push(); item = chainM.rawQueue[itemIdx]; item.Next = 0; item.Prev = 0; item.My = itemIdx; return item; } return PopFirstItem(chainM, chainM.avaiQueue); } function PutItem(ChainManager storage chainM, ChainItem storage item) internal{ PushEndItem(chainM, chainM.avaiQueue, item); } } // File: crosslend/main.sol pragma solidity >=0.7.0 <0.8.0; pragma abicoder v2; contract CrossLend is IERC777Recipient, ReentrancyGuard{ //////////////////// for using using ChainQueueLib for ChainManager; using SafeMath for uint256; //////////////////// constant IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); uint256 constant Decimal = 1e18; uint256 public OneDayTime; //////////////////// var SystemInfo internal SInfo; IERC777 public CRFI; IERC777 public CFil; IERC777 public SFil; //////////////////// modifier modifier IsAdmin() { require(msg.sender == SInfo.SuperAdmin || SInfo.Admins[msg.sender], "only admin"); _; } modifier IsSuperAdmin() { require(SInfo.SuperAdmin == msg.sender, "only super admin"); _; } //////////////////// event event AffEvent(address indexed receiver, address indexed sender, uint256 indexed affTimes, uint256 crfiInterest, uint256 cfilInterest, uint256 packageID, uint256 timestamp); event AffBought(address indexed affer, address indexed sender, uint256 indexed affPackageTimes, uint256 amount, uint256 packageID, uint256 timestamp); event loanCFilEvent(address indexed addr, uint256 cfilAmount, uint256 sfilAmount); //////////////////// constructor constructor(address crfiAddr, address cfilAddr, address sfilAddr) { CRFI = IERC777(crfiAddr); CFil = IERC777(cfilAddr); SFil = IERC777(sfilAddr); OneDayTime = 60 * 60 * 24; SInfo.SuperAdmin = msg.sender; SInfo.AffRate = Decimal / 10; SInfo.EnableAffCFil = 1; SInfo.ChainM.InitChainManager(); ////////// add package SInfo.crfiMinerPerDayCFil = 1917808 * Decimal / 100; SInfo.crfiMinerPerDayCRFI = 821918 * Decimal / 100; SInfo.ParamUpdateTime = block.timestamp; // loan CFil ChangeLoanRate(201 * Decimal / 1000, 56 * Decimal / 100, 2300 * Decimal); SInfo.LoanCFil.UpdateTime = block.timestamp; // add crfi AddPackage(FinancialType.CRFI, 0, (20 * Decimal) / 1000, Decimal); AddPackage(FinancialType.CRFI, 90, (32 * Decimal) / 1000, (15 * Decimal) / 10); AddPackage(FinancialType.CRFI, 180, (34 * Decimal) / 1000, 2 * Decimal); AddPackage(FinancialType.CRFI, 365, (36 * Decimal) / 1000, (25 * Decimal) / 10); AddPackage(FinancialType.CRFI, 540, (40 * Decimal) / 1000, 3 * Decimal); // add cfil AddPackage(FinancialType.CFil, 0, (20 * Decimal) / 1000, Decimal); AddPackage(FinancialType.CFil, 90, (33 * Decimal) / 1000, (15 * Decimal) / 10); AddPackage(FinancialType.CFil, 180, (35 * Decimal) / 1000, 2 * Decimal); AddPackage(FinancialType.CFil, 365, (37 * Decimal) / 1000, (25 * Decimal) / 10); AddPackage(FinancialType.CFil, 540, (41 * Decimal) / 1000, 3 * Decimal); // register interfaces _ERC1820_REGISTRY.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, address(this)); } //////////////////// super admin func function AddAdmin(address admin) public IsSuperAdmin(){ require(!SInfo.Admins[admin], "already add this admin"); SInfo.Admins[admin] = true; } function DelAdmin(address admin) public IsSuperAdmin(){ require(SInfo.Admins[admin], "this addr is not admin"); SInfo.Admins[admin] = false; } function ChangeSuperAdmin(address suAdmin) public IsSuperAdmin(){ require(suAdmin != address(0x0), "empty new super admin"); if(suAdmin == SInfo.SuperAdmin){ return; } SInfo.SuperAdmin = suAdmin; } //////////////////// admin func function SetMap(string memory key, string memory value) public IsAdmin(){ SInfo.kvMap[key] = value; } function ChangePackageRate(uint256 packageID, uint256 cfilInterestRate, uint256 weight) public IsAdmin(){ require(packageID < SInfo.Packages.length, "packageID error"); updateAllParam(); FinancialPackage storage package = SInfo.Packages[packageID]; package.CFilInterestRate = cfilInterestRate; uint256 nowTotal = package.Total.mul(package.Weight) / Decimal; if(package.Type == FinancialType.CRFI){ SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.sub(nowTotal); } else { SInfo.totalWeightCFil = SInfo.totalWeightCFil.sub(nowTotal); } package.Weight = weight; nowTotal = package.Total.mul(package.Weight) / Decimal; if(package.Type == FinancialType.CRFI){ SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.add(nowTotal); } else { SInfo.totalWeightCFil = SInfo.totalWeightCFil.add(nowTotal); } } function AddPackage(FinancialType _type, uint256 dayTimes, uint256 cfilInterestRate, uint256 weight) public IsAdmin(){ updateAllParam(); uint256 idx = SInfo.Packages.length; SInfo.Packages.push(); FinancialPackage storage package = SInfo.Packages[idx]; package.Type = _type; package.Days = dayTimes; package.Weight = weight; package.CFilInterestRate = cfilInterestRate; package.ID = idx; } function ChangeCRFIMinerPerDay(uint256 crfi, uint256 cfil) public IsAdmin(){ updateAllParam(); SInfo.crfiMinerPerDayCFil = cfil; SInfo.crfiMinerPerDayCRFI = crfi; } function ChangeLoanRate(uint256 apy, uint256 pledgeRate, uint256 paymentDue) public IsAdmin(){ require(pledgeRate > 0, "pledge rate can't = 0"); SInfo.LoanCFil.APY = apy; SInfo.LoanCFil.PledgeRate = pledgeRate; SInfo.LoanCFil.PaymentDue = paymentDue; SInfo.LoanCFil.PaymentDue99 = paymentDue.mul(99) / 100; } function ChangeAffCFil(bool enable) public IsAdmin(){ if(enable && SInfo.EnableAffCFil == 0){ SInfo.EnableAffCFil = 1; } else if(!enable && SInfo.EnableAffCFil > 0){ SInfo.EnableAffCFil = 0; } } function ChangeAffRate(uint256 rate) public IsAdmin(){ SInfo.AffRate = rate; } function ChangeAffRequire(uint256 amount) public IsAdmin(){ SInfo.AffRequire = amount; } function WithdrawCRFIInterestPool(uint256 amount) public IsAdmin(){ SInfo.crfiInterestPool = SInfo.crfiInterestPool.sub(amount); CRFI.send(msg.sender, amount, ""); } function WithdrawCFilInterestPool(uint256 amount) public IsAdmin(){ SInfo.cfilInterestPool = SInfo.cfilInterestPool.sub(amount); CFil.send(msg.sender, amount, ""); } //////////////////// public function tokensReceived( address operator, address from, address to, uint256 amount, bytes calldata userData, bytes calldata operatorData) public override nonReentrant(){ ////////// check require(userData.length > 0, "no user data"); // mode = 0, normal bought financial package // mode = 2, charge cfil interest pool // mode = 3, charge crfi interest pool // mode = 4, loan cfil // mode = 5, repay cfil by loan (uint256 mode, uint256 param, address addr) = abi.decode(userData, (uint256,uint256, address)); require(from != address(0x0), "from is zero"); if(mode == 5){ _repayLoanCFil(from, amount); }else if(mode == 4){ _loanCFil(from, amount); }else if(mode == 3){ require(amount > 0, "no amount"); require(msg.sender == address(CRFI), "only charge crfi"); SInfo.crfiInterestPool = SInfo.crfiInterestPool.add(amount); return; }else if(mode == 2){ require(amount > 0, "no amount"); require(msg.sender == address(CFil), "only charge cfil"); SInfo.cfilInterestPool = SInfo.cfilInterestPool.add(amount); return; } else if (mode == 0){ _buyFinancialPackage(from, param, addr, amount); } else { revert("mode error"); } } function Withdraw(uint256 packageID, bool only, uint256 maxNum) public nonReentrant(){ InvestInfo storage uInfo = SInfo.Invests[getUID(msg.sender)]; uint256 cfil; uint256 cfilInterest; uint256 crfi; uint256 crfiInterest; (crfi, crfiInterest, cfil, cfilInterest) = _withdrawFinancial(uInfo, packageID, only, maxNum); if(crfi > 0){ uInfo.nowInvestFinCRFI = uInfo.nowInvestFinCRFI.sub(crfi); } if(cfil > 0){ uInfo.nowInvestFinCFil = uInfo.nowInvestFinCFil.sub(cfil); } withdrawCoin(uInfo.Addr, crfi, crfiInterest, cfil, cfilInterest); } //////////////////// view func function GetMap(string memory key) public view returns(string memory value){ return SInfo.kvMap[key]; } function GetFinancialPackage() public view returns(FinancialPackage[] memory packages){ packages = new FinancialPackage[](SInfo.Packages.length); for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){ packages[packageID] = SInfo.Packages[packageID]; packages[packageID].CRFIInterestRateDyn = getFinancialCRFIRate(SInfo.Packages[packageID]); } return packages; } function GetInvesterFinRecords(address addr) public view returns(QueueData[] memory records){ uint256 uid = SInfo.InvestAddrID[addr]; if(uid == 0){ return records; } InvestInfo storage uInfo = SInfo.Invests[uid]; uint256 recordSize = 0; for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){ ChainQueue storage chain = uInfo.InvestRecords[packageID]; recordSize = recordSize.add(chain.Size); } records = new QueueData[](recordSize); uint256 id = 0; for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){ ChainQueue storage chain = uInfo.InvestRecords[packageID]; if(chain.Size == 0){ continue; } ChainItem storage item = SInfo.ChainM.GetFirstItem(chain); for(;;){ records[id] = item.Data; id++; if(!SInfo.ChainM.HasNext(item)){ break; } item = SInfo.ChainM.Next(item); } } return records; } function GetSystemInfo() public view returns(SystemInfoView memory sInfoView){ sInfoView.AffRate = SInfo.AffRate; sInfoView.AffRequire = SInfo.AffRequire; sInfoView.EnableAffCFil = SInfo.EnableAffCFil; sInfoView.NewInvestID = SInfo.NewInvestID; sInfoView.nowInvestCRFI = SInfo.nowInvestCRFI; sInfoView.nowInvestCFil = SInfo.nowInvestCFil; sInfoView.cfilInterestPool = SInfo.cfilInterestPool; sInfoView.crfiInterestPool = SInfo.crfiInterestPool; sInfoView.cfilLendingTotal = SInfo.cfilLendingTotal; sInfoView.crfiRewardTotal = SInfo.crfiRewardTotal; sInfoView.avaiCFilAmount = SInfo.avaiCFilAmount; sInfoView.totalWeightCFil = SInfo.totalWeightCFil; sInfoView.totalWeightCRFI = SInfo.totalWeightCRFI; sInfoView.crfiMinerPerDayCFil = SInfo.crfiMinerPerDayCFil; sInfoView.crfiMinerPerDayCRFI = SInfo.crfiMinerPerDayCRFI; sInfoView.ParamUpdateTime = SInfo.ParamUpdateTime; return sInfoView; } function GetPackages() public view returns(FinancialPackage[] memory financialPackages, LoanCFilPackage memory loanCFil){ return (GetFinancialPackage(), SInfo.LoanCFil); } function GetInvestRecords(address addr) public view returns(QueueData[] memory records, LoanInvest memory loanInvest, InterestDetail[] memory interestDetail){ uint256 uid = SInfo.InvestAddrID[addr]; if(uid == 0){ return (records, loanInvest, interestDetail); } InvestInfo storage uInfo = SInfo.Invests[uid]; records = GetInvesterFinRecords(addr); interestDetail = new InterestDetail[](records.length+1); uint256 id = 0; for(; id < records.length; id++){ (interestDetail[id].crfiInterest, interestDetail[id].cfilInterest) = _calcInvestFinancial(records[id].PackageID, records[id].Amount, records[id].ParamCRFI, records[id].ParamCFil); } interestDetail[id].cfilInterest = calcInvestLoanStatus(uInfo); interestDetail[id].cfilInterest = interestDetail[id].cfilInterest.add(uInfo.LoanCFil.NowInterest); return(records, uInfo.LoanCFil, interestDetail); } function GetInvestInfo(uint256 uid, address addr) public view returns(bool admin, InvestInfoView memory uInfoView){ if(uid == 0){ uid = SInfo.InvestAddrID[addr]; } if(uid == 0){ if(addr != address(0x0)){ admin = (SInfo.SuperAdmin == addr) || (SInfo.Admins[addr]); } return (admin, uInfoView); } InvestInfo storage uInfo = SInfo.Invests[uid]; admin = (SInfo.SuperAdmin == uInfo.Addr) || (SInfo.Admins[uInfo.Addr]); uInfoView.Addr = uInfo.Addr; uInfoView.ID = uInfo.ID; uInfoView.affID = uInfo.affID; uInfoView.totalAffTimes = uInfo.totalAffTimes; uInfoView.totalAffPackageTimes = uInfo.totalAffPackageTimes; uInfoView.totalAffCRFI = uInfo.totalAffCRFI; uInfoView.totalAffCFil = uInfo.totalAffCFil; uInfoView.nowInvestFinCRFI = uInfo.nowInvestFinCRFI; uInfoView.nowInvestFinCFil = uInfo.nowInvestFinCFil; return (admin, uInfoView); } function calcSFilToCFil(uint256 sfil) public view returns(uint256 cfil){ cfil = sfil.mul(SInfo.LoanCFil.PledgeRate) / Decimal; return cfil; } function calcCFilToSFil(uint256 cfil) public view returns(uint256 sfil){ sfil = cfil.mul(Decimal) / SInfo.LoanCFil.PledgeRate; return sfil; } //////////////////// for debug function getChainMDetail() public view returns(ChainManager memory chaimM){ return SInfo.ChainM; } function getInvestChainDetail(uint256 id) public view returns(ChainQueue[] memory chains){ InvestInfo storage uInfo = SInfo.Invests[id]; chains = new ChainQueue[](SInfo.Packages.length); for(uint256 packageID = 0; packageID < SInfo.Packages.length; packageID++){ chains[packageID] = uInfo.InvestRecords[packageID]; } return chains; } //////////////////// internal func function _repayLoanCFil(address from, uint256 cfilAmount) internal{ require(cfilAmount > 0, "no cfil amount"); require(msg.sender == address(CFil), "not cfil coin type"); InvestInfo storage uInfo = SInfo.Invests[getUID(from)]; updateInvesterLoanCFil(uInfo); // deal interest uint256 repayInterest = cfilAmount; if(uInfo.LoanCFil.NowInterest < cfilAmount){ repayInterest = uInfo.LoanCFil.NowInterest; } uInfo.LoanCFil.NowInterest = uInfo.LoanCFil.NowInterest.sub(repayInterest); SInfo.cfilInterestPool = SInfo.cfilInterestPool.add(repayInterest); cfilAmount = cfilAmount.sub(repayInterest); // deal lending if(cfilAmount == 0){ return; } uint256 repayLending = cfilAmount; if(uInfo.LoanCFil.Lending < cfilAmount){ repayLending = uInfo.LoanCFil.Lending; } uint256 pledge = repayLending.mul(uInfo.LoanCFil.Pledge) / uInfo.LoanCFil.Lending; uInfo.LoanCFil.Lending = uInfo.LoanCFil.Lending.sub(repayLending); uInfo.LoanCFil.Pledge = uInfo.LoanCFil.Pledge.sub(pledge); SInfo.cfilLendingTotal = SInfo.cfilLendingTotal.sub(repayLending); SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.add(repayLending); cfilAmount = cfilAmount.sub(repayLending); if(pledge > 0){ SFil.send(from, pledge, ""); } if(cfilAmount > 0){ CFil.send(from, cfilAmount, ""); } } function _loanCFil(address from, uint256 sfilAmount) internal{ require(sfilAmount > 0, "no sfil amount"); require(msg.sender == address(SFil), "not sfil coin type"); uint256 cfilAmount = calcSFilToCFil(sfilAmount); require(cfilAmount <= SInfo.avaiCFilAmount, "not enough cfil to loan"); require(cfilAmount >= SInfo.LoanCFil.PaymentDue99, "cfil amount is too small"); InvestInfo storage uInfo = SInfo.Invests[getUID(from)]; updateInvesterLoanCFil(uInfo); if(uInfo.LoanCFil.Param < SInfo.LoanCFil.Param){ uInfo.LoanCFil.Param = SInfo.LoanCFil.Param; } uInfo.LoanCFil.Lending = uInfo.LoanCFil.Lending.add(cfilAmount); uInfo.LoanCFil.Pledge = uInfo.LoanCFil.Pledge.add(sfilAmount); SInfo.cfilLendingTotal = SInfo.cfilLendingTotal.add(cfilAmount); SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.sub(cfilAmount); CFil.send(from, cfilAmount, ""); emit loanCFilEvent(from, cfilAmount, sfilAmount); } function _buyFinancialPackage(address from, uint256 packageID, address affAddr, uint256 amount) internal{ // check require(amount > 0, "no amount"); require(packageID < SInfo.Packages.length, "invalid packageID"); FinancialPackage storage package = SInfo.Packages[packageID]; if(package.Type == FinancialType.CRFI){ require(msg.sender == address(CRFI), "not CRFI coin type"); }else if(package.Type == FinancialType.CFil){ require(msg.sender == address(CFil), "not CFil coin type"); } else { revert("not avai package type"); } updateAllParam(); // exec InvestInfo storage uInfo = SInfo.Invests[getUID(from)]; uint256 affID = uInfo.affID; if(affID == 0 && affAddr != from && affAddr != address(0x0)){ uInfo.affID = getUID(affAddr); affID = uInfo.affID; } if(package.Days == 0){ affID = 0; } if(affID != 0){ InvestInfo storage affInfo = SInfo.Invests[affID]; affInfo.totalAffPackageTimes++; emit AffBought(affAddr, from, affInfo.totalAffPackageTimes, amount, packageID, block.timestamp); } ChainQueue storage recordQ = uInfo.InvestRecords[package.ID]; ChainItem storage item = SInfo.ChainM.GetAvaiItem(); item.Data.Type = package.Type; item.Data.PackageID = package.ID; item.Data.Days = package.Days; item.Data.EndTime = block.timestamp.add(package.Days.mul(OneDayTime)); item.Data.AffID = affID; item.Data.Amount = amount; item.Data.ParamCRFI = package.ParamCRFI; item.Data.ParamCFil = package.ParamCFil; SInfo.ChainM.PushEndItem(recordQ, item); ////////// for statistic package.Total = package.Total.add(amount); if(package.Type == FinancialType.CRFI){ uInfo.nowInvestFinCRFI = uInfo.nowInvestFinCRFI.add(amount); SInfo.nowInvestCRFI = SInfo.nowInvestCRFI.add(amount); SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.add(amount.mul(package.Weight) / Decimal); } else if(package.Type == FinancialType.CFil){ uInfo.nowInvestFinCFil = uInfo.nowInvestFinCFil.add(amount); SInfo.nowInvestCFil = SInfo.nowInvestCFil.add(amount); SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.add(amount); SInfo.totalWeightCFil = SInfo.totalWeightCFil.add(amount.mul(package.Weight) / Decimal); } } function _withdrawFinancial(InvestInfo storage uInfo, uint256 onlyPackageID, bool only, uint256 maxNum) internal returns(uint256 crfi, uint256 crfiInterest, uint256 cfil, uint256 cfilInterest){ updateAllParam(); if(!only){ onlyPackageID = 0; } if(maxNum == 0){ maxNum -= 1; } (uint256 packageID, ChainItem storage item, bool has) = getFirstValidItem(uInfo, onlyPackageID); while(has && maxNum > 0 && (!only || packageID == onlyPackageID)){ maxNum--; QueueData storage data = item.Data; FinancialPackage storage package = SInfo.Packages[data.PackageID]; (uint256 _crfiInterest, uint256 _cfilInterest) = calcInvestFinancial(data); crfiInterest = crfiInterest.add(_crfiInterest); cfilInterest = cfilInterest.add(_cfilInterest); addAffCRFI(uInfo, data, _crfiInterest, _cfilInterest); if((block.timestamp > data.EndTime && data.Days > 0) || (data.Days ==0 && only)){ package.Total = package.Total.sub(data.Amount); if(data.Type == FinancialType.CFil){ cfil = cfil.add(data.Amount); SInfo.totalWeightCFil = SInfo.totalWeightCFil.sub(data.Amount.mul(package.Weight) / Decimal); } else { crfi = crfi.add(data.Amount); SInfo.totalWeightCRFI = SInfo.totalWeightCRFI.sub(data.Amount.mul(package.Weight) / Decimal); } SInfo.ChainM.PopPutFirst(uInfo.InvestRecords[packageID]); (packageID, item, has) = getFirstValidItem(uInfo, packageID); } else { data.ParamCRFI = package.ParamCRFI; data.ParamCFil = package.ParamCFil; (packageID, item, has) = getNextItem(uInfo, packageID, item); } } return (crfi, crfiInterest, cfil, cfilInterest); } function getUID(address addr) internal returns(uint256 uID){ uID = SInfo.InvestAddrID[addr]; if(uID != 0){ return uID; } SInfo.NewInvestID++; uID = SInfo.NewInvestID; InvestInfo storage uInfo = SInfo.Invests[uID]; uInfo.Addr = addr; uInfo.ID = uID; SInfo.InvestAddrID[addr] = uID; return uID; } function calcSystemLoanStatus() internal view returns(uint256 param){ if(block.timestamp == SInfo.LoanCFil.UpdateTime){ return SInfo.LoanCFil.Param; } uint256 diffSec = block.timestamp.sub(SInfo.LoanCFil.UpdateTime); param = SInfo.LoanCFil.Param.add(calcInterest(Decimal, SInfo.LoanCFil.APY, diffSec)); return param; } function calcInvestLoanStatus(InvestInfo storage uInfo) internal view returns(uint256 cfilInterest){ if(uInfo.LoanCFil.Lending == 0){ return 0; } uint256 param = calcSystemLoanStatus(); if(uInfo.LoanCFil.Param >= param){ return 0; } cfilInterest = uInfo.LoanCFil.Lending.mul(param.sub(uInfo.LoanCFil.Param)) / Decimal; return cfilInterest; } function updateSystemLoanStatus() internal{ uint256 param; param = calcSystemLoanStatus(); if(param <= SInfo.LoanCFil.Param){ return; } SInfo.LoanCFil.Param = param; SInfo.LoanCFil.UpdateTime = block.timestamp; } function updateInvesterLoanCFil(InvestInfo storage uInfo) internal{ updateSystemLoanStatus(); uint256 cfilInterest = calcInvestLoanStatus(uInfo); if(cfilInterest == 0){ return; } uInfo.LoanCFil.Param = SInfo.LoanCFil.Param; uInfo.LoanCFil.NowInterest = uInfo.LoanCFil.NowInterest.add(cfilInterest); } function calcInterest(uint256 amount, uint256 rate, uint256 sec) internal view returns(uint256){ return amount.mul(rate).mul(sec) / 365 / OneDayTime / Decimal; } function getFirstValidItem(InvestInfo storage uInfo, uint256 packageID) internal view returns(uint256 newPackageID, ChainItem storage item, bool has){ while(packageID < SInfo.Packages.length){ ChainQueue storage chain = uInfo.InvestRecords[packageID]; if(chain.Size == 0){ packageID++; continue; } item = SInfo.ChainM.GetFirstItem(chain); return (packageID, item, true); } return (0, SInfo.ChainM.GetNullItem(), false); } function getNextItem(InvestInfo storage uInfo, uint256 packageID, ChainItem storage item) internal view returns(uint256, ChainItem storage, bool){ if(packageID >= SInfo.Packages.length){ return (0, item, false); } if(SInfo.ChainM.HasNext(item)){ return (packageID, SInfo.ChainM.Next(item), true); } return getFirstValidItem(uInfo, packageID+1); } function addAffCRFI(InvestInfo storage uInfo, QueueData storage data, uint256 crfiInterest, uint256 cfilInterest) internal{ if(data.Days == 0){ return; } uint256 affID = data.AffID; if(affID == 0){ return; } InvestInfo storage affInfo = SInfo.Invests[affID]; if(affInfo.nowInvestFinCFil < SInfo.AffRequire){ return; } uint256 affCRFI = crfiInterest.mul(SInfo.AffRate) / Decimal; uint256 affCFil; bool emitFlag; if(affCRFI != 0){ emitFlag = true; affInfo.totalAffCRFI = affInfo.totalAffCRFI.add(affCRFI); } if(SInfo.EnableAffCFil > 0){ affCFil = cfilInterest.mul(SInfo.AffRate) / Decimal; if(affCFil != 0){ emitFlag = true; affInfo.totalAffCFil = affInfo.totalAffCFil.add(affCFil); } } if(!emitFlag){ return; } affInfo.totalAffTimes++; emit AffEvent(affInfo.Addr, uInfo.Addr, affInfo.totalAffTimes, affCRFI, affCFil, data.PackageID, block.timestamp); withdrawCoin(affInfo.Addr, 0, affCRFI, 0, affCFil); } function withdrawCoin(address addr, uint256 crfi, uint256 crfiInterest, uint256 cfil, uint256 cfilInterest) internal{ require(cfil <= SInfo.nowInvestCFil, "cfil invest now error"); require(cfil <= SInfo.avaiCFilAmount, "not enough cfil to withdraw"); require(crfi <= SInfo.nowInvestCRFI, "crfi invest now error"); if(cfil > 0){ SInfo.nowInvestCFil = SInfo.nowInvestCFil.sub(cfil); SInfo.avaiCFilAmount = SInfo.avaiCFilAmount.sub(cfil); } if(crfi > 0){ SInfo.nowInvestCRFI = SInfo.nowInvestCRFI.sub(crfi); } if(cfilInterest > 0){ require(SInfo.cfilInterestPool >= cfilInterest, "cfil interest pool is not enough"); SInfo.cfilInterestPool = SInfo.cfilInterestPool.sub(cfilInterest); cfil = cfil.add(cfilInterest); } if(crfiInterest > 0){ require(SInfo.crfiInterestPool >= crfiInterest, "crfi interest pool is not enough"); SInfo.crfiInterestPool = SInfo.crfiInterestPool.sub(crfiInterest); crfi = crfi.add(crfiInterest); SInfo.crfiRewardTotal = SInfo.crfiRewardTotal.add(crfiInterest); } if(cfil > 0){ CFil.send(addr, cfil, ""); } if(crfi > 0){ CRFI.send(addr, crfi, ""); } } //////////////////// for update param function getFinancialCRFIRate(FinancialPackage storage package) internal view returns(uint256 rate){ if(package.Total == 0){ return 0; } uint256 x = package.Total.mul(package.Weight); if(package.Type == FinancialType.CRFI){ if(SInfo.totalWeightCRFI == 0){ return 0; } rate = x.mul(SInfo.crfiMinerPerDayCRFI) / SInfo.totalWeightCRFI; } else { if(SInfo.totalWeightCFil == 0){ return 0; } rate = x.mul(SInfo.crfiMinerPerDayCFil) / SInfo.totalWeightCFil; } rate = rate.mul(365) / package.Total ; return rate; } function calcFinancialParam(FinancialPackage storage package) internal view returns(uint256 paramCRFI, uint256 paramCFil){ uint256 diffSec = block.timestamp.sub(SInfo.ParamUpdateTime); if(diffSec == 0){ return (package.ParamCRFI, package.ParamCFil); } paramCFil = package.ParamCFil.add(calcInterest(Decimal, package.CFilInterestRate, diffSec)); paramCRFI = package.ParamCRFI.add(calcInterest(Decimal, getFinancialCRFIRate(package), diffSec)); return (paramCRFI, paramCFil); } function updateFinancialParam(FinancialPackage storage package) internal{ (package.ParamCRFI, package.ParamCFil) = calcFinancialParam(package); } function updateAllParam() internal{ if(block.timestamp == SInfo.ParamUpdateTime){ return; } for(uint256 i = 0; i < SInfo.Packages.length; i++){ updateFinancialParam(SInfo.Packages[i]); } SInfo.ParamUpdateTime = block.timestamp; } function _calcInvestFinancial(uint256 packageID, uint256 amount, uint256 paramCRFI, uint256 paramCFil) internal view returns(uint256 crfiInterest, uint256 cfilInterest){ FinancialPackage storage package = SInfo.Packages[packageID]; (uint256 packageParamCRFI, uint256 packageParamCFil) = calcFinancialParam(package); crfiInterest = amount.mul(packageParamCRFI.sub(paramCRFI)) / Decimal; cfilInterest = amount.mul(packageParamCFil.sub(paramCFil)) / Decimal; return(crfiInterest, cfilInterest); } function calcInvestFinancial(QueueData storage data) internal view returns(uint256 crfiInterest, uint256 cfilInterest){ return _calcInvestFinancial(data.PackageID, data.Amount, data.ParamCRFI, data.ParamCFil); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"crfiAddr","type":"address"},{"internalType":"address","name":"cfilAddr","type":"address"},{"internalType":"address","name":"sfilAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affer","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"affPackageTimes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"packageID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AffBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"affTimes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"crfiInterest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cfilInterest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"packageID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AffEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"cfilAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sfilAmount","type":"uint256"}],"name":"loanCFilEvent","type":"event"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"AddAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FinancialType","name":"_type","type":"uint8"},{"internalType":"uint256","name":"dayTimes","type":"uint256"},{"internalType":"uint256","name":"cfilInterestRate","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"AddPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"CFil","outputs":[{"internalType":"contract IERC777","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRFI","outputs":[{"internalType":"contract IERC777","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"ChangeAffCFil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"ChangeAffRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChangeAffRequire","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"crfi","type":"uint256"},{"internalType":"uint256","name":"cfil","type":"uint256"}],"name":"ChangeCRFIMinerPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"apy","type":"uint256"},{"internalType":"uint256","name":"pledgeRate","type":"uint256"},{"internalType":"uint256","name":"paymentDue","type":"uint256"}],"name":"ChangeLoanRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"uint256","name":"cfilInterestRate","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"ChangePackageRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"suAdmin","type":"address"}],"name":"ChangeSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"DelAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"GetFinancialPackage","outputs":[{"components":[{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"CFilInterestRate","type":"uint256"},{"internalType":"uint256","name":"CRFIInterestRateDyn","type":"uint256"},{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"Weight","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"},{"internalType":"uint256","name":"Total","type":"uint256"}],"internalType":"struct FinancialPackage[]","name":"packages","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"uid","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"GetInvestInfo","outputs":[{"internalType":"bool","name":"admin","type":"bool"},{"components":[{"internalType":"address","name":"Addr","type":"address"},{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"affID","type":"uint256"},{"internalType":"uint256","name":"totalAffTimes","type":"uint256"},{"internalType":"uint256","name":"totalAffPackageTimes","type":"uint256"},{"internalType":"uint256","name":"totalAffCRFI","type":"uint256"},{"internalType":"uint256","name":"totalAffCFil","type":"uint256"},{"internalType":"uint256","name":"nowInvestFinCRFI","type":"uint256"},{"internalType":"uint256","name":"nowInvestFinCFil","type":"uint256"}],"internalType":"struct InvestInfoView","name":"uInfoView","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"GetInvestRecords","outputs":[{"components":[{"internalType":"uint256","name":"RecordID","type":"uint256"},{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"PackageID","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"EndTime","type":"uint256"},{"internalType":"uint256","name":"AffID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"}],"internalType":"struct QueueData[]","name":"records","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"Lending","type":"uint256"},{"internalType":"uint256","name":"Pledge","type":"uint256"},{"internalType":"uint256","name":"Param","type":"uint256"},{"internalType":"uint256","name":"NowInterest","type":"uint256"}],"internalType":"struct LoanInvest","name":"loanInvest","type":"tuple"},{"components":[{"internalType":"uint256","name":"crfiInterest","type":"uint256"},{"internalType":"uint256","name":"cfilInterest","type":"uint256"}],"internalType":"struct InterestDetail[]","name":"interestDetail","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"GetInvesterFinRecords","outputs":[{"components":[{"internalType":"uint256","name":"RecordID","type":"uint256"},{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"PackageID","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"EndTime","type":"uint256"},{"internalType":"uint256","name":"AffID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"}],"internalType":"struct QueueData[]","name":"records","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"}],"name":"GetMap","outputs":[{"internalType":"string","name":"value","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetPackages","outputs":[{"components":[{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"CFilInterestRate","type":"uint256"},{"internalType":"uint256","name":"CRFIInterestRateDyn","type":"uint256"},{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"Weight","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"},{"internalType":"uint256","name":"Total","type":"uint256"}],"internalType":"struct FinancialPackage[]","name":"financialPackages","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"APY","type":"uint256"},{"internalType":"uint256","name":"PledgeRate","type":"uint256"},{"internalType":"uint256","name":"PaymentDue","type":"uint256"},{"internalType":"uint256","name":"PaymentDue99","type":"uint256"},{"internalType":"uint256","name":"UpdateTime","type":"uint256"},{"internalType":"uint256","name":"Param","type":"uint256"}],"internalType":"struct LoanCFilPackage","name":"loanCFil","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetSystemInfo","outputs":[{"components":[{"internalType":"uint256","name":"AffRate","type":"uint256"},{"internalType":"uint256","name":"AffRequire","type":"uint256"},{"internalType":"uint256","name":"EnableAffCFil","type":"uint256"},{"internalType":"uint256","name":"NewInvestID","type":"uint256"},{"internalType":"uint256","name":"nowInvestCRFI","type":"uint256"},{"internalType":"uint256","name":"nowInvestCFil","type":"uint256"},{"internalType":"uint256","name":"cfilInterestPool","type":"uint256"},{"internalType":"uint256","name":"crfiInterestPool","type":"uint256"},{"internalType":"uint256","name":"cfilLendingTotal","type":"uint256"},{"internalType":"uint256","name":"crfiRewardTotal","type":"uint256"},{"internalType":"uint256","name":"avaiCFilAmount","type":"uint256"},{"internalType":"uint256","name":"totalWeightCFil","type":"uint256"},{"internalType":"uint256","name":"totalWeightCRFI","type":"uint256"},{"internalType":"uint256","name":"crfiMinerPerDayCFil","type":"uint256"},{"internalType":"uint256","name":"crfiMinerPerDayCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamUpdateTime","type":"uint256"}],"internalType":"struct SystemInfoView","name":"sInfoView","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OneDayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SFil","outputs":[{"internalType":"contract IERC777","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"SetMap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"bool","name":"only","type":"bool"},{"internalType":"uint256","name":"maxNum","type":"uint256"}],"name":"Withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawCFilInterestPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawCRFIInterestPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cfil","type":"uint256"}],"name":"calcCFilToSFil","outputs":[{"internalType":"uint256","name":"sfil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sfil","type":"uint256"}],"name":"calcSFilToCFil","outputs":[{"internalType":"uint256","name":"cfil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainMDetail","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"Next","type":"uint256"},{"internalType":"uint256","name":"Prev","type":"uint256"},{"internalType":"uint256","name":"My","type":"uint256"},{"components":[{"internalType":"uint256","name":"RecordID","type":"uint256"},{"internalType":"enum FinancialType","name":"Type","type":"uint8"},{"internalType":"uint256","name":"PackageID","type":"uint256"},{"internalType":"uint256","name":"Days","type":"uint256"},{"internalType":"uint256","name":"EndTime","type":"uint256"},{"internalType":"uint256","name":"AffID","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"ParamCRFI","type":"uint256"},{"internalType":"uint256","name":"ParamCFil","type":"uint256"}],"internalType":"struct QueueData","name":"Data","type":"tuple"}],"internalType":"struct ChainItem[]","name":"rawQueue","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"First","type":"uint256"},{"internalType":"uint256","name":"End","type":"uint256"},{"internalType":"uint256","name":"Size","type":"uint256"}],"internalType":"struct ChainQueue","name":"avaiQueue","type":"tuple"}],"internalType":"struct ChainManager","name":"chaimM","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getInvestChainDetail","outputs":[{"components":[{"internalType":"uint256","name":"First","type":"uint256"},{"internalType":"uint256","name":"End","type":"uint256"},{"internalType":"uint256","name":"Size","type":"uint256"}],"internalType":"struct ChainQueue[]","name":"chains","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004a1638038062004a168339810160408190526200003491620007dd565b60016000819055602280546001600160a01b038087166001600160a01b031992831617909255602380548684169083161790556024805492851692821692909217909155620151809091556013805490911633179055600a670de0b6b3a7640000046003556001600555620000b6600c620002e9602090811b620018e617901c565b69040fa553262d67700000601e556901bd900936eb031e0000601f5542602055620000fc6702ca186f5fda80006707c5850872380000687caee97613e670000062000300565b42600a55620001256000806103e86801158e460913d000005b04670de0b6b3a7640000620003af565b6200014f6000605a6103e86801bc16d674ec8000005b04600a67d02ab486cedc00005b04620003af565b62000175600060b46103e86801d7d843dc3b4800005b04671bc16d674ec80000620003af565b6200019f600061016d6103e86801f399b1438a1000005b04600a68015af1d78b58c4000062000148565b620001c6600061021c6103e868022b1c8c1227a000005b046729a2241af62c0000620003af565b620001e1600160006103e86801158e460913d0000062000115565b620001fc6001605a6103e86801c9f78d2893e400006200013b565b62000217600160b46103e86801e5b8fa8fe2ac000062000165565b62000233600161016d6103e86802017a67f7317400006200018c565b6200024f600161021c6103e8680238fd42c5cf040000620001b6565b6040516329965a1d60e01b8152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90620002ac9030907fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b90829060040162000826565b600060405180830381600087803b158015620002c757600080fd5b505af1158015620002dc573d6000803e3d6000fd5b5050505050505062000953565b8054620002fd578054600101815560008190525b50565b6013546001600160a01b03163314806200032957503360009081526014602052604090205460ff165b620003515760405162461bcd60e51b81526004016200034890620008b7565b60405180910390fd5b60008211620003745760405162461bcd60e51b8152600401620003489062000849565b60068390556007829055600881905560646200039e82606362000470602090811b620018f817901c565b81620003a657fe5b04600955505050565b6013546001600160a01b0316331480620003d857503360009081526014602052604090205460ff165b620003f75760405162461bcd60e51b81526004016200034890620008b7565b62000401620004b9565b60028054600181018083556000838152919290839081106200041f57fe5b6000918252602090912060099091020180549091508690829060ff1916600183818111156200044a57fe5b021790555060018101949094556005840191909155600283019190915560049091015550565b6000826200048157506000620004b3565b828202828482816200048f57fe5b0414620004b05760405162461bcd60e51b8152600401620003489062000912565b90505b92915050565b602054421415620004ca5762000516565b60005b60025481101562000510576200050760026000018281548110620004ed57fe5b90600052602060002090600902016200051860201b60201c565b600101620004cd565b50426020555b565b620005238162000530565b6007830155600690910155565b6000806000620005546002601e015442620005f260201b6200193b1790919060201c565b9050806200056f5750505060068101546007820154620005ed565b620005ab62000592670de0b6b3a76400008660020154846200061d60201b60201c565b85600701546200068460201b620019631790919060201c565b9150620005e9620005d0670de0b6b3a7640000620005c987620006ac565b846200061d565b85600601546200068460201b620019631790919060201c565b9250505b915091565b600082821115620006175760405162461bcd60e51b81526004016200034890620008db565b50900390565b6000670de0b6b3a764000060015461016d62000661856200064d888a6200047060201b620018f81790919060201c565b6200047060201b620018f81790919060201c565b816200066957fe5b04816200067257fe5b04816200067b57fe5b04949350505050565b600082820183811015620004b05760405162461bcd60e51b8152600401620003489062000880565b6000816008015460001415620006c557506000620007c0565b6000620006e9836005015484600801546200047060201b620018f81790919060201c565b90506000835460ff166001811115620006fe57fe5b14156200074e57601d5462000718576000915050620007c0565b6002601b01546200073d6002601d0154836200047060201b620018f81790919060201c565b816200074557fe5b04915062000792565b601c5462000761576000915050620007c0565b6002601a0154620007866002601c0154836200047060201b620018f81790919060201c565b816200078e57fe5b0491505b8260080154620007b361016d846200047060201b620018f81790919060201c565b81620007bb57fe5b049150505b919050565b80516001600160a01b0381168114620007c057600080fd5b600080600060608486031215620007f2578283fd5b620007fd84620007c5565b92506200080d60208501620007c5565b91506200081d60408501620007c5565b90509250925092565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60208082526015908201527f706c6564676520726174652063616e2774203d20300000000000000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6140b380620009636000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806387e3dfe211610104578063c211acf2116100a2578063e3adffab11610071578063e3adffab14610405578063e640207714610418578063f550810114610438578063f56033171461044b576101d9565b8063c211acf2146103c4578063c7c13b3a146103d7578063cc297ab1146103ea578063d8359117146103f2576101d9565b8063a834f5b7116100de578063a834f5b714610381578063ad6de44514610396578063b6932914146103a9578063bace1a36146103bc576101d9565b806387e3dfe21461033b5780639c1857d41461035b5780639fa8f0131461036e576101d9565b806338309b851161017c578063470c23821161014b578063470c2382146102de578063497cb411146103005780636f73ae00146103155780638719bfb114610328576101d9565b806338309b85146102755780633a64ebec146102955780633daa551c146102a85780633dd8fe11146102be576101d9565b80630faf728a116101b85780630faf728a14610232578063119577a41461024557806312efe4b31461025a5780632ef3da231461026d576101d9565b806223de29146101de5780630696ecaa146101f35780630a28b8a91461021d575b600080fd5b6101f16101ec36600461324d565b61045e565b005b61020661020136600461340d565b610628565b6040516102149291906137e3565b60405180910390f35b61022561075a565b604051610214919061385c565b6101f1610240366004613394565b610769565b61024d6107e7565b6040516102149190613f48565b6101f1610268366004613231565b61087a565b610225610904565b610288610283366004613231565b610913565b6040516102149190613747565b6101f16102a33660046134c9565b610ae8565b6102b0610c5d565b6040516102149291906136f2565b6102d16102cc3660046133f5565b610cb1565b6040516102149190613ff4565b6102f16102ec366004613231565b610cda565b6040516102149392919061375a565b610308610edf565b60405161021491906136df565b6101f16103233660046133f5565b611044565b6101f16103363660046134c9565b6110f8565b61034e610349366004613359565b611188565b6040516102149190613870565b6101f16103693660046133f5565b611238565b6102d161037c3660046133f5565b611281565b610389611299565b6040516102149190613eba565b6101f16103a4366004613231565b6113ec565b6101f16103b7366004613231565b611473565b6102256114f6565b6101f16103d2366004613470565b611505565b6101f16103e536600461343c565b611559565b6102d161160c565b6101f16104003660046132fb565b611612565b6101f161041336600461331c565b61168e565b61042b6104263660046133f5565b611747565b6040516102149190613691565b6101f16104463660046133f5565b611817565b6101f16104593660046133f5565b61189d565b6002600054141561048a5760405162461bcd60e51b815260040161048190613e4c565b60405180910390fd5b6002600055826104ac5760405162461bcd60e51b815260040161048190613b91565b600080806104bc86880188613491565b919450925090506001600160a01b038a166104e95760405162461bcd60e51b815260040161048190613dd6565b8260051415610501576104fc8a89611988565b610615565b8260041415610514576104fc8a89611bb7565b8260031415610580576000881161053d5760405162461bcd60e51b815260040161048190613c6a565b6022546001600160a01b031633146105675760405162461bcd60e51b815260040161048190613b3b565b6018546105749089611963565b60185550610619915050565b82600214156105ec57600088116105a95760405162461bcd60e51b815260040161048190613c6a565b6023546001600160a01b031633146105d35760405162461bcd60e51b815260040161048190613cbd565b6017546105e09089611963565b60175550610619915050565b826105fd576104fc8a83838b611d86565b60405162461bcd60e51b815260040161048190613d87565b5050505b50506001600055505050505050565b6000610632612eab565b83610653576001600160a01b03831660009081526012602052604090205493505b836106a3576001600160a01b0383161561069e576013546001600160a01b038481169116148061069b57506001600160a01b03831660009081526014602052604090205460ff165b91505b610753565b600084815260116020526040902060018101546013546001600160a01b03908116911614806106ee575060018101546001600160a01b031660009081526014602052604090205460ff165b60018201546001600160a01b0316835260028201546020840152600382015460408401526008820154606084015260098201546080840152600a82015460a0840152600b82015460c0840152600c82015460e0840152600d9091015461010083015291505b9250929050565b6023546001600160a01b031681565b6013546001600160a01b031633148061079157503360009081526014602052604090205460ff165b6107ad5760405162461bcd60e51b815260040161048190613bb7565b806002601f01836040516107c1919061364d565b908152602001604051809103902090805190602001906107e2929190612f00565b505050565b6107ef612f88565b600354815260045460208083019190915260055460408301526010546060830152601554608083015260165460a083015260175460c083015260185460e0830152601954610100830152601a54610120830152601b54610140830152601c54610160830152601d54610180830152601e546101a0830152601f546101c0830152546101e08201525b90565b6013546001600160a01b031633146108a45760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b0381166108ca5760405162461bcd60e51b815260040161048190613a4c565b6013546001600160a01b03828116911614156108e557610901565b601380546001600160a01b0319166001600160a01b0383161790555b50565b6022546001600160a01b031681565b6001600160a01b0381166000908152601260205260409020546060908061093a5750610ae3565b600081815260116020526040812090805b60025481101561097e5760008181526020849052604090206002810154610973908490611963565b92505060010161094b565b508067ffffffffffffffff8111801561099657600080fd5b506040519080825280602002602001820160405280156109d057816020015b6109bd613005565b8152602001906001900390816109b55790505b5093506000805b600254811015610add57600081815260208590526040902060028101546109fe5750610ad5565b6000610a0b600c8361213d565b90505b60408051610120810190915260038201805482526004830154602083019060ff166001811115610a3a57fe5b6001811115610a4557fe5b8152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050888581518110610a9b57fe5b6020908102919091010152600190930192610ab7600c82612187565b610ac057610ad2565b610acb600c826121a1565b9050610a0e565b50505b6001016109d7565b50505050505b919050565b6013546001600160a01b0316331480610b1057503360009081526014602052604090205460ff165b610b2c5760405162461bcd60e51b815260040161048190613bb7565b6002548310610b4d5760405162461bcd60e51b8152600401610481906138f8565b610b556121e9565b600060026000018481548110610b6757fe5b906000526020600020906009020190508281600201819055506000670de0b6b3a7640000610ba6836005015484600801546118f890919063ffffffff16565b81610bad57fe5b0490506000825460ff166001811115610bc257fe5b1415610bdd57601d54610bd5908261193b565b601d55610bee565b601c54610bea908261193b565b601c555b600582018390556008820154670de0b6b3a764000090610c0e90856118f8565b81610c1557fe5b0490506000825460ff166001811115610c2a57fe5b1415610c4557601d54610c3d9082611963565b601d55610c56565b601c54610c529082611963565b601c555b5050505050565b6060610c67613052565b610c6f610edf565b6040805160c08101825260065481526007546020820152600854918101919091526009546060820152600a546080820152600b5460a082015290925090509091565b600754600090670de0b6b3a764000090610ccc9084906118f8565b81610cd357fe5b0492915050565b6060610ce4613088565b6001600160a01b03831660009081526012602052604090205460609080610d0b5750610ed8565b6000818152601160205260409020610d2286610913565b9450845160010167ffffffffffffffff81118015610d3f57600080fd5b50604051908082528060200260200182016040528015610d7957816020015b610d666130b0565b815260200190600190039081610d5e5790505b50925060005b8551811015610e2e57610df1868281518110610d9757fe5b602002602001015160400151878381518110610daf57fe5b602002602001015160c00151888481518110610dc757fe5b602002602001015160e00151898581518110610ddf57fe5b6020026020010151610100015161223b565b858381518110610dfd57fe5b6020026020010151600001868481518110610e1457fe5b602090810291909101810151019190915252600101610d7f565b610e37826122c4565b848281518110610e4357fe5b60200260200101516020018181525050610e848260040160030154858381518110610e6a57fe5b60200260200101516020015161196390919063ffffffff16565b848281518110610e9057fe5b60209081029190910181015181019190915260408051608081018252600485015481526005850154928101929092526006840154908201526007909201546060830152509250505b9193909250565b60025460609067ffffffffffffffff81118015610efb57600080fd5b50604051908082528060200260200182016040528015610f3557816020015b610f226130ca565b815260200190600190039081610f1a5790505b50905060005b600254811015611040576002805482908110610f5357fe5b600091825260209091206040805161012081019091526009909202018054829060ff166001811115610f8157fe5b6001811115610f8c57fe5b815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050828281518110610fec57fe5b602002602001018190525061101d6002600001828154811061100a57fe5b9060005260206000209060090201612334565b82828151811061102957fe5b602090810291909101015160600152600101610f3b565b5090565b6013546001600160a01b031633148061106c57503360009081526014602052604090205460ff165b6110885760405162461bcd60e51b815260040161048190613bb7565b601754611095908261193b565b601755602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b600060405180830381600087803b1580156110e457600080fd5b505af1158015610c56573d6000803e3d6000fd5b6013546001600160a01b031633148061112057503360009081526014602052604090205460ff165b61113c5760405162461bcd60e51b815260040161048190613bb7565b6000821161115c5760405162461bcd60e51b8152600401610481906139f1565b60068390556007829055600881905560646111788260636118f8565b8161117f57fe5b04600955505050565b60606002601f018260405161119d919061364d565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b50505050509050919050565b6013546001600160a01b031633148061126057503360009081526014602052604090205460ff165b61127c5760405162461bcd60e51b815260040161048190613bb7565b600355565b600754600090610ccc83670de0b6b3a76400006118f8565b6112a1613117565b60408051600c80546060602082028401810185529383018181529293919284929091849160009085015b828210156113ad57838290600052602060002090600c02016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160405180610120016040529081600082015481526020016001820160009054906101000a900460ff16600181111561134557fe5b600181111561135057fe5b815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152505081525050815260200190600101906112cb565b50505050815260200160018201604051806060016040529081600082015481526020016001820154815260200160028201548152505081525050905090565b6013546001600160a01b031633146114165760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff161561144f5760405162461bcd60e51b815260040161048190613adc565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b6013546001600160a01b0316331461149d5760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff166114d55760405162461bcd60e51b815260040161048190613c8d565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6024546001600160a01b031681565b6013546001600160a01b031633148061152d57503360009081526014602052604090205460ff165b6115495760405162461bcd60e51b815260040161048190613bb7565b6115516121e9565b601e55601f55565b6002600054141561157c5760405162461bcd60e51b815260040161048190613e4c565b6002600090815560118161158f336123f1565b815260200190815260200160002090506000806000806115b18589898961246d565b9096509450909250905081156115d657600c8501546115d0908361193b565b600c8601555b83156115f157600d8501546115eb908561193b565b600d8601555b6001850154610619906001600160a01b0316838387876126b7565b60015481565b6013546001600160a01b031633148061163a57503360009081526014602052604090205460ff165b6116565760405162461bcd60e51b815260040161048190613bb7565b8080156116635750600554155b15611672576001600555610901565b80158015611681575060055415155b1561090157600060055550565b6013546001600160a01b03163314806116b657503360009081526014602052604090205460ff165b6116d25760405162461bcd60e51b815260040161048190613bb7565b6116da6121e9565b60028054600181018083556000838152919290839081106116f757fe5b6000918252602090912060099091020180549091508690829060ff19166001838181111561172157fe5b021790555060018101949094556005840191909155600283019190915560049091015550565b60008181526011602052604090206002546060919067ffffffffffffffff8111801561177257600080fd5b506040519080825280602002602001820160405280156117ac57816020015b611799613136565b8152602001906001900390816117915790505b50915060005b6002548110156118105760008181526020838152604091829020825160608101845281548152600182015492810192909252600201549181019190915283518490839081106117fd57fe5b60209081029190910101526001016117b2565b5050919050565b6013546001600160a01b031633148061183f57503360009081526014602052604090205460ff165b61185b5760405162461bcd60e51b815260040161048190613bb7565b601854611868908261193b565b601855602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b6013546001600160a01b03163314806118c557503360009081526014602052604090205460ff165b6118e15760405162461bcd60e51b815260040161048190613bb7565b600455565b80546109015780546001018155600052565b60008261190757506000611935565b8282028284828161191457fe5b04146119325760405162461bcd60e51b815260040161048190613ce7565b90505b92915050565b60008282111561195d5760405162461bcd60e51b815260040161048190613bdb565b50900390565b6000828201838110156119325760405162461bcd60e51b815260040161048190613a7b565b600081116119a85760405162461bcd60e51b815260040161048190613d28565b6023546001600160a01b031633146119d25760405162461bcd60e51b815260040161048190613c12565b60006011816119e0856123f1565b815260200190815260200160002090506119f9816128c7565b60078101548290811115611a0e575060078101545b6007820154611a1d908261193b565b6007830155601754611a2f9082611963565b601755611a3c838261193b565b925082611a4a575050611bb3565b60048201548390811115611a5f575060048201545b6004830154600584015460009190611a789084906118f8565b81611a7f57fe5b60048601549190049150611a93908361193b565b60048501556005840154611aa7908261193b565b6005850155601954611ab9908361193b565b601955601b54611ac99083611963565b601b55611ad6858361193b565b94508015611b4357602454604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b109089908590600401613669565b600060405180830381600087803b158015611b2a57600080fd5b505af1158015611b3e573d6000803e3d6000fd5b505050505b8415611bae57602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b7b9089908990600401613669565b600060405180830381600087803b158015611b9557600080fd5b505af1158015611ba9573d6000803e3d6000fd5b505050505b505050505b5050565b60008111611bd75760405162461bcd60e51b815260040161048190613dfc565b6024546001600160a01b03163314611c015760405162461bcd60e51b815260040161048190613a20565b6000611c0c82610cb1565b601b54909150811115611c315760405162461bcd60e51b815260040161048190613e83565b600954811015611c535760405162461bcd60e51b815260040161048190613d50565b6000601181611c61866123f1565b81526020019081526020016000209050611c7a816128c7565b600b5460068201541015611c9157600b5460068201555b6004810154611ca09083611963565b60048201556005810154611cb49084611963565b6005820155601954611cc69083611963565b601955601b54611cd6908361193b565b601b55602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611d0b9087908690600401613669565b600060405180830381600087803b158015611d2557600080fd5b505af1158015611d39573d6000803e3d6000fd5b50505050836001600160a01b03167fad9d68f84b5df48e48651913515b1d6bed12ed9f20dea3d9771f5328526196958385604051611d78929190613ffd565b60405180910390a250505050565b60008111611da65760405162461bcd60e51b815260040161048190613c6a565b6002548310611dc75760405162461bcd60e51b815260040161048190613dab565b600060026000018481548110611dd957fe5b6000918252602082206009909102019150815460ff166001811115611dfa57fe5b1415611e2f576022546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613b65565b611e89565b6001815460ff166001811115611e4157fe5b1415611e71576023546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613c3e565b60405162461bcd60e51b815260040161048190613958565b611e916121e9565b6000601181611e9f886123f1565b81526020810191909152604001600020600381015490915080158015611ed75750866001600160a01b0316856001600160a01b031614155b8015611eeb57506001600160a01b03851615155b15611f0357611ef9856123f1565b6003830181905590505b6001830154611f10575060005b8015611f8357600081815260116020526040908190206009810180546001019081905591519091906001600160a01b03808b1691908916907f7e1c35b2764f73a1364fed3bf30d5061c05022f93703cd0ca9404df72b0f48b390611f79908a908d90429061400b565b60405180910390a4505b6004830154600090815260208390526040812090611fa1600c612907565b855460048201805492935060ff9091169160ff191660018381811115611fc357fe5b021790555060048501546005820155600180860154600683018190559054611ff591611fee916118f8565b4290611963565b60078083019190915560088201849055600982018790556006860154600a830155850154600b82015561202a600c8383612976565b60088501546120399087611963565b60088601556000855460ff16600181111561205057fe5b14156120b257600c8401546120659087611963565b600c8501556015546120779087611963565b60155560058501546120aa90670de0b6b3a7640000906120989089906118f8565b8161209f57fe5b601d54919004611963565b601d55612132565b6001855460ff1660018111156120c457fe5b141561213257600d8401546120d99087611963565b600d8501556016546120eb9087611963565b601655601b546120fb9087611963565b601b55600585015461212e90670de0b6b3a76400009061211c9089906118f8565b8161212357fe5b601c54919004611963565b601c555b505050505050505050565b6000808260020154116121625760405162461bcd60e51b815260040161048190613e24565b81548354849190811061217157fe5b90600052602060002090600c0201905092915050565b805460009061219857506000611935565b50600192915050565b8054600090806121c35760405162461bcd60e51b8152600401610481906138a3565b8360000181815481106121d257fe5b90600052602060002090600c020191505092915050565b6020544214156121f857612239565b60005b6002548110156122335761222b6002600001828154811061221857fe5b90600052602060002090600902016129e1565b6001016121fb565b50426020555b565b60008060006002600001878154811061225057fe5b9060005260206000209060090201905060008061226c836129f7565b9092509050670de0b6b3a764000061228e612287848a61193b565b8a906118f8565b8161229557fe5b049450670de0b6b3a76400006122ae612287838961193b565b816122b557fe5b04935050505094509492505050565b60048101546000906122d857506000610ae3565b60006122e2612a86565b9050808360040160020154106122fc576000915050610ae3565b6006830154670de0b6b3a7640000906123259061231a90849061193b565b6004860154906118f8565b8161232c57fe5b049392505050565b600081600801546000141561234b57506000610ae3565b6000612368836005015484600801546118f890919063ffffffff16565b90506000835460ff16600181111561237c57fe5b14156123b357601d54612393576000915050610ae3565b601d54601f546123a49083906118f8565b816123ab57fe5b0491506123e0565b601c546123c4576000915050610ae3565b601c54601e546123d59083906118f8565b816123dc57fe5b0491505b60088301546123258361016d6118f8565b6001600160a01b038116600090815260126020526040902054801561241557610ae3565b5060108054600190810191829055600082815260116020908152604080832093840180546001600160a01b0388166001600160a01b031990911681179091556002949094018590559282526012905220819055919050565b60008060008061247b6121e9565b8561248557600096505b84612491576001850394505b60008060006124a08b8b612adc565b9250925092505b8080156124b45750600088115b80156124c757508815806124c757508983145b156126a957600582015460028054600019909a019960038501926000929181106124ed57fe5b9060005260206000209060090201905060008061250984612b46565b90925090506125188a83611963565b99506125248882611963565b97506125328f858484612b6e565b836004015442118015612549575060008460030154115b8061255e5750600384015415801561255e57508c5b1561267757600684015460088401546125769161193b565b600884015560018481015460ff168181111561258e57fe5b14156125e75760068401546125a4908a90611963565b98506125df670de0b6b3a76400006125cd856005015487600601546118f890919063ffffffff16565b816125d457fe5b601c5491900461193b565b601c55612636565b60068401546125f7908c90611963565b9a50612632670de0b6b3a7640000612620856005015487600601546118f890919063ffffffff16565b8161262757fe5b601d5491900461193b565b601d555b6126618f60000160008981526020019081526020016000206002600a01612cd890919063ffffffff16565b61266b8f88612adc565b919850965094506126a0565b600683015460078086019190915583015460088501556126988f8888612cf0565b919850965094505b505050506124a7565b505050945094509450949050565b6016548211156126d95760405162461bcd60e51b8152600401610481906138c9565b601b548211156126fb5760405162461bcd60e51b815260040161048190613921565b60155484111561271d5760405162461bcd60e51b815260040161048190613b0c565b811561274457601654612730908361193b565b601655601b54612740908361193b565b601b555b831561275b57601554612757908561193b565b6015555b80156127a0576017548111156127835760405162461bcd60e51b8152600401610481906139bc565b601754612790908261193b565b60175561279d8282611963565b91505b82156127f6576018548311156127c85760405162461bcd60e51b815260040161048190613987565b6018546127d5908461193b565b6018556127e28484611963565b601a549094506127f29084611963565b601a555b811561286157602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc69061282e9088908690600401613669565b600060405180830381600087803b15801561284857600080fd5b505af115801561285c573d6000803e3d6000fd5b505050505b8315610c5657602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906128999088908890600401613669565b600060405180830381600087803b1580156128b357600080fd5b505af1158015612132573d6000803e3d6000fd5b6128cf612d54565b60006128da826122c4565b9050806128e75750610901565b600b54600683015560078201546128fe9082611963565b60078301555050565b6003810154600090612969578154612926578154600101825560008290525b815460018101808455600084905283908290811061294057fe5b600091825260208220600c90910201818155600181019190915560028101919091559050610ae3565b6119358283600101612d79565b6001808301549082015560008155600282015461299f57600281015480835560018301556129d3565b8060020154836000018360010154815481106129b757fe5b60009182526020909120600c9091020155600281015460018301555b506002018054600101905550565b6129ea816129f7565b6007830155600690910155565b6000806000612a146002601e01544261193b90919063ffffffff16565b905080612a2d5750505060068101546007820154612a81565b612a52612a47670de0b6b3a7640000866002015484612e2f565b600786015490611963565b9150612a7d612a72670de0b6b3a7640000612a6c87612334565b84612e2f565b600686015490611963565b9250505b915091565b600a54600090421415612a9c5750600b54610877565b600a54600090612aad90429061193b565b9050612ad6612acd670de0b6b3a764000060026004016000015484612e2f565b600b5490611963565b91505090565b60008060005b600254841015612b2a5760008481526020869052604090206002810154612b0f5750600190930192612ae2565b612b1a600c8261213d565b859450925060019150612b3f9050565b6000612b36600c612e76565b60009250925092505b9250925092565b600080612b65836002015484600601548560070154866008015461223b565b91509150915091565b6003830154612b7c57612cd2565b600583015480612b8c5750612cd2565b6000818152601160205260409020600454600d8201541015612baf575050612cd2565b600354600090670de0b6b3a764000090612bca9087906118f8565b81612bd157fe5b0490506000808215612bf65750600a830154600190612bf09084611963565b600a8501555b60055415612c3f57600354670de0b6b3a764000090612c169088906118f8565b81612c1d57fe5b0491508115612c3f5750600b830154600190612c399083611963565b600b8501555b80612c4e575050505050612cd2565b6008840180546001908101918290558a8101549086015460028b01546040516001600160a01b0393841693909216917fafe38f267ece28b49c2765a03daf360a7bf79bd1cd7e664ffe93d2c05f76e03991612cae91899189914290614021565b60405180910390a46001840154612132906001600160a01b031660008581866126b7565b50505050565b6000612ce48383612d79565b90506107e28382612e9d565b600254600090819081908510612d0e57506000915082905081612d4b565b612d19600c85612187565b15612d375784612d2a600c866121a1565b6001925092509250612d4b565b612d448686600101612adc565b9250925092505b93509350939050565b6000612d5e612a86565b600b549091508111612d705750612239565b600b5542600a55565b600080826002015411612d9e5760405162461bcd60e51b815260040161048190613e24565b81548354849082908110612dae57fe5b60009182526020909120600c909102015480845515612df2578254845460009186918110612dd857fe5b90600052602060002090600c020160010181905550612dfa565b600060018401555b6002830180546000190190558354849082908110612e1457fe5b600091825260208220600c9091020190815591505092915050565b600154600090670de0b6b3a76400009061016d612e5685612e5089896118f8565b906118f8565b81612e5d57fe5b0481612e6557fe5b0481612e6d57fe5b04949350505050565b600081600001600081548110612e8857fe5b90600052602060002090600c02019050919050565b611bb3828360010183612976565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612f365760008555612f7c565b82601f10612f4f57805160ff1916838001178555612f7c565b82800160010185558215612f7c579182015b82811115612f7c578251825591602001919060010190612f61565b50611040929150613157565b604051806102000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101208101909152600080825260208201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604080516101208101909152806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060608152602001613131613136565b905290565b60405180606001604052806000815260200160008152602001600081525090565b5b808211156110405760008155600101613158565b80358015158114610ae357600080fd5b60008083601f84011261318d578182fd5b50813567ffffffffffffffff8111156131a4578182fd5b60208301915083602082850101111561075357600080fd5b600082601f8301126131cc578081fd5b813567ffffffffffffffff808211156131e157fe5b604051601f8301601f1916810160200182811182821017156131ff57fe5b604052828152848301602001861015613216578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613242578081fd5b813561193281614068565b60008060008060008060008060c0898b031215613268578384fd5b883561327381614068565b9750602089013561328381614068565b9650604089013561329381614068565b955060608901359450608089013567ffffffffffffffff808211156132b6578586fd5b6132c28c838d0161317c565b909650945060a08b01359150808211156132da578384fd5b506132e78b828c0161317c565b999c989b5096995094979396929594505050565b60006020828403121561330c578081fd5b6133158261316c565b9392505050565b60008060008060808587031215613331578384fd5b84356002811061333f578485fd5b966020860135965060408601359560600135945092505050565b60006020828403121561336a578081fd5b813567ffffffffffffffff811115613380578182fd5b61338c848285016131bc565b949350505050565b600080604083850312156133a6578182fd5b823567ffffffffffffffff808211156133bd578384fd5b6133c9868387016131bc565b935060208501359150808211156133de578283fd5b506133eb858286016131bc565b9150509250929050565b600060208284031215613406578081fd5b5035919050565b6000806040838503121561341f578182fd5b82359150602083013561343181614068565b809150509250929050565b600080600060608486031215613450578283fd5b833592506134606020850161316c565b9150604084013590509250925092565b60008060408385031215613482578182fd5b50508035926020909101359150565b6000806000606084860312156134a5578283fd5b833592506020840135915060408401356134be81614068565b809150509250925092565b6000806000606084860312156134dd578283fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b8381101561357e57815161351c8882516135c3565b808401518885015260408082015190890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e0808201519089015261010090810151908801526101209096019590820190600101613507565b509495945050505050565b6000815180845260208085019450808401835b8381101561357e576135af8783516135ea565b61012096909601959082019060010161359c565b600281106135cd57fe5b9052565b8051825260208082015190830152604090810151910152565b80518252602081015161360060208401826135c3565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b6000825161365f81846020870161403c565b9190910192915050565b6001600160a01b03929092168252602082015260606040820181905260009082015260800190565b6020808252825182820181905260009190848201906040850190845b818110156136d3576136c08385516135d1565b92840192606092909201916001016136ad565b50909695505050505050565b60006020825261331560208301846134f4565b600060e0825261370560e08301856134f4565b905082516020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c08301529392505050565b6000602082526133156020830184613589565b600060c0825261376d60c0830186613589565b602085518185015280860151604081818701528088015160608701526060880151608087015285840360a0870152839150865180855283850192508388019450855b818110156137d4578551805185528501518585015294840194928201926001016137af565b50919998505050505050505050565b600061014082019050831515825260018060a01b038351166020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c083015160e083015260e083015161010081818501528085015161012085015250509392505050565b6001600160a01b0391909116815260200190565b600060208252825180602084015261388f81604085016020870161403c565b601f01601f19169190910160400192915050565b6020808252600c908201526b6e6f206e657874206974656d60a01b604082015260600190565b60208082526015908201527431b334b61034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b6020808252600f908201526e3830b1b5b0b3b2a4a21032b93937b960891b604082015260600190565b6020808252601b908201527f6e6f7420656e6f756768206366696c20746f2077697468647261770000000000604082015260600190565b6020808252601590820152746e6f742061766169207061636b616765207479706560581b604082015260600190565b6020808252818101527f6372666920696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252818101527f6366696c20696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252601590820152740706c6564676520726174652063616e2774203d203605c1b604082015260600190565b6020808252601290820152716e6f74207366696c20636f696e207479706560701b604082015260600190565b60208082526015908201527432b6b83a3c903732bb9039bab832b91030b236b4b760591b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526010908201526f37b7363c9039bab832b91030b236b4b760811b604082015260600190565b60208082526016908201527530b63932b0b23c9030b232103a3434b99030b236b4b760511b604082015260600190565b60208082526015908201527431b933349034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b60208082526010908201526f6f6e6c7920636861726765206372666960801b604082015260600190565b6020808252601290820152716e6f74204352464920636f696e207479706560701b604082015260600190565b6020808252600c908201526b6e6f2075736572206461746160a01b604082015260600190565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601290820152716e6f74206366696c20636f696e207479706560701b604082015260600190565b6020808252601290820152716e6f74204346696c20636f696e207479706560701b604082015260600190565b6020808252600990820152681b9bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601690820152753a3434b99030b232391034b9903737ba1030b236b4b760511b604082015260600190565b60208082526010908201526f1bdb9b1e4818da185c99d94818d99a5b60821b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600e908201526d1b9bc818d99a5b08185b5bdd5b9d60921b604082015260600190565b60208082526018908201527f6366696c20616d6f756e7420697320746f6f20736d616c6c0000000000000000604082015260600190565b6020808252600a908201526936b7b2329032b93937b960b11b604082015260600190565b6020808252601190820152701a5b9d985b1a59081c1858dad859d95251607a1b604082015260600190565b6020808252600c908201526b66726f6d206973207a65726f60a01b604082015260600190565b6020808252600e908201526d1b9bc81cd99a5b08185b5bdd5b9d60921b604082015260600190565b6020808252600e908201526d636861696e20697320656d70747960901b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f6e6f7420656e6f756768206366696c20746f206c6f616e000000000000000000604082015260600190565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b80831015613f2b5783518051835285810151868401526040808201519084015260609081015190613f12818501836135ea565b5050610180820191508484019350600183019250613edf565b509286015192613f3e60408701856135d1565b9695505050505050565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e091820151918101919091526102000190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60005b8381101561405757818101518382015260200161403f565b83811115612cd25750506000910152565b6001600160a01b038116811461090157600080fdfea2646970667358221220e41164bdf8c9a4db6120b097c47392ab0b27dfdcd74414380c0b5555653ad6a964736f6c634300070600330000000000000000000000008848812bd31aeee33313c10a840ffc3169078c5b0000000000000000000000000f91445a15a1353a099e742f9b51b1b41c2cbfe8000000000000000000000000642c75e5e61b3169ed40644e14260b6f5a366d65
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101d95760003560e01c806387e3dfe211610104578063c211acf2116100a2578063e3adffab11610071578063e3adffab14610405578063e640207714610418578063f550810114610438578063f56033171461044b576101d9565b8063c211acf2146103c4578063c7c13b3a146103d7578063cc297ab1146103ea578063d8359117146103f2576101d9565b8063a834f5b7116100de578063a834f5b714610381578063ad6de44514610396578063b6932914146103a9578063bace1a36146103bc576101d9565b806387e3dfe21461033b5780639c1857d41461035b5780639fa8f0131461036e576101d9565b806338309b851161017c578063470c23821161014b578063470c2382146102de578063497cb411146103005780636f73ae00146103155780638719bfb114610328576101d9565b806338309b85146102755780633a64ebec146102955780633daa551c146102a85780633dd8fe11146102be576101d9565b80630faf728a116101b85780630faf728a14610232578063119577a41461024557806312efe4b31461025a5780632ef3da231461026d576101d9565b806223de29146101de5780630696ecaa146101f35780630a28b8a91461021d575b600080fd5b6101f16101ec36600461324d565b61045e565b005b61020661020136600461340d565b610628565b6040516102149291906137e3565b60405180910390f35b61022561075a565b604051610214919061385c565b6101f1610240366004613394565b610769565b61024d6107e7565b6040516102149190613f48565b6101f1610268366004613231565b61087a565b610225610904565b610288610283366004613231565b610913565b6040516102149190613747565b6101f16102a33660046134c9565b610ae8565b6102b0610c5d565b6040516102149291906136f2565b6102d16102cc3660046133f5565b610cb1565b6040516102149190613ff4565b6102f16102ec366004613231565b610cda565b6040516102149392919061375a565b610308610edf565b60405161021491906136df565b6101f16103233660046133f5565b611044565b6101f16103363660046134c9565b6110f8565b61034e610349366004613359565b611188565b6040516102149190613870565b6101f16103693660046133f5565b611238565b6102d161037c3660046133f5565b611281565b610389611299565b6040516102149190613eba565b6101f16103a4366004613231565b6113ec565b6101f16103b7366004613231565b611473565b6102256114f6565b6101f16103d2366004613470565b611505565b6101f16103e536600461343c565b611559565b6102d161160c565b6101f16104003660046132fb565b611612565b6101f161041336600461331c565b61168e565b61042b6104263660046133f5565b611747565b6040516102149190613691565b6101f16104463660046133f5565b611817565b6101f16104593660046133f5565b61189d565b6002600054141561048a5760405162461bcd60e51b815260040161048190613e4c565b60405180910390fd5b6002600055826104ac5760405162461bcd60e51b815260040161048190613b91565b600080806104bc86880188613491565b919450925090506001600160a01b038a166104e95760405162461bcd60e51b815260040161048190613dd6565b8260051415610501576104fc8a89611988565b610615565b8260041415610514576104fc8a89611bb7565b8260031415610580576000881161053d5760405162461bcd60e51b815260040161048190613c6a565b6022546001600160a01b031633146105675760405162461bcd60e51b815260040161048190613b3b565b6018546105749089611963565b60185550610619915050565b82600214156105ec57600088116105a95760405162461bcd60e51b815260040161048190613c6a565b6023546001600160a01b031633146105d35760405162461bcd60e51b815260040161048190613cbd565b6017546105e09089611963565b60175550610619915050565b826105fd576104fc8a83838b611d86565b60405162461bcd60e51b815260040161048190613d87565b5050505b50506001600055505050505050565b6000610632612eab565b83610653576001600160a01b03831660009081526012602052604090205493505b836106a3576001600160a01b0383161561069e576013546001600160a01b038481169116148061069b57506001600160a01b03831660009081526014602052604090205460ff165b91505b610753565b600084815260116020526040902060018101546013546001600160a01b03908116911614806106ee575060018101546001600160a01b031660009081526014602052604090205460ff165b60018201546001600160a01b0316835260028201546020840152600382015460408401526008820154606084015260098201546080840152600a82015460a0840152600b82015460c0840152600c82015460e0840152600d9091015461010083015291505b9250929050565b6023546001600160a01b031681565b6013546001600160a01b031633148061079157503360009081526014602052604090205460ff165b6107ad5760405162461bcd60e51b815260040161048190613bb7565b806002601f01836040516107c1919061364d565b908152602001604051809103902090805190602001906107e2929190612f00565b505050565b6107ef612f88565b600354815260045460208083019190915260055460408301526010546060830152601554608083015260165460a083015260175460c083015260185460e0830152601954610100830152601a54610120830152601b54610140830152601c54610160830152601d54610180830152601e546101a0830152601f546101c0830152546101e08201525b90565b6013546001600160a01b031633146108a45760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b0381166108ca5760405162461bcd60e51b815260040161048190613a4c565b6013546001600160a01b03828116911614156108e557610901565b601380546001600160a01b0319166001600160a01b0383161790555b50565b6022546001600160a01b031681565b6001600160a01b0381166000908152601260205260409020546060908061093a5750610ae3565b600081815260116020526040812090805b60025481101561097e5760008181526020849052604090206002810154610973908490611963565b92505060010161094b565b508067ffffffffffffffff8111801561099657600080fd5b506040519080825280602002602001820160405280156109d057816020015b6109bd613005565b8152602001906001900390816109b55790505b5093506000805b600254811015610add57600081815260208590526040902060028101546109fe5750610ad5565b6000610a0b600c8361213d565b90505b60408051610120810190915260038201805482526004830154602083019060ff166001811115610a3a57fe5b6001811115610a4557fe5b8152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050888581518110610a9b57fe5b6020908102919091010152600190930192610ab7600c82612187565b610ac057610ad2565b610acb600c826121a1565b9050610a0e565b50505b6001016109d7565b50505050505b919050565b6013546001600160a01b0316331480610b1057503360009081526014602052604090205460ff165b610b2c5760405162461bcd60e51b815260040161048190613bb7565b6002548310610b4d5760405162461bcd60e51b8152600401610481906138f8565b610b556121e9565b600060026000018481548110610b6757fe5b906000526020600020906009020190508281600201819055506000670de0b6b3a7640000610ba6836005015484600801546118f890919063ffffffff16565b81610bad57fe5b0490506000825460ff166001811115610bc257fe5b1415610bdd57601d54610bd5908261193b565b601d55610bee565b601c54610bea908261193b565b601c555b600582018390556008820154670de0b6b3a764000090610c0e90856118f8565b81610c1557fe5b0490506000825460ff166001811115610c2a57fe5b1415610c4557601d54610c3d9082611963565b601d55610c56565b601c54610c529082611963565b601c555b5050505050565b6060610c67613052565b610c6f610edf565b6040805160c08101825260065481526007546020820152600854918101919091526009546060820152600a546080820152600b5460a082015290925090509091565b600754600090670de0b6b3a764000090610ccc9084906118f8565b81610cd357fe5b0492915050565b6060610ce4613088565b6001600160a01b03831660009081526012602052604090205460609080610d0b5750610ed8565b6000818152601160205260409020610d2286610913565b9450845160010167ffffffffffffffff81118015610d3f57600080fd5b50604051908082528060200260200182016040528015610d7957816020015b610d666130b0565b815260200190600190039081610d5e5790505b50925060005b8551811015610e2e57610df1868281518110610d9757fe5b602002602001015160400151878381518110610daf57fe5b602002602001015160c00151888481518110610dc757fe5b602002602001015160e00151898581518110610ddf57fe5b6020026020010151610100015161223b565b858381518110610dfd57fe5b6020026020010151600001868481518110610e1457fe5b602090810291909101810151019190915252600101610d7f565b610e37826122c4565b848281518110610e4357fe5b60200260200101516020018181525050610e848260040160030154858381518110610e6a57fe5b60200260200101516020015161196390919063ffffffff16565b848281518110610e9057fe5b60209081029190910181015181019190915260408051608081018252600485015481526005850154928101929092526006840154908201526007909201546060830152509250505b9193909250565b60025460609067ffffffffffffffff81118015610efb57600080fd5b50604051908082528060200260200182016040528015610f3557816020015b610f226130ca565b815260200190600190039081610f1a5790505b50905060005b600254811015611040576002805482908110610f5357fe5b600091825260209091206040805161012081019091526009909202018054829060ff166001811115610f8157fe5b6001811115610f8c57fe5b815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050828281518110610fec57fe5b602002602001018190525061101d6002600001828154811061100a57fe5b9060005260206000209060090201612334565b82828151811061102957fe5b602090810291909101015160600152600101610f3b565b5090565b6013546001600160a01b031633148061106c57503360009081526014602052604090205460ff165b6110885760405162461bcd60e51b815260040161048190613bb7565b601754611095908261193b565b601755602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b600060405180830381600087803b1580156110e457600080fd5b505af1158015610c56573d6000803e3d6000fd5b6013546001600160a01b031633148061112057503360009081526014602052604090205460ff165b61113c5760405162461bcd60e51b815260040161048190613bb7565b6000821161115c5760405162461bcd60e51b8152600401610481906139f1565b60068390556007829055600881905560646111788260636118f8565b8161117f57fe5b04600955505050565b60606002601f018260405161119d919061364d565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b50505050509050919050565b6013546001600160a01b031633148061126057503360009081526014602052604090205460ff165b61127c5760405162461bcd60e51b815260040161048190613bb7565b600355565b600754600090610ccc83670de0b6b3a76400006118f8565b6112a1613117565b60408051600c80546060602082028401810185529383018181529293919284929091849160009085015b828210156113ad57838290600052602060002090600c02016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820160405180610120016040529081600082015481526020016001820160009054906101000a900460ff16600181111561134557fe5b600181111561135057fe5b815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152505081525050815260200190600101906112cb565b50505050815260200160018201604051806060016040529081600082015481526020016001820154815260200160028201548152505081525050905090565b6013546001600160a01b031633146114165760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff161561144f5760405162461bcd60e51b815260040161048190613adc565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b6013546001600160a01b0316331461149d5760405162461bcd60e51b815260040161048190613ab2565b6001600160a01b03811660009081526014602052604090205460ff166114d55760405162461bcd60e51b815260040161048190613c8d565b6001600160a01b03166000908152601460205260409020805460ff19169055565b6024546001600160a01b031681565b6013546001600160a01b031633148061152d57503360009081526014602052604090205460ff165b6115495760405162461bcd60e51b815260040161048190613bb7565b6115516121e9565b601e55601f55565b6002600054141561157c5760405162461bcd60e51b815260040161048190613e4c565b6002600090815560118161158f336123f1565b815260200190815260200160002090506000806000806115b18589898961246d565b9096509450909250905081156115d657600c8501546115d0908361193b565b600c8601555b83156115f157600d8501546115eb908561193b565b600d8601555b6001850154610619906001600160a01b0316838387876126b7565b60015481565b6013546001600160a01b031633148061163a57503360009081526014602052604090205460ff165b6116565760405162461bcd60e51b815260040161048190613bb7565b8080156116635750600554155b15611672576001600555610901565b80158015611681575060055415155b1561090157600060055550565b6013546001600160a01b03163314806116b657503360009081526014602052604090205460ff165b6116d25760405162461bcd60e51b815260040161048190613bb7565b6116da6121e9565b60028054600181018083556000838152919290839081106116f757fe5b6000918252602090912060099091020180549091508690829060ff19166001838181111561172157fe5b021790555060018101949094556005840191909155600283019190915560049091015550565b60008181526011602052604090206002546060919067ffffffffffffffff8111801561177257600080fd5b506040519080825280602002602001820160405280156117ac57816020015b611799613136565b8152602001906001900390816117915790505b50915060005b6002548110156118105760008181526020838152604091829020825160608101845281548152600182015492810192909252600201549181019190915283518490839081106117fd57fe5b60209081029190910101526001016117b2565b5050919050565b6013546001600160a01b031633148061183f57503360009081526014602052604090205460ff165b61185b5760405162461bcd60e51b815260040161048190613bb7565b601854611868908261193b565b601855602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906110ca9033908590600401613669565b6013546001600160a01b03163314806118c557503360009081526014602052604090205460ff165b6118e15760405162461bcd60e51b815260040161048190613bb7565b600455565b80546109015780546001018155600052565b60008261190757506000611935565b8282028284828161191457fe5b04146119325760405162461bcd60e51b815260040161048190613ce7565b90505b92915050565b60008282111561195d5760405162461bcd60e51b815260040161048190613bdb565b50900390565b6000828201838110156119325760405162461bcd60e51b815260040161048190613a7b565b600081116119a85760405162461bcd60e51b815260040161048190613d28565b6023546001600160a01b031633146119d25760405162461bcd60e51b815260040161048190613c12565b60006011816119e0856123f1565b815260200190815260200160002090506119f9816128c7565b60078101548290811115611a0e575060078101545b6007820154611a1d908261193b565b6007830155601754611a2f9082611963565b601755611a3c838261193b565b925082611a4a575050611bb3565b60048201548390811115611a5f575060048201545b6004830154600584015460009190611a789084906118f8565b81611a7f57fe5b60048601549190049150611a93908361193b565b60048501556005840154611aa7908261193b565b6005850155601954611ab9908361193b565b601955601b54611ac99083611963565b601b55611ad6858361193b565b94508015611b4357602454604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b109089908590600401613669565b600060405180830381600087803b158015611b2a57600080fd5b505af1158015611b3e573d6000803e3d6000fd5b505050505b8415611bae57602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611b7b9089908990600401613669565b600060405180830381600087803b158015611b9557600080fd5b505af1158015611ba9573d6000803e3d6000fd5b505050505b505050505b5050565b60008111611bd75760405162461bcd60e51b815260040161048190613dfc565b6024546001600160a01b03163314611c015760405162461bcd60e51b815260040161048190613a20565b6000611c0c82610cb1565b601b54909150811115611c315760405162461bcd60e51b815260040161048190613e83565b600954811015611c535760405162461bcd60e51b815260040161048190613d50565b6000601181611c61866123f1565b81526020019081526020016000209050611c7a816128c7565b600b5460068201541015611c9157600b5460068201555b6004810154611ca09083611963565b60048201556005810154611cb49084611963565b6005820155601954611cc69083611963565b601955601b54611cd6908361193b565b601b55602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc690611d0b9087908690600401613669565b600060405180830381600087803b158015611d2557600080fd5b505af1158015611d39573d6000803e3d6000fd5b50505050836001600160a01b03167fad9d68f84b5df48e48651913515b1d6bed12ed9f20dea3d9771f5328526196958385604051611d78929190613ffd565b60405180910390a250505050565b60008111611da65760405162461bcd60e51b815260040161048190613c6a565b6002548310611dc75760405162461bcd60e51b815260040161048190613dab565b600060026000018481548110611dd957fe5b6000918252602082206009909102019150815460ff166001811115611dfa57fe5b1415611e2f576022546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613b65565b611e89565b6001815460ff166001811115611e4157fe5b1415611e71576023546001600160a01b03163314611e2a5760405162461bcd60e51b815260040161048190613c3e565b60405162461bcd60e51b815260040161048190613958565b611e916121e9565b6000601181611e9f886123f1565b81526020810191909152604001600020600381015490915080158015611ed75750866001600160a01b0316856001600160a01b031614155b8015611eeb57506001600160a01b03851615155b15611f0357611ef9856123f1565b6003830181905590505b6001830154611f10575060005b8015611f8357600081815260116020526040908190206009810180546001019081905591519091906001600160a01b03808b1691908916907f7e1c35b2764f73a1364fed3bf30d5061c05022f93703cd0ca9404df72b0f48b390611f79908a908d90429061400b565b60405180910390a4505b6004830154600090815260208390526040812090611fa1600c612907565b855460048201805492935060ff9091169160ff191660018381811115611fc357fe5b021790555060048501546005820155600180860154600683018190559054611ff591611fee916118f8565b4290611963565b60078083019190915560088201849055600982018790556006860154600a830155850154600b82015561202a600c8383612976565b60088501546120399087611963565b60088601556000855460ff16600181111561205057fe5b14156120b257600c8401546120659087611963565b600c8501556015546120779087611963565b60155560058501546120aa90670de0b6b3a7640000906120989089906118f8565b8161209f57fe5b601d54919004611963565b601d55612132565b6001855460ff1660018111156120c457fe5b141561213257600d8401546120d99087611963565b600d8501556016546120eb9087611963565b601655601b546120fb9087611963565b601b55600585015461212e90670de0b6b3a76400009061211c9089906118f8565b8161212357fe5b601c54919004611963565b601c555b505050505050505050565b6000808260020154116121625760405162461bcd60e51b815260040161048190613e24565b81548354849190811061217157fe5b90600052602060002090600c0201905092915050565b805460009061219857506000611935565b50600192915050565b8054600090806121c35760405162461bcd60e51b8152600401610481906138a3565b8360000181815481106121d257fe5b90600052602060002090600c020191505092915050565b6020544214156121f857612239565b60005b6002548110156122335761222b6002600001828154811061221857fe5b90600052602060002090600902016129e1565b6001016121fb565b50426020555b565b60008060006002600001878154811061225057fe5b9060005260206000209060090201905060008061226c836129f7565b9092509050670de0b6b3a764000061228e612287848a61193b565b8a906118f8565b8161229557fe5b049450670de0b6b3a76400006122ae612287838961193b565b816122b557fe5b04935050505094509492505050565b60048101546000906122d857506000610ae3565b60006122e2612a86565b9050808360040160020154106122fc576000915050610ae3565b6006830154670de0b6b3a7640000906123259061231a90849061193b565b6004860154906118f8565b8161232c57fe5b049392505050565b600081600801546000141561234b57506000610ae3565b6000612368836005015484600801546118f890919063ffffffff16565b90506000835460ff16600181111561237c57fe5b14156123b357601d54612393576000915050610ae3565b601d54601f546123a49083906118f8565b816123ab57fe5b0491506123e0565b601c546123c4576000915050610ae3565b601c54601e546123d59083906118f8565b816123dc57fe5b0491505b60088301546123258361016d6118f8565b6001600160a01b038116600090815260126020526040902054801561241557610ae3565b5060108054600190810191829055600082815260116020908152604080832093840180546001600160a01b0388166001600160a01b031990911681179091556002949094018590559282526012905220819055919050565b60008060008061247b6121e9565b8561248557600096505b84612491576001850394505b60008060006124a08b8b612adc565b9250925092505b8080156124b45750600088115b80156124c757508815806124c757508983145b156126a957600582015460028054600019909a019960038501926000929181106124ed57fe5b9060005260206000209060090201905060008061250984612b46565b90925090506125188a83611963565b99506125248882611963565b97506125328f858484612b6e565b836004015442118015612549575060008460030154115b8061255e5750600384015415801561255e57508c5b1561267757600684015460088401546125769161193b565b600884015560018481015460ff168181111561258e57fe5b14156125e75760068401546125a4908a90611963565b98506125df670de0b6b3a76400006125cd856005015487600601546118f890919063ffffffff16565b816125d457fe5b601c5491900461193b565b601c55612636565b60068401546125f7908c90611963565b9a50612632670de0b6b3a7640000612620856005015487600601546118f890919063ffffffff16565b8161262757fe5b601d5491900461193b565b601d555b6126618f60000160008981526020019081526020016000206002600a01612cd890919063ffffffff16565b61266b8f88612adc565b919850965094506126a0565b600683015460078086019190915583015460088501556126988f8888612cf0565b919850965094505b505050506124a7565b505050945094509450949050565b6016548211156126d95760405162461bcd60e51b8152600401610481906138c9565b601b548211156126fb5760405162461bcd60e51b815260040161048190613921565b60155484111561271d5760405162461bcd60e51b815260040161048190613b0c565b811561274457601654612730908361193b565b601655601b54612740908361193b565b601b555b831561275b57601554612757908561193b565b6015555b80156127a0576017548111156127835760405162461bcd60e51b8152600401610481906139bc565b601754612790908261193b565b60175561279d8282611963565b91505b82156127f6576018548311156127c85760405162461bcd60e51b815260040161048190613987565b6018546127d5908461193b565b6018556127e28484611963565b601a549094506127f29084611963565b601a555b811561286157602354604051634decdde360e11b81526001600160a01b0390911690639bd9bbc69061282e9088908690600401613669565b600060405180830381600087803b15801561284857600080fd5b505af115801561285c573d6000803e3d6000fd5b505050505b8315610c5657602254604051634decdde360e11b81526001600160a01b0390911690639bd9bbc6906128999088908890600401613669565b600060405180830381600087803b1580156128b357600080fd5b505af1158015612132573d6000803e3d6000fd5b6128cf612d54565b60006128da826122c4565b9050806128e75750610901565b600b54600683015560078201546128fe9082611963565b60078301555050565b6003810154600090612969578154612926578154600101825560008290525b815460018101808455600084905283908290811061294057fe5b600091825260208220600c90910201818155600181019190915560028101919091559050610ae3565b6119358283600101612d79565b6001808301549082015560008155600282015461299f57600281015480835560018301556129d3565b8060020154836000018360010154815481106129b757fe5b60009182526020909120600c9091020155600281015460018301555b506002018054600101905550565b6129ea816129f7565b6007830155600690910155565b6000806000612a146002601e01544261193b90919063ffffffff16565b905080612a2d5750505060068101546007820154612a81565b612a52612a47670de0b6b3a7640000866002015484612e2f565b600786015490611963565b9150612a7d612a72670de0b6b3a7640000612a6c87612334565b84612e2f565b600686015490611963565b9250505b915091565b600a54600090421415612a9c5750600b54610877565b600a54600090612aad90429061193b565b9050612ad6612acd670de0b6b3a764000060026004016000015484612e2f565b600b5490611963565b91505090565b60008060005b600254841015612b2a5760008481526020869052604090206002810154612b0f5750600190930192612ae2565b612b1a600c8261213d565b859450925060019150612b3f9050565b6000612b36600c612e76565b60009250925092505b9250925092565b600080612b65836002015484600601548560070154866008015461223b565b91509150915091565b6003830154612b7c57612cd2565b600583015480612b8c5750612cd2565b6000818152601160205260409020600454600d8201541015612baf575050612cd2565b600354600090670de0b6b3a764000090612bca9087906118f8565b81612bd157fe5b0490506000808215612bf65750600a830154600190612bf09084611963565b600a8501555b60055415612c3f57600354670de0b6b3a764000090612c169088906118f8565b81612c1d57fe5b0491508115612c3f5750600b830154600190612c399083611963565b600b8501555b80612c4e575050505050612cd2565b6008840180546001908101918290558a8101549086015460028b01546040516001600160a01b0393841693909216917fafe38f267ece28b49c2765a03daf360a7bf79bd1cd7e664ffe93d2c05f76e03991612cae91899189914290614021565b60405180910390a46001840154612132906001600160a01b031660008581866126b7565b50505050565b6000612ce48383612d79565b90506107e28382612e9d565b600254600090819081908510612d0e57506000915082905081612d4b565b612d19600c85612187565b15612d375784612d2a600c866121a1565b6001925092509250612d4b565b612d448686600101612adc565b9250925092505b93509350939050565b6000612d5e612a86565b600b549091508111612d705750612239565b600b5542600a55565b600080826002015411612d9e5760405162461bcd60e51b815260040161048190613e24565b81548354849082908110612dae57fe5b60009182526020909120600c909102015480845515612df2578254845460009186918110612dd857fe5b90600052602060002090600c020160010181905550612dfa565b600060018401555b6002830180546000190190558354849082908110612e1457fe5b600091825260208220600c9091020190815591505092915050565b600154600090670de0b6b3a76400009061016d612e5685612e5089896118f8565b906118f8565b81612e5d57fe5b0481612e6557fe5b0481612e6d57fe5b04949350505050565b600081600001600081548110612e8857fe5b90600052602060002090600c02019050919050565b611bb3828360010183612976565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612f365760008555612f7c565b82601f10612f4f57805160ff1916838001178555612f7c565b82800160010185558215612f7c579182015b82811115612f7c578251825591602001919060010190612f61565b50611040929150613157565b604051806102000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101208101909152600080825260208201908152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604080516101208101909152806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060608152602001613131613136565b905290565b60405180606001604052806000815260200160008152602001600081525090565b5b808211156110405760008155600101613158565b80358015158114610ae357600080fd5b60008083601f84011261318d578182fd5b50813567ffffffffffffffff8111156131a4578182fd5b60208301915083602082850101111561075357600080fd5b600082601f8301126131cc578081fd5b813567ffffffffffffffff808211156131e157fe5b604051601f8301601f1916810160200182811182821017156131ff57fe5b604052828152848301602001861015613216578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613242578081fd5b813561193281614068565b60008060008060008060008060c0898b031215613268578384fd5b883561327381614068565b9750602089013561328381614068565b9650604089013561329381614068565b955060608901359450608089013567ffffffffffffffff808211156132b6578586fd5b6132c28c838d0161317c565b909650945060a08b01359150808211156132da578384fd5b506132e78b828c0161317c565b999c989b5096995094979396929594505050565b60006020828403121561330c578081fd5b6133158261316c565b9392505050565b60008060008060808587031215613331578384fd5b84356002811061333f578485fd5b966020860135965060408601359560600135945092505050565b60006020828403121561336a578081fd5b813567ffffffffffffffff811115613380578182fd5b61338c848285016131bc565b949350505050565b600080604083850312156133a6578182fd5b823567ffffffffffffffff808211156133bd578384fd5b6133c9868387016131bc565b935060208501359150808211156133de578283fd5b506133eb858286016131bc565b9150509250929050565b600060208284031215613406578081fd5b5035919050565b6000806040838503121561341f578182fd5b82359150602083013561343181614068565b809150509250929050565b600080600060608486031215613450578283fd5b833592506134606020850161316c565b9150604084013590509250925092565b60008060408385031215613482578182fd5b50508035926020909101359150565b6000806000606084860312156134a5578283fd5b833592506020840135915060408401356134be81614068565b809150509250925092565b6000806000606084860312156134dd578283fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b8381101561357e57815161351c8882516135c3565b808401518885015260408082015190890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e0808201519089015261010090810151908801526101209096019590820190600101613507565b509495945050505050565b6000815180845260208085019450808401835b8381101561357e576135af8783516135ea565b61012096909601959082019060010161359c565b600281106135cd57fe5b9052565b8051825260208082015190830152604090810151910152565b80518252602081015161360060208401826135c3565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b6000825161365f81846020870161403c565b9190910192915050565b6001600160a01b03929092168252602082015260606040820181905260009082015260800190565b6020808252825182820181905260009190848201906040850190845b818110156136d3576136c08385516135d1565b92840192606092909201916001016136ad565b50909695505050505050565b60006020825261331560208301846134f4565b600060e0825261370560e08301856134f4565b905082516020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c08301529392505050565b6000602082526133156020830184613589565b600060c0825261376d60c0830186613589565b602085518185015280860151604081818701528088015160608701526060880151608087015285840360a0870152839150865180855283850192508388019450855b818110156137d4578551805185528501518585015294840194928201926001016137af565b50919998505050505050505050565b600061014082019050831515825260018060a01b038351166020830152602083015160408301526040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c083015160e083015260e083015161010081818501528085015161012085015250509392505050565b6001600160a01b0391909116815260200190565b600060208252825180602084015261388f81604085016020870161403c565b601f01601f19169190910160400192915050565b6020808252600c908201526b6e6f206e657874206974656d60a01b604082015260600190565b60208082526015908201527431b334b61034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b6020808252600f908201526e3830b1b5b0b3b2a4a21032b93937b960891b604082015260600190565b6020808252601b908201527f6e6f7420656e6f756768206366696c20746f2077697468647261770000000000604082015260600190565b6020808252601590820152746e6f742061766169207061636b616765207479706560581b604082015260600190565b6020808252818101527f6372666920696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252818101527f6366696c20696e74657265737420706f6f6c206973206e6f7420656e6f756768604082015260600190565b6020808252601590820152740706c6564676520726174652063616e2774203d203605c1b604082015260600190565b6020808252601290820152716e6f74207366696c20636f696e207479706560701b604082015260600190565b60208082526015908201527432b6b83a3c903732bb9039bab832b91030b236b4b760591b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526010908201526f37b7363c9039bab832b91030b236b4b760811b604082015260600190565b60208082526016908201527530b63932b0b23c9030b232103a3434b99030b236b4b760511b604082015260600190565b60208082526015908201527431b933349034b73b32b9ba103737bb9032b93937b960591b604082015260600190565b60208082526010908201526f6f6e6c7920636861726765206372666960801b604082015260600190565b6020808252601290820152716e6f74204352464920636f696e207479706560701b604082015260600190565b6020808252600c908201526b6e6f2075736572206461746160a01b604082015260600190565b6020808252600a908201526937b7363c9030b236b4b760b11b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601290820152716e6f74206366696c20636f696e207479706560701b604082015260600190565b6020808252601290820152716e6f74204346696c20636f696e207479706560701b604082015260600190565b6020808252600990820152681b9bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601690820152753a3434b99030b232391034b9903737ba1030b236b4b760511b604082015260600190565b60208082526010908201526f1bdb9b1e4818da185c99d94818d99a5b60821b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600e908201526d1b9bc818d99a5b08185b5bdd5b9d60921b604082015260600190565b60208082526018908201527f6366696c20616d6f756e7420697320746f6f20736d616c6c0000000000000000604082015260600190565b6020808252600a908201526936b7b2329032b93937b960b11b604082015260600190565b6020808252601190820152701a5b9d985b1a59081c1858dad859d95251607a1b604082015260600190565b6020808252600c908201526b66726f6d206973207a65726f60a01b604082015260600190565b6020808252600e908201526d1b9bc81cd99a5b08185b5bdd5b9d60921b604082015260600190565b6020808252600e908201526d636861696e20697320656d70747960901b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f6e6f7420656e6f756768206366696c20746f206c6f616e000000000000000000604082015260600190565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b80831015613f2b5783518051835285810151868401526040808201519084015260609081015190613f12818501836135ea565b5050610180820191508484019350600183019250613edf565b509286015192613f3e60408701856135d1565b9695505050505050565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e091820151918101919091526102000190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60005b8381101561405757818101518382015260200161403f565b83811115612cd25750506000910152565b6001600160a01b038116811461090157600080fdfea2646970667358221220e41164bdf8c9a4db6120b097c47392ab0b27dfdcd74414380c0b5555653ad6a964736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008848812bd31aeee33313c10a840ffc3169078c5b0000000000000000000000000f91445a15a1353a099e742f9b51b1b41c2cbfe8000000000000000000000000642c75e5e61b3169ed40644e14260b6f5a366d65
-----Decoded View---------------
Arg [0] : crfiAddr (address): 0x8848812BD31AEEe33313C10A840FfC3169078C5b
Arg [1] : cfilAddr (address): 0x0f91445A15a1353A099E742f9B51b1b41C2CbFe8
Arg [2] : sfilAddr (address): 0x642C75E5E61b3169Ed40644E14260b6f5a366d65
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008848812bd31aeee33313c10a840ffc3169078c5b
Arg [1] : 0000000000000000000000000f91445a15a1353a099e742f9b51b1b41c2cbfe8
Arg [2] : 000000000000000000000000642c75e5e61b3169ed40644e14260b6f5a366d65
Deployed Bytecode Sourcemap
31425:30325:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38855:1370;;;;;;:::i;:::-;;:::i;:::-;;44809:1021;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;32005:19;;;:::i;:::-;;;;;;;:::i;35756:140::-;;;;;;:::i;:::-;;:::i;42560:1005::-;;;:::i;:::-;;;;;;;:::i;35470:245::-;;;;;;:::i;:::-;;:::i;31981:19::-;;;:::i;41486:1066::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35904:972::-;;;;;;:::i;:::-;;:::i;43571:222::-;;;:::i;:::-;;;;;;;;:::i;45836:169::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43801:1002::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;41038:442::-;;;:::i;:::-;;;;;;;:::i;38628:188::-;;;;;;:::i;:::-;;:::i;37616:350::-;;;;;;:::i;:::-;;:::i;40904:128::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38214:102::-;;;;;;:::i;:::-;;:::i;46011:171::-;;;;;;:::i;:::-;;:::i;46226:123::-;;;:::i;:::-;;;;;;;:::i;35128:165::-;;;;;;:::i;:::-;;:::i;35299:::-;;;;;;:::i;:::-;;:::i;32029:19::-;;;:::i;37414:196::-;;;;;;:::i;:::-;;:::i;40233:629::-;;;;;;:::i;:::-;;:::i;31887:25::-;;;:::i;37972:236::-;;;;;;:::i;:::-;;:::i;36882:526::-;;;;;;:::i;:::-;;:::i;46355:391::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38434:188::-;;;;;;:::i;:::-;;:::i;38322:106::-;;;;;;:::i;:::-;;:::i;38855:1370::-;9345:1;9951:7;;:19;;9943:63;;;;-1:-1:-1;;;9943:63:0;;;;;;;:::i;:::-;;;;;;;;;9345:1;10084:7;:18;39132:19;39124:44:::1;;;;-1:-1:-1::0;;;39124:44:0::1;;;;;;;:::i;:::-;39385:12;::::0;;39430:48:::1;::::0;;::::1;39441:8:::0;39430:48:::1;:::i;:::-;39384:94:::0;;-1:-1:-1;39384:94:0;-1:-1:-1;39384:94:0;-1:-1:-1;;;;;;39493:20:0;::::1;39485:45;;;;-1:-1:-1::0;;;39485:45:0::1;;;;;;;:::i;:::-;39542:4;39550:1;39542:9;39539:681;;;39561:28;39576:4;39582:6;39561:14;:28::i;:::-;39539:681;;;39605:4;39613:1;39605:9;39602:618;;;39624:23;39634:4;39640:6;39624:9;:23::i;39602:618::-;39663:4;39671:1;39663:9;39660:560;;;39699:1;39690:6;:10;39682:32;;;;-1:-1:-1::0;;;39682:32:0::1;;;;;;;:::i;:::-;39753:4;::::0;-1:-1:-1;;;;;39753:4:0::1;39731:10;:27;39723:56;;;;-1:-1:-1::0;;;39723:56:0::1;;;;;;;:::i;:::-;39813:22:::0;;:34:::1;::::0;39840:6;39813:26:::1;:34::i;:::-;39788:22:::0;:59;-1:-1:-1;39856:7:0::1;::::0;-1:-1:-1;;39856:7:0::1;39660:560;39878:4;39886:1;39878:9;39875:345;;;39914:1;39905:6;:10;39897:32;;;;-1:-1:-1::0;;;39897:32:0::1;;;;;;;:::i;:::-;39968:4;::::0;-1:-1:-1;;;;;39968:4:0::1;39946:10;:27;39938:56;;;;-1:-1:-1::0;;;39938:56:0::1;;;;;;;:::i;:::-;40028:22:::0;;:34:::1;::::0;40055:6;40028:26:::1;:34::i;:::-;40003:22:::0;:59;-1:-1:-1;40079:7:0::1;::::0;-1:-1:-1;;40079:7:0::1;39875:345;40103:9:::0;40099:121:::1;;40122:47;40143:4;40149:5;40156:4;40162:6;40122:20;:47::i;40099:121::-;40192:20;;-1:-1:-1::0;;;40192:20:0::1;;;;;;;:::i;40099:121::-;10115:1;;;;-1:-1:-1::0;;9301:1:0;10263:7;:22;-1:-1:-1;;;;;;38855:1370:0:o;44809:1021::-;44894:10;44919:31;;:::i;:::-;44961:8;44958:59;;-1:-1:-1;;;;;44985:24:0;;;;;;:18;:24;;;;;;;-1:-1:-1;44958:59:0;45028:8;45025:180;;-1:-1:-1;;;;;45049:20:0;;;45046:103;;45090:16;;-1:-1:-1;;;;;45090:24:0;;;:16;;:24;;45089:50;;-1:-1:-1;;;;;;45120:18:0;;;;;;:12;:18;;;;;;;;45089:50;45081:58;;45046:103;45157:40;;45025:180;45217:24;45244:18;;;:13;:18;;;;;45300:10;;;;45280:16;;-1:-1:-1;;;;;45280:16:0;;;45300:10;;45280:30;;45279:62;;-1:-1:-1;45329:10:0;;;;-1:-1:-1;;;;;45329:10:0;45316:24;;;;:12;:24;;;;;;;;45279:62;45367:10;;;;-1:-1:-1;;;;;45367:10:0;45350:27;;45399:8;;;;45384:12;;;:23;45432:11;;;;45414:15;;;:29;45476:19;;;;45450:23;;;:45;45535:26;;;;45502:30;;;:59;45593:18;;;;45568:22;;;:43;45643:18;;;;45618:22;;;:43;45697:22;;;;45668:26;;;:51;45755:22;;;;;45367:10;45726:26;;:51;45271:70;-1:-1:-1;44809:1021:0;;;;;;:::o;32005:19::-;;;-1:-1:-1;;;;;32005:19:0;;:::o;35756:140::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;35885:5:::1;35866;:11;;35878:3;35866:16;;;;;;:::i;:::-;;;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;35756:140:::0;;:::o;42560:1005::-;42620:31;;:::i;:::-;42681:13;;42661:33;;42724:16;;42701:20;;;;:39;;;;42773:19;;42747:23;;;:45;42823:17;;42799:21;;;:41;42873:19;;42847:23;;;:45;42925:19;;42899:23;;;:45;42980:22;;42951:26;;;:51;43038:22;;43009:26;;;:51;43098:22;;43069:26;;;:51;43155:21;;43127:25;;;:49;43210:20;;43183:24;;;:47;43269:21;;43241:25;;;:49;43325:21;;43297:25;;;:49;43385:25;;43353:29;;;:57;43449:25;;43417:29;;;:57;43513:21;43485:25;;;:49;42560:1005;;:::o;35470:245::-;32254:16;;-1:-1:-1;;;;;32254:16:0;32274:10;32254:30;32246:59;;;;-1:-1:-1;;;32246:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35559:23:0;::::1;35551:57;;;;-1:-1:-1::0;;;35551:57:0::1;;;;;;;:::i;:::-;35631:16:::0;;-1:-1:-1;;;;;35620:27:0;;::::1;35631:16:::0;::::1;35620:27;35617:54;;;35657:7;;35617:54;35683:16:::0;:26;;-1:-1:-1;;;;;;35683:26:0::1;-1:-1:-1::0;;;;;35683:26:0;::::1;;::::0;;32312:1:::1;35470:245:::0;:::o;31981:19::-;;;-1:-1:-1;;;;;31981:19:0;;:::o;41486:1066::-;-1:-1:-1;;;;;41616:24:0;;41602:11;41616:24;;;:18;:24;;;;;;41566:26;;41650:8;41647:43;;41668:14;;;41647:43;41698:24;41725:18;;;:13;:18;;;;;;41698:24;41783:196;41822:5;:21;41810:33;;41783:196;;;41866:24;41893:30;;;;;;;;;;41960:10;;;;41945:26;;:10;;:14;:26::i;:::-;41932:39;-1:-1:-1;;41845:11:0;;41783:196;;;;42013:10;41997:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41987:37;;42031:10;42062:17;42058:462;42097:5;:21;42085:33;;42058:462;;;42141:24;42168:30;;;;;;;;;;42210:10;;;;42207:48;;42237:8;;;42207:48;42265:22;42290:32;:12;42316:5;42290:25;:32::i;:::-;42265:57;;42331:182;42349:23;;;;;;;;;42363:9;;;42349:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;42357:2;42349:11;;;;;;;;;;;;;;;;;:23;42383:4;;;;;42404:26;:12;42425:4;42404:20;:26::i;:::-;42400:61;;42444:5;;42400:61;42480:23;:12;42498:4;42480:17;:23::i;:::-;42473:30;;42331:182;;;42058:462;;;42120:11;;42058:462;;;;42532:14;;;;41486:1066;;;;:::o;35904:972::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;36111:5:::1;:21:::0;36099:33;::::1;36091:61;;;;-1:-1:-1::0;;;36091:61:0::1;;;;;;;:::i;:::-;36161:16;:14;:16::i;:::-;36190:32;36225:5;:14;;36240:9;36225:25;;;;;;;;;;;;;;;;;;36190:60;;36284:16;36257:7;:24;;:43;;;;36309:16;31876:4;36328:33;36346:7;:14;;;36328:7;:13;;;:17;;:33;;;;:::i;:::-;:43;;;;;;::::0;-1:-1:-1;36397:18:0::1;36381:12:::0;;::::1;;::::0;:34;::::1;;;;;;;36378:196;;;36449:21:::0;;:35:::1;::::0;36475:8;36449:25:::1;:35::i;:::-;36425:21:::0;:59;36378:196:::1;;;36531:21:::0;;:35:::1;::::0;36557:8;36531:25:::1;:35::i;:::-;36507:21:::0;:59;36378:196:::1;36582:14;::::0;::::1;:23:::0;;;36625:13:::1;::::0;::::1;::::0;31876:4:::1;::::0;36625:33:::1;::::0;36599:6;36625:17:::1;:33::i;:::-;:43;;;;;;::::0;-1:-1:-1;36694:18:0::1;36678:12:::0;;::::1;;::::0;:34;::::1;;;;;;;36675:196;;;36746:21:::0;;:35:::1;::::0;36772:8;36746:25:::1;:35::i;:::-;36722:21:::0;:59;36675:196:::1;;;36828:21:::0;;:35:::1;::::0;36854:8;36828:25:::1;:35::i;:::-;36804:21:::0;:59;36675:196:::1;32202:1;;35904:972:::0;;;:::o;43571:222::-;43629:43;43687:31;;:::i;:::-;43736:21;:19;:21::i;:::-;43728:59;;;;;;;;43772:14;43728:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43728:59:0;-1:-1:-1;43571:222:0;;:::o;45836:169::-;45945:25;;45909:12;;31876:4;;45936:35;;:4;;:8;:35::i;:::-;:45;;;;;;;45836:169;-1:-1:-1;;45836:169:0:o;43801:1002::-;43876:26;43917:28;;:::i;:::-;-1:-1:-1;;;;;44022:24:0;;44008:11;44022:24;;;:18;:24;;;;;;43960:38;;44056:8;44053:73;;44074:44;;;44053:73;44134:24;44161:18;;;:13;:18;;;;;44198:27;44220:4;44198:21;:27::i;:::-;44188:37;;44270:7;:14;44285:1;44270:16;44249:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44232:55;;44296:10;44317:227;44328:7;:14;44323:2;:19;44317:227;;;44427:109;44448:7;44456:2;44448:11;;;;;;;;;;;;;;:21;;;44471:7;44479:2;44471:11;;;;;;;;;;;;;;:18;;;44491:7;44499:2;44491:11;;;;;;;;;;;;;;:21;;;44514:7;44522:2;44514:11;;;;;;;;;;;;;;:21;;;44427:20;:109::i;:::-;44359:14;44374:2;44359:18;;;;;;;;;;;;;;:31;;44392:14;44407:2;44392:18;;;;;;;;;;;;;;;;;;;:31;44358:178;;;;;44344:4;;44317:227;;;44586:27;44607:5;44586:20;:27::i;:::-;44552:14;44567:2;44552:18;;;;;;;;;;;;;;:31;;:61;;;;;44654:63;44690:5;:14;;:26;;;44654:14;44669:2;44654:18;;;;;;;;;;;;;;:31;;;:35;;:63;;;;:::i;:::-;44620:14;44635:2;44620:18;;;;;;;;;;;;;;;;;;;:31;;:97;;;;44726:71;;;;;;;;44754:14;;;44726:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44726:71:0;-1:-1:-1;;43801:1002:0;;;;;;:::o;41038:442::-;41182:5;:21;41104:34;;41159:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41148:56;;41215:17;41211:236;41250:5;:21;41238:33;;41211:236;;;41316:5;:25;;41331:9;;41316:25;;;;;;;;;;;;;;41294:47;;;;;;;;;41316:25;;;;;41294:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;41303:9;41294:19;;;;;;;;;;;;;:47;;;;41392;41413:5;:14;;41428:9;41413:25;;;;;;;;;;;;;;;;;;41392:20;:47::i;:::-;41350:8;41359:9;41350:19;;;;;;;;;;;;;;;;;;:39;;:89;41273:11;;41211:236;;;;41038:442;:::o;38628:188::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38736:22;;:34:::1;::::0;38763:6;38736:26:::1;:34::i;:::-;38711:22:::0;:59;38777:4:::1;::::0;:33:::1;::::0;-1:-1:-1;;;38777:33:0;;-1:-1:-1;;;;;38777:4:0;;::::1;::::0;:9:::1;::::0;:33:::1;::::0;38787:10:::1;::::0;38799:6;;38777:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;37616:350:::0;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;37749:1:::1;37736:10;:14;37728:48;;;;-1:-1:-1::0;;;37728:48:0::1;;;;;;;:::i;:::-;37785:14:::0;:24;;;37816:25;:38;;;37861:25;:38;;;37957:3:::1;37936:18;37889:10:::0;37951:2:::1;37936:14;:18::i;:::-;:24;;;;;;37906:27:::0;:54;-1:-1:-1;;;37616:350:0:o;40904:128::-;40974:19;41010:5;:11;;41022:3;41010:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41003:23;;;;;;;;;-1:-1:-1;;41003:23:0;;;;;;;;;;;;;;;;;;;;;;;41010:16;;;;41003:23;;;41010:16;41003:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40904:128;;;:::o;38214:102::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38290:13;:20;38214:102::o;46011:171::-;46133:25;;46084:12;;46113:17;:4;31876;46113:8;:17::i;46226:123::-;46288:26;;:::i;:::-;46324:19;;;46331:12;46324:19;;;;;;;;;;;;;;;;;;;;46331:12;;46324:19;;;;46331:12;;-1:-1:-1;;46324:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46226:123;:::o;35128:165::-;32254:16;;-1:-1:-1;;;;;32254:16:0;32274:10;32254:30;32246:59;;;;-1:-1:-1;;;32246:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35208:19:0;::::1;;::::0;;;:12;:19:::1;::::0;;;;;::::1;;35207:20;35199:55;;;;-1:-1:-1::0;;;35199:55:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35261:19:0::1;;::::0;;;:12;:19:::1;::::0;;;;:26;;-1:-1:-1;;35261:26:0::1;35283:4;35261:26;::::0;;35128:165::o;35299:::-;32254:16;;-1:-1:-1;;;;;32254:16:0;32274:10;32254:30;32246:59;;;;-1:-1:-1;;;32246:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35378:19:0;::::1;;::::0;;;:12;:19:::1;::::0;;;;;::::1;;35370:54;;;;-1:-1:-1::0;;;35370:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35431:19:0::1;35453:5;35431:19:::0;;;:12;:19:::1;::::0;;;;:27;;-1:-1:-1;;35431:27:0::1;::::0;;35299:165::o;32029:19::-;;;-1:-1:-1;;;;;32029:19:0;;:::o;37414:196::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;37508:16:::1;:14;:16::i;:::-;37533:25:::0;:32;37572:25;:32;37414:196::o;40233:629::-;9345:1;9951:7;;:19;;9943:63;;;;-1:-1:-1;;;9943:63:0;;;;;;;:::i;:::-;9345:1;10084:7;:18;;;40364:13;10084:7;40378:18:::1;40385:10;40378:6;:18::i;:::-;40364:33;;;;;;;;;;;40337:60;;40410:12;40429:20:::0;40456:12:::1;40475:20:::0;40547:50:::1;40566:5;40573:9;40584:4;40590:6;40547:18;:50::i;:::-;40504:93:::0;;-1:-1:-1;40504:93:0;-1:-1:-1;40504:93:0;;-1:-1:-1;40504:93:0;-1:-1:-1;40609:8:0;;40606:86:::1;;40652:22;::::0;::::1;::::0;:32:::1;::::0;40679:4;40652:26:::1;:32::i;:::-;40627:22;::::0;::::1;:57:::0;40606:86:::1;40701:8:::0;;40698:86:::1;;40744:22;::::0;::::1;::::0;:32:::1;::::0;40771:4;40744:26:::1;:32::i;:::-;40719:22;::::0;::::1;:57:::0;40698:86:::1;40805:10;::::0;::::1;::::0;40792:64:::1;::::0;-1:-1:-1;;;;;40805:10:0::1;40817:4:::0;40823:12;40837:4;40843:12;40792::::1;:64::i;31887:25::-:0;;;;:::o;37972:236::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38044:6:::1;:34;;;;-1:-1:-1::0;38054:19:0;;:24;38044:34:::1;38041:162;;;38110:1;38088:19:::0;:23;38041:162:::1;;;38129:6;38128:7;:34;;;;-1:-1:-1::0;38139:19:0;;:23;;38128:34:::1;38125:78;;;38194:1;38172:19:::0;:23;37972:236;:::o;36882:526::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;37087:16:::1;:14;:16::i;:::-;37130:5;:21:::0;;37158::::1;::::0;::::1;::::0;;;37116:11:::1;37158:21:::0;;;37130;;:5;:21;;37221:19;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;37249:20:::0;;37221:19;;-1:-1:-1;37264:5:0;;37221:19;;-1:-1:-1;;37249:20:0::1;::::0;37264:5;37249:20;;::::1;;;;;;;;::::0;;-1:-1:-1;37276:12:0::1;::::0;::::1;:23:::0;;;;37306:14:::1;::::0;::::1;:23:::0;;;;37336:24:::1;::::0;::::1;:43:::0;;;;37386:10:::1;::::0;;::::1;:16:::0;-1:-1:-1;36882:526:0:o;46355:391::-;46468:24;46495:17;;;:13;:17;;;;;:5;46547:21;46432:26;;46495:17;46530:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46521:48;;46582:17;46578:141;46617:5;:21;46605:33;;46578:141;;;46681:19;:30;;;;;;;;;;;;46661:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;;:6;;46701:9;;46661:17;;;;;;;;;;;;;;;:50;46640:11;;46578:141;;;;46727:13;46355:391;;;:::o;38434:188::-;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38542:22;;:34:::1;::::0;38569:6;38542:26:::1;:34::i;:::-;38517:22:::0;:59;38583:4:::1;::::0;:33:::1;::::0;-1:-1:-1;;;38583:33:0;;-1:-1:-1;;;;;38583:4:0;;::::1;::::0;:9:::1;::::0;:33:::1;::::0;38593:10:::1;::::0;38605:6;;38583:33:::1;;;:::i;38322:106::-:0;32136:16;;-1:-1:-1;;;;;32136:16:0;32122:10;:30;;:58;;-1:-1:-1;32169:10:0;32156:24;;;;:12;:24;;;;;;;;32122:58;32114:81;;;;-1:-1:-1;;;32114:81:0;;;;;;;:::i;:::-;38397:16;:25;38322:106::o;30470:150::-;30548:22;;30545:70;;30585:22;;;;;;-1:-1:-1;30585:22:0;30470:150::o;18894:220::-;18952:7;18976:6;18972:20;;-1:-1:-1;18991:1:0;18984:8;;18972:20;19015:5;;;19019:1;19015;:5;:1;19039:5;;;;;:10;19031:56;;;;-1:-1:-1;;;19031:56:0;;;;;;;:::i;:::-;19105:1;-1:-1:-1;18894:220:0;;;;;:::o;18477:158::-;18535:7;18568:1;18563;:6;;18555:49;;;;-1:-1:-1;;;18555:49:0;;;;;;;:::i;:::-;-1:-1:-1;18622:5:0;;;18477:158::o;18015:179::-;18073:7;18105:5;;;18129:6;;;;18121:46;;;;-1:-1:-1;;;18121:46:0;;;;;;;:::i;46792:1464::-;46918:1;46905:10;:14;46897:41;;;;-1:-1:-1;;;46897:41:0;;;;;;;:::i;:::-;46975:4;;-1:-1:-1;;;;;46975:4:0;46953:10;:27;46945:58;;;;-1:-1:-1;;;46945:58:0;;;;;;;:::i;:::-;47012:24;47039:13;47012:24;47053:12;47060:4;47053:6;:12::i;:::-;47039:27;;;;;;;;;;;47012:54;;47073:29;47096:5;47073:22;:29::i;:::-;47177:26;;;;47157:10;;47177:39;-1:-1:-1;47174:102:0;;;-1:-1:-1;47242:26:0;;;;47174:102;47313:26;;;;:45;;47344:13;47313:30;:45::i;:::-;47284:26;;;:74;47390:22;;:41;;47417:13;47390:26;:41::i;:::-;47365:22;:66;47451:29;:10;47466:13;47451:14;:29::i;:::-;47438:42;-1:-1:-1;47513:15:0;47510:42;;47538:7;;;;47510:42;47603:14;;;:22;47583:10;;47603:35;-1:-1:-1;47600:93:0;;;-1:-1:-1;47663:14:0;;;:22;47600:93;47760:14;;;:22;47735:21;;;;47701:14;;47760:22;47718:39;;:12;;:16;:39::i;:::-;:64;;;;;47814:14;;;:22;47718:64;;;;-1:-1:-1;47814:40:0;;47841:12;47814:26;:40::i;:::-;47789:14;;;:65;47885:21;;;;:33;;47911:6;47885:25;:33::i;:::-;47861:21;;;:57;47950:22;;:40;;47977:12;47950:26;:40::i;:::-;47925:22;:65;48020:20;;:38;;48045:12;48020:24;:38::i;:::-;47997:20;:61;48078:28;:10;48093:12;48078:14;:28::i;:::-;48065:41;-1:-1:-1;48118:10:0;;48115:58;;48138:4;;:27;;-1:-1:-1;;;48138:27:0;;-1:-1:-1;;;;;48138:4:0;;;;:9;;:27;;48148:4;;48154:6;;48138:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48115:58;48188:14;;48185:66;;48212:4;;:31;;-1:-1:-1;;;48212:31:0;;-1:-1:-1;;;;;48212:4:0;;;;:9;;:31;;48222:4;;48228:10;;48212:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48185:66;46792:1464;;;;;;;:::o;48264:1016::-;48382:1;48369:10;:14;48361:41;;;;-1:-1:-1;;;48361:41:0;;;;;;;:::i;:::-;48439:4;;-1:-1:-1;;;;;48439:4:0;48417:10;:27;48409:58;;;;-1:-1:-1;;;48409:58:0;;;;;;;:::i;:::-;48476:18;48497:26;48512:10;48497:14;:26::i;:::-;48552:20;;48476:47;;-1:-1:-1;48538:34:0;;;48530:70;;;;-1:-1:-1;;;48530:70:0;;;;;;;:::i;:::-;48629:27;;48615:41;;;48607:78;;;;-1:-1:-1;;;48607:78:0;;;;;;;:::i;:::-;48694:24;48721:13;48694:24;48735:12;48742:4;48735:6;:12::i;:::-;48721:27;;;;;;;;;;;48694:54;;48755:29;48778:5;48755:22;:29::i;:::-;48823:20;;:14;48800:20;;;:43;48797:107;;;48876:20;;:14;48853:20;;:43;48797:107;48935:14;;;:22;:38;;48962:10;48935:26;:38::i;:::-;48910:14;;;:63;49004:21;;;;:37;;49030:10;49004:25;:37::i;:::-;48980:21;;;:61;49075:22;;:38;;49102:10;49075:26;:38::i;:::-;49050:22;:63;49143:20;;:36;;49168:10;49143:24;:36::i;:::-;49120:20;:59;49188:4;;:31;;-1:-1:-1;;;49188:31:0;;-1:-1:-1;;;;;49188:4:0;;;;:9;;:31;;49198:4;;49204:10;;49188:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49245:4;-1:-1:-1;;;;;49231:43:0;;49251:10;49263;49231:43;;;;;;;:::i;:::-;;;;;;;;48264:1016;;;;:::o;49288:2495::-;49534:1;49525:6;:10;49517:32;;;;-1:-1:-1;;;49517:32:0;;;;;;;:::i;:::-;49576:5;:21;49564:33;;49556:63;;;;-1:-1:-1;;;49556:63:0;;;;;;;:::i;:::-;49626:32;49661:5;:14;;49676:9;49661:25;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49696:12:0;;;;;:34;;;;;;;;49693:285;;;49770:4;;-1:-1:-1;;;;;49770:4:0;49748:10;:27;49740:58;;;;-1:-1:-1;;;49740:58:0;;;;;;;:::i;:::-;49693:285;;;49830:18;49814:12;;;;;:34;;;;;;;;49811:167;;;49888:4;;-1:-1:-1;;;;;49888:4:0;49866:10;:27;49858:58;;;;-1:-1:-1;;;49858:58:0;;;;;;;:::i;49811:167::-;49939:31;;-1:-1:-1;;;49939:31:0;;;;;;;:::i;49811:167::-;49986:16;:14;:16::i;:::-;50028:24;50055:13;50028:24;50069:12;50076:4;50069:6;:12::i;:::-;50055:27;;;;;;;;;;;-1:-1:-1;50055:27:0;50111:11;;;;50055:27;;-1:-1:-1;50134:10:0;;:29;;;;;50159:4;-1:-1:-1;;;;;50148:15:0;:7;-1:-1:-1;;;;;50148:15:0;;;50134:29;:56;;;;-1:-1:-1;;;;;;50167:23:0;;;;50134:56;50131:134;;;50214:15;50221:7;50214:6;:15::i;:::-;50200:11;;;:29;;;;-1:-1:-1;50131:134:0;50276:12;;;;50273:47;;-1:-1:-1;50311:1:0;50273:47;50331:10;;50328:230;;50351:26;50380:20;;;:13;:20;;;;;;;50409:28;;;:30;;;;;;;;50459:90;;50380:20;;50409:30;-1:-1:-1;;;;;50459:90:0;;;;;;;;;;;;50514:6;;50522:9;;50533:15;;50459:90;:::i;:::-;;;;;;;;50328:230;;50615:10;;;;50566:26;50595:31;;;;;;;;;;;50660:26;:12;:24;:26::i;:::-;50712:12;;50695:14;;;:29;;50635:51;;-1:-1:-1;50712:12:0;;;;;-1:-1:-1;;50695:29:0;50712:12;;50695:29;;;;;;;;;;;;-1:-1:-1;50753:10:0;;;;50731:19;;;:32;50787:12;;;;;50770:14;;;:29;;;50863:10;;50826:49;;50846:28;;:16;:28::i;:::-;50826:15;;:19;:49::i;:::-;50806:17;;;;:69;;;;50882:15;;;:23;;;50912:16;;;:25;;;:16;50966:17;;;50944:19;;;:39;51012:17;;;50990:19;;;:39;51038;:12;51063:7;50806:4;51038:24;:39::i;:::-;51132:13;;;;:25;;51150:6;51132:17;:25::i;:::-;51116:13;;;:41;51183:18;51167:12;;;;;:34;;;;;;;;51164:614;;;51236:22;;;;:34;;51263:6;51236:26;:34::i;:::-;51211:22;;;:59;51301:19;;:31;;51325:6;51301:23;:31::i;:::-;51279:19;:53;51402:14;;;;51365:63;;31876:4;;51391:26;;:6;;:10;:26::i;:::-;:36;;;;;51365:21;;;51391:36;;51365:25;:63::i;:::-;51341:21;:87;51164:614;;;51461:18;51445:12;;;;;:34;;;;;;;;51442:336;;;51514:22;;;;:34;;51541:6;51514:26;:34::i;:::-;51489:22;;;:59;51579:19;;:31;;51603:6;51579:23;:31::i;:::-;51557:19;:53;51642:20;;:32;;51667:6;51642:24;:32::i;:::-;51619:20;:55;51744:14;;;;51707:63;;31876:4;;51733:26;;:6;;:10;:26::i;:::-;:36;;;;;51707:21;;;51733:36;;51707:25;:63::i;:::-;51683:21;:87;51442:336;49288:2495;;;;;;;;;:::o;27369:262::-;27508:22;27561:1;27548:5;:10;;;:14;27540:41;;;;-1:-1:-1;;;27540:41:0;;;;;;;:::i;:::-;27613:11;;27597:28;;:6;;27613:11;27597:28;;;;;;;;;;;;;;;;27590:35;;27369:262;;;;:::o;26828:217::-;26976:9;;26955:8;;26973:47;;-1:-1:-1;27007:5:0;27000:12;;26973:47;-1:-1:-1;27035:4:0;26828:217;;;;:::o;27051:282::-;27226:9;;27172:26;;27250:11;27242:36;;;;-1:-1:-1;;;27242:36:0;;;;;;;:::i;:::-;27294:6;:15;;27318:7;27294:33;;;;;;;;;;;;;;;;;;27287:40;;;27051:282;;;;:::o;60675:280::-;60743:21;;60724:15;:40;60721:67;;;60774:7;;60721:67;60800:9;60796:106;60819:5;:21;60815:25;;60796:106;;;60855:39;60876:5;:14;;60891:1;60876:17;;;;;;;;;;;;;;;;;;60855:20;:39::i;:::-;60842:3;;60796:106;;;-1:-1:-1;60934:15:0;60910:21;:39;60675:280;:::o;60961:546::-;61101:20;61123;61157:32;61192:5;:14;;61207:9;61192:25;;;;;;;;;;;;;;;;;;61157:60;;61227:24;61253;61281:27;61300:7;61281:18;:27::i;:::-;61226:82;;-1:-1:-1;61226:82:0;-1:-1:-1;31876:4:0;61330:43;61341:31;61226:82;61362:9;61341:20;:31::i;:::-;61330:6;;:10;:43::i;:::-;:53;;;;;;;-1:-1:-1;31876:4:0;61405:43;61416:31;:16;61437:9;61416:20;:31::i;61405:43::-;:53;;;;;;61390:68;;61467:34;;;60961:546;;;;;;;:::o;54418:428::-;54544:14;;;:22;54511:20;;54541:56;;-1:-1:-1;54588:1:0;54581:8;;54541:56;54609:13;54625:22;:20;:22::i;:::-;54609:38;;54681:5;54657;:14;;:20;;;:29;54654:58;;54703:1;54696:8;;;;;54654:58;54776:20;;;;31876:4;;54739:59;;54766:31;;:5;;:9;:31::i;:::-;54739:14;;;:22;;:26;:59::i;:::-;:69;;;;;;;54418:428;-1:-1:-1;;;54418:428:0:o;59201:645::-;59302:12;59325:7;:13;;;59342:1;59325:18;59322:47;;;-1:-1:-1;59360:1:0;59353:8;;59322:47;59381:9;59393:33;59411:7;:14;;;59393:7;:13;;;:17;;:33;;;;:::i;:::-;59381:45;-1:-1:-1;59452:18:0;59436:12;;;;;:34;;;;;;;;59433:338;;;59483:21;;59480:59;;59528:1;59521:8;;;;;59480:59;59589:21;;59560:25;;59554:32;;:1;;:5;:32::i;:::-;:56;;;;;;59547:63;;59433:338;;;59636:21;;59633:59;;59681:1;59674:8;;;;;59633:59;59742:21;;59713:25;;59707:32;;:1;;:5;:32::i;:::-;:56;;;;;;59700:63;;59433:338;59802:13;;;;59786;:4;59795:3;59786:8;:13::i;53658:372::-;-1:-1:-1;;;;;53730:24:0;;53705:11;53730:24;;;:18;:24;;;;;;53764:8;;53761:39;;53782:10;;53761:39;-1:-1:-1;53812:17:0;:19;;;;;;;;;;:17;53897:18;;;:13;:18;;;;;;;;53922:10;;;:17;;-1:-1:-1;;;;;53922:17:0;;-1:-1:-1;;;;;;53922:17:0;;;;;;;;53812:5;53946:8;;;;:14;;;53977:24;;;:18;:24;;;:30;;;53658:372;;;:::o;51789:1855::-;51920:12;51947:20;51982:12;52009:20;52039:16;:14;:16::i;:::-;52068:4;52064:43;;52098:1;52082:17;;52064:43;52118:11;52115:43;;52149:1;52139:11;;;;52115:43;52171:17;52190:22;52214:8;52226:39;52244:5;52251:13;52226:17;:39::i;:::-;52170:95;;;;;;52278:1305;52284:3;:17;;;;;52300:1;52291:6;:10;52284:17;:58;;;;;52307:4;52306:5;:35;;;;52328:13;52315:9;:26;52306:35;52278:1305;;;52462:14;;;;52447:5;:30;;-1:-1:-1;;52352:8:0;;;;52394:9;;;;52369:22;;52447:5;:30;;;;;;;;;;;;;;;;52412:65;;52489:21;52512;52537:25;52557:4;52537:19;:25::i;:::-;52488:74;;-1:-1:-1;52488:74:0;-1:-1:-1;52586:31:0;:12;52488:74;52586:16;:31::i;:::-;52571:46;-1:-1:-1;52641:31:0;:12;52658:13;52641:16;:31::i;:::-;52626:46;;52683:53;52694:5;52701:4;52707:13;52722;52683:10;:53::i;:::-;52769:4;:12;;;52751:15;:30;:47;;;;;52797:1;52785:4;:9;;;:13;52751:47;52750:76;;;-1:-1:-1;52804:9:0;;;;:13;:21;;;;;52821:4;52804:21;52747:829;;;52872:11;;;;52854:13;;;;:30;;:17;:30::i;:::-;52838:13;;;:46;52911:18;52898:9;;;;;;:31;;;;;;;;;52895:357;;;52959:11;;;;52950:21;;:4;;:8;:21::i;:::-;52943:28;;53008:68;31876:4;53034:31;53050:7;:14;;;53034:4;:11;;;:15;;:31;;;;:::i;:::-;:41;;;;;53008:21;;;53034:41;;53008:25;:68::i;:::-;52984:21;:92;52895:357;;;53123:11;;;;53114:21;;:4;;:8;:21::i;:::-;53107:28;;53172:68;31876:4;53198:31;53214:7;:14;;;53198:4;:11;;;:15;;:31;;;;:::i;:::-;:41;;;;;53172:21;;;53198:41;;53172:25;:68::i;:::-;53148:21;:92;52895:357;53262:56;53287:5;:19;;:30;53307:9;53287:30;;;;;;;;;;;53262:5;:12;;:24;;:56;;;;:::i;:::-;53354:35;53372:5;53379:9;53354:17;:35::i;:::-;53329:60;;-1:-1:-1;53329:60:0;-1:-1:-1;53329:60:0;-1:-1:-1;52747:829:0;;;53433:17;;;;53416:14;;;;:34;;;;53478:17;;;53461:14;;;:34;53531:35;53543:5;53550:9;53561:4;53531:11;:35::i;:::-;53506:60;;-1:-1:-1;53506:60:0;-1:-1:-1;53506:60:0;-1:-1:-1;52747:829:0;52278:1305;;;;;;;53591:47;;;51789:1855;;;;;;;;;:::o;57780:1370::-;58030:19;;58022:27;;;58014:61;;;;-1:-1:-1;;;58014:61:0;;;;;;;:::i;:::-;58098:20;;58090:28;;;58082:68;;;;-1:-1:-1;;;58082:68:0;;;;;;;:::i;:::-;58177:19;;58169:27;;;58161:61;;;;-1:-1:-1;;;58161:61:0;;;;;;;:::i;:::-;58238:8;;58235:142;;58278:19;;:29;;58302:4;58278:23;:29::i;:::-;58256:19;:51;58339:20;;:30;;58364:4;58339:24;:30::i;:::-;58316:20;:53;58235:142;58388:8;;58385:80;;58428:19;;:29;;58452:4;58428:23;:29::i;:::-;58406:19;:51;58385:80;58480:16;;58477:232;;58514:22;;:38;-1:-1:-1;58514:38:0;58506:83;;;;-1:-1:-1;;;58506:83:0;;;;;;;:::i;:::-;58623:22;;:40;;58650:12;58623:26;:40::i;:::-;58598:22;:65;58679:22;:4;58688:12;58679:8;:22::i;:::-;58672:29;;58477:232;58720:16;;58717:304;;58754:22;;:38;-1:-1:-1;58754:38:0;58746:83;;;;-1:-1:-1;;;58746:83:0;;;;;;;:::i;:::-;58863:22;;:40;;58890:12;58863:26;:40::i;:::-;58838:22;:65;58919:22;:4;58928:12;58919:8;:22::i;:::-;58974:21;;58912:29;;-1:-1:-1;58974:39:0;;59000:12;58974:25;:39::i;:::-;58950:21;:63;58717:304;59032:8;;59029:54;;59050:4;;:25;;-1:-1:-1;;;59050:25:0;;-1:-1:-1;;;;;59050:4:0;;;;:9;;:25;;59060:4;;59066;;59050:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59029:54;59094:8;;59091:54;;59112:4;;:25;;-1:-1:-1;;;59112:25:0;;-1:-1:-1;;;;;59112:4:0;;;;:9;;:25;;59122:4;;59128;;59112:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55117:347;55195:24;:22;:24::i;:::-;55226:20;55249:27;55270:5;55249:20;:27::i;:::-;55226:50;-1:-1:-1;55286:17:0;55283:44;;55313:7;;;55283:44;55358:20;;:14;55335:20;;:43;55414:26;;;;:44;;55445:12;55414:30;:44::i;:::-;55385:26;;;:73;-1:-1:-1;55117:347:0;:::o;30628:520::-;30744:21;;;;30705:22;;30741:348;;30783:22;;30780:74;;30822:22;;;;;;:15;:22;;;30780:74;30888:22;;30919;;;;;;30870:15;30919:22;;;30888:6;;:22;;30959:24;;;;;;;;;;;;;;;;;;30992:13;;;31014:9;;;:13;;;;31036:7;;;:17;;;;30959:24;-1:-1:-1;31070:11:0;;30741:348;31104:38;31117:6;31125;:16;;31104:12;:38::i;30005:421::-;30187:9;;;;;30175;;;:21;-1:-1:-1;30203:13:0;;30228:10;;;;30225:177;;30267:7;;;;30253:21;;;30283:9;;;:19;30225:177;;;30359:4;:7;;;30325:6;:15;;30341:5;:9;;;30325:26;;;;;;;;;;;;;;;;;;;;;:41;30387:7;;;;30375:9;;;:19;30225:177;-1:-1:-1;30408:10:0;;:12;;;;;;-1:-1:-1;30005:421:0:o;60509:160::-;60636:27;60655:7;60636:18;:27::i;:::-;60615:17;;;60595:68;60596:17;;;;60595:68;60509:160::o;59852:651::-;59951:17;59983;60010:15;60028:42;60048:5;:21;;;60028:15;:19;;:42;;;;:::i;:::-;60010:60;-1:-1:-1;60080:12:0;60077:78;;-1:-1:-1;;;60110:17:0;;;;60129;;;;60102:45;;60077:78;60175:79;60197:56;31876:4;60219:7;:24;;;60245:7;60197:12;:56::i;:::-;60175:17;;;;;:21;:79::i;:::-;60163:91;;60273:188;60295:165;31876:4;60369:29;60390:7;60369:20;:29::i;:::-;60452:7;60295:12;:165::i;:::-;60273:17;;;;;:21;:188::i;:::-;60261:200;;60468:29;59852:651;;;;:::o;54036:376::-;54150:25;;54105:13;;54131:15;:44;54128:92;;;-1:-1:-1;54192:20:0;;54185:27;;54128:92;54266:25;;54228:15;;54246:46;;:15;;:19;:46::i;:::-;54228:64;;54309:76;54334:50;31876:4;54356:5;:14;;:18;;;54376:7;54334:12;:50::i;:::-;54309:20;;;:24;:76::i;:::-;54301:84;;54394:12;54036:376;:::o;55670:515::-;55779:20;55801:22;55825:8;55847:279;55865:5;:21;55853:33;;55847:279;;;55896:24;55923:30;;;;;;;;;;55965:10;;;;55962:70;;-1:-1:-1;55992:11:0;;;;;56014:8;;55962:70;56047:32;:12;56073:5;56047:25;:32::i;:::-;56096:9;;-1:-1:-1;56040:39:0;-1:-1:-1;56113:4:0;;-1:-1:-1;56088:30:0;;-1:-1:-1;56088:30:0;55847:279;56142:1;56145:26;:12;:24;:26::i;:::-;56173:5;56134:45;;;;;;55670:515;;;;;;:::o;61513:234::-;61603:20;61625;61660:81;61681:4;:14;;;61697:4;:11;;;61710:4;:14;;;61726:4;:14;;;61660:20;:81::i;:::-;61653:88;;;;61513:234;;;:::o;56654:1120::-;56791:9;;;;56788:41;;56815:7;;56788:41;56857:10;;;;56877;56874:37;;56897:7;;;56874:37;56917:26;56946:20;;;:13;:20;;;;;57003:16;;56976:24;;;;:43;56973:70;;;57029:7;;;;56973:70;57090:13;;57055:15;;31876:4;;57073:31;;:12;;:16;:31::i;:::-;:41;;;;;;;-1:-1:-1;57121:15:0;;57168:12;;57165:113;;-1:-1:-1;57237:20:0;;;;57201:4;;57237:33;;57262:7;57237:24;:33::i;:::-;57214:20;;;:56;57165:113;57289:19;;:23;57286:222;;57349:13;;31876:4;;57332:31;;:12;;:16;:31::i;:::-;:41;;;;;;;-1:-1:-1;57385:12:0;;57382:119;;-1:-1:-1;57458:20:0;;;;57420:4;;57458:33;;57483:7;57458:24;:33::i;:::-;57435:20;;;:56;57382:119;57520:8;57516:36;;57538:7;;;;;;;57516:36;57564:21;;;:23;;;;;;;;;;57622:10;;;;57608:12;;;;57675:14;;;;57599:108;;-1:-1:-1;;;;;57622:10:0;;;;57608:12;;;;57599:108;;;;57657:7;;57666;;57691:15;;57599:108;:::i;:::-;;;;;;;;57729:12;;;;57716:50;;-1:-1:-1;;;;;57729:12:0;;57746:7;57729:12;57758:7;57716:12;:50::i;56654:1120::-;;;;;:::o;28556:208::-;28678:22;28703:27;28716:6;28724:5;28703:12;:27::i;:::-;28678:52;;28737:21;28745:6;28753:4;28737:7;:21::i;56191:457::-;56424:5;:21;56366:7;;;;;;56411:34;;56408:78;;-1:-1:-1;56463:1:0;;-1:-1:-1;56466:4:0;;-1:-1:-1;56463:1:0;56455:23;;56408:78;56497:26;:12;56518:4;56497:20;:26::i;:::-;56494:96;;;56541:9;56552:23;:12;56570:4;56552:17;:23::i;:::-;56577:4;56533:49;;;;;;;;56494:96;56605:37;56623:5;56630:9;56640:1;56630:11;56605:17;:37::i;:::-;56598:44;;;;;;56191:457;;;;;;;;:::o;54852:259::-;54906:13;54934:22;:20;:22::i;:::-;54975:20;;54926:30;;-1:-1:-1;54966:29:0;;54963:56;;55005:7;;;54963:56;55027:20;:28;55090:15;55062:25;:43;54852:259::o;29489:510::-;29618:22;29671:1;29658:5;:10;;;:14;29650:41;;;;-1:-1:-1;;;29650:41:0;;;;;;;:::i;:::-;29718:11;;29750:24;;:6;;29718:11;;29750:24;;;;;;;;;;;;;;;;;;;:29;29736:43;;;29789:15;29786:109;;29830:11;;29814:28;;29850:1;;29814:6;;:28;;;;;;;;;;;;;;;;:33;;:37;;;;29786:109;;;29886:1;29874:9;;;:13;29786:109;29901:10;;;:12;;-1:-1:-1;;29901:12:0;;;29929:24;;:6;;29945:7;;29929:24;;;;;;;;;;;;;;;;;;29960:13;;;29929:24;-1:-1:-1;;29489:510:0;;;;:::o;55470:194::-;55634:10;;55572:7;;31876:4;;55628:3;55600:25;55621:3;55600:16;:6;55611:4;55600:10;:16::i;:::-;:20;;:25::i;:::-;:31;;;;;;:44;;;;;;:54;;;;;;;55470:194;-1:-1:-1;;;;55470:194:0:o;26674:148::-;26761:22;26798:6;:15;;26814:1;26798:18;;;;;;;;;;;;;;;;;;26791:25;;26674:148;;;:::o;31154:165::-;31270:43;31282:6;31290;:16;;31308:4;31270:11;:43::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:162:1;81:20;;137:13;;130:21;120:32;;110:2;;166:1;163;156:12;181:377;;;298:3;291:4;283:6;279:17;275:27;265:2;;323:8;313;306:26;265:2;-1:-1:-1;353:20:1;;396:18;385:30;;382:2;;;435:8;425;418:26;382:2;479:4;471:6;467:17;455:29;;531:3;524:4;515:6;507;503:19;499:30;496:39;493:2;;;548:1;545;538:12;563:695;;661:3;654:4;646:6;642:17;638:27;628:2;;683:5;676;669:20;628:2;723:6;710:20;749:18;786:2;782;779:10;776:2;;;792:9;776:2;832;826:9;901:2;882:13;;-1:-1:-1;;878:27:1;866:40;;908:4;862:51;928:18;;;948:22;;;925:46;922:2;;;974:9;922:2;1001;994:22;1025:18;;;1062:15;;;1079:4;1058:26;1055:35;-1:-1:-1;1052:2:1;;;1107:5;1100;1093:20;1052:2;1175;1168:4;1160:6;1156:17;1149:4;1141:6;1137:17;1124:54;1198:15;;;1215:4;1194:26;1187:41;;;;1202:6;618:640;-1:-1:-1;;;618:640:1:o;1263:259::-;;1375:2;1363:9;1354:7;1350:23;1346:32;1343:2;;;1396:6;1388;1381:22;1343:2;1440:9;1427:23;1459:33;1486:5;1459:33;:::i;1527:1245::-;;;;;;;;;1762:3;1750:9;1741:7;1737:23;1733:33;1730:2;;;1784:6;1776;1769:22;1730:2;1828:9;1815:23;1847:33;1874:5;1847:33;:::i;:::-;1899:5;-1:-1:-1;1956:2:1;1941:18;;1928:32;1969:35;1928:32;1969:35;:::i;:::-;2023:7;-1:-1:-1;2082:2:1;2067:18;;2054:32;2095:35;2054:32;2095:35;:::i;:::-;2149:7;-1:-1:-1;2203:2:1;2188:18;;2175:32;;-1:-1:-1;2258:3:1;2243:19;;2230:33;2282:18;2312:14;;;2309:2;;;2344:6;2336;2329:22;2309:2;2388:60;2440:7;2431:6;2420:9;2416:22;2388:60;:::i;:::-;2467:8;;-1:-1:-1;2362:86:1;-1:-1:-1;2555:3:1;2540:19;;2527:33;;-1:-1:-1;2572:16:1;;;2569:2;;;2606:6;2598;2591:22;2569:2;;2650:62;2704:7;2693:8;2682:9;2678:24;2650:62;:::i;:::-;1720:1052;;;;-1:-1:-1;1720:1052:1;;-1:-1:-1;1720:1052:1;;;;;;2731:8;-1:-1:-1;;;1720:1052:1:o;2777:192::-;;2886:2;2874:9;2865:7;2861:23;2857:32;2854:2;;;2907:6;2899;2892:22;2854:2;2935:28;2953:9;2935:28;:::i;:::-;2925:38;2844:125;-1:-1:-1;;;2844:125:1:o;2974:498::-;;;;;3154:3;3142:9;3133:7;3129:23;3125:33;3122:2;;;3176:6;3168;3161:22;3122:2;3220:9;3207:23;3259:1;3252:5;3249:12;3239:2;;3280:6;3272;3265:22;3239:2;3308:5;3360:2;3345:18;;3332:32;;-1:-1:-1;3411:2:1;3396:18;;3383:32;;3462:2;3447:18;3434:32;;-1:-1:-1;3112:360:1;-1:-1:-1;;;3112:360:1:o;3477:344::-;;3599:2;3587:9;3578:7;3574:23;3570:32;3567:2;;;3620:6;3612;3605:22;3567:2;3665:9;3652:23;3698:18;3690:6;3687:30;3684:2;;;3735:6;3727;3720:22;3684:2;3763:52;3807:7;3798:6;3787:9;3783:22;3763:52;:::i;:::-;3753:62;3557:264;-1:-1:-1;;;;3557:264:1:o;3826:577::-;;;3975:2;3963:9;3954:7;3950:23;3946:32;3943:2;;;3996:6;3988;3981:22;3943:2;4041:9;4028:23;4070:18;4111:2;4103:6;4100:14;4097:2;;;4132:6;4124;4117:22;4097:2;4160:52;4204:7;4195:6;4184:9;4180:22;4160:52;:::i;:::-;4150:62;;4265:2;4254:9;4250:18;4237:32;4221:48;;4294:2;4284:8;4281:16;4278:2;;;4315:6;4307;4300:22;4278:2;;4343:54;4389:7;4378:8;4367:9;4363:24;4343:54;:::i;:::-;4333:64;;;3933:470;;;;;:::o;4408:190::-;;4520:2;4508:9;4499:7;4495:23;4491:32;4488:2;;;4541:6;4533;4526:22;4488:2;-1:-1:-1;4569:23:1;;4478:120;-1:-1:-1;4478:120:1:o;4603:327::-;;;4732:2;4720:9;4711:7;4707:23;4703:32;4700:2;;;4753:6;4745;4738:22;4700:2;4794:9;4781:23;4771:33;;4854:2;4843:9;4839:18;4826:32;4867:33;4894:5;4867:33;:::i;:::-;4919:5;4909:15;;;4690:240;;;;;:::o;4935:328::-;;;;5078:2;5066:9;5057:7;5053:23;5049:32;5046:2;;;5099:6;5091;5084:22;5046:2;5140:9;5127:23;5117:33;;5169:37;5202:2;5191:9;5187:18;5169:37;:::i;:::-;5159:47;;5253:2;5242:9;5238:18;5225:32;5215:42;;5036:227;;;;;:::o;5268:258::-;;;5397:2;5385:9;5376:7;5372:23;5368:32;5365:2;;;5418:6;5410;5403:22;5365:2;-1:-1:-1;;5446:23:1;;;5516:2;5501:18;;;5488:32;;-1:-1:-1;5355:171:1:o;5531:403::-;;;;5685:2;5673:9;5664:7;5660:23;5656:32;5653:2;;;5706:6;5698;5691:22;5653:2;5747:9;5734:23;5724:33;;5804:2;5793:9;5789:18;5776:32;5766:42;;5858:2;5847:9;5843:18;5830:32;5871:33;5898:5;5871:33;:::i;:::-;5923:5;5913:15;;;5643:291;;;;;:::o;5939:326::-;;;;6085:2;6073:9;6064:7;6060:23;6056:32;6053:2;;;6106:6;6098;6091:22;6053:2;-1:-1:-1;;6134:23:1;;;6204:2;6189:18;;6176:32;;-1:-1:-1;6255:2:1;6240:18;;;6227:32;;6043:222;-1:-1:-1;6043:222:1:o;6270:1137::-;;6384:5;6378:12;6411:6;6406:3;6399:19;6437:4;6466:2;6461:3;6457:12;6450:19;;6503:2;6496:5;6492:14;6524:3;6536:846;6550:6;6547:1;6544:13;6536:846;;;6615:6;6609:13;6635:48;6679:3;6674:2;6668:9;6635:48;:::i;:::-;6723:11;;;6717:18;6703:12;;;6696:40;6759:4;6803:11;;;6797:18;6783:12;;;6776:40;6839:4;6883:11;;;6877:18;6863:12;;;6856:40;6919:4;6963:11;;;6957:18;6943:12;;;6936:40;6999:4;7043:11;;;7037:18;7023:12;;;7016:40;7079:4;7123:11;;;7117:18;7103:12;;;7096:40;7159:4;7203:11;;;7197:18;7183:12;;;7176:40;7239:6;7285:11;;;7279:18;7265:12;;;7258:40;7327:6;7318:16;;;;7357:15;;;;6572:1;6565:9;6536:846;;;-1:-1:-1;7398:3:1;;6354:1053;-1:-1:-1;;;;;6354:1053:1:o;7412:481::-;;7519:5;7513:12;7546:6;7541:3;7534:19;7572:4;7601:2;7596:3;7592:12;7585:19;;7638:2;7631:5;7627:14;7659:3;7671:197;7685:6;7682:1;7679:13;7671:197;;;7734:50;7780:3;7771:6;7765:13;7734:50;:::i;:::-;7813:6;7804:16;;;;;7843:15;;;;7707:1;7700:9;7671:197;;7898:138;7986:1;7979:5;7976:12;7966:2;;7992:9;7966:2;8012:18;;7956:80::o;8041:210::-;8120:12;;8108:25;;8182:4;8171:16;;;8165:23;8149:14;;;8142:47;8238:4;8227:16;;;8221:23;8205:14;;8198:47;8098:153::o;8256:633::-;8340:5;8334:12;8329:3;8322:25;8393:4;8386:5;8382:16;8376:23;8408:62;8464:4;8459:3;8455:14;8441:12;8408:62;:::i;:::-;;8519:4;8512:5;8508:16;8502:23;8495:4;8490:3;8486:14;8479:47;8575:4;8568:5;8564:16;8558:23;8551:4;8546:3;8542:14;8535:47;8631:4;8624:5;8620:16;8614:23;8607:4;8602:3;8598:14;8591:47;8687:4;8680:5;8676:16;8670:23;8663:4;8658:3;8654:14;8647:47;8743:4;8736:5;8732:16;8726:23;8719:4;8714:3;8710:14;8703:47;8799:4;8792:5;8788:16;8782:23;8775:4;8770:3;8766:14;8759:47;8825:6;8878:2;8871:5;8867:14;8861:21;8856:2;8851:3;8847:12;8840:43;;8312:577;;:::o;8894:276::-;;9063:6;9057:13;9079:53;9125:6;9120:3;9113:4;9105:6;9101:17;9079:53;:::i;:::-;9148:16;;;;;9033:137;-1:-1:-1;;9033:137:1:o;9175:463::-;-1:-1:-1;;;;;9440:32:1;;;;9422:51;;9504:2;9489:18;;9482:34;9552:2;9547;9532:18;;9525:30;;;9175:463;9571:18;;;9564:32;9628:3;9613:19;;9412:226::o;10103:716::-;10328:2;10380:21;;;10450:13;;10353:18;;;10472:22;;;10103:716;;10328:2;10551:15;;;;10525:2;10510:18;;;10103:716;10597:196;10611:6;10608:1;10605:13;10597:196;;;10660:51;10707:3;10698:6;10692:13;10660:51;:::i;:::-;10768:15;;;;10740:4;10731:14;;;;;10633:1;10626:9;10597:196;;;-1:-1:-1;10810:3:1;;10308:511;-1:-1:-1;;;;;;10308:511:1:o;10824:350::-;;11069:2;11058:9;11051:21;11089:79;11164:2;11153:9;11149:18;11141:6;11089:79;:::i;11179:794::-;;11516:3;11505:9;11498:22;11537:80;11612:3;11601:9;11597:19;11589:6;11537:80;:::i;:::-;11529:88;;11659:6;11653:13;11648:2;11637:9;11633:18;11626:41;11721:2;11713:6;11709:15;11703:22;11698:2;11687:9;11683:18;11676:50;11780:2;11772:6;11768:15;11762:22;11757:2;11746:9;11742:18;11735:50;11840:2;11832:6;11828:15;11822:22;11816:3;11805:9;11801:19;11794:51;11900:3;11892:6;11888:16;11882:23;11876:3;11865:9;11861:19;11854:52;11961:3;11953:6;11949:16;11943:23;11937:3;11926:9;11922:19;11915:52;11488:485;;;;;:::o;11978:329::-;;12209:2;12198:9;12191:21;12229:72;12297:2;12286:9;12282:18;12274:6;12229:72;:::i;12312:1377::-;;12765:3;12754:9;12747:22;12792:73;12860:3;12849:9;12845:19;12837:6;12792:73;:::i;:::-;12884:2;12928:6;12922:13;12917:2;12906:9;12902:18;12895:41;12973:2;12965:6;12961:15;12955:22;12996:2;13034;13029;13018:9;13014:18;13007:30;13091:2;13083:6;13079:15;13073:22;13068:2;13057:9;13053:18;13046:50;13151:2;13143:6;13139:15;13133:22;13127:3;13116:9;13112:19;13105:51;13205:9;13197:6;13193:22;13187:3;13176:9;13172:19;13165:51;13236:6;13225:17;;13271:6;13265:13;13302:6;13294;13287:22;13337:2;13329:6;13325:15;13318:22;;13375:2;13367:6;13363:15;13349:29;;13396:4;13409:254;13423:6;13420:1;13417:13;13409:254;;;13482:13;;13520:9;;13508:22;;13570:11;;13564:18;13550:12;;;13543:40;13638:15;;;;13603:12;;;;13445:1;13438:9;13409:254;;;-1:-1:-1;13680:3:1;;12737:952;-1:-1:-1;;;;;;;;;12737:952:1:o;13694:878::-;;13912:3;13901:9;13897:19;13889:27;;13957:6;13950:14;13943:22;13932:9;13925:41;14038:1;14034;14029:3;14025:11;14021:19;14012:6;14006:13;14002:39;13997:2;13986:9;13982:18;13975:67;14096:2;14088:6;14084:15;14078:22;14073:2;14062:9;14058:18;14051:50;14155:2;14147:6;14143:15;14137:22;14132:2;14121:9;14117:18;14110:50;14215:2;14207:6;14203:15;14197:22;14191:3;14180:9;14176:19;14169:51;14275:3;14267:6;14263:16;14257:23;14251:3;14240:9;14236:19;14229:52;14336:3;14328:6;14324:16;14318:23;14312:3;14301:9;14297:19;14290:52;14397:3;14389:6;14385:16;14379:23;14373:3;14362:9;14358:19;14351:52;14440:3;14432:6;14428:16;14422:23;14464:3;14503:2;14498;14487:9;14483:18;14476:30;14561:2;14553:6;14549:15;14543:22;14537:3;14526:9;14522:19;14515:51;;;13879:693;;;;;:::o;14577:218::-;-1:-1:-1;;;;;14756:32:1;;;;14738:51;;14726:2;14711:18;;14693:102::o;14800:383::-;;14949:2;14938:9;14931:21;14981:6;14975:13;15024:6;15019:2;15008:9;15004:18;14997:34;15040:66;15099:6;15094:2;15083:9;15079:18;15074:2;15066:6;15062:15;15040:66;:::i;:::-;15167:2;15146:15;-1:-1:-1;;15142:29:1;15127:45;;;;15174:2;15123:54;;14921:262;-1:-1:-1;;14921:262:1:o;15188:336::-;15390:2;15372:21;;;15429:2;15409:18;;;15402:30;-1:-1:-1;;;15463:2:1;15448:18;;15441:42;15515:2;15500:18;;15362:162::o;15529:345::-;15731:2;15713:21;;;15770:2;15750:18;;;15743:30;-1:-1:-1;;;15804:2:1;15789:18;;15782:51;15865:2;15850:18;;15703:171::o;15879:339::-;16081:2;16063:21;;;16120:2;16100:18;;;16093:30;-1:-1:-1;;;16154:2:1;16139:18;;16132:45;16209:2;16194:18;;16053:165::o;16223:351::-;16425:2;16407:21;;;16464:2;16444:18;;;16437:30;16503:29;16498:2;16483:18;;16476:57;16565:2;16550:18;;16397:177::o;16579:345::-;16781:2;16763:21;;;16820:2;16800:18;;;16793:30;-1:-1:-1;;;16854:2:1;16839:18;;16832:51;16915:2;16900:18;;16753:171::o;16929:356::-;17131:2;17113:21;;;17150:18;;;17143:30;17209:34;17204:2;17189:18;;17182:62;17276:2;17261:18;;17103:182::o;17290:356::-;17492:2;17474:21;;;17511:18;;;17504:30;17570:34;17565:2;17550:18;;17543:62;17637:2;17622:18;;17464:182::o;17651:345::-;17853:2;17835:21;;;17892:2;17872:18;;;17865:30;-1:-1:-1;;;17926:2:1;17911:18;;17904:51;17987:2;17972:18;;17825:171::o;18001:342::-;18203:2;18185:21;;;18242:2;18222:18;;;18215:30;-1:-1:-1;;;18276:2:1;18261:18;;18254:48;18334:2;18319:18;;18175:168::o;18348:345::-;18550:2;18532:21;;;18589:2;18569:18;;;18562:30;-1:-1:-1;;;18623:2:1;18608:18;;18601:51;18684:2;18669:18;;18522:171::o;18698:351::-;18900:2;18882:21;;;18939:2;18919:18;;;18912:30;18978:29;18973:2;18958:18;;18951:57;19040:2;19025:18;;18872:177::o;19054:340::-;19256:2;19238:21;;;19295:2;19275:18;;;19268:30;-1:-1:-1;;;19329:2:1;19314:18;;19307:46;19385:2;19370:18;;19228:166::o;19399:346::-;19601:2;19583:21;;;19640:2;19620:18;;;19613:30;-1:-1:-1;;;19674:2:1;19659:18;;19652:52;19736:2;19721:18;;19573:172::o;19750:345::-;19952:2;19934:21;;;19991:2;19971:18;;;19964:30;-1:-1:-1;;;20025:2:1;20010:18;;20003:51;20086:2;20071:18;;19924:171::o;20100:340::-;20302:2;20284:21;;;20341:2;20321:18;;;20314:30;-1:-1:-1;;;20375:2:1;20360:18;;20353:46;20431:2;20416:18;;20274:166::o;20445:342::-;20647:2;20629:21;;;20686:2;20666:18;;;20659:30;-1:-1:-1;;;20720:2:1;20705:18;;20698:48;20778:2;20763:18;;20619:168::o;20792:336::-;20994:2;20976:21;;;21033:2;21013:18;;;21006:30;-1:-1:-1;;;21067:2:1;21052:18;;21045:42;21119:2;21104:18;;20966:162::o;21133:334::-;21335:2;21317:21;;;21374:2;21354:18;;;21347:30;-1:-1:-1;;;21408:2:1;21393:18;;21386:40;21458:2;21443:18;;21307:160::o;21472:354::-;21674:2;21656:21;;;21713:2;21693:18;;;21686:30;21752:32;21747:2;21732:18;;21725:60;21817:2;21802:18;;21646:180::o;21831:342::-;22033:2;22015:21;;;22072:2;22052:18;;;22045:30;-1:-1:-1;;;22106:2:1;22091:18;;22084:48;22164:2;22149:18;;22005:168::o;22178:342::-;22380:2;22362:21;;;22419:2;22399:18;;;22392:30;-1:-1:-1;;;22453:2:1;22438:18;;22431:48;22511:2;22496:18;;22352:168::o;22525:332::-;22727:2;22709:21;;;22766:1;22746:18;;;22739:29;-1:-1:-1;;;22799:2:1;22784:18;;22777:39;22848:2;22833:18;;22699:158::o;22862:346::-;23064:2;23046:21;;;23103:2;23083:18;;;23076:30;-1:-1:-1;;;23137:2:1;23122:18;;23115:52;23199:2;23184:18;;23036:172::o;23213:340::-;23415:2;23397:21;;;23454:2;23434:18;;;23427:30;-1:-1:-1;;;23488:2:1;23473:18;;23466:46;23544:2;23529:18;;23387:166::o;23558:397::-;23760:2;23742:21;;;23799:2;23779:18;;;23772:30;23838:34;23833:2;23818:18;;23811:62;-1:-1:-1;;;23904:2:1;23889:18;;23882:31;23945:3;23930:19;;23732:223::o;23960:338::-;24162:2;24144:21;;;24201:2;24181:18;;;24174:30;-1:-1:-1;;;24235:2:1;24220:18;;24213:44;24289:2;24274:18;;24134:164::o;24303:348::-;24505:2;24487:21;;;24544:2;24524:18;;;24517:30;24583:26;24578:2;24563:18;;24556:54;24642:2;24627:18;;24477:174::o;24656:334::-;24858:2;24840:21;;;24897:2;24877:18;;;24870:30;-1:-1:-1;;;24931:2:1;24916:18;;24909:40;24981:2;24966:18;;24830:160::o;24995:341::-;25197:2;25179:21;;;25236:2;25216:18;;;25209:30;-1:-1:-1;;;25270:2:1;25255:18;;25248:47;25327:2;25312:18;;25169:167::o;25341:336::-;25543:2;25525:21;;;25582:2;25562:18;;;25555:30;-1:-1:-1;;;25616:2:1;25601:18;;25594:42;25668:2;25653:18;;25515:162::o;25682:338::-;25884:2;25866:21;;;25923:2;25903:18;;;25896:30;-1:-1:-1;;;25957:2:1;25942:18;;25935:44;26011:2;25996:18;;25856:164::o;26025:338::-;26227:2;26209:21;;;26266:2;26246:18;;;26239:30;-1:-1:-1;;;26300:2:1;26285:18;;26278:44;26354:2;26339:18;;26199:164::o;26368:355::-;26570:2;26552:21;;;26609:2;26589:18;;;26582:30;26648:33;26643:2;26628:18;;26621:61;26714:2;26699:18;;26542:181::o;26728:347::-;26930:2;26912:21;;;26969:2;26949:18;;;26942:30;27008:25;27003:2;26988:18;;26981:53;27066:2;27051:18;;26902:173::o;27080:1193::-;27259:2;27270:21;;;27362:13;;27411:4;27391:18;;;27384:32;27465:19;;27329:3;27314:19;;27493:22;;;27080:1193;;27259:2;27573:21;;;27080:1193;;27546:3;27531:19;;;27625:491;27639:6;27636:1;27633:13;27625:491;;;27698:13;;27736:9;;27724:22;;27786:11;;;27780:18;27766:12;;;27759:40;27822:4;27866:11;;;27860:18;27846:12;;;27839:40;27902:4;27947:11;;;27941:18;;27972:60;28019:12;;;27941:18;27972:60;:::i;:::-;;;28061:6;28056:3;28052:16;28045:23;;28103:2;28095:6;28091:15;28081:25;;27661:1;27658;27654:9;27649:14;;27625:491;;;-1:-1:-1;28153:15:1;;;28147:22;;28178:69;28241:4;28226:20;;28147:22;28178:69;:::i;:::-;28264:3;27239:1034;-1:-1:-1;;;;;;27239:1034:1:o;28278:1360::-;28505:13;;28487:32;;28575:4;28563:17;;;28557:24;28535:20;;;28528:54;28638:4;28626:17;;;28620:24;28598:20;;;28591:54;28701:4;28689:17;;;28683:24;28661:20;;;28654:54;28764:4;28752:17;;;28746:24;28724:20;;;28717:54;28827:4;28815:17;;;28809:24;28787:20;;;28780:54;28890:4;28878:17;;;28872:24;28850:20;;;28843:54;28953:4;28941:17;;;28935:24;28913:20;;;28906:54;28979:6;29027:15;;;29021:22;29001:18;;;28994:50;29063:6;29111:15;;;29105:22;29085:18;;;29078:50;29147:6;29195:15;;;29189:22;29169:18;;;29162:50;29231:6;29279:15;;;29273:22;29253:18;;;29246:50;29315:6;29363:15;;;29357:22;29337:18;;;29330:50;29399:6;29447:15;;;29441:22;29421:18;;;29414:50;29483:6;29531:15;;;29525:22;29505:18;;;29498:50;29567:6;29615:15;;;29609:22;29589:18;;;29582:50;;;;28474:3;28459:19;;28441:1197::o;29643:177::-;29789:25;;;29777:2;29762:18;;29744:76::o;29825:248::-;29999:25;;;30055:2;30040:18;;30033:34;29987:2;29972:18;;29954:119::o;30078:319::-;30280:25;;;30336:2;30321:18;;30314:34;;;;30379:2;30364:18;;30357:34;30268:2;30253:18;;30235:162::o;30402:391::-;30633:25;;;30689:2;30674:18;;30667:34;;;;30732:2;30717:18;;30710:34;30775:2;30760:18;;30753:34;30620:3;30605:19;;30587:206::o;30798:258::-;30870:1;30880:113;30894:6;30891:1;30888:13;30880:113;;;30970:11;;;30964:18;30951:11;;;30944:39;30916:2;30909:10;30880:113;;;31011:6;31008:1;31005:13;31002:2;;;-1:-1:-1;;31046:1:1;31028:16;;31021:27;30851:205::o;31061:133::-;-1:-1:-1;;;;;31138:31:1;;31128:42;;31118:2;;31184:1;31181;31174:12
Swarm Source
ipfs://e41164bdf8c9a4db6120b097c47392ab0b27dfdcd74414380c0b5555653ad6a9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.