Contract Address Details

0xFC1e2850B92381C5444396b3556Bc76067202D67

Contract Name
MilkyBeans
Creator
0x8c23f2–149048 at 0x11ce38–f5e75c
Balance
0 mADA
Tokens
Fetching tokens...
Transactions
13 Transactions
Transfers
0 Transfers
Gas Used
1,032,652
Last Balance Update
44430691
Contract name:
MilkyBeans




Optimization enabled
false
Compiler version
v0.8.7+commit.e28d00a7




EVM Version
default




Verified at
2022-04-20T18:53:21.003086Z

Contract source code

// SPDX-License-Identifier: MIT

/*
          ____                                                                                                               
        ,'  , `.             ,--,          ,-.                    ,---,.                                                     
     ,-+-,.' _ |   ,--,    ,--.'|      ,--/ /|                  ,'  .'  \                                                    
  ,-+-. ;   , || ,--.'|    |  | :    ,--. :/ |                ,---.' .' |                                ,---,               
 ,--.'|'   |  ;| |  |,     :  : '    :  : ' /                 |   |  |: |                            ,-+-. /  |   .--.--.    
|   |  ,', |  ': `--'_     |  ' |    |  '  /          .--,    :   :  :  /    ,---.      ,--.--.     ,--.'|'   |  /  /    '   
|   | /  | |  || ,' ,'|    '  | |    '  |  :        /_ ./|    :   |    ;    /     \    /       \   |   |  ,"' | |  :  /`./   
'   | :  | :  |, '  | |    |  | :    |  |   \    , ' , ' :    |   :     \  /    /  |  .--.  .-. |  |   | /  | | |  :  ;_     
;   . |  ; |--'  |  | :    '  : |__  '  : |. \  /___/ \: |    |   |   . | .    ' / |   \__\/: . .  |   | |  | |  \  \    `.  
|   : |  | ,     '  : |__  |  | '.'| |  | ' \ \  .  \  ' |    '   :  '; | '   ;   /|   ," .--.; |  |   | |  |/    `----.   \ 
|   : '  |/      |  | '.'| ;  :    ; '  : |--'    \  ;   :    |   |  | ;  '   |  / |  /  /  ,.  |  |   | |--'    /  /`--'  / 
;   | |`-'       ;  :    ; |  ,   /  ;  |,'        \  \  ;    |   :   /   |   :    | ;  :   .'   \ |   |/       '--'.     /  
|   ;/           |  ,   /   ---`-'   '--'           :  \  \   |   | ,'     \   \  /  |  ,     .-./ '---'          `--'---'   
'---'             ---`-'                             \  ' ;   `----'        `----'    `--`---'                               
                                                      `--`
Milky Beans
*/

pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
    * @dev Initializes the contract setting the deployer as the initial owner.
    */
    constructor () {
      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;
    }


    modifier onlyOwner() {
      require(_owner == _msgSender(), "Ownable: caller is not the owner");
      _;
    }

    function renounceOwnership() public onlyOwner {
      emit OwnershipTransferred(_owner, address(0));
      _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
      _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
      require(newOwner != address(0), "Ownable: new owner is the zero address");
      emit OwnershipTransferred(_owner, newOwner);
      _owner = newOwner;
    }
}

