Address Details
contract

0xA13Cd4AEae9Ad7CEC36359C70a589e487e7Cf1Fd

Contract Name
cStarIDO
Creator
0x7f09ca–8815c7 at 0xc9f856–b17e53
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
4 Transactions
Transfers
3 Transfers
Gas Used
388,809
Last Balance Update
7691844
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
cStarIDO




Optimization enabled
false
Compiler version
v0.6.12+commit.27d51765




EVM Version
istanbul




Verified at
2023-02-01T20:19:40.129689Z

project:/contracts/cStarIDO.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    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;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

interface IUserPool {
   function getAces() external view returns (address[] memory, uint256[] memory);
   function getKings() external view returns (address[] memory, uint256[] memory);
   function getJacks() external view returns (address[] memory, uint256[] memory);
   function getGuards() external view returns (address[] memory, uint256[] memory);
}

contract cStarIDO {
   using SafeERC20 for IERC20;
   using SafeMath for uint256;

   address addrDev;
   address addrAdmin;
   address addrPayout;

   address[] addrValidAces;
   address[] addrValidKings;
   address[] addrValidJacks;
   address[] addrValidGuards;

   IUserPool UserPool;
   IERC20 IPayToken;

   uint256 iPercentage = 7;
   uint256 iTokenMaturity = 30 days;

   enum UserLevel { None, Ace, King, Jack, Guard }

   mapping (address => bool) public bAllowAlloc;
   mapping (address => UserLevel) public mapUserLevel;

   enum MarketPhase {Prepare, Allocation, PublicSale, Closed }

   struct SaleInfo {
      IERC20 ISaleToken;
      uint256 iTokenAmount;
      uint256 iPublicSaleAmount;
      uint256 iAcesAmount;
      uint256 iAcesBatch;
      uint256 iKingsAmount;
      uint256 iKingsBatch;
      uint256 iJacksAmount;
      uint256 iJacksBatch;
      uint256 iGuardsAmount;
      uint256 iGuardsBatch;
      uint256 iTokenPrice;
      uint256 iLevelPrice;
      MarketPhase marketPhase;
   }

   SaleInfo public TokenMarket;

   modifier _needsAdmin() {
      require(msg.sender == addrDev || msg.sender == addrAdmin, "ALERT: Admin or Dev need to set");

      _;
   }

   constructor(IUserPool userpool, IERC20 paytoken, IERC20 saletoken, uint256 amount, uint256 price, address payout, uint256 iMaturity) public {
      addrDev = msg.sender;
      addrPayout = payout;

      UserPool = userpool;
      IPayToken = paytoken;

      iTokenMaturity = iMaturity;

      uint256 iAmount = amount / 2;

      TokenMarket.ISaleToken = saletoken;
      TokenMarket.iTokenAmount = amount;
      TokenMarket.iPublicSaleAmount = iAmount;
      TokenMarket.iAcesAmount = (iAmount * 35) / 100;
      TokenMarket.iKingsAmount = (iAmount * 20) / 100;
      TokenMarket.iJacksAmount = (iAmount * 20) / 100;
      TokenMarket.iGuardsAmount = (iAmount * 25) / 100;
      TokenMarket.iTokenPrice = price;
      TokenMarket.iLevelPrice = price / 2;
      TokenMarket.marketPhase = MarketPhase.Prepare;
   }

   function getPayToken() public view returns (IERC20) {
      return IPayToken;
   }

   function getAllowAlloc(address account) public view returns (bool) {
      return bAllowAlloc[account];
   }

   function openAlloc() public _needsAdmin() {
      require(TokenMarket.ISaleToken.balanceOf(address(this)) >= TokenMarket.iTokenAmount, "ALERT: Token are not transfered to Market!");
      (address[] memory addrAces, uint256[] memory timeAces) = UserPool.getAces();
      (address[] memory addrKings, uint256[] memory timeKings) = UserPool.getKings();
      (address[] memory addrJacks, uint256[] memory timeJacks) = UserPool.getJacks();
      (address[] memory addrGuards, uint256[] memory timeGuards) = UserPool.getGuards();

      if(addrAces.length > 0) {
         for(uint i = 0; i < addrAces.length; i++) {
            if((timeAces[i] + iTokenMaturity) < block.timestamp) {
               addrValidAces.push(addrAces[i]);
               bAllowAlloc[addrAces[i]] = true;
               mapUserLevel[addrAces[i]] = UserLevel.Ace;
            }
         }

         if(addrValidAces.length > 0) {
            TokenMarket.iAcesBatch = TokenMarket.iAcesAmount / addrValidAces.length;
         }
      }

      if(addrKings.length > 0) {
         for(uint i = 0; i < addrKings.length; i++) {
            if((timeKings[i] + iTokenMaturity) < block.timestamp) {
               addrValidKings.push(addrKings[i]);
               bAllowAlloc[addrKings[i]] = true;
               mapUserLevel[addrKings[i]] = UserLevel.King;
            }
         }

         if(addrValidKings.length > 0) {
            TokenMarket.iKingsBatch = TokenMarket.iKingsAmount / addrValidKings.length;
         }
      }

      if(addrValidJacks.length > 0) {
         for(uint i = 0; i < addrJacks.length; i++) {
            if((timeJacks[i] + iTokenMaturity) < block.timestamp) {
               addrValidJacks.push(addrJacks[i]);
               bAllowAlloc[addrJacks[i]] = true;
               mapUserLevel[addrJacks[i]] = UserLevel.Jack;
            }
         }

         if(addrValidJacks.length > 0) {
            TokenMarket.iJacksBatch = TokenMarket.iJacksAmount / addrValidJacks.length;
         }
      }

      if(addrGuards.length > 0) {
         for(uint i = 0; i < addrGuards.length; i++) {
            if((timeGuards[i] + iTokenMaturity) < block.timestamp) {
               addrValidGuards.push(addrGuards[i]);
               bAllowAlloc[addrGuards[i]] = true;
               mapUserLevel[addrGuards[i]] = UserLevel.Guard;
            }
         }

         if(addrValidGuards.length > 0) {
            TokenMarket.iGuardsBatch = TokenMarket.iGuardsAmount / addrValidGuards.length;
         }
      }

      TokenMarket.marketPhase = MarketPhase.Allocation;
   }

   function openPublicSale() public _needsAdmin() {
      uint256 iNewPublicAmount;

      iNewPublicAmount = TokenMarket.iPublicSaleAmount.add(TokenMarket.iAcesAmount).add(TokenMarket.iKingsAmount).add(TokenMarket.iJacksAmount).add(TokenMarket.iGuardsAmount);

      TokenMarket.iPublicSaleAmount = iNewPublicAmount;

      TokenMarket.marketPhase = MarketPhase.PublicSale;
   }

   function getAllocation() public payable {
      require(TokenMarket.marketPhase == MarketPhase.Allocation, "ALERT: Market not opened!");
      require(bAllowAlloc[msg.sender] == true, "ALERT: Your are not allowed or already buyed during this phase!");

      UserLevel buyerLevel = mapUserLevel[msg.sender];

      if(buyerLevel == UserLevel.Ace) {
         uint256 iAcesCost = (TokenMarket.iAcesBatch * TokenMarket.iLevelPrice) / 10**18;

         require(IPayToken.balanceOf(msg.sender) > iAcesCost, "ALERT: Not enough token for buy!");
         require(IPayToken.allowance(msg.sender, address(this)) > iAcesCost, "ALERT: Not enough token for buy!");
         require(TokenMarket.iAcesAmount >= TokenMarket.iAcesBatch, "ALERT: Not engough token please call the admin!");

         IPayToken.safeTransferFrom(msg.sender, address(this), iAcesCost);
         TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iAcesBatch);
         TokenMarket.iAcesAmount = TokenMarket.iAcesAmount.sub(TokenMarket.iAcesBatch);

         bAllowAlloc[msg.sender] = false;
      } else if(buyerLevel == UserLevel.King) {
         uint256 iKingsCost = (TokenMarket.iKingsBatch * TokenMarket.iLevelPrice) / 10**18;

         require(IPayToken.balanceOf(msg.sender) > iKingsCost, "ALERT: Not enough token for buy!");
         require(IPayToken.allowance(msg.sender, address(this)) > iKingsCost, "ALERT: Not enough token for buy!");
         require(TokenMarket.iKingsAmount >= TokenMarket.iKingsBatch, "ALERT: Not engough token please call the admin!");

         IPayToken.safeTransferFrom(msg.sender, address(this), iKingsCost);
         TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iKingsBatch);
         TokenMarket.iKingsAmount = TokenMarket.iKingsAmount.sub(TokenMarket.iKingsBatch);

         bAllowAlloc[msg.sender] = false;
      } else if(buyerLevel == UserLevel.Jack) {
         uint256 iJacksCost = (TokenMarket.iJacksBatch * TokenMarket.iLevelPrice) / 10**18;

         require(IPayToken.balanceOf(msg.sender) > iJacksCost, "ALERT: Not enough token for buy!");
         require(IPayToken.allowance(msg.sender, address(this)) > iJacksCost, "ALERT: Not enough allowance for buy!");
         require(TokenMarket.iJacksAmount >= TokenMarket.iJacksBatch, "ALERT: Not engough token please call the admin!");

         IPayToken.safeTransferFrom(msg.sender, address(this), iJacksCost);
         TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iJacksBatch);
         TokenMarket.iJacksAmount = TokenMarket.iJacksAmount.sub(TokenMarket.iJacksBatch);

         bAllowAlloc[msg.sender] = false;
      } else if(buyerLevel == UserLevel.Guard) {
         uint256 iGuardsCost = (TokenMarket.iGuardsBatch * TokenMarket.iLevelPrice) / 10**18;

         require(IPayToken.balanceOf(msg.sender) > iGuardsCost, "ALERT: Not enough token for buy!");
         require(IPayToken.allowance(msg.sender, address(this)) > iGuardsCost, "ALERT: Not enough allowance for buy!");
         require(TokenMarket.iGuardsAmount >= TokenMarket.iGuardsBatch, "ALERT: Not engough token please call the admin!");

         IPayToken.safeTransferFrom(msg.sender, address(this), iGuardsCost);
         TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iGuardsBatch);
         TokenMarket.iGuardsAmount = TokenMarket.iGuardsAmount.sub(TokenMarket.iGuardsBatch);

         bAllowAlloc[msg.sender] = false;
      }


   }

   function buyToken(uint256 amount) public payable {
      require(amount > 0, "ALERT: You can not buy nothing!");
      require(TokenMarket.marketPhase == MarketPhase.PublicSale, "ALERT: Public Sale not opend now!");

      uint256 iCost = (amount * TokenMarket.iTokenPrice) / 10**18;

      require(TokenMarket.iPublicSaleAmount > 0, "ALERT: Contract is empty");
      require(TokenMarket.iPublicSaleAmount > amount, "ALERT: Not enough token to buy!");
      require(IPayToken.balanceOf(msg.sender) > iCost, "ALERT: Not enough money for payment!");
      require(IPayToken.allowance(msg.sender, address(this)) > iCost, "ALERT: Not enough allowance for buy!");

      IPayToken.safeTransferFrom(msg.sender, address(this), iCost);
      TokenMarket.ISaleToken.safeTransfer(msg.sender, amount);
      TokenMarket.iPublicSaleAmount = TokenMarket.iPublicSaleAmount.sub(amount);

      if(TokenMarket.iPublicSaleAmount == 0) {
         TokenMarket.marketPhase = MarketPhase.Closed;
      }
   }

   function doPayout() public _needsAdmin() {
      require(TokenMarket.marketPhase == MarketPhase.Closed, "ALERT: Sale is open, no payout!");

      uint256 iAmount = IPayToken.balanceOf(address(this));
      uint256 iCommission = (iAmount * iPercentage) / 100;
      iAmount = iAmount.sub(iCommission);
      IPayToken.safeTransfer(addrDev, iCommission);
      IPayToken.safeTransfer(addrPayout, iAmount);
   }

   function setCommissionPercentage(uint256 percentage) public _needsAdmin() {
      iPercentage = percentage;
   }

   function getMarketPhase() public view returns (MarketPhase) {
      return TokenMarket.marketPhase;
   }

   function setMarketPhase(MarketPhase phase) public _needsAdmin() {
      TokenMarket.marketPhase = phase;
   }

   function setAdmin(address addr) public _needsAdmin() {
      addrAdmin = addr;
   }

   // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders
   function recoverERC20(address tokenAddress, uint256 tokenAmount) external _needsAdmin() {
      IERC20(tokenAddress).safeTransfer(addrDev, tokenAmount);
      emit Recovered(tokenAddress, tokenAmount);
   }

   event Recovered(address token, uint256 amount);
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"userpool","internalType":"contract IUserPool"},{"type":"address","name":"paytoken","internalType":"contract IERC20"},{"type":"address","name":"saletoken","internalType":"contract IERC20"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"price","internalType":"uint256"},{"type":"address","name":"payout","internalType":"address"},{"type":"uint256","name":"iMaturity","internalType":"uint256"}]},{"type":"event","name":"Recovered","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"ISaleToken","internalType":"contract IERC20"},{"type":"uint256","name":"iTokenAmount","internalType":"uint256"},{"type":"uint256","name":"iPublicSaleAmount","internalType":"uint256"},{"type":"uint256","name":"iAcesAmount","internalType":"uint256"},{"type":"uint256","name":"iAcesBatch","internalType":"uint256"},{"type":"uint256","name":"iKingsAmount","internalType":"uint256"},{"type":"uint256","name":"iKingsBatch","internalType":"uint256"},{"type":"uint256","name":"iJacksAmount","internalType":"uint256"},{"type":"uint256","name":"iJacksBatch","internalType":"uint256"},{"type":"uint256","name":"iGuardsAmount","internalType":"uint256"},{"type":"uint256","name":"iGuardsBatch","internalType":"uint256"},{"type":"uint256","name":"iTokenPrice","internalType":"uint256"},{"type":"uint256","name":"iLevelPrice","internalType":"uint256"},{"type":"uint8","name":"marketPhase","internalType":"enum cStarIDO.MarketPhase"}],"name":"TokenMarket","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"bAllowAlloc","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"buyToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"doPayout","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"getAllocation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"getAllowAlloc","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum cStarIDO.MarketPhase"}],"name":"getMarketPhase","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"getPayToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum cStarIDO.UserLevel"}],"name":"mapUserLevel","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openAlloc","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openPublicSale","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recoverERC20","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCommissionPercentage","inputs":[{"type":"uint256","name":"percentage","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketPhase","inputs":[{"type":"uint8","name":"phase","internalType":"enum cStarIDO.MarketPhase"}]}]
              

