ETH Price: $3,321.84 (-0.77%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Market

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-29
*/

// File: contracts/external/openzeppelin-solidity/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @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.
     *
     * _Available since v2.4.0._
     */
    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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

library SafeMath64 {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint64 a, uint64 b) internal pure returns (uint64) {
        uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint64 c = a - b;

        return c;
    }

    /**
     * @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.
     *
     * _Available since v2.4.0._
     */
    function sub(uint64 a, uint64 b, string memory errorMessage) internal pure returns (uint64) {
        require(b <= a, errorMessage);
        uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
        // 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;
        }

        uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint64 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(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: contracts/external/proxy/Proxy.sol

pragma solidity 0.5.7;


/**
 * @title Proxy
 * @dev Gives the possibility to delegate any call to a foreign implementation.
 */
contract Proxy {
    /**
    * @dev Fallback function allowing to perform a delegatecall to the given implementation.
    * This function will return whatever the implementation call returns
    */
    function () external payable {
        address _impl = implementation();
        require(_impl != address(0));

        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize)
            let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
            let size := returndatasize
            returndatacopy(ptr, 0, size)

            switch result
            case 0 { revert(ptr, size) }
            default { return(ptr, size) }
            }
    }

    /**
    * @dev Tells the address of the implementation where every call will be delegated.
    * @return address of the implementation to which it will be delegated
    */
    function implementation() public view returns (address);
}

// File: contracts/external/proxy/UpgradeabilityProxy.sol

pragma solidity 0.5.7;



/**
 * @title UpgradeabilityProxy
 * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
 */
contract UpgradeabilityProxy is Proxy {
    /**
    * @dev This event will be emitted every time the implementation gets upgraded
    * @param implementation representing the address of the upgraded implementation
    */
    event Upgraded(address indexed implementation);

    // Storage position of the address of the current implementation
    bytes32 private constant IMPLEMENTATION_POSITION = keccak256("org.govblocks.proxy.implementation");

    /**
    * @dev Constructor function
    */
    constructor() public {}

    /**
    * @dev Tells the address of the current implementation
    * @return address of the current implementation
    */
    function implementation() public view returns (address impl) {
        bytes32 position = IMPLEMENTATION_POSITION;
        assembly {
            impl := sload(position)
        }
    }

    /**
    * @dev Sets the address of the current implementation
    * @param _newImplementation address representing the new implementation to be set
    */
    function _setImplementation(address _newImplementation) internal {
        bytes32 position = IMPLEMENTATION_POSITION;
        assembly {
        sstore(position, _newImplementation)
        }
    }

    /**
    * @dev Upgrades the implementation address
    * @param _newImplementation representing the address of the new implementation to be set
    */
    function _upgradeTo(address _newImplementation) internal {
        address currentImplementation = implementation();
        require(currentImplementation != _newImplementation);
        _setImplementation(_newImplementation);
        emit Upgraded(_newImplementation);
    }
}

// File: contracts/external/proxy/OwnedUpgradeabilityProxy.sol

pragma solidity 0.5.7;



/**
 * @title OwnedUpgradeabilityProxy
 * @dev This contract combines an upgradeability proxy with basic authorization control functionalities
 */
contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
    /**
    * @dev Event to show ownership has been transferred
    * @param previousOwner representing the address of the previous owner
    * @param newOwner representing the address of the new owner
    */
    event ProxyOwnershipTransferred(address previousOwner, address newOwner);

    // Storage position of the owner of the contract
    bytes32 private constant PROXY_OWNER_POSITION = keccak256("org.govblocks.proxy.owner");

    /**
    * @dev the constructor sets the original owner of the contract to the sender account.
    */
    constructor(address _implementation) public {
        _setUpgradeabilityOwner(msg.sender);
        _upgradeTo(_implementation);
    }

    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyProxyOwner() {
        require(msg.sender == proxyOwner());
        _;
    }

    /**
    * @dev Tells the address of the owner
    * @return the address of the owner
    */
    function proxyOwner() public view returns (address owner) {
        bytes32 position = PROXY_OWNER_POSITION;
        assembly {
            owner := sload(position)
        }
    }

    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param _newOwner The address to transfer ownership to.
    */
    function transferProxyOwnership(address _newOwner) public onlyProxyOwner {
        require(_newOwner != address(0));
        _setUpgradeabilityOwner(_newOwner);
        emit ProxyOwnershipTransferred(proxyOwner(), _newOwner);
    }

    /**
    * @dev Allows the proxy owner to upgrade the current version of the proxy.
    * @param _implementation representing the address of the new implementation to be set.
    */
    function upgradeTo(address _implementation) public onlyProxyOwner {
        _upgradeTo(_implementation);
    }

    /**
     * @dev Sets the address of the owner
    */
    function _setUpgradeabilityOwner(address _newProxyOwner) internal {
        bytes32 position = PROXY_OWNER_POSITION;
        assembly {
            sstore(position, _newProxyOwner)
        }
    }
}

// File: contracts/interfaces/IMarketUtility.sol

pragma solidity 0.5.7;
contract IMarketUtility {

    function initialize(address payable[] calldata _addressParams, address _initiater) external;

	/**
     * @dev to Set authorized address to update parameters 
     */
    function setAuthorizedAddres() public;

	/**
     * @dev to update uint parameters in Market Config 
     */
    function updateUintParameters(bytes8 code, uint256 value) external;

    /**
     * @dev to Update address parameters in Market Config 
     */
    function updateAddressParameters(bytes8 code, address payable value) external;
 
     /**
    * @dev Get Parameters required to initiate market
    * @return Addresses of tokens to be distributed as incentives
    * @return Cool down time for market
    * @return Rate
    * @return Commission percent for predictions with ETH
    * @return Commission percent for predictions with PLOT
    **/
    function getMarketInitialParams() public view returns(address[] memory, uint , uint, uint, uint);

    function getAssetPriceUSD(address _currencyAddress) external view returns(uint latestAnswer);
    
    function getPriceFeedDecimals(address _priceFeed) public view returns(uint8);

    function getValueAndMultiplierParameters(address _asset, uint256 _amount)
        public
        view
        returns (uint256, uint256);

    function update() external;
    
    function calculatePredictionValue(uint[] memory params, address asset, address user, address marketFeedAddress, bool _checkMultiplier) public view returns(uint _predictionValue, bool _multiplierApplied);
    
    /**
     * @dev Get basic market details
     * @return Minimum amount required to predict in market
     * @return Percentage of users leveraged amount to deduct when placed in wrong prediction
     * @return Decimal points for prediction positions
     **/
    function getBasicMarketDetails()
        public
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        );

    function getDisputeResolutionParams() public view returns (uint256);
    function calculateOptionPrice(uint[] memory params, address marketFeedAddress) public view returns(uint _optionPrice);

    /**
     * @dev Get price of provided feed address
     * @param _currencyFeedAddress  Feed Address of currency on which market options are based on
     * @return Current price of the market currency
     **/
    function getSettlemetPrice(
        address _currencyFeedAddress,
        uint256 _settleTime
    ) public view returns (uint256 latestAnswer, uint256 roundId);

    /**
     * @dev Get value of provided currency address in ETH
     * @param _currencyAddress Address of currency
     * @param _amount Amount of provided currency
     * @return Value of provided amount in ETH
     **/
    function getAssetValueETH(address _currencyAddress, uint256 _amount)
        public
        view
        returns (uint256 tokenEthValue);
}

// File: contracts/interfaces/IToken.sol

pragma solidity 0.5.7;

contract IToken {

    function decimals() external view returns(uint8);

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external view returns (uint256);

    /**
    * @dev Gets the balance of the specified address.
    * @param account The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address account) external view returns (uint256);

    /**
    * @dev Transfer token for a specified address
    * @param recipient The address to transfer to.
    * @param amount The amount to be transferred.
    */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
    * @dev function that mints an amount of the token and assigns it to
    * an account.
    * @param account The account that will receive the created tokens.
    * @param amount The amount that will be created.
    */
    function mint(address account, uint256 amount) external returns (bool);
    
     /**
    * @dev burns an amount of the tokens of the message sender
    * account.
    * @param amount The amount that will be burnt.
    */
    function burn(uint256 amount) external;

    /**
     * @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.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
    * @dev Transfer tokens from one address to another
    * @param sender address The address which you want to send tokens from
    * @param recipient address The address which you want to transfer to
    * @param amount uint256 the amount of tokens to be transferred
    */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

}

// File: contracts/interfaces/ITokenController.sol

pragma solidity 0.5.7;

contract ITokenController {
	address public token;
    address public bLOTToken;

    /**
    * @dev Swap BLOT token.
    * account.
    * @param amount The amount that will be swapped.
    */
    function swapBLOT(address _of, address _to, uint256 amount) public;

    function totalBalanceOf(address _of)
        public
        view
        returns (uint256 amount);

    function transferFrom(address _token, address _of, address _to, uint256 amount) public;

    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason at a specific time
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     * @param _time The timestamp to query the lock tokens for
     */
    function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time)
        public
        view
        returns (uint256 amount);

    /**
    * @dev burns an amount of the tokens of the message sender
    * account.
    * @param amount The amount that will be burnt.
    */
    function burnCommissionTokens(uint256 amount) external returns(bool);
 
    function initiateVesting(address _vesting) external;

    function lockForGovernanceVote(address _of, uint _days) public;

    function totalSupply() public view returns (uint256);

    function mint(address _member, uint _amount) public;

}

// File: contracts/interfaces/IMarketRegistry.sol

pragma solidity 0.5.7;

contract IMarketRegistry {

    enum MarketType {
      HourlyMarket,
      DailyMarket,
      WeeklyMarket
    }
    address public owner;
    address public tokenController;
    address public marketUtility;
    bool public marketCreationPaused;

    mapping(address => bool) public isMarket;
    function() external payable{}

    function marketDisputeStatus(address _marketAddress) public view returns(uint _status);

    function burnDisputedProposalTokens(uint _proposaId) external;

    function isWhitelistedSponsor(address _address) public view returns(bool);

    function transferAssets(address _asset, address _to, uint _amount) external;

    /**
    * @dev Initialize the PlotX.
    * @param _marketConfig The address of market config.
    * @param _plotToken The address of PLOT token.
    */
    function initiate(address _defaultAddress, address _marketConfig, address _plotToken, address payable[] memory _configParams) public;

    /**
    * @dev Create proposal if user wants to raise the dispute.
    * @param proposalTitle The title of proposal created by user.
    * @param description The description of dispute.
    * @param solutionHash The ipfs solution hash.
    * @param actionHash The action hash for solution.
    * @param stakeForDispute The token staked to raise the diospute.
    * @param user The address who raises the dispute.
    */
    function createGovernanceProposal(string memory proposalTitle, string memory description, string memory solutionHash, bytes memory actionHash, uint256 stakeForDispute, address user, uint256 ethSentToPool, uint256 tokenSentToPool, uint256 proposedValue) public {
    }

    /**
    * @dev Emits the PlacePrediction event and sets user data.
    * @param _user The address who placed prediction.
    * @param _value The amount of ether user staked.
    * @param _predictionPoints The positions user will get.
    * @param _predictionAsset The prediction assets user will get.
    * @param _prediction The option range on which user placed prediction.
    * @param _leverage The leverage selected by user at the time of place prediction.
    */
    function setUserGlobalPredictionData(address _user,uint _value, uint _predictionPoints, address _predictionAsset, uint _prediction,uint _leverage) public{
    }

    /**
    * @dev Emits the claimed event.
    * @param _user The address who claim their reward.
    * @param _reward The reward which is claimed by user.
    * @param incentives The incentives of user.
    * @param incentiveToken The incentive tokens of user.
    */
    function callClaimedEvent(address _user , uint[] memory _reward, address[] memory predictionAssets, uint incentives, address incentiveToken) public {
    }

        /**
    * @dev Emits the MarketResult event.
    * @param _totalReward The amount of reward to be distribute.
    * @param _winningOption The winning option of the market.
    * @param _closeValue The closing value of the market currency.
    */
    function callMarketResultEvent(uint[] memory _totalReward, uint _winningOption, uint _closeValue, uint roundId) public {
    }
}

// File: contracts/Market.sol

/* Copyright (C) 2020 PlotX.io

  This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

  This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ */

pragma solidity 0.5.7;







