// Path: src/main/java/com/github/worldsender/mcanm/client/model/util/RenderPassInformation.java
// public class RenderPassInformation extends ModelStateInformation implements IRenderPassInformation {
// 	public static final Function<String, ResourceLocation> makeCachingTransform(
// 			Function<String, ResourceLocation> cacheLoader) {
// 		LoadingCache<String, ResourceLocation> cachedResourceLoc = CacheBuilder.newBuilder().maximumSize(100)
// 				.build(new CacheLoader<String, ResourceLocation>() {
// 					@Override
// 					public ResourceLocation load(String key) {
// 						return cacheLoader.apply(key);
// 					}
// 				});
// 		return cachedResourceLoc::getUnchecked;
// 	}
// 
// 	public static final Function<String, ResourceLocation> TRANSFORM_DIRECT = makeCachingTransform(
// 			ResourceLocation::new);
// 	/**
// 	 * This is the default texture rebinding, it just returns the given resource-location and as such does not change
// 	 * the bound texture.
// 	 */
// 	public static final Function<ResourceLocation, ResourceLocation> IDENTITY = Function.identity();
// 
// 	private Function<String, ResourceLocation> textureRemap;
// 
// 	public RenderPassInformation() {
// 		this.reset();
// 	}
// 
// 	public RenderPassInformation(
// 			float frame,
// 			Optional<IAnimation> animation,
// 			Optional<Predicate<String>> partPredicate,
// 			Optional<Function<String, ResourceLocation>> resourceRemap) {
// 		this.setFrame(frame).setAnimation(animation).setPartPredicate(partPredicate).setTextureTransform(resourceRemap);
// 	}
// 
// 	/**
// 	 * Resets this information to be reused.
// 	 */
// 	@Override
// 	public void reset() {
// 		super.reset();
// 		this.setTextureTransform(Optional.empty());
// 	}
// 
// 	@Override
// 	public ResourceLocation getActualResourceLocation(String in) {
// 		return this.textureRemap.apply(in);
// 	}
// 
// 	@Override
// 	public RenderPassInformation setAnimation(Optional<IAnimation> animation) {
// 		super.setAnimation(animation);
// 		return this;
// 	}
// 
// 	@Override
// 	public RenderPassInformation setAnimation(IAnimation animation) {
// 		super.setAnimation(animation);
// 		return this;
// 	}
// 
// 	/**
// 	 * @param frame
// 	 *            the frame to set
// 	 */
// 	@Override
// 	public RenderPassInformation setFrame(float frame) {
// 		super.setFrame(frame);
// 		return this;
// 	}
// 
// 	/**
// 	 * @param partPredicate
// 	 *            the partPredicate to set, Optional.empty() for RENDER_ALL
// 	 */
// 	@Override
// 	public RenderPassInformation setPartPredicate(Optional<Predicate<String>> partPredicate) {
// 		super.setPartPredicate(partPredicate);
// 		return this;
// 	}
// 
// 	@Override
// 	public RenderPassInformation setPartPredicate(Predicate<String> partPredicate) {
// 		super.setPartPredicate(partPredicate);
// 		return this;
// 	}
// 
// 	public RenderPassInformation setTextureTransform(Optional<Function<String, ResourceLocation>> textureRemap) {
// 		return setTextureTransform(textureRemap.orElse(TRANSFORM_DIRECT));
// 	}
// 
// 	public RenderPassInformation setTextureTransform(Function<String, ResourceLocation> textureRemap) {
// 		this.textureRemap = Objects.requireNonNull(textureRemap);
// 		return this;
// 	}
// }


import com.github.worldsender.mcanm.client.model.util.RenderPassInformation;
import net.minecraft.entity.EntityLiving;

package com.github.worldsender.mcanm.client.model;



