false
false

Contract Address Details

0x5Bb3895D4faC7Ce3AfBb163A9e0a9364aa7AA07d

Token
kcc.guru/GRAIN/3201 (GRAIN#3201)
Creator
0x167d87–2ee584 at 0x689023–8e29c3
Balance
0 KCS
Tokens
Fetching tokens...
Transactions
34 Transactions
Transfers
298 Transfers
Gas Used
20,580,676
Last Balance Update
47822489
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x974822c6fd06709709fbf880d29352ef19a7cf88.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
Granary




Optimization enabled
false
Compiler version
v0.7.6+commit.7338295f




Verified at
2022-01-17T03:37:27.387462Z

Contract source code

/*

KK   KK   CCCCC   CCCCC       GGGGG  U    U  RRRRR     U    U
KK KKK   CC      CC          G       U    U  RR   R    U    U
KKKK     CC      CC         G  GGG   U    U  RRRRR     U    U
KK KK    CC      CC      O  G    G   U    U  RR R      U    U
KK  KKK  CCCCCC  CCCCCC      GGGGG    UUUU   RR  RRR    UUUU


FFFFF  TTTTTTT  M   M         GGGGG  U    U  RRRRR     U    U
FF       TTT   M M M M       G       U    U  RR   R    U    U
FFFFF    TTT   M  M  M      G  GGG   U    U  RRRRR     U    U
FF       TTT   M     M   O  G    G   U    U  RR R      U    U
FF       TTT   M     M       GGGGG    UUUU   RR  RRR    UUUU




					*************************
					**                     **
					**  GRANARY & WORKERS  **
					**    ftm.guru/GRAIN   **
					**  kcc.guru/kompound  **
					**                     **
					*************************


Create a farm & vault for your own projects for free with ftm.guru

            			Contact us at:
			https://discord.com/invite/QpyfMarNrV
        			https://t.me/FTM1337

*/
/*
	- KOMPOUND PROTOCOL -
    https://kcc.guru/kompound
    - GRANARY & WORKERS -
    https://ftm.guru/GRAIN

    Yield Compounding Service
    Created by Guru Network

    Community Mediums:
        https://discord.com/invite/QpyfMarNrV
        https://medium.com/@ftm1337
        https://twitter.com/ftm1337
        https://twitter.com/kucino
        https://t.me/ftm1337
        https://t.me/kccguru
    Other Products:
        KUCINO CASINO - The First and Most used Casino of KCC
        fmc.guru - FantomMarketCap : On-Chain Data Aggregator
        ELITE - ftm.guru is an indie growth-hacker for Fantom
*/
/*

		FREQUENTLY ASKED QUESTIONS


	Q.1	WHY USE THIS VAULT?
	Ans	Most of the popular vaults' owners can switch "strategy" and steal (a.k.a. hard-rug) your valuable assets.
		Granaries or Kompound Protocol cannot change its own behaviour or strategy once its deployed on-chain.
		Our code uses unchangeable constants for tokens and external contracts. All fees & incentives are capped.
			Unlike the other (you-know-who) famous vaults.


	Q.2 WHAT IS ELITENESS?
	Ans	Simply holding ELITE (ftm.guru) token in your wallet ascribes you Eliteness.
		It is required to earn worker incentives from this Granary.
		Deposits incur nil fee if the user posseses adequate eliteness.
		 	ELITE has a fixed supply of 250.


*/
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.6;
pragma abicoder v2;

//ftm.guru's Universal On-chain TVL Calculator
//Source: https://ftm.guru/rawdata/tvl
interface ITVL {
	//Using Version = 6
	function p_lpt_coin_usd(address lp) external view returns(uint256);
}

interface IMasterchef {
	// Info of each pool.
	struct PoolInfo {
	    address lpToken; // Address of LP token contract.
	    uint256 allocPoint; // How many allocation points assigned to this pool. KUSs to distribute per block.
	    uint256 lastRewardBlock; // Last block number that KUSs distribution occurs.
	    uint256 accKUSPerShare; // Accumulated KUSs per share, times 1e12. See below.
	}
	// Info of each user.
	struct UserInfo {
		uint256 amount; // How many LP tokens the user has provided.
		uint256 rewardDebt; // Reward debt.
	}

	function deposit(uint256 _pid, uint256 _amount) external;

	function withdraw(uint256 _pid, uint256 _amount) external;

	function emergencyWithdraw(uint256 _pid) external;

	function userInfo(uint256, address) external view returns (UserInfo memory);

	function poolInfo(uint256) external view returns (PoolInfo memory);

	function totalAllocPoint() external view returns (uint256);

	function pendingKUS(uint256 _pid, address _user) external view returns (uint256);
}
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);
	//Uniswap-style Pair (LPT)

	function getReserves() external view returns (uint112, uint112, uint32);
}
interface IRouter {

	function swapExactTokensForTokensSupportingFeeOnTransferTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external;

	function addLiquidity(
		address tokenA,
		address tokenB,
		uint amountADesired,
		uint amountBDesired,
		uint amountAMin,
		uint amountBMin,
		address to,
		uint deadline
	) external returns (uint amountA, uint amountB, uint liquidity);
}
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;
	}
}




