Contract Overview
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xab4d9337c128685caee594a077bf7c145cc4cc8d
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2023-01-05 */ // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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; } } pragma solidity >=0.6.0 <0.8.0; /* * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity 0.6.12; library LinkList { address public constant start = address(1); address public constant end = address(1); address public constant empty = address(0); struct List { uint256 llSize; mapping(address => address) next; } function init(List storage list) internal returns (List memory) { list.next[start] = end; return list; } function has(List storage list, address addr) internal view returns (bool) { return list.next[addr] != empty; } function add(List storage list, address addr) internal returns (List memory) { require(!has(list, addr), "LinkList::add:: addr is already in the list"); list.next[addr] = list.next[start]; list.next[start] = addr; list.llSize++; return list; } function remove( List storage list, address addr, address prevAddr ) internal returns (List memory) { require(has(list, addr), "LinkList::remove:: addr not whitelisted yet"); require(list.next[prevAddr] == addr, "LinkList::remove:: wrong prevConsumer"); list.next[prevAddr] = list.next[addr]; list.next[addr] = empty; list.llSize--; return list; } function getAll(List storage list) internal view returns (address[] memory) { address[] memory addrs = new address[](list.llSize); address curr = list.next[start]; for (uint256 i = 0; curr != end; i++) { addrs[i] = curr; curr = list.next[curr]; } return addrs; } function getPreviousOf(List storage list, address addr) internal view returns (address) { address curr = list.next[start]; require(curr != empty, "LinkList::getPreviousOf:: please init the linkedlist first"); for (uint256 i = 0; curr != end; i++) { if (list.next[curr] == addr) return curr; curr = list.next[curr]; } return end; } function getNextOf(List storage list, address curr) internal view returns (address) { return list.next[curr]; } function length(List storage list) internal view returns (uint256) { return list.llSize; } } pragma solidity 0.6.12; interface ISUGAR { // SUGAR specific functions function lock(address _account, uint256 _amount) external; function lockOf(address _account) external view returns (uint256); function unlock() external; function mint(address _to, uint256 _amount) external; // Generic BEP20 functions function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); // Getter functions function startReleaseBlock() external view returns (uint256); function endReleaseBlock() external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity 0.6.12; interface IStake { // Stake specific functions function safeSugarTransfer(address _account, uint256 _amount) external; } pragma solidity 0.6.12; interface IMasterChef { /// @dev functions return information. no states changed. function poolLength() external view returns (uint256); function pendingSugar(address _stakeToken, address _user) external view returns (uint256); function userInfo(address _stakeToken, address _user) external view returns ( uint256, uint256, address ); function poolInfo(address _stakeToken) external view returns ( uint256, uint256, uint256, uint256 ); function devAddr() external view returns (address); function refAddr() external view returns (address); function bonusMultiplier() external view returns (uint256); function totalAllocPoint() external view returns (uint256); function sugarPerBlock() external view returns (uint256); /// @dev configuration functions function addPool( address _stakeToken, uint256 _allocPoint, uint256 _depositFee ) external; function setPool( address _stakeToken, uint256 _allocPoint, uint256 _depositFee ) external; function updatePool(address _stakeToken) external; function removePool(address _stakeToken) external; /// @dev user interaction functions function deposit( address _for, address _stakeToken, uint256 _amount ) external; function withdraw( address _for, address _stakeToken, uint256 _amount ) external; function depositSugar(address _for, uint256 _amount) external; function withdrawSugar(address _for, uint256 _amount) external; function harvest(address _for, address _stakeToken) external; function harvest(address _for, address[] calldata _stakeToken) external; function emergencyWithdraw(address _for, address _stakeToken) external; function mintExtraReward( address _stakeToken, address _to, uint256 _amount ) external; function sugar() external returns (ISUGAR); } pragma solidity 0.6.12; interface IMasterChefCallback { function masterChefCall( address stakeToken, address userAddr, uint256 unboostedReward ) external; } pragma solidity 0.6.12; interface IReferral { function setMasterChef(address _masterChef) external; function activate(address referrer) external; function activateBySign( address referee, address referrer, uint8 v, bytes32 r, bytes32 s ) external; function isActivated(address _address) external view returns (bool); function updateReferralReward(address accountAddress, uint256 reward) external; function claimReward() external; } pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } 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; } } pragma solidity 0.6.12; // MasterChef is the master of SUGAR. He can make SUGAR and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once SUGAR is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterChef is IMasterChef, Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; using LinkList for LinkList.List; using Address for address; // Info of each user. struct UserInfo { uint256 amount; // How many Staking tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. address fundedBy; } // Info of each pool. struct PoolInfo { uint256 allocPoint; // How many allocation points assigned to this pool. uint256 lastRewardBlock; // Last block number that SUGAR distribution occurs. uint256 accSugarPerShare; // Accumulated SUGAR per share, times 1e12. See below. uint256 depositFee; } // SUGAR token. ISUGAR public override sugar; // Stake address. IStake public stake; // Dev address. address public override devAddr; uint256 public devBps; // Refferal address. address public override refAddr; uint256 public refBps; // SUGAR per block. uint256 public override sugarPerBlock; // Bonus muliplier for early users. uint256 public override bonusMultiplier; // Pool link list. LinkList.List public pools; // Info of each pool. mapping(address => PoolInfo) public override poolInfo; // Info of each user that stakes Staking tokens. mapping(address => mapping(address => UserInfo)) public override userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public override totalAllocPoint; // The block number when SUGAR mining starts. uint256 public startBlock; // Does the pool allows some contracts to fund for an account. mapping(address => bool) public stakeTokenCallerAllowancePool; // list of contracts that the pool allows to fund. mapping(address => LinkList.List) public stakeTokenCallerContracts; event Deposit(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 amount); event Withdraw(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 amount); event EmergencyWithdraw(address indexed user, address indexed stakeToken, uint256 amount); event Harvest(address indexed funder, address indexed fundee, address indexed stakeToken, uint256 reward); event SetStakeTokenCallerAllowancePool(address indexed stakeToken, bool isAllowed); event AddStakeTokenCallerContract(address indexed stakeToken, address indexed caller); event SetSugarPerBlock(uint256 prevSugarPerBlock, uint256 currentSugarPerBlock); event RemoveStakeTokenCallerContract(address indexed stakeToken, address indexed caller); event SetRefAddress(address indexed refAddress); event SetDevAddress(address indexed devAddress); event SetRefBps(uint256 refBps); event SetDevBps(uint256 devBps); event UpdateMultiplier(uint256 bonusMultiplier); constructor( ISUGAR _sugar, IStake _stake, address _devAddr, address _refAddr, uint256 _sugarPerBlock, uint256 _startBlock ) public { require( _devAddr != address(0) && _devAddr != address(1), "constructor: _devAddr must not be address(0) or address(1)" ); require( _refAddr != address(0) && _refAddr != address(1), "constructor: _refAddr must not be address(0) or address(1)" ); bonusMultiplier = 1; sugar = _sugar; stake = _stake; devAddr = _devAddr; refAddr = _refAddr; sugarPerBlock = _sugarPerBlock; startBlock = _startBlock; devBps = 0; refBps = 0; pools.init(); // add SUGAR pool pools.add(address(_sugar)); poolInfo[address(_sugar)] = PoolInfo({ allocPoint: 0, lastRewardBlock: startBlock, accSugarPerShare: 0, depositFee: 0 }); totalAllocPoint = 0; } // Only permitted funder can continue the execution modifier onlyPermittedTokenFunder(address _beneficiary, address _stakeToken) { require(_isFunder(_beneficiary, _stakeToken), "onlyPermittedTokenFunder: caller is not permitted"); _; } // Only stake token caller contract can continue the execution (stakeTokenCaller must be a funder contract) modifier onlyStakeTokenCallerContract(address _stakeToken) { require(stakeTokenCallerContracts[_stakeToken].has(_msgSender()), "onlyStakeTokenCallerContract: bad caller"); _; } // Set funder allowance for a stake token pool function setStakeTokenCallerAllowancePool(address _stakeToken, bool _isAllowed) external onlyOwner { stakeTokenCallerAllowancePool[_stakeToken] = _isAllowed; emit SetStakeTokenCallerAllowancePool(_stakeToken, _isAllowed); } // Setter function for adding stake token contract caller function addStakeTokenCallerContract(address _stakeToken, address _caller) external onlyOwner { require( stakeTokenCallerAllowancePool[_stakeToken], "addStakeTokenCallerContract: the pool doesn't allow a contract caller" ); LinkList.List storage list = stakeTokenCallerContracts[_stakeToken]; if (list.getNextOf(LinkList.start) == LinkList.empty) { list.init(); } list.add(_caller); emit AddStakeTokenCallerContract(_stakeToken, _caller); } // Setter function for removing stake token contract caller function removeStakeTokenCallerContract(address _stakeToken, address _caller) external onlyOwner { require( stakeTokenCallerAllowancePool[_stakeToken], "removeStakeTokenCallerContract: the pool doesn't allow a contract caller" ); LinkList.List storage list = stakeTokenCallerContracts[_stakeToken]; list.remove(_caller, list.getPreviousOf(_caller)); emit RemoveStakeTokenCallerContract(_stakeToken, _caller); } function setDevAddress(address _devAddr) external onlyOwner { require( _devAddr != address(0) && _devAddr != address(1), "setDevAddress: _devAddr must not be address(0) or address(1)" ); devAddr = _devAddr; emit SetDevAddress(_devAddr); } function setDevBps(uint256 _devBps) external onlyOwner { require(_devBps <= 1000, "setDevBps::bad devBps"); massUpdatePools(); devBps = _devBps; emit SetDevBps(_devBps); } function setRefAddress(address _refAddr) external onlyOwner { require( _refAddr != address(0) && _refAddr != address(1), "setRefAddress: _refAddr must not be address(0) or address(1)" ); refAddr = _refAddr; emit SetRefAddress(_refAddr); } function setRefBps(uint256 _refBps) external onlyOwner { require(_refBps <= 100, "setRefBps::bad refBps"); massUpdatePools(); refBps = _refBps; emit SetRefBps(_refBps); } // Set SUGAR per block. function setSugarPerBlock(uint256 _sugarPerBlock) external onlyOwner { massUpdatePools(); uint256 prevSugarPerBlock = sugarPerBlock; sugarPerBlock = _sugarPerBlock; emit SetSugarPerBlock(prevSugarPerBlock, sugarPerBlock); } // Add a pool. Can only be called by the owner. function addPool( address _stakeToken, uint256 _allocPoint, uint256 _depositFee ) external override onlyOwner { require( _stakeToken != address(0) && _stakeToken != address(1), "addPool: _stakeToken must not be address(0) or address(1)" ); require(!pools.has(_stakeToken), "addPool: _stakeToken duplicated"); massUpdatePools(); uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); pools.add(_stakeToken); poolInfo[_stakeToken] = PoolInfo({ allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accSugarPerShare: 0, depositFee: _depositFee }); } // Update the given pool's SUGAR allocation point. Can only be called by the owner. function setPool( address _stakeToken, uint256 _allocPoint, uint256 _depositFee ) external override onlyOwner { require( _stakeToken != address(0) && _stakeToken != address(1), "setPool: _stakeToken must not be address(0) or address(1)" ); require(pools.has(_stakeToken), "setPool: _stakeToken not in the list"); massUpdatePools(); totalAllocPoint = totalAllocPoint.sub(poolInfo[_stakeToken].allocPoint).add(_allocPoint); poolInfo[_stakeToken].allocPoint = _allocPoint; poolInfo[_stakeToken].depositFee = _depositFee; } // Remove pool. Can only be called by the owner. function removePool(address _stakeToken) external override onlyOwner { require(_stakeToken != address(sugar), "removePool: can't remove SUGAR pool"); require(pools.has(_stakeToken), "removePool: pool not add yet"); require(IERC20(_stakeToken).balanceOf(address(this)) == 0, "removePool: pool not empty"); massUpdatePools(); totalAllocPoint = totalAllocPoint.sub(poolInfo[_stakeToken].allocPoint); pools.remove(_stakeToken, pools.getPreviousOf(_stakeToken)); poolInfo[_stakeToken].allocPoint = 0; poolInfo[_stakeToken].lastRewardBlock = 0; poolInfo[_stakeToken].accSugarPerShare = 0; poolInfo[_stakeToken].depositFee = 0; } // Return the length of poolInfo function poolLength() external view override returns (uint256) { return pools.length(); } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _lastRewardBlock, uint256 _currentBlock) private view returns (uint256) { return _currentBlock.sub(_lastRewardBlock).mul(bonusMultiplier); } function updateMultiplier(uint256 _bonusMultiplier) public onlyOwner { bonusMultiplier = _bonusMultiplier; emit UpdateMultiplier(_bonusMultiplier); } // Validating if a msg sender is a funder function _isFunder(address _beneficiary, address _stakeToken) internal view returns (bool) { if (stakeTokenCallerAllowancePool[_stakeToken]) return stakeTokenCallerContracts[_stakeToken].has(_msgSender()); return _beneficiary == _msgSender(); } // View function to see pending SUGARs on frontend. function pendingSugar(address _stakeToken, address _user) external view override returns (uint256) { PoolInfo storage pool = poolInfo[_stakeToken]; UserInfo storage user = userInfo[_stakeToken][_user]; uint256 accSugarPerShare = pool.accSugarPerShare; uint256 totalStakeToken = IERC20(_stakeToken).balanceOf(address(this)); if (block.number > pool.lastRewardBlock && totalStakeToken != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 sugarReward = multiplier.mul(sugarPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accSugarPerShare = accSugarPerShare.add(sugarReward.mul(1e12).div(totalStakeToken)); } return user.amount.mul(accSugarPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { address current = pools.next[LinkList.start]; while (current != LinkList.end) { updatePool(current); current = pools.getNextOf(current); } } // Update reward variables of the given pool to be up-to-date. function updatePool(address _stakeToken) public override { PoolInfo storage pool = poolInfo[_stakeToken]; if (block.number <= pool.lastRewardBlock) { return; } uint256 totalStakeToken = IERC20(_stakeToken).balanceOf(address(this)); if (totalStakeToken == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 sugarReward = multiplier.mul(sugarPerBlock).mul(pool.allocPoint).div(totalAllocPoint); sugar.mint(devAddr, sugarReward.mul(devBps).div(10000)); sugar.mint(address(stake), sugarReward.mul(refBps).div(10000)); sugar.mint(address(stake), sugarReward); pool.accSugarPerShare = pool.accSugarPerShare.add(sugarReward.mul(1e12).div(totalStakeToken)); pool.lastRewardBlock = block.number; } // Deposit token to MasterChef for SUGAR allocation. function deposit( address _for, address _stakeToken, uint256 _amount ) external override onlyPermittedTokenFunder(_for, _stakeToken) nonReentrant { require( _stakeToken != address(0) && _stakeToken != address(1), "setPool: _stakeToken must not be address(0) or address(1)" ); require(_stakeToken != address(sugar), "deposit: use depositSugar instead"); require(pools.has(_stakeToken), "deposit: no pool"); PoolInfo storage pool = poolInfo[_stakeToken]; UserInfo storage user = userInfo[_stakeToken][_for]; if (user.fundedBy != address(0)) require(user.fundedBy == _msgSender(), "deposit: only funder"); updatePool(_stakeToken); if (user.amount > 0) _harvest(_for, _stakeToken); if (user.fundedBy == address(0)) user.fundedBy = _msgSender(); if (_amount > 0) { uint256 depositFeeAmount = _amount.mul(pool.depositFee).div(10000); if (depositFeeAmount > 0) { _amount = _amount.sub(depositFeeAmount); IERC20(_stakeToken).safeTransferFrom(address(_msgSender()), devAddr, depositFeeAmount); } IERC20(_stakeToken).safeTransferFrom(address(_msgSender()), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12); emit Deposit(_msgSender(), _for, _stakeToken, _amount); } // Withdraw token from MasterChef. function withdraw( address _for, address _stakeToken, uint256 _amount ) external override nonReentrant { require( _stakeToken != address(0) && _stakeToken != address(1), "setPool: _stakeToken must not be address(0) or address(1)" ); require(_stakeToken != address(sugar), "withdraw: use withdrawSugar instead"); require(pools.has(_stakeToken), "withdraw: no pool"); PoolInfo storage pool = poolInfo[_stakeToken]; UserInfo storage user = userInfo[_stakeToken][_for]; require(user.fundedBy == _msgSender(), "withdraw: only funder"); require(user.amount >= _amount, "withdraw: not good"); updatePool(_stakeToken); _harvest(_for, _stakeToken); if (_amount > 0) { user.amount = user.amount.sub(_amount); IERC20(_stakeToken).safeTransfer(_msgSender(), _amount); } user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12); if (user.amount == 0) user.fundedBy = address(0); emit Withdraw(_msgSender(), _for, _stakeToken, _amount); } // Deposit SUGAR to MasterChef. function depositSugar(address _for, uint256 _amount) external override onlyPermittedTokenFunder(_for, address(sugar)) nonReentrant { PoolInfo storage pool = poolInfo[address(sugar)]; UserInfo storage user = userInfo[address(sugar)][_for]; if (user.fundedBy != address(0)) require(user.fundedBy == _msgSender(), "depositSugar: bad sof"); updatePool(address(sugar)); if (user.amount > 0) _harvest(_for, address(sugar)); if (user.fundedBy == address(0)) user.fundedBy = _msgSender(); if (_amount > 0) { uint256 depositFeeAmount = _amount.mul(pool.depositFee).div(10000); if (depositFeeAmount > 0) { _amount = _amount.sub(depositFeeAmount); IERC20(address(sugar)).safeTransferFrom(address(_msgSender()), devAddr, depositFeeAmount); } IERC20(address(sugar)).safeTransferFrom(address(_msgSender()), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12); emit Deposit(_msgSender(), _for, address(sugar), _amount); } // Withdraw SUGAR function withdrawSugar(address _for, uint256 _amount) external override nonReentrant { PoolInfo storage pool = poolInfo[address(sugar)]; UserInfo storage user = userInfo[address(sugar)][_for]; require(user.fundedBy == _msgSender(), "withdrawSugar: only funder"); require(user.amount >= _amount, "withdrawSugar: not good"); updatePool(address(sugar)); _harvest(_for, address(sugar)); if (_amount > 0) { user.amount = user.amount.sub(_amount); IERC20(address(sugar)).safeTransfer(address(_msgSender()), _amount); } user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12); if (user.amount == 0) user.fundedBy = address(0); emit Withdraw(_msgSender(), _for, address(sugar), user.amount); } // Harvest SUGAR earned from a specific pool. function harvest(address _for, address _stakeToken) external override nonReentrant { PoolInfo storage pool = poolInfo[_stakeToken]; UserInfo storage user = userInfo[_stakeToken][_for]; updatePool(_stakeToken); _harvest(_for, _stakeToken); user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12); } // Harvest SUGAR earned from pools. function harvest(address _for, address[] calldata _stakeTokens) external override nonReentrant { for (uint256 i = 0; i < _stakeTokens.length; i++) { PoolInfo storage pool = poolInfo[_stakeTokens[i]]; UserInfo storage user = userInfo[_stakeTokens[i]][_for]; updatePool(_stakeTokens[i]); _harvest(_for, _stakeTokens[i]); user.rewardDebt = user.amount.mul(pool.accSugarPerShare).div(1e12); } } // Internal function to harvest SUGAR function _harvest(address _for, address _stakeToken) internal { PoolInfo memory pool = poolInfo[_stakeToken]; UserInfo memory user = userInfo[_stakeToken][_for]; require(user.fundedBy == _msgSender(), "_harvest: only funder"); require(user.amount > 0, "_harvest: nothing to harvest"); uint256 pending = user.amount.mul(pool.accSugarPerShare).div(1e12).sub(user.rewardDebt); require(pending <= sugar.balanceOf(address(stake)), "_harvest: wait what.. not enough SUGAR"); stake.safeSugarTransfer(_for, pending); if (stakeTokenCallerContracts[_stakeToken].has(_msgSender())) { _masterChefCallee(_msgSender(), _stakeToken, _for, pending); } _referralCallee(_for, pending); emit Harvest(_msgSender(), _for, _stakeToken, pending); } function _referralCallee(address _for, uint256 _pending) internal { if (!refAddr.isContract()) { return; } stake.safeSugarTransfer(address(refAddr), _pending.mul(refBps).div(10000)); (bool success, ) = refAddr.call( abi.encodeWithSelector(IReferral.updateReferralReward.selector, _for, _pending.mul(refBps).div(10000)) ); require(success, "_referralCallee: failed to execute updateReferralReward"); } // Observer function for those contract implementing onBeforeLock, execute an onBeforelock statement function _masterChefCallee( address _caller, address _stakeToken, address _for, uint256 _pending ) internal { if (!_caller.isContract()) { return; } (bool success, ) = _caller.call( abi.encodeWithSelector(IMasterChefCallback.masterChefCall.selector, _stakeToken, _for, _pending) ); require(success, "_masterChefCallee: failed to execute masterChefCall"); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(address _for, address _stakeToken) external override nonReentrant { UserInfo storage user = userInfo[_stakeToken][_for]; require(user.fundedBy == _msgSender(), "emergencyWithdraw: only funder"); IERC20(_stakeToken).safeTransfer(address(_for), user.amount); emit EmergencyWithdraw(_for, _stakeToken, user.amount); user.amount = 0; user.rewardDebt = 0; user.fundedBy = address(0); } // This is a function for mining an extra amount of sugar, should be called only by stake token caller contract (boosting purposed) function mintExtraReward( address _stakeToken, address _to, uint256 _amount ) external override onlyStakeTokenCallerContract(_stakeToken) { sugar.mint(_to, _amount); } }
[{"inputs":[{"internalType":"contract ISUGAR","name":"_sugar","type":"address"},{"internalType":"contract IStake","name":"_stake","type":"address"},{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"address","name":"_refAddr","type":"address"},{"internalType":"uint256","name":"_sugarPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AddStakeTokenCallerContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"RemoveStakeTokenCallerContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"devBps","type":"uint256"}],"name":"SetDevBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"refAddress","type":"address"}],"name":"SetRefAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"refBps","type":"uint256"}],"name":"SetRefBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"SetStakeTokenCallerAllowancePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSugarPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentSugarPerBlock","type":"uint256"}],"name":"SetSugarPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bonusMultiplier","type":"uint256"}],"name":"UpdateMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":true,"internalType":"address","name":"fundee","type":"address"},{"indexed":true,"internalType":"address","name":"stakeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"addStakeTokenCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositSugar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address[]","name":"_stakeTokens","type":"address[]"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintExtraReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSugar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSugarPerShare","type":"uint256"},{"internalType":"uint256","name":"depositFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pools","outputs":[{"internalType":"uint256","name":"llSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"name":"removeStakeTokenCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddr","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devBps","type":"uint256"}],"name":"setDevBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_refAddr","type":"address"}],"name":"setRefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_refBps","type":"uint256"}],"name":"setRefBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"bool","name":"_isAllowed","type":"bool"}],"name":"setStakeTokenCallerAllowancePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sugarPerBlock","type":"uint256"}],"name":"setSugarPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"contract IStake","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTokenCallerAllowancePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeTokenCallerContracts","outputs":[{"internalType":"uint256","name":"llSize","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sugar","outputs":[{"internalType":"contract ISUGAR","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sugarPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusMultiplier","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"address","name":"fundedBy","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSugar","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620045d8380380620045d8833981810160405260c08110156200003757600080fd5b508051602082015160408301516060840151608085015160a090950151939492939192909160006200006862000277565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b03841615801590620000d957506001600160a01b038416600114155b620001165760405162461bcd60e51b815260040180806020018281038252603a81526020018062004573603a913960400191505060405180910390fd5b6001600160a01b038316158015906200013957506001600160a01b038316600114155b620001765760405162461bcd60e51b815260040180806020018281038252603a81526020018062004539603a913960400191505060405180910390fd5b6001600955600280546001600160a01b03199081166001600160a01b0389811691909117909255600380548216888416179055600480548216878416179055600680549091169185169190911790556008829055600f81905560006005819055600755620001f1600a6200027b602090811b62002d0c17901c565b506200020d86600a620002bb60201b62002d4a1790919060201c565b5050604080516080810182526000808252600f546020808401918252838501838152606085018481526001600160a01b03909b168452600c90915293822092518355516001830155915160028201559551600390960195909555505050600e9190915550620003aa565b3390565b6200028562000397565b5060016000818152828201602090815260409182902080546001600160a01b031916909317909255805191820190529054815290565b620002c562000397565b620002d1838362000372565b156200030f5760405162461bcd60e51b815260040180806020018281038252602b815260200180620045ad602b913960400191505060405180910390fd5b50600160008181528382016020908152604080832080546001600160a01b039687168086528386208054989092166001600160a01b0319988916179091559385905280549095169092179093558354909101928390558051918201905290815290565b6001600160a01b03818116600090815260018401602052604090205416151592915050565b6040518060200160405280600081525090565b61417f80620003ba6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806366cc1857116101465780638da5cb5b116100c3578063d0d3f18d11610087578063d0d3f18d14610781578063d0d41fe11461079e578063d9caed12146107c4578063da09c72c146107fa578063f2fde38b14610802578063fa8e15b9146108285761025e565b80638da5cb5b146107155780639a7b5f111461071d578063a0e0e13c14610769578063a8b973a114610771578063c5c51dca146107795761025e565b806378b2c1791161010a57806378b2c1791461065f578063799352cb146106675780637b46c54f1461068d5780637fb595f7146106b35780638340f549146106df5761025e565b806366cc1857146105eb57806366eed48e1461061957806369d0c5b814610621578063715018a614610629578063773b4dfe146106315761025e565b80633a4b66f1116101df57806348cd4cb1116101a357806348cd4cb11461053d5780634a0ee32c146105455780634b372dd6146105625780635ffe614614610598578063630b5ba1146105b55780636382d9ad146105bd5761025e565b80633a4b66f1146104765780633b7d09461461049a5780633dff45e9146104c05780633f98b267146104f2578063424362db1461050f5761025e565b80630f208beb116102265780630f208beb1461038b578063178a5f98146103e057806317caf6f11461040e57806317ccd7ee14610416578063363e7317146104485761025e565b80630196d0af146102635780630504f9cd1461029d578063061e26af146102cb57806307a10005146102f1578063081e3eda14610371575b600080fd5b6102896004803603602081101561027957600080fd5b50356001600160a01b0316610830565b604080519115158252519081900360200190f35b6102c9600480360360408110156102b357600080fd5b506001600160a01b038135169060200135610845565b005b6102c9600480360360208110156102e157600080fd5b50356001600160a01b0316610b0e565b6102c96004803603604081101561030757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561033257600080fd5b82018360208201111561034457600080fd5b8035906020019184602083028401116401000000008311171561036657600080fd5b509092509050610c17565b610379610d75565b60408051918252519081900360200190f35b6103b9600480360360408110156103a157600080fd5b506001600160a01b0381358116916020013516610d86565b6040805193845260208401929092526001600160a01b031682820152519081900360600190f35b6102c9600480360360408110156103f657600080fd5b506001600160a01b0381351690602001351515610dbb565b610379610e7d565b6102c96004803603606081101561042c57600080fd5b506001600160a01b038135169060208101359060400135610e83565b6103796004803603604081101561045e57600080fd5b506001600160a01b038135811691602001351661102d565b61047e611180565b604080516001600160a01b039092168252519081900360200190f35b6102c9600480360360208110156104b057600080fd5b50356001600160a01b031661118f565b6102c9600480360360608110156104d657600080fd5b506001600160a01b0381351690602081013590604001356113d5565b6102c96004803603602081101561050857600080fd5b5035611538565b6102c96004803603604081101561052557600080fd5b506001600160a01b038135811691602001351661162b565b610379611772565b6102c96004803603602081101561055b57600080fd5b5035611778565b6102c96004803603606081101561057857600080fd5b506001600160a01b0381358116916020810135909116906040013561186c565b6102c9600480360360208110156105ae57600080fd5b5035611944565b6102c96119e1565b6102c9600480360360408110156105d357600080fd5b506001600160a01b0381358116916020013516611a46565b6102c96004803603604081101561060157600080fd5b506001600160a01b0381358116916020013516611ba5565b610379611c59565b61047e611c5f565b6102c9611c6e565b6102c96004803603604081101561064757600080fd5b506001600160a01b0381358116916020013516611d1a565b610379611e47565b6103796004803603602081101561067d57600080fd5b50356001600160a01b0316611e4d565b6102c9600480360360208110156106a357600080fd5b50356001600160a01b0316611e5f565b6102c9600480360360408110156106c957600080fd5b506001600160a01b03813516906020013561211f565b6102c9600480360360608110156106f557600080fd5b506001600160a01b03813581169160208101359091169060400135612358565b61047e6126e5565b6107436004803603602081101561073357600080fd5b50356001600160a01b03166126f4565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61047e61271b565b61037961272a565b610379612730565b6102c96004803603602081101561079757600080fd5b5035612736565b6102c9600480360360208110156107b457600080fd5b50356001600160a01b03166127e7565b6102c9600480360360608110156107da57600080fd5b506001600160a01b038135811691602081013590911690604001356128f0565b61047e612bf5565b6102c96004803603602081101561081857600080fd5b50356001600160a01b0316612c04565b610379612d06565b60106020526000908152604090205460ff1681565b60025482906001600160a01b031661085d8282612dfb565b6108985760405162461bcd60e51b8152600401808060200182810382526031815260200180613d976031913960400191505060405180910390fd5b600260015414156108de576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b6002600181905580546001600160a01b039081166000908152600c60209081526040808320600d83528184208a861685529092529091209283015490929116156109865761092a612e70565b60028201546001600160a01b03908116911614610986576040805162461bcd60e51b81526020600482015260156024820152743232b837b9b4ba29bab3b0b91d103130b21039b7b360591b604482015290519081900360640190fd5b60025461099b906001600160a01b0316611e5f565b8054156109b9576002546109b99087906001600160a01b0316612e74565b60028101546001600160a01b03166109f6576109d3612e70565b6002820180546001600160a01b0319166001600160a01b03929092169190911790555b8415610a89576000610a21612710610a1b8560030154896131dc90919063ffffffff16565b9061323c565b90508015610a5a57610a3386826132a3565b9550610a5a610a40612e70565b6004546002546001600160a01b0390811692911684613300565b610a79610a65612e70565b6002546001600160a01b0316903089613300565b8154610a859087613360565b8255505b60028201548154610aa49164e8d4a5100091610a1b916131dc565b60018201556002546001600160a01b03908116908716610ac2612e70565b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96886040518082815260200191505060405180910390a450506001805550505050565b610b16612e70565b6001600160a01b0316610b276126e5565b6001600160a01b031614610b70576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03811615801590610b9257506001600160a01b038116600114155b610bcd5760405162461bcd60e51b815260040180806020018281038252603c815260200180613e8c603c913960400191505060405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517f43c33f61b2cd06a9dcb62807aef5440f6388e0b77658248697d1d9be01820a0f90600090a250565b60026001541415610c5d576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b600260015560005b81811015610d6b576000600c6000858585818110610c7f57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002090506000600d6000868686818110610cc357fe5b6001600160a01b036020918202939093013583168452838101949094525060409182016000908120918a168152925290209050610d1a858585818110610d0557fe5b905060200201356001600160a01b0316611e5f565b610d3f86868686818110610d2a57fe5b905060200201356001600160a01b0316612e74565b60028201548154610d5a9164e8d4a5100091610a1b916131dc565b600191820155919091019050610c65565b5050600180555050565b6000610d81600a6133ba565b905090565b600d6020908152600092835260408084209091529082529020805460018201546002909201549091906001600160a01b031683565b610dc3612e70565b6001600160a01b0316610dd46126e5565b6001600160a01b031614610e1d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805460ff1916851515908117909155825190815291517fa74a0b200dafba5df263e0d0c90173d62fda8752c351a8a83cdb5bd33cb4d38e9281900390910190a25050565b600e5481565b610e8b612e70565b6001600160a01b0316610e9c6126e5565b6001600160a01b031614610ee5576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03831615801590610f0757506001600160a01b038316600114155b610f425760405162461bcd60e51b8152600401808060200182810382526039815260200180613ec86039913960400191505060405180910390fd5b610f4d600a846133be565b15610f9f576040805162461bcd60e51b815260206004820152601f60248201527f616464506f6f6c3a205f7374616b65546f6b656e206475706c69636174656400604482015290519081900360640190fd5b610fa76119e1565b6000600f544311610fba57600f54610fbc565b435b600e54909150610fcc9084613360565b600e55610fda600a85612d4a565b506040805160808101825293845260208085019283526000858301818152606087019586526001600160a01b039097168152600c9091522092518355516001830155915160028201559051600390910155565b6001600160a01b038083166000818152600c60209081526040808320600d83528184209587168452948252808320600286015482516370a0823160e01b815230600482015292519496959194909387936370a082319260248083019392829003018186803b15801561109e57600080fd5b505afa1580156110b2573d6000803e3d6000fd5b505050506040513d60208110156110c857600080fd5b50516001850154909150431180156110df57508015155b156111455760006110f48560010154436133e3565b90506000611121600e54610a1b886000015461111b600854876131dc90919063ffffffff16565b906131dc565b905061114061113984610a1b8464e8d4a510006131dc565b8590613360565b935050505b611173836001015461116d64e8d4a51000610a1b8688600001546131dc90919063ffffffff16565b906132a3565b9450505050505b92915050565b6003546001600160a01b031681565b611197612e70565b6001600160a01b03166111a86126e5565b6001600160a01b0316146111f1576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6002546001600160a01b038281169116141561123e5760405162461bcd60e51b8152600401808060200182810382526023815260200180613f996023913960400191505060405180910390fd5b611249600a826133be565b61129a576040805162461bcd60e51b815260206004820152601c60248201527f72656d6f7665506f6f6c3a20706f6f6c206e6f74206164642079657400000000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156112e057600080fd5b505afa1580156112f4573d6000803e3d6000fd5b505050506040513d602081101561130a57600080fd5b50511561135e576040805162461bcd60e51b815260206004820152601a60248201527f72656d6f7665506f6f6c3a20706f6f6c206e6f7420656d707479000000000000604482015290519081900360640190fd5b6113666119e1565b6001600160a01b0381166000908152600c6020526040902054600e5461138b916132a3565b600e556113a68161139d600a826133f7565b600a91906134c4565b506001600160a01b03166000908152600c60205260408120818155600181018290556002810182905560030155565b6113dd612e70565b6001600160a01b03166113ee6126e5565b6001600160a01b031614611437576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b0383161580159061145957506001600160a01b038316600114155b6114945760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b61149f600a846133be565b6114da5760405162461bcd60e51b8152600401808060200182810382526024815260200180613cd16024913960400191505060405180910390fd5b6114e26119e1565b6001600160a01b0383166000908152600c6020526040902054600e5461151391849161150d916132a3565b90613360565b600e556001600160a01b039092166000908152600c6020526040902090815560030155565b611540612e70565b6001600160a01b03166115516126e5565b6001600160a01b03161461159a576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b60648111156115e8576040805162461bcd60e51b81526020600482015260156024820152747365745265664270733a3a6261642072656642707360581b604482015290519081900360640190fd5b6115f06119e1565b60078190556040805182815290517f5596a3fb1cf7d976a0d68cf433833e2abf8922c45ba5213d682555abba37c9499181900360200190a150565b611633612e70565b6001600160a01b03166116446126e5565b6001600160a01b03161461168d576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff166116e45760405162461bcd60e51b81526004018080602001828103825260458152602001806140526045913960600191505060405180910390fd5b6001600160a01b0382166000908152601160205260408120906117088260016135d3565b6001600160a01b031614156117225761172081612d0c565b505b61172c8183612d4a565b50816001600160a01b0316836001600160a01b03167f3d744029323ee9a48b6e3067d6f614fb9542fb23c76df2053f783d4244d814b960405160405180910390a3505050565b600f5481565b611780612e70565b6001600160a01b03166117916126e5565b6001600160a01b0316146117da576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6103e8811115611829576040805162461bcd60e51b81526020600482015260156024820152747365744465764270733a3a6261642064657642707360581b604482015290519081900360640190fd5b6118316119e1565b60058190556040805182815290517f1e59efd4b015a26bfc328db57b6753ffa0139e8010ff1a5aa48a6471b5332c919181900360200190a150565b82611896611878612e70565b6001600160a01b0383166000908152601160205260409020906133be565b6118d15760405162461bcd60e51b8152600401808060200182810382526028815260200180613d156028913960400191505060405180910390fd5b600254604080516340c10f1960e01b81526001600160a01b03868116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b15801561192657600080fd5b505af115801561193a573d6000803e3d6000fd5b5050505050505050565b61194c612e70565b6001600160a01b031661195d6126e5565b6001600160a01b0316146119a6576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b60098190556040805182815290517fa0be54773ac26c27d6d0e44698c6b7c95df74fcf44847d1561849a34fc48b0789181900360200190a150565b6001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf546001600160a01b03165b6001600160a01b038116600114611a4357611a3181611e5f565b611a3c600a826135d3565b9050611a17565b50565b60026001541415611a8c576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b038082166000908152600d60209081526040808320938616835292905220611abe612e70565b60028201546001600160a01b03908116911614611b22576040805162461bcd60e51b815260206004820152601e60248201527f656d657267656e637957697468647261773a206f6e6c792066756e6465720000604482015290519081900360640190fd5b8054611b3a906001600160a01b0384169085906135f6565b805460408051918252516001600160a01b0380851692908616917ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f38833285049181900360200190a36000808255600180830191909155600290910180546001600160a01b031916905580555050565b60026001541415611beb576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b038082166000908152600c60209081526040808320600d83528184209487168452939091529020611c2783611e5f565b611c318484612e74565b60028201548154611c4c9164e8d4a5100091610a1b916131dc565b6001918201558055505050565b60085481565b6006546001600160a01b031681565b611c76612e70565b6001600160a01b0316611c876126e5565b6001600160a01b031614611cd0576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611d22612e70565b6001600160a01b0316611d336126e5565b6001600160a01b031614611d7c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526010602052604090205460ff16611dd35760405162461bcd60e51b8152600401808060200182810382526048815260200180613fbc6048913960600191505060405180910390fd5b6001600160a01b0382166000908152601160205260409020611e0182611df983826133f7565b8391906134c4565b50816001600160a01b0316836001600160a01b03167fa8c3c290cefaeb1444073366880836da0f1d35e164c7163216e5d0e2c979e5f760405160405180910390a3505050565b60055481565b60116020526000908152604090205481565b6001600160a01b0381166000908152600c6020526040902060018101544311611e885750611a43565b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ed757600080fd5b505afa158015611eeb573d6000803e3d6000fd5b505050506040513d6020811015611f0157600080fd5b5051905080611f17575043600190910155611a43565b6000611f278360010154436133e3565b90506000611f4e600e54610a1b866000015461111b600854876131dc90919063ffffffff16565b6002546004546005549293506001600160a01b03918216926340c10f199290911690611f839061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b50506002546003546007546001600160a01b0392831694506340c10f1993509116906120129061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561205857600080fd5b505af115801561206c573d6000803e3d6000fd5b5050600254600354604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b1580156120c857600080fd5b505af11580156120dc573d6000803e3d6000fd5b5050505061210a6120ff84610a1b64e8d4a51000856131dc90919063ffffffff16565b600286015490613360565b60028501555050436001909201919091555050565b60026001541415612165576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001819055546001600160a01b039081166000908152600c60209081526040808320600d835281842094871684529390915290206121a3612e70565b60028201546001600160a01b03908116911614612207576040805162461bcd60e51b815260206004820152601a60248201527f776974686472617753756761723a206f6e6c792066756e646572000000000000604482015290519081900360640190fd5b805483111561225d576040805162461bcd60e51b815260206004820152601760248201527f776974686472617753756761723a206e6f7420676f6f64000000000000000000604482015290519081900360640190fd5b600254612272906001600160a01b0316611e5f565b6002546122899085906001600160a01b0316612e74565b82156122bb57805461229b90846132a3565b81556122bb6122a8612e70565b6002546001600160a01b031690856135f6565b600282015481546122d69164e8d4a5100091610a1b916131dc565b600182015580546122f4576002810180546001600160a01b03191690555b6002546001600160a01b0390811690851661230d612e70565b835460408051918252516001600160a01b0392909216917f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f79181900360200190a45050600180555050565b82826123648282612dfb565b61239f5760405162461bcd60e51b8152600401808060200182810382526031815260200180613d976031913960400191505060405180910390fd5b600260015414156123e5576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b0384161580159061240c57506001600160a01b038416600114155b6124475760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b6002546001600160a01b03858116911614156124945760405162461bcd60e51b8152600401808060200182810382526021815260200180613e2a6021913960400191505060405180910390fd5b61249f600a856133be565b6124e3576040805162461bcd60e51b815260206004820152601060248201526f19195c1bdcda5d0e881b9bc81c1bdbdb60821b604482015290519081900360640190fd5b6001600160a01b038085166000908152600c60209081526040808320600d83528184208a86168552909252909120600281015491929091161561258357612528612e70565b60028201546001600160a01b03908116911614612583576040805162461bcd60e51b81526020600482015260146024820152733232b837b9b4ba1d1037b7363c90333ab73232b960611b604482015290519081900360640190fd5b61258c86611e5f565b80541561259d5761259d8787612e74565b60028101546001600160a01b03166125da576125b7612e70565b6002820180546001600160a01b0319166001600160a01b03929092169190911790555b84156126625760006125ff612710610a1b8560030154896131dc90919063ffffffff16565b905080156126355761261186826132a3565b955061263561261e612e70565b6004546001600160a01b038a811692911684613300565b612652612640612e70565b6001600160a01b038916903089613300565b815461265e9087613360565b8255505b6002820154815461267d9164e8d4a5100091610a1b916131dc565b60018201556001600160a01b03808716908816612698612e70565b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a96886040518082815260200191505060405180910390a45050600180555050505050565b6000546001600160a01b031690565b600c6020526000908152604090208054600182015460028301546003909301549192909184565b6002546001600160a01b031681565b60095481565b600a5481565b61273e612e70565b6001600160a01b031661274f6126e5565b6001600160a01b031614612798576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6127a06119e1565b6008805490829055604080518281526020810184905281517ffdb01ec377cc02ae17303f4a9fcc1222ec17f21497f1be21a4b72281d12c85a7929181900390910190a15050565b6127ef612e70565b6001600160a01b03166128006126e5565b6001600160a01b031614612849576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b0381161580159061286b57506001600160a01b038116600114155b6128a65760405162461bcd60e51b815260040180806020018281038252603c815260200180613dc8603c913960400191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517ff5721dfa6ddbf8e4a2cd38b2152fff4008050b9b37de59ae1e022dde4bd5df7390600090a250565b60026001541415612936576040805162461bcd60e51b815260206004820152601f6024820152600080516020613cf5833981519152604482015290519081900360640190fd5b60026001556001600160a01b0382161580159061295d57506001600160a01b038216600114155b6129985760405162461bcd60e51b81526004018080602001828103825260398152602001806140c16039913960400191505060405180910390fd5b6002546001600160a01b03838116911614156129e55760405162461bcd60e51b815260040180806020018281038252602381526020018061402f6023913960400191505060405180910390fd5b6129f0600a836133be565b612a35576040805162461bcd60e51b81526020600482015260116024820152701dda5d1a191c985dce881b9bc81c1bdbdb607a1b604482015290519081900360640190fd5b6001600160a01b038083166000908152600c60209081526040808320600d83528184209488168452939091529020612a6b612e70565b60028201546001600160a01b03908116911614612ac7576040805162461bcd60e51b81526020600482015260156024820152743bb4ba34323930bb9d1037b7363c90333ab73232b960591b604482015290519081900360640190fd5b8054831115612b12576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b612b1b84611e5f565b612b258585612e74565b8215612b55578054612b3790846132a3565b8155612b55612b44612e70565b6001600160a01b03861690856135f6565b60028201548154612b709164e8d4a5100091610a1b916131dc565b60018201558054612b8e576002810180546001600160a01b03191690555b836001600160a01b0316856001600160a01b0316612baa612e70565b6001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f7866040518082815260200191505060405180910390a4505060018055505050565b6004546001600160a01b031681565b612c0c612e70565b6001600160a01b0316612c1d6126e5565b6001600160a01b031614612c66576040805162461bcd60e51b81526020600482018190526024820152600080516020613e6c833981519152604482015290519081900360640190fd5b6001600160a01b038116612cab5760405162461bcd60e51b8152600401808060200182810382526026815260200180613d3d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b612d14613c6b565b5060016000818152828201602090815260409182902080546001600160a01b031916909317909255805191820190529054815290565b612d52613c6b565b612d5c83836133be565b15612d985760405162461bcd60e51b815260040180806020018281038252602b815260200180614004602b913960400191505060405180910390fd5b50600160008181528382016020908152604080832080546001600160a01b039687168086528386208054989092166001600160a01b0319988916179091559385905280549095169092179093558354909101928390558051918201905290815290565b6001600160a01b03811660009081526010602052604081205460ff1615612e4c57612e45612e27612e70565b6001600160a01b0384166000908152601160205260409020906133be565b905061117a565b612e54612e70565b6001600160a01b0316836001600160a01b031614905092915050565b3390565b612e7c613c7e565b506001600160a01b0381166000908152600c60209081526040918290208251608081018452815481526001820154928101929092526002810154928201929092526003909101546060820152612ed0613ca6565b506001600160a01b038083166000908152600d6020908152604080832087851684528252918290208251606081018452815481526001820154928101929092526002015490921690820152612f23612e70565b6001600160a01b031681604001516001600160a01b031614612f84576040805162461bcd60e51b81526020600482015260156024820152742fb430b93b32b9ba1d1037b7363c90333ab73232b960591b604482015290519081900360640190fd5b8051612fd7576040805162461bcd60e51b815260206004820152601c60248201527f5f686172766573743a206e6f7468696e6720746f206861727665737400000000604482015290519081900360640190fd5b6000613005826020015161116d64e8d4a51000610a1b876040015187600001516131dc90919063ffffffff16565b600254600354604080516370a0823160e01b81526001600160a01b03928316600482015290519394509116916370a0823191602480820192602092909190829003018186803b15801561305757600080fd5b505afa15801561306b573d6000803e3d6000fd5b505050506040513d602081101561308157600080fd5b50518111156130c15760405162461bcd60e51b8152600401808060200182810382526026815260200180613f016026913960400191505060405180910390fd5b6003546040805163987273e960e01b81526001600160a01b038881166004830152602482018590529151919092169163987273e991604480830192600092919082900301818387803b15801561311657600080fd5b505af115801561312a573d6000803e3d6000fd5b50505050613157613139612e70565b6001600160a01b0386166000908152601160205260409020906133be565b1561316f5761316f613167612e70565b85878461364d565b6131798582613796565b836001600160a01b0316856001600160a01b0316613195612e70565b6001600160a01b03167fd63109fd5abeceff0b6bf54fb909359dfa09a0bc2984733a6d5573dbd0c17573846040518082815260200191505060405180910390a45050505050565b6000826131eb5750600061117a565b828202828482816131f857fe5b04146132355760405162461bcd60e51b8152600401808060200182810382526021815260200180613e4b6021913960400191505060405180910390fd5b9392505050565b6000808211613292576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161329b57fe5b049392505050565b6000828211156132fa576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261335a90859061399d565b50505050565b600082820183811015613235576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b5490565b6001600160a01b03818116600090815260018401602052604090205416151592915050565b6009546000906132359061111b84866132a3565b6001600081815290830160205260408120546001600160a01b03168061344e5760405162461bcd60e51b815260040180806020018281038252603a815260200180613f5f603a913960400191505060405180910390fd5b60005b6001600160a01b0382166001146134b9576001600160a01b038281166000908152600187016020526040902054811690851614156134915750905061117a565b6001600160a01b03918216600090815260018087016020526040909120549092169101613451565b506001949350505050565b6134cc613c6b565b6134d684846133be565b6135115760405162461bcd60e51b815260040180806020018281038252602b81526020018061411f602b913960400191505060405180910390fd5b6001600160a01b03828116600090815260018601602052604090205481169084161461356e5760405162461bcd60e51b81526004018080602001828103825260258152602001806140fa6025913960400191505060405180910390fd5b506001600160a01b0382811660008181526001860160209081526040808320805487871685528285208054919097166001600160a01b031991821617909655939092528254909316909155845460001901808655815192830190915281529392505050565b6001600160a01b0380821660009081526001840160205260409020541692915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261364890849061399d565b505050565b61365f846001600160a01b0316613a4e565b6136685761335a565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b0316632a7862d560e11b17815292518251600094928916939282918083835b602083106136e85780518252601f1990920191602091820191016136c9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461374a576040519150601f19603f3d011682016040523d82523d6000602084013e61374f565b606091505b505090508061378f5760405162461bcd60e51b8152600401808060200182810382526034815260200180613d636034913960400191505060405180910390fd5b5050505050565b6006546137ab906001600160a01b0316613a4e565b6137b457613999565b6003546006546007546001600160a01b039283169263987273e99216906137e49061271090610a1b9087906131dc565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561382a57600080fd5b505af115801561383e573d6000803e3d6000fd5b5050600654600754600093506001600160a01b03909116915063040ea03960e31b9085906138759061271090610a1b9088906131dc565b604080516001600160a01b03909316602484015260448084019290925280518084039092018252606490920182526020810180516001600160e01b03166001600160e01b031990941693909317835290518151919290918291908083835b602083106138f25780518252601f1990920191602091820191016138d3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613954576040519150601f19603f3d011682016040523d82523d6000602084013e613959565b606091505b50509050806136485760405162461bcd60e51b8152600401808060200182810382526038815260200180613f276038913960400191505060405180910390fd5b5050565b60606139f2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a549092919063ffffffff16565b80519091501561364857808060200190516020811015613a1157600080fd5b50516136485760405162461bcd60e51b815260040180806020018281038252602a815260200180614097602a913960400191505060405180910390fd5b3b151590565b6060613a638484600085613a6b565b949350505050565b606082471015613aac5760405162461bcd60e51b8152600401808060200182810382526026815260200180613e046026913960400191505060405180910390fd5b613ab585613a4e565b613b06576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613b455780518252601f199092019160209182019101613b26565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ba7576040519150601f19603f3d011682016040523d82523d6000602084013e613bac565b606091505b5091509150613bbc828286613bc7565b979650505050505050565b60608315613bd6575081613235565b825115613be65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c30578181015183820152602001613c18565b50505050905090810190601f168015613c5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060200160405280600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060600160405280600081526020016000815260200160006001600160a01b03168152509056fe736574506f6f6c3a205f7374616b65546f6b656e206e6f7420696e20746865206c6973745265656e7472616e637947756172643a207265656e7472616e742063616c6c006f6e6c795374616b65546f6b656e43616c6c6572436f6e74726163743a206261642063616c6c65724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735f6d61737465724368656643616c6c65653a20206661696c656420746f2065786563757465206d61737465724368656643616c6c6f6e6c795065726d6974746564546f6b656e46756e6465723a2063616c6c6572206973206e6f74207065726d6974746564736574446576416464726573733a205f64657641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c6465706f7369743a20757365206465706f736974537567617220696e7374656164536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572736574526566416464726573733a205f72656641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129616464506f6f6c3a205f7374616b65546f6b656e206d757374206e6f742062652061646472657373283029206f7220616464726573732831295f686172766573743a207761697420776861742e2e206e6f7420656e6f7567682053554741525f726566657272616c43616c6c65653a20206661696c656420746f206578656375746520757064617465526566657272616c5265776172644c696e6b4c6973743a3a67657450726576696f75734f663a3a20706c6561736520696e697420746865206c696e6b65646c69737420666972737472656d6f7665506f6f6c3a2063616e27742072656d6f766520535547415220706f6f6c72656d6f76655374616b65546f6b656e43616c6c6572436f6e74726163743a2074686520706f6f6c20646f65736e277420616c6c6f77206120636f6e74726163742063616c6c65724c696e6b4c6973743a3a6164643a3a206164647220697320616c726561647920696e20746865206c69737477697468647261773a20757365207769746864726177537567617220696e73746561646164645374616b65546f6b656e43616c6c6572436f6e74726163743a2074686520706f6f6c20646f65736e277420616c6c6f77206120636f6e74726163742063616c6c65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564736574506f6f6c3a205f7374616b65546f6b656e206d757374206e6f742062652061646472657373283029206f7220616464726573732831294c696e6b4c6973743a3a72656d6f76653a3a2077726f6e672070726576436f6e73756d65724c696e6b4c6973743a3a72656d6f76653a3a2061646472206e6f742077686974656c697374656420796574a26469706673582212204836b6baae3e9dfcfa505ce8acaaf91f0126c7f1f90d2e34a658a5bcc91a323f64736f6c634300060c0033636f6e7374727563746f723a205f72656641646472206d757374206e6f742062652061646472657373283029206f722061646472657373283129636f6e7374727563746f723a205f64657641646472206d757374206e6f742062652061646472657373283029206f7220616464726573732831294c696e6b4c6973743a3a6164643a3a206164647220697320616c726561647920696e20746865206c697374000000000000000000000000d3ccbf3867ff0204730173eb4cad3c4b5fd07c6900000000000000000000000059d7175203f0330fe163e3e5ac9dea55dd31039600000000000000000000000019ec14906a4d84eccca29cdf6428d08ce9cacdf900000000000000000000000013319b5cab59084189f20bd66b2e9e12b52c2a6a0000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000031735c1
Deployed ByteCode Sourcemap
34214:20267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35904:61;;;;;;;;;;;;;;;;-1:-1:-1;35904:61:0;-1:-1:-1;;;;;35904:61:0;;:::i;:::-;;;;;;;;;;;;;;;;;;49003:1123;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49003:1123:0;;;;;;;;:::i;:::-;;40489:275;;;;;;;;;;;;;;;;-1:-1:-1;40489:275:0;-1:-1:-1;;;;;40489:275:0;;:::i;51367:438::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51367:438:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51367:438:0;;-1:-1:-1;51367:438:0;-1:-1:-1;51367:438:0;:::i;43505:97::-;;;:::i;:::-;;;;;;;;;;;;;;;;35549:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35549:73:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:73:0;;;;;;;;;;;;;;38679:236;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38679:236:0;;;;;;;;;;:::i;35713:39::-;;;:::i;41299:741::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41299:741:0;;;;;;;;;;;;;:::i;44390:778::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44390:778:0;;;;;;;;;;:::i;35020:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;35020:19:0;;;;;;;;;;;;;;42784:679;;;;;;;;;;;;;;;;-1:-1:-1;42784:679:0;-1:-1:-1;;;;;42784:679:0;;:::i;42133:593::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42133:593:0;;;;;;;;;;;;;:::i;40770:193::-;;;;;;;;;;;;;;;;-1:-1:-1;40770:193:0;;:::i;38982:499::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38982:499:0;;;;;;;;;;:::i;35806:25::-;;;:::i;40289:194::-;;;;;;;;;;;;;;;;-1:-1:-1;40289:194:0;;:::i;54285:193::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54285:193:0;;;;;;;;;;;;;;;;;:::i;43859:162::-;;;;;;;;;;;;;;;;-1:-1:-1;43859:162:0;;:::i;45247:208::-;;;:::i;53695:449::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53695:449:0;;;;;;;;;;:::i;50982:340::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50982:340:0;;;;;;;;;;:::i;35234:37::-;;;:::i;35149:31::-;;;:::i;16948:148::-;;;:::i;39550:452::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39550:452:0;;;;;;;;;;:::i;35099:21::-;;;:::i;36026:66::-;;;;;;;;;;;;;;;;-1:-1:-1;36026:66:0;-1:-1:-1;;;;;36026:66:0;;:::i;45527:858::-;;;;;;;;;;;;;;;;-1:-1:-1;45527:858:0;-1:-1:-1;;;;;45527:858:0;;:::i;50153:774::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50153:774:0;;;;;;;;:::i;46447:1405::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46447:1405:0;;;;;;;;;;;;;;;;;:::i;16297:87::-;;;:::i;35439:53::-;;;;;;;;;;;;;;;;-1:-1:-1;35439:53:0;-1:-1:-1;;;;;35439:53:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34966:28;;;:::i;35315:39::-;;;:::i;35383:26::-;;;:::i;40996:246::-;;;;;;;;;;;;;;;;-1:-1:-1;40996:246:0;;:::i;40008:275::-;;;;;;;;;;;;;;;;-1:-1:-1;40008:275:0;-1:-1:-1;;;;;40008:275:0;;:::i;47896:1066::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47896:1066:0;;;;;;;;;;;;;;;;;:::i;35063:31::-;;;:::i;17251:244::-;;;;;;;;;;;;;;;;-1:-1:-1;17251:244:0;-1:-1:-1;;;;;17251:244:0;;:::i;35185:21::-;;;:::i;35904:61::-;;;;;;;;;;;;;;;:::o;49003:1123::-;49128:5;;49114:4;;-1:-1:-1;;;;;49128:5:0;38213:36;49114:4;49128:5;38213:9;:36::i;:::-;38205:98;;;;-1:-1:-1;;;38205:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14293:1:::1;14899:7;;:19;;14891:63;;;::::0;;-1:-1:-1;;;14891:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;::::1;;14293:1;15032:7;:18:::0;;;49205:5;;-1:-1:-1;;;;;49205:5:0;;::::2;49164:21;49188:24:::0;;;:8:::2;:24;::::0;;;;;;;49243:8:::2;:24:::0;;;;;:30;;::::2;::::0;;;;;;;;49286:13;;::::2;::::0;49188:24;;49243:30;49286:13:::2;:27:::0;49282:96:::2;;49340:12;:10;:12::i;:::-;49323:13;::::0;::::2;::::0;-1:-1:-1;;;;;49323:13:0;;::::2;:29:::0;::::2;;49315:63;;;::::0;;-1:-1:-1;;;49315:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;49315:63:0;;;;;;;;;;;;;::::2;;49406:5;::::0;49387:26:::2;::::0;-1:-1:-1;;;;;49406:5:0::2;49387:10;:26::i;:::-;49426:11:::0;;:15;49422:51:::2;;49466:5;::::0;49443:30:::2;::::0;49452:4;;-1:-1:-1;;;;;49466:5:0::2;49443:8;:30::i;:::-;49484:13;::::0;::::2;::::0;-1:-1:-1;;;;;49484:13:0::2;49480:61;;49529:12;:10;:12::i;:::-;49513:13;::::0;::::2;:28:::0;;-1:-1:-1;;;;;;49513:28:0::2;-1:-1:-1::0;;;;;49513:28:0;;;::::2;::::0;;;::::2;::::0;;49480:61:::2;49552:11:::0;;49548:436:::2;;49574:24;49601:39;49634:5;49601:28;49613:4;:15;;;49601:7;:11;;:28;;;;:::i;:::-;:32:::0;::::2;:39::i;:::-;49574:66:::0;-1:-1:-1;49653:20:0;;49649:186:::2;;49696:29;:7:::0;49708:16;49696:11:::2;:29::i;:::-;49686:39;;49736:89;49784:12;:10;:12::i;:::-;49799:7;::::0;49751:5:::2;::::0;-1:-1:-1;;;;;49751:5:0;;::::2;::::0;49736:89;49799:7:::2;49808:16:::0;49736:39:::2;:89::i;:::-;49843:86;49891:12;:10;:12::i;:::-;49858:5;::::0;-1:-1:-1;;;;;49858:5:0::2;::::0;49914:4:::2;49921:7:::0;49843:39:::2;:86::i;:::-;49952:11:::0;;:24:::2;::::0;49968:7;49952:15:::2;:24::i;:::-;49938:38:::0;;-1:-1:-1;49548:436:0::2;50024:21;::::0;::::2;::::0;50008:11;;:48:::2;::::0;50051:4:::2;::::0;50008:38:::2;::::0;:15:::2;:38::i;:48::-;49990:15;::::0;::::2;:66:::0;50104:5:::2;::::0;-1:-1:-1;;;;;50104:5:0;;::::2;::::0;50068:52;::::2;50076:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;50068:52:0::2;;50112:7;50068:52;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0::1;15211:22:::0;;-1:-1:-1;;;;49003:1123:0:o;40489:275::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40572:22:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;40598:22:0;::::1;40618:1;40598:22;;40572:48;40556:142;;;;-1:-1:-1::0;;;40556:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40705:7;:18:::0;;-1:-1:-1;;;;;;40705:18:0::1;-1:-1:-1::0;;;;;40705:18:0;::::1;::::0;;::::1;::::0;;;40735:23:::1;::::0;::::1;::::0;-1:-1:-1;;40735:23:0::1;40489:275:::0;:::o;51367:438::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;51474:9:::1;51469:331;51489:23:::0;;::::1;51469:331;;;51528:21;51552:8;:25;51561:12;;51574:1;51561:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;51561:15:0::1;-1:-1:-1::0;;;;;51552:25:0::1;-1:-1:-1::0;;;;;51552:25:0::1;;;;;;;;;;;;51528:49;;51586:21;51610:8;:25;51619:12;;51632:1;51619:15;;;;;;;-1:-1:-1::0;;;;;51619:15:0::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;51610:25:::0;;;;::::1;::::0;;;;-1:-1:-1;51610:25:0;;;;-1:-1:-1;51610:25:0;;;:31;;::::1;::::0;;;;;;;-1:-1:-1;51650:27:0::1;51661:12:::0;;51674:1;51661:15;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;51661:15:0::1;51650:10;:27::i;:::-;51686:31;51695:4;51701:12;;51714:1;51701:15;;;;;;;;;;;;;-1:-1:-1::0;;;;;51701:15:0::1;51686:8;:31::i;:::-;51760:21;::::0;::::1;::::0;51744:11;;:48:::1;::::0;51787:4:::1;::::0;51744:38:::1;::::0;:15:::1;:38::i;:48::-;51726:15;::::0;;::::1;:66:::0;51514:3;;;::::1;::::0;-1:-1:-1;51469:331:0::1;;;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;51367:438:0:o;43505:97::-;43559:7;43582:14;:5;:12;:14::i;:::-;43575:21;;43505:97;:::o;35549:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35549:73:0;;:::o;38679:236::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38785:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;;;;:55;;-1:-1:-1;;38785:55:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38852:57;;;;;;;::::1;::::0;;;;;;;;::::1;38679:236:::0;;:::o;35713:39::-;;;;:::o;41299:741::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41450:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;41479:25:0;::::1;41502:1;41479:25;;41450:54;41434:145;;;;-1:-1:-1::0;;;41434:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41595:22;:5;41605:11:::0;41595:9:::1;:22::i;:::-;41594:23;41586:67;;;::::0;;-1:-1:-1;;;41586:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41662:17;:15;:17::i;:::-;41688:23;41729:10;;41714:12;:25;:53;;41757:10;;41714:53;;;41742:12;41714:53;41792:15;::::0;41688:79;;-1:-1:-1;41792:32:0::1;::::0;41812:11;41792:19:::1;:32::i;:::-;41774:15;:50:::0;41831:22:::1;:5;41841:11:::0;41831:9:::1;:22::i;:::-;-1:-1:-1::0;41884:150:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;41884:150:0;;;;;;;;;;;;-1:-1:-1;;;;;41860:21:0;;::::1;::::0;;:8:::1;:21:::0;;;;:174;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;41299:741::o;44390:778::-;-1:-1:-1;;;;;44520:21:0;;;44480:7;44520:21;;;:8;:21;;;;;;;;44572:8;:21;;;;;:28;;;;;;;;;;;44634:21;;;;44688:44;;-1:-1:-1;;;44688:44:0;;44726:4;44688:44;;;;;;44480:7;;44520:21;44572:28;;44634:21;;44480:7;;44688:29;;:44;;;;;44520:21;44688:44;;;;;44520:21;44688:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44688:44:0;44758:20;;;;44688:44;;-1:-1:-1;44743:12:0;:35;:59;;;;-1:-1:-1;44782:20:0;;;44743:59;44739:346;;;44813:18;44834:49;44848:4;:20;;;44870:12;44834:13;:49::i;:::-;44813:70;;44892:19;44914:71;44969:15;;44914:50;44948:4;:15;;;44914:29;44929:13;;44914:10;:14;;:29;;;;:::i;:::-;:33;;:50::i;:71::-;44892:93;-1:-1:-1;45013:64:0;45034:42;45060:15;45034:21;44892:93;45050:4;45034:15;:21::i;:42::-;45013:16;;:20;:64::i;:::-;44994:83;;44739:346;;;45098:64;45146:4;:15;;;45098:43;45136:4;45098:33;45114:16;45098:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:64::i;:::-;45091:71;;;;;;44390:778;;;;;:::o;35020:19::-;;;-1:-1:-1;;;;;35020:19:0;;:::o;42784:679::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;42891:5:::1;::::0;-1:-1:-1;;;;;42868:29:0;;::::1;42891:5:::0;::::1;42868:29;;42860:77;;;;-1:-1:-1::0;;;42860:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42952:22;:5;42962:11:::0;42952:9:::1;:22::i;:::-;42944:63;;;::::0;;-1:-1:-1;;;42944:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43022:44;::::0;;-1:-1:-1;;;43022:44:0;;43060:4:::1;43022:44;::::0;::::1;::::0;;;-1:-1:-1;;;;;43022:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43022:44:0;:49;43014:88:::1;;;::::0;;-1:-1:-1;;;43014:88:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;43111:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;43175:21:0;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;43155:15:::1;::::0;:53:::1;::::0;:19:::1;:53::i;:::-;43137:15;:71:::0;43215:59:::1;43228:11:::0;43241:32:::1;:5;43228:11:::0;43241:19:::1;:32::i;:::-;43215:5;::::0;:59;:12:::1;:59::i;:::-;-1:-1:-1::0;;;;;;43281:21:0::1;43316:1;43281:21:::0;;;:8:::1;:21;::::0;;;;:36;;;43324:37:::1;::::0;::::1;:41:::0;;;43372:38:::1;::::0;::::1;:42:::0;;;43421:32:::1;;:36:::0;42784:679::o;42133:593::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42284:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;42313:25:0;::::1;42336:1;42313:25;;42284:54;42268:145;;;;-1:-1:-1::0;;;42268:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42428:22;:5;42438:11:::0;42428:9:::1;:22::i;:::-;42420:71;;;;-1:-1:-1::0;;;42420:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42500:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;42564:21:0;::::1;;::::0;;;:8:::1;:21;::::0;;;;:32;42544:15:::1;::::0;:70:::1;::::0;42602:11;;42544:53:::1;::::0;:19:::1;:53::i;:::-;:57:::0;::::1;:70::i;:::-;42526:15;:88:::0;-1:-1:-1;;;;;42621:21:0;;::::1;;::::0;;;:8:::1;:21;::::0;;;;:46;;;42674:32:::1;;:46:::0;42133:593::o;40770:193::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;40851:3:::1;40840:7;:14;;40832:48;;;::::0;;-1:-1:-1;;;40832:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40832:48:0;;;;;;;;;;;;;::::1;;40887:17;:15;:17::i;:::-;40911:6;:16:::0;;;40939:18:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40770:193:::0;:::o;38982:499::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39099:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;::::1;;39083:145;;;;-1:-1:-1::0;;;39083:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39264:38:0;::::1;39235:26;39264:38:::0;;;:25:::1;:38;::::0;;;;;39313:30:::1;39264:38:::0;17591:1:::1;39313:14;:30::i;:::-;-1:-1:-1::0;;;;;39313:48:0::1;;39309:82;;;39372:11;:4;:9;:11::i;:::-;;39309:82;39397:17;:4:::0;39406:7;39397:8:::1;:17::i;:::-;;39467:7;-1:-1:-1::0;;;;;39426:49:0::1;39454:11;-1:-1:-1::0;;;;;39426:49:0::1;;;;;;;;;;;16588:1;38982:499:::0;;:::o;35806:25::-;;;;:::o;40289:194::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;40370:4:::1;40359:7;:15;;40351:49;;;::::0;;-1:-1:-1;;;40351:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40351:49:0;;;;;;;;;;;;;::::1;;40407:17;:15;:17::i;:::-;40431:6;:16:::0;;;40459:18:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;40289:194:::0;:::o;54285:193::-;54428:11;38508:56;38551:12;:10;:12::i;:::-;-1:-1:-1;;;;;38508:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;38500:109;;;;-1:-1:-1;;;38500:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54448:5:::1;::::0;:24:::1;::::0;;-1:-1:-1;;;54448:24:0;;-1:-1:-1;;;;;54448:24:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:10:::1;::::0;:24;;;;;:5:::1;::::0;:24;;;;;;;:5;;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54285:193:::0;;;;:::o;43859:162::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;43935:15:::1;:34:::0;;;43981::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;43859:162:::0;:::o;45247:208::-;45306:10;45288:15;45306:26;:10;:26;;;;-1:-1:-1;;;;;45306:26:0;45339:111;-1:-1:-1;;;;;45346:23:0;;17636:1;45346:23;45339:111;;45380:19;45391:7;45380:10;:19::i;:::-;45418:24;:5;45434:7;45418:15;:24::i;:::-;45408:34;;45339:111;;;45247:208;:::o;53695:449::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;53819:21:0;;::::1;53795;53819::::0;;;:8:::1;:21;::::0;;;;;;;:27;;::::1;::::0;;;;;;53878:12:::1;:10;:12::i;:::-;53861:13;::::0;::::1;::::0;-1:-1:-1;;;;;53861:13:0;;::::1;:29:::0;::::1;;53853:72;;;::::0;;-1:-1:-1;;;53853:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53980:11:::0;;53932:60:::1;::::0;-1:-1:-1;;;;;53932:32:0;::::1;::::0;53973:4;;53932:32:::1;:60::i;:::-;54043:11:::0;;54006:49:::1;::::0;;;;;;-1:-1:-1;;;;;54006:49:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;54078:1;54064:15:::0;;;54086::::1;::::0;;::::1;:19:::0;;;;54112:13:::1;::::0;;::::1;:26:::0;;-1:-1:-1;;;;;;54112:26:0::1;::::0;;15211:22;;-1:-1:-1;;53695:449:0:o;50982:340::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;51096:21:0;;::::1;51072;51096::::0;;;:8:::1;:21;::::0;;;;;;;51148:8:::1;:21:::0;;;;;:27;;::::1;::::0;;;;;;;;51184:23:::1;51105:11:::0;51184:10:::1;:23::i;:::-;51214:27;51223:4;51229:11;51214:8;:27::i;:::-;51284:21;::::0;::::1;::::0;51268:11;;:48:::1;::::0;51311:4:::1;::::0;51268:38:::1;::::0;:15:::1;:38::i;:48::-;51250:15;::::0;;::::1;:66:::0;15211:22;;-1:-1:-1;;;50982:340:0:o;35234:37::-;;;;:::o;35149:31::-;;;-1:-1:-1;;;;;35149:31:0;;:::o;16948:148::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;17055:1:::1;17039:6:::0;;17018:40:::1;::::0;-1:-1:-1;;;;;17039:6:0;;::::1;::::0;17018:40:::1;::::0;17055:1;;17018:40:::1;17086:1;17069:19:::0;;-1:-1:-1;;;;;;17069:19:0::1;::::0;;16948:148::o;39550:452::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39670:42:0;::::1;;::::0;;;:29:::1;:42;::::0;;;;;::::1;;39654:148;;;;-1:-1:-1::0;;;39654:148:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39838:38:0;::::1;39809:26;39838:38:::0;;;:25:::1;:38;::::0;;;;39883:49:::1;39895:7:::0;39904:27:::1;39838:38:::0;39895:7;39904:18:::1;:27::i;:::-;39883:4:::0;;:49;:11:::1;:49::i;:::-;;39988:7;-1:-1:-1::0;;;;;39944:52:0::1;39975:11;-1:-1:-1::0;;;;;39944:52:0::1;;;;;;;;;;;16588:1;39550:452:::0;;:::o;35099:21::-;;;;:::o;36026:66::-;;;;;;;;;;;;;:::o;45527:858::-;-1:-1:-1;;;;;45615:21:0;;45591;45615;;;:8;:21;;;;;45663:20;;;;45647:12;:36;45643:65;;45694:7;;;45643:65;45714:23;45747:11;-1:-1:-1;;;;;45740:29:0;;45778:4;45740:44;;;;;;;;;;;;;-1:-1:-1;;;;;45740:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45740:44:0;;-1:-1:-1;45795:20:0;45791:93;;-1:-1:-1;45849:12:0;45826:20;;;;:35;45870:7;;45791:93;45890:18;45911:49;45925:4;:20;;;45947:12;45911:13;:49::i;:::-;45890:70;;45967:19;45989:71;46044:15;;45989:50;46023:4;:15;;;45989:29;46004:13;;45989:10;:14;;:29;;;;:::i;:71::-;46067:5;;46078:7;;46103:6;;45967:93;;-1:-1:-1;;;;;;46067:5:0;;;;:10;;46078:7;;;;46087:34;;46115:5;;46087:23;;45967:93;;46087:15;:23::i;:34::-;46067:55;;;;;;;;;;;;;-1:-1:-1;;;;;46067:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46129:5:0;;46148;;46172:6;;-1:-1:-1;;;;;46129:5:0;;;;-1:-1:-1;46129:10:0;;-1:-1:-1;46148:5:0;;;46156:34;;46184:5;;46156:23;;:11;;:15;:23::i;:34::-;46129:62;;;;;;;;;;;;;-1:-1:-1;;;;;46129:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46198:5:0;;46217;;46198:39;;;-1:-1:-1;;;46198:39:0;;-1:-1:-1;;;;;46217:5:0;;;46198:39;;;;;;;;;;;;:5;;;;;-1:-1:-1;46198:10:0;;-1:-1:-1;46198:39:0;;;;;:5;;:39;;;;;;;:5;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46268:69;46294:42;46320:15;46294:21;46310:4;46294:11;:15;;:21;;;;:::i;:42::-;46268:21;;;;;:25;:69::i;:::-;46244:21;;;:93;-1:-1:-1;;46367:12:0;46344:20;;;;:35;;;;-1:-1:-1;45527:858:0;:::o;50153:774::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;;;50286:5;-1:-1:-1;;;;;50286:5:0;;::::1;50245:21;50269:24:::0;;;:8:::1;:24;::::0;;;;;;;50324:8:::1;:24:::0;;;;;:30;;::::1;::::0;;;;;;;;50388:12:::1;:10;:12::i;:::-;50371:13;::::0;::::1;::::0;-1:-1:-1;;;;;50371:13:0;;::::1;:29:::0;::::1;;50363:68;;;::::0;;-1:-1:-1;;;50363:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50446:11:::0;;:22;-1:-1:-1;50446:22:0::1;50438:58;;;::::0;;-1:-1:-1;;;50438:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50524:5;::::0;50505:26:::1;::::0;-1:-1:-1;;;;;50524:5:0::1;50505:10;:26::i;:::-;50561:5;::::0;50538:30:::1;::::0;50547:4;;-1:-1:-1;;;;;50561:5:0::1;50538:8;:30::i;:::-;50581:11:::0;;50577:148:::1;;50617:11:::0;;:24:::1;::::0;50633:7;50617:15:::1;:24::i;:::-;50603:38:::0;;50650:67:::1;50694:12;:10;:12::i;:::-;50665:5;::::0;-1:-1:-1;;;;;50665:5:0::1;::::0;50709:7;50650:35:::1;:67::i;:::-;50765:21;::::0;::::1;::::0;50749:11;;:48:::1;::::0;50792:4:::1;::::0;50749:38:::1;::::0;:15:::1;:38::i;:48::-;50731:15;::::0;::::1;:66:::0;50808:11;;50804:48:::1;;50826:13;::::0;::::1;:26:::0;;-1:-1:-1;;;;;;50826:26:0::1;::::0;;50804:48:::1;50901:5;::::0;-1:-1:-1;;;;;50901:5:0;;::::1;::::0;50864:57;::::1;50873:12;:10;:12::i;:::-;50909:11:::0;;50864:57:::1;::::0;;;;;;-1:-1:-1;;;;;50864:57:0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;50153:774:0:o;46447:1405::-;46579:4;46585:11;38213:36;38223:12;38237:11;38213:9;:36::i;:::-;38205:98;;;;-1:-1:-1;;;38205:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14293:1:::1;14899:7;;:19;;14891:63;;;::::0;;-1:-1:-1;;;14891:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;::::1;;14293:1;15032:7;:18:::0;-1:-1:-1;;;;;46634:25:0;::::2;::::0;;::::2;::::0;:54:::2;;-1:-1:-1::0;;;;;;46663:25:0;::::2;46686:1;46663:25;;46634:54;46618:145;;;;-1:-1:-1::0;;;46618:145:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46801:5;::::0;-1:-1:-1;;;;;46778:29:0;;::::2;46801:5:::0;::::2;46778:29;;46770:75;;;;-1:-1:-1::0;;;46770:75:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46860:22;:5;46870:11:::0;46860:9:::2;:22::i;:::-;46852:51;;;::::0;;-1:-1:-1;;;46852:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46852:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;46936:21:0;;::::2;46912;46936::::0;;;:8:::2;:21;::::0;;;;;;;46988:8:::2;:21:::0;;;;;:27;;::::2;::::0;;;;;;;;47028:13:::2;::::0;::::2;::::0;46936:21;;46988:27;;47028:13:::2;:27:::0;47024:95:::2;;47082:12;:10;:12::i;:::-;47065:13;::::0;::::2;::::0;-1:-1:-1;;;;;47065:13:0;;::::2;:29:::0;::::2;;47057:62;;;::::0;;-1:-1:-1;;;47057:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;47057:62:0;;;;;;;;;;;;;::::2;;47128:23;47139:11;47128:10;:23::i;:::-;47164:11:::0;;:15;47160:48:::2;;47181:27;47190:4;47196:11;47181:8;:27::i;:::-;47219:13;::::0;::::2;::::0;-1:-1:-1;;;;;47219:13:0::2;47215:61;;47264:12;:10;:12::i;:::-;47248:13;::::0;::::2;:28:::0;;-1:-1:-1;;;;;;47248:28:0::2;-1:-1:-1::0;;;;;47248:28:0;;;::::2;::::0;;;::::2;::::0;;47215:61:::2;47287:11:::0;;47283:430:::2;;47309:24;47336:39;47369:5;47336:28;47348:4;:15;;;47336:7;:11;;:28;;;;:::i;:39::-;47309:66:::0;-1:-1:-1;47388:20:0;;47384:183:::2;;47431:29;:7:::0;47443:16;47431:11:::2;:29::i;:::-;47421:39;;47471:86;47516:12;:10;:12::i;:::-;47531:7;::::0;-1:-1:-1;;;;;47471:36:0;;::::2;::::0;:86;47531:7:::2;47540:16:::0;47471:36:::2;:86::i;:::-;47575:83;47620:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;47575:36:0;::::2;::::0;47643:4:::2;47650:7:::0;47575:36:::2;:83::i;:::-;47681:11:::0;;:24:::2;::::0;47697:7;47681:15:::2;:24::i;:::-;47667:38:::0;;-1:-1:-1;47283:430:0::2;47753:21;::::0;::::2;::::0;47737:11;;:48:::2;::::0;47780:4:::2;::::0;47737:38:::2;::::0;:15:::2;:38::i;:48::-;47719:15;::::0;::::2;:66:::0;-1:-1:-1;;;;;47797:49:0;;::::2;::::0;;::::2;47805:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;47797:49:0::2;;47838:7;47797:49;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0::1;15211:22:::0;;-1:-1:-1;;;;;46447:1405:0:o;16297:87::-;16343:7;16370:6;-1:-1:-1;;;;;16370:6:0;16297:87;:::o;35439:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34966:28::-;;;-1:-1:-1;;;;;34966:28:0;;:::o;35315:39::-;;;;:::o;35383:26::-;;;;:::o;40996:246::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;41072:17:::1;:15;:17::i;:::-;41124:13;::::0;;41144:30;;;;41186:50:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;16588:1;40996:246:::0;:::o;40008:275::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40091:22:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;40117:22:0;::::1;40137:1;40117:22;;40091:48;40075:142;;;;-1:-1:-1::0;;;40075:142:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40224:7;:18:::0;;-1:-1:-1;;;;;;40224:18:0::1;-1:-1:-1::0;;;;;40224:18:0;::::1;::::0;;::::1;::::0;;;40254:23:::1;::::0;::::1;::::0;-1:-1:-1;;40254:23:0::1;40008:275:::0;:::o;47896:1066::-;14293:1;14899:7;;:19;;14891:63;;;;;-1:-1:-1;;;14891:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14891:63:0;;;;;;;;;;;;;;;14293:1;15032:7;:18;-1:-1:-1;;;;;48040:25:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;48069:25:0;::::1;48092:1;48069:25;;48040:54;48024:145;;;;-1:-1:-1::0;;;48024:145:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48207:5;::::0;-1:-1:-1;;;;;48184:29:0;;::::1;48207:5:::0;::::1;48184:29;;48176:77;;;;-1:-1:-1::0;;;48176:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48268:22;:5;48278:11:::0;48268:9:::1;:22::i;:::-;48260:52;;;::::0;;-1:-1:-1;;;48260:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48260:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;48345:21:0;;::::1;48321;48345::::0;;;:8:::1;:21;::::0;;;;;;;48397:8:::1;:21:::0;;;;;:27;;::::1;::::0;;;;;;;;48458:12:::1;:10;:12::i;:::-;48441:13;::::0;::::1;::::0;-1:-1:-1;;;;;48441:13:0;;::::1;:29:::0;::::1;;48433:63;;;::::0;;-1:-1:-1;;;48433:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48433:63:0;;;;;;;;;;;;;::::1;;48511:11:::0;;:22;-1:-1:-1;48511:22:0::1;48503:53;;;::::0;;-1:-1:-1;;;48503:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48503:53:0;;;;;;;;;;;;;::::1;;48565:23;48576:11;48565:10;:23::i;:::-;48595:27;48604:4;48610:11;48595:8;:27::i;:::-;48635:11:::0;;48631:136:::1;;48671:11:::0;;:24:::1;::::0;48687:7;48671:15:::1;:24::i;:::-;48657:38:::0;;48704:55:::1;48737:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48704:32:0;::::1;::::0;48751:7;48704:32:::1;:55::i;:::-;48807:21;::::0;::::1;::::0;48791:11;;:48:::1;::::0;48834:4:::1;::::0;48791:38:::1;::::0;:15:::1;:38::i;:48::-;48773:15;::::0;::::1;:66:::0;48850:11;;48846:48:::1;;48868:13;::::0;::::1;:26:::0;;-1:-1:-1;;;;;;48868:26:0::1;::::0;;48846:48:::1;48935:11;-1:-1:-1::0;;;;;48906:50:0::1;48929:4;-1:-1:-1::0;;;;;48906:50:0::1;48915:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48906:50:0::1;;48948:7;48906:50;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14249:1:0;15211:22;;-1:-1:-1;;;47896:1066:0:o;35063:31::-;;;-1:-1:-1;;;;;35063:31:0;;:::o;17251:244::-;16528:12;:10;:12::i;:::-;-1:-1:-1;;;;;16517:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;16517:23:0;;16509:68;;;;;-1:-1:-1;;;16509:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16509:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17340:22:0;::::1;17332:73;;;;-1:-1:-1::0;;;17332:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:6;::::0;;17421:38:::1;::::0;-1:-1:-1;;;;;17421:38:0;;::::1;::::0;17442:6;::::1;::::0;17421:38:::1;::::0;::::1;17470:6;:17:::0;;-1:-1:-1;;;;;;17470:17:0::1;-1:-1:-1::0;;;;;17470:17:0;;;::::1;::::0;;;::::1;::::0;;17251:244::o;35185:21::-;;;;:::o;17776:119::-;17827:11;;:::i;:::-;-1:-1:-1;17636:1:0;17847:16;;;;:9;;;:16;;;;;;;;;:22;;-1:-1:-1;;;;;;17847:22:0;;;;;;;17878:11;;;;;;;;;;;;17776:119::o;18026:273::-;18090:11;;:::i;:::-;18119:15;18123:4;18129;18119:3;:15::i;:::-;18118:16;18110:72;;;;-1:-1:-1;;;18110:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18207:9:0;:16;;;;:9;;;:16;;;;;;;;;;-1:-1:-1;;;;;18189:15:0;;;;;;;;;:34;;18207:16;;;;-1:-1:-1;;;;;;18189:34:0;;;;;;;18230:16;;;;:23;;;;;;;;;;;18260:13;;;;;;;;;18282:11;;;;;;;;;;;18026:273::o;44072:257::-;-1:-1:-1;;;;;44174:42:0;;44157:4;44174:42;;;:29;:42;;;;;;;;44170:111;;;44225:56;44268:12;:10;:12::i;:::-;-1:-1:-1;;;;;44225:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;44218:63;;;;44170:111;44311:12;:10;:12::i;:::-;-1:-1:-1;;;;;44295:28:0;:12;-1:-1:-1;;;;;44295:28:0;;44288:35;;44072:257;;;;:::o;613:106::-;701:10;613:106;:::o;51852:790::-;51921:20;;:::i;:::-;-1:-1:-1;;;;;;51944:21:0;;;;;;:8;:21;;;;;;;;;51921:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51972:20;;:::i;:::-;-1:-1:-1;;;;;;51995:21:0;;;;;;;:8;:21;;;;;;;;:27;;;;;;;;;;;51972:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52054:12;:10;:12::i;:::-;-1:-1:-1;;;;;52037:29:0;:4;:13;;;-1:-1:-1;;;;;52037:29:0;;52029:63;;;;;-1:-1:-1;;;52029:63:0;;;;;;;;;;;;-1:-1:-1;;;52029:63:0;;;;;;;;;;;;;;;52107:11;;52099:56;;;;;-1:-1:-1;;;52099:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52162:15;52180:69;52233:4;:15;;;52180:48;52223:4;52180:38;52196:4;:21;;;52180:4;:11;;;:15;;:38;;;;:::i;:69::-;52275:5;;52299;;52275:31;;;-1:-1:-1;;;52275:31:0;;-1:-1:-1;;;;;52299:5:0;;;52275:31;;;;;;52162:87;;-1:-1:-1;52275:5:0;;;:15;;:31;;;;;;;;;;;;;;;:5;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52275:31:0;52264:42;;;52256:93;;;;-1:-1:-1;;;52256:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52356:5;;:38;;;-1:-1:-1;;;52356:38:0;;-1:-1:-1;;;;;52356:38:0;;;;;;;;;;;;;;;:5;;;;;:23;;:38;;;;;:5;;:38;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52405:56;52448:12;:10;:12::i;:::-;-1:-1:-1;;;;;52405:38:0;;;;;;:25;:38;;;;;;:42;:56::i;:::-;52401:138;;;52472:59;52490:12;:10;:12::i;:::-;52504:11;52517:4;52523:7;52472:17;:59::i;:::-;52545:30;52561:4;52567:7;52545:15;:30::i;:::-;52615:11;-1:-1:-1;;;;;52587:49:0;52609:4;-1:-1:-1;;;;;52587:49:0;52595:12;:10;:12::i;:::-;-1:-1:-1;;;;;52587:49:0;;52628:7;52587:49;;;;;;;;;;;;;;;;;;51852:790;;;;;:::o;30028:220::-;30086:7;30110:6;30106:20;;-1:-1:-1;30125:1:0;30118:8;;30106:20;30149:5;;;30153:1;30149;:5;:1;30173:5;;;;;:10;30165:56;;;;-1:-1:-1;;;30165:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30239:1;30028:220;-1:-1:-1;;;30028:220:0:o;30726:153::-;30784:7;30816:1;30812;:5;30804:44;;;;;-1:-1:-1;;;30804:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30870:1;30866;:5;;;;;;;30726:153;-1:-1:-1;;;30726:153:0:o;29611:158::-;29669:7;29702:1;29697;:6;;29689:49;;;;;-1:-1:-1;;;29689:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29756:5:0;;;29611:158::o;1744:205::-;1872:68;;;-1:-1:-1;;;;;1872:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1872:68:0;-1:-1:-1;;;1872:68:0;;;1845:96;;1865:5;;1845:19;:96::i;:::-;1744:205;;;;:::o;29149:179::-;29207:7;29239:5;;;29263:6;;;;29255:46;;;;;-1:-1:-1;;;29255:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19524:98;19605:11;;19524:98::o;17901:119::-;-1:-1:-1;;;;;17990:15:0;;;17970:4;17990:15;;;:9;;;:15;;;;;;;:24;;17901:119;;;;:::o;43674:179::-;43831:15;;43768:7;;43791:56;;:35;:13;43809:16;43791:17;:35::i;19021:372::-;19131:9;19100:7;19131:16;;;:9;;;:16;;;;;;-1:-1:-1;;;;;19131:16:0;19162:13;19154:84;;;;-1:-1:-1;;;19154:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19250:9;19245:126;-1:-1:-1;;;;;19265:11:0;;17636:1;19265:11;19245:126;;-1:-1:-1;;;;;19296:15:0;;;;;;;:9;;;:15;;;;;;;;:23;;;;19292:40;;;-1:-1:-1;19328:4:0;-1:-1:-1;19321:11:0;;19292:40;-1:-1:-1;;;;;19348:15:0;;;;;;;:9;;;;:15;;;;;;;;;;;19278:3;19245:126;;;-1:-1:-1;17636:1:0;;19021:372;-1:-1:-1;;;;19021:372:0:o;18305:400::-;18410:11;;:::i;:::-;18438:15;18442:4;18448;18438:3;:15::i;:::-;18430:71;;;;-1:-1:-1;;;18430:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18516:19:0;;;;;;;:9;;;:19;;;;;;;;:27;;;;18508:77;;;;-1:-1:-1;;;18508:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18614:15:0;;;;;;;:9;;;:15;;;;;;;;;;18592:19;;;;;;;;:37;;18614:15;;;;-1:-1:-1;;;;;;18592:37:0;;;;;;;18636:15;;;;:23;;;;;;;;18666:13;;-1:-1:-1;;18666:13:0;;;;18688:11;;;;;;;;;;18305:400;;;;;:::o;19399:119::-;-1:-1:-1;;;;;19497:15:0;;;19474:7;19497:15;;;:9;;;:15;;;;;;;19399:119;;;;:::o;1559:177::-;1669:58;;;-1:-1:-1;;;;;1669:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1669:58:0;-1:-1:-1;;;1669:58:0;;;1642:86;;1662:5;;1642:19;:86::i;:::-;1559:177;;;:::o;53206:422::-;53349:20;:7;-1:-1:-1;;;;;53349:18:0;;:20::i;:::-;53344:50;;53380:7;;53344:50;53440:96;;;-1:-1:-1;;;;;53440:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53440:96:0;-1:-1:-1;;;53440:96:0;;;53419:124;;;;53401:12;;53419;;;;53440:96;53419:124;;;;53440:96;53419:124;;;;;;;;;;-1:-1:-1;;53419:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53400:143;;;53558:7;53550:72;;;;-1:-1:-1;;;53550:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53206:422;;;;;:::o;52648:448::-;52726:7;;:20;;-1:-1:-1;;;;;52726:7:0;:18;:20::i;:::-;52721:50;;52757:7;;52721:50;52777:5;;52809:7;;52832:6;;-1:-1:-1;;;;;52777:5:0;;;;:23;;52809:7;;52819:31;;52844:5;;52819:20;;:8;;:12;:20::i;:31::-;52777:74;;;;;;;;;;;;;-1:-1:-1;;;;;52777:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52877:7:0;;52981:6;;52859:12;;-1:-1:-1;;;;;;52877:7:0;;;;-1:-1:-1;;;;52921:39:0;52962:4;;52968:31;;52993:5;;52968:20;;:8;;:12;:20::i;:31::-;52898:102;;;-1:-1:-1;;;;;52898:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52898:102:0;-1:-1:-1;;;;;;52898:102:0;;;;;;;;;52877:130;;;;52898:102;;52877:130;;;;52898:102;52877:130;;52898:102;52877:130;;;;;;;;;;-1:-1:-1;;52877:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52858:149;;;53022:7;53014:76;;;;-1:-1:-1;;;53014:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52648:448;;;:::o;3864:761::-;4288:23;4314:69;4342:4;4314:69;;;;;;;;;;;;;;;;;4322:5;-1:-1:-1;;;;;4314:27:0;;;:69;;;;;:::i;:::-;4398:17;;4288:95;;-1:-1:-1;4398:21:0;4394:224;;4540:10;4529:30;;;;;;;;;;;;;;;-1:-1:-1;4529:30:0;4521:85;;;;-1:-1:-1;;;4521:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5348:422;5715:20;5754:8;;;5348:422::o;8266:195::-;8369:12;8401:52;8423:6;8431:4;8437:1;8440:12;8401:21;:52::i;:::-;8394:59;8266:195;-1:-1:-1;;;;8266:195:0:o;9318:530::-;9445:12;9503:5;9478:21;:30;;9470:81;;;;-1:-1:-1;;;9470:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9570:18;9581:6;9570:10;:18::i;:::-;9562:60;;;;;-1:-1:-1;;;9562:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9696:12;9710:23;9737:6;-1:-1:-1;;;;;9737:11:0;9757:5;9765:4;9737:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9737:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9695:75;;;;9788:52;9806:7;9815:10;9827:12;9788:17;:52::i;:::-;9781:59;9318:530;-1:-1:-1;;;;;;;9318:530:0:o;11858:742::-;11973:12;12002:7;11998:595;;;-1:-1:-1;12033:10:0;12026:17;;11998:595;12147:17;;:21;12143:439;;12410:10;12404:17;12471:15;12458:10;12454:2;12450:19;12443:44;12358:148;12553:12;12546:20;;-1:-1:-1;;;12546:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Metadata Hash
4836b6baae3e9dfcfa505ce8acaaf91f0126c7f1f90d2e34a658a5bcc91a323f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.