contract LongHashERC20Token is StandardERC20Token {

    // Issuer of tokens
    address public issuer;

    // Events
    event Issuance(address indexed _from, uint256 _amount, uint256 _value);
    event Burn(address indexed _from, uint256 _amount, uint256 _value);

    // Modifier to check the issuer
    modifier onlyIssuer() {
        if (msg.sender != issuer) {
            revert();
        }
        _;
    }

    /**
    * @dev Constructor
    *
    * @param _issuer The account who owns all tokens
    * @param _name The name of the token
    * @param _symbol The symbol of the token
    * @param _decimals The decimals of the token
    * @param _amount The initial amount of the token
    */
    constructor(address _issuer, string _name, string _symbol, uint8 _decimals, uint256 _amount) 
        StandardERC20Token(_issuer, _name, _symbol, _decimals, _amount) public {
        issuer = _issuer;
    }

    /**
    * @dev Issuing tokens
    *
    * @param _amount The amount of tokens to be issued
    * @return Whether the issuance was successful or not
    */
    function issue(uint256 _amount) onlyIssuer() public returns (bool) {
        require(_amount > 0);
        uint256 value = _amount.mul(10 ** uint256(decimals));

        supply = supply.add(value);
        balances[issuer] = balances[issuer].add(value);

        emit Issuance(msg.sender, _amount, value);
        return true;
    }

    /**
    * @dev Burn tokens
    *
    * @param _amount The amount of tokens to be burned
    * @return Whether the burn was successful or not
    */
    function burn(uint256 _amount) onlyIssuer() public returns (bool) {
        uint256 value;

        require(_amount > 0);
        value = _amount.mul(10 ** uint256(decimals));
        require(supply >= value);
        require(balances[issuer] >= value);

        supply = supply.sub(value);
        balances[issuer] = balances[issuer].sub(value);

        emit Burn(msg.sender, _amount, value);
        return true;
    }

    /**
    * @dev Change the issuer of tokens
    *
    * @param _to The new issuer
    * @param _transfer Whether transfer the old issuer's tokens to new issuer
    * @return Whether the burn was successful or not
    */
    function changeIssuer(address _to, bool _transfer) onlyIssuer() public returns (bool) {
        require(_to != address(0));

        if (_transfer) {
            balances[_to] = balances[issuer];
            balances[issuer] = 0;
        }
        issuer = _to;

        return true;
    }
}
/**
 * @title LongHash ERC20 Token
 */
function burn(uint256 _amount) onlyIssuer() public returns (bool) {
    uint256 value;

    require(_amount > 0);
    value = _amount.mul(10 ** uint256(decimals));
    require(supply >= value);
    require(balances[issuer] >= value);

    supply = supply.sub(value);
    balances[issuer] = balances[issuer].sub(value);

    emit Burn(msg.sender, _amount, value);
    return true;
}

/**
 * @dev Burn tokens
 *
 * @param _amount The amount of tokens to be burned
 * @return Whether the burn was successful or not
 */