// Path: src/main/java/com/turn/camino/util/Message.java
// public abstract class Message {
// 
// 	/**
// 	 * Reformats message to specific exception
// 	 *
// 	 * @param formatString format string
// 	 * @param arguments arguments
// 	 * @return new message
// 	 */
// 	public abstract Message reformat(String formatString, Object...arguments);
// 
// 	/**
// 	 * Creates message with specific prefix
// 	 *
// 	 * On reformat, the message contain prefix in the start of text
// 	 *
// 	 * @param prefix prefix of message
// 	 * @return message instance
// 	 */
// 	public static Message prefix(final String prefix) {
// 		return new Message() {
// 			private String text = prefix;
// 			@Override
// 			public Message reformat(String formatString, Object...arguments) {
// 				return Message.full(String.format("%s: %s", prefix,
// 						String.format(formatString, arguments)));
// 			}
// 			@Override
// 			public String toString() {
// 				return text;
// 			}
// 		};
// 	}
// 
// 	/**
// 	 * Creates fully-formed message
// 	 *
// 	 * The message is immutable. Reformat does not affect the message.
// 	 *
// 	 * @param text text of message
// 	 * @return message instance
// 	 */
// 	public static Message full(final String text) {
// 		return new Message() {
// 			@Override
// 			public Message reformat(String formatString, Object...arguments) {
// 				return this;
// 			}
// 			@Override
// 			public String toString() {
// 				return text;
// 			}
// 		};
// 	}
// 
// }
// 
// Path: src/main/java/com/turn/camino/util/MessageExceptionFactory.java
// public abstract class MessageExceptionFactory<E extends Throwable> implements ExceptionFactory<E> {
// 
// 	/**
// 	 * Creates new exception using only the message
// 	 *
// 	 * @param message message of exception
// 	 * @param cause underlying cause of exception
// 	 * @return new exception
// 	 */
// 	public E newException(String message, Throwable cause) {
// 		return newException(message);
// 	}
// 
// 	/**
// 	 * Creates new exception with message of underlying cause
// 	 *
// 	 * The message of the cause throwable is used as message of the exception
// 	 *
// 	 * @param cause underlying cause of exception
// 	 * @return new exception
// 	 */
// 	public E newException(Throwable cause) {
// 		return newException(cause.getMessage());
// 	}
// }
// 
// Path: src/main/java/com/turn/camino/util/Validation.java
// public class Validation<E extends Throwable> {
// 
// 	private ExceptionFactory<E> exceptionFactory;
// 
// 	/**
// 	 * Constructor
// 	 *
// 	 * @param exceptionFactory factory to create exception
// 	 */
// 	public Validation(ExceptionFactory<E> exceptionFactory) {
// 		this.exceptionFactory = exceptionFactory;
// 	}
// 
// 	/**
// 	 * Requires object to cast to type
// 	 *
// 	 * @param object object to cast
// 	 * @param type target class to cast object to
// 	 * @param message error message
// 	 * @param <T> object type
// 	 * @return object cast into instance of T
// 	 * @throws E when object cannot be cast as T
// 	 */
// 	public <T> T requireType(Object object, Class<T> type, Message message) throws E {
// 		if (type.isAssignableFrom(object.getClass())) {
// 			return type.cast(object);
// 		}
// 		throw exceptionFactory.newException(message.reformat("Expected type %s but got %s",
// 				type, object.getClass()).toString());
// 	}
// 
// 	/**
// 	 * Request that object be cast to type
// 	 * @param object object to cast
// 	 * @param type target class to cast object to
// 	 * @param <T> object type
// 	 * @return optional containing cast object if type is assignable from object,
// 	 * 	or absent optional otherwise
// 	 */
// 	public <T> Optional<T> requestType(Object object, Class<T> type) {
// 		if (type.isAssignableFrom(object.getClass())) {
// 			return Optional.of(type.cast(object));
// 		} else {
// 			return Optional.empty();
// 		}
// 	}
// 
// 	/**
// 	 * Requires object to be not null
// 	 *
// 	 * @param object object to check
// 	 * @param message error message
// 	 * @param <T> object type
// 	 * @return object itself
// 	 * @throws E when object is null
// 	 */
// 	public <T> T requireNotNull(T object, Message message) throws E {
// 		if (object == null) {
// 			throw exceptionFactory.newException(message.reformat("Cannot be null").toString());
// 		}
// 		return object;
// 	}
// 
// 	/**
// 	 * Requires list to be between min and max size
// 	 *
// 	 * @param list list to check
// 	 * @param minSize minimum size of list
// 	 * @param maxSize maximum size of list
// 	 * @param message error message
// 	 * @return list itself
// 	 * @throws E when list is not between min and max size
// 	 */
// 	public List<?> requireListSize(List<?> list, int minSize, int maxSize, Message message)
// 			throws E {
// 		if (list.size() < minSize) {
// 			throw exceptionFactory.newException(message.reformat("Has too few elements")
// 					.toString());
// 		}
// 		if (list.size() > maxSize) {
// 			throw exceptionFactory.newException(message.reformat("Has too many elements")
// 					.toString());
// 		}
// 		return list;
// 	}
// 
// }


