// Path: phial-overlay/src/main/java/com/mindcoders/phial/TargetScreen.java
// public class TargetScreen {
//     private final Class<? extends Activity> target;
//     private final String scope;
// 
// 
//     TargetScreen(Class<? extends Activity> target, String scope) {
//         this.target = target;
//         this.scope = scope;
//     }
// 
//     /**
//      * Creates a {@link TargetScreen} with activity as a target.
//      * @param target activity.
//      */
//     public static TargetScreen forActivity(Class<? extends Activity> target) {
//         return new TargetScreen(target, null);
//     }
// 
//     /**
//      * Creates a {@link TargetScreen} with custom scope as a target.
//      * @param scope scope name.
//      */
//     public static TargetScreen forScope(String scope) {
//         return new TargetScreen(null, scope);
//     }
// 
//     public Class<? extends Activity> getTargetActivity() {
//         return target;
//     }
// 
//     public String getScopeName() {
//         return scope;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         TargetScreen that = (TargetScreen) o;
// 
//         if (target != null ? !target.equals(that.target) : that.target != null) return false;
//         return scope != null ? scope.equals(that.scope) : that.scope == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = target != null ? target.hashCode() : 0;
//         result = 31 * result + (scope != null ? scope.hashCode() : 0);
//         return result;
//     }
// 
//     /**
//      * Returns either activity name or custom scope name.
//      * @return target name.
//      */
//     public String getName() {
//         if (target != null) {
//             return target.getSimpleName();
//         }
// 
//         return scope;
//     }
// }
// 
// Path: phial-overlay/src/main/java/com/mindcoders/phial/internal/util/CollectionUtils.java
// public final class CollectionUtils {
// 
//     private CollectionUtils() {
//         // hide
//     }
// 
// 
//     public interface Predicate<T> {
//         boolean apply(T type);
//     }
// 
//     public interface Function1<T, G> {
//         T call(G value);
//     }
// 
//     public static <L> ArrayList<L> filter(List<L> list, Predicate<L> predicate) {
//         ArrayList<L> result = new ArrayList<L>();
//         for (L element : list) {
//             if (predicate.apply(element)) {
//                 result.add(element);
//             }
//         }
//         return result;
//     }
// 
//     public static <T, G> ArrayList<T> map(List<G> input, Function1<T, G> function) {
//         ArrayList<T> result = new ArrayList<T>(input.size());
//         for (G item : input) {
//             result.add(function.call(item));
//         }
//         return result;
//     }
// 
//     public static <T, G> Set<T> map(Set<G> input, Function1<T, G> function) {
//         Set<T> result = new HashSet<T>(input.size());
//         for (G item : input) {
//             result.add(function.call(item));
//         }
//         return result;
//     }
// 
//     public static boolean isNullOrEmpty(Collection<?> input) {
//         return input == null || input.isEmpty();
//     }
// 
//     public static List<Integer> asList(int... ids) {
//         final List<Integer> result = new ArrayList<>(ids.length);
//         for (int id : ids) {
//             result.add(id);
//         }
//         return result;
//     }
// 
//     public static <T> Set<T> asSet(T... items) {
//         final HashSet<T> result = new HashSet<>(items.length);
//         result.addAll(Arrays.asList(items));
//         return Collections.unmodifiableSet(result);
//     }
// }
// 
// Path: phial-overlay/src/main/java/com/mindcoders/phial/internal/util/ObjectUtil.java
// public final class ObjectUtil {
//     private ObjectUtil() {
//         //to hide
//     }
// 
//     public static <T> boolean equals(T a, T b) {
//         return (a == b) || (a != null && a.equals(b));
//     }
// }


import android.app.Activity;
import android.support.annotation.Nullable;
import android.view.View;
import com.mindcoders.phial.TargetScreen;
import com.mindcoders.phial.internal.util.CollectionUtils;
import com.mindcoders.phial.internal.util.ObjectUtil;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
    void exitScope(String scopeName) {
        this.scopes.remove(scopeName);
    }

    void clearActivity() {
        this.activity = null;
    }

    public boolean matches(TargetScreen screen) {
        if (activity == null) {
            return false;
        }

        if (screen.getScopeName() != null) {
            final boolean sameScope = scopes.containsKey(screen.getScopeName());
            if (!sameScope) {
                return false;
            }
        }

        if (screen.getTargetActivity() != null) {
            final boolean activityMatches = ObjectUtil.equals(screen.getTargetActivity(), activity.getClass());
            if (!activityMatches) {
                return false;
            }
        }

        return true;
    }

