// Path: randomizer/common/fs/data/ScriptSingleton.java
// public class ScriptSingleton {
//     private static ScriptSingleton instance;
// 
//     private Hashtable<String, Byte[]> tags = new Hashtable<>();
//     private Hashtable<Integer, Byte[]> subheaders = new Hashtable<>();
// 
//     private ScriptSingleton() throws SAXException, IOException, ParserConfigurationException {
//         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
//         Document doc = dBuilder.parse(this.getClass().getResourceAsStream("Commands.xml"));
//         doc.getDocumentElement().normalize();
//         NodeList nList = doc.getElementsByTagName("Command");
//         for (int x = 0; x < nList.getLength(); x++) {
//             Node node = nList.item(x);
//             if (!node.getAttributes().getNamedItem("name").getNodeValue().equals("")) {
//                 if (node.getAttributes().getNamedItem("tag").getNodeValue().equals("")) {
//                     tags.put(node.getAttributes().getNamedItem("name").getNodeValue(), new Byte[0]);
//                 } else {
//                     String[] splitString = node.getAttributes().getNamedItem("tag").getNodeValue().split(",");
//                     Byte[] bytes = new Byte[splitString.length];
//                     for (int y = 0; y < bytes.length; y++) {
//                         bytes[y] = Byte.parseByte(splitString[y], 16);
//                     }
//                     tags.put(node.getAttributes().getNamedItem("name").getNodeValue(), bytes);
//                 }
//             }
//         }
// 
//         doc = dBuilder.parse(this.getClass().getResourceAsStream("Subheaders.xml"));
//         doc.getDocumentElement().normalize();
//         nList = doc.getElementsByTagName("Subheader");
//         for (int x = 0; x < nList.getLength(); x++) {
//             Node node = nList.item(x);
//             if (!node.getAttributes().getNamedItem("id").getNodeValue().equals("")) {
//                 int id = Integer.parseInt(node.getAttributes().getNamedItem("id").getNodeValue());
//                 String[] unparsedValues = node.getAttributes().getNamedItem("layout").getNodeValue().split(",");
//                 Byte[] values = new Byte[unparsedValues.length];
//                 for (int y = 0; y < values.length; y++)
//                     values[y] = Byte.parseByte(unparsedValues[y]);
//                 subheaders.put(id, values);
//             }
//         }
//     }
// 
//     public static ScriptSingleton getInstance() throws Exception {
//         if (instance == null)
//             instance = new ScriptSingleton();
//         return instance;
//     }
// 
//     public Hashtable<String, Byte[]> getTags() {
//         return tags;
//     }
// 
//     public Hashtable<Integer, Byte[]> getSubheaders() {
//         return subheaders;
//     }
// }
// 
// Path: randomizer/common/utils/ByteUtils.java
// public class ByteUtils {
//     public static short toShort(byte[] encodedValues, int index) {
//         return (short) (((encodedValues[index + 1] & 0xff) << 8) + (encodedValues[index] & 0xff));
//     }
// 
//     public static int toBigEndianShort(byte[] encodedValues, int index) {
//         return (((encodedValues[index] << 8) & 0xFF00) | (encodedValues[index + 1] & 0xFF));
//     }
// 
//     public static int toInt(byte[] encodedValue, int index) {
//         int value = (encodedValue[index + 3] << (Byte.SIZE * 3));
//         value |= (encodedValue[index + 2] & 0xFF) << (Byte.SIZE * 2);
//         value |= (encodedValue[index + 1] & 0xFF) << (Byte.SIZE);
//         value |= (encodedValue[index] & 0xFF);
//         return value;
//     }
// 
//     public static byte[] toByteArray(short value) {
//         byte[] ret = new byte[2];
//         ret[0] = (byte) (value & 0xff);
//         ret[1] = (byte) ((value >> 8) & 0xff);
//         return ret;
//     }
// 
//     public static List<Byte> toByteList(byte[] arr) {
//         List<Byte> bytes = new ArrayList<>();
//         for (byte b : arr)
//             bytes.add(b);
//         return bytes;
//     }
// 
//     public static byte[] toByteArray(int value) {
//         byte[] encodedValue = new byte[Integer.SIZE / Byte.SIZE];
//         encodedValue[3] = (byte) (value >> (Byte.SIZE * 3));
//         encodedValue[2] = (byte) (value >> (Byte.SIZE * 2));
//         encodedValue[1] = (byte) (value >> Byte.SIZE);
//         encodedValue[0] = (byte) value;
//         return encodedValue;
//     }
// 
//     public static String getString(byte[] source, int index) throws UnsupportedEncodingException {
//         int end = index;
//         while (source[end] != 0) {
//             end++;
//         }
//         return new String(Arrays.copyOfRange(source, index, end), "shift-jis");
//     }
// 
//     public static String toString(byte[] input) {
//         StringBuilder builder = new StringBuilder("[");
//         for(int x = 0; x < input.length; x++) {
//             builder.append("0x").append(Long.toHexString(input[x] & 0xFF));
//             if(x != input.length - 1)
//                 builder.append(", ");
//         }
//         return builder.append("]").toString();
//     }
// }


import randomizer.common.fs.data.ScriptSingleton;
import randomizer.common.utils.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
package randomizer.common.fs.model;



public class Decompiler {

	private int ref;
	private List<String> result;
	private byte[] bytes;
	private String fileName;

	public Decompiler() {}