contract Market {
    using SafeMath for *;

    enum PredictionStatus {
      Live,
      InSettlement,
      Cooling,
      InDispute,
      Settled
    }
    
    struct option
    {
      uint predictionPoints;
      mapping(address => uint256) assetStaked;
      mapping(address => uint256) assetLeveraged;
    }

    struct MarketSettleData {
      uint64 WinningOption;
      uint64 settleTime;
    }

    address constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address constant marketFeedAddress = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
    address constant plotToken = 0x72F020f8f3E8fd9382705723Cd26380f8D0c66Bb;

    IMarketRegistry constant marketRegistry = IMarketRegistry(0xE210330d6768030e816d223836335079C7A0c851);
    ITokenController constant tokenController = ITokenController(0x12d7053Efc680Ba6671F8Cb96d1421D906ce3dE2);
    IMarketUtility constant marketUtility = IMarketUtility(0x2330058D49fA61D5C5405fA8B17fcD823c59F7Bb);

    uint8 constant roundOfToNearest = 1;
    uint constant totalOptions = 3;
    uint constant MAX_LEVERAGE = 5;
    uint constant ethCommissionPerc = 10; //with 2 decimals
    uint constant plotCommissionPerc = 5; //with 2 decimals
    bytes32 public constant marketCurrency = "ETH/USD";
    
    bool internal lockedForDispute;
    address internal incentiveToken;
    uint internal ethAmountToPool;
    uint internal ethCommissionAmount;
    uint internal plotCommissionAmount;
    uint internal tokenAmountToPool;
    uint internal incentiveToDistribute;
    uint[] internal rewardToDistribute;
    PredictionStatus internal predictionStatus;

    
    struct UserData {
      bool claimedReward;
      bool predictedWithBlot;
      bool multiplierApplied;
      mapping(uint => uint) predictionPoints;
      mapping(address => mapping(uint => uint)) assetStaked;
      mapping(address => mapping(uint => uint)) LeverageAsset;
    }

    struct MarketData {
      uint64 startTime;
      uint64 predictionTime;
      uint64 neutralMinValue;
      uint64 neutralMaxValue;
    }

    MarketData public marketData;
    MarketSettleData public marketSettleData;

    mapping(address => UserData) internal userData;

    mapping(uint=>option) public optionsAvailable;

    /**
    * @dev Initialize the market.
    * @param _startTime The time at which market will create.
    * @param _predictionTime The time duration of market.
    * @param _minValue The minimum value of neutral option range.
    * @param _maxValue The maximum value of neutral option range.
    */
    function initiate(uint64 _startTime, uint64 _predictionTime, uint64 _minValue, uint64 _maxValue) public payable {
      OwnedUpgradeabilityProxy proxy =  OwnedUpgradeabilityProxy(address(uint160(address(this))));
      require(msg.sender == proxy.proxyOwner(),"Sender is not proxy owner.");
      require(marketData.startTime == 0, "Already initialized");
      require(_startTime.add(_predictionTime) > now);
      marketData.startTime = _startTime;
      marketData.predictionTime = _predictionTime;
      
      marketData.neutralMinValue = _minValue;
      marketData.neutralMaxValue = _maxValue;
    }

    /**
    * @dev Place prediction on the available options of the market.
    * @param _asset The asset used by user during prediction whether it is plotToken address or in ether.
    * @param _predictionStake The amount staked by user at the time of prediction.
    * @param _prediction The option on which user placed prediction.
    * @param _leverage The leverage opted by user at the time of prediction.
    */
    function placePrediction(address _asset, uint256 _predictionStake, uint256 _prediction,uint256 _leverage) public payable {
      require(!marketRegistry.marketCreationPaused() && _prediction <= totalOptions && _leverage <= MAX_LEVERAGE);
      require(now >= marketData.startTime && now <= marketExpireTime());

      uint256 _commissionStake;
      if(_asset == ETH_ADDRESS) {
        require(_predictionStake == msg.value);
        _commissionStake = _calculatePercentage(ethCommissionPerc, _predictionStake, 10000);
        ethCommissionAmount = ethCommissionAmount.add(_commissionStake);
      } else {
        require(msg.value == 0);
        if (_asset == plotToken){
          tokenController.transferFrom(plotToken, msg.sender, address(this), _predictionStake);
        } else {
          require(_asset == tokenController.bLOTToken());
          require(_leverage == MAX_LEVERAGE);
          require(!userData[msg.sender].predictedWithBlot);
          userData[msg.sender].predictedWithBlot = true;
          tokenController.swapBLOT(msg.sender, address(this), _predictionStake);
          _asset = plotToken;
        }
        _commissionStake = _calculatePercentage(plotCommissionPerc, _predictionStake, 10000);
        plotCommissionAmount = plotCommissionAmount.add(_commissionStake);
      }
      _commissionStake = _predictionStake.sub(_commissionStake);


      (uint predictionPoints, bool isMultiplierApplied) = calculatePredictionValue(_prediction, _commissionStake, _leverage, _asset);
      if(isMultiplierApplied) {
        userData[msg.sender].multiplierApplied = true; 
      }
      require(predictionPoints > 0);

      _storePredictionData(_prediction, _commissionStake, _asset, _leverage, predictionPoints);
      marketRegistry.setUserGlobalPredictionData(msg.sender,_predictionStake, predictionPoints, _asset, _prediction, _leverage);
    }

    function calculatePredictionValue(uint _prediction, uint _predictionStake, uint _leverage, address _asset) internal view returns(uint predictionPoints, bool isMultiplierApplied) {
      uint[] memory params = new uint[](11);
      params[0] = _prediction;
      params[1] = marketData.neutralMinValue;
      params[2] = marketData.neutralMaxValue;
      params[3] = marketData.startTime;
      params[4] = marketExpireTime();
      (params[5], params[6]) = getTotalAssetsStaked();
      params[7] = optionsAvailable[_prediction].assetStaked[ETH_ADDRESS];
      params[8] = optionsAvailable[_prediction].assetStaked[plotToken];
      params[9] = _predictionStake;
      params[10] = _leverage;
      bool checkMultiplier;
      if(!userData[msg.sender].multiplierApplied) {
        checkMultiplier = true;
      }
      (predictionPoints, isMultiplierApplied) = marketUtility.calculatePredictionValue(params, _asset, msg.sender, marketFeedAddress, checkMultiplier);
      
    }

    function getTotalAssetsStaked() public view returns(uint256 ethStaked, uint256 plotStaked) {
      for(uint256 i = 1; i<= totalOptions;i++) {
        ethStaked = ethStaked.add(optionsAvailable[i].assetStaked[ETH_ADDRESS]);
        plotStaked = plotStaked.add(optionsAvailable[i].assetStaked[plotToken]);
      }
    }

    function getTotalStakedValueInPLOT() public view returns(uint256) {
      (uint256 ethStaked, uint256 plotStaked) = getTotalAssetsStaked();
      (, ethStaked) = marketUtility.getValueAndMultiplierParameters(ETH_ADDRESS, ethStaked);
      return plotStaked.add(ethStaked);
    }

    /**
    * @dev Stores the prediction data.
    * @param _prediction The option on which user place prediction.
    * @param _predictionStake The amount staked by user at the time of prediction.
    * @param _asset The asset used by user during prediction.
    * @param _leverage The leverage opted by user during prediction.
    * @param predictionPoints The positions user got during prediction.
    */
    function _storePredictionData(uint _prediction, uint _predictionStake, address _asset, uint _leverage, uint predictionPoints) internal {
      userData[msg.sender].predictionPoints[_prediction] = userData[msg.sender].predictionPoints[_prediction].add(predictionPoints);
      userData[msg.sender].assetStaked[_asset][_prediction] = userData[msg.sender].assetStaked[_asset][_prediction].add(_predictionStake);
      userData[msg.sender].LeverageAsset[_asset][_prediction] = userData[msg.sender].LeverageAsset[_asset][_prediction].add(_predictionStake.mul(_leverage));
      optionsAvailable[_prediction].predictionPoints = optionsAvailable[_prediction].predictionPoints.add(predictionPoints);
      optionsAvailable[_prediction].assetStaked[_asset] = optionsAvailable[_prediction].assetStaked[_asset].add(_predictionStake);
      optionsAvailable[_prediction].assetLeveraged[_asset] = optionsAvailable[_prediction].assetLeveraged[_asset].add(_predictionStake.mul(_leverage));
    }

    /**
    * @dev Settle the market, setting the winning option
    */
    function settleMarket() external {
      (uint256 _value, uint256 _roundId) = marketUtility.getSettlemetPrice(marketFeedAddress, uint256(marketSettleTime()));
      if(marketStatus() == PredictionStatus.InSettlement) {
        _postResult(_value, _roundId);
      }
    }

    /**
    * @dev Calculate the result of market.
    * @param _value The current price of market currency.
    */
    function _postResult(uint256 _value, uint256 _roundId) internal {
      require(now >= marketSettleTime(),"Time not reached");
      require(_value > 0,"value should be greater than 0");
      uint riskPercentage;
      ( , riskPercentage, , ) = marketUtility.getBasicMarketDetails();
      if(predictionStatus != PredictionStatus.InDispute) {
        marketSettleData.settleTime = uint64(now);
      } else {
        delete marketSettleData.settleTime;
      }
      predictionStatus = PredictionStatus.Settled;
      if(_value < marketData.neutralMinValue) {
        marketSettleData.WinningOption = 1;
      } else if(_value > marketData.neutralMaxValue) {
        marketSettleData.WinningOption = 3;
      } else {
        marketSettleData.WinningOption = 2;
      }
      uint[] memory totalReward = new uint256[](2);
      if(optionsAvailable[marketSettleData.WinningOption].assetStaked[ETH_ADDRESS] > 0 ||
        optionsAvailable[marketSettleData.WinningOption].assetStaked[plotToken] > 0
      ){
        for(uint i=1;i <= totalOptions;i++){
          if(i!=marketSettleData.WinningOption) {
            uint256 leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[plotToken], 100);
            totalReward[0] = totalReward[0].add(leveragedAsset);
            leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[ETH_ADDRESS], 100);
            totalReward[1] = totalReward[1].add(leveragedAsset);
          }
        }
        rewardToDistribute = totalReward;
      } else {
        for(uint i=1;i <= totalOptions;i++){
          uint256 leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[plotToken], 100);
          tokenAmountToPool = tokenAmountToPool.add(leveragedAsset);
          leveragedAsset = _calculatePercentage(riskPercentage, optionsAvailable[i].assetLeveraged[ETH_ADDRESS], 100);
          ethAmountToPool = ethAmountToPool.add(leveragedAsset);
        }
      }
      _transferAsset(ETH_ADDRESS, address(marketRegistry), ethAmountToPool.add(ethCommissionAmount));
      _transferAsset(plotToken, address(marketRegistry), tokenAmountToPool.add(plotCommissionAmount));
      delete ethCommissionAmount;
      delete plotCommissionAmount;
      marketRegistry.callMarketResultEvent(rewardToDistribute, marketSettleData.WinningOption, _value, _roundId);
    }

    function _calculatePercentage(uint256 _percent, uint256 _value, uint256 _divisor) internal pure returns(uint256) {
      return _percent.mul(_value).div(_divisor);
    }

    /**
    * @dev Raise the dispute if wrong value passed at the time of market result declaration.
    * @param proposedValue The proposed value of market currency.
    * @param proposalTitle The title of proposal created by user.
    * @param description The description of dispute.
    * @param solutionHash The ipfs solution hash.
    */
    function raiseDispute(uint256 proposedValue, string memory proposalTitle, string memory description, string memory solutionHash) public {
      require(getTotalStakedValueInPLOT() > 0, "No participation");
      require(marketStatus() == PredictionStatus.Cooling);
      uint _stakeForDispute =  marketUtility.getDisputeResolutionParams();
      tokenController.transferFrom(plotToken, msg.sender, address(marketRegistry), _stakeForDispute);
      lockedForDispute = true;
      marketRegistry.createGovernanceProposal(proposalTitle, description, solutionHash, abi.encode(address(this), proposedValue), _stakeForDispute, msg.sender, ethAmountToPool, tokenAmountToPool, proposedValue);
      delete ethAmountToPool;
      delete tokenAmountToPool;
      predictionStatus = PredictionStatus.InDispute;
    }

    /**
    * @dev Resolve the dispute
    * @param accepted Flag mentioning if dispute is accepted or not
    * @param finalResult The final correct value of market currency.
    */
    function resolveDispute(bool accepted, uint256 finalResult) external payable {
      require(msg.sender == address(marketRegistry) && marketStatus() == PredictionStatus.InDispute);
      if(accepted) {
        _postResult(finalResult, 0);
      }
      lockedForDispute = false;
      predictionStatus = PredictionStatus.Settled;
    }

    function sponsorIncentives(address _token, uint256 _value) external {
      require(marketRegistry.isWhitelistedSponsor(msg.sender));
      require(marketStatus() <= PredictionStatus.InSettlement);
      require(incentiveToken == address(0), "Already sponsored");
      incentiveToken = _token;
      incentiveToDistribute = _value;
      tokenController.transferFrom(_token, msg.sender, address(this), _value);
    }


    /**
    * @dev Claim the return amount of the specified address.
    * @param _user The address to query the claim return amount of.
    * @return Flag, if 0:cannot claim, 1: Already Claimed, 2: Claimed
    */
    function claimReturn(address payable _user) public returns(uint256) {

      if(lockedForDispute || marketStatus() != PredictionStatus.Settled || marketRegistry.marketCreationPaused()) {
        return 0;
      }
      if(userData[_user].claimedReward) {
        return 1;
      }
      userData[_user].claimedReward = true;
      (uint[] memory _returnAmount, address[] memory _predictionAssets, uint _incentive, ) = getReturn(_user);
      _transferAsset(plotToken, _user, _returnAmount[0]);
      _transferAsset(ETH_ADDRESS, _user, _returnAmount[1]);
      _transferAsset(incentiveToken, _user, _incentive);
      marketRegistry.callClaimedEvent(_user, _returnAmount, _predictionAssets, _incentive, incentiveToken);
      return 2;
    }

    /**
    * @dev Transfer the assets to specified address.
    * @param _asset The asset transfer to the specific address.
    * @param _recipient The address to transfer the asset of
    * @param _amount The amount which is transfer.
    */
    function _transferAsset(address _asset, address payable _recipient, uint256 _amount) internal {
      if(_amount > 0) { 
        if(_asset == ETH_ADDRESS) {
          _recipient.transfer(_amount);
        } else {
          require(IToken(_asset).transfer(_recipient, _amount));
        }
      }
    }

    /**
    * @dev Get market settle time
    * @return the time at which the market result will be declared
    */
    function marketSettleTime() public view returns(uint64) {
      if(marketSettleData.settleTime > 0) {
        return marketSettleData.settleTime;
      }
      return uint64(marketData.startTime.add(marketData.predictionTime.mul(2)));
    }

    /**
    * @dev Get market expire time
    * @return the time upto which user can place predictions in market
    */
    function marketExpireTime() internal view returns(uint256) {
      return marketData.startTime.add(marketData.predictionTime);
    }

    /**
    * @dev Get market cooldown time
    * @return the time upto which user can raise the dispute after the market is settled
    */
    function marketCoolDownTime() public view returns(uint256) {
      return marketSettleData.settleTime.add(marketData.predictionTime.div(4));
    }

    /**
    * @dev Get market Feed data
    * @return market currency name
    * @return market currency feed address
    */
    function getMarketFeedData() public view returns(uint8, bytes32, address) {
      return (roundOfToNearest, marketCurrency, marketFeedAddress);
    }

   /**
    * @dev Get estimated amount of prediction points for given inputs.
    * @param _prediction The option on which user place prediction.
    * @param _stakeValueInEth The amount staked by user.
    * @param _leverage The leverage opted by user at the time of prediction.
    * @return uint256 representing the prediction points.
    */
    function estimatePredictionValue(uint _prediction, uint _stakeValueInEth, uint _leverage) public view returns(uint _predictionValue){
      (_predictionValue, ) = calculatePredictionValue(_prediction, _stakeValueInEth, _leverage, ETH_ADDRESS);
    }

    /**
    * @dev Gets the price of specific option.
    * @param _prediction The option number to query the balance of.
    * @return Price of the option.
    */
    function getOptionPrice(uint _prediction) public view returns(uint) {
      uint[] memory params = new uint[](9);
      params[0] = _prediction;
      params[1] = marketData.neutralMinValue;
      params[2] = marketData.neutralMaxValue;
      params[3] = marketData.startTime;
      params[4] = marketExpireTime();
      (params[5], params[6]) = getTotalAssetsStaked();
      params[7] = optionsAvailable[_prediction].assetStaked[ETH_ADDRESS];
      params[8] = optionsAvailable[_prediction].assetStaked[plotToken];
      return marketUtility.calculateOptionPrice(params, marketFeedAddress);
    }

    /**
    * @dev Gets number of positions user got in prediction
    * @param _user Address of user
    * @param _option Option Id
    */
    function getUserPredictionPoints(address _user, uint256 _option) external view returns(uint256) {
      return userData[_user].predictionPoints[_option];
    }

    /**
    * @dev Gets the market data.
    * @return _marketCurrency bytes32 representing the currency or stock name of the market.
    * @return minvalue uint[] memory representing the minimum range of all the options of the market.
    * @return maxvalue uint[] memory representing the maximum range of all the options of the market.
    * @return _optionPrice uint[] memory representing the option price of each option ranges of the market.
    * @return _ethStaked uint[] memory representing the ether staked on each option ranges of the market.
    * @return _plotStaked uint[] memory representing the plot staked on each option ranges of the market.
    * @return _predictionTime uint representing the type of market.
    * @return _expireTime uint representing the time at which market closes for prediction
    * @return _predictionStatus uint representing the status of the market.
    */
    function getData() public view returns
       (bytes32 _marketCurrency,uint[] memory minvalue,uint[] memory maxvalue,
        uint[] memory _optionPrice, uint[] memory _ethStaked, uint[] memory _plotStaked,uint _predictionTime,uint _expireTime, uint _predictionStatus){
        _marketCurrency = marketCurrency;
        _predictionTime = marketData.predictionTime;
        _expireTime =marketExpireTime();
        _predictionStatus = uint(marketStatus());
        minvalue = new uint[](totalOptions);
        minvalue[1] = marketData.neutralMinValue;
        minvalue[2] = marketData.neutralMaxValue.add(1);
        maxvalue = new uint[](totalOptions);
        maxvalue[0] = marketData.neutralMinValue.sub(1);
        maxvalue[1] = marketData.neutralMaxValue;
        maxvalue[2] = ~uint256(0);
        
        _optionPrice = new uint[](totalOptions);
        _ethStaked = new uint[](totalOptions);
        _plotStaked = new uint[](totalOptions);
        for (uint i = 0; i < totalOptions; i++) {
        _ethStaked[i] = optionsAvailable[i+1].assetStaked[ETH_ADDRESS];
        _plotStaked[i] = optionsAvailable[i+1].assetStaked[plotToken];
        _optionPrice[i] = getOptionPrice(i+1);
       }
    }

   /**
    * @dev Gets the result of the market.
    * @return uint256 representing the winning option of the market.
    * @return uint256 Value of market currently at the time closing market.
    * @return uint256 representing the positions of the winning option.
    * @return uint[] memory representing the reward to be distributed.
    * @return uint256 representing the Eth staked on winning option.
    * @return uint256 representing the PLOT staked on winning option.
    */
    function getMarketResults() public view returns(uint256, uint256, uint256[] memory, uint256, uint256) {
      return (marketSettleData.WinningOption, optionsAvailable[marketSettleData.WinningOption].predictionPoints, rewardToDistribute, optionsAvailable[marketSettleData.WinningOption].assetStaked[ETH_ADDRESS], optionsAvailable[marketSettleData.WinningOption].assetStaked[plotToken]);
    }


    /**
    * @dev Gets the return amount of the specified address.
    * @param _user The address to specify the return of
    * @return returnAmount uint[] memory representing the return amount.
    * @return incentive uint[] memory representing the amount incentive.
    * @return _incentiveTokens address[] memory representing the incentive tokens.
    */
    function getReturn(address _user)public view returns (uint[] memory returnAmount, address[] memory _predictionAssets, uint incentive, address _incentiveToken){
      (uint256 ethStaked, uint256 plotStaked) = getTotalAssetsStaked();
      if(marketStatus() != PredictionStatus.Settled || ethStaked.add(plotStaked) ==0) {
       return (returnAmount, _predictionAssets, incentive, incentiveToken);
      }
      _predictionAssets = new address[](2);
      _predictionAssets[0] = plotToken;
      _predictionAssets[1] = ETH_ADDRESS;

      uint256 _totalUserPredictionPoints = 0;
      uint256 _totalPredictionPoints = 0;
      (returnAmount, _totalUserPredictionPoints, _totalPredictionPoints) = _calculateUserReturn(_user);
      incentive = _calculateIncentives(_totalUserPredictionPoints, _totalPredictionPoints);
      if(userData[_user].predictionPoints[marketSettleData.WinningOption] > 0) {
        returnAmount = _addUserReward(_user, returnAmount);
      }
      return (returnAmount, _predictionAssets, incentive, incentiveToken);
    }

    /**
    * @dev Get flags set for user
    * @param _user User address
    * @return Flag defining if user had availed multiplier
    * @return Flag defining if user had predicted with bPLOT
    */
    function getUserFlags(address _user) external view returns(bool, bool) {
      return (userData[_user].multiplierApplied, userData[_user].predictedWithBlot);
    }

    /**
    * @dev Adds the reward in the total return of the specified address.
    * @param _user The address to specify the return of.
    * @param returnAmount The return amount.
    * @return uint[] memory representing the return amount after adding reward.
    */
    function _addUserReward(address _user, uint[] memory returnAmount) internal view returns(uint[] memory){
      uint reward;
      for(uint j = 0; j< returnAmount.length; j++) {
        reward = userData[_user].predictionPoints[marketSettleData.WinningOption].mul(rewardToDistribute[j]).div(optionsAvailable[marketSettleData.WinningOption].predictionPoints);
        returnAmount[j] = returnAmount[j].add(reward);
      }
      return returnAmount;
    }

    /**
    * @dev Calculate the return of the specified address.
    * @param _user The address to query the return of.
    * @return _return uint[] memory representing the return amount owned by the passed address.
    * @return _totalUserPredictionPoints uint representing the positions owned by the passed address.
    * @return _totalPredictionPoints uint representing the total positions of winners.
    */
    function _calculateUserReturn(address _user) internal view returns(uint[] memory _return, uint _totalUserPredictionPoints, uint _totalPredictionPoints){
      ( , uint riskPercentage, , ) = marketUtility.getBasicMarketDetails();
      _return = new uint256[](2);
      for(uint  i=1;i<=totalOptions;i++){
        _totalUserPredictionPoints = _totalUserPredictionPoints.add(userData[_user].predictionPoints[i]);
        _totalPredictionPoints = _totalPredictionPoints.add(optionsAvailable[i].predictionPoints);
        _return[0] =  _callReturn(_return[0], _user, i, riskPercentage, plotToken);
        _return[1] =  _callReturn(_return[1], _user, i, riskPercentage, ETH_ADDRESS);
      }
    }

    /**
    * @dev Calculates the incentives.
    * @param _totalUserPredictionPoints The positions of user.
    * @param _totalPredictionPoints The total positions of winners.
    * @return incentive the calculated incentive.
    */
    function _calculateIncentives(uint256 _totalUserPredictionPoints, uint256 _totalPredictionPoints) internal view returns(uint256 incentive){
      incentive = _totalUserPredictionPoints.mul(incentiveToDistribute.div(_totalPredictionPoints));
    }

    // /**
    // * @dev Gets the pending return.
    // * @param _user The address to specify the return of.
    // * @return uint representing the pending return amount.
    // */
    // function getPendingReturn(address _user) external view returns(uint[] memory returnAmount, address[] memory _predictionAssets, uint[] memory incentive, address[] memory _incentiveTokens){
    //   if(userClaimedReward[_user]) return (0,0);
    //   return getReturn(_user);
    // }
    
    /**
    * @dev Calls the total return amount internally.
    */
    function _callReturn(uint _return,address _user,uint i,uint riskPercentage, address _asset)internal view returns(uint){
      if(i == marketSettleData.WinningOption) {
        riskPercentage = 0;
      }
      uint256 leveragedAsset = _calculatePercentage(riskPercentage, userData[_user].LeverageAsset[_asset][i], 100);
      return _return.add(userData[_user].assetStaked[_asset][i].sub(leveragedAsset));
    }


    /**
    * @dev Gets the status of market.
    * @return PredictionStatus representing the status of market.
    */
    function marketStatus() internal view returns(PredictionStatus){
      if(predictionStatus == PredictionStatus.Live && now >= marketExpireTime()) {
        return PredictionStatus.InSettlement;
      } else if(predictionStatus == PredictionStatus.Settled && now <= marketCoolDownTime()) {
        return PredictionStatus.Cooling;
      }
      return predictionStatus;
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"getReturn","outputs":[{"name":"returnAmount","type":"uint256[]"},{"name":"_predictionAssets","type":"address[]"},{"name":"incentive","type":"uint256"},{"name":"_incentiveToken","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_value","type":"uint256"}],"name":"sponsorIncentives","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketCoolDownTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"claimReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMarketFeedData","outputs":[{"name":"","type":"uint8"},{"name":"","type":"bytes32"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getData","outputs":[{"name":"_marketCurrency","type":"bytes32"},{"name":"minvalue","type":"uint256[]"},{"name":"maxvalue","type":"uint256[]"},{"name":"_optionPrice","type":"uint256[]"},{"name":"_ethStaked","type":"uint256[]"},{"name":"_plotStaked","type":"uint256[]"},{"name":"_predictionTime","type":"uint256"},{"name":"_expireTime","type":"uint256"},{"name":"_predictionStatus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalStakedValueInPLOT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_prediction","type":"uint256"}],"name":"getOptionPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint64"},{"name":"_predictionTime","type":"uint64"},{"name":"_minValue","type":"uint64"},{"name":"_maxValue","type":"uint64"}],"name":"initiate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"proposedValue","type":"uint256"},{"name":"proposalTitle","type":"string"},{"name":"description","type":"string"},{"name":"solutionHash","type":"string"}],"name":"raiseDispute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"accepted","type":"bool"},{"name":"finalResult","type":"uint256"}],"name":"resolveDispute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"marketSettleData","outputs":[{"name":"WinningOption","type":"uint64"},{"name":"settleTime","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"getUserFlags","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_prediction","type":"uint256"},{"name":"_stakeValueInEth","type":"uint256"},{"name":"_leverage","type":"uint256"}],"name":"estimatePredictionValue","outputs":[{"name":"_predictionValue","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMarketResults","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256[]"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"settleMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketSettleTime","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_asset","type":"address"},{"name":"_predictionStake","type":"uint256"},{"name":"_prediction","type":"uint256"},{"name":"_leverage","type":"uint256"}],"name":"placePrediction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"marketData","outputs":[{"name":"startTime","type":"uint64"},{"name":"predictionTime","type":"uint64"},{"name":"neutralMinValue","type":"uint64"},{"name":"neutralMaxValue","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalAssetsStaked","outputs":[{"name":"ethStaked","type":"uint256"},{"name":"plotStaked","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"marketCurrency","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"optionsAvailable","outputs":[{"name":"predictionPoints","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"_option","type":"uint256"}],"name":"getUserPredictionPoints","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50613784806100206000396000f3fe6080604052600436106101405760003560e01c80637852d19d116100b6578063ae1ff39b1161006f578063ae1ff39b1461086e578063b945b527146108a6578063ca032274146108ef578063ddf8389b1461091d578063e217eb9d14610932578063ff0fd72a1461095c57610140565b80637852d19d146106fd5780637cb464eb146107385780637dafb4c014610786578063853b8447146107bc57806385970c6614610828578063a12a50991461083d57610140565b80633bc5de30116101085780633bc5de30146102fa57806343da750f1461049357806368a4b271146104a85780636b592cf6146104d257806374bd0d021461051057806377c24577146106d857610140565b80630cc9a606146101455780630fe5aca4146102255780630ff2f99f146102605780631ec0fd501461028757806324569133146102ba575b600080fd5b34801561015157600080fd5b506101786004803603602081101561016857600080fd5b50356001600160a01b0316610995565b604080519081018390526001600160a01b038216606082015260808082528551908201528451819060208083019160a0840191898101910280838360005b838110156101ce5781810151838201526020016101b6565b50505050905001838103825286818151815260200191508051906020019060200280838360005b8381101561020d5781810151838201526020016101f5565b50505050905001965050505050505060405180910390f35b34801561023157600080fd5b5061025e6004803603604081101561024857600080fd5b506001600160a01b038135169060200135610b0c565b005b34801561026c57600080fd5b50610275610cc6565b60408051918252519081900360200190f35b34801561029357600080fd5b50610275600480360360208110156102aa57600080fd5b50356001600160a01b0316610d0a565b3480156102c657600080fd5b506102cf610fda565b6040805160ff909416845260208401929092526001600160a01b031682820152519081900360600190f35b34801561030657600080fd5b5061030f611004565b604051808a8152602001806020018060200180602001806020018060200189815260200188815260200187815260200186810386528e818151815260200191508051906020019060200280838360005b8381101561037757818101518382015260200161035f565b5050505090500186810385528d818151815260200191508051906020019060200280838360005b838110156103b657818101518382015260200161039e565b5050505090500186810384528c818151815260200191508051906020019060200280838360005b838110156103f55781810151838201526020016103dd565b5050505090500186810383528b818151815260200191508051906020019060200280838360005b8381101561043457818101518382015260200161041c565b5050505090500186810382528a818151815260200191508051906020019060200280838360005b8381101561047357818101518382015260200161045b565b505050509050019e50505050505050505050505050505060405180910390f35b34801561049f57600080fd5b506102756112b7565b3480156104b457600080fd5b50610275600480360360208110156104cb57600080fd5b5035611378565b61025e600480360360808110156104e857600080fd5b506001600160401b038135811691602081013582169160408201358116916060013516611608565b34801561051c57600080fd5b5061025e6004803603608081101561053357600080fd5b8135919081019060408101602082013564010000000081111561055557600080fd5b82018360208201111561056757600080fd5b8035906020019184600183028401116401000000008311171561058957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105dc57600080fd5b8201836020820111156105ee57600080fd5b8035906020019184600183028401116401000000008311171561061057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561066357600080fd5b82018360208201111561067557600080fd5b8035906020019184600183028401116401000000008311171561069757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117de945050505050565b61025e600480360360408110156106ee57600080fd5b50803515159060200135611c35565b34801561070957600080fd5b50610712611ca1565b604080516001600160401b03938416815291909216602082015281519081900390910190f35b34801561074457600080fd5b5061076b6004803603602081101561075b57600080fd5b50356001600160a01b0316611cbb565b60408051921515835290151560208301528051918290030190f35b34801561079257600080fd5b50610275600480360360608110156107a957600080fd5b5080359060208101359060400135611ce8565b3480156107c857600080fd5b506107d1611d0d565b6040518086815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360008381101561020d5781810151838201526020016101f5565b34801561083457600080fd5b5061025e611dcc565b34801561084957600080fd5b50610852611ebc565b604080516001600160401b039092168252519081900360200190f35b61025e6004803603608081101561088457600080fd5b506001600160a01b038135169060208101359060408101359060600135611f2a565b3480156108b257600080fd5b506108bb612399565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b3480156108fb57600080fd5b506109046123c7565b6040805192835260208301919091528051918290030190f35b34801561092957600080fd5b5061027561245f565b34801561093e57600080fd5b506102756004803603602081101561095557600080fd5b5035612470565b34801561096857600080fd5b506102756004803603604081101561097f57600080fd5b506001600160a01b038135169060200135612482565b6060806000806000806109a66123c7565b909250905060046109b56124b0565b60048111156109c057fe5b1415806109da57506109d8828263ffffffff61252316565b155b156109f957505060005461010090046001600160a01b03169050610b05565b60408051600280825260608201835290916020830190803883390190505094506000805160206136f883398151915285600081518110610a3557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602061373983398151915285600181518110610a7157fe5b6001600160a01b0390921660209283029190910190910152600080610a9589612587565b91995092509050610aa68282612734565b6001600160a01b038a166000908152600a602090815260408083206009546001600160401b0316845260010190915290205490965015610aed57610aea898961275b565b97505b505060005461010090046001600160a01b0316925050505b9193509193565b60408051600160e11b630721fa67028152336004820152905173e210330d6768030e816d223836335079c7a0c85191630e43f4ce916024808301926020929190829003018186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d6020811015610b8a57600080fd5b5051610b9557600080fd5b6001610b9f6124b0565b6004811115610baa57fe5b1115610bb557600080fd5b60005461010090046001600160a01b031615610c1b5760408051600160e51b62461bcd02815260206004820152601160248201527f416c72656164792073706f6e736f726564000000000000000000000000000000604482015290519081900360640190fd5b60008054610100600160a81b0319166101006001600160a01b038516908102919091178255600583905560408051600160e11b630aed65f5028152600481019290925233602483015230604483015260648201849052517312d7053efc680ba6671f8cb96d1421d906ce3de2926315dacbea926084808201939182900301818387803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050505050565b600854600090610d0490610ceb90600160401b90046001600160401b0316600461283e565b600954600160401b90046001600160401b031690612523565b90505b90565b6000805460ff1680610d2f57506004610d216124b0565b6004811115610d2c57fe5b14155b80610daf575073e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8257600080fd5b505afa158015610d96573d6000803e3d6000fd5b505050506040513d6020811015610dac57600080fd5b50515b15610dbc57506000610fd5565b6001600160a01b0382166000908152600a602052604090205460ff1615610de557506001610fd5565b6001600160a01b0382166000908152600a60205260408120805460ff191660011790556060908190610e1685610995565b50925092509250610e4a6000805160206136f88339815191528685600081518110610e3d57fe5b60200260200101516128ab565b610e6a6000805160206137398339815191528685600181518110610e3d57fe5b600054610e869061010090046001600160a01b031686836128ab565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b031663c819b5f286858585600060019054906101000a90046001600160a01b03166040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b031681526020018060200180602001858152602001846001600160a01b03166001600160a01b03168152602001838103835287818151815260200191508051906020019060200280838360005b83811015610f4c578181015183820152602001610f34565b50505050905001838103825286818151815260200191508051906020019060200280838360005b83811015610f8b578181015183820152602001610f73565b50505050905001975050505050505050600060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b50505050600293505050505b919050565b6001600160ca1b661155120bd554d102735f4ec3df9cbd43714fe2740f5e3616155c5b8419909192565b600854600160ca1b661155120bd554d102906060908190819081908190600160401b90046001600160401b031660008061103c6129a6565b91506110466124b0565b600481111561105157fe5b604080516003808252608082019092529192506020820160608038833950506008548251929a50600160801b90046001600160401b0316918a9150600190811061109757fe5b60209081029190910101526008546110c090600160c01b90046001600160401b03166001612523565b886002815181106110cd57fe5b60209081029190910101526040805160038082526080820190925290816020016020820280388339505060085491985061111a91600160801b90046001600160401b0316905060016129cf565b8760008151811061112757fe5b60209081029190910101526008548751600160c01b9091046001600160401b0316908890600190811061115657fe5b6020026020010181815250506000198760028151811061117257fe5b6020908102919091010152604080516003808252608082019092529081602001602082028038833950506040805160038082526080820190925292985090506020820160608038833950506040805160038082526080820190925292975090506020820160608038833901905050935060005b60038110156112ab5760018082016000908152600b60209081526040808320600080516020613739833981519152845290930190522054865187908390811061122a57fe5b60209081029190910181019190915260018083016000908152600b835260408082206000805160206136f88339815191528352909201909252902054855186908390811061127457fe5b60200260200101818152505061128c81600101611378565b87828151811061129857fe5b60209081029190910101526001016111e5565b50909192939495969798565b60008060006112c46123c7565b60408051600160e11b63569669330281526000805160206137398339815191526004820152602481018490528151939550919350732330058d49fa61d5c5405fa8b17fcd823c59f7bb9263ad2cd266926044808201939291829003018186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d604081101561135a57600080fd5b50602001519150611371818363ffffffff61252316565b9250505090565b604080516009808252610140820190925260009160609190602082016101208038833901905050905082816000815181106113af57fe5b60209081029190910101526008548151600160801b9091046001600160401b031690829060019081106113de57fe5b60209081029190910101526008548151600160c01b9091046001600160401b0316908290600290811061140d57fe5b602090810291909101015260085481516001600160401b03909116908290600390811061143657fe5b60200260200101818152505061144a6129a6565b8160048151811061145757fe5b60200260200101818152505061146b6123c7565b8260058151811061147857fe5b602002602001018360068151811061148c57fe5b602090810291909101810192909252919091526000848152600b82526040808220600080516020613739833981519152835260010190925220548151829060079081106114d557fe5b6020908102919091018101919091526000848152600b825260408082206000805160206136f88339815191528352600101909252205481518290600890811061151a57fe5b60209081029190910181019190915260408051600160e01b63504e8751028152735f4ec3df9cbd43714fe2740f5e3616155c5b84196024820181905260048201928352845160448301528451732330058d49fa61d5c5405fa8b17fcd823c59f7bb9463504e875194879490928392606490920191868101910280838360005b838110156115b1578181015183820152602001611599565b50505050905001935050505060206040518083038186803b1580156115d557600080fd5b505afa1580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b50519392505050565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d602081101561167057600080fd5b50516001600160a01b031633146116d15760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b6008546001600160401b0316156117325760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b4261174f6001600160401b0387811690871663ffffffff61252316565b1161175957600080fd5b506008805467ffffffffffffffff19166001600160401b03958616176fffffffffffffffff00000000000000001916600160401b948616949094029390931777ffffffffffffffff000000000000000000000000000000001916600160801b92851692909202919091176001600160c01b0316600160c01b9190931602919091179055565b60006117e86112b7565b1161183d5760408051600160e51b62461bcd02815260206004820152601060248201527f4e6f2070617274696369706174696f6e00000000000000000000000000000000604482015290519081900360640190fd5b60026118476124b0565b600481111561185257fe5b1461185c57600080fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663094f81f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118ab57600080fd5b505afa1580156118bf573d6000803e3d6000fd5b505050506040513d60208110156118d557600080fd5b505160408051600160e11b630aed65f50281526000805160206136f8833981519152600482015233602482015273e210330d6768030e816d223836335079c7a0c85160448201526064810183905290519192507312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea9160848082019260009290919082900301818387803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b5050505060016000806101000a81548160ff02191690831515021790555073e210330d6768030e816d223836335079c7a0c8516001600160a01b031663e99a8de0858585308a60405160200180836001600160a01b03166001600160a01b031681526020018281526020019250505060405160208183030381529060405286336001546004548e6040518a63ffffffff1660e01b815260040180806020018060200180602001806020018a8152602001896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185810385528e818151815260200191508051906020019080838360005b83811015611a88578181015183820152602001611a70565b50505050905090810190601f168015611ab55780820380516001836020036101000a031916815260200191505b5085810384528d5181528d516020918201918f019080838360005b83811015611ae8578181015183820152602001611ad0565b50505050905090810190601f168015611b155780820380516001836020036101000a031916815260200191505b5085810383528c5181528c516020918201918e019080838360005b83811015611b48578181015183820152602001611b30565b50505050905090810190601f168015611b755780820380516001836020036101000a031916815260200191505b5085810382528b5181528b516020918201918d019080838360005b83811015611ba8578181015183820152602001611b90565b50505050905090810190601f168015611bd55780820380516001836020036101000a031916815260200191505b509d5050505050505050505050505050600060405180830381600087803b158015611bff57600080fd5b505af1158015611c13573d6000803e3d6000fd5b50506000600181905560045550506007805460ff191660031790555050505050565b3373e210330d6768030e816d223836335079c7a0c851148015611c6a57506003611c5d6124b0565b6004811115611c6857fe5b145b611c7357600080fd5b8115611c8457611c84816000612a2f565b50506000805460ff19908116909155600780549091166004179055565b6009546001600160401b0380821691600160401b90041682565b6001600160a01b03166000908152600a602052604090205460ff6201000082048116926101009092041690565b6000611d04848484600080516020613739833981519152613025565b50949350505050565b6009546001600160401b03166000818152600b602090815260408083208054600080516020613739833981519152855260019091018352818420546000805160206136f883398151915285528285205460068054855181880281018801909652808652969788976060978997889793969395929091859190830182828015611db457602002820191906000526020600020905b815481526020019060010190808311611da0575b50505050509250945094509450945094509091929394565b600080732330058d49fa61d5c5405fa8b17fcd823c59f7bb63f0a5702f735f4ec3df9cbd43714fe2740f5e3616155c5b8419611e06611ebc565b6001600160401b03166040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050604080518083038186803b158015611e5b57600080fd5b505afa158015611e6f573d6000803e3d6000fd5b505050506040513d6040811015611e8557600080fd5b50805160209091015190925090506001611e9d6124b0565b6004811115611ea857fe5b1415611eb857611eb88282612a2f565b5050565b600954600090600160401b90046001600160401b031615611ef05750600954600160401b90046001600160401b0316610d07565b600854610d0490611f1290600160401b90046001600160401b03166002613343565b6008546001600160401b03169063ffffffff61252316565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6020811015611fa157600080fd5b5051158015611fb1575060038211155b8015611fbe575060058111155b611fc757600080fd5b6008546001600160401b03164210801590611fe95750611fe56129a6565b4211155b611ff257600080fd5b60006001600160a01b038516600080516020613739833981519152141561204b5734841461201f57600080fd5b61202d600a8561271061339f565b600254909150612043908263ffffffff61252316565b600255612294565b341561205657600080fd5b6001600160a01b0385166000805160206136f883398151915214156121085760408051600160e11b630aed65f50281526000805160206136f883398151915260048201523360248201523060448201526064810186905290517312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea91608480830192600092919082900301818387803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b5050505061226c565b7312d7053efc680ba6671f8cb96d1421d906ce3de26001600160a01b0316634a5245b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b50516001600160a01b0386811691161461219857600080fd5b600582146121a557600080fd5b336000908152600a6020526040902054610100900460ff16156121c757600080fd5b336000818152600a6020526040808220805461ff0019166101001790558051600160e01b631371b2bd028152600481019390935230602484015260448301879052517312d7053efc680ba6671f8cb96d1421d906ce3de292631371b2bd92606480830193919282900301818387803b15801561224257600080fd5b505af1158015612256573d6000803e3d6000fd5b505050506000805160206136f883398151915294505b61227a60058561271061339f565b600354909150612290908263ffffffff61252316565b6003555b6122a4848263ffffffff6129cf16565b90506000806122b58584868a613025565b9150915080156122de57336000908152600a60205260409020805462ff00001916620100001790555b600082116122eb57600080fd5b6122f885848987866133bd565b60408051600160e11b6348d979c702815233600482015260248101889052604481018490526001600160a01b03891660648201526084810187905260a48101869052905173e210330d6768030e816d223836335079c7a0c851916391b2f38e9160c480830192600092919082900301818387803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b5050505050505050505050565b6008546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b60008060015b6003811161245a576000818152600b60209081526040808320600080516020613739833981519152845260010190915290205461241190849063ffffffff61252316565b6000828152600b602090815260408083206000805160206136f8833981519152845260010190915290205490935061245090839063ffffffff61252316565b91506001016123cd565b509091565b600160ca1b661155120bd554d10281565b600b6020526000908152604090205481565b6001600160a01b0382166000908152600a602090815260408083208484526001019091529020545b92915050565b60008060075460ff1660048111156124c457fe5b1480156124d857506124d46129a6565b4210155b156124e557506001610d07565b600460075460ff1660048111156124f857fe5b14801561250c5750612508610cc6565b4211155b1561251957506002610d07565b5060075460ff1690565b6000828201838110156125805760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60606000806000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b1580156125db57600080fd5b505afa1580156125ef573d6000803e3d6000fd5b505050506040513d608081101561260557600080fd5b50602090810151604080516002808252606082018352929450928301908038833901905050935060015b6003811161272b576001600160a01b0386166000908152600a6020908152604080832084845260010190915290205461266f90859063ffffffff61252316565b6000828152600b602052604090205490945061269290849063ffffffff61252316565b92506126c3856000815181106126a457fe5b60200260200101518783856000805160206136f88339815191526135d5565b856000815181106126d057fe5b60200260200101818152505061270b856001815181106126ec57fe5b60200260200101518783856000805160206137398339815191526135d5565b8560018151811061271857fe5b602090810291909101015260010161262f565b50509193909250565b600061258061274e8360055461283e90919063ffffffff16565b849063ffffffff61334316565b60606000805b8351811015612835576009546001600160401b03166000908152600b6020526040902054600680546127ee92916127e2918590811061279c57fe5b60009182526020808320909101546001600160a01b038b168352600a825260408084206009546001600160401b031685526001019092529120549063ffffffff61334316565b9063ffffffff61283e16565b91506128168285838151811061280057fe5b602002602001015161252390919063ffffffff16565b84828151811061282257fe5b6020908102919091010152600101612761565b50919392505050565b60008082116128975760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816128a257fe5b04949350505050565b80156129a1576001600160a01b038316600080516020613739833981519152141561290c576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612906573d6000803e3d6000fd5b506129a1565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561296c57600080fd5b505af1158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b50516129a157600080fd5b505050565b600854600090610d04906001600160401b0380821691600160401b90041663ffffffff61252316565b600082821115612a295760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612a37611ebc565b6001600160401b0316421015612a975760408051600160e51b62461bcd02815260206004820152601060248201527f54696d65206e6f74207265616368656400000000000000000000000000000000604482015290519081900360640190fd5b60008211612aef5760408051600160e51b62461bcd02815260206004820152601e60248201527f76616c75652073686f756c642062652067726561746572207468616e20300000604482015290519081900360640190fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b158015612b3e57600080fd5b505afa158015612b52573d6000803e3d6000fd5b505050506040513d6080811015612b6857600080fd5b50602001519050600360075460ff166004811115612b8257fe5b14612bb657600980546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055612bd0565b600980546fffffffffffffffff0000000000000000191690555b6007805460ff191660041790556008546001600160401b03600160801b90910416831015612c11576009805467ffffffffffffffff19166001179055612c59565b600854600160c01b90046001600160401b0316831115612c44576009805467ffffffffffffffff19166003179055612c59565b6009805467ffffffffffffffff191660021790555b604080516002808252606080830184529260208301908038833950506009546001600160401b03166000908152600b60209081526040808320600080516020613739833981519152845260010190915290205491925050151580612cf257506009546001600160401b03166000908152600b602090815260408083206000805160206136f8833981519152845260010190915290205415155b15612dff5760015b60038111612de5576009546001600160401b03168114612ddd576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612d4c908590606461339f565b9050612d5f818460008151811061280057fe5b83600081518110612d6c57fe5b6020908102919091018101919091526000838152600b8252604080822060008051602061373983398151915283526002019092522054612daf908590606461339f565b9050612dc2818460018151811061280057fe5b83600181518110612dcf57fe5b602002602001018181525050505b600101612cfa565b508051612df9906006906020840190613692565b50612ebb565b60015b60038111612eb9576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612e42908590606461339f565b600454909150612e58908263ffffffff61252316565b6004556000828152600b602090815260408083206000805160206137398339815191528452600201909152902054612e93908590606461339f565b600154909150612ea9908263ffffffff61252316565b6001908155919091019050612e02565b505b612efe60008051602061373983398151915273e210330d6768030e816d223836335079c7a0c851612ef960025460015461252390919063ffffffff16565b6128ab565b612f3c6000805160206136f883398151915273e210330d6768030e816d223836335079c7a0c851612ef960035460045461252390919063ffffffff16565b60006002819055600355600954604051600160e01b63a99f50dd0281526001600160401b03909116602482018190526044820186905260648201859052608060048301908152600680546084850181905273e210330d6768030e816d223836335079c7a0c8519463a99f50dd9492938a928a92829160a49091019087908015612fe457602002820191906000526020600020905b815481526020019060010190808311612fd0575b505095505050505050600060405180830381600087803b15801561300757600080fd5b505af115801561301b573d6000803e3d6000fd5b5050505050505050565b60408051600b808252610180820190925260009182916060916020820161016080388339019050509050868160008151811061305d57fe5b60209081029190910101526008548151600160801b9091046001600160401b0316908290600190811061308c57fe5b60209081029190910101526008548151600160c01b9091046001600160401b031690829060029081106130bb57fe5b602090810291909101015260085481516001600160401b0390911690829060039081106130e457fe5b6020026020010181815250506130f86129a6565b8160048151811061310557fe5b6020026020010181815250506131196123c7565b8260058151811061312657fe5b602002602001018360068151811061313a57fe5b602090810291909101810192909252919091526000888152600b825260408082206000805160206137398339815191528352600101909252205481518290600790811061318357fe5b6020908102919091018101919091526000888152600b825260408082206000805160206136f8833981519152835260010190925220548151829060089081106131c857fe5b60200260200101818152505085816009815181106131e257fe5b6020026020010181815250508481600a815181106131fc57fe5b602090810291909101810191909152336000908152600a909152604081205462010000900460ff1661322c575060015b604051600160e01b6398d57d210281526001600160a01b03861660248201523360448201819052735f4ec3df9cbd43714fe2740f5e3616155c5b841960648301819052831515608484015260a060048401908152855160a48501528551732330058d49fa61d5c5405fa8b17fcd823c59f7bb946398d57d219488948c9491939092899291829160c401906020808a01910280838360005b838110156132db5781810151838201526020016132c3565b505050509050019650505050505050604080518083038186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d604081101561332b57600080fd5b50805160209091015190999098509650505050505050565b600082613352575060006124aa565b8282028284828161335f57fe5b041461258057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806137186021913960400191505060405180910390fd5b60006133b5826127e2868663ffffffff61334316565b949350505050565b336000908152600a602090815260408083208884526001019091529020546133eb908263ffffffff61252316565b336000908152600a60209081526040808320898452600181018352818420949094556001600160a01b0387168352600290930181528282208883529052205461343a908563ffffffff61252316565b336000908152600a602090815260408083206001600160a01b038816845260020182528083208984529091529020556134b761347c858463ffffffff61334316565b336000908152600a602090815260408083206001600160a01b038916845260030182528083208a84529091529020549063ffffffff61252316565b336000908152600a602090815260408083206001600160a01b03881684526003018252808320898452825280832093909355600b905220546134ff908263ffffffff61252316565b6000868152600b602090815260408083209384556001600160a01b0387168352600190930190522054613538908563ffffffff61252316565b6000868152600b602090815260408083206001600160a01b03881684526001019091529020556135a3613571858463ffffffff61334316565b6000878152600b602090815260408083206001600160a01b03891684526002019091529020549063ffffffff61252316565b6000958652600b602090815260408088206001600160a01b039096168852600290950190529290942091909155505050565b6009546000906001600160401b03168414156135f057600092505b6001600160a01b038086166000908152600a60209081526040808320938616835260039093018152828220878352905290812054613631908590606461339f565b6001600160a01b038088166000908152600a60209081526040808320938816835260029093018152828220898352905220549091506136879061367a908363ffffffff6129cf16565b889063ffffffff61252316565b979650505050505050565b8280548282559060005260206000209081019282156136cd579160200282015b828111156136cd5782518255916020019190600101906136b2565b506136d99291506136dd565b5090565b610d0791905b808211156136d957600081556001016136e356fe00000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a7230582098b1283931390455f5ca6bbff29e5ac85cfb8e6742ea874b10dd55d8636d9e4c0029

