// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// static class QuantifiableOperator extends RegexOperator {
// 
// 	public enum Quantifier {
// 		GREEDY, POSSESIVE, RELUCTANT
// 	}
// 
// 	private Quantifier quantifier;
// 	public Quantifier getOperatorQuantifier() {
// 		return quantifier;
// 	}
// 
// 	public QuantifiableOperator(String operatorSequence, OperatorType operatorType, Quantifier quantifier) {
// 		super(operatorSequence, operatorType);
// 			
// 		this.quantifier = quantifier;
// 	}
// 		
// 	public QuantifiableOperator(String operatorSequence, OperatorType operatorType) {
// 		super(operatorSequence, operatorType);
// 			
// 		this.quantifier = Quantifier.GREEDY;
// 	}
// 		
// 	@Override
// 	public boolean getIsQuantifiable() {
// 		return true;
// 	}
// 
// 	public void setOperatorQuantifier(Quantifier quantifier) {
// 		this.quantifier = quantifier;
// 	}
// 		
// 	@Override
// 	public String toString() {
// 		String q = "";
// 		switch (quantifier) {
// 		case GREEDY:
// 			q = "G";
// 			break;
// 		case POSSESIVE:
// 			q = "P";
// 			break;
// 		case RELUCTANT:
// 			q = "R";
// 			break;
// 		}
// 		return q + "QO( " + operatorSequence + " )";
// 	}
// 
// }
// 
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// static class RegexOperator implements RegexToken {
// 
// 	protected final String operatorSequence;
// 
// 	public String getOperator() {
// 		return operatorSequence;
// 	}
// 
// 	public RegexOperator(String operatorSequence, OperatorType operatorType) {
// 		this.operatorSequence = operatorSequence;
// 		this.operatorType = operatorType;
// 	}
// 
// 	public boolean getIsQuantifiable() {
// 		return false;
// 	}
// 
// 	public enum OperatorType {
// 		PLUS, STAR, QM, COUNT, OR
// 	}
// 
// 	private final OperatorType operatorType;
// 	public OperatorType getOperatorType() {
// 		return operatorType;
// 	}
// 		
// 	@Override
// 	public TokenType getTokenType() {
// 		return TokenType.REGEX_OPERATOR;
// 	}
// 		
// 	@Override
// 	public String toString() {
// 		return "O( " + operatorSequence + " )";
// 	}
// 
// 	@Override
// 	public String getRepresentation() {
// 		return operatorSequence;
// 	}
// 		
// 	@Override
// 	public boolean equals(Object o) {
// 		if (o == null) {
// 			return false;
// 		}
// 			
// 		if (o == this) {
// 			return true;
// 		}
// 			
// 		if (!(o instanceof RegexOperator)) {
// 			return false;
// 		}
// 			
// 		RegexOperator ro = (RegexOperator) o;
// 		return ro.operatorSequence.equals(operatorSequence);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return operatorSequence.hashCode();
// 	}
// }
// 
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// static interface RegexToken {
// 
// 	public enum TokenType {
// 		REGEX_FACTOR, REGEX_OPERATOR
// 	}
// 
// 	public TokenType getTokenType();
// 		
// 	public String getRepresentation();
// 
// }
// 
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// public enum TokenType {
// 	REGEX_FACTOR, REGEX_OPERATOR
// }


import java.util.List;
import preprocessor.ParsingPreprocessor.QuantifiableOperator;
import preprocessor.ParsingPreprocessor.RegexOperator;
import preprocessor.ParsingPreprocessor.RegexToken;
import preprocessor.ParsingPreprocessor.RegexToken.TokenType;
package preprocessor;



public class DequantifierRule implements PreprocessorRule {

