library SafeMath {
    /**
        @dev returns the sum of _x and _y, reverts if the calculation overflows
        @param _x   value 1
        @param _y   value 2
        @return sum
    */
    function add(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x + _y;
        require(z >= _x, "SafeMath failed");
        return z;
    }

    /**
        @dev returns the difference of _x minus _y, reverts if the calculation underflows
        @param _x   minuend
        @param _y   subtrahend
        @return difference
    */
    function sub(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_x >= _y, "SafeMath failed");
        return _x - _y;
    }

    /**
        @dev returns the product of multiplying _x by _y, reverts if the calculation overflows
        @param _x   factor 1
        @param _y   factor 2
        @return product
    */
    function mul(uint256 _x, uint256 _y) internal pure returns (uint256) {
        // gas optimization
        if (_x == 0)
            return 0;

        uint256 z = _x * _y;
        require(z / _x == _y, "SafeMath failed");
        return z;
    }

      /**
        @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
        @param _x   dividend
        @param _y   divisor
        @return quotient
    */
    function div(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_y > 0, "SafeMath failed");
        uint256 c = _x / _y;

        return c;
    }
}
function add(uint256 _x, uint256 _y) internal pure returns (uint256) {
    uint256 z = _x + _y;
    require(z >= _x, "SafeMath failed");
    return z;
}

/**
 @dev returns the sum of _x and _y, reverts if the calculation overflows
 @param _x   value 1
 @param _y   value 2
 @return sum
 */