contract Granary
{
	using SafeMath for uint256;

	constructor (address _w, address _m, address _e, uint8 _p, address _R, address[] memory _rA, address[] memory _rB, string memory _id, address _v)
	{
		want=IERC20(_w);
		mc=IMasterchef(_m);
		earn=IERC20(_e);
		allnums[0]=_p;	//pid
		router = _R;
		routeA = _rA;
		routeB = _rB;
		id=_id;//GRAIN#ID
		utvl=_v;
		//Approvals
		//mc to take what it may want
		IERC20(address(want)).approve(address(mc),uint256(-1));
		//router to sell what we earn
		IERC20(address(earn)).approve(address(router),uint256(-1));
        //router to add routeA[routeA.length-1]
		IERC20(_rA[_rA.length-1]).approve(address(router),uint256(-1));
		//router to add routeB[routeB.length-1]
		IERC20(_rB[_rB.length-1]).approve(address(router),uint256(-1));
		dao = 0x167D87A906dA361A10061fe42bbe89451c2EE584;
		treasury = dao;
	}
	modifier DAO {require(msg.sender==dao,"Only E.L.I.T.E. D.A.O. Treasury can rescue treasures!");_;}
	struct Elites {
		address ELITE;
		uint256 ELITES;
	}
	Elites[] public Eliteness;

	function pushElite(address elite, uint256 elites) public DAO {
        Eliteness.push(Elites({ELITE:elite,ELITES:elites}));
    }

	function pullElite(uint256 n) public DAO {
        Eliteness[n]=Eliteness[Eliteness.length-1];Eliteness.pop();
    }
	//@xref takeFee=eliteness(msg.sender)?false:true;

	function eliteness(address u) public view returns(bool)
	{
		if(Eliteness.length==0){return(true);}//When nobody is an Elite, everyone is an Elite.
		for(uint i;i<Eliteness.length;i++){
			if(IERC20(Eliteness[i].ELITE).balanceOf(u)>=Eliteness[i].ELITES)
			{
				return(true);
			}
		}
		return(false);
	}

	function config(//address _w,
		uint256 _mw, uint256 _wi, uint256 _pf, address _t, uint256 _df) public DAO
	{
		allnums[4] = _mw;
		treasury = _t;
		//Max 10%, 1e6 = 100%
		require(_wi<1e5,"!wi: high");allnums[3] = _wi;
		require(_pf<1e5,"!pf: high");allnums[2] = _pf;
		require(_df<1e5,"!df: high");allnums[1] = _df;
	}
	uint8 RG = 0;
	modifier rg {
		require(RG == 0,"!RG");
		RG = 1;
		_;
		RG = 0;
	}

	function isContract(address account) internal view returns (bool)
	{
		bytes32 codehash;
		bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
		assembly { codehash := extcodehash(account) }
		return (codehash != accountHash && codehash != 0x0);
	}
	//Using getter functions to circumvent "Stack too deep!" errors
	string public id;
	/*
	string public name;
	string public symbol;
	uint8  public decimals = 18;
	*/
	function name() public view returns(string memory){return(string(abi.encodePacked("kcc.guru/GRAIN/", id)));}
	function symbol() public view returns(string memory){return(string(abi.encodePacked("GRAIN#", id)));}
	function decimals() public pure returns(uint256){return(18);}

	uint256 public totalSupply;
	IERC20 public want;
	IERC20 public earn;
	address public router;
	address[] public routeA;
	address[] public routeB;
	IMasterchef public mc;
	bool public emergency = false;
	address public dao;
	address public treasury;
	address public utvl;
	/*
	uint8 public pid;
	uint256 public df = 1e3;//deposit fee = 0.1%, 1e6=100%
	uint256 public pf = 1e4;//performance fee to treasury, paid from profits = 1%, 1e6=100%
	uint256 public wi = 1e4;//worker incentive, paid from profits = 1%, 1e6=100%
	uint256 public mw;//Minimum earnings to reinvest
	uint64[2] ct;//Timestamp of first & latest Kompound
	*/
	//Using array to avoid "Stack too deep!" errors
	uint256[7] public allnums = [
		0,	//pid		0       constant
		1e3,//df		1       config, <= 10% (1e5), default 0.1%
		1e4,//pf		2       config, <= 10% (1e5), default 1%
		1e4,//wi		3       config, <= 10% (1e5), default 1%
		1,	//mw		4       config, default 1 (near zero)
		0,	//ct[0]		5       nonce, then constant
		0	//ct[1]		6       up only
	];
	event  Approval(address indexed src, address indexed guy, uint wad);
	event  Transfer(address indexed src, address indexed dst, uint wad);
	mapping (address => uint) public  balanceOf;
	mapping (address => mapping (address => uint)) public  allowance;

	function approve(address guy) public returns (bool) {
		return approve(guy, uint(-1));
	}

	function approve(address guy, uint wad) public returns (bool) {
		allowance[msg.sender][guy] = wad;
		emit Approval(msg.sender, guy, wad);
		return true;
	}

	function transfer(address dst, uint wad) public returns (bool) {
		return transferFrom(msg.sender, dst, wad);
	}

	function transferFrom(address src, address dst, uint wad) public returns (bool)
	{
		require(balanceOf[src] >= wad,"Insufficient Balance");
		if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
			require(allowance[src][msg.sender] >= wad);
			allowance[src][msg.sender] -= wad;
		}
		balanceOf[src] -= wad;
		balanceOf[dst] += wad;
		emit Transfer(src, dst, wad);
		return true;
	}
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event Compounded(address indexed user, uint256 amount);

	function deposit(uint256 _amt) public rg
	{
		require(!emergency,"Its an emergency. Please don't deposit.");
		//Some fancy math to take care of Fee-on-Transfer tokens
		uint256 vbb = want.balanceOf(address(this));
		uint256 mcbb = mc.userInfo(allnums[0],address(this)).amount;
		require(want.transferFrom(msg.sender,address(this),_amt), "Unable to onboard");
		uint256 vba = want.balanceOf(address(this));
		uint256 D = vba.sub(vbb,"Dirty deposit");
		mc.deposit(allnums[0],D);
		//Some more fancy math to take care of Deposit Fee
		uint256 mcba = mc.userInfo(allnums[0],address(this)).amount;
		uint256 M = mcba.sub(mcbb,"Dirty stake");
		//require(M>mindep,"Deposit Too Low");
		uint256 _mint = 0;
		(totalSupply > 0)
			// k: SharePerDeposit should be constant before & after
			// Mint = SharesPerDeposit * IncreaseInDeposit
			// bal += (totalSupply / oldDeposits) * thisDeposit
			?	_mint = ( M.mul(totalSupply) ).div(mcbb)
			:	_mint = M;
		totalSupply += _mint;
		uint256 _fee;
		//allnums[1]===df, deposit fee
		if(allnums[1]>0){_fee = eliteness(msg.sender)? 0 : (_mint.mul(allnums[1])).div(1e6);}//gas savings
		if(_fee>0)//gas savings
		{
			balanceOf[treasury] += _fee;
			emit Transfer(address(0), treasury, _fee);
		}
		balanceOf[msg.sender] += _mint.sub(_fee);
		emit Transfer(address(0), msg.sender, _mint.sub(_fee));
		//hardWork()
		//allnums[4]===mw, min work : smallest harvest
		if(earn.balanceOf(address(this)) > allnums[4]) {work(address(this));}
	}

	function withdraw(uint256 _amt) public rg
	{
		require(!emergency,"Its an emergency. Use emergencyWithdraw() please.");
		require(balanceOf[msg.sender] >= _amt,"Insufficient Balance");
		//Burn _amt of Vault Tokens
		balanceOf[msg.sender] -= _amt;
		uint256 ts = totalSupply;
		totalSupply -= _amt;
		emit Transfer(msg.sender, address(0), _amt);
		uint256 vbb = want.balanceOf(address(this));
		uint256 mcbb = mc.userInfo(allnums[0],address(this)).amount;
		// W  = DepositsPerShare * SharesBurnt
		uint256 W = ( _amt.mul(mcbb) ).div(ts);
		mc.withdraw(allnums[0],W);
		uint256 vba = want.balanceOf(address(this));
		uint256 D = vba.sub(vbb,"Dirty withdrawal");
	   	require(want.transfer(msg.sender,D), "Unable to deboard");
	   	//hardWork()
		if(earn.balanceOf(address(this)) > allnums[4]) {work(address(this));}
	}

	function doHardWork() public rg
	{
		require(eliteness(msg.sender),"Elites only!");
		salvage();
		require(earn.balanceOf(address(this)) > allnums[4], "Not much work to do!");
		work(msg.sender);
	}

	function salvage() public
	{
		//harvest()
		mc.withdraw(allnums[0],0);
	}

	function work(address ben) internal
	{
		require(!emergency,"Its an emergency. Use emergencyWithdraw() please.");
		//has inputs from salvage() if this work is done via doHardWork()
		IRouter R = IRouter(router);
		IERC20 A = IERC20(routeA[routeA.length-1]);
		IERC20 B = IERC20(routeB[routeB.length-1]);
		uint256 vbb = (earn.balanceOf(address(this))).div(2);
		R.swapExactTokensForTokensSupportingFeeOnTransferTokens(vbb,1,routeA,address(this),block.timestamp);
		R.swapExactTokensForTokensSupportingFeeOnTransferTokens(vbb,1,routeB,address(this),block.timestamp);
		R.addLiquidity(
			address(A),
			address(B),
			A.balanceOf(address(this)),
			B.balanceOf(address(this)),
			(A.balanceOf(address(this)).mul(90).div(100)),
			(B.balanceOf(address(this)).mul(90).div(100)),
			address(this),
			block.timestamp
		);
		uint256 D = want.balanceOf(address(this));
		uint256 mcbb = mc.userInfo(allnums[0],address(this)).amount;
		mc.deposit(allnums[0],D);
		uint256 mcba = mc.userInfo(allnums[0],address(this)).amount;
		uint256 M = mcba.sub(mcbb,"Dirty stake");
		//Performance Fee Mint, conserves TVL
		uint256 _mint = 0;
		//allnums[5] & allnums[6] are First & Latest Compound's timestamps. Used in info() for APY of AUM.
		if(allnums[5]==0){allnums[5]=uint64(block.timestamp);}//only on the first run
		allnums[6]=uint64(block.timestamp);
		(totalSupply > 0)
			// k: SharePerDeposit should be constant before & after
			// Mint = SharesPerDeposit * IncreaseInDeposit
			// bal += (totalSupply / oldDeposits) * thisDeposit
			?	_mint = ( M.mul(totalSupply) ).div(mcbb)
			:	_mint = M;
		//allnums[2] === pf, Performance Fee
		balanceOf[treasury] += (_mint.mul(allnums[2])).div(1e6);
		//Worker Incentive Mint, conserves TVL
		address worker = ben == address(this) ? treasury : ben;
		//allnums[3] === wi, Worker Incentive
		balanceOf[worker] += (_mint.mul(allnums[3])).div(1e6);
		totalSupply += ((_mint.mul(allnums[2])).div(1e6)).add( (_mint.mul(allnums[3])).div(1e6) );
		emit Transfer(address(0), treasury, (_mint.mul(allnums[2])).div(1e6));
		emit Transfer(address(0), worker, (_mint.mul(allnums[3])).div(1e6));
	}




	function declareEmergency() public DAO
	{
		require(!emergency,"Emergency already declared.");
		mc.emergencyWithdraw(allnums[0]);
		emergency=true;
	}

	function revokeEmergency() public DAO
	{
		require(emergency,"Emergency not declared.");
		uint256 D = want.balanceOf(address(this));
		mc.deposit(allnums[0],D);
		emergency=false;
	}

	function emergencyWithdraw(uint256 _amt) public rg
	{
		require(emergency,"Its not an emergency. Use withdraw() instead.");
		require(balanceOf[msg.sender] >= _amt,"Insufficient Balance");
		uint256 ts = totalSupply;
		//Burn _amt of Vault Tokens
		balanceOf[msg.sender] -= _amt;
		totalSupply -= _amt;
		emit Transfer(msg.sender, address(0), _amt);
		uint256 vbb = want.balanceOf(address(this));
		uint256 W = ( _amt.mul(vbb) ).div(ts);
	   	require(want.transfer(msg.sender,W), "Unable to deboard");
	}




	function rescue(address tokenAddress, uint256 tokens) public DAO returns (bool success)
	{
		//Generally, there are not supposed to be any tokens in this contract itself:
		//Upon Deposits, the assets go from User to the MasterChef of Strategy,
		//Upon Withdrawals, the assets go from MasterChef of Strategy to the User, and
		//Upon HardWork, the harvest is reconverted to want and sent to MasterChef of Strategy.
		//Never allow draining main "want" token from the Granary:
		//Main token can only be withdrawn using the EmergencyWithdraw
		require(tokenAddress != address(want), "Funds are Safu in emergency!");
		if(tokenAddress==address(0)) {(success, ) = dao.call{value:tokens}("");return success;}
		else if(tokenAddress!=address(0)) {return IERC20(tokenAddress).transfer(dao, tokens);}
		else return false;
	}

	//Read-Only Functions
	//Useful for performance analysis
	function info() public view returns (uint256, uint256, uint256, IMasterchef.UserInfo memory, IMasterchef.PoolInfo memory, uint256, uint256)
	{
		uint256 aum = mc.userInfo(allnums[0],address(this)).amount + IERC20(want).balanceOf(address(this));
		uint256 roi = aum*1e18/totalSupply;//ROI: 1e18 === 1x
		uint256 apy = ((roi-1e18)*(365*86400)*100)/(allnums[6]-allnums[5]);//APY: 1e18 === 1%
		return(
			aum,
			roi,
			apy,
			mc.userInfo(allnums[0],address(this)),
            mc.poolInfo(allnums[0]),
			mc.totalAllocPoint(),
			mc.pendingKUS(allnums[0],address(this))
		);
	}

	//TVL in USD, 1e18===$1.
	//Source code Derived from ftm.guru's Universal On-chain TVL Calculator: https://ftm.guru/rawdata/tvl
	function tvl() public view returns(uint256)
	{
		ITVL tc = ITVL(utvl);
		uint256 aum = mc.userInfo(allnums[0],address(this)).amount + IERC20(want).balanceOf(address(this));
		return ((tc.p_lpt_coin_usd(address(want))).mul(aum)).div(1e18);
	}

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_w","internalType":"address"},{"type":"address","name":"_m","internalType":"address"},{"type":"address","name":"_e","internalType":"address"},{"type":"uint8","name":"_p","internalType":"uint8"},{"type":"address","name":"_R","internalType":"address"},{"type":"address[]","name":"_rA","internalType":"address[]"},{"type":"address[]","name":"_rB","internalType":"address[]"},{"type":"string","name":"_id","internalType":"string"},{"type":"address","name":"_v","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"src","internalType":"address","indexed":true},{"type":"address","name":"guy","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Compounded","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"src","internalType":"address","indexed":true},{"type":"address","name":"dst","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawn","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"ELITE","internalType":"address"},{"type":"uint256","name":"ELITES","internalType":"uint256"}],"name":"Eliteness","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allnums","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"guy","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"guy","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"config","inputs":[{"type":"uint256","name":"_mw","internalType":"uint256"},{"type":"uint256","name":"_wi","internalType":"uint256"},{"type":"uint256","name":"_pf","internalType":"uint256"},{"type":"address","name":"_t","internalType":"address"},{"type":"uint256","name":"_df","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"dao","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"declareEmergency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"doHardWork","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"earn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"eliteness","inputs":[{"type":"address","name":"u","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"emergency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"id","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"tuple","name":"","internalType":"struct IMasterchef.UserInfo","components":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardDebt","internalType":"uint256"}]},{"type":"tuple","name":"","internalType":"struct IMasterchef.PoolInfo","components":[{"type":"address","name":"lpToken","internalType":"address"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"lastRewardBlock","internalType":"uint256"},{"type":"uint256","name":"accKUSPerShare","internalType":"uint256"}]},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"info","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterchef"}],"name":"mc","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pullElite","inputs":[{"type":"uint256","name":"n","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pushElite","inputs":[{"type":"address","name":"elite","internalType":"address"},{"type":"uint256","name":"elites","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"rescue","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeEmergency","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"routeA","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"routeB","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"salvage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"src","internalType":"address"},{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"utvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"want","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]}]
              

Contract Creation Code

Verify & Publish
0x60806040526000600160006101000a81548160ff021916908360ff1602179055506000600960146101000a81548160ff0219169083151502179055506040518060e00160405280600061ffff1681526020016103e861ffff16815260200161271061ffff16815260200161271061ffff168152602001600161ffff168152602001600061ffff168152602001600061ffff16815250600d906007620000a692919062000715565b50348015620000b457600080fd5b5060405162006a9238038062006a928339818101604052810190620000da9190620009fe565b88600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600d600060078110620001b057fe5b018190555084600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600790805190602001906200020e92919062000760565b5082600890805190602001906200022792919062000760565b50816002908051906020019062000240929190620007ef565b5080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200032392919062000b70565b602060405180830381600087803b1580156200033e57600080fd5b505af115801562000353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000379919062000b22565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200041b92919062000b70565b602060405180830381600087803b1580156200043657600080fd5b505af11580156200044b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000471919062000b22565b50836001855103815181106200048357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200050992919062000b70565b602060405180830381600087803b1580156200052457600080fd5b505af115801562000539573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200055f919062000b22565b50826001845103815181106200057157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620005f792919062000b70565b602060405180830381600087803b1580156200061257600080fd5b505af115801562000627573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200064d919062000b22565b5073167d87a906da361a10061fe42bbe89451c2ee584600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505062000d10565b82600781019282156200074d579160200282015b828111156200074c578251829061ffff1690559160200191906001019062000729565b5b5090506200075c919062000886565b5090565b828054828255906000526020600020908101928215620007dc579160200282015b82811115620007db5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000781565b5b509050620007eb919062000886565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000827576000855562000873565b82601f106200084257805160ff191683800117855562000873565b8280016001018555821562000873579182015b828111156200087257825182559160200191906001019062000855565b5b50905062000882919062000886565b5090565b5b80821115620008a157600081600090555060010162000887565b5090565b6000620008bc620008b68462000bd1565b62000b9d565b90508083825260208201905082856020860282011115620008dc57600080fd5b60005b85811015620009105781620008f588826200095f565b845260208401935060208301925050600181019050620008df565b5050509392505050565b6000620009316200092b8462000c00565b62000b9d565b9050828152602081018484840111156200094a57600080fd5b6200095784828562000c8a565b509392505050565b600081519050620009708162000cc2565b92915050565b600082601f8301126200098857600080fd5b81516200099a848260208601620008a5565b91505092915050565b600081519050620009b48162000cdc565b92915050565b600082601f830112620009cc57600080fd5b8151620009de8482602086016200091a565b91505092915050565b600081519050620009f88162000cf6565b92915050565b60008060008060008060008060006101208a8c03121562000a1e57600080fd5b600062000a2e8c828d016200095f565b995050602062000a418c828d016200095f565b985050604062000a548c828d016200095f565b975050606062000a678c828d01620009e7565b965050608062000a7a8c828d016200095f565b95505060a08a015167ffffffffffffffff81111562000a9857600080fd5b62000aa68c828d0162000976565b94505060c08a015167ffffffffffffffff81111562000ac457600080fd5b62000ad28c828d0162000976565b93505060e08a015167ffffffffffffffff81111562000af057600080fd5b62000afe8c828d01620009ba565b92505061010062000b128c828d016200095f565b9150509295985092959850929598565b60006020828403121562000b3557600080fd5b600062000b4584828501620009a3565b91505092915050565b62000b598162000c33565b82525050565b62000b6a8162000c73565b82525050565b600060408201905062000b87600083018562000b4e565b62000b96602083018462000b5f565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171562000bc75762000bc662000cc0565b5b8060405250919050565b600067ffffffffffffffff82111562000bef5762000bee62000cc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000c1e5762000c1d62000cc0565b5b601f19601f8301169050602081019050919050565b600062000c408262000c53565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000caa57808201518184015260208101905062000c8d565b8381111562000cba576000848401525b50505050565bfe5b62000ccd8162000c33565b811462000cd957600080fd5b50565b62000ce78162000c47565b811462000cf357600080fd5b50565b62000d018162000c7d565b811462000d0d57600080fd5b50565b615d728062000d206000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80635312ea8e11610130578063af640d0f116100b8578063daea85c51161007c578063daea85c51461064d578063dd62ed3e1461067d578063e5328e06146106ad578063ef1b8140146106cb578063f887ea40146106e757610227565b8063af640d0f146105b9578063b6b55f25146105d7578063caa6fea4146105f3578063cb7956b014610611578063d389800f1461062f57610227565b80637919b71b116100ff5780637919b71b146104db5780637a4e4ecf1461050b5780638ed5f3731461053b57806395d89b411461056b578063a9059cbb1461058957610227565b80635312ea8e1461045557806361d027b314610471578063685c8ca51461048f57806370a08231146104ab57610227565b806327d9cf44116101b3578063370158ea11610182578063370158ea146103bd5780633d456f43146103e15780634162169f146104115780634b292cae1461042f5780634fa5d8541461044b57610227565b806327d9cf441461035b5780632e1a7d4d14610379578063313ce5671461039557806331e244e5146103b357610227565b80631e534906116101fa5780631e534906146102c95780631f1fcd51146102d357806323b872dd146102f157806323e1d0e81461032157806324aa95ec1461035157610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461027a5780631b5f9c4214610298575b600080fd5b610234610705565b60405161024191906156f3565b60405180910390f35b610264600480360381019061025f9190614b22565b61072d565b60405161027191906156a2565b60405180910390f35b61028261081f565b60405161028f9190615955565b60405180910390f35b6102b260048036038101906102ad9190614bd9565b610825565b6040516102c0929190615679565b60405180910390f35b6102d1610879565b005b6102db61091a565b6040516102e891906156bd565b60405180910390f35b61030b60048036038101906103069190614ad3565b610940565b60405161031891906156a2565b60405180910390f35b61033b60048036038101906103369190614bd9565b610cbf565b6040516103489190615955565b60405180910390f35b610359610cda565b005b610363610f24565b6040516103709190615580565b60405180910390f35b610393600480360381019061038e9190614bd9565b610f4a565b005b61039d61166a565b6040516103aa9190615955565b60405180910390f35b6103bb611673565b005b6103c561180c565b6040516103d89796959493929190615a45565b60405180910390f35b6103fb60048036038101906103f69190614bd9565b611cdc565b6040516104089190615580565b60405180910390f35b610419611d1b565b6040516104269190615580565b60405180910390f35b61044960048036038101906104449190614c7a565b611d41565b005b610453611f38565b005b61046f600480360381019061046a9190614bd9565b61211a565b005b61047961250d565b6040516104869190615580565b60405180910390f35b6104a960048036038101906104a49190614b22565b612533565b005b6104c560048036038101906104c09190614a6e565b612670565b6040516104d29190615955565b60405180910390f35b6104f560048036038101906104f09190614bd9565b612688565b6040516105029190615580565b60405180910390f35b61052560048036038101906105209190614b22565b6126c7565b60405161053291906156a2565b60405180910390f35b61055560048036038101906105509190614a6e565b6129a7565b60405161056291906156a2565b60405180910390f35b610573612adc565b60405161058091906156f3565b60405180910390f35b6105a3600480360381019061059e9190614b22565b612b04565b6040516105b091906156a2565b60405180910390f35b6105c1612b19565b6040516105ce91906156f3565b60405180910390f35b6105f160048036038101906105ec9190614bd9565b612bb7565b005b6105fb613507565b60405161060891906156a2565b60405180910390f35b61061961351a565b60405161062691906156d8565b60405180910390f35b610637613540565b60405161064491906156bd565b60405180910390f35b61066760048036038101906106629190614a6e565b613566565b60405161067491906156a2565b60405180910390f35b61069760048036038101906106929190614a97565b613599565b6040516106a49190615955565b60405180910390f35b6106b56135be565b6040516106c29190615955565b60405180910390f35b6106e560048036038101906106e09190614bd9565b613833565b005b6106ef6139cb565b6040516106fc9190615580565b60405180910390f35b606060026040516020016107199190615527565b604051602081830303815290604052905090565b600081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161080d9190615955565b60405180910390a36001905092915050565b60035481565b6000818154811061083557600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d6000600781106108c557fe5b015460006040518363ffffffff1660e01b81526004016108e6929190615999565b600060405180830381600087803b15801561090057600080fd5b505af1158015610914573d6000803e3d6000fd5b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb906158b5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610a9c57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610bb55781601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b2a57600080fd5b81601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cac9190615955565b60405180910390a3600190509392505050565b600d8160078110610ccf57600080fd5b016000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d61906158d5565b60405180910390fd5b600960149054906101000a900460ff16610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db090615875565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e169190615580565b60206040518083038186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e669190614c02565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600d600060078110610eb457fe5b0154836040518363ffffffff1660e01b8152600401610ed4929190615a1c565b600060405180830381600087803b158015610eee57600080fd5b505af1158015610f02573d6000803e3d6000fd5b505050506000600960146101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff1660ff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff161561100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190615815565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906158b5565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600354905081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161114e9190615955565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111b39190615580565b60206040518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112039190614c02565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061125357fe5b0154306040518363ffffffff1660e01b8152600401611273929190615970565b604080518083038186803b15801561128a57600080fd5b505afa15801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190614bb0565b60000151905060006112ef846112e184886139f190919063ffffffff16565b613a6190919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d60006007811061133d57fe5b0154836040518363ffffffff1660e01b815260040161135d929190615a1c565b600060405180830381600087803b15801561137757600080fd5b505af115801561138b573d6000803e3d6000fd5b505050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113ec9190615580565b60206040518083038186803b15801561140457600080fd5b505afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190614c02565b9050600061148a856040518060400160405280601081526020017f4469727479207769746864726177616c0000000000000000000000000000000081525084613aab9092919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114e99291906155d2565b602060405180830381600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b9190614b5e565b61157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157190615915565b60405180910390fd5b600d60046007811061158857fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115e59190615580565b60206040518083038186803b1580156115fd57600080fd5b505afa158015611611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116359190614c02565b11156116455761164430613b06565b5b5050505050506000600160006101000a81548160ff021916908360ff16021790555050565b60006012905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906158d5565b60405180910390fd5b600960149054906101000a900460ff1615611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906157b5565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635312ea8e600d60006007811061179f57fe5b01546040518263ffffffff1660e01b81526004016117bd9190615955565b600060405180830381600087803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b505050506001600960146101000a81548160ff021916908315150217905550565b60008060006118196148ed565b611821614907565b6000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118819190615580565b60206040518083038186803b15801561189957600080fd5b505afa1580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d19190614c02565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061191d57fe5b0154306040518363ffffffff1660e01b815260040161193d929190615970565b604080518083038186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190614bb0565b600001510190506000600354670de0b6b3a76400008302816119aa57fe5b0490506000600d6005600781106119bd57fe5b0154600d6006600781106119cd57fe5b01540360646301e13380670de0b6b3a764000085030202816119eb57fe5b049050828282600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110611a3d57fe5b0154306040518363ffffffff1660e01b8152600401611a5d929190615970565b604080518083038186803b158015611a7457600080fd5b505afa158015611a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aac9190614bb0565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631526fe27600d600060078110611af857fe5b01546040518263ffffffff1660e01b8152600401611b169190615955565b60806040518083038186803b158015611b2e57600080fd5b505afa158015611b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b669190614b87565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611bce57600080fd5b505afa158015611be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c069190614c02565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eba0a1da600d600060078110611c5257fe5b0154306040518363ffffffff1660e01b8152600401611c72929190615970565b60206040518083038186803b158015611c8a57600080fd5b505afa158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614c02565b995099509950995099509950995050505090919293949596565b60088181548110611cec57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc8906158d5565b60405180910390fd5b84600d600460078110611de057fe5b018190555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620186a08410611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e62906157d5565b60405180910390fd5b83600d600360078110611e7a57fe5b0181905550620186a08310611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb90615855565b60405180910390fd5b82600d600260078110611ed357fe5b0181905550620186a08110611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f14906157f5565b60405180910390fd5b80600d600160078110611f2c57fe5b01819055505050505050565b6000600160009054906101000a900460ff1660ff1614611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8490615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550611fb1336129a7565b611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790615935565b60405180910390fd5b611ff8610879565b600d60046007811061200657fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120639190615580565b60206040518083038186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b39190614c02565b116120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90615715565b60405180910390fd5b6120fc33613b06565b6000600160006101000a81548160ff021916908360ff160217905550565b6000600160009054906101000a900460ff1660ff161461216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff166121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090615895565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561225b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612252906158b5565b60405180910390fd5b6000600354905081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161231d9190615955565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123829190615580565b60206040518083038186803b15801561239a57600080fd5b505afa1580156123ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d29190614c02565b905060006123fb836123ed84876139f190919063ffffffff16565b613a6190919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161245a9291906155d2565b602060405180830381600087803b15801561247457600080fd5b505af1158015612488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ac9190614b5e565b6124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290615915565b60405180910390fd5b5050506000600160006101000a81548160ff021916908360ff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba906158d5565b60405180910390fd5b600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b60146020528060005260406000206000915090505481565b6007818154811061269857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612759576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612750906158d5565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e1906158f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b257600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516128659061556b565b60006040518083038185875af1925050503d80600081146128a2576040519150601f19603f3d011682016040523d82523d6000602084013e6128a7565b606091505b5050809150506129a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461299c578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612943929190615679565b602060405180830381600087803b15801561295d57600080fd5b505af1158015612971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129959190614b5e565b90506129a1565b600090505b92915050565b60008060008054905014156129bf5760019050612ad7565b60005b600080549050811015612ad157600081815481106129dc57fe5b906000526020600020906002020160010154600082815481106129fb57fe5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612a659190615580565b60206040518083038186803b158015612a7d57600080fd5b505afa158015612a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab59190614c02565b10612ac4576001915050612ad7565b80806001019150506129c2565b50600090505b919050565b60606002604051602001612af09190615549565b604051602081830303815290604052905090565b6000612b11338484610940565b905092915050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612baf5780601f10612b8457610100808354040283529160200191612baf565b820191906000526020600020905b815481529060010190602001808311612b9257829003601f168201915b505050505081565b6000600160009054906101000a900460ff1660ff1614612c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0390615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff1615612c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6e90615775565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612cd49190615580565b60206040518083038186803b158015612cec57600080fd5b505afa158015612d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d249190614c02565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110612d7457fe5b0154306040518363ffffffff1660e01b8152600401612d94929190615970565b604080518083038186803b158015612dab57600080fd5b505afa158015612dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de39190614bb0565b600001519050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612e489392919061559b565b602060405180830381600087803b158015612e6257600080fd5b505af1158015612e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9a9190614b5e565b612ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed090615795565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f369190615580565b60206040518083038186803b158015612f4e57600080fd5b505afa158015612f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f869190614c02565b90506000612fd4846040518060400160405280600d81526020017f4469727479206465706f7369740000000000000000000000000000000000000081525084613aab9092919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600d60006007811061302257fe5b0154836040518363ffffffff1660e01b8152600401613042929190615a1c565b600060405180830381600087803b15801561305c57600080fd5b505af1158015613070573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106130c257fe5b0154306040518363ffffffff1660e01b81526004016130e2929190615970565b604080518083038186803b1580156130f957600080fd5b505afa15801561310d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131319190614bb0565b6000015190506000613183856040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613aab9092919063ffffffff16565b90506000806003541161319957819050806131c4565b6131c0866131b2600354856139f190919063ffffffff16565b613a6190919063ffffffff16565b9050805b5080600360008282540192505081905550600080600d6001600781106131e657fe5b0154111561323d576131f7336129a7565b61323757613232620f4240613224600d60016007811061321357fe5b0154856139f190919063ffffffff16565b613a6190919063ffffffff16565b61323a565b60005b90505b600081111561333e578060146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133359190615955565b60405180910390a35b61335181836147ed90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61340084866147ed90919063ffffffff16565b60405161340d9190615955565b60405180910390a3600d60046007811061342357fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016134809190615580565b60206040518083038186803b15801561349857600080fd5b505afa1580156134ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d09190614c02565b11156134e0576134df30613b06565b5b50505050505050506000600160006101000a81548160ff021916908360ff16021790555050565b600960149054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000613592827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61072d565b9050919050565b6015602052816000526040600020602052806000526040600020600091509150505481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016136439190615580565b60206040518083038186803b15801561365b57600080fd5b505afa15801561366f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136939190614c02565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106136df57fe5b0154306040518363ffffffff1660e01b81526004016136ff929190615970565b604080518083038186803b15801561371657600080fd5b505afa15801561372a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374e9190614bb0565b6000015101905061382c670de0b6b3a764000061381e838573ffffffffffffffffffffffffffffffffffffffff166333281305600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016137c09190615580565b60206040518083038186803b1580156137d857600080fd5b505afa1580156137ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138109190614c02565b6139f190919063ffffffff16565b613a6190919063ffffffff16565b9250505090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146138c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ba906158d5565b60405180910390fd5b6000600160008054905003815481106138d857fe5b9060005260206000209060020201600082815481106138f357fe5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018201548160010155905050600080548061398057fe5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080831415613a045760009050613a5b565b6000828402905082848281613a1557fe5b0414613a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4d90615835565b60405180910390fd5b809150505b92915050565b6000613aa383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614837565b905092915050565b6000838311158290613af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aea91906156f3565b60405180910390fd5b5060008385039050809150509392505050565b600960149054906101000a900460ff1615613b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4d90615815565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760016007805490500381548110613b9457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600860016008805490500381548110613bd857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613cc56002600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c679190615580565b60206040518083038186803b158015613c7f57600080fd5b505afa158015613c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb79190614c02565b613a6190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600730426040518663ffffffff1660e01b8152600401613d0a9594939291906159c2565b600060405180830381600087803b158015613d2457600080fd5b505af1158015613d38573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600830426040518663ffffffff1660e01b8152600401613d7f9594939291906159c2565b600060405180830381600087803b158015613d9957600080fd5b505af1158015613dad573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663e8e3370084848673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e089190615580565b60206040518083038186803b158015613e2057600080fd5b505afa158015613e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e589190614c02565b8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e919190615580565b60206040518083038186803b158015613ea957600080fd5b505afa158015613ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee19190614c02565b613f906064613f82605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f249190615580565b60206040518083038186803b158015613f3c57600080fd5b505afa158015613f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f749190614c02565b6139f190919063ffffffff16565b613a6190919063ffffffff16565b61403f6064614031605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613fd39190615580565b60206040518083038186803b158015613feb57600080fd5b505afa158015613fff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140239190614c02565b6139f190919063ffffffff16565b613a6190919063ffffffff16565b30426040518963ffffffff1660e01b81526004016140649897969594939291906155fb565b606060405180830381600087803b15801561407e57600080fd5b505af1158015614092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b69190614c2b565b5050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016141169190615580565b60206040518083038186803b15801561412e57600080fd5b505afa158015614142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141669190614c02565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106141b657fe5b0154306040518363ffffffff1660e01b81526004016141d6929190615970565b604080518083038186803b1580156141ed57600080fd5b505afa158015614201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142259190614bb0565b600001519050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600d60006007811061427757fe5b0154846040518363ffffffff1660e01b8152600401614297929190615a1c565b600060405180830381600087803b1580156142b157600080fd5b505af11580156142c5573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061431757fe5b0154306040518363ffffffff1660e01b8152600401614337929190615970565b604080518083038186803b15801561434e57600080fd5b505afa158015614362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143869190614bb0565b60000151905060006143d8836040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613aab9092919063ffffffff16565b9050600080600d6005600781106143eb57fe5b01541415614412574267ffffffffffffffff16600d60056007811061440c57fe5b01819055505b4267ffffffffffffffff16600d60066007811061442b57fe5b0181905550600060035411614443578190508061446e565b61446a8461445c600354856139f190919063ffffffff16565b613a6190919063ffffffff16565b9050805b506144a6620f4240614498600d60026007811061448757fe5b0154846139f190919063ffffffff16565b613a6190919063ffffffff16565b60146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161461454f578a614573565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90506145ac620f424061459e600d60036007811061458d57fe5b0154856139f190919063ffffffff16565b613a6190919063ffffffff16565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614677614632620f4240614624600d60036007811061461357fe5b0154866139f190919063ffffffff16565b613a6190919063ffffffff16565b614669620f424061465b600d60026007811061464a57fe5b0154876139f190919063ffffffff16565b613a6190919063ffffffff16565b61489890919063ffffffff16565b600360008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61472f620f4240614721600d60026007811061471057fe5b0154886139f190919063ffffffff16565b613a6190919063ffffffff16565b60405161473c9190615955565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6147cb620f42406147bd600d6003600781106147ac57fe5b0154886139f190919063ffffffff16565b613a6190919063ffffffff16565b6040516147d89190615955565b60405180910390a35050505050505050505050565b600061482f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613aab565b905092915050565b6000808311829061487e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161487591906156f3565b60405180910390fd5b50600083858161488a57fe5b049050809150509392505050565b6000808284019050838110156148e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148da90615755565b60405180910390fd5b8091505092915050565b604051806040016040528060008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b60008135905061495481615cf7565b92915050565b60008151905061496981615cf7565b92915050565b60008151905061497e81615d0e565b92915050565b60006080828403121561499657600080fd5b6149a06080615ab7565b905060006149b08482850161495a565b60008301525060206149c484828501614a59565b60208301525060406149d884828501614a59565b60408301525060606149ec84828501614a59565b60608301525092915050565b600060408284031215614a0a57600080fd5b614a146040615ab7565b90506000614a2484828501614a59565b6000830152506020614a3884828501614a59565b60208301525092915050565b600081359050614a5381615d25565b92915050565b600081519050614a6881615d25565b92915050565b600060208284031215614a8057600080fd5b6000614a8e84828501614945565b91505092915050565b60008060408385031215614aaa57600080fd5b6000614ab885828601614945565b9250506020614ac985828601614945565b9150509250929050565b600080600060608486031215614ae857600080fd5b6000614af686828701614945565b9350506020614b0786828701614945565b9250506040614b1886828701614a44565b9150509250925092565b60008060408385031215614b3557600080fd5b6000614b4385828601614945565b9250506020614b5485828601614a44565b9150509250929050565b600060208284031215614b7057600080fd5b6000614b7e8482850161496f565b91505092915050565b600060808284031215614b9957600080fd5b6000614ba784828501614984565b91505092915050565b600060408284031215614bc257600080fd5b6000614bd0848285016149f8565b91505092915050565b600060208284031215614beb57600080fd5b6000614bf984828501614a44565b91505092915050565b600060208284031215614c1457600080fd5b6000614c2284828501614a59565b91505092915050565b600080600060608486031215614c4057600080fd5b6000614c4e86828701614a59565b9350506020614c5f86828701614a59565b9250506040614c7086828701614a59565b9150509250925092565b600080600080600060a08688031215614c9257600080fd5b6000614ca088828901614a44565b9550506020614cb188828901614a44565b9450506040614cc288828901614a44565b9350506060614cd388828901614945565b9250506080614ce488828901614a44565b9150509295509295909350565b6000614cfd8383614d18565b60208301905092915050565b614d1281615bd5565b82525050565b614d2181615b8d565b82525050565b614d3081615b8d565b82525050565b6000614d4182615b12565b614d4b8185615b35565b9350614d5683615ae8565b8060005b83811015614d8e57614d6b82615cc6565b614d758882614cf1565b9750614d8083615b28565b925050600181019050614d5a565b5085935050505092915050565b614da481615b9f565b82525050565b614db381615be7565b82525050565b614dc281615c0b565b82525050565b614dd181615c2f565b82525050565b614de081615c41565b82525050565b6000614df182615b1d565b614dfb8185615b51565b9350614e0b818560208601615c77565b614e1481615cd9565b840191505092915050565b600081546001811660008114614e3c5760018114614e6157614ea5565b607f6002830416614e4d8187615b62565b955060ff1983168652808601935050614ea5565b60028204614e6f8187615b62565b9550614e7a85615afd565b60005b82811015614e9c57815481890152600182019150602081019050614e7d565b82880195505050505b505092915050565b6000614eba600f83615b62565b91507f6b63632e677572752f475241494e2f00000000000000000000000000000000006000830152600f82019050919050565b6000614efa601483615b51565b91507f4e6f74206d75636820776f726b20746f20646f210000000000000000000000006000830152602082019050919050565b6000614f3a600383615b51565b91507f21524700000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f7a601b83615b51565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614fba600683615b62565b91507f475241494e2300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000614ffa602783615b51565b91507f49747320616e20656d657267656e63792e20506c6561736520646f6e2774206460008301527f65706f7369742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615060601183615b51565b91507f556e61626c6520746f206f6e626f6172640000000000000000000000000000006000830152602082019050919050565b60006150a0601b83615b51565b91507f456d657267656e637920616c7265616479206465636c617265642e00000000006000830152602082019050919050565b60006150e0600983615b51565b91507f2177693a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000615120600983615b51565b91507f2164663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000615160603183615b51565b91507f49747320616e20656d657267656e63792e2055736520656d657267656e63795760008301527f69746864726177282920706c656173652e0000000000000000000000000000006020830152604082019050919050565b60006151c6602183615b51565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061522c600983615b51565b91507f2170663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b600061526c601783615b51565b91507f456d657267656e6379206e6f74206465636c617265642e0000000000000000006000830152602082019050919050565b60006152ac602d83615b51565b91507f497473206e6f7420616e20656d657267656e63792e205573652077697468647260008301527f6177282920696e73746561642e000000000000000000000000000000000000006020830152604082019050919050565b6000615312601483615b51565b91507f496e73756666696369656e742042616c616e63650000000000000000000000006000830152602082019050919050565b6000615352603583615b51565b91507f4f6e6c7920452e4c2e492e542e452e20442e412e4f2e2054726561737572792060008301527f63616e20726573637565207472656173757265732100000000000000000000006020830152604082019050919050565b60006153b8600083615b46565b9150600082019050919050565b60006153d2601c83615b51565b91507f46756e647320617265205361667520696e20656d657267656e637921000000006000830152602082019050919050565b6000615412601183615b51565b91507f556e61626c6520746f206465626f6172640000000000000000000000000000006000830152602082019050919050565b6000615452600c83615b51565b91507f456c69746573206f6e6c792100000000000000000000000000000000000000006000830152602082019050919050565b60808201600082015161549b6000850182614d18565b5060208201516154ae6020850182615509565b5060408201516154c16040850182615509565b5060608201516154d46060850182615509565b50505050565b6040820160008201516154f06000850182615509565b5060208201516155036020850182615509565b50505050565b61551281615bcb565b82525050565b61552181615bcb565b82525050565b600061553282614ead565b915061553e8284614e1f565b915081905092915050565b600061555482614fad565b91506155608284614e1f565b915081905092915050565b6000615576826153ab565b9150819050919050565b60006020820190506155956000830184614d27565b92915050565b60006060820190506155b06000830186614d09565b6155bd6020830185614d27565b6155ca6040830184615518565b949350505050565b60006040820190506155e76000830185614d09565b6155f46020830184615518565b9392505050565b600061010082019050615611600083018b614d27565b61561e602083018a614d27565b61562b6040830189615518565b6156386060830188615518565b6156456080830187615518565b61565260a0830186615518565b61565f60c0830185614d27565b61566c60e0830184615518565b9998505050505050505050565b600060408201905061568e6000830185614d27565b61569b6020830184615518565b9392505050565b60006020820190506156b76000830184614d9b565b92915050565b60006020820190506156d26000830184614daa565b92915050565b60006020820190506156ed6000830184614db9565b92915050565b6000602082019050818103600083015261570d8184614de6565b905092915050565b6000602082019050818103600083015261572e81614eed565b9050919050565b6000602082019050818103600083015261574e81614f2d565b9050919050565b6000602082019050818103600083015261576e81614f6d565b9050919050565b6000602082019050818103600083015261578e81614fed565b9050919050565b600060208201905081810360008301526157ae81615053565b9050919050565b600060208201905081810360008301526157ce81615093565b9050919050565b600060208201905081810360008301526157ee816150d3565b9050919050565b6000602082019050818103600083015261580e81615113565b9050919050565b6000602082019050818103600083015261582e81615153565b9050919050565b6000602082019050818103600083015261584e816151b9565b9050919050565b6000602082019050818103600083015261586e8161521f565b9050919050565b6000602082019050818103600083015261588e8161525f565b9050919050565b600060208201905081810360008301526158ae8161529f565b9050919050565b600060208201905081810360008301526158ce81615305565b9050919050565b600060208201905081810360008301526158ee81615345565b9050919050565b6000602082019050818103600083015261590e816153c5565b9050919050565b6000602082019050818103600083015261592e81615405565b9050919050565b6000602082019050818103600083015261594e81615445565b9050919050565b600060208201905061596a6000830184615518565b92915050565b60006040820190506159856000830185615518565b6159926020830184614d27565b9392505050565b60006040820190506159ae6000830185615518565b6159bb6020830184614dc8565b9392505050565b600060a0820190506159d76000830188615518565b6159e46020830187614dd7565b81810360408301526159f68186614d36565b9050615a056060830185614d27565b615a126080830184615518565b9695505050505050565b6000604082019050615a316000830185615518565b615a3e6020830184615518565b9392505050565b600061016082019050615a5b600083018a615518565b615a686020830189615518565b615a756040830188615518565b615a8260608301876154da565b615a8f60a0830186615485565b615a9d610120830185615518565b615aab610140830184615518565b98975050505050505050565b6000604051905081810181811067ffffffffffffffff82111715615ade57615add615cc4565b5b8060405250919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081549050919050565b600081519050919050565b6000600182019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615b9882615bab565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615be082615c53565b9050919050565b6000615bf282615bf9565b9050919050565b6000615c0482615bab565b9050919050565b6000615c1682615c1d565b9050919050565b6000615c2882615bab565b9050919050565b6000615c3a82615bcb565b9050919050565b6000615c4c82615bcb565b9050919050565b6000615c5e82615c65565b9050919050565b6000615c7082615bab565b9050919050565b60005b83811015615c95578082015181840152602081019050615c7a565b83811115615ca4576000848401525b50505050565b6000615cbd615cb883615cea565b615b6d565b9050919050565bfe5b6000615cd28254615caa565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b615d0081615b8d565b8114615d0b57600080fd5b50565b615d1781615b9f565b8114615d2257600080fd5b50565b615d2e81615bcb565b8114615d3957600080fd5b5056fea264697066735822122090e21131b24c81fd7e557121fcb0ed4ba25befdfb34e1de2a97499038f176a2464736f6c634300070600330000000000000000000000006c31e0f5c07b81a87120cc58c4dcc3fbafb0036700000000000000000000000062974ce5d662f9045265716a3e64eaafc258779f0000000000000000000000004a81704d8c16d9fb0d7f61b747d0b5a272badf140000000000000000000000000000000000000000000000000000000000000003000000000000000000000000a58350d6dee8441aa42754346860e3545cc83cda000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000426a4a4b73d4cd173c9ab78d18c0d79d1717eaa900000000000000000000000000000000000000000000000000000000000000020000000000000000000000004a81704d8c16d9fb0d7f61b747d0b5a272badf140000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c0752100000000000000000000000000000000000000000000000000000000000000030000000000000000000000004a81704d8c16d9fb0d7f61b747d0b5a272badf140000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c075210000000000000000000000000039f574ee5cc39bdd162e9a88e3eb1f111baf4800000000000000000000000000000000000000000000000000000000000000043332303100000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80635312ea8e11610130578063af640d0f116100b8578063daea85c51161007c578063daea85c51461064d578063dd62ed3e1461067d578063e5328e06146106ad578063ef1b8140146106cb578063f887ea40146106e757610227565b8063af640d0f146105b9578063b6b55f25146105d7578063caa6fea4146105f3578063cb7956b014610611578063d389800f1461062f57610227565b80637919b71b116100ff5780637919b71b146104db5780637a4e4ecf1461050b5780638ed5f3731461053b57806395d89b411461056b578063a9059cbb1461058957610227565b80635312ea8e1461045557806361d027b314610471578063685c8ca51461048f57806370a08231146104ab57610227565b806327d9cf44116101b3578063370158ea11610182578063370158ea146103bd5780633d456f43146103e15780634162169f146104115780634b292cae1461042f5780634fa5d8541461044b57610227565b806327d9cf441461035b5780632e1a7d4d14610379578063313ce5671461039557806331e244e5146103b357610227565b80631e534906116101fa5780631e534906146102c95780631f1fcd51146102d357806323b872dd146102f157806323e1d0e81461032157806324aa95ec1461035157610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461027a5780631b5f9c4214610298575b600080fd5b610234610705565b60405161024191906156f3565b60405180910390f35b610264600480360381019061025f9190614b22565b61072d565b60405161027191906156a2565b60405180910390f35b61028261081f565b60405161028f9190615955565b60405180910390f35b6102b260048036038101906102ad9190614bd9565b610825565b6040516102c0929190615679565b60405180910390f35b6102d1610879565b005b6102db61091a565b6040516102e891906156bd565b60405180910390f35b61030b60048036038101906103069190614ad3565b610940565b60405161031891906156a2565b60405180910390f35b61033b60048036038101906103369190614bd9565b610cbf565b6040516103489190615955565b60405180910390f35b610359610cda565b005b610363610f24565b6040516103709190615580565b60405180910390f35b610393600480360381019061038e9190614bd9565b610f4a565b005b61039d61166a565b6040516103aa9190615955565b60405180910390f35b6103bb611673565b005b6103c561180c565b6040516103d89796959493929190615a45565b60405180910390f35b6103fb60048036038101906103f69190614bd9565b611cdc565b6040516104089190615580565b60405180910390f35b610419611d1b565b6040516104269190615580565b60405180910390f35b61044960048036038101906104449190614c7a565b611d41565b005b610453611f38565b005b61046f600480360381019061046a9190614bd9565b61211a565b005b61047961250d565b6040516104869190615580565b60405180910390f35b6104a960048036038101906104a49190614b22565b612533565b005b6104c560048036038101906104c09190614a6e565b612670565b6040516104d29190615955565b60405180910390f35b6104f560048036038101906104f09190614bd9565b612688565b6040516105029190615580565b60405180910390f35b61052560048036038101906105209190614b22565b6126c7565b60405161053291906156a2565b60405180910390f35b61055560048036038101906105509190614a6e565b6129a7565b60405161056291906156a2565b60405180910390f35b610573612adc565b60405161058091906156f3565b60405180910390f35b6105a3600480360381019061059e9190614b22565b612b04565b6040516105b091906156a2565b60405180910390f35b6105c1612b19565b6040516105ce91906156f3565b60405180910390f35b6105f160048036038101906105ec9190614bd9565b612bb7565b005b6105fb613507565b60405161060891906156a2565b60405180910390f35b61061961351a565b60405161062691906156d8565b60405180910390f35b610637613540565b60405161064491906156bd565b60405180910390f35b61066760048036038101906106629190614a6e565b613566565b60405161067491906156a2565b60405180910390f35b61069760048036038101906106929190614a97565b613599565b6040516106a49190615955565b60405180910390f35b6106b56135be565b6040516106c29190615955565b60405180910390f35b6106e560048036038101906106e09190614bd9565b613833565b005b6106ef6139cb565b6040516106fc9190615580565b60405180910390f35b606060026040516020016107199190615527565b604051602081830303815290604052905090565b600081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161080d9190615955565b60405180910390a36001905092915050565b60035481565b6000818154811061083557600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d6000600781106108c557fe5b015460006040518363ffffffff1660e01b81526004016108e6929190615999565b600060405180830381600087803b15801561090057600080fd5b505af1158015610914573d6000803e3d6000fd5b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb906158b5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610a9c57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610bb55781601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b2a57600080fd5b81601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cac9190615955565b60405180910390a3600190509392505050565b600d8160078110610ccf57600080fd5b016000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d61906158d5565b60405180910390fd5b600960149054906101000a900460ff16610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db090615875565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e169190615580565b60206040518083038186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e669190614c02565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600d600060078110610eb457fe5b0154836040518363ffffffff1660e01b8152600401610ed4929190615a1c565b600060405180830381600087803b158015610eee57600080fd5b505af1158015610f02573d6000803e3d6000fd5b505050506000600960146101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff1660ff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff161561100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190615815565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561108c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611083906158b5565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600354905081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161114e9190615955565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111b39190615580565b60206040518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112039190614c02565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061125357fe5b0154306040518363ffffffff1660e01b8152600401611273929190615970565b604080518083038186803b15801561128a57600080fd5b505afa15801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190614bb0565b60000151905060006112ef846112e184886139f190919063ffffffff16565b613a6190919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d60006007811061133d57fe5b0154836040518363ffffffff1660e01b815260040161135d929190615a1c565b600060405180830381600087803b15801561137757600080fd5b505af115801561138b573d6000803e3d6000fd5b505050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113ec9190615580565b60206040518083038186803b15801561140457600080fd5b505afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c9190614c02565b9050600061148a856040518060400160405280601081526020017f4469727479207769746864726177616c0000000000000000000000000000000081525084613aab9092919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114e99291906155d2565b602060405180830381600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b9190614b5e565b61157a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157190615915565b60405180910390fd5b600d60046007811061158857fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115e59190615580565b60206040518083038186803b1580156115fd57600080fd5b505afa158015611611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116359190614c02565b11156116455761164430613b06565b5b5050505050506000600160006101000a81548160ff021916908360ff16021790555050565b60006012905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906158d5565b60405180910390fd5b600960149054906101000a900460ff1615611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906157b5565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635312ea8e600d60006007811061179f57fe5b01546040518263ffffffff1660e01b81526004016117bd9190615955565b600060405180830381600087803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b505050506001600960146101000a81548160ff021916908315150217905550565b60008060006118196148ed565b611821614907565b6000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118819190615580565b60206040518083038186803b15801561189957600080fd5b505afa1580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d19190614c02565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061191d57fe5b0154306040518363ffffffff1660e01b815260040161193d929190615970565b604080518083038186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190614bb0565b600001510190506000600354670de0b6b3a76400008302816119aa57fe5b0490506000600d6005600781106119bd57fe5b0154600d6006600781106119cd57fe5b01540360646301e13380670de0b6b3a764000085030202816119eb57fe5b049050828282600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110611a3d57fe5b0154306040518363ffffffff1660e01b8152600401611a5d929190615970565b604080518083038186803b158015611a7457600080fd5b505afa158015611a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aac9190614bb0565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631526fe27600d600060078110611af857fe5b01546040518263ffffffff1660e01b8152600401611b169190615955565b60806040518083038186803b158015611b2e57600080fd5b505afa158015611b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b669190614b87565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611bce57600080fd5b505afa158015611be2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c069190614c02565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eba0a1da600d600060078110611c5257fe5b0154306040518363ffffffff1660e01b8152600401611c72929190615970565b60206040518083038186803b158015611c8a57600080fd5b505afa158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614c02565b995099509950995099509950995050505090919293949596565b60088181548110611cec57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc8906158d5565b60405180910390fd5b84600d600460078110611de057fe5b018190555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620186a08410611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e62906157d5565b60405180910390fd5b83600d600360078110611e7a57fe5b0181905550620186a08310611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb90615855565b60405180910390fd5b82600d600260078110611ed357fe5b0181905550620186a08110611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f14906157f5565b60405180910390fd5b80600d600160078110611f2c57fe5b01819055505050505050565b6000600160009054906101000a900460ff1660ff1614611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8490615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550611fb1336129a7565b611ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe790615935565b60405180910390fd5b611ff8610879565b600d60046007811061200657fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016120639190615580565b60206040518083038186803b15801561207b57600080fd5b505afa15801561208f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b39190614c02565b116120f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea90615715565b60405180910390fd5b6120fc33613b06565b6000600160006101000a81548160ff021916908360ff160217905550565b6000600160009054906101000a900460ff1660ff161461216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff166121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090615895565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561225b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612252906158b5565b60405180910390fd5b6000600354905081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161231d9190615955565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123829190615580565b60206040518083038186803b15801561239a57600080fd5b505afa1580156123ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d29190614c02565b905060006123fb836123ed84876139f190919063ffffffff16565b613a6190919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161245a9291906155d2565b602060405180830381600087803b15801561247457600080fd5b505af1158015612488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ac9190614b5e565b6124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290615915565b60405180910390fd5b5050506000600160006101000a81548160ff021916908360ff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba906158d5565b60405180910390fd5b600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b60146020528060005260406000206000915090505481565b6007818154811061269857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612759576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612750906158d5565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e1906158f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b257600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516128659061556b565b60006040518083038185875af1925050503d80600081146128a2576040519150601f19603f3d011682016040523d82523d6000602084013e6128a7565b606091505b5050809150506129a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461299c578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612943929190615679565b602060405180830381600087803b15801561295d57600080fd5b505af1158015612971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129959190614b5e565b90506129a1565b600090505b92915050565b60008060008054905014156129bf5760019050612ad7565b60005b600080549050811015612ad157600081815481106129dc57fe5b906000526020600020906002020160010154600082815481106129fb57fe5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612a659190615580565b60206040518083038186803b158015612a7d57600080fd5b505afa158015612a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab59190614c02565b10612ac4576001915050612ad7565b80806001019150506129c2565b50600090505b919050565b60606002604051602001612af09190615549565b604051602081830303815290604052905090565b6000612b11338484610940565b905092915050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612baf5780601f10612b8457610100808354040283529160200191612baf565b820191906000526020600020905b815481529060010190602001808311612b9257829003601f168201915b505050505081565b6000600160009054906101000a900460ff1660ff1614612c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0390615735565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff1615612c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6e90615775565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612cd49190615580565b60206040518083038186803b158015612cec57600080fd5b505afa158015612d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d249190614c02565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110612d7457fe5b0154306040518363ffffffff1660e01b8152600401612d94929190615970565b604080518083038186803b158015612dab57600080fd5b505afa158015612dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de39190614bb0565b600001519050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612e489392919061559b565b602060405180830381600087803b158015612e6257600080fd5b505af1158015612e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e9a9190614b5e565b612ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed090615795565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f369190615580565b60206040518083038186803b158015612f4e57600080fd5b505afa158015612f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f869190614c02565b90506000612fd4846040518060400160405280600d81526020017f4469727479206465706f7369740000000000000000000000000000000000000081525084613aab9092919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600d60006007811061302257fe5b0154836040518363ffffffff1660e01b8152600401613042929190615a1c565b600060405180830381600087803b15801561305c57600080fd5b505af1158015613070573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106130c257fe5b0154306040518363ffffffff1660e01b81526004016130e2929190615970565b604080518083038186803b1580156130f957600080fd5b505afa15801561310d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131319190614bb0565b6000015190506000613183856040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613aab9092919063ffffffff16565b90506000806003541161319957819050806131c4565b6131c0866131b2600354856139f190919063ffffffff16565b613a6190919063ffffffff16565b9050805b5080600360008282540192505081905550600080600d6001600781106131e657fe5b0154111561323d576131f7336129a7565b61323757613232620f4240613224600d60016007811061321357fe5b0154856139f190919063ffffffff16565b613a6190919063ffffffff16565b61323a565b60005b90505b600081111561333e578060146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133359190615955565b60405180910390a35b61335181836147ed90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61340084866147ed90919063ffffffff16565b60405161340d9190615955565b60405180910390a3600d60046007811061342357fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016134809190615580565b60206040518083038186803b15801561349857600080fd5b505afa1580156134ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d09190614c02565b11156134e0576134df30613b06565b5b50505050505050506000600160006101000a81548160ff021916908360ff16021790555050565b600960149054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000613592827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61072d565b9050919050565b6015602052816000526040600020602052806000526040600020600091509150505481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016136439190615580565b60206040518083038186803b15801561365b57600080fd5b505afa15801561366f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136939190614c02565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106136df57fe5b0154306040518363ffffffff1660e01b81526004016136ff929190615970565b604080518083038186803b15801561371657600080fd5b505afa15801561372a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374e9190614bb0565b6000015101905061382c670de0b6b3a764000061381e838573ffffffffffffffffffffffffffffffffffffffff166333281305600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016137c09190615580565b60206040518083038186803b1580156137d857600080fd5b505afa1580156137ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138109190614c02565b6139f190919063ffffffff16565b613a6190919063ffffffff16565b9250505090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146138c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ba906158d5565b60405180910390fd5b6000600160008054905003815481106138d857fe5b9060005260206000209060020201600082815481106138f357fe5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018201548160010155905050600080548061398057fe5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080831415613a045760009050613a5b565b6000828402905082848281613a1557fe5b0414613a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4d90615835565b60405180910390fd5b809150505b92915050565b6000613aa383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614837565b905092915050565b6000838311158290613af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aea91906156f3565b60405180910390fd5b5060008385039050809150509392505050565b600960149054906101000a900460ff1615613b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4d90615815565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760016007805490500381548110613b9457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600860016008805490500381548110613bd857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613cc56002600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c679190615580565b60206040518083038186803b158015613c7f57600080fd5b505afa158015613c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb79190614c02565b613a6190919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600730426040518663ffffffff1660e01b8152600401613d0a9594939291906159c2565b600060405180830381600087803b158015613d2457600080fd5b505af1158015613d38573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600830426040518663ffffffff1660e01b8152600401613d7f9594939291906159c2565b600060405180830381600087803b158015613d9957600080fd5b505af1158015613dad573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663e8e3370084848673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e089190615580565b60206040518083038186803b158015613e2057600080fd5b505afa158015613e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e589190614c02565b8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e919190615580565b60206040518083038186803b158015613ea957600080fd5b505afa158015613ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee19190614c02565b613f906064613f82605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f249190615580565b60206040518083038186803b158015613f3c57600080fd5b505afa158015613f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f749190614c02565b6139f190919063ffffffff16565b613a6190919063ffffffff16565b61403f6064614031605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613fd39190615580565b60206040518083038186803b158015613feb57600080fd5b505afa158015613fff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140239190614c02565b6139f190919063ffffffff16565b613a6190919063ffffffff16565b30426040518963ffffffff1660e01b81526004016140649897969594939291906155fb565b606060405180830381600087803b15801561407e57600080fd5b505af1158015614092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140b69190614c2b565b5050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016141169190615580565b60206040518083038186803b15801561412e57600080fd5b505afa158015614142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141669190614c02565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106141b657fe5b0154306040518363ffffffff1660e01b81526004016141d6929190615970565b604080518083038186803b1580156141ed57600080fd5b505afa158015614201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142259190614bb0565b600001519050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600d60006007811061427757fe5b0154846040518363ffffffff1660e01b8152600401614297929190615a1c565b600060405180830381600087803b1580156142b157600080fd5b505af11580156142c5573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061431757fe5b0154306040518363ffffffff1660e01b8152600401614337929190615970565b604080518083038186803b15801561434e57600080fd5b505afa158015614362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143869190614bb0565b60000151905060006143d8836040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613aab9092919063ffffffff16565b9050600080600d6005600781106143eb57fe5b01541415614412574267ffffffffffffffff16600d60056007811061440c57fe5b01819055505b4267ffffffffffffffff16600d60066007811061442b57fe5b0181905550600060035411614443578190508061446e565b61446a8461445c600354856139f190919063ffffffff16565b613a6190919063ffffffff16565b9050805b506144a6620f4240614498600d60026007811061448757fe5b0154846139f190919063ffffffff16565b613a6190919063ffffffff16565b60146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161461454f578a614573565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90506145ac620f424061459e600d60036007811061458d57fe5b0154856139f190919063ffffffff16565b613a6190919063ffffffff16565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614677614632620f4240614624600d60036007811061461357fe5b0154866139f190919063ffffffff16565b613a6190919063ffffffff16565b614669620f424061465b600d60026007811061464a57fe5b0154876139f190919063ffffffff16565b613a6190919063ffffffff16565b61489890919063ffffffff16565b600360008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61472f620f4240614721600d60026007811061471057fe5b0154886139f190919063ffffffff16565b613a6190919063ffffffff16565b60405161473c9190615955565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6147cb620f42406147bd600d6003600781106147ac57fe5b0154886139f190919063ffffffff16565b613a6190919063ffffffff16565b6040516147d89190615955565b60405180910390a35050505050505050505050565b600061482f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613aab565b905092915050565b6000808311829061487e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161487591906156f3565b60405180910390fd5b50600083858161488a57fe5b049050809150509392505050565b6000808284019050838110156148e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148da90615755565b60405180910390fd5b8091505092915050565b604051806040016040528060008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b60008135905061495481615cf7565b92915050565b60008151905061496981615cf7565b92915050565b60008151905061497e81615d0e565b92915050565b60006080828403121561499657600080fd5b6149a06080615ab7565b905060006149b08482850161495a565b60008301525060206149c484828501614a59565b60208301525060406149d884828501614a59565b60408301525060606149ec84828501614a59565b60608301525092915050565b600060408284031215614a0a57600080fd5b614a146040615ab7565b90506000614a2484828501614a59565b6000830152506020614a3884828501614a59565b60208301525092915050565b600081359050614a5381615d25565b92915050565b600081519050614a6881615d25565b92915050565b600060208284031215614a8057600080fd5b6000614a8e84828501614945565b91505092915050565b60008060408385031215614aaa57600080fd5b6000614ab885828601614945565b9250506020614ac985828601614945565b9150509250929050565b600080600060608486031215614ae857600080fd5b6000614af686828701614945565b9350506020614b0786828701614945565b9250506040614b1886828701614a44565b9150509250925092565b60008060408385031215614b3557600080fd5b6000614b4385828601614945565b9250506020614b5485828601614a44565b9150509250929050565b600060208284031215614b7057600080fd5b6000614b7e8482850161496f565b91505092915050565b600060808284031215614b9957600080fd5b6000614ba784828501614984565b91505092915050565b600060408284031215614bc257600080fd5b6000614bd0848285016149f8565b91505092915050565b600060208284031215614beb57600080fd5b6000614bf984828501614a44565b91505092915050565b600060208284031215614c1457600080fd5b6000614c2284828501614a59565b91505092915050565b600080600060608486031215614c4057600080fd5b6000614c4e86828701614a59565b9350506020614c5f86828701614a59565b9250506040614c7086828701614a59565b9150509250925092565b600080600080600060a08688031215614c9257600080fd5b6000614ca088828901614a44565b9550506020614cb188828901614a44565b9450506040614cc288828901614a44565b9350506060614cd388828901614945565b9250506080614ce488828901614a44565b9150509295509295909350565b6000614cfd8383614d18565b60208301905092915050565b614d1281615bd5565b82525050565b614d2181615b8d565b82525050565b614d3081615b8d565b82525050565b6000614d4182615b12565b614d4b8185615b35565b9350614d5683615ae8565b8060005b83811015614d8e57614d6b82615cc6565b614d758882614cf1565b9750614d8083615b28565b925050600181019050614d5a565b5085935050505092915050565b614da481615b9f565b82525050565b614db381615be7565b82525050565b614dc281615c0b565b82525050565b614dd181615c2f565b82525050565b614de081615c41565b82525050565b6000614df182615b1d565b614dfb8185615b51565b9350614e0b818560208601615c77565b614e1481615cd9565b840191505092915050565b600081546001811660008114614e3c5760018114614e6157614ea5565b607f6002830416614e4d8187615b62565b955060ff1983168652808601935050614ea5565b60028204614e6f8187615b62565b9550614e7a85615afd565b60005b82811015614e9c57815481890152600182019150602081019050614e7d565b82880195505050505b505092915050565b6000614eba600f83615b62565b91507f6b63632e677572752f475241494e2f00000000000000000000000000000000006000830152600f82019050919050565b6000614efa601483615b51565b91507f4e6f74206d75636820776f726b20746f20646f210000000000000000000000006000830152602082019050919050565b6000614f3a600383615b51565b91507f21524700000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f7a601b83615b51565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614fba600683615b62565b91507f475241494e2300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000614ffa602783615b51565b91507f49747320616e20656d657267656e63792e20506c6561736520646f6e2774206460008301527f65706f7369742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615060601183615b51565b91507f556e61626c6520746f206f6e626f6172640000000000000000000000000000006000830152602082019050919050565b60006150a0601b83615b51565b91507f456d657267656e637920616c7265616479206465636c617265642e00000000006000830152602082019050919050565b60006150e0600983615b51565b91507f2177693a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000615120600983615b51565b91507f2164663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000615160603183615b51565b91507f49747320616e20656d657267656e63792e2055736520656d657267656e63795760008301527f69746864726177282920706c656173652e0000000000000000000000000000006020830152604082019050919050565b60006151c6602183615b51565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061522c600983615b51565b91507f2170663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b600061526c601783615b51565b91507f456d657267656e6379206e6f74206465636c617265642e0000000000000000006000830152602082019050919050565b60006152ac602d83615b51565b91507f497473206e6f7420616e20656d657267656e63792e205573652077697468647260008301527f6177282920696e73746561642e000000000000000000000000000000000000006020830152604082019050919050565b6000615312601483615b51565b91507f496e73756666696369656e742042616c616e63650000000000000000000000006000830152602082019050919050565b6000615352603583615b51565b91507f4f6e6c7920452e4c2e492e542e452e20442e412e4f2e2054726561737572792060008301527f63616e20726573637565207472656173757265732100000000000000000000006020830152604082019050919050565b60006153b8600083615b46565b9150600082019050919050565b60006153d2601c83615b51565b91507f46756e647320617265205361667520696e20656d657267656e637921000000006000830152602082019050919050565b6000615412601183615b51565b91507f556e61626c6520746f206465626f6172640000000000000000000000000000006000830152602082019050919050565b6000615452600c83615b51565b91507f456c69746573206f6e6c792100000000000000000000000000000000000000006000830152602082019050919050565b60808201600082015161549b6000850182614d18565b5060208201516154ae6020850182615509565b5060408201516154c16040850182615509565b5060608201516154d46060850182615509565b50505050565b6040820160008201516154f06000850182615509565b5060208201516155036020850182615509565b50505050565b61551281615bcb565b82525050565b61552181615bcb565b82525050565b600061553282614ead565b915061553e8284614e1f565b915081905092915050565b600061555482614fad565b91506155608284614e1f565b915081905092915050565b6000615576826153ab565b9150819050919050565b60006020820190506155956000830184614d27565b92915050565b60006060820190506155b06000830186614d09565b6155bd6020830185614d27565b6155ca6040830184615518565b949350505050565b60006040820190506155e76000830185614d09565b6155f46020830184615518565b9392505050565b600061010082019050615611600083018b614d27565b61561e602083018a614d27565b61562b6040830189615518565b6156386060830188615518565b6156456080830187615518565b61565260a0830186615518565b61565f60c0830185614d27565b61566c60e0830184615518565b9998505050505050505050565b600060408201905061568e6000830185614d27565b61569b6020830184615518565b9392505050565b60006020820190506156b76000830184614d9b565b92915050565b60006020820190506156d26000830184614daa565b92915050565b60006020820190506156ed6000830184614db9565b92915050565b6000602082019050818103600083015261570d8184614de6565b905092915050565b6000602082019050818103600083015261572e81614eed565b9050919050565b6000602082019050818103600083015261574e81614f2d565b9050919050565b6000602082019050818103600083015261576e81614f6d565b9050919050565b6000602082019050818103600083015261578e81614fed565b9050919050565b600060208201905081810360008301526157ae81615053565b9050919050565b600060208201905081810360008301526157ce81615093565b9050919050565b600060208201905081810360008301526157ee816150d3565b9050919050565b6000602082019050818103600083015261580e81615113565b9050919050565b6000602082019050818103600083015261582e81615153565b9050919050565b6000602082019050818103600083015261584e816151b9565b9050919050565b6000602082019050818103600083015261586e8161521f565b9050919050565b6000602082019050818103600083015261588e8161525f565b9050919050565b600060208201905081810360008301526158ae8161529f565b9050919050565b600060208201905081810360008301526158ce81615305565b9050919050565b600060208201905081810360008301526158ee81615345565b9050919050565b6000602082019050818103600083015261590e816153c5565b9050919050565b6000602082019050818103600083015261592e81615405565b9050919050565b6000602082019050818103600083015261594e81615445565b9050919050565b600060208201905061596a6000830184615518565b92915050565b60006040820190506159856000830185615518565b6159926020830184614d27565b9392505050565b60006040820190506159ae6000830185615518565b6159bb6020830184614dc8565b9392505050565b600060a0820190506159d76000830188615518565b6159e46020830187614dd7565b81810360408301526159f68186614d36565b9050615a056060830185614d27565b615a126080830184615518565b9695505050505050565b6000604082019050615a316000830185615518565b615a3e6020830184615518565b9392505050565b600061016082019050615a5b600083018a615518565b615a686020830189615518565b615a756040830188615518565b615a8260608301876154da565b615a8f60a0830186615485565b615a9d610120830185615518565b615aab610140830184615518565b98975050505050505050565b6000604051905081810181811067ffffffffffffffff82111715615ade57615add615cc4565b5b8060405250919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081549050919050565b600081519050919050565b6000600182019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615b9882615bab565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615be082615c53565b9050919050565b6000615bf282615bf9565b9050919050565b6000615c0482615bab565b9050919050565b6000615c1682615c1d565b9050919050565b6000615c2882615bab565b9050919050565b6000615c3a82615bcb565b9050919050565b6000615c4c82615bcb565b9050919050565b6000615c5e82615c65565b9050919050565b6000615c7082615bab565b9050919050565b60005b83811015615c95578082015181840152602081019050615c7a565b83811115615ca4576000848401525b50505050565b6000615cbd615cb883615cea565b615b6d565b9050919050565bfe5b6000615cd28254615caa565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b615d0081615b8d565b8114615d0b57600080fd5b50565b615d1781615b9f565b8114615d2257600080fd5b50565b615d2e81615bcb565b8114615d3957600080fd5b5056fea264697066735822122090e21131b24c81fd7e557121fcb0ed4ba25befdfb34e1de2a97499038f176a2464736f6c63430007060033