// Path: src/model/HaMap.java
// public class HaMap {
// 
// 	public String name;
// 	public int width;
// 	public int height;
// 	public SquareType[][] squares;
// 	public List<Position> assaultSquares;
// 	public List<Position> p1DeploySquares;
// 	public List<Position> p2DeploySquares;
// 	public List<Position> p1Crystals;
// 	public List<Position> p2Crystals;
// 
// 	public HaMap(int width, int height, SquareType[][] squares, String name) {
// 		super();
// 		this.name = name;
// 		this.width = width;
// 		this.height = height;
// 		this.squares = squares;
// 		assaultSquares = new ArrayList<Position>();
// 		p1DeploySquares = new ArrayList<Position>();
// 		p2DeploySquares = new ArrayList<Position>();
// 		p1Crystals = new ArrayList<Position>();
// 		p2Crystals = new ArrayList<Position>();
// 		for (int x = 0; x < squares.length; x++)
// 			for (int y = 0; y < squares[0].length; y++) {
// 				if (squares[x][y] == SquareType.DEPLOY_1)
// 					p1DeploySquares.add(new Position(x, y));
// 				if (squares[x][y] == SquareType.DEPLOY_2)
// 					p2DeploySquares.add(new Position(x, y));
// 				if (squares[x][y] == SquareType.ASSAULT)
// 					assaultSquares.add(new Position(x, y));
// 			}
// 	}
// 
// 	public SquareType squareAt(int x, int y) {
// 
// 		return squares[x][y];
// 
// 	}
// 
// 	public SquareType squareAt(Position position) {
// 		return squareAt(position.x, position.y);
// 	}
// 
// }
// 
// Path: src/model/Position.java
// public class Position {
// 
// 	public int x;
// 	public int y;
// 
// 	public Position(int x, int y) {
// 		super();
// 		this.x = x;
// 		this.y = y;
// 	}
// 
// 	public Position() {
// 		super();
// 		x = 0;
// 		y = 0;
// 	}
// 
// 	public Direction getDirection(Position pos) {
// 		if (pos == null)
// 			return null;
// 		return Direction.direction(pos.x - x, pos.y - y);
// 	}
// 
// 	public int hashCode() {
// 		int result = 1;
// 		result = 5 * result + x;
// 		result = 5 * result + y;
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "(" + x + "," + y + ")";
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		final Position other = (Position) obj;
// 		if (x != other.x)
// 			return false;
// 		if (y != other.y)
// 			return false;
// 		return true;
// 	}
// 
// 	public int distance(Position to) {
// 		int xx = x - to.x;
// 		if (xx < 0)
// 			xx = xx * (-1);
// 		int yy = y - to.y;
// 		if (yy < 0)
// 			yy = yy * (-1);
// 		return xx + yy;
// 	}
// 
// }
// 
// Path: src/model/SquareType.java
// public enum SquareType {
// 
// 	NONE, ASSAULT, DEFENSE, POWER, DEPLOY_1, DEPLOY_2;
// 	
// }


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import model.HaMap;
import model.Position;
import model.SquareType;
		codes.put('S', SquareType.DEFENSE);
		codes.put('A', SquareType.ASSAULT);
		codes.put('P', SquareType.POWER);
		codes.put('c', SquareType.NONE);
		codes.put('C', SquareType.NONE);
		//codes.put('H', SquareType.);
	}
	static Map<String, HaMap> maps = new HashMap<String, HaMap>();

	public static HaMap get(String name) throws IOException{

		if (maps.containsKey(name)) 
			return maps.get(name);
		else
			load (name);
		
		return get(name);
	}
	
	public static void load(String name) throws IOException{
	
		String basePath = PathHelper.basePath();
		List<String> lines = readLines(basePath + "/maps/"+name+".mhap");
	
		List<Position> p1Crystals = new ArrayList<Position>();
		List<Position> p2Crystals = new ArrayList<Position>();
		List<List<SquareType>> squareLists = new ArrayList<List<SquareType>>();
		int y = 0;
		for(String line : lines){
			if (line.length() == 0 || line.charAt(0) == '#')
// Path: src/model/HaMap.java
// public class HaMap {
// 
// 	public String name;
// 	public int width;
// 	public int height;
// 	public SquareType[][] squares;
// 	public List<Position> assaultSquares;
// 	public List<Position> p1DeploySquares;
// 	public List<Position> p2DeploySquares;
// 	public List<Position> p1Crystals;
// 	public List<Position> p2Crystals;
// 
// 	public HaMap(int width, int height, SquareType[][] squares, String name) {
// 		super();
// 		this.name = name;
// 		this.width = width;
// 		this.height = height;
// 		this.squares = squares;
// 		assaultSquares = new ArrayList<Position>();
// 		p1DeploySquares = new ArrayList<Position>();
// 		p2DeploySquares = new ArrayList<Position>();
// 		p1Crystals = new ArrayList<Position>();
// 		p2Crystals = new ArrayList<Position>();
// 		for (int x = 0; x < squares.length; x++)
// 			for (int y = 0; y < squares[0].length; y++) {
// 				if (squares[x][y] == SquareType.DEPLOY_1)
// 					p1DeploySquares.add(new Position(x, y));
// 				if (squares[x][y] == SquareType.DEPLOY_2)
// 					p2DeploySquares.add(new Position(x, y));
// 				if (squares[x][y] == SquareType.ASSAULT)
// 					assaultSquares.add(new Position(x, y));
// 			}
// 	}
// 
// 	public SquareType squareAt(int x, int y) {
// 
// 		return squares[x][y];
// 
// 	}
// 
// 	public SquareType squareAt(Position position) {
// 		return squareAt(position.x, position.y);
// 	}
// 
// }
// 
// Path: src/model/Position.java
// public class Position {
// 
// 	public int x;
// 	public int y;
// 
// 	public Position(int x, int y) {
// 		super();
// 		this.x = x;
// 		this.y = y;
// 	}
// 
// 	public Position() {
// 		super();
// 		x = 0;
// 		y = 0;
// 	}
// 
// 	public Direction getDirection(Position pos) {
// 		if (pos == null)
// 			return null;
// 		return Direction.direction(pos.x - x, pos.y - y);
// 	}
// 
// 	public int hashCode() {
// 		int result = 1;
// 		result = 5 * result + x;
// 		result = 5 * result + y;
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "(" + x + "," + y + ")";
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		final Position other = (Position) obj;
// 		if (x != other.x)
// 			return false;
// 		if (y != other.y)
// 			return false;
// 		return true;
// 	}
// 
// 	public int distance(Position to) {
// 		int xx = x - to.x;
// 		if (xx < 0)
// 			xx = xx * (-1);
// 		int yy = y - to.y;
// 		if (yy < 0)
// 			yy = yy * (-1);
// 		return xx + yy;
// 	}
// 
// }
// 
// Path: src/model/SquareType.java
// public enum SquareType {
// 
// 	NONE, ASSAULT, DEFENSE, POWER, DEPLOY_1, DEPLOY_2;
// 	
// }


// Path: src/util/MapLoader.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import model.HaMap;
import model.Position;
import model.SquareType;

		codes.put('S', SquareType.DEFENSE);
		codes.put('A', SquareType.ASSAULT);
		codes.put('P', SquareType.POWER);
		codes.put('c', SquareType.NONE);
		codes.put('C', SquareType.NONE);
		//codes.put('H', SquareType.);
	}
	static Map<String, HaMap> maps = new HashMap<String, HaMap>();

	public static HaMap get(String name) throws IOException{

		if (maps.containsKey(name)) 
			return maps.get(name);
		else
			load (name);
		
		return get(name);
	}
	
	public static void load(String name) throws IOException{
	
		String basePath = PathHelper.basePath();
		List<String> lines = readLines(basePath + "/maps/"+name+".mhap");
	
		List<Position> p1Crystals = new ArrayList<Position>();
		List<Position> p2Crystals = new ArrayList<Position>();
		List<List<SquareType>> squareLists = new ArrayList<List<SquareType>>();
		int y = 0;
		for(String line : lines){
			if (line.length() == 0 || line.charAt(0) == '#')
				continue;