// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/Halt.java
// public class Halt implements NodeWithValue {
// 	@Nonnull
// 	public static final Halt INSTANCE = new Halt();
// 
// 
// 	private Halt() {
// 	}
// 
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/LiteralFunction.java
// public class LiteralFunction implements Literal {
// 	@Nonnull
// 	public final Maybe<Variable> name;
// 	@Nonnull
// 	public final Maybe<Variable> arguments;
// 	@Nonnull
// 	public final ImmutableList<Variable> parameters;
// 	@Nonnull
// 	public final ImmutableList<Variable> locals;
// 
// 
// 	@Nonnull
// 	public final ImmutableList<Variable> captured;
// 	@Nonnull
// 	public final Block body;
// 	@Nonnull
// 	public final boolean isStrict;
// 
// 	public LiteralFunction(
// 		@Nonnull Maybe<Variable> name, @Nonnull Maybe<Variable> arguments, @Nonnull ImmutableList<Variable> parameters, @Nonnull ImmutableList<Variable> locals,
// 		@Nonnull ImmutableList<Variable> captured, @Nonnull Block body, boolean isStrict
// 	) {
// 		this.name = name;
// 		this.arguments = arguments;
// 		this.parameters = parameters;
// 		this.locals = locals;
// 		this.captured = captured;
// 		this.body = body;
// 		this.isStrict = isStrict;
// 	}
// 
// 	@Override
// 	public boolean equalsIgnoringChildren(@Nonnull Node node) {
// 		return node instanceof LiteralFunction &&
// 			this.name.equals(((LiteralFunction) node).name) &&
// 			this.arguments.equals(((LiteralFunction) node).arguments) &&
// 			this.parameters.equals(((LiteralFunction) node).parameters) &&
// 			this.locals.equals(((LiteralFunction) node).locals) &&
// 			this.captured.equals(((LiteralFunction) node).captured) &&
// 			this.isStrict == ((LiteralFunction) node).isStrict;
// 	}
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/Node.java
// public interface Node {
// 
// 	default boolean equalsIgnoringChildren(@Nonnull Node node) {
// 		return node.getClass() == this.getClass();
// 	}
// 
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/NodeWithValue.java
// public interface NodeWithValue extends Node {
// }


import com.shapesecurity.functional.F;
import com.shapesecurity.functional.Pair;
import com.shapesecurity.functional.data.ImmutableList;
import com.shapesecurity.functional.data.Maybe;
import com.shapesecurity.shift.es2017.ast.Directive;
import com.shapesecurity.shift.es2017.ast.FunctionBody;
import com.shapesecurity.shift.es2017.ast.Script;
import com.shapesecurity.shift.es2017.scope.Scope;
import com.shapesecurity.shift.es2017.scope.Variable;
import com.shapesecurity.shift.es2017.semantics.asg.Halt;
import com.shapesecurity.shift.es2017.semantics.asg.LiteralFunction;
import com.shapesecurity.shift.es2017.semantics.asg.Node;
import com.shapesecurity.shift.es2017.semantics.asg.NodeWithValue;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nonnull;
import java.util.WeakHashMap;
import java.util.function.Supplier;
package com.shapesecurity.shift.es2017.semantics;



public class ExplicatorWithLocation {
	private static class Implementation extends Explicator {
		@NotNull
		final WeakHashMap<LiteralFunction, FunctionBody> locations = new WeakHashMap<>();

		Implementation(@Nonnull Script script) {
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/Halt.java
// public class Halt implements NodeWithValue {
// 	@Nonnull
// 	public static final Halt INSTANCE = new Halt();
// 
// 
// 	private Halt() {
// 	}
// 
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/LiteralFunction.java
// public class LiteralFunction implements Literal {
// 	@Nonnull
// 	public final Maybe<Variable> name;
// 	@Nonnull
// 	public final Maybe<Variable> arguments;
// 	@Nonnull
// 	public final ImmutableList<Variable> parameters;
// 	@Nonnull
// 	public final ImmutableList<Variable> locals;
// 
// 
// 	@Nonnull
// 	public final ImmutableList<Variable> captured;
// 	@Nonnull
// 	public final Block body;
// 	@Nonnull
// 	public final boolean isStrict;
// 
// 	public LiteralFunction(
// 		@Nonnull Maybe<Variable> name, @Nonnull Maybe<Variable> arguments, @Nonnull ImmutableList<Variable> parameters, @Nonnull ImmutableList<Variable> locals,
// 		@Nonnull ImmutableList<Variable> captured, @Nonnull Block body, boolean isStrict
// 	) {
// 		this.name = name;
// 		this.arguments = arguments;
// 		this.parameters = parameters;
// 		this.locals = locals;
// 		this.captured = captured;
// 		this.body = body;
// 		this.isStrict = isStrict;
// 	}
// 
// 	@Override
// 	public boolean equalsIgnoringChildren(@Nonnull Node node) {
// 		return node instanceof LiteralFunction &&
// 			this.name.equals(((LiteralFunction) node).name) &&
// 			this.arguments.equals(((LiteralFunction) node).arguments) &&
// 			this.parameters.equals(((LiteralFunction) node).parameters) &&
// 			this.locals.equals(((LiteralFunction) node).locals) &&
// 			this.captured.equals(((LiteralFunction) node).captured) &&
// 			this.isStrict == ((LiteralFunction) node).isStrict;
// 	}
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/Node.java
// public interface Node {
// 
// 	default boolean equalsIgnoringChildren(@Nonnull Node node) {
// 		return node.getClass() == this.getClass();
// 	}
// 
// }
// 
// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/asg/NodeWithValue.java
// public interface NodeWithValue extends Node {
// }


// Path: src/main/java/com/shapesecurity/shift/es2017/semantics/ExplicatorWithLocation.java
import com.shapesecurity.functional.F;
import com.shapesecurity.functional.Pair;
import com.shapesecurity.functional.data.ImmutableList;
import com.shapesecurity.functional.data.Maybe;
import com.shapesecurity.shift.es2017.ast.Directive;
import com.shapesecurity.shift.es2017.ast.FunctionBody;
import com.shapesecurity.shift.es2017.ast.Script;
import com.shapesecurity.shift.es2017.scope.Scope;
import com.shapesecurity.shift.es2017.scope.Variable;
import com.shapesecurity.shift.es2017.semantics.asg.Halt;
import com.shapesecurity.shift.es2017.semantics.asg.LiteralFunction;
import com.shapesecurity.shift.es2017.semantics.asg.Node;
import com.shapesecurity.shift.es2017.semantics.asg.NodeWithValue;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nonnull;
import java.util.WeakHashMap;
import java.util.function.Supplier;

package com.shapesecurity.shift.es2017.semantics;



public class ExplicatorWithLocation {
	private static class Implementation extends Explicator {
		@NotNull
		final WeakHashMap<LiteralFunction, FunctionBody> locations = new WeakHashMap<>();

		Implementation(@Nonnull Script script) {
			super(script, list -> false, () -> Halt.INSTANCE);