// Path: enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
// public interface EnforcerRule
// {
// 
//     /**
//      * This is the interface into the rule. This method should throw an exception
//      * containing a reason message if the rule fails the check. The plugin will
//      * then decide based on the fail flag if it should stop or just log the
//      * message as a warning.
//      *
//      * @param helper The helper provides access to the log, MavenSession and has
//      * helpers to get common components. It is also able to lookup components
//      * by class name.
//      *
//      * @throws EnforcerRuleException the enforcer rule exception
//      */
//     void execute( @Nonnull EnforcerRuleHelper helper )
//         throws EnforcerRuleException;
// 
//     /**
//      * This method tells the enforcer if the rule results may be cached. If the result is true,
//      * the results will be remembered for future executions in the same build (ie children). Subsequent
//      * iterations of the rule will be queried to see if they are also cacheable. This will allow the rule to be
//      * uncached further down the tree if needed.
//      *
//      * @return <code>true</code> if rule is cacheable
//      */
//     boolean isCacheable();
// 
//     /**
//      * If the rule is cacheable and the same id is found in the cache, the stored results are passed to this method to
//      * allow double checking of the results. Most of the time this can be done by generating unique ids, but sometimes
//      * the results of objects returned by the helper need to be queried. You may for example, store certain objects in
//      * your rule and then query them later.
//      *
//      * @param cachedRule the last cached instance of the rule. This is to be used by the rule to
//      * potentially determine if the results are still valid (ie if the configuration has been overridden)
//      *
//      * @return <code>true</code> if the stored results are valid for the same id.
//      */
//     boolean isResultValid( @Nonnull EnforcerRule cachedRule );
// 
//     /**
//      * If the rule is to be cached, this id is used as part of the key. This can allow rules to take parameters
//      * that allow multiple results of the same rule to be cached.
//      *
//      * @return id to be used by the enforcer to determine uniqueness of cache results. The ids only need to be unique
//      * within a given rule implementation as the full key will be [classname]-[id]
//      */
//     @Nullable
//     String getCacheId();
// 
// }
// 
// Path: enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java
// public interface EnforcerRuleHelper
//     extends ExpressionEvaluator
// {
// 
//     /**
//      * Gets the log.
//      *
//      * @return the log
//      */
//     @Nonnull
//     Log getLog ();
// 
//     /**
//      * Gets the component.
//      *
//      * @param clazz the clazz
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     @Nonnull
//     <T> T getComponent ( Class<T> clazz )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component.
//      *
//      * @param componentKey the component key
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     @Nonnull
//     Object getComponent ( String componentKey )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component.
//      *
//      * @param role the role
//      * @param roleHint the role hint
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     Object getComponent ( String role, String roleHint )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component.
//      *
//      * @param clazz the clazz
//      * @param roleHint the role hint
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     <T> T getComponent ( Class<T> clazz, String roleHint )
//         throws ComponentLookupException;
//     
//     /**
//      * Gets the component map.
//      *
//      * @param role the role
//      *
//      * @return the component map
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     Map<String, ?> getComponentMap ( String role )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component list.
//      *
//      * @param role the role
//      *
//      * @return the component list
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     List<?> getComponentList ( String role )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the container.
//      *
//      * @return the container
//      */
//     PlexusContainer getContainer();
// }


import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.enforcer.rule.api.EnforcerRule;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
    }

    /**
     * Calculates a hash code for the specified array as <code>Arrays.hashCode()</code> would do. Unfortunately, the
     * mentioned method is only available for Java 1.5 and later.
     *
     * @param items The array for which to compute the hash code, may be <code>null</code>.
     * @return The hash code for the array.
     */
    private static int hashCode( Object[] items )
    {
        int hash = 0;
        if ( items != null )
        {
            hash = 1;
            for ( Object item : items )
            {
                hash = 31 * hash + ( item == null ? 0 : item.hashCode() );
            }
        }
        return hash;
    }

    @Override
    public boolean isCacheable()
    {
        return true;
    }

    @Override
