// Path: src/com/iconmaster/source/element/ISpecialRule.java
// public class RuleResult {
// 	public Element ret;
// 	public int del;
// 
// 	public RuleResult(Element ret, int del) {
// 		this.ret = ret;
// 		this.del = del;
// 	}		
// }
// 
// Path: src/com/iconmaster/source/parse/Parser.java
// public class Parser {
// 	private static final HashMap<String,IElementType> aliases = new HashMap<>();
// 	
// 	public static void addAlias(IElementType type) {
// 		aliases.put(type.getAlias(),type);
// 	}
// 	
// 	static {
// 		for (IElementType rule : Rule.values()) {
// 			addAlias(rule);
// 		}
// 		for (IElementType rule : TokenRule.values()) {
// 			addAlias(rule);
// 		}
// 	}
// 	
// 	public static ArrayList<Element> parse(ArrayList<Element> a) throws SourceException {
// 		//System.out.println("Initial tree: "+a);
// 		for (Rule rule : Rule.values()) {
// 			for (int i=0;i<a.size();i++) {
// 				ISpecialRule.RuleResult m = rule.rule.match(a, i);
// 				if (m!=null) {
// 					for (int j=0;j<m.del;j++) {
// 						a.remove(i);
// 					}
// 					if (m.ret!=null) {
// 						a.add(i, m.ret);
// 						i-=1;
// 					}
// 					//System.out.print("matched rule "+rule.toString()+": ");
// 					//System.out.println(a);
// 				}
// 			}
// 		}
// 		//Make sure there is no invalid tokens left lying around
// 		check(a);
// 		return a;
// 	}
// 
// 	public static IElementType getAlias(String toMatch) {
// 		return aliases.get(toMatch);
// 	}
// 	
// 	public static void check(ArrayList<Element> a) throws SourceException {
// 		for (Element v : a) {
// 			if (v.type instanceof TokenRule) {
// 				
// 			}
// 		}
// 	}
// }
// 
// Path: src/com/iconmaster/source/tokenize/Token.java
// public class Token extends Element {
// 	public Token(Range range, IElementType type, Object value) {
// 		super(range,type);
// 		this.args[0] = value;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return "["+type+" "+args[0]+"]";
// 	}
// 	
// 	public String string() {
// 		return (String) args[0];
// 	}
// 	
// 	public ArrayList<Element> array() {
// 		return (ArrayList<Element>) args[0];
// 	}
// 	
// 	public boolean isString() {
// 		return args[0] instanceof String;
// 	}
// 	
// 	public boolean isArray() {
// 		return args[0] instanceof ArrayList;
// 	}
// }
// 
// Path: src/com/iconmaster/source/tokenize/TokenRule.java
// public enum TokenRule implements IElementType {
// 	COMMENT(null,"\\/\\/[^\n]*\n?"),
// 	SPACE(" ","[\\s]+"),
// 	RESWORD(null,"(local|function|and|or|not|for|in|as|return|break|struct|if|else|elseif|while|repeat|until|field|import|package|enum|true|false|iterator|new|extends|to|continue|type|class)\\b"),
// 	WORD("w","[\\w\\?&&[^\\d]][\\w\\?\\.]*"),
// 	NUMBER("n","[\\d\\.]+"),
// 	STRING("s","\"(\\\\.|[^\"])*\""),
// 	CHAR(null,"\'(\\\\.|[^\'])\'"),
// 	SEP(";",";+"),
// 	DIRECTIVE("r","@[\\S]*"),
// 	SYMBOL("y","([\\Q+-*/=<>~:!&|%^\\E]+|\\(|\\)|\\[|\\]|\\{|\\}|,)");
// 	
// 	public final String match;
// 	public String alias;
// 	
// 	TokenRule(String alias, String match) {
// 		this.match = "^"+match;
// 		this.alias = alias;
// 	}
// 	
// 	TokenRule(String match) {
// 		this(null,match);
// 	}
// 	
// 	TokenRule() {
// 		this(null,"[^.]");
// 	}
// 	
// 	public String format(String input) {
// 		switch (this) {
// 			case SPACE:
// 			case COMMENT:
// 				return null;
// 			case CHAR:
// 			case STRING:
// 				return StringUtils.unescape(input.substring(1, input.length()-1));
// 			case DIRECTIVE:
// 				return input.substring(1);
// 			default:
// 				return input;
// 		}
// 	}
// 	
// 	@Override
// 	public String getAlias() {
// 		return alias;
// 	}
// }
// 
// Path: src/com/iconmaster/source/util/Range.java
// public class Range {
// 	public final int low;
// 	public final int high;
// 
// 	public Range(int low, int high) {
// 		this.low = Math.min(low, high);
// 		this.high = Math.max(low, high);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return low+"~"+high;
// 	}
// 	
// 	public static Range from(Range r1, Range r2) {
// 		return new Range(r1==null?0:r1.low,r2==null?0:r2.high);
// 	}
// 	
// 	
// }


import com.iconmaster.source.element.ISpecialRule.RuleResult;
import com.iconmaster.source.parse.Parser;
import com.iconmaster.source.tokenize.Token;
import com.iconmaster.source.tokenize.TokenRule;
import com.iconmaster.source.util.Range;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
package com.iconmaster.source.element;


/**
 *
 * @author iconmaster
 */