	@Override
	public String process(List<RegexToken> tokenStream) {
		StringBuilder regexBuilder = new StringBuilder();
		RegexToken tokens[] = new RegexToken[tokenStream.size()];
		tokens = tokenStream.toArray(tokens);
		int numTokens = tokens.length;
		int i = 0;
		while (i < numTokens) {
			
			if (tokens[i].getTokenType() == TokenType.REGEX_OPERATOR) {
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// static class QuantifiableOperator extends RegexOperator {
// 
// 	public enum Quantifier {
// 		GREEDY, POSSESIVE, RELUCTANT
// 	}
// 
// 	private Quantifier quantifier;
// 	public Quantifier getOperatorQuantifier() {
// 		return quantifier;
// 	}
// 
// 	public QuantifiableOperator(String operatorSequence, OperatorType operatorType, Quantifier quantifier) {
// 		super(operatorSequence, operatorType);
// 			
// 		this.quantifier = quantifier;
// 	}
// 		
// 	public QuantifiableOperator(String operatorSequence, OperatorType operatorType) {
// 		super(operatorSequence, operatorType);
// 			
// 		this.quantifier = Quantifier.GREEDY;
// 	}
// 		
// 	@Override
// 	public boolean getIsQuantifiable() {
// 		return true;
// 	}
// 
// 	public void setOperatorQuantifier(Quantifier quantifier) {
// 		this.quantifier = quantifier;
// 	}
// 		
// 	@Override
// 	public String toString() {
// 		String q = "";
// 		switch (quantifier) {
// 		case GREEDY:
// 			q = "G";
// 			break;
// 		case POSSESIVE:
// 			q = "P";
// 			break;
// 		case RELUCTANT:
// 			q = "R";
// 			break;
// 		}
// 		return q + "QO( " + operatorSequence + " )";
// 	}
// 
// }
// 
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// static class RegexOperator implements RegexToken {
// 
// 	protected final String operatorSequence;
// 
// 	public String getOperator() {
// 		return operatorSequence;
// 	}
// 
// 	public RegexOperator(String operatorSequence, OperatorType operatorType) {
// 		this.operatorSequence = operatorSequence;
// 		this.operatorType = operatorType;
// 	}
// 
// 	public boolean getIsQuantifiable() {
// 		return false;
// 	}
// 
// 	public enum OperatorType {
// 		PLUS, STAR, QM, COUNT, OR
// 	}
// 
// 	private final OperatorType operatorType;
// 	public OperatorType getOperatorType() {
// 		return operatorType;
// 	}
// 		
// 	@Override
// 	public TokenType getTokenType() {
// 		return TokenType.REGEX_OPERATOR;
// 	}
// 		
// 	@Override
// 	public String toString() {
// 		return "O( " + operatorSequence + " )";
// 	}
// 
// 	@Override
// 	public String getRepresentation() {
// 		return operatorSequence;
// 	}
// 		
// 	@Override
// 	public boolean equals(Object o) {
// 		if (o == null) {
// 			return false;
// 		}
// 			
// 		if (o == this) {
// 			return true;
// 		}
// 			
// 		if (!(o instanceof RegexOperator)) {
// 			return false;
// 		}
// 			
// 		RegexOperator ro = (RegexOperator) o;
// 		return ro.operatorSequence.equals(operatorSequence);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return operatorSequence.hashCode();
// 	}
// }
// 
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// static interface RegexToken {
// 
// 	public enum TokenType {
// 		REGEX_FACTOR, REGEX_OPERATOR
// 	}
// 
// 	public TokenType getTokenType();
// 		
// 	public String getRepresentation();
// 
// }
// 
// Path: src/main/java/preprocessor/ParsingPreprocessor.java
// public enum TokenType {
// 	REGEX_FACTOR, REGEX_OPERATOR
// }


// Path: src/main/java/preprocessor/DequantifierRule.java
import java.util.List;
import preprocessor.ParsingPreprocessor.QuantifiableOperator;
import preprocessor.ParsingPreprocessor.RegexOperator;
import preprocessor.ParsingPreprocessor.RegexToken;
import preprocessor.ParsingPreprocessor.RegexToken.TokenType;

package preprocessor;



public class DequantifierRule implements PreprocessorRule {

	@Override
	public String process(List<RegexToken> tokenStream) {
		StringBuilder regexBuilder = new StringBuilder();
		RegexToken tokens[] = new RegexToken[tokenStream.size()];
		tokens = tokenStream.toArray(tokens);
		int numTokens = tokens.length;
		int i = 0;
		while (i < numTokens) {
			
			if (tokens[i].getTokenType() == TokenType.REGEX_OPERATOR) {
				RegexOperator operatorToken = (RegexOperator) tokens[i];