// Path: src/main/java/com/cedarsoftware/util/StringUtilities.java
// public static int hashCodeIgnoreCase(String s)
// {
//     if (s == null)
//     {
//         return 0;
//     }
//     final int len = s.length();
//     int hash = 0;
//     for (int i = 0; i < len; i++)
//     {
//         hash = 31 * hash + Character.toLowerCase((int)s.charAt(i));
//     }
//     return hash;
// }


import java.lang.reflect.Constructor;
import java.util.*;
import static com.cedarsoftware.util.StringUtilities.hashCodeIgnoreCase;

        public V setValue(V value)
        {
            V save = this.getValue();
            super.setValue(value);
            CompactMap.this.put(getKey(), value);    // "Transmit" (write-thru) to underlying Map.
            return save;
        }

        public boolean equals(Object o)
        {
            if (!(o instanceof Map.Entry)) { return false; }
            if (o == this) { return true; }

            Map.Entry<?,?> e = (Map.Entry<?,?>)o;
            return compareKeys(getKey(), e.getKey()) && Objects.equals(getValue(), e.getValue());
        }

        public int hashCode()
        {
            return computeKeyHashCode(getKey()) ^ computeValueHashCode(getValue());
        }
    }

    protected int computeKeyHashCode(Object key)
    {
        if (key instanceof String)
        {
            if (isCaseInsensitive())
            {
// Path: src/main/java/com/cedarsoftware/util/StringUtilities.java
// public static int hashCodeIgnoreCase(String s)
// {
//     if (s == null)
//     {
//         return 0;
//     }
//     final int len = s.length();
//     int hash = 0;
//     for (int i = 0; i < len; i++)
//     {
//         hash = 31 * hash + Character.toLowerCase((int)s.charAt(i));
//     }
//     return hash;
// }


// Path: src/main/java/com/cedarsoftware/util/CompactMap.java
import java.lang.reflect.Constructor;
import java.util.*;
import static com.cedarsoftware.util.StringUtilities.hashCodeIgnoreCase;


        public V setValue(V value)
        {
            V save = this.getValue();
            super.setValue(value);
            CompactMap.this.put(getKey(), value);    // "Transmit" (write-thru) to underlying Map.
            return save;
        }

        public boolean equals(Object o)
        {
            if (!(o instanceof Map.Entry)) { return false; }
            if (o == this) { return true; }

            Map.Entry<?,?> e = (Map.Entry<?,?>)o;
            return compareKeys(getKey(), e.getKey()) && Objects.equals(getValue(), e.getValue());
        }

        public int hashCode()
        {
            return computeKeyHashCode(getKey()) ^ computeValueHashCode(getValue());
        }
    }

    protected int computeKeyHashCode(Object key)
    {
        if (key instanceof String)
        {
            if (isCaseInsensitive())
            {
                return hashCodeIgnoreCase((String)key);