// Path: manual-bwapi/AIModule.java
// public class AIModule {
// 
//     AIModule(){}
// 
//     private BWEventListener eventListener;
// 
//     public void setEventListener(BWEventListener eventListener) {
//         this.eventListener = eventListener;
//     }
// 
//     public void onStart() {
//         if (eventListener != null) {
//             eventListener.onStart();
//         }
//     }
// 
//     public void onEnd(boolean isWinner) {
//         if (eventListener != null) {
//             eventListener.onEnd(isWinner);
//         }
//     }
// 
//     public void onFrame() {
//         if (eventListener != null) {
//             eventListener.onFrame();
//         }
//     }
// 
//     public void onSendText(String text) {
//         if (eventListener != null)
//         {
//             eventListener.onSendText(text);
//         }
//     }
// 
//     public void onReceiveText(Player player, String text) {
//         if (eventListener != null) {
//             eventListener.onReceiveText(player, text);
//         }
//     }
// 
//     public void onPlayerLeft(Player player) {
//         if (eventListener != null) {
//             eventListener.onPlayerLeft(player);
//         }
//     }
// 
//     public void onNukeDetect(Position target) {
//         if (eventListener != null) {
//             eventListener.onNukeDetect(target);
//         }
//     }
// 
//     public void onUnitDiscover(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitDiscover(unit);
//         }
//     }
// 
//     public void onUnitEvade(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitEvade(unit);
//         }
//     }
// 
//     public void onUnitShow(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitShow(unit);
//         }
//     }
// 
//     public void onUnitHide(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitHide(unit);
//         }
//     }
// 
//     public void onUnitCreate(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitCreate(unit);
//         }
//     }
// 
//     public void onUnitDestroy(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitDestroy(unit);
//         }
//     }
// 
//     public void onUnitMorph(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitMorph(unit);
//         }
//     }
// 
//     public void onUnitRenegade(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitRenegade(unit);
//         }
//     }
// 
//     public void onSaveGame(String gameName) {
//         if (eventListener != null) {
//             eventListener.onSaveGame(gameName);
//         }
//     }
// 
//     public void onUnitComplete(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitComplete(unit);
//         }
//     }
// 
//     public void onPlayerDropped(Player player) {
//         if (eventListener != null) {
//             eventListener.onPlayerDropped(player);
//         }
//     }
// 
// }
// 
// Path: manual-bwapi4/BWEventListener.java
// public interface BWEventListener {
// 
//     public void onStart();
// 
//     public void onEnd(boolean isWinner);
// 
//     public void onFrame();
// 
//     public void onSendText(String text);
// 
//     public void onReceiveText(Player player, String text);
// 
//     public void onPlayerLeft(Player player);
// 
//     public void onNukeDetect(Position target);
// 
//     public void onUnitDiscover(Unit unit);
// 
//     public void onUnitEvade(Unit unit);
// 
//     public void onUnitShow(Unit unit);
// 
//     public void onUnitHide(Unit unit);
// 
//     public void onUnitCreate(Unit unit);
// 
//     public void onUnitDestroy(Unit unit);
// 
//     public void onUnitMorph(Unit unit);
// 
//     public void onUnitRenegade(Unit unit);
// 
//     public void onSaveGame(String gameName);
// 
//     public void onUnitComplete(Unit unit);
// 
//     public void onPlayerDropped(Player player);
// 
// }


import bwapi.AIModule;
import bwapi.BWEventListener;
import java.io.*;
import java.io.File;
import java.lang.Exception;
import java.lang.UnsupportedOperationException;
import java.util.*;
import java.util.zip.*;
package bwapi;



/**
 * <p>The API entry point. Standard use case:</p>
 * <ul>
 *     <li>Create a Mirror object and use {@link #getModule()} and then set an {@link bwapi.AIModule}'s {@link bwapi.BWEventListener}<br/>
 *     <li>Call {@link #startGame()} to init the API and connect to Broodwar, then launch Broodwar from ChaosLauncher.</li>
 *     <li>In you {@link bwapi.BWEventListener#onStart()} method, receive the Game object by calling {@link #getGame()}</li>
 * </ul>
 * <br/>
 * <b>Example</b>
 * <pre>
 *     {@code
 *
 *     mirror.getModule().setEventListener(new DefaultBWListener()
 *     {
 *            public void onStart() {
 *                game = mirror.getGame();
 *                self = game.self();
 *                //initialization
 *                ....
 *            }
 *
 *           public void onUpdate() {
 *               for (Unit myUnit : self.getUnits()) {
 *                   //give orders to unit
 *                   ...
 *                }
 *           }
 *        });
 *     }
 *     mirror.startGame();
 * </pre>

 * <p><b>Note:</b> The Game object is initialized during the {@link #startGame()} as well as other BWMirror API's constants.
 * Do not use any API releated methods/fields prior to {@link #startGame()}.</p>

 */
public class Mirror {