Deployed Bytecode

0x6080604052600436106101405760003560e01c80637852d19d116100b6578063ae1ff39b1161006f578063ae1ff39b1461086e578063b945b527146108a6578063ca032274146108ef578063ddf8389b1461091d578063e217eb9d14610932578063ff0fd72a1461095c57610140565b80637852d19d146106fd5780637cb464eb146107385780637dafb4c014610786578063853b8447146107bc57806385970c6614610828578063a12a50991461083d57610140565b80633bc5de30116101085780633bc5de30146102fa57806343da750f1461049357806368a4b271146104a85780636b592cf6146104d257806374bd0d021461051057806377c24577146106d857610140565b80630cc9a606146101455780630fe5aca4146102255780630ff2f99f146102605780631ec0fd501461028757806324569133146102ba575b600080fd5b34801561015157600080fd5b506101786004803603602081101561016857600080fd5b50356001600160a01b0316610995565b604080519081018390526001600160a01b038216606082015260808082528551908201528451819060208083019160a0840191898101910280838360005b838110156101ce5781810151838201526020016101b6565b50505050905001838103825286818151815260200191508051906020019060200280838360005b8381101561020d5781810151838201526020016101f5565b50505050905001965050505050505060405180910390f35b34801561023157600080fd5b5061025e6004803603604081101561024857600080fd5b506001600160a01b038135169060200135610b0c565b005b34801561026c57600080fd5b50610275610cc6565b60408051918252519081900360200190f35b34801561029357600080fd5b50610275600480360360208110156102aa57600080fd5b50356001600160a01b0316610d0a565b3480156102c657600080fd5b506102cf610fda565b6040805160ff909416845260208401929092526001600160a01b031682820152519081900360600190f35b34801561030657600080fd5b5061030f611004565b604051808a8152602001806020018060200180602001806020018060200189815260200188815260200187815260200186810386528e818151815260200191508051906020019060200280838360005b8381101561037757818101518382015260200161035f565b5050505090500186810385528d818151815260200191508051906020019060200280838360005b838110156103b657818101518382015260200161039e565b5050505090500186810384528c818151815260200191508051906020019060200280838360005b838110156103f55781810151838201526020016103dd565b5050505090500186810383528b818151815260200191508051906020019060200280838360005b8381101561043457818101518382015260200161041c565b5050505090500186810382528a818151815260200191508051906020019060200280838360005b8381101561047357818101518382015260200161045b565b505050509050019e50505050505050505050505050505060405180910390f35b34801561049f57600080fd5b506102756112b7565b3480156104b457600080fd5b50610275600480360360208110156104cb57600080fd5b5035611378565b61025e600480360360808110156104e857600080fd5b506001600160401b038135811691602081013582169160408201358116916060013516611608565b34801561051c57600080fd5b5061025e6004803603608081101561053357600080fd5b8135919081019060408101602082013564010000000081111561055557600080fd5b82018360208201111561056757600080fd5b8035906020019184600183028401116401000000008311171561058957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105dc57600080fd5b8201836020820111156105ee57600080fd5b8035906020019184600183028401116401000000008311171561061057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561066357600080fd5b82018360208201111561067557600080fd5b8035906020019184600183028401116401000000008311171561069757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117de945050505050565b61025e600480360360408110156106ee57600080fd5b50803515159060200135611c35565b34801561070957600080fd5b50610712611ca1565b604080516001600160401b03938416815291909216602082015281519081900390910190f35b34801561074457600080fd5b5061076b6004803603602081101561075b57600080fd5b50356001600160a01b0316611cbb565b60408051921515835290151560208301528051918290030190f35b34801561079257600080fd5b50610275600480360360608110156107a957600080fd5b5080359060208101359060400135611ce8565b3480156107c857600080fd5b506107d1611d0d565b6040518086815260200185815260200180602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360008381101561020d5781810151838201526020016101f5565b34801561083457600080fd5b5061025e611dcc565b34801561084957600080fd5b50610852611ebc565b604080516001600160401b039092168252519081900360200190f35b61025e6004803603608081101561088457600080fd5b506001600160a01b038135169060208101359060408101359060600135611f2a565b3480156108b257600080fd5b506108bb612399565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b3480156108fb57600080fd5b506109046123c7565b6040805192835260208301919091528051918290030190f35b34801561092957600080fd5b5061027561245f565b34801561093e57600080fd5b506102756004803603602081101561095557600080fd5b5035612470565b34801561096857600080fd5b506102756004803603604081101561097f57600080fd5b506001600160a01b038135169060200135612482565b6060806000806000806109a66123c7565b909250905060046109b56124b0565b60048111156109c057fe5b1415806109da57506109d8828263ffffffff61252316565b155b156109f957505060005461010090046001600160a01b03169050610b05565b60408051600280825260608201835290916020830190803883390190505094506000805160206136f883398151915285600081518110610a3557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602061373983398151915285600181518110610a7157fe5b6001600160a01b0390921660209283029190910190910152600080610a9589612587565b91995092509050610aa68282612734565b6001600160a01b038a166000908152600a602090815260408083206009546001600160401b0316845260010190915290205490965015610aed57610aea898961275b565b97505b505060005461010090046001600160a01b0316925050505b9193509193565b60408051600160e11b630721fa67028152336004820152905173e210330d6768030e816d223836335079c7a0c85191630e43f4ce916024808301926020929190829003018186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d6020811015610b8a57600080fd5b5051610b9557600080fd5b6001610b9f6124b0565b6004811115610baa57fe5b1115610bb557600080fd5b60005461010090046001600160a01b031615610c1b5760408051600160e51b62461bcd02815260206004820152601160248201527f416c72656164792073706f6e736f726564000000000000000000000000000000604482015290519081900360640190fd5b60008054610100600160a81b0319166101006001600160a01b038516908102919091178255600583905560408051600160e11b630aed65f5028152600481019290925233602483015230604483015260648201849052517312d7053efc680ba6671f8cb96d1421d906ce3de2926315dacbea926084808201939182900301818387803b158015610caa57600080fd5b505af1158015610cbe573d6000803e3d6000fd5b505050505050565b600854600090610d0490610ceb90600160401b90046001600160401b0316600461283e565b600954600160401b90046001600160401b031690612523565b90505b90565b6000805460ff1680610d2f57506004610d216124b0565b6004811115610d2c57fe5b14155b80610daf575073e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8257600080fd5b505afa158015610d96573d6000803e3d6000fd5b505050506040513d6020811015610dac57600080fd5b50515b15610dbc57506000610fd5565b6001600160a01b0382166000908152600a602052604090205460ff1615610de557506001610fd5565b6001600160a01b0382166000908152600a60205260408120805460ff191660011790556060908190610e1685610995565b50925092509250610e4a6000805160206136f88339815191528685600081518110610e3d57fe5b60200260200101516128ab565b610e6a6000805160206137398339815191528685600181518110610e3d57fe5b600054610e869061010090046001600160a01b031686836128ab565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b031663c819b5f286858585600060019054906101000a90046001600160a01b03166040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b031681526020018060200180602001858152602001846001600160a01b03166001600160a01b03168152602001838103835287818151815260200191508051906020019060200280838360005b83811015610f4c578181015183820152602001610f34565b50505050905001838103825286818151815260200191508051906020019060200280838360005b83811015610f8b578181015183820152602001610f73565b50505050905001975050505050505050600060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b50505050600293505050505b919050565b6001600160ca1b661155120bd554d102735f4ec3df9cbd43714fe2740f5e3616155c5b8419909192565b600854600160ca1b661155120bd554d102906060908190819081908190600160401b90046001600160401b031660008061103c6129a6565b91506110466124b0565b600481111561105157fe5b604080516003808252608082019092529192506020820160608038833950506008548251929a50600160801b90046001600160401b0316918a9150600190811061109757fe5b60209081029190910101526008546110c090600160c01b90046001600160401b03166001612523565b886002815181106110cd57fe5b60209081029190910101526040805160038082526080820190925290816020016020820280388339505060085491985061111a91600160801b90046001600160401b0316905060016129cf565b8760008151811061112757fe5b60209081029190910101526008548751600160c01b9091046001600160401b0316908890600190811061115657fe5b6020026020010181815250506000198760028151811061117257fe5b6020908102919091010152604080516003808252608082019092529081602001602082028038833950506040805160038082526080820190925292985090506020820160608038833950506040805160038082526080820190925292975090506020820160608038833901905050935060005b60038110156112ab5760018082016000908152600b60209081526040808320600080516020613739833981519152845290930190522054865187908390811061122a57fe5b60209081029190910181019190915260018083016000908152600b835260408082206000805160206136f88339815191528352909201909252902054855186908390811061127457fe5b60200260200101818152505061128c81600101611378565b87828151811061129857fe5b60209081029190910101526001016111e5565b50909192939495969798565b60008060006112c46123c7565b60408051600160e11b63569669330281526000805160206137398339815191526004820152602481018490528151939550919350732330058d49fa61d5c5405fa8b17fcd823c59f7bb9263ad2cd266926044808201939291829003018186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d604081101561135a57600080fd5b50602001519150611371818363ffffffff61252316565b9250505090565b604080516009808252610140820190925260009160609190602082016101208038833901905050905082816000815181106113af57fe5b60209081029190910101526008548151600160801b9091046001600160401b031690829060019081106113de57fe5b60209081029190910101526008548151600160c01b9091046001600160401b0316908290600290811061140d57fe5b602090810291909101015260085481516001600160401b03909116908290600390811061143657fe5b60200260200101818152505061144a6129a6565b8160048151811061145757fe5b60200260200101818152505061146b6123c7565b8260058151811061147857fe5b602002602001018360068151811061148c57fe5b602090810291909101810192909252919091526000848152600b82526040808220600080516020613739833981519152835260010190925220548151829060079081106114d557fe5b6020908102919091018101919091526000848152600b825260408082206000805160206136f88339815191528352600101909252205481518290600890811061151a57fe5b60209081029190910181019190915260408051600160e01b63504e8751028152735f4ec3df9cbd43714fe2740f5e3616155c5b84196024820181905260048201928352845160448301528451732330058d49fa61d5c5405fa8b17fcd823c59f7bb9463504e875194879490928392606490920191868101910280838360005b838110156115b1578181015183820152602001611599565b50505050905001935050505060206040518083038186803b1580156115d557600080fd5b505afa1580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b50519392505050565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d602081101561167057600080fd5b50516001600160a01b031633146116d15760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b6008546001600160401b0316156117325760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b4261174f6001600160401b0387811690871663ffffffff61252316565b1161175957600080fd5b506008805467ffffffffffffffff19166001600160401b03958616176fffffffffffffffff00000000000000001916600160401b948616949094029390931777ffffffffffffffff000000000000000000000000000000001916600160801b92851692909202919091176001600160c01b0316600160c01b9190931602919091179055565b60006117e86112b7565b1161183d5760408051600160e51b62461bcd02815260206004820152601060248201527f4e6f2070617274696369706174696f6e00000000000000000000000000000000604482015290519081900360640190fd5b60026118476124b0565b600481111561185257fe5b1461185c57600080fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663094f81f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156118ab57600080fd5b505afa1580156118bf573d6000803e3d6000fd5b505050506040513d60208110156118d557600080fd5b505160408051600160e11b630aed65f50281526000805160206136f8833981519152600482015233602482015273e210330d6768030e816d223836335079c7a0c85160448201526064810183905290519192507312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea9160848082019260009290919082900301818387803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b5050505060016000806101000a81548160ff02191690831515021790555073e210330d6768030e816d223836335079c7a0c8516001600160a01b031663e99a8de0858585308a60405160200180836001600160a01b03166001600160a01b031681526020018281526020019250505060405160208183030381529060405286336001546004548e6040518a63ffffffff1660e01b815260040180806020018060200180602001806020018a8152602001896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185810385528e818151815260200191508051906020019080838360005b83811015611a88578181015183820152602001611a70565b50505050905090810190601f168015611ab55780820380516001836020036101000a031916815260200191505b5085810384528d5181528d516020918201918f019080838360005b83811015611ae8578181015183820152602001611ad0565b50505050905090810190601f168015611b155780820380516001836020036101000a031916815260200191505b5085810383528c5181528c516020918201918e019080838360005b83811015611b48578181015183820152602001611b30565b50505050905090810190601f168015611b755780820380516001836020036101000a031916815260200191505b5085810382528b5181528b516020918201918d019080838360005b83811015611ba8578181015183820152602001611b90565b50505050905090810190601f168015611bd55780820380516001836020036101000a031916815260200191505b509d5050505050505050505050505050600060405180830381600087803b158015611bff57600080fd5b505af1158015611c13573d6000803e3d6000fd5b50506000600181905560045550506007805460ff191660031790555050505050565b3373e210330d6768030e816d223836335079c7a0c851148015611c6a57506003611c5d6124b0565b6004811115611c6857fe5b145b611c7357600080fd5b8115611c8457611c84816000612a2f565b50506000805460ff19908116909155600780549091166004179055565b6009546001600160401b0380821691600160401b90041682565b6001600160a01b03166000908152600a602052604090205460ff6201000082048116926101009092041690565b6000611d04848484600080516020613739833981519152613025565b50949350505050565b6009546001600160401b03166000818152600b602090815260408083208054600080516020613739833981519152855260019091018352818420546000805160206136f883398151915285528285205460068054855181880281018801909652808652969788976060978997889793969395929091859190830182828015611db457602002820191906000526020600020905b815481526020019060010190808311611da0575b50505050509250945094509450945094509091929394565b600080732330058d49fa61d5c5405fa8b17fcd823c59f7bb63f0a5702f735f4ec3df9cbd43714fe2740f5e3616155c5b8419611e06611ebc565b6001600160401b03166040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050604080518083038186803b158015611e5b57600080fd5b505afa158015611e6f573d6000803e3d6000fd5b505050506040513d6040811015611e8557600080fd5b50805160209091015190925090506001611e9d6124b0565b6004811115611ea857fe5b1415611eb857611eb88282612a2f565b5050565b600954600090600160401b90046001600160401b031615611ef05750600954600160401b90046001600160401b0316610d07565b600854610d0490611f1290600160401b90046001600160401b03166002613343565b6008546001600160401b03169063ffffffff61252316565b73e210330d6768030e816d223836335079c7a0c8516001600160a01b03166335f628ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f7757600080fd5b505afa158015611f8b573d6000803e3d6000fd5b505050506040513d6020811015611fa157600080fd5b5051158015611fb1575060038211155b8015611fbe575060058111155b611fc757600080fd5b6008546001600160401b03164210801590611fe95750611fe56129a6565b4211155b611ff257600080fd5b60006001600160a01b038516600080516020613739833981519152141561204b5734841461201f57600080fd5b61202d600a8561271061339f565b600254909150612043908263ffffffff61252316565b600255612294565b341561205657600080fd5b6001600160a01b0385166000805160206136f883398151915214156121085760408051600160e11b630aed65f50281526000805160206136f883398151915260048201523360248201523060448201526064810186905290517312d7053efc680ba6671f8cb96d1421d906ce3de2916315dacbea91608480830192600092919082900301818387803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b5050505061226c565b7312d7053efc680ba6671f8cb96d1421d906ce3de26001600160a01b0316634a5245b46040518163ffffffff1660e01b815260040160206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b50516001600160a01b0386811691161461219857600080fd5b600582146121a557600080fd5b336000908152600a6020526040902054610100900460ff16156121c757600080fd5b336000818152600a6020526040808220805461ff0019166101001790558051600160e01b631371b2bd028152600481019390935230602484015260448301879052517312d7053efc680ba6671f8cb96d1421d906ce3de292631371b2bd92606480830193919282900301818387803b15801561224257600080fd5b505af1158015612256573d6000803e3d6000fd5b505050506000805160206136f883398151915294505b61227a60058561271061339f565b600354909150612290908263ffffffff61252316565b6003555b6122a4848263ffffffff6129cf16565b90506000806122b58584868a613025565b9150915080156122de57336000908152600a60205260409020805462ff00001916620100001790555b600082116122eb57600080fd5b6122f885848987866133bd565b60408051600160e11b6348d979c702815233600482015260248101889052604481018490526001600160a01b03891660648201526084810187905260a48101869052905173e210330d6768030e816d223836335079c7a0c851916391b2f38e9160c480830192600092919082900301818387803b15801561237857600080fd5b505af115801561238c573d6000803e3d6000fd5b5050505050505050505050565b6008546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b60008060015b6003811161245a576000818152600b60209081526040808320600080516020613739833981519152845260010190915290205461241190849063ffffffff61252316565b6000828152600b602090815260408083206000805160206136f8833981519152845260010190915290205490935061245090839063ffffffff61252316565b91506001016123cd565b509091565b600160ca1b661155120bd554d10281565b600b6020526000908152604090205481565b6001600160a01b0382166000908152600a602090815260408083208484526001019091529020545b92915050565b60008060075460ff1660048111156124c457fe5b1480156124d857506124d46129a6565b4210155b156124e557506001610d07565b600460075460ff1660048111156124f857fe5b14801561250c5750612508610cc6565b4211155b1561251957506002610d07565b5060075460ff1690565b6000828201838110156125805760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60606000806000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b1580156125db57600080fd5b505afa1580156125ef573d6000803e3d6000fd5b505050506040513d608081101561260557600080fd5b50602090810151604080516002808252606082018352929450928301908038833901905050935060015b6003811161272b576001600160a01b0386166000908152600a6020908152604080832084845260010190915290205461266f90859063ffffffff61252316565b6000828152600b602052604090205490945061269290849063ffffffff61252316565b92506126c3856000815181106126a457fe5b60200260200101518783856000805160206136f88339815191526135d5565b856000815181106126d057fe5b60200260200101818152505061270b856001815181106126ec57fe5b60200260200101518783856000805160206137398339815191526135d5565b8560018151811061271857fe5b602090810291909101015260010161262f565b50509193909250565b600061258061274e8360055461283e90919063ffffffff16565b849063ffffffff61334316565b60606000805b8351811015612835576009546001600160401b03166000908152600b6020526040902054600680546127ee92916127e2918590811061279c57fe5b60009182526020808320909101546001600160a01b038b168352600a825260408084206009546001600160401b031685526001019092529120549063ffffffff61334316565b9063ffffffff61283e16565b91506128168285838151811061280057fe5b602002602001015161252390919063ffffffff16565b84828151811061282257fe5b6020908102919091010152600101612761565b50919392505050565b60008082116128975760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816128a257fe5b04949350505050565b80156129a1576001600160a01b038316600080516020613739833981519152141561290c576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612906573d6000803e3d6000fd5b506129a1565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561296c57600080fd5b505af1158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b50516129a157600080fd5b505050565b600854600090610d04906001600160401b0380821691600160401b90041663ffffffff61252316565b600082821115612a295760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612a37611ebc565b6001600160401b0316421015612a975760408051600160e51b62461bcd02815260206004820152601060248201527f54696d65206e6f74207265616368656400000000000000000000000000000000604482015290519081900360640190fd5b60008211612aef5760408051600160e51b62461bcd02815260206004820152601e60248201527f76616c75652073686f756c642062652067726561746572207468616e20300000604482015290519081900360640190fd5b6000732330058d49fa61d5c5405fa8b17fcd823c59f7bb6001600160a01b031663bfed95b86040518163ffffffff1660e01b815260040160806040518083038186803b158015612b3e57600080fd5b505afa158015612b52573d6000803e3d6000fd5b505050506040513d6080811015612b6857600080fd5b50602001519050600360075460ff166004811115612b8257fe5b14612bb657600980546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055612bd0565b600980546fffffffffffffffff0000000000000000191690555b6007805460ff191660041790556008546001600160401b03600160801b90910416831015612c11576009805467ffffffffffffffff19166001179055612c59565b600854600160c01b90046001600160401b0316831115612c44576009805467ffffffffffffffff19166003179055612c59565b6009805467ffffffffffffffff191660021790555b604080516002808252606080830184529260208301908038833950506009546001600160401b03166000908152600b60209081526040808320600080516020613739833981519152845260010190915290205491925050151580612cf257506009546001600160401b03166000908152600b602090815260408083206000805160206136f8833981519152845260010190915290205415155b15612dff5760015b60038111612de5576009546001600160401b03168114612ddd576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612d4c908590606461339f565b9050612d5f818460008151811061280057fe5b83600081518110612d6c57fe5b6020908102919091018101919091526000838152600b8252604080822060008051602061373983398151915283526002019092522054612daf908590606461339f565b9050612dc2818460018151811061280057fe5b83600181518110612dcf57fe5b602002602001018181525050505b600101612cfa565b508051612df9906006906020840190613692565b50612ebb565b60015b60038111612eb9576000818152600b602090815260408083206000805160206136f88339815191528452600201909152812054612e42908590606461339f565b600454909150612e58908263ffffffff61252316565b6004556000828152600b602090815260408083206000805160206137398339815191528452600201909152902054612e93908590606461339f565b600154909150612ea9908263ffffffff61252316565b6001908155919091019050612e02565b505b612efe60008051602061373983398151915273e210330d6768030e816d223836335079c7a0c851612ef960025460015461252390919063ffffffff16565b6128ab565b612f3c6000805160206136f883398151915273e210330d6768030e816d223836335079c7a0c851612ef960035460045461252390919063ffffffff16565b60006002819055600355600954604051600160e01b63a99f50dd0281526001600160401b03909116602482018190526044820186905260648201859052608060048301908152600680546084850181905273e210330d6768030e816d223836335079c7a0c8519463a99f50dd9492938a928a92829160a49091019087908015612fe457602002820191906000526020600020905b815481526020019060010190808311612fd0575b505095505050505050600060405180830381600087803b15801561300757600080fd5b505af115801561301b573d6000803e3d6000fd5b5050505050505050565b60408051600b808252610180820190925260009182916060916020820161016080388339019050509050868160008151811061305d57fe5b60209081029190910101526008548151600160801b9091046001600160401b0316908290600190811061308c57fe5b60209081029190910101526008548151600160c01b9091046001600160401b031690829060029081106130bb57fe5b602090810291909101015260085481516001600160401b0390911690829060039081106130e457fe5b6020026020010181815250506130f86129a6565b8160048151811061310557fe5b6020026020010181815250506131196123c7565b8260058151811061312657fe5b602002602001018360068151811061313a57fe5b602090810291909101810192909252919091526000888152600b825260408082206000805160206137398339815191528352600101909252205481518290600790811061318357fe5b6020908102919091018101919091526000888152600b825260408082206000805160206136f8833981519152835260010190925220548151829060089081106131c857fe5b60200260200101818152505085816009815181106131e257fe5b6020026020010181815250508481600a815181106131fc57fe5b602090810291909101810191909152336000908152600a909152604081205462010000900460ff1661322c575060015b604051600160e01b6398d57d210281526001600160a01b03861660248201523360448201819052735f4ec3df9cbd43714fe2740f5e3616155c5b841960648301819052831515608484015260a060048401908152855160a48501528551732330058d49fa61d5c5405fa8b17fcd823c59f7bb946398d57d219488948c9491939092899291829160c401906020808a01910280838360005b838110156132db5781810151838201526020016132c3565b505050509050019650505050505050604080518083038186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d604081101561332b57600080fd5b50805160209091015190999098509650505050505050565b600082613352575060006124aa565b8282028284828161335f57fe5b041461258057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806137186021913960400191505060405180910390fd5b60006133b5826127e2868663ffffffff61334316565b949350505050565b336000908152600a602090815260408083208884526001019091529020546133eb908263ffffffff61252316565b336000908152600a60209081526040808320898452600181018352818420949094556001600160a01b0387168352600290930181528282208883529052205461343a908563ffffffff61252316565b336000908152600a602090815260408083206001600160a01b038816845260020182528083208984529091529020556134b761347c858463ffffffff61334316565b336000908152600a602090815260408083206001600160a01b038916845260030182528083208a84529091529020549063ffffffff61252316565b336000908152600a602090815260408083206001600160a01b03881684526003018252808320898452825280832093909355600b905220546134ff908263ffffffff61252316565b6000868152600b602090815260408083209384556001600160a01b0387168352600190930190522054613538908563ffffffff61252316565b6000868152600b602090815260408083206001600160a01b03881684526001019091529020556135a3613571858463ffffffff61334316565b6000878152600b602090815260408083206001600160a01b03891684526002019091529020549063ffffffff61252316565b6000958652600b602090815260408088206001600160a01b039096168852600290950190529290942091909155505050565b6009546000906001600160401b03168414156135f057600092505b6001600160a01b038086166000908152600a60209081526040808320938616835260039093018152828220878352905290812054613631908590606461339f565b6001600160a01b038088166000908152600a60209081526040808320938816835260029093018152828220898352905220549091506136879061367a908363ffffffff6129cf16565b889063ffffffff61252316565b979650505050505050565b8280548282559060005260206000209081019282156136cd579160200282015b828111156136cd5782518255916020019190600101906136b2565b506136d99291506136dd565b5090565b610d0791905b808211156136d957600081556001016136e356fe00000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a7230582098b1283931390455f5ca6bbff29e5ac85cfb8e6742ea874b10dd55d8636d9e4c0029