	public String decompile(Path path) throws Exception {
	    this.fileName = path.toFile().getName();
		List<Integer> headers = new ArrayList<>();
		result = new ArrayList<>();
		bytes = Files.readAllBytes(path);
// Path: randomizer/common/fs/data/ScriptSingleton.java
// public class ScriptSingleton {
//     private static ScriptSingleton instance;
// 
//     private Hashtable<String, Byte[]> tags = new Hashtable<>();
//     private Hashtable<Integer, Byte[]> subheaders = new Hashtable<>();
// 
//     private ScriptSingleton() throws SAXException, IOException, ParserConfigurationException {
//         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
//         Document doc = dBuilder.parse(this.getClass().getResourceAsStream("Commands.xml"));
//         doc.getDocumentElement().normalize();
//         NodeList nList = doc.getElementsByTagName("Command");
//         for (int x = 0; x < nList.getLength(); x++) {
//             Node node = nList.item(x);
//             if (!node.getAttributes().getNamedItem("name").getNodeValue().equals("")) {
//                 if (node.getAttributes().getNamedItem("tag").getNodeValue().equals("")) {
//                     tags.put(node.getAttributes().getNamedItem("name").getNodeValue(), new Byte[0]);
//                 } else {
//                     String[] splitString = node.getAttributes().getNamedItem("tag").getNodeValue().split(",");
//                     Byte[] bytes = new Byte[splitString.length];
//                     for (int y = 0; y < bytes.length; y++) {
//                         bytes[y] = Byte.parseByte(splitString[y], 16);
//                     }
//                     tags.put(node.getAttributes().getNamedItem("name").getNodeValue(), bytes);
//                 }
//             }
//         }
// 
//         doc = dBuilder.parse(this.getClass().getResourceAsStream("Subheaders.xml"));
//         doc.getDocumentElement().normalize();
//         nList = doc.getElementsByTagName("Subheader");
//         for (int x = 0; x < nList.getLength(); x++) {
//             Node node = nList.item(x);
//             if (!node.getAttributes().getNamedItem("id").getNodeValue().equals("")) {
//                 int id = Integer.parseInt(node.getAttributes().getNamedItem("id").getNodeValue());
//                 String[] unparsedValues = node.getAttributes().getNamedItem("layout").getNodeValue().split(",");
//                 Byte[] values = new Byte[unparsedValues.length];
//                 for (int y = 0; y < values.length; y++)
//                     values[y] = Byte.parseByte(unparsedValues[y]);
//                 subheaders.put(id, values);
//             }
//         }
//     }
// 
//     public static ScriptSingleton getInstance() throws Exception {
//         if (instance == null)
//             instance = new ScriptSingleton();
//         return instance;
//     }
// 
//     public Hashtable<String, Byte[]> getTags() {
//         return tags;
//     }
// 
//     public Hashtable<Integer, Byte[]> getSubheaders() {
//         return subheaders;
//     }
// }
// 
// Path: randomizer/common/utils/ByteUtils.java
// public class ByteUtils {
//     public static short toShort(byte[] encodedValues, int index) {
//         return (short) (((encodedValues[index + 1] & 0xff) << 8) + (encodedValues[index] & 0xff));
//     }
// 
//     public static int toBigEndianShort(byte[] encodedValues, int index) {
//         return (((encodedValues[index] << 8) & 0xFF00) | (encodedValues[index + 1] & 0xFF));
//     }
// 
//     public static int toInt(byte[] encodedValue, int index) {
//         int value = (encodedValue[index + 3] << (Byte.SIZE * 3));
//         value |= (encodedValue[index + 2] & 0xFF) << (Byte.SIZE * 2);
//         value |= (encodedValue[index + 1] & 0xFF) << (Byte.SIZE);
//         value |= (encodedValue[index] & 0xFF);
//         return value;
//     }
// 
//     public static byte[] toByteArray(short value) {
//         byte[] ret = new byte[2];
//         ret[0] = (byte) (value & 0xff);
//         ret[1] = (byte) ((value >> 8) & 0xff);
//         return ret;
//     }
// 
//     public static List<Byte> toByteList(byte[] arr) {
//         List<Byte> bytes = new ArrayList<>();
//         for (byte b : arr)
//             bytes.add(b);
//         return bytes;
//     }
// 
//     public static byte[] toByteArray(int value) {
//         byte[] encodedValue = new byte[Integer.SIZE / Byte.SIZE];
//         encodedValue[3] = (byte) (value >> (Byte.SIZE * 3));
//         encodedValue[2] = (byte) (value >> (Byte.SIZE * 2));
//         encodedValue[1] = (byte) (value >> Byte.SIZE);
//         encodedValue[0] = (byte) value;
//         return encodedValue;
//     }
// 
//     public static String getString(byte[] source, int index) throws UnsupportedEncodingException {
//         int end = index;
//         while (source[end] != 0) {
//             end++;
//         }
//         return new String(Arrays.copyOfRange(source, index, end), "shift-jis");
//     }
// 
//     public static String toString(byte[] input) {
//         StringBuilder builder = new StringBuilder("[");
//         for(int x = 0; x < input.length; x++) {
//             builder.append("0x").append(Long.toHexString(input[x] & 0xFF));
//             if(x != input.length - 1)
//                 builder.append(", ");
//         }
//         return builder.append("]").toString();
//     }
// }


// Path: randomizer/common/fs/model/Decompiler.java
import randomizer.common.fs.data.ScriptSingleton;
import randomizer.common.utils.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

package randomizer.common.fs.model;



public class Decompiler {

	private int ref;
	private List<String> result;
	private byte[] bytes;
	private String fileName;

	public Decompiler() {}

	public String decompile(Path path) throws Exception {
	    this.fileName = path.toFile().getName();
		List<Integer> headers = new ArrayList<>();
		result = new ArrayList<>();
		bytes = Files.readAllBytes(path);
		int pointerOffset = ByteUtils.toInt(bytes, 0x1C);