Contract Creation Code

0x6080604052600760095562278d00600a553480156200001d57600080fd5b50604051620043ac380380620043ac833981810160405260e08110156200004357600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a81905550600060028581620001a757fe5b04905085600d60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600d6001018190555080600d60020181905550606460238202816200021057fe5b04600d60030181905550606460148202816200022857fe5b04600d60050181905550606460148202816200024057fe5b04600d60070181905550606460198202816200025857fe5b04600d6009018190555083600d600b0181905550600284816200027757fe5b04600d600c01819055506000600d800160006101000a81548160ff02191690836003811115620002a357fe5b021790555050505050505050506140ec80620002c06000396000f3fe6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d261461047c578063b585209b14610493578063c57a0295146104aa576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104eb565b005b34801561010357600080fd5b5061010c6117b1565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b36565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b56565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b81019080803590602001909291905050506120ab565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121ce565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612224565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca612244565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff16906020019092919050505061225d565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061239e565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124fb565b005b3480156103e157600080fd5b506103ea6126b8565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045e57fe5b81526020019e50505050505050505050505050505060405180910390f35b34801561048857600080fd5b5061049161273f565b005b34801561049f57600080fd5b506104a8613824565b005b3480156104b657600080fd5b506104bf6139d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f857fe5b600d800160009054906101000a900460ff16600381111561051557fe5b14610588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614009603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068f57fe5b81600481111561069b57fe5b1415610adc576000670de0b6b3a7640000600d600c0154600d6004015402816106c057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561074d57600080fd5b505afa158015610761573d6000803e3d6000fd5b505050506040513d602081101561077757600080fd5b8101908080519060200190929190505050116107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156108a357600080fd5b505afa1580156108b7573d6000803e3d6000fd5b505050506040513d60208110156108cd57600080fd5b810190808051906020019092919050505011610951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60040154600d6003015410156109b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610a03333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610a5833600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610a75600d60040154600d60030154613b6390919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ae565b60026004811115610ae957fe5b816004811115610af557fe5b1415610f36576000670de0b6b3a7640000600d600c0154600d600601540281610b1a57fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b810190808051906020019092919050505011610c55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cfd57600080fd5b505afa158015610d11573d6000803e3d6000fd5b505050506040513d6020811015610d2757600080fd5b810190808051906020019092919050505011610dab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610e5d333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610eb233600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610ecf600d60060154600d60050154613b6390919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ad565b60036004811115610f4357fe5b816004811115610f4f57fe5b1415611373576000670de0b6b3a7640000600d600c0154600d600801540281610f7457fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561100157600080fd5b505afa158015611015573d6000803e3d6000fd5b505050506040513d602081101561102b57600080fd5b8101908080519060200190929190505050116110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561115757600080fd5b505afa15801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b8101908080519060200190929190505050116111e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d60080154600d60070154101561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b61129a333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6112ef33600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61130c600d60080154600d60070154613b6390919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ac565b60048081111561137f57fe5b81600481111561138b57fe5b14156117ab576000670de0b6b3a7640000600d600c0154600d600a015402816113b057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561143d57600080fd5b505afa158015611451573d6000803e3d6000fd5b505050506040513d602081101561146757600080fd5b8101908080519060200190929190505050116114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d60208110156115bd57600080fd5b810190808051906020019092919050505011611624576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d600a0154600d600901541015611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b6116d6333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b61172b33600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611748600d600a0154600d60090154613b6390919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118585750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6003808111156118d657fe5b600d800160009054906101000a900460ff1660038111156118f357fe5b14611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6020811015611a1b57600080fd5b8101908080519060200190929190505050905060006064600954830281611a3e57fe5b049050611a548183613b6390919063ffffffff16565b9150611ac360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611b32600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611bd957fe5b600d800160009054906101000a900460ff166003811115611bf657fe5b14611c4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140486021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c6657fe5b0490506000600d6002015411611ce4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d6002015411611d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d6020811015611e1257600080fd5b810190808051906020019092919050505011611e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140936024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b810190808051906020019092919050505011611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b612001333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6120513383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61206982600d60020154613b6390919063ffffffff16565b600d600201819055506000600d6002015414156120a7576003600d800160006101000a81548160ff021916908360038111156120a157fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121525750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d800160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d800160006101000a81548160ff0219169083600381111561239657fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124455750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125a25750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61265f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508e565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127e65750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128ea57600080fd5b505afa1580156128fe573d6000803e3d6000fd5b505050506040513d602081101561291457600080fd5b8101908080519060200190929190505050101561297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fb0602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129e757600080fd5b505afa1580156129fb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612a2557600080fd5b8101908080516040519392919084640100000000821115612a4557600080fd5b83820191506020820185811115612a5b57600080fd5b8251866020820283011164010000000082111715612a7857600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612aaf578082015181840152602081019050612a94565b5050505090500160405260200180516040519392919084640100000000821115612ad857600080fd5b83820191506020820185811115612aee57600080fd5b8251866020820283011164010000000082111715612b0b57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612b42578082015181840152602081019050612b27565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612bbe57600080fd5b505afa158015612bd2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612bfc57600080fd5b8101908080516040519392919084640100000000821115612c1c57600080fd5b83820191506020820185811115612c3257600080fd5b8251866020820283011164010000000082111715612c4f57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c86578082015181840152602081019050612c6b565b5050505090500160405260200180516040519392919084640100000000821115612caf57600080fd5b83820191506020820185811115612cc557600080fd5b8251866020820283011164010000000082111715612ce257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d19578082015181840152602081019050612cfe565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d9557600080fd5b505afa158015612da9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612dd357600080fd5b8101908080516040519392919084640100000000821115612df357600080fd5b83820191506020820185811115612e0957600080fd5b8251866020820283011164010000000082111715612e2657600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e5d578082015181840152602081019050612e42565b5050505090500160405260200180516040519392919084640100000000821115612e8657600080fd5b83820191506020820185811115612e9c57600080fd5b8251866020820283011164010000000082111715612eb957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ef0578082015181840152602081019050612ed5565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f6c57600080fd5b505afa158015612f80573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612faa57600080fd5b8101908080516040519392919084640100000000821115612fca57600080fd5b83820191506020820185811115612fe057600080fd5b8251866020820283011164010000000082111715612ffd57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613034578082015181840152602081019050613019565b505050509050016040526020018051604051939291908464010000000082111561305d57600080fd5b8382019150602082018581111561307357600080fd5b825186602082028301116401000000008211171561309057600080fd5b8083526020830192505050908051906020019060200280838360005b838110156130c75780820151818401526020810190506130ac565b505050509050016040525050509150915060008851111561329e5760005b88518110156132705742600a548983815181106130fe57fe5b602002602001015101101561326357600389828151811061311b57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061319557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b848151811061320057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561325d57fe5b02179055505b80806001019150506130e5565b506000600380549050111561329d57600380549050600d600301548161329257fe5b04600d600401819055505b5b6000865111156134645760005b86518110156134365742600a548783815181106132c457fe5b60200260200101510110156134295760048782815181106132e157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061335b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c60008984815181106133c657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561342357fe5b02179055505b80806001019150506132ab565b506000600480549050111561346357600480549050600d600501548161345857fe5b04600d600601819055505b5b6000600580549050111561362e5760005b84518110156136005742600a5485838151811061348e57fe5b60200260200101510110156135f35760058582815181106134ab57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600087848151811061352557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061359057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135ed57fe5b02179055505b8080600101915050613475565b506000600580549050111561362d57600580549050600d600701548161362257fe5b04600d600801819055505b5b6000825111156137f45760005b82518110156137c65742600a5483838151811061365457fe5b60200260200101510110156137b957600683828151811061367157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136eb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061375657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156137b357fe5b02179055505b808060010191505061363b565b50600060068054905011156137f357600680549050600d60090154816137e857fe5b04600d600a01819055505b5b6001600d800160006101000a81548160ff0219169083600381111561381557fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138cb5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61393d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b60006139a1600d60090154613993600d60070154613985600d60050154613977600d60030154600d60020154613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b905080600d600201819055506002600d800160006101000a81548160ff021916908360038111156139ce57fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613abb846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b50505050565b613b5e8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b505050565b6000613ba583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e80565b905092915050565b600080828401905083811015613c2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c548273ffffffffffffffffffffffffffffffffffffffff16613f40565b613cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613d155780518252602082019150602081019050602083039250613cf2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d77576040519150601f19603f3d011682016040523d82523d6000602084013e613d7c565b606091505b509150915081613df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e7a57808060200190516020811015613e1357600080fd5b8101908080519060200190929190505050613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614069602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613f2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef2578082015181840152602081019050613ed7565b50505050905090810190601f168015613f1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f8257506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f77215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a2646970667358221220167026b29a667559cb11a081104eb0b946483e53ab15652e61b36ccdb9f774bd64736f6c634300060c00330000000000000000000000004d06464bc97af140122153dba02b11dfdf7f8134000000000000000000000000007b1dcc6ac10f3f689eb1edce7a2338cd39ceed000000000000000000000000452ef5a4bd00796e62e5e5758548e0da6e8ccdf3000000000000000000000000000000000000000000000a968163f0a57b40000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001b3c1205dbb7ca4e3b1780a86d147dccf4b0dc57000000000000000000000000000000000000000000000000000000000000003c