import com.google.common.collect.Maps;
import com.turn.camino.util.Message;
import com.turn.camino.util.MessageExceptionFactory;
import com.turn.camino.util.Validation;
import java.util.Map;
		}
	}

	ContextImpl(Env env, Context parent, Map<String, Object> properties) {
		this(env, parent);
		this.properties.putAll(properties);
	}

	@Override
	public Env getEnv() {
		return env;
	}

	@Override
	public Context createChild() {
		return new ContextImpl(env, this);
	}

	@Override
	public Context getParent() {
		return parent;
	}

	@Override
	public Context getGlobal() {
		return global;
	}

	@Override
	public void setProperty(String name, Object value) {
// Path: src/main/java/com/turn/camino/util/Message.java
// public abstract class Message {
// 
// 	/**
// 	 * Reformats message to specific exception
// 	 *
// 	 * @param formatString format string
// 	 * @param arguments arguments
// 	 * @return new message
// 	 */
// 	public abstract Message reformat(String formatString, Object...arguments);
// 
// 	/**
// 	 * Creates message with specific prefix
// 	 *
// 	 * On reformat, the message contain prefix in the start of text
// 	 *
// 	 * @param prefix prefix of message
// 	 * @return message instance
// 	 */
// 	public static Message prefix(final String prefix) {
// 		return new Message() {
// 			private String text = prefix;
// 			@Override
// 			public Message reformat(String formatString, Object...arguments) {
// 				return Message.full(String.format("%s: %s", prefix,
// 						String.format(formatString, arguments)));
// 			}
// 			@Override
// 			public String toString() {
// 				return text;
// 			}
// 		};
// 	}
// 
// 	/**
// 	 * Creates fully-formed message
// 	 *
// 	 * The message is immutable. Reformat does not affect the message.
// 	 *
// 	 * @param text text of message
// 	 * @return message instance
// 	 */
// 	public static Message full(final String text) {
// 		return new Message() {
// 			@Override
// 			public Message reformat(String formatString, Object...arguments) {
// 				return this;
// 			}
// 			@Override
// 			public String toString() {
// 				return text;
// 			}
// 		};
// 	}
// 
// }
// 
// Path: src/main/java/com/turn/camino/util/MessageExceptionFactory.java
// public abstract class MessageExceptionFactory<E extends Throwable> implements ExceptionFactory<E> {
// 
// 	/**
// 	 * Creates new exception using only the message
// 	 *
// 	 * @param message message of exception
// 	 * @param cause underlying cause of exception
// 	 * @return new exception
// 	 */
// 	public E newException(String message, Throwable cause) {
// 		return newException(message);
// 	}
// 
// 	/**
// 	 * Creates new exception with message of underlying cause
// 	 *
// 	 * The message of the cause throwable is used as message of the exception
// 	 *
// 	 * @param cause underlying cause of exception
// 	 * @return new exception
// 	 */
// 	public E newException(Throwable cause) {
// 		return newException(cause.getMessage());
// 	}
// }
// 
// Path: src/main/java/com/turn/camino/util/Validation.java
// public class Validation<E extends Throwable> {
// 
// 	private ExceptionFactory<E> exceptionFactory;
// 
// 	/**
// 	 * Constructor
// 	 *
// 	 * @param exceptionFactory factory to create exception
// 	 */
// 	public Validation(ExceptionFactory<E> exceptionFactory) {
// 		this.exceptionFactory = exceptionFactory;
// 	}
// 
// 	/**
// 	 * Requires object to cast to type
// 	 *
// 	 * @param object object to cast
// 	 * @param type target class to cast object to
// 	 * @param message error message
// 	 * @param <T> object type
// 	 * @return object cast into instance of T
// 	 * @throws E when object cannot be cast as T
// 	 */
// 	public <T> T requireType(Object object, Class<T> type, Message message) throws E {
// 		if (type.isAssignableFrom(object.getClass())) {
// 			return type.cast(object);
// 		}
// 		throw exceptionFactory.newException(message.reformat("Expected type %s but got %s",
// 				type, object.getClass()).toString());
// 	}
// 
// 	/**
// 	 * Request that object be cast to type
// 	 * @param object object to cast
// 	 * @param type target class to cast object to
// 	 * @param <T> object type
// 	 * @return optional containing cast object if type is assignable from object,
// 	 * 	or absent optional otherwise
// 	 */
// 	public <T> Optional<T> requestType(Object object, Class<T> type) {
// 		if (type.isAssignableFrom(object.getClass())) {
// 			return Optional.of(type.cast(object));
// 		} else {
// 			return Optional.empty();
// 		}
// 	}
// 
// 	/**
// 	 * Requires object to be not null
// 	 *
// 	 * @param object object to check
// 	 * @param message error message
// 	 * @param <T> object type
// 	 * @return object itself
// 	 * @throws E when object is null
// 	 */
// 	public <T> T requireNotNull(T object, Message message) throws E {
// 		if (object == null) {
// 			throw exceptionFactory.newException(message.reformat("Cannot be null").toString());
// 		}
// 		return object;
// 	}
// 
// 	/**
// 	 * Requires list to be between min and max size
// 	 *
// 	 * @param list list to check
// 	 * @param minSize minimum size of list
// 	 * @param maxSize maximum size of list
// 	 * @param message error message
// 	 * @return list itself
// 	 * @throws E when list is not between min and max size
// 	 */
// 	public List<?> requireListSize(List<?> list, int minSize, int maxSize, Message message)
// 			throws E {
// 		if (list.size() < minSize) {
// 			throw exceptionFactory.newException(message.reformat("Has too few elements")
// 					.toString());
// 		}
// 		if (list.size() > maxSize) {
// 			throw exceptionFactory.newException(message.reformat("Has too many elements")
// 					.toString());
// 		}
// 		return list;
// 	}
// 
// }


// Path: src/main/java/com/turn/camino/ContextImpl.java
import com.google.common.collect.Maps;
import com.turn.camino.util.Message;
import com.turn.camino.util.MessageExceptionFactory;
import com.turn.camino.util.Validation;
import java.util.Map;

		}
	}

	ContextImpl(Env env, Context parent, Map<String, Object> properties) {
		this(env, parent);
		this.properties.putAll(properties);
	}

	@Override
	public Env getEnv() {
		return env;
	}

	@Override
	public Context createChild() {
		return new ContextImpl(env, this);
	}

	@Override
	public Context getParent() {
		return parent;
	}

	@Override
	public Context getGlobal() {
		return global;
	}

	@Override
	public void setProperty(String name, Object value) {
		properties.put(name, value);