Contract Overview
Balance:
0 CRO
CRO Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x9b429c16e0a617d05d8a7046bf8dd8705725775e30630bcdc47a88c1107cc630 | Initialize | 1882105 | 747 days 1 hr ago | 0xdadeee7892384edc9498ff7492b653e6f6271321 | IN | 0x09fd0e0dd9adebd424a16bed66cda5d57f8420d2 | 0 CRO | 2.31884 | |
0x3b654fcdfef4e18ffab11900d92ac87d82d4dd9879fd611d22bf2209613c39e2 | 0x60806040 | 1882103 | 747 days 1 hr ago | 0xdadeee7892384edc9498ff7492b653e6f6271321 | IN | Create: Treasury | 0 CRO | 19.832095 |
[ Download CSV Export ]
Contract Name:
Treasury
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-03-13 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @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); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev 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"); } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @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; } } /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} 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; } uint256[50] private __gap; } /** * @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. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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; } uint256[49] private __gap; } interface IBasisAsset { function decimals() external view returns (uint8); function cap() external view returns (uint256); function mint(address, uint256) external; function burn(uint256) external; function burnFrom(address, uint256) external; function isOperator() external returns (bool); function operator() external view returns (address); function transferOperator(address newOperator_) external; function transferOwnership(address newOwner_) external; } interface ITreasury { function hasPool(address _address) external view returns (bool); function minting_fee() external view returns (uint256); function redemption_fee() external view returns (uint256); function reserve_share_state() external view returns (uint8); function collateralReserve() external view returns (address); function profitSharingFund() external view returns (address); function darkInsuranceFund() external view returns (address); function globalCollateralBalance(uint256) external view returns (uint256); function globalCollateralValue(uint256) external view returns (uint256); function globalCollateralTotalValue() external view returns (uint256); function globalDarkBalance() external view returns (uint256); function globalDarkValue() external view returns (uint256); function globalShareBalance() external view returns (uint256); function globalShareValue() external view returns (uint256); function getEffectiveCollateralRatio() external view returns (uint256); function requestTransfer( address token, address receiver, uint256 amount ) external; function requestBurnShare(uint256 _fee) external; function requestTransferDarkFee(uint256 _fee) external; function reserveReceiveDark(uint256 _amount) external; function reserveReceiveShare(uint256 _amount) external; function info() external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint8 ); } interface IOracle { function nextEpochPoint() external view returns (uint256); function update() external; function epochConsult() external view returns (uint256); function consult() external view returns (uint256); function consultTrue() external view returns (uint256); } interface IPool { function targetCollateralRatio() external view returns (uint256); function targetDarkOverDarkShareRatio() external view returns (uint256); function calcMintInput(uint256 _dollarAmount) external view returns ( uint256 _mainCollateralAmount, uint256 _darkAmount, uint256 _shareAmount, uint256 _darkFee, uint256 _shareFee ); function calcMintOutputFromCollaterals(uint256[] memory _collateralAmounts) external view returns ( uint256 _dollarAmount, uint256 _darkAmount, uint256 _shareAmount, uint256 _darkFee, uint256 _shareFee ); function calcMintOutputFromDark(uint256 _darkAmount) external view returns ( uint256 _dollarAmount, uint256 _mainCollateralAmount, uint256 _shareAmount, uint256 _darkFee, uint256 _shareFee ); function calcMintOutputFromShare(uint256 _shareAmount) external view returns ( uint256 _dollarAmount, uint256 _mainCollateralAmount, uint256 _darkAmount, uint256 _darkFee, uint256 _shareFee ); function calcRedeemOutput(uint256 _dollarAmount) external view returns ( uint256[] memory _collateralAmounts, uint256 _darkAmount, uint256 _shareAmount, uint256 _darkFee, uint256 _shareFee ); function getCollateralPrice(uint256 _index) external view returns (uint256); function getDollarPrice() external view returns (uint256); function getDarkPrice() external view returns (uint256); function getSharePrice() external view returns (uint256); function getRedemptionOpenTime(address _account) external view returns (uint256); function unclaimed_pool_collateral(uint256) external view returns (uint256); function unclaimed_pool_dark() external view returns (uint256); function unclaimed_pool_share() external view returns (uint256); function mintingLimitHourly() external view returns (uint256 _limit); function mintingLimitDaily() external view returns (uint256 _limit); function calcMintableDollarHourly() external view returns (uint256 _limit); function calcMintableDollarDaily() external view returns (uint256 _limit); function calcMintableDollar() external view returns (uint256 _dollarAmount); function calcRedeemableDollarHourly() external view returns (uint256 _limit); function calcRedeemableDollarDaily() external view returns (uint256 _limit); function calcRedeemableDollar() external view returns (uint256 _dollarAmount); function updateTargetCollateralRatio() external; function updateTargetDarkOverShareRatio() external; } interface ITreasuryPolicy { function minting_fee() external view returns (uint256); function redemption_fee() external view returns (uint256); function reserve_share_state() external view returns (uint8); function setMintingFee(uint256 _minting_fee) external; function setRedemptionFee(uint256 _redemption_fee) external; } interface ICollateralReserve { function fundBalance(address _token) external view returns (uint256); function transferTo( address _token, address _receiver, uint256 _amount ) external; function burnToken(address _token, uint256 _amount) external; function receiveDarks(uint256 _amount) external; function receiveShares(uint256 _amount) external; } contract Treasury is ITreasury, OwnableUpgradeSafe, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // addresses address private collateralReserve_; address public dollar; address public dark; address public share; address[] public collaterals; address public treasuryPolicy; address private profitSharingFund_; address private darkInsuranceFund_; address public oracleDollar; address public oracleDark; address public oracleShare; address[] public oracleCollaterals; // pools address[] public pools_array; mapping(address => bool) public pools; // Constants for various precisions uint256 private constant PRICE_PRECISION = 1e6; // Number of decimals needed to get to 18 uint256[] private missing_decimals; mapping(address => bool) public strategist; /* ========== EVENTS ========== */ event PoolAdded(address indexed pool); event PoolRemoved(address indexed pool); event ProfitExtracted(uint256 amount); event StrategistStatusUpdated(address indexed account, bool status); /* ========== MODIFIERS ========== */ modifier onlyPool() { require(pools[msg.sender], "!pool"); _; } modifier onlyStrategist() { require(strategist[msg.sender] || msg.sender == owner(), "!strategist && !owner"); _; } /* ========== CONSTRUCTOR ========== */ function initialize( address _dollar, address _dark, address _share, address[] memory _collaterals, address _treasuryPolicy, address _collateralReserve, address _profitSharingFund, address _darkInsuranceFund ) external initializer { require(_dollar != address(0), "zero"); require(_dark != address(0), "zero"); require(_share != address(0), "zero"); require(_collaterals.length == 3, "Invalid collateral length"); OwnableUpgradeSafe.__Ownable_init(); dollar = _dollar; dark = _dark; // DARK share = _share; // NESS collaterals = _collaterals; // USDC, USDT, DAI oracleCollaterals = new address[](3); missing_decimals = new uint256[](3); for (uint256 i = 0; i < 3; i++) { missing_decimals[i] = uint256(18).sub(uint256(IBasisAsset(_collaterals[i]).decimals())); } setTreasuryPolicy(_treasuryPolicy); setCollateralReserve(_collateralReserve); setProfitSharingFund(_profitSharingFund); setDarkInsuranceFund(_darkInsuranceFund); } /* ========== VIEWS ========== */ function dollarPrice() public view returns (uint256) { return IOracle(oracleDollar).consult(); } function darkPrice() public view returns (uint256) { return IOracle(oracleDark).consult(); } function sharePrice() public view returns (uint256) { return IOracle(oracleShare).consult(); } function collateralPrice(uint256 _index) public view returns (uint256) { address _oracle = oracleCollaterals[_index]; return (_oracle == address(0)) ? PRICE_PRECISION : IOracle(_oracle).consult(); } function hasPool(address _address) external view override returns (bool) { return pools[_address] == true; } function minting_fee() public view override returns (uint256) { return ITreasuryPolicy(treasuryPolicy).minting_fee(); } function redemption_fee() public view override returns (uint256) { return ITreasuryPolicy(treasuryPolicy).redemption_fee(); } function reserve_share_state() public view override returns (uint8) { return ITreasuryPolicy(treasuryPolicy).reserve_share_state(); } function collateralReserve() public view override returns (address) { return collateralReserve_; } function profitSharingFund() public view override returns (address) { return profitSharingFund_; } function darkInsuranceFund() public view override returns (address) { return darkInsuranceFund_; } function info() external view override returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint8 ) { return ( dollarPrice(), sharePrice(), IERC20(dollar).totalSupply(), globalCollateralTotalValue(), minting_fee(), redemption_fee(), reserve_share_state() ); } function globalCollateralBalance(uint256 _index) public view override returns (uint256) { return IERC20(collaterals[_index]).balanceOf(collateralReserve_).sub(totalUnclaimedCollateral(_index)); } function globalCollateralValue(uint256 _index) public view override returns (uint256) { return globalCollateralBalance(_index).mul(collateralPrice(_index)).mul(10**missing_decimals[_index]).div(PRICE_PRECISION); } function globalCollateralTotalValue() public view override returns (uint256) { return globalCollateralValue(0).add(globalCollateralValue(1)).add(globalCollateralValue(2)); } function globalDarkBalance() public view override returns (uint256) { return IERC20(dark).balanceOf(collateralReserve_).sub(totalUnclaimedDark()); } function globalDarkValue() public view override returns (uint256) { return globalDarkBalance().mul(darkPrice()).div(PRICE_PRECISION); } function globalShareBalance() public view override returns (uint256) { return IERC20(share).balanceOf(collateralReserve_).sub(totalUnclaimedShare()); } function globalShareValue() public view override returns (uint256) { return globalShareBalance().mul(sharePrice()).div(PRICE_PRECISION); } // Iterate through all pools and calculate all unclaimed collaterals in all pools globally function totalUnclaimedCollateral(uint256 _index) public view returns (uint256 _totalUnclaimed) { uint256 _length = pools_array.length; for (uint256 i = 0; i < _length; i++) { address _pool = pools_array[i]; if (_pool != address(0)) { _totalUnclaimed = _totalUnclaimed.add((IPool(_pool).unclaimed_pool_collateral(_index))); } } } function totalUnclaimedDark() public view returns (uint256 _totalUnclaimed) { uint256 _length = pools_array.length; for (uint256 i = 0; i < _length; i++) { address _pool = pools_array[i]; if (_pool != address(0)) { _totalUnclaimed = _totalUnclaimed.add((IPool(_pool).unclaimed_pool_dark())); } } } function totalUnclaimedShare() public view returns (uint256 _totalUnclaimed) { uint256 _length = pools_array.length; for (uint256 i = 0; i < _length; i++) { address _pool = pools_array[i]; if (_pool != address(0)) { _totalUnclaimed = _totalUnclaimed.add((IPool(_pool).unclaimed_pool_share())); } } } function getEffectiveCollateralRatio() external view override returns (uint256) { uint256 _total_collateral_value = globalCollateralTotalValue(); uint256 _total_dollar_value = IERC20(dollar).totalSupply().mul(dollarPrice()).div(PRICE_PRECISION); return _total_collateral_value.mul(10000).div(_total_dollar_value); } /* ========== RESTRICTED FUNCTIONS ========== */ function setStrategistStatus(address _account, bool _status) external onlyOwner { strategist[_account] = _status; emit StrategistStatusUpdated(_account, _status); } function requestTransfer( address _token, address _receiver, uint256 _amount ) external override onlyPool { ICollateralReserve(collateralReserve_).transferTo(_token, _receiver, _amount); } function requestBurnShare(uint256 _fee) external override onlyPool { ICollateralReserve(collateralReserve_).burnToken(share, _fee); } function requestTransferDarkFee(uint256 _fee) external override onlyPool { uint256 _amt = _fee.mul(45).div(100); // 10% stayed, 45% forwarded to profitSharingFund, 45% forwarded to darkInsuranceFund ICollateralReserve(collateralReserve_).transferTo(dark, profitSharingFund_, _amt); ICollateralReserve(collateralReserve_).transferTo(dark, darkInsuranceFund_, _amt); } function reserveReceiveDark(uint256 _amount) external override onlyPool { ICollateralReserve(collateralReserve_).receiveDarks(_amount); } function reserveReceiveShare(uint256 _amount) external override onlyPool { ICollateralReserve(collateralReserve_).receiveShares(_amount); } // Add new Pool function addPool(address pool_address) public onlyOwner { require(pools[pool_address] == false, "poolExisted"); pools[pool_address] = true; pools_array.push(pool_address); emit PoolAdded(pool_address); } // Remove a pool function removePool(address pool_address) public onlyOwner { require(pools[pool_address] == true, "!pool"); // Delete from the mapping delete pools[pool_address]; // 'Delete' from the array by setting the address to 0x0 for (uint256 i = 0; i < pools_array.length; i++) { if (pools_array[i] == pool_address) { pools_array[i] = address(0); // This will leave a null in the array and keep the indices the same break; } } emit PoolRemoved(pool_address); } function setTreasuryPolicy(address _treasuryPolicy) public onlyOwner { require(_treasuryPolicy != address(0), "zero"); treasuryPolicy = _treasuryPolicy; } function setOracleDollar(address _oracleDollar) external onlyOwner { require(_oracleDollar != address(0), "zero"); oracleDollar = _oracleDollar; } function setOracleDark(address _oracleDark) external onlyOwner { require(_oracleDark != address(0), "zero"); oracleDark = _oracleDark; } function setOracleShare(address _oracleShare) external onlyOwner { require(_oracleShare != address(0), "zero"); oracleShare = _oracleShare; } function setOracleCollaterals(address[] memory _oracleCollaterals) external onlyOwner { require(_oracleCollaterals.length == 3, "invalid oracleCollaterals length"); delete oracleCollaterals; for (uint256 i = 0; i < 3; i++) { oracleCollaterals.push(_oracleCollaterals[i]); } } function setOracleCollateral(uint256 _index, address _oracleCollateral) external onlyOwner { require(_oracleCollateral != address(0), "zero"); oracleCollaterals[_index] = _oracleCollateral; } function setCollateralReserve(address _collateralReserve) public onlyOwner { require(_collateralReserve != address(0), "zero"); collateralReserve_ = _collateralReserve; } function setProfitSharingFund(address _profitSharingFund) public onlyOwner { require(_profitSharingFund != address(0), "zero"); profitSharingFund_ = _profitSharingFund; } function setDarkInsuranceFund(address _darkInsuranceFund) public onlyOwner { require(_darkInsuranceFund != address(0), "zero"); darkInsuranceFund_ = _darkInsuranceFund; } function updateProtocol() external onlyStrategist { if (dollarPrice() > PRICE_PRECISION) { ITreasuryPolicy(treasuryPolicy).setMintingFee(20); ITreasuryPolicy(treasuryPolicy).setRedemptionFee(80); } else { ITreasuryPolicy(treasuryPolicy).setMintingFee(40); ITreasuryPolicy(treasuryPolicy).setRedemptionFee(40); } for (uint256 i = 0; i < pools_array.length; i++) { address _pool = pools_array[i]; if (_pool != address(0)) { IPool(_pool).updateTargetCollateralRatio(); IPool(_pool).updateTargetDarkOverShareRatio(); } } address _oracle = oracleCollaterals[1]; if (_oracle != address(0)) IOracle(_oracle).update(); _oracle = oracleCollaterals[2]; if (_oracle != address(0)) IOracle(_oracle).update(); _oracle = oracleShare; if (_oracle != address(0)) IOracle(_oracle).update(); _oracle = oracleDollar; if (_oracle != address(0)) IOracle(_oracle).update(); } /* ========== EMERGENCY ========== */ function rescueStuckErc20(address _token) external onlyOwner { IERC20(_token).transfer(owner(), IERC20(_token).balanceOf(address(this))); } }
[{"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":"pool","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"PoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProfitExtracted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"StrategistStatusUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"pool_address","type":"address"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"collateralPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collaterals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dark","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"darkInsuranceFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"darkPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dollar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dollarPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEffectiveCollateralRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"globalCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalCollateralTotalValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"globalCollateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalDarkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalDarkValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalShareBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalShareValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dollar","type":"address"},{"internalType":"address","name":"_dark","type":"address"},{"internalType":"address","name":"_share","type":"address"},{"internalType":"address[]","name":"_collaterals","type":"address[]"},{"internalType":"address","name":"_treasuryPolicy","type":"address"},{"internalType":"address","name":"_collateralReserve","type":"address"},{"internalType":"address","name":"_profitSharingFund","type":"address"},{"internalType":"address","name":"_darkInsuranceFund","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minting_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"oracleCollaterals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleDark","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleDollar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleShare","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools_array","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitSharingFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redemption_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_address","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"requestBurnShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"requestTransferDarkFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"rescueStuckErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reserveReceiveDark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reserveReceiveShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve_share_state","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralReserve","type":"address"}],"name":"setCollateralReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_darkInsuranceFund","type":"address"}],"name":"setDarkInsuranceFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"address","name":"_oracleCollateral","type":"address"}],"name":"setOracleCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_oracleCollaterals","type":"address[]"}],"name":"setOracleCollaterals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleDark","type":"address"}],"name":"setOracleDark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleDollar","type":"address"}],"name":"setOracleDollar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleShare","type":"address"}],"name":"setOracleShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_profitSharingFund","type":"address"}],"name":"setProfitSharingFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setStrategistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryPolicy","type":"address"}],"name":"setTreasuryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sharePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"totalUnclaimedCollateral","outputs":[{"internalType":"uint256","name":"_totalUnclaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUnclaimedDark","outputs":[{"internalType":"uint256","name":"_totalUnclaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUnclaimedShare","outputs":[{"internalType":"uint256","name":"_totalUnclaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryPolicy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateProtocol","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060016097556146fa806100256000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830dfe58116101de578063b42b282b1161010f578063cf925e79116100ad578063e1bbcc691161007c578063e1bbcc6914610aed578063eeabb23e14610b20578063f2b5e4f114610b3d578063f2fde38b14610b455761038e565b8063cf925e7914610a8d578063d74d1a0e14610aaa578063d914cd4b14610ab2578063da41e61314610ae55761038e565b8063ba5426b6116100e9578063ba5426b614610a42578063c0baeadb14610a4a578063c3355b8d14610a7d578063cb73999f14610a855761038e565b8063b42b282b146109ff578063b55aecf014610a07578063ba1634c414610a3a5761038e565b8063a3b786581161017c578063a8d5fd6511610156578063a8d5fd6514610997578063a90bfe171461099f578063a9fa7ccc146109bc578063b16ce460146109f75761038e565b8063a3b78658146108ee578063a4063dbc14610921578063a4293ead146109545761038e565b80638ad4eccd116101b85780638ad4eccd146108ce5780638da5cb5b146108d65780638f0e0e51146108de578063a1f19c31146108e65761038e565b8063830dfe581461081b57806387269729146108be57806389c04662146108c65761038e565b80633c766eb2116102c35780635d08ea5011610261578063715018a611610230578063715018a61461079057806374292e25146107985780637a19832d146107cb57806381ca7eba146107e85761038e565b80635d08ea501461074657806361e5be3f146107635780636c95cb6f14610780578063704b83d1146107885761038e565b8063465b0c411161029d578063465b0c41146106f55780634ff33ead146106fd57806351adeb571461070557806358e7ad9a1461070d5761038e565b80633c766eb2146106c75780633e0ca9aa146106e557806340d7b7b8146106ed5761038e565b8063287e5f8b116103305780632f617d141161030a5780632f617d141461051e578063370158ea1461061e5780633712c9ab146106615780633b7d0946146106945761038e565b8063287e5f8b146104ca5780632b6112c3146104e75780632c97b30e146105165761038e565b80631246dbf51161036c5780631246dbf51461042b5780631704a9621461047257806324c1173b1461047a57806328596aba146104975761038e565b80630ca687dc14610393578063106b44a9146103c85780631189ebea146103e5575b600080fd5b6103c6600480360360208110156103a957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b78565b005b6103c6600480360360208110156103de57600080fd5b5035610cd4565b610402600480360360208110156103fb57600080fd5b5035610de0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61045e6004803603602081101561044157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e14565b604080519115158252519081900360200190f35b610402610e44565b6104026004803603602081101561049057600080fd5b5035610e60565b6103c6600480360360208110156104ad57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e6d565b6103c6600480360360208110156104e057600080fd5b5035610fc9565b610504600480360360208110156104fd57600080fd5b50356110ba565b60408051918252519081900360200190f35b610402611189565b6103c6600480360361010081101561053557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013582169260408201359092169181019060808101606082013564010000000081111561057e57600080fd5b82018360208201111561059057600080fd5b803590602001918460208302840111640100000000831117156105b257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff8335811694506020840135811693604081013582169350606001351690506111a5565b610626611682565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260ff1660c0830152519081900360e00190f35b6103c66004803603602081101561067757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611767565b6103c6600480360360208110156106aa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118c3565b6106cf611b38565b6040805160ff9092168252519081900360200190f35b610402611bd4565b610504611bf0565b610402611c5b565b610504611c77565b610402611d51565b6103c66004803603604081101561072357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611d6d565b6105046004803603602081101561075c57600080fd5b5035611edc565b6104026004803603602081101561077957600080fd5b5035611fbf565b610504611fcc565b610504611ffd565b6103c661201f565b61045e600480360360208110156107ae57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661211f565b6103c6600480360360208110156107e157600080fd5b5035612134565b6103c6600480360360208110156107fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661230a565b6103c66004803603602081101561083157600080fd5b81019060208101813564010000000081111561084c57600080fd5b82018360208201111561085e57600080fd5b8035906020019184602083028401116401000000008311171561088057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506124fa945050505050565b61050461268f565b6105046126fa565b6103c6612716565b610402612d46565b610402612d62565b610504612d7e565b6103c66004803603602081101561090457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e21565b61045e6004803603602081101561093757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612f7d565b6103c66004803603606081101561096a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612f92565b6104026130b0565b610504600480360360208110156109b557600080fd5b50356130cc565b6103c6600480360360408110156109d257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515613108565b610402613224565b610504613240565b6103c660048036036020811015610a1d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166132c3565b61050461341f565b61050461348a565b6103c660048036036020811015610a6057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613528565b610504613684565b6105046136ef565b61050460048036036020811015610aa357600080fd5b503561375a565b610402613817565b6103c660048036036020811015610ac857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613833565b610402613a28565b6103c660048036036020811015610b0357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613a44565b6103c660048036036020811015610b3657600080fd5b5035613ba0565b610504613c9c565b6103c660048036036020811015610b5b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613d1f565b610b80613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610c0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610c8d57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60a080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260a5602052604090205460ff16610d5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854604080517f2f9e40bd00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff90921691632f9e40bd9160248082019260009290919082900301818387803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b5050505050565b60a48181548110610ded57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b73ffffffffffffffffffffffffffffffffffffffff16600090815260a5602052604090205460ff16151560011490565b60a15473ffffffffffffffffffffffffffffffffffffffff1681565b609c8181548110610ded57fe5b610e75613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610efe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610f8257604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60a280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260a5602052604090205460ff1661104757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854604080517fdf593e0e00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff9092169163df593e0e9160248082019260009290919082900301818387803b158015610dc557600080fd5b60006111836110c883611edc565b609c84815481106110d557fe5b60009182526020918290200154609854604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152905191909216926370a082319260248082019391829003018186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d602081101561117b57600080fd5b505190613eae565b92915050565b609f5473ffffffffffffffffffffffffffffffffffffffff1690565b600054610100900460ff16806111be57506111be613ef0565b806111cc575060005460ff16155b611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff1615801561128757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b73ffffffffffffffffffffffffffffffffffffffff891661130b57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff881661138f57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff871661141357604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b855160031461148357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420636f6c6c61746572616c206c656e67746800000000000000604482015290519081900360640190fd5b61148b613ef6565b6099805473ffffffffffffffffffffffffffffffffffffffff808c167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a80548b8416908316179055609b8054928a1692909116919091179055855161150090609c906020890190614514565b50604080516003808252608082019092529060208201606080368337505081516115319260a3925060200190614514565b50604080516003808252608082019092529060208201606080368337505081516115629260a692506020019061459e565b5060005b60038110156116235761160287828151811061157e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156115cb57600080fd5b505afa1580156115df573d6000803e3d6000fd5b505050506040513d60208110156115f557600080fd5b505160129060ff16613eae565b60a6828154811061160f57fe5b600091825260209091200155600101611566565b5061162d856132c3565b61163684613528565b61163f83612e21565b61164882611767565b801561167757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050505050505050565b6000806000806000806000611695611bf0565b61169d61268f565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561170557600080fd5b505afa158015611719573d6000803e3d6000fd5b505050506040513d602081101561172f57600080fd5b5051611739611fcc565b611741613684565b6117496136ef565b611751611b38565b959d949c50929a50909850965094509092509050565b61176f613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146117f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661187c57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6118cb613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461195457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260a5602052604090205460ff1615156001146119ed57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260a56020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60a454811015611af3578173ffffffffffffffffffffffffffffffffffffffff1660a48281548110611a6757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611aeb57600060a48281548110611a9e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611af3565b600101611a39565b5060405173ffffffffffffffffffffffffffffffffffffffff8216907f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f90600090a250565b609d54604080517f3c766eb2000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691633c766eb2916004808301926020929190829003018186803b158015611ba357600080fd5b505afa158015611bb7573d6000803e3d6000fd5b505050506040513d6020811015611bcd57600080fd5b5051905090565b609d5473ffffffffffffffffffffffffffffffffffffffff1681565b60a054604080517f7eeda703000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691637eeda703916004808301926020929190829003018186803b158015611ba357600080fd5b60985473ffffffffffffffffffffffffffffffffffffffff1690565b600080611c82611fcc565b90506000611d38620f4240611d32611c98611bf0565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d0057600080fd5b505afa158015611d14573d6000803e3d6000fd5b505050506040513d6020811015611d2a57600080fd5b505190614019565b9061408c565b9050611d4a81611d3284612710614019565b9250505090565b60995473ffffffffffffffffffffffffffffffffffffffff1681565b611d75613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614611dfe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611e8257604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b8060a38381548110611e9057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60a454600090815b81811015611fb857600060a48281548110611efb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015611faf57611fac8173ffffffffffffffffffffffffffffffffffffffff1663d542404f876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611f7957600080fd5b505afa158015611f8d573d6000803e3d6000fd5b505050506040513d6020811015611fa357600080fd5b505185906140ce565b93505b50600101611ee4565b5050919050565b60a38181548110610ded57fe5b6000611ff8611fdb60026130cc565b611ff2611fe860016130cc565b611ff260006130cc565b906140ce565b905090565b6000611ff8620f4240611d3261201161341f565b612019613240565b90614019565b612027613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146120b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60655460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60a76020526000908152604090205460ff1681565b33600090815260a5602052604090205460ff166121b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006121c46064611d3284602d614019565b609854609a54609e54604080517fa5f2a15200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152604482018590525193945091169163a5f2a1529160648082019260009290919082900301818387803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b5050609854609a54609f54604080517fa5f2a15200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152604482018790525191909216935063a5f2a1529250606480830192600092919082900301818387803b1580156122ee57600080fd5b505af1158015612302573d6000803e3d6000fd5b505050505050565b612312613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461239b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123bf612d46565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b15801561242b57600080fd5b505afa15801561243f573d6000803e3d6000fd5b505050506040513d602081101561245557600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156124cb57600080fd5b505af11580156124df573d6000803e3d6000fd5b505050506040513d60208110156124f557600080fd5b505050565b612502613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461258b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80516003146125fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c6964206f7261636c65436f6c6c61746572616c73206c656e677468604482015290519081900360640190fd5b61260760a360006145e5565b60005b600381101561268b5760a382828151811061262157fe5b60209081029190910181015182546001808201855560009485529290932090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091550161260a565b5050565b60a254604080517f7eeda703000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691637eeda703916004808301926020929190829003018186803b158015611ba357600080fd5b6000611ff8620f4240611d3261270e61268f565b612019613c9c565b33600090815260a7602052604090205460ff16806127665750612737612d46565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6127d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f217374726174656769737420262620216f776e65720000000000000000000000604482015290519081900360640190fd5b620f42406127dd611bf0565b11156128fe57609d54604080517f238a470900000000000000000000000000000000000000000000000000000000815260146004820152905173ffffffffffffffffffffffffffffffffffffffff9092169163238a47099160248082019260009290919082900301818387803b15801561285657600080fd5b505af115801561286a573d6000803e3d6000fd5b5050609d54604080517f7dbc1df000000000000000000000000000000000000000000000000000000000815260506004820152905173ffffffffffffffffffffffffffffffffffffffff9092169350637dbc1df0925060248082019260009290919082900301818387803b1580156128e157600080fd5b505af11580156128f5573d6000803e3d6000fd5b50505050612a15565b609d54604080517f238a470900000000000000000000000000000000000000000000000000000000815260286004820152905173ffffffffffffffffffffffffffffffffffffffff9092169163238a47099160248082019260009290919082900301818387803b15801561297157600080fd5b505af1158015612985573d6000803e3d6000fd5b5050609d54604080517f7dbc1df000000000000000000000000000000000000000000000000000000000815260286004820152905173ffffffffffffffffffffffffffffffffffffffff9092169350637dbc1df0925060248082019260009290919082900301818387803b1580156129fc57600080fd5b505af1158015612a10573d6000803e3d6000fd5b505050505b60005b60a454811015612b2557600060a48281548110612a3157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612b1c578073ffffffffffffffffffffffffffffffffffffffff1663279df4a66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa357600080fd5b505af1158015612ab7573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e0740d236040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b0357600080fd5b505af1158015612b17573d6000803e3d6000fd5b505050505b50600101612a18565b50600060a3600181548110612b3657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612bc1578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ba857600080fd5b505af1158015612bbc573d6000803e3d6000fd5b505050505b60a3600281548110612bcf57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612c5a578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c4157600080fd5b505af1158015612c55573d6000803e3d6000fd5b505050505b5060a25473ffffffffffffffffffffffffffffffffffffffff168015612cdb578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612cc257600080fd5b505af1158015612cd6573d6000803e3d6000fd5b505050505b5060a05473ffffffffffffffffffffffffffffffffffffffff168015612d43578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610dc557600080fd5b50565b60655473ffffffffffffffffffffffffffffffffffffffff1690565b609a5473ffffffffffffffffffffffffffffffffffffffff1681565b60a454600090815b81811015612e1c57600060a48281548110612d9d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612e1357612e108173ffffffffffffffffffffffffffffffffffffffff1663c82c4d0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7957600080fd5b93505b50600101612d86565b505090565b612e29613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614612eb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f3657604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60a56020526000908152604090205460ff1681565b33600090815260a5602052604090205460ff1661301057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854604080517fa5f2a15200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590529151919092169163a5f2a15291606480830192600092919082900301818387803b15801561309357600080fd5b505af11580156130a7573d6000803e3d6000fd5b50505050505050565b609b5473ffffffffffffffffffffffffffffffffffffffff1681565b6000611183620f4240611d3260a685815481106130e557fe5b9060005260206000200154600a0a6120196130ff8761375a565b612019886110ba565b613110613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461319957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260a7602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517fb38d9228b69c4e345e016b967613409068515834d495dbfb9aa6713e9b364cab9281900390910190a25050565b60a05473ffffffffffffffffffffffffffffffffffffffff1681565b6000611ff861324d61348a565b609a54609854604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152905191909216916370a08231916024808301926020929190829003018186803b15801561115157600080fd5b6132cb613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461335457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166133d857604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60a154604080517f7eeda703000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691637eeda703916004808301926020929190829003018186803b158015611ba357600080fd5b60a454600090815b81811015612e1c57600060a482815481106134a957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050801561351f5761351c8173ffffffffffffffffffffffffffffffffffffffff16637f076a1c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7957600080fd5b93505b50600101613492565b613530613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146135b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661363d57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b609d54604080517fc3355b8d000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163c3355b8d916004808301926020929190829003018186803b158015611ba357600080fd5b609d54604080517fcb73999f000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cb73999f916004808301926020929190829003018186803b158015611ba357600080fd5b60008060a3838154811061376a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050801561380b578073ffffffffffffffffffffffffffffffffffffffff16637eeda7036040518163ffffffff1660e01b815260040160206040518083038186803b1580156137da57600080fd5b505afa1580156137ee573d6000803e3d6000fd5b505050506040513d602081101561380457600080fd5b5051613810565b620f42405b9392505050565b60a25473ffffffffffffffffffffffffffffffffffffffff1681565b61383b613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146138c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260a5602052604090205460ff161561395957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f706f6f6c45786973746564000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260a5602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560a48054918201815583527fe434dc35da084cf8d7e8186688ea2dacb53db7003d427af3abf351bd9d0a4e8d0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69190a250565b609e5473ffffffffffffffffffffffffffffffffffffffff1690565b613a4c613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614613ad557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613b5957604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60a180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260a5602052604090205460ff16613c1e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854609b54604080517fd1df306c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051919092169163d1df306c91604480830192600092919082900301818387803b158015610dc557600080fd5b6000611ff8613ca9612d7e565b609b54609854604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152905191909216916370a08231916024808301926020929190829003018186803b15801561115157600080fd5b613d27613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614613db057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613e1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146506026913960400191505060405180910390fd5b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b600061381083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614142565b303b1590565b600054610100900460ff1680613f0f5750613f0f613ef0565b80613f1d575060005460ff16155b613f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff16158015613fd857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b613fe06141f3565b613fe8614305565b8015612d4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60008261402857506000611183565b8282028284828161403557fe5b0414613810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146766021913960400191505060405180910390fd5b600061381083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614495565b60008282018381101561381057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081848411156141eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141b0578181015183820152602001614198565b50505050905090810190601f1680156141dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600054610100900460ff168061420c575061420c613ef0565b8061421a575060005460ff16155b61426f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff16158015613fe857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790558015612d4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff168061431e575061431e613ef0565b8061432c575060005460ff16155b614381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff161580156143e757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b60006143f1613eaa565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612d4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600081836144fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156141b0578181015183820152602001614198565b50600083858161450a57fe5b0495945050505050565b82805482825590600052602060002090810192821561458e579160200282015b8281111561458e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614534565b5061459a929150614603565b5090565b8280548282559060005260206000209081019282156145d9579160200282015b828111156145d95782518255916020019190600101906145be565b5061459a92915061463a565b5080546000825590600052602060002090810190612d43919061463a565b5b8082111561459a5780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101614604565b5b8082111561459a576000815560010161463b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a264697066735822122034e9df153d95cb9c97751dd0593b12eaee6a92400a480eceae6bcaf22cdc649164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061038e5760003560e01c8063830dfe58116101de578063b42b282b1161010f578063cf925e79116100ad578063e1bbcc691161007c578063e1bbcc6914610aed578063eeabb23e14610b20578063f2b5e4f114610b3d578063f2fde38b14610b455761038e565b8063cf925e7914610a8d578063d74d1a0e14610aaa578063d914cd4b14610ab2578063da41e61314610ae55761038e565b8063ba5426b6116100e9578063ba5426b614610a42578063c0baeadb14610a4a578063c3355b8d14610a7d578063cb73999f14610a855761038e565b8063b42b282b146109ff578063b55aecf014610a07578063ba1634c414610a3a5761038e565b8063a3b786581161017c578063a8d5fd6511610156578063a8d5fd6514610997578063a90bfe171461099f578063a9fa7ccc146109bc578063b16ce460146109f75761038e565b8063a3b78658146108ee578063a4063dbc14610921578063a4293ead146109545761038e565b80638ad4eccd116101b85780638ad4eccd146108ce5780638da5cb5b146108d65780638f0e0e51146108de578063a1f19c31146108e65761038e565b8063830dfe581461081b57806387269729146108be57806389c04662146108c65761038e565b80633c766eb2116102c35780635d08ea5011610261578063715018a611610230578063715018a61461079057806374292e25146107985780637a19832d146107cb57806381ca7eba146107e85761038e565b80635d08ea501461074657806361e5be3f146107635780636c95cb6f14610780578063704b83d1146107885761038e565b8063465b0c411161029d578063465b0c41146106f55780634ff33ead146106fd57806351adeb571461070557806358e7ad9a1461070d5761038e565b80633c766eb2146106c75780633e0ca9aa146106e557806340d7b7b8146106ed5761038e565b8063287e5f8b116103305780632f617d141161030a5780632f617d141461051e578063370158ea1461061e5780633712c9ab146106615780633b7d0946146106945761038e565b8063287e5f8b146104ca5780632b6112c3146104e75780632c97b30e146105165761038e565b80631246dbf51161036c5780631246dbf51461042b5780631704a9621461047257806324c1173b1461047a57806328596aba146104975761038e565b80630ca687dc14610393578063106b44a9146103c85780631189ebea146103e5575b600080fd5b6103c6600480360360208110156103a957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b78565b005b6103c6600480360360208110156103de57600080fd5b5035610cd4565b610402600480360360208110156103fb57600080fd5b5035610de0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61045e6004803603602081101561044157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e14565b604080519115158252519081900360200190f35b610402610e44565b6104026004803603602081101561049057600080fd5b5035610e60565b6103c6600480360360208110156104ad57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e6d565b6103c6600480360360208110156104e057600080fd5b5035610fc9565b610504600480360360208110156104fd57600080fd5b50356110ba565b60408051918252519081900360200190f35b610402611189565b6103c6600480360361010081101561053557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013582169260408201359092169181019060808101606082013564010000000081111561057e57600080fd5b82018360208201111561059057600080fd5b803590602001918460208302840111640100000000831117156105b257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff8335811694506020840135811693604081013582169350606001351690506111a5565b610626611682565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260ff1660c0830152519081900360e00190f35b6103c66004803603602081101561067757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611767565b6103c6600480360360208110156106aa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118c3565b6106cf611b38565b6040805160ff9092168252519081900360200190f35b610402611bd4565b610504611bf0565b610402611c5b565b610504611c77565b610402611d51565b6103c66004803603604081101561072357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611d6d565b6105046004803603602081101561075c57600080fd5b5035611edc565b6104026004803603602081101561077957600080fd5b5035611fbf565b610504611fcc565b610504611ffd565b6103c661201f565b61045e600480360360208110156107ae57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661211f565b6103c6600480360360208110156107e157600080fd5b5035612134565b6103c6600480360360208110156107fe57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661230a565b6103c66004803603602081101561083157600080fd5b81019060208101813564010000000081111561084c57600080fd5b82018360208201111561085e57600080fd5b8035906020019184602083028401116401000000008311171561088057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506124fa945050505050565b61050461268f565b6105046126fa565b6103c6612716565b610402612d46565b610402612d62565b610504612d7e565b6103c66004803603602081101561090457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612e21565b61045e6004803603602081101561093757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612f7d565b6103c66004803603606081101561096a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612f92565b6104026130b0565b610504600480360360208110156109b557600080fd5b50356130cc565b6103c6600480360360408110156109d257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515613108565b610402613224565b610504613240565b6103c660048036036020811015610a1d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166132c3565b61050461341f565b61050461348a565b6103c660048036036020811015610a6057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613528565b610504613684565b6105046136ef565b61050460048036036020811015610aa357600080fd5b503561375a565b610402613817565b6103c660048036036020811015610ac857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613833565b610402613a28565b6103c660048036036020811015610b0357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613a44565b6103c660048036036020811015610b3657600080fd5b5035613ba0565b610504613c9c565b6103c660048036036020811015610b5b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613d1f565b610b80613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610c0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610c8d57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60a080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260a5602052604090205460ff16610d5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854604080517f2f9e40bd00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff90921691632f9e40bd9160248082019260009290919082900301818387803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b5050505050565b60a48181548110610ded57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b73ffffffffffffffffffffffffffffffffffffffff16600090815260a5602052604090205460ff16151560011490565b60a15473ffffffffffffffffffffffffffffffffffffffff1681565b609c8181548110610ded57fe5b610e75613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614610efe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610f8257604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60a280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260a5602052604090205460ff1661104757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854604080517fdf593e0e00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff9092169163df593e0e9160248082019260009290919082900301818387803b158015610dc557600080fd5b60006111836110c883611edc565b609c84815481106110d557fe5b60009182526020918290200154609854604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152905191909216926370a082319260248082019391829003018186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d602081101561117b57600080fd5b505190613eae565b92915050565b609f5473ffffffffffffffffffffffffffffffffffffffff1690565b600054610100900460ff16806111be57506111be613ef0565b806111cc575060005460ff16155b611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff1615801561128757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b73ffffffffffffffffffffffffffffffffffffffff891661130b57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff881661138f57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff871661141357604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b855160031461148357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420636f6c6c61746572616c206c656e67746800000000000000604482015290519081900360640190fd5b61148b613ef6565b6099805473ffffffffffffffffffffffffffffffffffffffff808c167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a80548b8416908316179055609b8054928a1692909116919091179055855161150090609c906020890190614514565b50604080516003808252608082019092529060208201606080368337505081516115319260a3925060200190614514565b50604080516003808252608082019092529060208201606080368337505081516115629260a692506020019061459e565b5060005b60038110156116235761160287828151811061157e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156115cb57600080fd5b505afa1580156115df573d6000803e3d6000fd5b505050506040513d60208110156115f557600080fd5b505160129060ff16613eae565b60a6828154811061160f57fe5b600091825260209091200155600101611566565b5061162d856132c3565b61163684613528565b61163f83612e21565b61164882611767565b801561167757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050505050505050565b6000806000806000806000611695611bf0565b61169d61268f565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561170557600080fd5b505afa158015611719573d6000803e3d6000fd5b505050506040513d602081101561172f57600080fd5b5051611739611fcc565b611741613684565b6117496136ef565b611751611b38565b959d949c50929a50909850965094509092509050565b61176f613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146117f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661187c57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6118cb613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461195457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260a5602052604090205460ff1615156001146119ed57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260a56020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60a454811015611af3578173ffffffffffffffffffffffffffffffffffffffff1660a48281548110611a6757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611aeb57600060a48281548110611a9e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611af3565b600101611a39565b5060405173ffffffffffffffffffffffffffffffffffffffff8216907f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f90600090a250565b609d54604080517f3c766eb2000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691633c766eb2916004808301926020929190829003018186803b158015611ba357600080fd5b505afa158015611bb7573d6000803e3d6000fd5b505050506040513d6020811015611bcd57600080fd5b5051905090565b609d5473ffffffffffffffffffffffffffffffffffffffff1681565b60a054604080517f7eeda703000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691637eeda703916004808301926020929190829003018186803b158015611ba357600080fd5b60985473ffffffffffffffffffffffffffffffffffffffff1690565b600080611c82611fcc565b90506000611d38620f4240611d32611c98611bf0565b609960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d0057600080fd5b505afa158015611d14573d6000803e3d6000fd5b505050506040513d6020811015611d2a57600080fd5b505190614019565b9061408c565b9050611d4a81611d3284612710614019565b9250505090565b60995473ffffffffffffffffffffffffffffffffffffffff1681565b611d75613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614611dfe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611e8257604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b8060a38381548110611e9057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60a454600090815b81811015611fb857600060a48281548110611efb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015611faf57611fac8173ffffffffffffffffffffffffffffffffffffffff1663d542404f876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611f7957600080fd5b505afa158015611f8d573d6000803e3d6000fd5b505050506040513d6020811015611fa357600080fd5b505185906140ce565b93505b50600101611ee4565b5050919050565b60a38181548110610ded57fe5b6000611ff8611fdb60026130cc565b611ff2611fe860016130cc565b611ff260006130cc565b906140ce565b905090565b6000611ff8620f4240611d3261201161341f565b612019613240565b90614019565b612027613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146120b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60655460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60a76020526000908152604090205460ff1681565b33600090815260a5602052604090205460ff166121b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006121c46064611d3284602d614019565b609854609a54609e54604080517fa5f2a15200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152604482018590525193945091169163a5f2a1529160648082019260009290919082900301818387803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b5050609854609a54609f54604080517fa5f2a15200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152604482018790525191909216935063a5f2a1529250606480830192600092919082900301818387803b1580156122ee57600080fd5b505af1158015612302573d6000803e3d6000fd5b505050505050565b612312613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461239b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123bf612d46565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b15801561242b57600080fd5b505afa15801561243f573d6000803e3d6000fd5b505050506040513d602081101561245557600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b1580156124cb57600080fd5b505af11580156124df573d6000803e3d6000fd5b505050506040513d60208110156124f557600080fd5b505050565b612502613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461258b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80516003146125fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c6964206f7261636c65436f6c6c61746572616c73206c656e677468604482015290519081900360640190fd5b61260760a360006145e5565b60005b600381101561268b5760a382828151811061262157fe5b60209081029190910181015182546001808201855560009485529290932090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091550161260a565b5050565b60a254604080517f7eeda703000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691637eeda703916004808301926020929190829003018186803b158015611ba357600080fd5b6000611ff8620f4240611d3261270e61268f565b612019613c9c565b33600090815260a7602052604090205460ff16806127665750612737612d46565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6127d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f217374726174656769737420262620216f776e65720000000000000000000000604482015290519081900360640190fd5b620f42406127dd611bf0565b11156128fe57609d54604080517f238a470900000000000000000000000000000000000000000000000000000000815260146004820152905173ffffffffffffffffffffffffffffffffffffffff9092169163238a47099160248082019260009290919082900301818387803b15801561285657600080fd5b505af115801561286a573d6000803e3d6000fd5b5050609d54604080517f7dbc1df000000000000000000000000000000000000000000000000000000000815260506004820152905173ffffffffffffffffffffffffffffffffffffffff9092169350637dbc1df0925060248082019260009290919082900301818387803b1580156128e157600080fd5b505af11580156128f5573d6000803e3d6000fd5b50505050612a15565b609d54604080517f238a470900000000000000000000000000000000000000000000000000000000815260286004820152905173ffffffffffffffffffffffffffffffffffffffff9092169163238a47099160248082019260009290919082900301818387803b15801561297157600080fd5b505af1158015612985573d6000803e3d6000fd5b5050609d54604080517f7dbc1df000000000000000000000000000000000000000000000000000000000815260286004820152905173ffffffffffffffffffffffffffffffffffffffff9092169350637dbc1df0925060248082019260009290919082900301818387803b1580156129fc57600080fd5b505af1158015612a10573d6000803e3d6000fd5b505050505b60005b60a454811015612b2557600060a48281548110612a3157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612b1c578073ffffffffffffffffffffffffffffffffffffffff1663279df4a66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa357600080fd5b505af1158015612ab7573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e0740d236040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b0357600080fd5b505af1158015612b17573d6000803e3d6000fd5b505050505b50600101612a18565b50600060a3600181548110612b3657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612bc1578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ba857600080fd5b505af1158015612bbc573d6000803e3d6000fd5b505050505b60a3600281548110612bcf57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612c5a578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c4157600080fd5b505af1158015612c55573d6000803e3d6000fd5b505050505b5060a25473ffffffffffffffffffffffffffffffffffffffff168015612cdb578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612cc257600080fd5b505af1158015612cd6573d6000803e3d6000fd5b505050505b5060a05473ffffffffffffffffffffffffffffffffffffffff168015612d43578073ffffffffffffffffffffffffffffffffffffffff1663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610dc557600080fd5b50565b60655473ffffffffffffffffffffffffffffffffffffffff1690565b609a5473ffffffffffffffffffffffffffffffffffffffff1681565b60a454600090815b81811015612e1c57600060a48281548110612d9d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015612e1357612e108173ffffffffffffffffffffffffffffffffffffffff1663c82c4d0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7957600080fd5b93505b50600101612d86565b505090565b612e29613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614612eb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116612f3657604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60a56020526000908152604090205460ff1681565b33600090815260a5602052604090205460ff1661301057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854604080517fa5f2a15200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590529151919092169163a5f2a15291606480830192600092919082900301818387803b15801561309357600080fd5b505af11580156130a7573d6000803e3d6000fd5b50505050505050565b609b5473ffffffffffffffffffffffffffffffffffffffff1681565b6000611183620f4240611d3260a685815481106130e557fe5b9060005260206000200154600a0a6120196130ff8761375a565b612019886110ba565b613110613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461319957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600081815260a7602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517fb38d9228b69c4e345e016b967613409068515834d495dbfb9aa6713e9b364cab9281900390910190a25050565b60a05473ffffffffffffffffffffffffffffffffffffffff1681565b6000611ff861324d61348a565b609a54609854604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152905191909216916370a08231916024808301926020929190829003018186803b15801561115157600080fd5b6132cb613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff90811691161461335457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166133d857604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60a154604080517f7eeda703000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691637eeda703916004808301926020929190829003018186803b158015611ba357600080fd5b60a454600090815b81811015612e1c57600060a482815481106134a957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050801561351f5761351c8173ffffffffffffffffffffffffffffffffffffffff16637f076a1c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7957600080fd5b93505b50600101613492565b613530613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146135b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661363d57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b609d54604080517fc3355b8d000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163c3355b8d916004808301926020929190829003018186803b158015611ba357600080fd5b609d54604080517fcb73999f000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cb73999f916004808301926020929190829003018186803b158015611ba357600080fd5b60008060a3838154811061376a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050801561380b578073ffffffffffffffffffffffffffffffffffffffff16637eeda7036040518163ffffffff1660e01b815260040160206040518083038186803b1580156137da57600080fd5b505afa1580156137ee573d6000803e3d6000fd5b505050506040513d602081101561380457600080fd5b5051613810565b620f42405b9392505050565b60a25473ffffffffffffffffffffffffffffffffffffffff1681565b61383b613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff9081169116146138c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260a5602052604090205460ff161561395957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f706f6f6c45786973746564000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260a5602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560a48054918201815583527fe434dc35da084cf8d7e8186688ea2dacb53db7003d427af3abf351bd9d0a4e8d0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69190a250565b609e5473ffffffffffffffffffffffffffffffffffffffff1690565b613a4c613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614613ad557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613b5957604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048083019190915260248201527f7a65726f00000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60a180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260a5602052604090205460ff16613c1e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f21706f6f6c000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b609854609b54604080517fd1df306c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051919092169163d1df306c91604480830192600092919082900301818387803b158015610dc557600080fd5b6000611ff8613ca9612d7e565b609b54609854604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152905191909216916370a08231916024808301926020929190829003018186803b15801561115157600080fd5b613d27613eaa565b60655473ffffffffffffffffffffffffffffffffffffffff908116911614613db057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613e1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146506026913960400191505060405180910390fd5b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b600061381083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614142565b303b1590565b600054610100900460ff1680613f0f5750613f0f613ef0565b80613f1d575060005460ff16155b613f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff16158015613fd857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b613fe06141f3565b613fe8614305565b8015612d4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60008261402857506000611183565b8282028284828161403557fe5b0414613810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146766021913960400191505060405180910390fd5b600061381083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614495565b60008282018381101561381057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081848411156141eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141b0578181015183820152602001614198565b50505050905090810190601f1680156141dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600054610100900460ff168061420c575061420c613ef0565b8061421a575060005460ff16155b61426f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff16158015613fe857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790558015612d4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff168061431e575061431e613ef0565b8061432c575060005460ff16155b614381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614697602e913960400191505060405180910390fd5b600054610100900460ff161580156143e757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b60006143f1613eaa565b606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612d4357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600081836144fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156141b0578181015183820152602001614198565b50600083858161450a57fe5b0495945050505050565b82805482825590600052602060002090810192821561458e579160200282015b8281111561458e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614534565b5061459a929150614603565b5090565b8280548282559060005260206000209081019282156145d9579160200282015b828111156145d95782518255916020019190600101906145be565b5061459a92915061463a565b5080546000825590600052602060002090810190612d43919061463a565b5b8082111561459a5780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101614604565b5b8082111561459a576000815560010161463b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a264697066735822122034e9df153d95cb9c97751dd0593b12eaee6a92400a480eceae6bcaf22cdc649164736f6c634300060c0033
Deployed ByteCode Sourcemap
29635:13168:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39816:169;;;;;;;;;;;;;;;;-1:-1:-1;39816:169:0;;;;:::i;:::-;;38588:153;;;;;;;;;;;;;;;;-1:-1:-1;38588:153:0;;:::i;30229:28::-;;;;;;;;;;;;;;;;-1:-1:-1;30229:28:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;32938:122;;;;;;;;;;;;;;;;-1:-1:-1;32938:122:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30107:25;;;:::i;29918:28::-;;;;;;;;;;;;;;;;-1:-1:-1;29918:28:0;;:::i;40160:164::-;;;;;;;;;;;;;;;;-1:-1:-1;40160:164:0;;;;:::i;38429:151::-;;;;;;;;;;;;;;;;-1:-1:-1;38429:151:0;;:::i;34404:209::-;;;;;;;;;;;;;;;;-1:-1:-1;34404:209:0;;:::i;:::-;;;;;;;;;;;;;;;;33751:112;;;:::i;31131:1181::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31131:1181:0;;-1:-1:-1;;31131:1181:0;;;;;;-1:-1:-1;31131:1181:0;;;;;;;;;;;;;;-1:-1:-1;31131:1181:0;;;;;-1:-1:-1;31131:1181:0;:::i;33871:525::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41293:193;;;;;;;;;;;;;;;;-1:-1:-1;41293:193:0;;;;:::i;39044:579::-;;;;;;;;;;;;;;;;-1:-1:-1;39044:579:0;;;;:::i;33356:147::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29953:29;;;:::i;32361:110::-;;;:::i;33511:112::-;;;:::i;37020:347::-;;;:::i;29837:21::-;;;:::i;40669:214::-;;;;;;;;;;;;;;;;-1:-1:-1;40669:214:0;;;;;;;;;:::i;35807:417::-;;;;;;;;;;;;;;;;-1:-1:-1;35807:417:0;;:::i;30172:34::-;;;;;;;;;;;;;;;;-1:-1:-1;30172:34:0;;:::i;34856:187::-;;;:::i;35221:149::-;;;:::i;22684:148::-;;;:::i;30496:42::-;;;;;;;;;;;;;;;;-1:-1:-1;30496:42:0;;;;:::i;38023:398::-;;;;;;;;;;;;;;;;-1:-1:-1;38023:398:0;;:::i;42647:153::-;;;;;;;;;;;;;;;;-1:-1:-1;42647:153:0;;;;:::i;40332:329::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40332:329:0;;-1:-1:-1;40332:329:0;;-1:-1:-1;;;;;40332:329:0:i;32593:108::-;;;:::i;35551:152::-;;;:::i;41494:1100::-;;;:::i;22042:79::-;;;:::i;29865:19::-;;;:::i;36625:387::-;;;:::i;41092:193::-;;;;;;;;;;;;;;;;-1:-1:-1;41092:193:0;;;;:::i;30264:37::-;;;;;;;;;;;;;;;;-1:-1:-1;30264:37:0;;;;:::i;37626:234::-;;;;;;;;;;;;;;;;-1:-1:-1;37626:234:0;;;;;;;;;;;;;;;;;;:::i;29891:20::-;;;:::i;34621:227::-;;;;;;;;;;;;;;;;-1:-1:-1;34621:227:0;;:::i;37431:187::-;;;;;;;;;;;;;;;;-1:-1:-1;37431:187:0;;;;;;;;;;;:::i;30073:27::-;;;:::i;35051:162::-;;;:::i;39631:177::-;;;;;;;;;;;;;;;;-1:-1:-1;39631:177:0;;;;:::i;32479:106::-;;;:::i;36232:385::-;;;:::i;40891:193::-;;;;;;;;;;;;;;;;-1:-1:-1;40891:193:0;;;;:::i;33068:133::-;;;:::i;33209:139::-;;;:::i;32709:221::-;;;;;;;;;;;;;;;;-1:-1:-1;32709:221:0;;:::i;30139:26::-;;;:::i;38770:244::-;;;;;;;;;;;;;;;;-1:-1:-1;38770:244:0;;;;:::i;33631:112::-;;;:::i;39993:159::-;;;;;;;;;;;;;;;;-1:-1:-1;39993:159:0;;;;:::i;37868:147::-;;;;;;;;;;;;;;;;-1:-1:-1;37868:147:0;;:::i;35378:165::-;;;:::i;22987:244::-;;;;;;;;;;;;;;;;-1:-1:-1;22987:244:0;;;;:::i;39816:169::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39902:27:::1;::::0;::::1;39894:44;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39949:12;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;39816:169::o;38588:153::-;30889:10;30883:17;;;;:5;:17;;;;;;;;30875:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38691:18:::1;::::0;38672:61:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;38691:18:::1;::::0;;::::1;::::0;38672:52:::1;::::0;:61;;;;;38691:18:::1;::::0;38672:61;;;;;;;;38691:18;;38672:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38588:153:::0;:::o;30229:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30229:28:0;:::o;32938:122::-;33029:15;;33005:4;33029:15;;;:5;:15;;;;;;;;:23;;:15;:23;;32938:122::o;30107:25::-;;;;;;:::o;29918:28::-;;;;;;;;;;40160:164;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40244:26:::1;::::0;::::1;40236:43;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40290:11;:26:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40160:164::o;38429:151::-;30889:10;30883:17;;;;:5;:17;;;;;;;;30875:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38531:18:::1;::::0;38512:60:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;38531:18:::1;::::0;;::::1;::::0;38512:51:::1;::::0;:60;;;;;38531:18:::1;::::0;38512:60;;;;;;;;38531:18;;38512:60;::::1;;::::0;::::1;;;;::::0;::::1;34404:209:::0;34483:7;34510:95;34572:32;34597:6;34572:24;:32::i;:::-;34517:11;34529:6;34517:19;;;;;;;;;;;;;;;;;;;34548:18;;34510:57;;;;;;34517:19;34548:18;;;34510:57;;;;;;34517:19;;;;;34510:37;;:57;;;;;;;;;;;34517:19;34510:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34510:57:0;;:61;:95::i;:::-;34503:102;34404:209;-1:-1:-1;;34404:209:0:o;33751:112::-;33837:18;;;;33751:112;:::o;31131:1181::-;18414:12;;;;;;;;:31;;;18430:15;:13;:15::i;:::-;18414:47;;;-1:-1:-1;18450:11:0;;;;18449:12;18414:47;18406:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18525:19;18548:12;;;;;;18547:13;18571:99;;;;18606:12;:19;;18640:18;18606:19;;;;;;18640:18;18621:4;18640:18;;;18571:99;31458:21:::1;::::0;::::1;31450:38;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31507:19;::::0;::::1;31499:36;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31554:20;::::0;::::1;31546:37;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31602:12;:19;31625:1;31602:24;31594:62;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31669:35;:33;:35::i;:::-;31717:6;:16:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;31744:4:::1;:12:::0;;;;::::1;::::0;;::::1;;::::0;;31775:5:::1;:14:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;31808:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;31886:16:0::1;::::0;;31900:1:::1;31886:16:::0;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;31866:36:0;;::::1;::::0;:17:::1;::::0;-1:-1:-1;31866:36:0::1;;::::0;::::1;:::i;:::-;-1:-1:-1::0;31932:16:0::1;::::0;;31946:1:::1;31932:16:::0;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;31913:35:0;;::::1;::::0;:16:::1;::::0;-1:-1:-1;31913:35:0::1;;::::0;::::1;:::i;:::-;;31964:9;31959:146;31983:1;31979;:5;31959:146;;;32028:65;32064:12;32077:1;32064:15;;;;;;;;;;;;;;32052:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32052:39:0;32036:2:::1;::::0;32044:48:::1;;32028:15;:65::i;:::-;32006:16;32023:1;32006:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:87:::0;31986:3:::1;;31959:146;;;;32117:34;32135:15;32117:17;:34::i;:::-;32162:40;32183:18;32162:20;:40::i;:::-;32213;32234:18;32213:20;:40::i;:::-;32264;32285:18;32264:20;:40::i;:::-;18700:14:::0;18696:67;;;18746:5;18731:20;;;;;;18696:67;31131:1181;;;;;;;;;:::o;33871:525::-;33969:7;33991;34013;34035;34057;34079;34101:5;34156:13;:11;:13::i;:::-;34184:12;:10;:12::i;:::-;34218:6;;;;;;;;;;;34211:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34211:28:0;34254;:26;:28::i;:::-;34297:13;:11;:13::i;:::-;34325:16;:14;:16::i;:::-;34356:21;:19;:21::i;:::-;34134:254;;;;-1:-1:-1;34134:254:0;;-1:-1:-1;34134:254:0;;-1:-1:-1;34134:254:0;-1:-1:-1;34134:254:0;-1:-1:-1;34134:254:0;;-1:-1:-1;33871:525:0;-1:-1:-1;33871:525:0:o;41293:193::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41387:32:::1;::::0;::::1;41379:49;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41439:18;:39:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;41293:193::o;39044:579::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39122:19:::1;::::0;::::1;;::::0;;;:5:::1;:19;::::0;;;;;::::1;;:27;;:19:::0;:27:::1;39114:45;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39213:19;::::0;::::1;;::::0;;;:5:::1;:19;::::0;;;;39206:26;;;::::1;::::0;;39309:266:::1;39333:11;:18:::0;39329:22;::::1;39309:266;;;39395:12;39377:30;;:11;39389:1;39377:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:30;39373:191;;;39453:1;39428:11;39440:1;39428:14;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;39543:5;;39373:191;39353:3;;39309:266;;;-1:-1:-1::0;39590:25:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;39044:579:::0;:::o;33356:147::-;33458:14;;33442:53;;;;;;;;33417:5;;33458:14;;;33442:51;;:53;;;;;;;;;;;;;;33458:14;33442:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33442:53:0;;-1:-1:-1;33356:147:0;:::o;29953:29::-;;;;;;:::o;32361:110::-;32440:12;;32432:31;;;;;;;;32405:7;;32440:12;;;32432:29;;:31;;;;;;;;;;;;;;32440:12;32432:31;;;;;;;;;;33511:112;33597:18;;;;33511:112;:::o;37020:347::-;37091:7;37111:31;37145:28;:26;:28::i;:::-;37111:62;;37184:27;37214:68;30394:3;37214:47;37247:13;:11;:13::i;:::-;37221:6;;;;;;;;;;;37214:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37214:28:0;;:32;:47::i;:::-;:51;;:68::i;:::-;37184:98;-1:-1:-1;37300:59:0;37184:98;37300:34;:23;37328:5;37300:27;:34::i;:59::-;37293:66;;;;37020:347;:::o;29837:21::-;;;;;;:::o;40669:214::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40779:31:::1;::::0;::::1;40771:48;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40858:17;40830;40848:6;40830:25;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;40669:214:::0;;:::o;35807:417::-;35932:11;:18;35878:23;;;35961:256;35985:7;35981:1;:11;35961:256;;;36014:13;36030:11;36042:1;36030:14;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36063:19:0;;36059:147;;36121:69;36148:5;36142:38;;;36181:6;36142:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36142:46:0;36121:15;;:19;:69::i;:::-;36103:87;;36059:147;-1:-1:-1;35994:3:0;;35961:256;;;;35807:417;;;;:::o;30172:34::-;;;;;;;;;;34856:187;34924:7;34951:84;35010:24;35032:1;35010:21;:24::i;:::-;34951:54;34980:24;35002:1;34980:21;:24::i;:::-;34951;34973:1;34951:21;:24::i;:::-;:28;;:54::i;:84::-;34944:91;;34856:187;:::o;35221:149::-;35278:7;35305:57;30394:3;35305:36;35329:11;:9;:11::i;:::-;35305:19;:17;:19::i;:::-;:23;;:36::i;22684:148::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22775:6:::1;::::0;22754:40:::1;::::0;22791:1:::1;::::0;22754:40:::1;22775:6;::::0;22754:40:::1;::::0;22791:1;;22754:40:::1;22805:6;:19:::0;;;::::1;::::0;;22684:148::o;30496:42::-;;;;;;;;;;;;;;;:::o;38023:398::-;30889:10;30883:17;;;;:5;:17;;;;;;;;30875:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38107:12:::1;38122:21;38139:3;38122:12;:4:::0;38131:2:::1;38122:8;:12::i;:21::-;38259:18;::::0;38290:4:::1;::::0;38296:18:::1;::::0;38240:81:::1;::::0;;;;;38259:18:::1;38290:4:::0;;::::1;38240:81;::::0;::::1;::::0;38296:18;;::::1;38240:81:::0;;;;;;;;;;;38107:36;;-1:-1:-1;38259:18:0;::::1;::::0;38240:49:::1;::::0;:81;;;;;38259:18:::1;::::0;38240:81;;;;;;;;38259:18;;38240:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38351:18:0::1;::::0;38382:4:::1;::::0;38388:18:::1;::::0;38332:81:::1;::::0;;;;;38351:18:::1;38382:4:::0;;::::1;38332:81;::::0;::::1;::::0;38388:18;;::::1;38332:81:::0;;;;;;;;;;;38351:18;;;::::1;::::0;-1:-1:-1;38332:49:0::1;::::0;-1:-1:-1;38332:81:0;;;;;38351:18:::1;::::0;38332:81;;;;;;;38351:18;;38332:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30921:1;38023:398:::0;:::o;42647:153::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42726:6:::1;42719:23;;;42743:7;:5;:7::i;:::-;42752:39;::::0;;;;;42785:4:::1;42752:39;::::0;::::1;::::0;;;:24:::1;::::0;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42752:39:0;42719:73:::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;42752:39:::1;::::0;42719:73;;;;;;;-1:-1:-1;42719:73:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;42647:153:0:o;40332:329::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40437:18:::1;:25;40466:1;40437:30;40429:75;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40515:24;40522:17;;40515:24;:::i;:::-;40555:9;40550:104;40574:1;40570;:5;40550:104;;;40597:17;40620:18;40639:1;40620:21;;;;;;;;;::::0;;::::1;::::0;;;;;;;40597:45;;::::1;::::0;;::::1;::::0;;-1:-1:-1;40597:45:0;;;;;;;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;40577:3:::1;40550:104;;;;40332:329:::0;:::o;32593:108::-;32671:11;;32663:30;;;;;;;;32636:7;;32671:11;;;32663:28;;:30;;;;;;;;;;;;;;32671:11;32663:30;;;;;;;;;;35551:152;35609:7;35636:59;30394:3;35636:38;35661:12;:10;:12::i;:::-;35636:20;:18;:20::i;41494:1100::-;30994:10;30983:22;;;;:10;:22;;;;;;;;;:47;;;31023:7;:5;:7::i;:::-;31009:21;;:10;:21;;;30983:47;30975:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30394:3:::1;41559:13;:11;:13::i;:::-;:31;41555:329;;;41623:14;::::0;41607:49:::1;::::0;;;;;41653:2:::1;41607:49;::::0;::::1;::::0;;;41623:14:::1;::::0;;::::1;::::0;41607:45:::1;::::0;:49;;;;;41623:14:::1;::::0;41607:49;;;;;;;;41623:14;;41607:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41687:14:0::1;::::0;41671:52:::1;::::0;;;;;41720:2:::1;41671:52;::::0;::::1;::::0;;;41687:14:::1;::::0;;::::1;::::0;-1:-1:-1;41671:48:0::1;::::0;-1:-1:-1;41671:52:0;;;;;41687:14:::1;::::0;41671:52;;;;;;;;41687:14;;41671:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41555:329;;;41772:14;::::0;41756:49:::1;::::0;;;;;41802:2:::1;41756:49;::::0;::::1;::::0;;;41772:14:::1;::::0;;::::1;::::0;41756:45:::1;::::0;:49;;;;;41772:14:::1;::::0;41756:49;;;;;;;;41772:14;;41756:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41836:14:0::1;::::0;41820:52:::1;::::0;;;;;41869:2:::1;41820:52;::::0;::::1;::::0;;;41836:14:::1;::::0;;::::1;::::0;-1:-1:-1;41820:48:0::1;::::0;-1:-1:-1;41820:52:0;;;;;41836:14:::1;::::0;41820:52;;;;;;;;41836:14;;41820:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41555:329;41899:9;41894:286;41918:11;:18:::0;41914:22;::::1;41894:286;;;41958:13;41974:11;41986:1;41974:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;-1:-1:-1;42007:19:0;;42003:166:::1;;42053:5;42047:40;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42114:5;42108:43;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42003:166;-1:-1:-1::0;41938:3:0::1;;41894:286;;;;42190:15;42208:17;42226:1;42208:20;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;-1:-1:-1;42243:21:0;;42239:52:::1;;42274:7;42266:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42239:52;42312:17;42330:1;42312:20;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;-1:-1:-1;42347:21:0;;42343:52:::1;;42378:7;42370:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42343:52;-1:-1:-1::0;42416:11:0::1;::::0;::::1;;42442:21:::0;;42438:52:::1;;42473:7;42465:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42438:52;-1:-1:-1::0;42511:12:0::1;::::0;::::1;;42538:21:::0;;42534:52:::1;;42569:7;42561:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;42534:52;31067:1;41494:1100::o:0;22042:79::-;22107:6;;;;22042:79;:::o;29865:19::-;;;;;;:::o;36625:387::-;36731:11;:18;36677:23;;;36760:245;36784:7;36780:1;:11;36760:245;;;36813:13;36829:11;36841:1;36829:14;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36862:19:0;;36858:136;;36920:58;36947:5;36941:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36920:58;36902:76;;36858:136;-1:-1:-1;36793:3:0;;36760:245;;;;36625:387;;:::o;41092:193::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41186:32:::1;::::0;::::1;41178:49;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41238:18;:39:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;41092:193::o;30264:37::-;;;;;;;;;;;;;;;:::o;37626:234::-;30889:10;30883:17;;;;:5;:17;;;;;;;;30875:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37794:18:::1;::::0;37775:77:::1;::::0;;;;;37794:18:::1;37775:77:::0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;37794:18;;;::::1;::::0;37775:49:::1;::::0;:77;;;;;37794:18:::1;::::0;37775:77;;;;;;;37794:18;;37775:77;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37626:234:::0;;;:::o;29891:20::-;;;;;;:::o;34621:227::-;34698:7;34725:115;30394:3;34725:94;34794:16;34811:6;34794:24;;;;;;;;;;;;;;;;34790:2;:28;34725:60;34761:23;34777:6;34761:15;:23::i;:::-;34725:31;34749:6;34725:23;:31::i;37431:187::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37522:20:::1;::::0;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;;:30;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;37568:42;;;;;;;::::1;::::0;;;;;;;;::::1;37431:187:::0;;:::o;30073:27::-;;;;;;:::o;35051:162::-;35110:7;35137:68;35184:20;:18;:20::i;:::-;35144:4;;35160:18;;35137:42;;;;;;35144:4;35160:18;;;35137:42;;;;;;35144:4;;;;;35137:22;;:42;;;;;;;;;;;;;;35144:4;35137:42;;;;;;;;;;39631:177;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39719:29:::1;::::0;::::1;39711:46;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39768:14;:32:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;39631:177::o;32479:106::-;32556:10;;32548:29;;;;;;;;32521:7;;32556:10;;;32548:27;;:29;;;;;;;;;;;;;;32556:10;32548:29;;;;;;;;;;36232:385;36337:11;:18;36283:23;;;36366:244;36390:7;36386:1;:11;36366:244;;;36419:13;36435:11;36447:1;36435:14;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36468:19:0;;36464:135;;36526:57;36553:5;36547:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36526:57;36508:75;;36464:135;-1:-1:-1;36399:3:0;;36366:244;;40891:193;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40985:32:::1;::::0;::::1;40977:49;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41037:18;:39:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40891:193::o;33068:133::-;33164:14;;33148:45;;;;;;;;33121:7;;33164:14;;;33148:43;;:45;;;;;;;;;;;;;;33164:14;33148:45;;;;;;;;;;33209:139;33308:14;;33292:48;;;;;;;;33265:7;;33308:14;;;33292:46;;:48;;;;;;;;;;;;;;33308:14;33292:48;;;;;;;;;;32709:221;32771:7;32791:15;32809:17;32827:6;32809:25;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32853:21:0;;32852:70;;32904:7;32896:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32896:26:0;32852:70;;;30394:3;32852:70;32845:77;32709:221;-1:-1:-1;;;32709:221:0:o;30139:26::-;;;;;;:::o;38770:244::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38845:19:::1;::::0;::::1;;::::0;;;:5:::1;:19;::::0;;;;;::::1;;:28;38837:52;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38900:19;::::0;::::1;;::::0;;;:5:::1;:19;::::0;;;;;:26;;;::::1;38922:4;38900:26:::0;;::::1;::::0;;;38937:11:::1;:30:::0;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;38983:23;::::1;::::0;38900:19;38983:23:::1;38770:244:::0;:::o;33631:112::-;33717:18;;;;33631:112;:::o;39993:159::-;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40075:25:::1;::::0;::::1;40067:42;;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;40120:10;:24:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;39993:159::o;37868:147::-;30889:10;30883:17;;;;:5;:17;;;;;;;;30875:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37965:18:::1;::::0;37995:5:::1;::::0;37946:61:::1;::::0;;;;;37965:18:::1;37995:5:::0;;::::1;37946:61;::::0;::::1;::::0;;;;;;;;;37965:18;;;::::1;::::0;37946:48:::1;::::0;:61;;;;;37965:18:::1;::::0;37946:61;;;;;;;37965:18;;37946:61;::::1;;::::0;::::1;;;;::::0;::::1;35378:165:::0;35438:7;35465:70;35513:21;:19;:21::i;:::-;35472:5;;35489:18;;35465:43;;;;;;35472:5;35489:18;;;35465:43;;;;;;35472:5;;;;;35465:23;;:43;;;;;;;;;;;;;;35472:5;35465:43;;;;;;;;;;22987:244;22264:12;:10;:12::i;:::-;22254:6;;:22;:6;;;:22;;;22246:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23076:22:::1;::::0;::::1;23068:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23178:6;::::0;23157:38:::1;::::0;::::1;::::0;;::::1;::::0;23178:6:::1;::::0;23157:38:::1;::::0;23178:6:::1;::::0;23157:38:::1;23206:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;22987:244::o;20437:106::-;20525:10;20437:106;:::o;4097:136::-;4155:7;4182:43;4186:1;4189;4182:43;;;;;;;;;;;;;;;;;:3;:43::i;18863:568::-;19304:4;19371:17;19416:7;18863:568;:::o;21628:129::-;18414:12;;;;;;;;:31;;;18430:15;:13;:15::i;:::-;18414:47;;;-1:-1:-1;18450:11:0;;;;18449:12;18414:47;18406:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18525:19;18548:12;;;;;;18547:13;18571:99;;;;18606:12;:19;;18640:18;18606:19;;;;;;18640:18;18621:4;18640:18;;;18571:99;21686:26:::1;:24;:26::i;:::-;21723;:24;:26::i;:::-;18700:14:::0;18696:67;;;18746:5;18731:20;;;;;;21628:129;:::o;5005:471::-;5063:7;5308:6;5304:47;;-1:-1:-1;5338:1:0;5331:8;;5304:47;5375:5;;;5379:1;5375;:5;:1;5399:5;;;;;:10;5391:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5944:132;6002:7;6029:39;6033:1;6036;6029:39;;;;;;;;;;;;;;;;;:3;:39::i;3641:181::-;3699:7;3731:5;;;3755:6;;;;3747:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4528:226;4648:7;4684:12;4676:6;;;;4668:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4720:5:0;;;4528:226::o;20370:59::-;18414:12;;;;;;;;:31;;;18430:15;:13;:15::i;:::-;18414:47;;;-1:-1:-1;18450:11:0;;;;18449:12;18414:47;18406:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18525:19;18548:12;;;;;;18547:13;18571:99;;;;18606:12;:19;;18640:18;18606:19;;;;;;18640:18;18621:4;18640:18;;;18700:14;18696:67;;;18746:5;18731:20;;;;;;20370:59;:::o;21765:196::-;18414:12;;;;;;;;:31;;;18430:15;:13;:15::i;:::-;18414:47;;;-1:-1:-1;18450:11:0;;;;18449:12;18414:47;18406:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18525:19;18548:12;;;;;;18547:13;18571:99;;;;18606:12;:19;;18640:18;18606:19;;;;;;18640:18;18621:4;18640:18;;;18571:99;21833:17:::1;21853:12;:10;:12::i;:::-;21876:6;:18:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;21910:43:::1;::::0;21876:18;;-1:-1:-1;21876:18:0;-1:-1:-1;;21910:43:0::1;::::0;-1:-1:-1;;21910:43:0::1;18682:1;18700:14:::0;18696:67;;;18746:5;18731:20;;;;;;21765:196;:::o;6564:379::-;6684:7;6786:12;6779:5;6771:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6810:9;6826:1;6822;:5;;;;;;;6564:379;-1:-1:-1;;;;;6564:379:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://34e9df153d95cb9c97751dd0593b12eaee6a92400a480eceae6bcaf22cdc6491
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.