// Path: enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
// public interface EnforcerRule
// {
// 
//     /**
//      * This is the interface into the rule. This method should throw an exception
//      * containing a reason message if the rule fails the check. The plugin will
//      * then decide based on the fail flag if it should stop or just log the
//      * message as a warning.
//      *
//      * @param helper The helper provides access to the log, MavenSession and has
//      * helpers to get common components. It is also able to lookup components
//      * by class name.
//      *
//      * @throws EnforcerRuleException the enforcer rule exception
//      */
//     void execute( @Nonnull EnforcerRuleHelper helper )
//         throws EnforcerRuleException;
// 
//     /**
//      * This method tells the enforcer if the rule results may be cached. If the result is true,
//      * the results will be remembered for future executions in the same build (ie children). Subsequent
//      * iterations of the rule will be queried to see if they are also cacheable. This will allow the rule to be
//      * uncached further down the tree if needed.
//      *
//      * @return <code>true</code> if rule is cacheable
//      */
//     boolean isCacheable();
// 
//     /**
//      * If the rule is cacheable and the same id is found in the cache, the stored results are passed to this method to
//      * allow double checking of the results. Most of the time this can be done by generating unique ids, but sometimes
//      * the results of objects returned by the helper need to be queried. You may for example, store certain objects in
//      * your rule and then query them later.
//      *
//      * @param cachedRule the last cached instance of the rule. This is to be used by the rule to
//      * potentially determine if the results are still valid (ie if the configuration has been overridden)
//      *
//      * @return <code>true</code> if the stored results are valid for the same id.
//      */
//     boolean isResultValid( @Nonnull EnforcerRule cachedRule );
// 
//     /**
//      * If the rule is to be cached, this id is used as part of the key. This can allow rules to take parameters
//      * that allow multiple results of the same rule to be cached.
//      *
//      * @return id to be used by the enforcer to determine uniqueness of cache results. The ids only need to be unique
//      * within a given rule implementation as the full key will be [classname]-[id]
//      */
//     @Nullable
//     String getCacheId();
// 
// }
// 
// Path: enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java
// public interface EnforcerRuleHelper
//     extends ExpressionEvaluator
// {
// 
//     /**
//      * Gets the log.
//      *
//      * @return the log
//      */
//     @Nonnull
//     Log getLog ();
// 
//     /**
//      * Gets the component.
//      *
//      * @param clazz the clazz
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     @Nonnull
//     <T> T getComponent ( Class<T> clazz )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component.
//      *
//      * @param componentKey the component key
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     @Nonnull
//     Object getComponent ( String componentKey )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component.
//      *
//      * @param role the role
//      * @param roleHint the role hint
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     Object getComponent ( String role, String roleHint )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component.
//      *
//      * @param clazz the clazz
//      * @param roleHint the role hint
//      *
//      * @return the component
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     <T> T getComponent ( Class<T> clazz, String roleHint )
//         throws ComponentLookupException;
//     
//     /**
//      * Gets the component map.
//      *
//      * @param role the role
//      *
//      * @return the component map
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     Map<String, ?> getComponentMap ( String role )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the component list.
//      *
//      * @param role the role
//      *
//      * @return the component list
//      *
//      * @throws ComponentLookupException the component lookup exception
//      */
//     List<?> getComponentList ( String role )
//         throws ComponentLookupException;
// 
//     /**
//      * Gets the container.
//      *
//      * @return the container
//      */
//     PlexusContainer getContainer();
// }


// Path: enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.enforcer.rule.api.EnforcerRule;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;

    }

    /**
     * Calculates a hash code for the specified array as <code>Arrays.hashCode()</code> would do. Unfortunately, the
     * mentioned method is only available for Java 1.5 and later.
     *
     * @param items The array for which to compute the hash code, may be <code>null</code>.
     * @return The hash code for the array.
     */
    private static int hashCode( Object[] items )
    {
        int hash = 0;
        if ( items != null )
        {
            hash = 1;
            for ( Object item : items )
            {
                hash = 31 * hash + ( item == null ? 0 : item.hashCode() );
            }
        }
        return hash;
    }

    @Override
    public boolean isCacheable()
    {
        return true;
    }

    @Override
    public boolean isResultValid( EnforcerRule cachedRule )