// Path: phial-overlay/src/main/java/com/mindcoders/phial/TargetScreen.java
// public class TargetScreen {
//     private final Class<? extends Activity> target;
//     private final String scope;
// 
// 
//     TargetScreen(Class<? extends Activity> target, String scope) {
//         this.target = target;
//         this.scope = scope;
//     }
// 
//     /**
//      * Creates a {@link TargetScreen} with activity as a target.
//      * @param target activity.
//      */
//     public static TargetScreen forActivity(Class<? extends Activity> target) {
//         return new TargetScreen(target, null);
//     }
// 
//     /**
//      * Creates a {@link TargetScreen} with custom scope as a target.
//      * @param scope scope name.
//      */
//     public static TargetScreen forScope(String scope) {
//         return new TargetScreen(null, scope);
//     }
// 
//     public Class<? extends Activity> getTargetActivity() {
//         return target;
//     }
// 
//     public String getScopeName() {
//         return scope;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         TargetScreen that = (TargetScreen) o;
// 
//         if (target != null ? !target.equals(that.target) : that.target != null) return false;
//         return scope != null ? scope.equals(that.scope) : that.scope == null;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = target != null ? target.hashCode() : 0;
//         result = 31 * result + (scope != null ? scope.hashCode() : 0);
//         return result;
//     }
// 
//     /**
//      * Returns either activity name or custom scope name.
//      * @return target name.
//      */
//     public String getName() {
//         if (target != null) {
//             return target.getSimpleName();
//         }
// 
//         return scope;
//     }
// }
// 
// Path: phial-overlay/src/main/java/com/mindcoders/phial/internal/util/CollectionUtils.java
// public final class CollectionUtils {
// 
//     private CollectionUtils() {
//         // hide
//     }
// 
// 
//     public interface Predicate<T> {
//         boolean apply(T type);
//     }
// 
//     public interface Function1<T, G> {
//         T call(G value);
//     }
// 
//     public static <L> ArrayList<L> filter(List<L> list, Predicate<L> predicate) {
//         ArrayList<L> result = new ArrayList<L>();
//         for (L element : list) {
//             if (predicate.apply(element)) {
//                 result.add(element);
//             }
//         }
//         return result;
//     }
// 
//     public static <T, G> ArrayList<T> map(List<G> input, Function1<T, G> function) {
//         ArrayList<T> result = new ArrayList<T>(input.size());
//         for (G item : input) {
//             result.add(function.call(item));
//         }
//         return result;
//     }
// 
//     public static <T, G> Set<T> map(Set<G> input, Function1<T, G> function) {
//         Set<T> result = new HashSet<T>(input.size());
//         for (G item : input) {
//             result.add(function.call(item));
//         }
//         return result;
//     }
// 
//     public static boolean isNullOrEmpty(Collection<?> input) {
//         return input == null || input.isEmpty();
//     }
// 
//     public static List<Integer> asList(int... ids) {
//         final List<Integer> result = new ArrayList<>(ids.length);
//         for (int id : ids) {
//             result.add(id);
//         }
//         return result;
//     }
// 
//     public static <T> Set<T> asSet(T... items) {
//         final HashSet<T> result = new HashSet<>(items.length);
//         result.addAll(Arrays.asList(items));
//         return Collections.unmodifiableSet(result);
//     }
// }
// 
// Path: phial-overlay/src/main/java/com/mindcoders/phial/internal/util/ObjectUtil.java
// public final class ObjectUtil {
//     private ObjectUtil() {
//         //to hide
//     }
// 
//     public static <T> boolean equals(T a, T b) {
//         return (a == b) || (a != null && a.equals(b));
//     }
// }


// Path: phial-overlay/src/main/java/com/mindcoders/phial/internal/Screen.java
import android.app.Activity;
import android.support.annotation.Nullable;
import android.view.View;
import com.mindcoders.phial.TargetScreen;
import com.mindcoders.phial.internal.util.CollectionUtils;
import com.mindcoders.phial.internal.util.ObjectUtil;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

    void exitScope(String scopeName) {
        this.scopes.remove(scopeName);
    }

    void clearActivity() {
        this.activity = null;
    }

    public boolean matches(TargetScreen screen) {
        if (activity == null) {
            return false;
        }

        if (screen.getScopeName() != null) {
            final boolean sameScope = scopes.containsKey(screen.getScopeName());
            if (!sameScope) {
                return false;
            }
        }

        if (screen.getTargetActivity() != null) {
            final boolean activityMatches = ObjectUtil.equals(screen.getTargetActivity(), activity.getClass());
            if (!activityMatches) {
                return false;
            }
        }

        return true;
    }

    public boolean matchesAny(Collection<TargetScreen> screens) {