Deployed ByteCode

0x6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d261461047c578063b585209b14610493578063c57a0295146104aa576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104eb565b005b34801561010357600080fd5b5061010c6117b1565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b36565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b56565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b81019080803590602001909291905050506120ab565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121ce565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612224565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca612244565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff16906020019092919050505061225d565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061239e565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124fb565b005b3480156103e157600080fd5b506103ea6126b8565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045e57fe5b81526020019e50505050505050505050505050505060405180910390f35b34801561048857600080fd5b5061049161273f565b005b34801561049f57600080fd5b506104a8613824565b005b3480156104b657600080fd5b506104bf6139d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f857fe5b600d800160009054906101000a900460ff16600381111561051557fe5b14610588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614009603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068f57fe5b81600481111561069b57fe5b1415610adc576000670de0b6b3a7640000600d600c0154600d6004015402816106c057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561074d57600080fd5b505afa158015610761573d6000803e3d6000fd5b505050506040513d602081101561077757600080fd5b8101908080519060200190929190505050116107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156108a357600080fd5b505afa1580156108b7573d6000803e3d6000fd5b505050506040513d60208110156108cd57600080fd5b810190808051906020019092919050505011610951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60040154600d6003015410156109b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610a03333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610a5833600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610a75600d60040154600d60030154613b6390919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ae565b60026004811115610ae957fe5b816004811115610af557fe5b1415610f36576000670de0b6b3a7640000600d600c0154600d600601540281610b1a57fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b810190808051906020019092919050505011610c55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cfd57600080fd5b505afa158015610d11573d6000803e3d6000fd5b505050506040513d6020811015610d2757600080fd5b810190808051906020019092919050505011610dab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610e5d333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610eb233600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610ecf600d60060154600d60050154613b6390919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ad565b60036004811115610f4357fe5b816004811115610f4f57fe5b1415611373576000670de0b6b3a7640000600d600c0154600d600801540281610f7457fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561100157600080fd5b505afa158015611015573d6000803e3d6000fd5b505050506040513d602081101561102b57600080fd5b8101908080519060200190929190505050116110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561115757600080fd5b505afa15801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b8101908080519060200190929190505050116111e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d60080154600d60070154101561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b61129a333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6112ef33600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61130c600d60080154600d60070154613b6390919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ac565b60048081111561137f57fe5b81600481111561138b57fe5b14156117ab576000670de0b6b3a7640000600d600c0154600d600a015402816113b057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561143d57600080fd5b505afa158015611451573d6000803e3d6000fd5b505050506040513d602081101561146757600080fd5b8101908080519060200190929190505050116114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d60208110156115bd57600080fd5b810190808051906020019092919050505011611624576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d600a0154600d600901541015611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b6116d6333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b61172b33600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611748600d600a0154600d60090154613b6390919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118585750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6003808111156118d657fe5b600d800160009054906101000a900460ff1660038111156118f357fe5b14611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6020811015611a1b57600080fd5b8101908080519060200190929190505050905060006064600954830281611a3e57fe5b049050611a548183613b6390919063ffffffff16565b9150611ac360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611b32600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611bd957fe5b600d800160009054906101000a900460ff166003811115611bf657fe5b14611c4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140486021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c6657fe5b0490506000600d6002015411611ce4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d6002015411611d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d6020811015611e1257600080fd5b810190808051906020019092919050505011611e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140936024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b810190808051906020019092919050505011611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b612001333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6120513383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61206982600d60020154613b6390919063ffffffff16565b600d600201819055506000600d6002015414156120a7576003600d800160006101000a81548160ff021916908360038111156120a157fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121525750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d800160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d800160006101000a81548160ff0219169083600381111561239657fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124455750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125a25750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61265f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508e565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127e65750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128ea57600080fd5b505afa1580156128fe573d6000803e3d6000fd5b505050506040513d602081101561291457600080fd5b8101908080519060200190929190505050101561297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fb0602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129e757600080fd5b505afa1580156129fb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612a2557600080fd5b8101908080516040519392919084640100000000821115612a4557600080fd5b83820191506020820185811115612a5b57600080fd5b8251866020820283011164010000000082111715612a7857600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612aaf578082015181840152602081019050612a94565b5050505090500160405260200180516040519392919084640100000000821115612ad857600080fd5b83820191506020820185811115612aee57600080fd5b8251866020820283011164010000000082111715612b0b57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612b42578082015181840152602081019050612b27565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612bbe57600080fd5b505afa158015612bd2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612bfc57600080fd5b8101908080516040519392919084640100000000821115612c1c57600080fd5b83820191506020820185811115612c3257600080fd5b8251866020820283011164010000000082111715612c4f57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c86578082015181840152602081019050612c6b565b5050505090500160405260200180516040519392919084640100000000821115612caf57600080fd5b83820191506020820185811115612cc557600080fd5b8251866020820283011164010000000082111715612ce257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d19578082015181840152602081019050612cfe565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d9557600080fd5b505afa158015612da9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612dd357600080fd5b8101908080516040519392919084640100000000821115612df357600080fd5b83820191506020820185811115612e0957600080fd5b8251866020820283011164010000000082111715612e2657600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e5d578082015181840152602081019050612e42565b5050505090500160405260200180516040519392919084640100000000821115612e8657600080fd5b83820191506020820185811115612e9c57600080fd5b8251866020820283011164010000000082111715612eb957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ef0578082015181840152602081019050612ed5565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f6c57600080fd5b505afa158015612f80573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612faa57600080fd5b8101908080516040519392919084640100000000821115612fca57600080fd5b83820191506020820185811115612fe057600080fd5b8251866020820283011164010000000082111715612ffd57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613034578082015181840152602081019050613019565b505050509050016040526020018051604051939291908464010000000082111561305d57600080fd5b8382019150602082018581111561307357600080fd5b825186602082028301116401000000008211171561309057600080fd5b8083526020830192505050908051906020019060200280838360005b838110156130c75780820151818401526020810190506130ac565b505050509050016040525050509150915060008851111561329e5760005b88518110156132705742600a548983815181106130fe57fe5b602002602001015101101561326357600389828151811061311b57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061319557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b848151811061320057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561325d57fe5b02179055505b80806001019150506130e5565b506000600380549050111561329d57600380549050600d600301548161329257fe5b04600d600401819055505b5b6000865111156134645760005b86518110156134365742600a548783815181106132c457fe5b60200260200101510110156134295760048782815181106132e157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061335b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c60008984815181106133c657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561342357fe5b02179055505b80806001019150506132ab565b506000600480549050111561346357600480549050600d600501548161345857fe5b04600d600601819055505b5b6000600580549050111561362e5760005b84518110156136005742600a5485838151811061348e57fe5b60200260200101510110156135f35760058582815181106134ab57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600087848151811061352557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061359057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135ed57fe5b02179055505b8080600101915050613475565b506000600580549050111561362d57600580549050600d600701548161362257fe5b04600d600801819055505b5b6000825111156137f45760005b82518110156137c65742600a5483838151811061365457fe5b60200260200101510110156137b957600683828151811061367157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136eb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061375657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156137b357fe5b02179055505b808060010191505061363b565b50600060068054905011156137f357600680549050600d60090154816137e857fe5b04600d600a01819055505b5b6001600d800160006101000a81548160ff0219169083600381111561381557fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138cb5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61393d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b60006139a1600d60090154613993600d60070154613985600d60050154613977600d60030154600d60020154613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b905080600d600201819055506002600d800160006101000a81548160ff021916908360038111156139ce57fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613abb846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b50505050565b613b5e8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b505050565b6000613ba583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e80565b905092915050565b600080828401905083811015613c2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c548273ffffffffffffffffffffffffffffffffffffffff16613f40565b613cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613d155780518252602082019150602081019050602083039250613cf2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d77576040519150601f19603f3d011682016040523d82523d6000602084013e613d7c565b606091505b509150915081613df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e7a57808060200190516020811015613e1357600080fd5b8101908080519060200190929190505050613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614069602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613f2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef2578082015181840152602081019050613ed7565b50505050905090810190601f168015613f1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f8257506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f77215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a2646970667358221220167026b29a667559cb11a081104eb0b946483e53ab15652e61b36ccdb9f774bd64736f6c634300060c0033