public interface IEntityAnimator<T extends EntityLiving> {
	public static final IEntityAnimator<EntityLiving> STATIC_ANIMATOR = new IEntityAnimator<EntityLiving>() {
		@Override
		public IRenderPassInformation preRenderCallback(
				EntityLiving entity,

// Path: src/main/java/com/github/worldsender/mcanm/client/model/util/RenderPassInformation.java
// public class RenderPassInformation extends ModelStateInformation implements IRenderPassInformation {
// 	public static final Function<String, ResourceLocation> makeCachingTransform(
// 			Function<String, ResourceLocation> cacheLoader) {
// 		LoadingCache<String, ResourceLocation> cachedResourceLoc = CacheBuilder.newBuilder().maximumSize(100)
// 				.build(new CacheLoader<String, ResourceLocation>() {
// 					@Override
// 					public ResourceLocation load(String key) {
// 						return cacheLoader.apply(key);
// 					}
// 				});
// 		return cachedResourceLoc::getUnchecked;
// 	}
// 
// 	public static final Function<String, ResourceLocation> TRANSFORM_DIRECT = makeCachingTransform(
// 			ResourceLocation::new);
// 	/**
// 	 * This is the default texture rebinding, it just returns the given resource-location and as such does not change
// 	 * the bound texture.
// 	 */
// 	public static final Function<ResourceLocation, ResourceLocation> IDENTITY = Function.identity();
// 
// 	private Function<String, ResourceLocation> textureRemap;
// 
// 	public RenderPassInformation() {
// 		this.reset();
// 	}
// 
// 	public RenderPassInformation(
// 			float frame,
// 			Optional<IAnimation> animation,
// 			Optional<Predicate<String>> partPredicate,
// 			Optional<Function<String, ResourceLocation>> resourceRemap) {
// 		this.setFrame(frame).setAnimation(animation).setPartPredicate(partPredicate).setTextureTransform(resourceRemap);
// 	}
// 
// 	/**
// 	 * Resets this information to be reused.
// 	 */
// 	@Override
// 	public void reset() {
// 		super.reset();
// 		this.setTextureTransform(Optional.empty());
// 	}
// 
// 	@Override
// 	public ResourceLocation getActualResourceLocation(String in) {
// 		return this.textureRemap.apply(in);
// 	}
// 
// 	@Override
// 	public RenderPassInformation setAnimation(Optional<IAnimation> animation) {
// 		super.setAnimation(animation);
// 		return this;
// 	}
// 
// 	@Override
// 	public RenderPassInformation setAnimation(IAnimation animation) {
// 		super.setAnimation(animation);
// 		return this;
// 	}
// 
// 	/**
// 	 * @param frame
// 	 *            the frame to set
// 	 */
// 	@Override
// 	public RenderPassInformation setFrame(float frame) {
// 		super.setFrame(frame);
// 		return this;
// 	}
// 
// 	/**
// 	 * @param partPredicate
// 	 *            the partPredicate to set, Optional.empty() for RENDER_ALL
// 	 */
// 	@Override
// 	public RenderPassInformation setPartPredicate(Optional<Predicate<String>> partPredicate) {
// 		super.setPartPredicate(partPredicate);
// 		return this;
// 	}
// 
// 	@Override
// 	public RenderPassInformation setPartPredicate(Predicate<String> partPredicate) {
// 		super.setPartPredicate(partPredicate);
// 		return this;
// 	}
// 
// 	public RenderPassInformation setTextureTransform(Optional<Function<String, ResourceLocation>> textureRemap) {
// 		return setTextureTransform(textureRemap.orElse(TRANSFORM_DIRECT));
// 	}
// 
// 	public RenderPassInformation setTextureTransform(Function<String, ResourceLocation> textureRemap) {
// 		this.textureRemap = Objects.requireNonNull(textureRemap);
// 		return this;
// 	}
// }


// Path: src/main/java/com/github/worldsender/mcanm/client/model/IEntityAnimator.java
import com.github.worldsender.mcanm.client.model.util.RenderPassInformation;
import net.minecraft.entity.EntityLiving;

package com.github.worldsender.mcanm.client.model;



public interface IEntityAnimator<T extends EntityLiving> {
	public static final IEntityAnimator<EntityLiving> STATIC_ANIMATOR = new IEntityAnimator<EntityLiving>() {
		@Override
		public IRenderPassInformation preRenderCallback(
				EntityLiving entity,

				RenderPassInformation buffer,
