[Demonstration 1]

[Buggy Method]
private void specificMessage(final Player recipient, final Player sender, final String message, final ArrayList<String> info) {
    // Create a new chat event
    final PlayerChatEvent event = createNewChatEvent(recipient, sender, message, info);
    // Call the chat event
    chatEvent(event);
}

[Buggy Hunk]
final PlayerChatEvent event = createNewChatEvent(recipient, sender, message, info);

[Patch]
final AsyncPlayerChatEvent event = createNewAsyncPlayerChatEvent(recipient, sender, message, info);

[Demonstration 2]

[Buggy Method]
public void run() {
    try {
        Sender sender = new Sender(regId);
        Message message = new Message.Builder().collapseKey("message").timeToLive(3).delayWhileIdle(true).addData("message", messageContent).build();
        Result result = sender.send(message, regId, 1);
        logger.info("Send Message to Device " + regId + ": " + result.toString());
    } catch (Exception e) {
        logger.info("Fail to send Message to Device " + regId);
        e.printStackTrace();
    }
}

[Buggy Hunk]
Sender sender = new Sender(regId);

[Patch]
Sender sender = new Sender("AIzaSyDFqKGeYuqbbj5Hs4fsEnDtXlpJyq0Qrgk");

[Demonstration 3]

[Buggy Method]
public void changeMap(String mapPath) {
    currentMap = CurtainFire.manager.get(mapPath);
    MapProperties props = currentMap.getProperties();
    currentMapHeight = props.get("height", Integer.class);
    currentMapWidth = props.get("width", Integer.class);
    renderer = new OrthogonalTiledMapRenderer(currentMap);
    masterMap = new OverworldGrid(currentMapWidth, currentMapHeight);
    TiledMapTileLayer specialLayer = (TiledMapTileLayer) currentMap.getLayers().get(SPECIAL_LAYER);
    for (int i = 0; i < currentMapWidth; i++) {
        for (int j = 0; j < currentMapHeight; j++) {
            //Create collision
            Cell c = specialLayer.getCell(i, j);
            if (c != null && c.getTile().getProperties().get("PLAYER") != null) {
                //Add collidable to master map
                masterMap.setPos(j, i, 1);
            } else {
                masterMap.setPos(j, i, 0);
            }
        }
    }
    NPCList = new Array<NPC>();
    MapLayer objLayer = currentMap.getLayers().get("Objects");
    MapObjects moList = objLayer.getObjects();
    for (MapObject mo : moList) {
        MapProperties properties = mo.getProperties();
        if (properties.containsKey("BATTLE")) {
            String imgPath = ((String) properties.get("SPRITE")) + ".png";
            String direction = (String) properties.get("DIRECTION");
            int dir = CFVars.Direction.valueOf(Direction.class, direction).num();
            Rectangle rect = ((RectangleMapObject) mo).getRectangle();
            String scriptPath = ((String) properties.get("SCRIPT")) + ".cfl";
            NPCList.add(new NPC(imgPath, rect.x, rect.y, dir, scriptPath));
        }
        if (properties.containsKey("PLAYER")) {
            Rectangle rect = ((RectangleMapObject) mo).getRectangle();
            player.setPosition(rect.x, rect.y);
            cameraFollowPlayer();
        }
    }
    //Get a copy of the non animated grass tile
    Iterator<TiledMapTile> tiles = currentMap.getTileSets().getTileSet("tileset").iterator();
    boolean found = false;
    while (!found && tiles.hasNext()) {
        TiledMapTile tile = tiles.next();
        if (tile.getProperties().containsKey("GRASS")) {
            if (staticGrass == null) {
                found = true;
                staticGrass = tile;
            }
        }
    }
    //Make an animated tile out of the flower tile frames
    //Gather frames for grass animation
    flowerTiles = new Array<StaticTiledMapTile>();
    grassTiles = new Array<TiledMapTile>();
    tiles = currentMap.getTileSets().getTileSet(ANIMATIONFRAMES).iterator();
    while (tiles.hasNext()) {
        TiledMapTile tile = tiles.next();
        if (tile.getProperties().containsKey("FLOWER")) {
            flowerTiles.add((StaticTiledMapTile) tile);
        } else if (tile.getProperties().containsKey("GRASS")) {
            grassTiles.add(tile);
        }
    }
    AnimatedTiledMapTile animatedTile = new AnimatedTiledMapTile(FLOWER_ANIMATION_SPEED, flowerTiles);
    TiledMapTileLayer layer = (TiledMapTileLayer) currentMap.getLayers().get(BACKGROUND_LAYER);
    for (int x = 0; x < layer.getWidth(); x++) for (int y = 0; y < layer.getHeight(); y++) {
        Cell cell = layer.getCell(x, y);
        if (cell != null && cell.getTile().getProperties().containsKey("FLOWER")) {
            cell.setTile(animatedTile);
        }
    }
}

[Buggy Hunk]
if(c!=null && c.getTile().getProperties().get("PLAYER") != null)

[Patch]
if(c!=null && c.getTile().getProperties().get("PLAYER") == null)