    private Game game;

// Path: manual-bwapi/AIModule.java
// public class AIModule {
// 
//     AIModule(){}
// 
//     private BWEventListener eventListener;
// 
//     public void setEventListener(BWEventListener eventListener) {
//         this.eventListener = eventListener;
//     }
// 
//     public void onStart() {
//         if (eventListener != null) {
//             eventListener.onStart();
//         }
//     }
// 
//     public void onEnd(boolean isWinner) {
//         if (eventListener != null) {
//             eventListener.onEnd(isWinner);
//         }
//     }
// 
//     public void onFrame() {
//         if (eventListener != null) {
//             eventListener.onFrame();
//         }
//     }
// 
//     public void onSendText(String text) {
//         if (eventListener != null)
//         {
//             eventListener.onSendText(text);
//         }
//     }
// 
//     public void onReceiveText(Player player, String text) {
//         if (eventListener != null) {
//             eventListener.onReceiveText(player, text);
//         }
//     }
// 
//     public void onPlayerLeft(Player player) {
//         if (eventListener != null) {
//             eventListener.onPlayerLeft(player);
//         }
//     }
// 
//     public void onNukeDetect(Position target) {
//         if (eventListener != null) {
//             eventListener.onNukeDetect(target);
//         }
//     }
// 
//     public void onUnitDiscover(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitDiscover(unit);
//         }
//     }
// 
//     public void onUnitEvade(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitEvade(unit);
//         }
//     }
// 
//     public void onUnitShow(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitShow(unit);
//         }
//     }
// 
//     public void onUnitHide(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitHide(unit);
//         }
//     }
// 
//     public void onUnitCreate(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitCreate(unit);
//         }
//     }
// 
//     public void onUnitDestroy(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitDestroy(unit);
//         }
//     }
// 
//     public void onUnitMorph(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitMorph(unit);
//         }
//     }
// 
//     public void onUnitRenegade(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitRenegade(unit);
//         }
//     }
// 
//     public void onSaveGame(String gameName) {
//         if (eventListener != null) {
//             eventListener.onSaveGame(gameName);
//         }
//     }
// 
//     public void onUnitComplete(Unit unit) {
//         if (eventListener != null) {
//             eventListener.onUnitComplete(unit);
//         }
//     }
// 
//     public void onPlayerDropped(Player player) {
//         if (eventListener != null) {
//             eventListener.onPlayerDropped(player);
//         }
//     }
// 
// }
// 
// Path: manual-bwapi4/BWEventListener.java
// public interface BWEventListener {
// 
//     public void onStart();
// 
//     public void onEnd(boolean isWinner);
// 
//     public void onFrame();
// 
//     public void onSendText(String text);
// 
//     public void onReceiveText(Player player, String text);
// 
//     public void onPlayerLeft(Player player);
// 
//     public void onNukeDetect(Position target);
// 
//     public void onUnitDiscover(Unit unit);
// 
//     public void onUnitEvade(Unit unit);
// 
//     public void onUnitShow(Unit unit);
// 
//     public void onUnitHide(Unit unit);
// 
//     public void onUnitCreate(Unit unit);
// 
//     public void onUnitDestroy(Unit unit);
// 
//     public void onUnitMorph(Unit unit);
// 
//     public void onUnitRenegade(Unit unit);
// 
//     public void onSaveGame(String gameName);
// 
//     public void onUnitComplete(Unit unit);
// 
//     public void onPlayerDropped(Player player);
// 
// }


// Path: manual-bwapi/Mirror.java
import bwapi.AIModule;
import bwapi.BWEventListener;
import java.io.*;
import java.io.File;
import java.lang.Exception;
import java.lang.UnsupportedOperationException;
import java.util.*;
import java.util.zip.*;

package bwapi;



/**
 * <p>The API entry point. Standard use case:</p>
 * <ul>
 *     <li>Create a Mirror object and use {@link #getModule()} and then set an {@link bwapi.AIModule}'s {@link bwapi.BWEventListener}<br/>
 *     <li>Call {@link #startGame()} to init the API and connect to Broodwar, then launch Broodwar from ChaosLauncher.</li>
 *     <li>In you {@link bwapi.BWEventListener#onStart()} method, receive the Game object by calling {@link #getGame()}</li>
 * </ul>
 * <br/>
 * <b>Example</b>
 * <pre>
 *     {@code
 *
 *     mirror.getModule().setEventListener(new DefaultBWListener()
 *     {
 *            public void onStart() {
 *                game = mirror.getGame();
 *                self = game.self();
 *                //initialization
 *                ....
 *            }
 *
 *           public void onUpdate() {
 *               for (Unit myUnit : self.getUnits()) {
 *                   //give orders to unit
 *                   ...
 *                }
 *           }
 *        });
 *     }
 *     mirror.startGame();
 * </pre>

 * <p><b>Note:</b> The Game object is initialized during the {@link #startGame()} as well as other BWMirror API's constants.
 * Do not use any API releated methods/fields prior to {@link #startGame()}.</p>

 */
public class Mirror {

    private Game game;

    private AIModule module = new AIModule();