public enum Rule implements IElementType {
	BLOCK_COMMENT(null,(a,i)->{
// Path: src/com/iconmaster/source/element/ISpecialRule.java
// public class RuleResult {
// 	public Element ret;
// 	public int del;
// 
// 	public RuleResult(Element ret, int del) {
// 		this.ret = ret;
// 		this.del = del;
// 	}		
// }
// 
// Path: src/com/iconmaster/source/parse/Parser.java
// public class Parser {
// 	private static final HashMap<String,IElementType> aliases = new HashMap<>();
// 	
// 	public static void addAlias(IElementType type) {
// 		aliases.put(type.getAlias(),type);
// 	}
// 	
// 	static {
// 		for (IElementType rule : Rule.values()) {
// 			addAlias(rule);
// 		}
// 		for (IElementType rule : TokenRule.values()) {
// 			addAlias(rule);
// 		}
// 	}
// 	
// 	public static ArrayList<Element> parse(ArrayList<Element> a) throws SourceException {
// 		//System.out.println("Initial tree: "+a);
// 		for (Rule rule : Rule.values()) {
// 			for (int i=0;i<a.size();i++) {
// 				ISpecialRule.RuleResult m = rule.rule.match(a, i);
// 				if (m!=null) {
// 					for (int j=0;j<m.del;j++) {
// 						a.remove(i);
// 					}
// 					if (m.ret!=null) {
// 						a.add(i, m.ret);
// 						i-=1;
// 					}
// 					//System.out.print("matched rule "+rule.toString()+": ");
// 					//System.out.println(a);
// 				}
// 			}
// 		}
// 		//Make sure there is no invalid tokens left lying around
// 		check(a);
// 		return a;
// 	}
// 
// 	public static IElementType getAlias(String toMatch) {
// 		return aliases.get(toMatch);
// 	}
// 	
// 	public static void check(ArrayList<Element> a) throws SourceException {
// 		for (Element v : a) {
// 			if (v.type instanceof TokenRule) {
// 				
// 			}
// 		}
// 	}
// }
// 
// Path: src/com/iconmaster/source/tokenize/Token.java
// public class Token extends Element {
// 	public Token(Range range, IElementType type, Object value) {
// 		super(range,type);
// 		this.args[0] = value;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return "["+type+" "+args[0]+"]";
// 	}
// 	
// 	public String string() {
// 		return (String) args[0];
// 	}
// 	
// 	public ArrayList<Element> array() {
// 		return (ArrayList<Element>) args[0];
// 	}
// 	
// 	public boolean isString() {
// 		return args[0] instanceof String;
// 	}
// 	
// 	public boolean isArray() {
// 		return args[0] instanceof ArrayList;
// 	}
// }
// 
// Path: src/com/iconmaster/source/tokenize/TokenRule.java
// public enum TokenRule implements IElementType {
// 	COMMENT(null,"\\/\\/[^\n]*\n?"),
// 	SPACE(" ","[\\s]+"),
// 	RESWORD(null,"(local|function|and|or|not|for|in|as|return|break|struct|if|else|elseif|while|repeat|until|field|import|package|enum|true|false|iterator|new|extends|to|continue|type|class)\\b"),
// 	WORD("w","[\\w\\?&&[^\\d]][\\w\\?\\.]*"),
// 	NUMBER("n","[\\d\\.]+"),
// 	STRING("s","\"(\\\\.|[^\"])*\""),
// 	CHAR(null,"\'(\\\\.|[^\'])\'"),
// 	SEP(";",";+"),
// 	DIRECTIVE("r","@[\\S]*"),
// 	SYMBOL("y","([\\Q+-*/=<>~:!&|%^\\E]+|\\(|\\)|\\[|\\]|\\{|\\}|,)");
// 	
// 	public final String match;
// 	public String alias;
// 	
// 	TokenRule(String alias, String match) {
// 		this.match = "^"+match;
// 		this.alias = alias;
// 	}
// 	
// 	TokenRule(String match) {
// 		this(null,match);
// 	}
// 	
// 	TokenRule() {
// 		this(null,"[^.]");
// 	}
// 	
// 	public String format(String input) {
// 		switch (this) {
// 			case SPACE:
// 			case COMMENT:
// 				return null;
// 			case CHAR:
// 			case STRING:
// 				return StringUtils.unescape(input.substring(1, input.length()-1));
// 			case DIRECTIVE:
// 				return input.substring(1);
// 			default:
// 				return input;
// 		}
// 	}
// 	
// 	@Override
// 	public String getAlias() {
// 		return alias;
// 	}
// }
// 
// Path: src/com/iconmaster/source/util/Range.java
// public class Range {
// 	public final int low;
// 	public final int high;
// 
// 	public Range(int low, int high) {
// 		this.low = Math.min(low, high);
// 		this.high = Math.max(low, high);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return low+"~"+high;
// 	}
// 	
// 	public static Range from(Range r1, Range r2) {
// 		return new Range(r1==null?0:r1.low,r2==null?0:r2.high);
// 	}
// 	
// 	
// }


// Path: src/com/iconmaster/source/element/Rule.java
import com.iconmaster.source.element.ISpecialRule.RuleResult;
import com.iconmaster.source.parse.Parser;
import com.iconmaster.source.tokenize.Token;
import com.iconmaster.source.tokenize.TokenRule;
import com.iconmaster.source.util.Range;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

package com.iconmaster.source.element;


/**
 *
 * @author iconmaster
 */
public enum Rule implements IElementType {
	BLOCK_COMMENT(null,(a,i)->{
		if (a.get(i).type==TokenRule.SYMBOL && "/*".equals(a.get(i).args[0])) {