Deployed Bytecode Sourcemap

24313:27077:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46077:1061;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46077:1061:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46077:1061:0;-1:-1:-1;;;;;46077:1061:0;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;46077:1061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46077:1061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46077:1061:0;;;;;;;;;;;;;;;;;;;;;37748:424;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37748:424:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37748:424:0;;;;;;;;:::i;:::-;;40515:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40515:148:0;;;:::i;:::-;;;;;;;;;;;;;;;;38401:755;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38401:755:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38401:755:0;-1:-1:-1;;;;;38401:755:0;;:::i;40801:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40801:151:0;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40801:151:0;;;;;;;;;;;;;;43582:1225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43582:1225:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43582:1225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31234:282;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31234:282:0;;;:::i;41740:608::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41740:608:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41740:608:0;;:::i;26938:616::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;26938:616:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;36387:815::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36387:815:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36387:815:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;36387:815:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36387:815:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36387:815:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36387:815:0;;;;;;;;-1:-1:-1;36387:815:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;36387:815:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36387:815:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36387:815:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36387:815:0;;;;;;;;-1:-1:-1;36387:815:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;36387:815:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36387:815:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36387:815:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36387:815:0;;-1:-1:-1;36387:815:0;;-1:-1:-1;;;;;36387:815:0:i;37398:342::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37398:342:0;;;;;;;;;:::i;26472:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26472:40:0;;;:::i;:::-;;;;-1:-1:-1;;;;;26472:40:0;;;;;;;;;;;;;;;;;;;;;;;;47353:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47353:165:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47353:165:0;-1:-1:-1;;;;;47353:165:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41312:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41312:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41312:251:0;;;;;;;;;;;;:::i;45307:393::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45307:393:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;33010:276:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33010:276:0;;;:::i;39852:245::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39852:245:0;;;:::i;:::-;;;;-1:-1:-1;;;;;39852:245:0;;;;;;;;;;;;;;27987:1906;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;27987:1906:0;;;;;;;;;;;;;;;;;;:::i;26437:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26437:28:0;;;:::i;:::-;;;;-1:-1:-1;;;;;26437:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30904:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30904:322:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25559:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25559:50:0;;;:::i;26576:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26576:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26576:45:0;;:::i;42501:161::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42501:161:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42501:161:0;;;;;;;;:::i;46077:1061::-;46131:26;46159:34;46195:14;46211:23;46245:17;46264:18;46286:22;:20;:22::i;:::-;46244:64;;-1:-1:-1;46244:64:0;-1:-1:-1;46338:24:0;46320:14;:12;:14::i;:::-;:42;;;;;;;;;;:75;;;-1:-1:-1;46366:25:0;:9;46380:10;46366:25;:13;:25;:::i;:::-;:29;46320:75;46317:167;;;-1:-1:-1;;46459:14:0;;;;;-1:-1:-1;;;;;46459:14:0;;-1:-1:-1;46407:67:0;;46317:167;46512:16;;;46526:1;46512:16;;;;;;;;;;;;;;;105:10:-1;46512:16:0;88:34:-1;136:17;;-1:-1;46512:16:0;46492:36;;-1:-1:-1;;;;;;;;;;;46537:17:0;46555:1;46537:20;;;;;;;;;;;;;:32;-1:-1:-1;;;;;46537:32:0;;;-1:-1:-1;;;;;46537:32:0;;;;;-1:-1:-1;;;;;;;;;;;46578:17:0;46596:1;46578:20;;;;;;;;-1:-1:-1;;;;;46578:34:0;;;:20;;;;;;;;;;;:34;46623;;46782:27;46803:5;46782:20;:27::i;:::-;46713:96;;-1:-1:-1;46713:96:0;-1:-1:-1;46713:96:0;-1:-1:-1;46830:72:0;46713:96;;46830:20;:72::i;:::-;-1:-1:-1;;;;;46914:15:0;;46981:1;46914:15;;;:8;:15;;;;;;;;46947:16;:30;-1:-1:-1;;;;;46947:30:0;46914:64;;:32;;:64;;;;;;46818:84;;-1:-1:-1;46914:68:0;46911:144;;47010:35;47025:5;47032:12;47010:14;:35::i;:::-;46995:50;;46911:144;-1:-1:-1;;47115:14:0;;;;;-1:-1:-1;;;;;47115:14:0;;-1:-1:-1;;;46077:1061:0;;;;;;:::o;37748:424::-;37833:47;;;-1:-1:-1;;;;;37833:47:0;;37869:10;37833:47;;;;;;25053:42;;37833:35;;:47;;;;;;;;;;;;;;25053:42;37833:47;;;5:2:-1;;;;30:1;27;20:12;5:2;37833:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37833:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37833:47:0;37825:56;;;;;;37916:29;37898:14;:12;:14::i;:::-;:47;;;;;;;;;;37890:56;;;;;;37989:1;37963:14;;;;-1:-1:-1;;;;;37963:14:0;:28;37955:58;;;;;-1:-1:-1;;;;;37955:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38022:14;:23;;-1:-1:-1;;;;;;38022:23:0;;-1:-1:-1;;;;;38022:23:0;;;;;;;;;;;38054:21;:30;;;38093:71;;;-1:-1:-1;;;;;38093:71:0;;;;;;;;;38130:10;38093:71;;;;38150:4;38093:71;;;;;;;;;;;25164:42;;38093:28;;:71;;;;;;;;;;;38022:14;25164:42;38093:71;;;5:2:-1;;;;30:1;27;20:12;5:2;38093:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38093:71:0;;;;37748:424;;:::o;40515:148::-;40622:10;:25;40565:7;;40590:65;;40622:32;;-1:-1:-1;;;40622:25:0;;-1:-1:-1;;;;;40622:25:0;40652:1;40622:29;:32::i;:::-;40590:16;:27;-1:-1:-1;;;40590:27:0;;-1:-1:-1;;;;;40590:27:0;;:31;:65::i;:::-;40583:72;;40515:148;;:::o;38401:755::-;38460:7;38483:16;;;;;:62;;-1:-1:-1;38521:24:0;38503:14;:12;:14::i;:::-;:42;;;;;;;;;;38483:62;:103;;;;25053:42;-1:-1:-1;;;;;38549:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38549:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38549:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38549:37:0;38483:103;38480:137;;;-1:-1:-1;38606:1:0;38599:8;;38480:137;-1:-1:-1;;;;;38628:15:0;;;;;;:8;:15;;;;;:29;;;38625:63;;;-1:-1:-1;38677:1:0;38670:8;;38625:63;-1:-1:-1;;;;;38696:15:0;;;;;;:8;:15;;;;;:36;;-1:-1:-1;;38696:36:0;38728:4;38696:36;;;38742:27;;;;38828:16;38705:5;38828:9;:16::i;:::-;38741:103;;;;;;;38853:50;-1:-1:-1;;;;;;;;;;;38879:5:0;38886:13;38900:1;38886:16;;;;;;;;;;;;;;38853:14;:50::i;:::-;38912:52;-1:-1:-1;;;;;;;;;;;38940:5:0;38947:13;38961:1;38947:16;;;;;;;38912:52;38988:14;;38973:49;;38988:14;;;-1:-1:-1;;;;;38988:14:0;39004:5;39011:10;38973:14;:49::i;:::-;25053:42;-1:-1:-1;;;;;39031:31:0;;39063:5;39070:13;39085:17;39104:10;39116:14;;;;;;;;;-1:-1:-1;;;;;39116:14:0;39031:100;;;;;;;;;;;;;-1:-1:-1;;;;;39031:100:0;-1:-1:-1;;;;;39031:100:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39031:100:0;-1:-1:-1;;;;;39031:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39031:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39031:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39031:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39031:100:0;;;;39147:1;39140:8;;;;;38401:755;;;;:::o;40801:151::-;25355:1;-1:-1:-1;;;;;24866:42:0;40801:151;;;:::o;43582:1225::-;43924:10;:25;-1:-1:-1;;;;;43881:14:0;43654:22;;;;;;;;;;-1:-1:-1;;;43924:25:0;;-1:-1:-1;;;;;43924:25:0;43630:23;;43973:18;:16;:18::i;:::-;43960:31;;44027:14;:12;:14::i;:::-;44022:20;;;;;;;;44064:24;;;25392:1;44064:24;;;;;;;;;44002:40;;-1:-1:-1;44064:24:0;;;17:15:-1;;105:10;44064:24:0;88:34:-1;-1:-1;;44113:10:0;:26;44099:11;;;;-1:-1:-1;;;;44113:26:0;;-1:-1:-1;;;;;44113:26:0;;44099:11;;-1:-1:-1;44108:1:0;;44099:11;;;;;;;;;;;;;;;:40;44164:10;:26;:33;;-1:-1:-1;;;44164:26:0;;-1:-1:-1;;;;;44164:26:0;44195:1;44164:30;:33::i;:::-;44150:8;44159:1;44150:11;;;;;;;;;;;;;;;;;:47;44219:24;;;25392:1;44219:24;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;;44268:10:0;:26;44208:35;;-1:-1:-1;44268:33:0;;-1:-1:-1;;;44268:26:0;;-1:-1:-1;;;;;44268:26:0;;-1:-1:-1;44299:1:0;44268:30;:33::i;:::-;44254:8;44263:1;44254:11;;;;;;;;;;;;;;;;;:47;44326:10;:26;44312:11;;-1:-1:-1;;;44326:26:0;;;-1:-1:-1;;;;;44326:26:0;;44312:11;;44321:1;;44312:11;;;;;;;;;;;:40;;;;;44386:1;44377:11;44363:8;44372:1;44363:11;;;;;;;;;;;;;;;;;:25;44424:24;;;25392:1;44424:24;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;;44472:24:0;;;25392:1;44472:24;;;;;;;;;44409:39;;-1:-1:-1;25392:1:0;-1:-1:-1;44472:24:0;;;17:15:-1;;105:10;44472:24:0;88:34:-1;-1:-1;;44521:24:0;;;25392:1;44521:24;;;;;;;;;44459:37;;-1:-1:-1;25392:1:0;-1:-1:-1;44521:24:0;;;17:15:-1;;105:10;44521:24:0;88:34:-1;136:17;;-1:-1;;44507:38:0;-1:-1:-1;44561:6:0;44556:244;25392:1;44573;:16;44556:244;;;44642:1;44640:3;;;44623:21;;;;:16;:21;;;;;;;;-1:-1:-1;;;;;;;;;;;44623:46:0;;:33;;;:46;;;;44607:13;;:10;;44640:1;;44607:13;;;;;;;;;;;;;;;;:62;;;;44716:1;44714:3;;;44697:21;;;;:16;:21;;;;;;-1:-1:-1;;;;;;;;;;;44697:44:0;;:33;;;:44;;;;;;44680:14;;:11;;44714:1;;44680:14;;;;;;;;;;;:61;;;;;44770:19;44785:1;44787;44785:3;44770:14;:19::i;:::-;44752:12;44765:1;44752:15;;;;;;;;;;;;;;;;;:37;44591:3;;44556:244;;;;43582:1225;;;;;;;;;:::o;31234:282::-;31291:7;31310:17;31329:18;31351:22;:20;:22::i;:::-;31398:69;;;-1:-1:-1;;;;;31398:69:0;;-1:-1:-1;;;;;;;;;;;31398:69:0;;;;;;;;;;;;31309:64;;-1:-1:-1;31309:64:0;;-1:-1:-1;25269:42:0;;31398:45;;:69;;;;;;;;;;;;25269:42;31398:69;;;5:2:-1;;;;30:1;27;20:12;5:2;31398:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31398:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31398:69:0;;;;-1:-1:-1;31483:25:0;:10;31398:69;31483:25;:14;:25;:::i;:::-;31476:32;;;;31234:282;:::o;41740:608::-;41840:13;;;41851:1;41840:13;;;;;;;;;41802:4;;41817:20;;41840:13;;;;17:15:-1;;105:10;41840:13:0;88:34:-1;136:17;;-1:-1;41840:13:0;41817:36;;41874:11;41862:6;41869:1;41862:9;;;;;;;;;;;;;;;;;:23;41906:10;:26;41894:9;;-1:-1:-1;;;41906:26:0;;;-1:-1:-1;;;;;41906:26:0;;41894:9;;41901:1;;41894:9;;;;;;;;;;;;;;;:38;41953:10;:26;41941:9;;-1:-1:-1;;;41953:26:0;;;-1:-1:-1;;;;;41953:26:0;;41941:9;;41948:1;;41941:9;;;;;;;;;;;;;;;:38;42000:10;:20;41988:9;;-1:-1:-1;;;;;42000:20:0;;;;41988:6;;41995:1;;41988:9;;;;;;;;;;;:32;;;;;42041:18;:16;:18::i;:::-;42029:6;42036:1;42029:9;;;;;;;;;;;;;:30;;;;;42093:22;:20;:22::i;:::-;42069:6;42076:1;42069:9;;;;;;;;;;;;;42080:6;42087:1;42080:9;;;;;;;;;;;;;;;;;;42068:47;;;;;;;;42136:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;42136:54:0;;:41;;:54;;;;;42124:9;;:6;;42131:1;;42124:9;;;;;;;;;;;;;;;;:66;;;;42211:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;42211:52:0;;:41;;:52;;;;;42199:9;;:6;;42206:1;;42199:9;;;;;;;;;;;;;;;;:64;;;;42279:61;;;-1:-1:-1;;;;;42279:61:0;;24866:42;42279:61;;;;;;;;;;;;;;;;;;;;25269:42;;42279:34;;42314:6;;42279:61;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42279:61:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42279:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42279:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42279:61:0;;41740:608;-1:-1:-1;;;41740:608:0:o;26938:616::-;27059:30;27142:4;27059:91;;27181:5;-1:-1:-1;;;;;27181:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27181:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27181:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27181:18:0;-1:-1:-1;;;;;27167:32:0;:10;:32;27159:70;;;;;-1:-1:-1;;;;;27159:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27246:10;:20;-1:-1:-1;;;;;27246:20:0;:25;27238:57;;;;;-1:-1:-1;;;;;27238:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27346:3;27312:31;-1:-1:-1;;;;;27312:14:0;;;;:31;;;:14;:31;:::i;:::-;:37;27304:46;;;;;;-1:-1:-1;27359:10:0;:33;;-1:-1:-1;;27359:33:0;-1:-1:-1;;;;;27359:33:0;;;;-1:-1:-1;;27401:43:0;-1:-1:-1;;;27401:43:0;;;;;;;;;;;-1:-1:-1;;27461:38:0;-1:-1:-1;;;27461:38:0;;;;;;;;;;;-1:-1:-1;;;;;27508:38:0;-1:-1:-1;;;27508:38:0;;;;;;;;;;;26938:616::o;36387:815::-;36570:1;36540:27;:25;:27::i;:::-;:31;36532:60;;;;;-1:-1:-1;;;;;36532:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36627:24;36609:14;:12;:14::i;:::-;:42;;;;;;;;;36601:51;;;;;;36661:21;25269:42;-1:-1:-1;;;;;36686:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36686:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36686:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36686:42:0;36737:94;;;-1:-1:-1;;;;;36737:94:0;;-1:-1:-1;;;;;;;;;;;36737:94:0;;;;36777:10;36737:94;;;;25053:42;36737:94;;;;;;;;;;;;36686:42;;-1:-1:-1;25164:42:0;;36737:28;;:94;;;;;-1:-1:-1;;36737:94:0;;;;;;;;-1:-1:-1;25164:42:0;36737:94;;;5:2:-1;;;;30:1;27;20:12;5:2;36737:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36737:94:0;;;;36859:4;36840:16;;:23;;;;;;;;;;;;;;;;;;25053:42;-1:-1:-1;;;;;36872:39:0;;36912:13;36927:11;36940:12;36973:4;36980:13;36954:40;;;;;;-1:-1:-1;;;;;36954:40:0;-1:-1:-1;;;;;36954:40:0;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;36954:40:0;;;36996:16;37014:10;37026:15;;37043:17;;37062:13;36872:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36872:204:0;-1:-1:-1;;;;;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36872:204:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36872:204:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36872:204:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36872:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36872:204:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;37085:22:0;37092:15;37085:22;;;37123:17;37116:24;-1:-1:-1;;37149:16:0;:45;;-1:-1:-1;;37149:45:0;37168:26;37149:45;;;-1:-1:-1;;;;;36387:815:0:o;37398:342::-;37492:10;25053:42;37492:37;:85;;;;-1:-1:-1;37551:26:0;37533:14;:12;:14::i;:::-;:44;;;;;;;;;37492:85;37484:94;;;;;;37590:8;37587:61;;;37611:27;37623:11;37636:1;37611:11;:27::i;:::-;-1:-1:-1;;37675:5:0;37656:24;;-1:-1:-1;;37656:24:0;;;;;;37689:16;:43;;;;;37708:24;37689:43;;;37398:342::o;26472:40::-;;;-1:-1:-1;;;;;26472:40:0;;;;-1:-1:-1;;;26472:40:0;;;;:::o;47353:165::-;-1:-1:-1;;;;;47441:15:0;47412:4;47441:15;;;:8;:15;;;;;:33;;;;;;;;;47476;;;;;47353:165::o;41312:251::-;41422:21;41476:79;41501:11;41514:16;41532:9;-1:-1:-1;;;;;;;;;;;41476:24:0;:79::i;:::-;-1:-1:-1;41453:102:0;41312:251;-1:-1:-1;;;;41312:251:0:o;45307:393::-;45426:16;:30;-1:-1:-1;;;;;45426:30:0;45355:7;45458:48;;;:16;:48;;;;;;;;:65;;-1:-1:-1;;;;;;;;;;;45545:73:0;;45426:30;45545:60;;;:73;;;;;;-1:-1:-1;;;;;;;;;;;45620:71:0;;;;;;45525:18;45418:274;;;;;;;;;;;;;;;;;45355:7;;;;45373:16;;45355:7;;;;45426:30;;45458:65;;45620:71;45418:274;;45525:18;;45418:274;;;45525:18;45418:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45307:393;;;;;:::o;33010:276::-;33053:14;;25269:42;33089:31;24866:42;33148:18;:16;:18::i;:::-;-1:-1:-1;;;;;33140:27:0;33089:79;;;;;;;;;;;;;-1:-1:-1;;;;;33089:79:0;-1:-1:-1;;;;;33089:79:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33089:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33089:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33089:79:0;;;;;;;;;-1:-1:-1;33089:79:0;-1:-1:-1;33198:29:0;33180:14;:12;:14::i;:::-;:47;;;;;;;;;33177:102;;;33240:29;33252:6;33260:8;33240:11;:29::i;:::-;33010:276;;:::o;39852:245::-;39920:16;:27;39900:6;;-1:-1:-1;;;39920:27:0;;-1:-1:-1;;;;;39920:27:0;:31;39917:91;;-1:-1:-1;39971:16:0;:27;-1:-1:-1;;;39971:27:0;;-1:-1:-1;;;;;39971:27:0;39964:34;;39917:91;40055:10;:25;40030:58;;40055:32;;-1:-1:-1;;;40055:25:0;;-1:-1:-1;;;;;40055:25:0;40085:1;40055:29;:32::i;:::-;40030:10;:20;-1:-1:-1;;;;;40030:20:0;;:58;:24;:58;:::i;27987:1906::-;25053:42;-1:-1:-1;;;;;28126:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28126:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28126:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28126:37:0;28125:38;:69;;;;;25392:1;28167:11;:27;;28125:69;:98;;;;;25429:1;28198:9;:25;;28125:98;28117:107;;;;;;28248:10;:20;-1:-1:-1;;;;;28248:20:0;28241:3;:27;;;;:56;;;28279:18;:16;:18::i;:::-;28272:3;:25;;28241:56;28233:65;;;;;;28309:24;-1:-1:-1;;;;;28345:21:0;;-1:-1:-1;;;;;;;;;;;28345:21:0;28342:973;;;28407:9;28387:16;:29;28379:38;;;;;;28447:64;25471:2;28487:16;28505:5;28447:20;:64::i;:::-;28544:19;;28428:83;;-1:-1:-1;28544:41:0;;28428:83;28544:41;:23;:41;:::i;:::-;28522:19;:63;28342:973;;;28620:9;:14;28612:23;;;;;;-1:-1:-1;;;;;28650:19:0;;-1:-1:-1;;;;;;;;;;;28650:19:0;28646:489;;;28683:84;;;-1:-1:-1;;;;;28683:84:0;;-1:-1:-1;;;;;;;;;;;28683:84:0;;;;28723:10;28683:84;;;;28743:4;28683:84;;;;;;;;;;;;25164:42;;28683:28;;:84;;;;;-1:-1:-1;;28683:84:0;;;;;;;-1:-1:-1;25164:42:0;28683:84;;;5:2:-1;;;;30:1;27;20:12;5:2;28683:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28683:84:0;;;;28646:489;;;25164:42;-1:-1:-1;;;;;28816:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28816:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28816:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28816:27:0;-1:-1:-1;;;;;28806:37:0;;;;;;28798:46;;;;;;25429:1;28865:9;:25;28857:34;;;;;;28922:10;28913:20;;;;:8;:20;;;;;:38;;;;;;28912:39;28904:48;;;;;;28974:10;28965:20;;;;:8;:20;;;;;;:45;;-1:-1:-1;;28965:45:0;;;;;29023:69;;-1:-1:-1;;;;;29023:69:0;;;;;;;;;29068:4;29023:69;;;;;;;;;;;25164:42;;29023:24;;:69;;;;;28965:20;;29023:69;;;;;28965:20;25164:42;29023:69;;;5:2:-1;;;;30:1;27;20:12;5:2;29023:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29023:69:0;;;;-1:-1:-1;;;;;;;;;;;29105:18:0;;28646:489;29164:65;25533:1;29205:16;29223:5;29164:20;:65::i;:::-;29263:20;;29145:84;;-1:-1:-1;29263:42:0;;29145:84;29263:42;:24;:42;:::i;:::-;29240:20;:65;28342:973;29342:38;:16;29363;29342:38;:20;:38;:::i;:::-;29323:57;;29394:21;29417:24;29445:74;29470:11;29483:16;29501:9;29512:6;29445:24;:74::i;:::-;29393:126;;;;29531:19;29528:91;;;29572:10;29563:20;;;;:8;:20;;;;;:45;;-1:-1:-1;;29563:45:0;;;;;29528:91;29654:1;29635:16;:20;29627:29;;;;;;29667:88;29688:11;29701:16;29719:6;29727:9;29738:16;29667:20;:88::i;:::-;29764:121;;;-1:-1:-1;;;;;29764:121:0;;29807:10;29764:121;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29764:121:0;;;;;;;;;;;;;;;;;;;;25053:42;;29764;;:121;;;;;-1:-1:-1;;29764:121:0;;;;;;;-1:-1:-1;25053:42:0;29764:121;;;5:2:-1;;;;30:1;27;20:12;5:2;29764:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29764:121:0;;;;27987:1906;;;;;;;:::o;26437:28::-;;;-1:-1:-1;;;;;26437:28:0;;;;-1:-1:-1;;;26437:28:0;;;;;-1:-1:-1;;;26437:28:0;;;;;-1:-1:-1;;;26437:28:0;;;;:::o;30904:322::-;30956:17;;31020:1;31004:215;25392:1;31023;:16;31004:215;;31082:19;;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;31082:44:0;;:31;;:44;;;;;;31068:59;;:9;;:59;:13;:59;:::i;:::-;31166:19;;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;31166:42:0;;:31;;:42;;;;;;31056:71;;-1:-1:-1;31151:58:0;;:10;;:58;:14;:58;:::i;:::-;31138:71;-1:-1:-1;31040:3:0;;31004:215;;;;30904:322;;:::o;25559:50::-;-1:-1:-1;;;;;25559:50:0;:::o;26576:45::-;;;;;;;;;;;;;:::o;42501:161::-;-1:-1:-1;;;;;42613:15:0;;42588:7;42613:15;;;:8;:15;;;;;;;;:41;;;:32;;:41;;;;;;42501:161;;;;;:::o;51004:381::-;51050:16;;51079;;;;:41;;;;;;;;;:70;;;;;51131:18;:16;:18::i;:::-;51124:3;:25;;51079:70;51076:270;;;-1:-1:-1;51169:29:0;51162:36;;51076:270;51237:24;51217:16;;;;:44;;;;;;;;;:75;;;;;51272:20;:18;:20::i;:::-;51265:3;:27;;51217:75;51214:132;;;-1:-1:-1;51312:24:0;51305:31;;51214:132;-1:-1:-1;51361:16:0;;;;51004:381;:::o;930:181::-;988:7;1020:5;;;1044:6;;;;1036:46;;;;;-1:-1:-1;;;;;1036:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1102:1;930:181;-1:-1:-1;;;930:181:0:o;48690:702::-;48757:21;48780:31;48813:27;48854:19;25269:42;-1:-1:-1;;;;;48881:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48881:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48881:37:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;48881:37:0;;;;;;48937:16;;48951:1;48937:16;;;48881:37;48937:16;;;;48881:37;;-1:-1:-1;48937:16:0;;;;48881:37;105:10:-1;48937:16:0;88:34:-1;136:17;;-1:-1;;48927:26:0;-1:-1:-1;48974:1:0;48962:423;25392:1;48976;:15;48962:423;;-1:-1:-1;;;;;49067:15:0;;;;;;:8;:15;;;;;;;;:35;;;:32;;:35;;;;;;49036:67;;:26;;:67;:30;:67;:::i;:::-;49166:19;;;;:16;:19;;;;;:36;49007:96;;-1:-1:-1;49139:64:0;;:22;;:64;:26;:64;:::i;:::-;49114:89;;49228:60;49240:7;49248:1;49240:10;;;;;;;;;;;;;;49252:5;49259:1;49262:14;-1:-1:-1;;;;;;;;;;;49228:11:0;:60::i;:::-;49214:7;49222:1;49214:10;;;;;;;;;;;;;:74;;;;;49313:62;49325:7;49333:1;49325:10;;;;;;;;;;;;;;49337:5;49344:1;49347:14;-1:-1:-1;;;;;;;;;;;49313:11:0;:62::i;:::-;49299:7;49307:1;49299:10;;;;;;;;;;;;;;;;;:76;48992:3;;48962:423;;;;48690:702;;;;;;:::o;49640:248::-;49760:17;49799:81;49830:49;49856:22;49830:21;;:25;;:49;;;;:::i;:::-;49799:26;;:81;:30;:81;:::i;47802:460::-;47891:13;47914:11;;47934:293;47953:12;:19;47950:1;:22;47934:293;;;48112:16;:30;-1:-1:-1;;;;;48112:30:0;48095:48;;;;:16;:48;;;;;:65;48068:18;:21;;47999:162;;48095:65;47999:91;;48087:1;;48068:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47999:15:0;;;;:8;:15;;;;;;48032:16;:30;-1:-1:-1;;;;;48032:30:0;47999:64;;:32;;:64;;;;;;;:91;:68;:91;:::i;:::-;:95;:162;:95;:162;:::i;:::-;47990:171;;48190:27;48210:6;48190:12;48203:1;48190:15;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;48172:12;48185:1;48172:15;;;;;;;;;;;;;;;;;:45;47974:3;;47934:293;;;-1:-1:-1;48242:12:0;;47802:460;-1:-1:-1;;;47802:460:0:o;3289:333::-;3347:7;3446:1;3442;:5;3434:44;;;;;-1:-1:-1;;;;;3434:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3489:9;3505:1;3501;:5;;;;;;;3289:333;-1:-1:-1;;;;3289:333:0:o;39414:310::-;39520:11;;39517:200;;-1:-1:-1;;;;;39548:21:0;;-1:-1:-1;;;;;;;;;;;39548:21:0;39545:163;;;39584:28;;-1:-1:-1;;;;;39584:19:0;;;:28;;;;;39604:7;;39584:28;;;;39604:7;39584:19;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39584:28:0;39545:163;;;39658:6;-1:-1:-1;;;;;39651:23:0;;39675:10;39687:7;39651:44;;;;;;;;;;;;;-1:-1:-1;;;;;39651:44:0;-1:-1:-1;;;;;39651:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39651:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39651:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39651:44:0;39643:53;;;;;;39414:310;;;:::o;40229:134::-;40329:10;:25;40279:7;;40304:51;;-1:-1:-1;;;;;40304:20:0;;;;-1:-1:-1;;;40329:25:0;;;40304:51;:24;:51;:::i;1386:184::-;1444:7;1477:1;1472;:6;;1464:49;;;;;-1:-1:-1;;;;;1464:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1536:5:0;;;1386:184::o;33414:2436::-;33502:18;:16;:18::i;:::-;-1:-1:-1;;;;;33495:25:0;:3;:25;;33487:53;;;;;-1:-1:-1;;;;;33487:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33566:1;33557:6;:10;33549:52;;;;;-1:-1:-1;;;;;33549:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33610:19;25269:42;-1:-1:-1;;;;;33664:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33664:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33664:37:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;33664:37:0;;;;-1:-1:-1;33733:26:0;33713:16;;;;:46;;;;;;;;;33710:174;;33772:16;:41;;-1:-1:-1;;33772:41:0;-1:-1:-1;;;33809:3:0;-1:-1:-1;;;;;33772:41:0;;;;;33710:174;;;33847:16;33840:34;;-1:-1:-1;;33840:34:0;;;33710:174;33892:16;:43;;-1:-1:-1;;33892:43:0;33911:24;33892:43;;;33956:10;:26;-1:-1:-1;;;;;;;;33956:26:0;;;;33947:35;;33944:257;;;33995:16;:34;;-1:-1:-1;;33995:34:0;34028:1;33995:34;;;33944:257;;;34057:10;:26;-1:-1:-1;;;34057:26:0;;-1:-1:-1;;;;;34057:26:0;34048:35;;34045:156;;;34096:16;:34;;-1:-1:-1;;34096:34:0;34129:1;34096:34;;;34045:156;;;34157:16;:34;;-1:-1:-1;;34157:34:0;34190:1;34157:34;;;34045:156;34237:16;;;34251:1;34237:16;;;34209:25;34237:16;;;;;34209:25;34237:16;;;;;105:10:-1;34237:16:0;88:34:-1;-1:-1;;34282:16:0;:30;-1:-1:-1;;;;;34282:30:0;34341:1;34265:48;;;:16;:48;;;;;;;;-1:-1:-1;;;;;;;;;;;34265:73:0;;34282:30;34265:60;:73;;;;;;34209:44;;-1:-1:-1;;34265:77:0;;;:165;;-1:-1:-1;34372:16:0;:30;-1:-1:-1;;;;;34372:30:0;34429:1;34355:48;;;:16;:48;;;;;;;;-1:-1:-1;;;;;;;;;;;34355:71:0;;34372:30;34355:60;:71;;;;;;:75;;34265:165;34262:1188;;;34461:1;34450:493;25392:1;34463;:17;34450:493;;34504:16;:30;-1:-1:-1;;;;;34504:30:0;34501:33;;34498:434;;34551:22;34613:19;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;34613:45:0;;:34;;:45;;;;;;34576:88;;34597:14;;34660:3;34576:20;:88::i;:::-;34551:113;;34696:34;34715:14;34696:11;34708:1;34696:14;;;;;;;:34;34679:11;34691:1;34679:14;;;;;;;;;;;;;;;;;;:51;;;;34799:19;;;;:16;:19;;;;;;-1:-1:-1;;;;;;;;;;;34799:47:0;;:34;;:47;;;;;34762:90;;34783:14;;34848:3;34762:20;:90::i;:::-;34745:107;;34884:34;34903:14;34884:11;34896:1;34884:14;;;;;;;:34;34867:11;34879:1;34867:14;;;;;;;;;;;;;:51;;;;;34498:434;;34481:3;;34450:493;;;-1:-1:-1;34953:32:0;;;;:18;;:32;;;;;:::i;:::-;;34262:1188;;;35023:1;35012:429;25392:1;35025;:17;35012:429;;35060:22;35122:19;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;35122:45:0;;:34;;:45;;;;;;35085:88;;35106:14;;35169:3;35085:20;:88::i;:::-;35206:17;;35060:113;;-1:-1:-1;35206:37:0;;35060:113;35206:37;:21;:37;:::i;:::-;35186:17;:57;35310:19;;;;:16;:19;;;;;;;;-1:-1:-1;;;;;;;;;;;35310:47:0;;:34;;:47;;;;;;35273:90;;35294:14;;35359:3;35273:20;:90::i;:::-;35394:15;;35256:107;;-1:-1:-1;35394:35:0;;35256:107;35394:35;:19;:35;:::i;:::-;35376:15;:53;;;35043:3;;;;;-1:-1:-1;35012:429:0;;;;34262:1188;35458:94;-1:-1:-1;;;;;;;;;;;25053:42:0;35511:40;35531:19;;35511:15;;:19;;:40;;;;:::i;:::-;35458:14;:94::i;:::-;35561:95;-1:-1:-1;;;;;;;;;;;25053:42:0;35612:43;35634:20;;35612:17;;:21;;:43;;;;:::i;35561:95::-;35665:26;35672:19;35665:26;;;35707:20;35700:27;35793:16;:30;35736:106;;-1:-1:-1;;;;;35736:106:0;;-1:-1:-1;;;;;35793:30:0;;;35736:106;;;;;;;;;;;;;;;;;;;;;;;;;35773:18;35736:106;;;;;;;;25053:42;;35736:36;;35773:18;;35825:6;;35833:8;;35736:106;;;;;;;35773:18;;35736:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35736:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35736:106:0;;;;33414:2436;;;;:::o;29901:995::-;30111:14;;;30122:2;30111:14;;;;;;;;;30030:21;;;;30088:20;;30111:14;;;17:15:-1;;105:10;30111:14:0;88:34:-1;136:17;;-1:-1;30111:14:0;30088:37;;30146:11;30134:6;30141:1;30134:9;;;;;;;;;;;;;;;;;:23;30178:10;:26;30166:9;;-1:-1:-1;;;30178:26:0;;;-1:-1:-1;;;;;30178:26:0;;30166:9;;30173:1;;30166:9;;;;;;;;;;;;;;;:38;30225:10;:26;30213:9;;-1:-1:-1;;;30225:26:0;;;-1:-1:-1;;;;;30225:26:0;;30213:9;;30220:1;;30213:9;;;;;;;;;;;;;;;:38;30272:10;:20;30260:9;;-1:-1:-1;;;;;30272:20:0;;;;30260:6;;30267:1;;30260:9;;;;;;;;;;;:32;;;;;30313:18;:16;:18::i;:::-;30301:6;30308:1;30301:9;;;;;;;;;;;;;:30;;;;;30365:22;:20;:22::i;:::-;30341:6;30348:1;30341:9;;;;;;;;;;;;;30352:6;30359:1;30352:9;;;;;;;;;;;;;;;;;;30340:47;;;;;;;;30408:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;30408:54:0;;:41;;:54;;;;;30396:9;;:6;;30403:1;;30396:9;;;;;;;;;;;;;;;;:66;;;;30483:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;;;;;;;30483:52:0;;:41;;:52;;;;;30471:9;;:6;;30478:1;;30471:9;;;;;;;;;;;:64;;;;;30556:16;30544:6;30551:1;30544:9;;;;;;;;;;;;;:28;;;;;30594:9;30581:6;30588:2;30581:10;;;;;;;;;;;;;;;;;;:22;;;;30654:10;30612:20;30645;;;:8;:20;;;;;;:38;;;;;;30641:87;;-1:-1:-1;30714:4:0;30641:87;30778:102;;-1:-1:-1;;;;;30778:102:0;;-1:-1:-1;;;;;30778:102:0;;;;;;30833:10;30778:102;;;;;;24866:42;30778:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;25269:42;;30778:38;;30817:6;;30825;;30833:10;;24866:42;;30864:15;;30778:102;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30778:102:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30778:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30778:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30778:102:0;;;;;;;;;;;-1:-1:-1;29901:995:0;-1:-1:-1;;;;;;;29901:995:0:o;2350:471::-;2408:7;2653:6;2649:47;;-1:-1:-1;2683:1:0;2676:8;;2649:47;2720:5;;;2724:1;2720;:5;:1;2744:5;;;;;:10;2736:56;;;;-1:-1:-1;;;;;2736:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35858:171;35962:7;35987:34;36012:8;35987:20;:8;36000:6;35987:20;:12;:20;:::i;:34::-;35980:41;35858:171;-1:-1:-1;;;;35858:171:0:o;31940:987::-;32146:10;32137:20;;;;:8;:20;;;;;;;;:50;;;:37;;:50;;;;;;:72;;32192:16;32137:72;:54;:72;:::i;:::-;32093:10;32084:20;;;;:8;:20;;;;;;;;:50;;;:37;;;:50;;;;;:125;;;;-1:-1:-1;;;;;32274:40:0;;;;:32;;;;:40;;;;;:53;;;;;;;:75;;32332:16;32274:75;:57;:75;:::i;:::-;32227:10;32218:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;32218:40:0;;;;:32;;:40;;;;;:53;;;;;;;;:131;32416:92;32476:31;:16;32497:9;32476:31;:20;:31;:::i;:::-;32425:10;32416:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;32416:42:0;;;;:34;;:42;;;;;:55;;;;;;;;;;:92;:59;:92;:::i;:::-;32367:10;32358:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;32358:42:0;;;;:34;;:42;;;;;:55;;;;;;;;:150;;;;32566:16;:29;;;:46;:68;;32617:16;32566:68;:50;:68;:::i;:::-;32517:29;;;;:16;:29;;;;;;;;:117;;;-1:-1:-1;;;;;32695:49:0;;;;:41;;;;:49;;;;:71;;32749:16;32695:71;:53;:71;:::i;:::-;32643:29;;;;:16;:29;;;;;;;;-1:-1:-1;;;;;32643:49:0;;;;:41;;:49;;;;;:123;32830:89;32887:31;:16;32908:9;32887:31;:20;:31;:::i;:::-;32830:29;;;;:16;:29;;;;;;;;-1:-1:-1;;;;;32830:52:0;;;;:44;;:52;;;;;;;:89;:56;:89;:::i;:::-;32775:29;;;;:16;:29;;;;;;;;-1:-1:-1;;;;;32775:52:0;;;;;:44;;;;:52;;;;;;:144;;;;-1:-1:-1;;;31940:987:0:o;50454:417::-;50589:16;:30;50567:4;;-1:-1:-1;;;;;50589:30:0;50584:35;;50581:79;;;50649:1;50632:18;;50581:79;-1:-1:-1;;;;;50730:15:0;;;50668:22;50730:15;;;:8;:15;;;;;;;;:37;;;;;:29;;;;:37;;;;;:40;;;;;;;;;50693:83;;50714:14;;50772:3;50693:20;:83::i;:::-;-1:-1:-1;;;;;50804:15:0;;;;;;;:8;:15;;;;;;;;:35;;;;;:27;;;;:35;;;;;:38;;;;;;;50668:108;;-1:-1:-1;50792:71:0;;50804:58;;50668:108;50804:58;:42;:58;:::i;:::-;50792:7;;:71;:11;:71;:::i;:::-;50785:78;50454:417;-1:-1:-1;;;;;;;50454:417:0:o;24313:27077::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24313:27077:0;;;-1:-1:-1;24313:27077:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://98b1283931390455f5ca6bbff29e5ac85cfb8e6742ea874b10dd55d8636d9e4c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.