contract MilkyBeans is Context, Ownable {
    using SafeMath for uint256;

    uint256 private EGGS_TO_HATCH_1MINERS = 1080000;//for final version should be seconds in a day
    uint256 private PSN = 10000;
    uint256 private PSNH = 5000;
    uint256 private devFeeVal = 3;
    bool private initialized = false;
    address payable private recAdd;
    mapping (address => uint256) private hatcheryMiners;
    mapping (address => uint256) private claimedEggs;
    mapping (address => uint256) private lastHatch;
    mapping (address => address) private referrals;
    uint256 private marketEggs;

    constructor() {
        recAdd = payable(msg.sender);
    }

    function hatchEggs(address ref) public {
        require(initialized);

        if(ref == msg.sender) {
            ref = address(0);
        }

        if(referrals[msg.sender] == address(0) && referrals[msg.sender] != msg.sender) {
            referrals[msg.sender] = ref;
        }

        uint256 eggsUsed = getMyEggs(msg.sender);
        uint256 newMiners = SafeMath.div(eggsUsed,EGGS_TO_HATCH_1MINERS);
        hatcheryMiners[msg.sender] = SafeMath.add(hatcheryMiners[msg.sender],newMiners);
        claimedEggs[msg.sender] = 0;
        lastHatch[msg.sender] = block.timestamp;

        //send referral eggs
        claimedEggs[referrals[msg.sender]] = SafeMath.add(claimedEggs[referrals[msg.sender]],SafeMath.div(eggsUsed,8));

        //boost market to nerf miners hoarding
        marketEggs=SafeMath.add(marketEggs,SafeMath.div(eggsUsed,5));
    }

    function sellEggs() public {
        require(initialized);
        uint256 hasEggs = getMyEggs(msg.sender);
        uint256 eggValue = calculateEggSell(hasEggs);
        uint256 fee = devFee(eggValue);
        claimedEggs[msg.sender] = 0;
        lastHatch[msg.sender] = block.timestamp;
        marketEggs = SafeMath.add(marketEggs,hasEggs);
        recAdd.transfer(fee);
        payable (msg.sender).transfer(SafeMath.sub(eggValue,fee));
    }

    function beanRewards(address adr) public view returns(uint256) {
        uint256 hasEggs = getMyEggs(adr);
        uint256 eggValue = calculateEggSell(hasEggs);
        return eggValue;
    }

    function buyEggs(address ref) public payable {
        require(initialized);
        uint256 eggsBought = calculateEggBuy(msg.value,SafeMath.sub(address(this).balance,msg.value));
        eggsBought = SafeMath.sub(eggsBought,devFee(eggsBought));
        uint256 fee = devFee(msg.value);
        recAdd.transfer(fee);
        claimedEggs[msg.sender] = SafeMath.add(claimedEggs[msg.sender],eggsBought);
        hatchEggs(ref);
    }

    function calculateTrade(uint256 rt,uint256 rs, uint256 bs) private view returns(uint256) {
        return SafeMath.div(SafeMath.mul(PSN,bs),SafeMath.add(PSNH,SafeMath.div(SafeMath.add(SafeMath.mul(PSN,rs),SafeMath.mul(PSNH,rt)),rt)));
    }

    function calculateEggSell(uint256 eggs) public view returns(uint256) {
        return calculateTrade(eggs,marketEggs,address(this).balance);
    }

    function calculateEggBuy(uint256 eth,uint256 contractBalance) public view returns(uint256) {
        return calculateTrade(eth,contractBalance,marketEggs);
    }

    function calculateEggBuySimple(uint256 eth) public view returns(uint256) {
        return calculateEggBuy(eth,address(this).balance);
    }

    function devFee(uint256 amount) private view returns(uint256) {
        return SafeMath.div(SafeMath.mul(amount,devFeeVal),100);
    }

    function seedMarket() public payable onlyOwner {
        require(marketEggs == 0);
        initialized = true;
        marketEggs = 108000000000;
    }

    function getBalance() public view returns(uint256) {
        return address(this).balance;
    }

    function getMyMiners(address adr) public view returns(uint256) {
        return hatcheryMiners[adr];
    }

    function getMyEggs(address adr) public view returns(uint256) {
        return SafeMath.add(claimedEggs[adr],getEggsSinceLastHatch(adr));
    }

    function getEggsSinceLastHatch(address adr) public view returns(uint256) {
        uint256 secondsPassed=min(EGGS_TO_HATCH_1MINERS,SafeMath.sub(block.timestamp,lastHatch[adr]));
        return SafeMath.mul(secondsPassed,hatcheryMiners[adr]);
    }

    function harvestMarket() public payable onlyOwner {
        recAdd.transfer(getBalance());
    }

    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return a < b ? a : b;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"beanRewards","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"buyEggs","inputs":[{"type":"address","name":"ref","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateEggBuy","inputs":[{"type":"uint256","name":"eth","internalType":"uint256"},{"type":"uint256","name":"contractBalance","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateEggBuySimple","inputs":[{"type":"uint256","name":"eth","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculateEggSell","inputs":[{"type":"uint256","name":"eggs","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEggsSinceLastHatch","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMyEggs","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMyMiners","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"harvestMarket","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"hatchEggs","inputs":[{"type":"address","name":"ref","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"seedMarket","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sellEggs","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
            

Deployed ByteCode

0x6080604052600436106100f35760003560e01c8063715018a61161008a578063a507abee11610059578063a507abee146102ea578063d7c8843b14610327578063db66386514610364578063f2fde38b14610380576100f3565b8063715018a61461022e5780637e56fde5146102455780638da5cb5b146102825780638e316327146102ad576100f3565b80633c5f07cb116100c65780633c5f07cb146101b45780633ec862a8146101be5780634a9dd34a146101e75780634b634b06146101f1576100f3565b806312065fe0146100f857806326fd8422146101235780632ef6a743146101605780633955f0fe1461019d575b600080fd5b34801561010457600080fd5b5061010d6103a9565b60405161011a919061147f565b60405180910390f35b34801561012f57600080fd5b5061014a60048036038101906101459190611380565b6103b1565b604051610157919061147f565b60405180910390f35b34801561016c57600080fd5b5061018760048036038101906101829190611326565b6103c8565b604051610194919061147f565b60405180910390f35b3480156101a957600080fd5b506101b2610422565b005b6101bc6105bb565b005b3480156101ca57600080fd5b506101e560048036038101906101e09190611326565b610688565b005b6101ef610b2b565b005b3480156101fd57600080fd5b5061021860048036038101906102139190611326565b610c32565b604051610225919061147f565b60405180910390f35b34801561023a57600080fd5b50610243610c7b565b005b34801561025157600080fd5b5061026c60048036038101906102679190611353565b610dce565b604051610279919061147f565b60405180910390f35b34801561028e57600080fd5b50610297610de1565b6040516102a49190611424565b60405180910390f35b3480156102b957600080fd5b506102d460048036038101906102cf9190611353565b610e0a565b6040516102e1919061147f565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190611326565b610e20565b60405161031e919061147f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190611326565b610e45565b60405161035b919061147f565b60405180910390f35b61037e60048036038101906103799190611326565b610eef565b005b34801561038c57600080fd5b506103a760048036038101906103a29190611326565b611043565b005b600047905090565b60006103c08383600a546110e4565b905092915050565b600061041b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461041684610e45565b611137565b9050919050565b600560009054906101000a900460ff1661043b57600080fd5b6000610446336103c8565b9050600061045382610e0a565b905060006104608261114d565b90506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506104f7600a5484611137565b600a81905550600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610565573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc61058a848461116c565b9081150290604051600060405180830381858888f193505050501580156105b5573d6000803e3d6000fd5b50505050565b6105c3611182565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610650576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106479061145f565b60405180910390fd5b6000600a541461065f57600080fd5b6001600560006101000a81548160ff0219169083151502179055506419254d3800600a81905550565b600560009054906101000a900460ff166106a157600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106da57600090505b600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561080057503373ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156108845780600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600061088f336103c8565b9050600061089f8260015461118a565b90506108ea600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611137565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a6860076000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a6384600861118a565b611137565b60076000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b20600a54610b1b84600561118a565b611137565b600a81905550505050565b610b33611182565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb79061145f565b60405180910390fd5b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc610c046103a9565b9081150290604051600060405180830381858888f19350505050158015610c2f573d6000803e3d6000fd5b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c83611182565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d079061145f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610dda82476103b1565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610e1982600a54476110e4565b9050919050565b600080610e2c836103c8565b90506000610e3982610e0a565b90508092505050919050565b600080610e9c600154610e9742600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461116c565b6111a0565b9050610ee781600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111b9565b915050919050565b600560009054906101000a900460ff16610f0857600080fd5b6000610f1d34610f18473461116c565b6103b1565b9050610f3181610f2c8361114d565b61116c565b90506000610f3e3461114d565b9050600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa8573d6000803e3d6000fd5b50610ff2600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611137565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061103e83610688565b505050565b61104b611182565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf9061145f565b60405180910390fd5b6110e1816111cf565b50565b600061112e6110f5600254846111b9565b61112960035461112461111e61110d6002548a6111b9565b6111196003548c6111b9565b611137565b8961118a565b611137565b61118a565b90509392505050565b6000818361114591906114ab565b905092915050565b600061116561115e836004546111b9565b606461118a565b9050919050565b6000818361117a919061158c565b905092915050565b600033905090565b600081836111989190611501565b905092915050565b60008183106111af57816111b1565b825b905092915050565b600081836111c79190611532565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561123f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112369061143f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008135905061130b816116d7565b92915050565b600081359050611320816116ee565b92915050565b60006020828403121561133c5761133b61165a565b5b600061134a848285016112fc565b91505092915050565b6000602082840312156113695761136861165a565b5b600061137784828501611311565b91505092915050565b600080604083850312156113975761139661165a565b5b60006113a585828601611311565b92505060206113b685828601611311565b9150509250929050565b6113c9816115c0565b82525050565b60006113dc60268361149a565b91506113e78261165f565b604082019050919050565b60006113ff60208361149a565b915061140a826116ae565b602082019050919050565b61141e816115f2565b82525050565b600060208201905061143960008301846113c0565b92915050565b60006020820190508181036000830152611458816113cf565b9050919050565b60006020820190508181036000830152611478816113f2565b9050919050565b60006020820190506114946000830184611415565b92915050565b600082825260208201905092915050565b60006114b6826115f2565b91506114c1836115f2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156114f6576114f56115fc565b5b828201905092915050565b600061150c826115f2565b9150611517836115f2565b9250826115275761152661162b565b5b828204905092915050565b600061153d826115f2565b9150611548836115f2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611581576115806115fc565b5b828202905092915050565b6000611597826115f2565b91506115a2836115f2565b9250828210156115b5576115b46115fc565b5b828203905092915050565b60006115cb826115d2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6116e0816115c0565b81146116eb57600080fd5b50565b6116f7816115f2565b811461170257600080fd5b5056fea26469706673582212202f2c877fe7b9434b3c956c6c2742e85f45aebbc4767b122c78cfeba5b84766a764736f6c63430008070033