code: private static Map resolveInternals(Map map, boolean ignoreCase, int count) throws PageException {
  	Map result = new HashMap();
  	Iterator<Map.Entry> it = map.entrySet().iterator();
  	boolean isModified = false;
  	Map.Entry e;
  	String v, r;
  	while (it.hasNext()) {
  	    e = it.next();
  	    v = Caster.toString(e.getValue());
  	    r = replaceMap(v, map, ignoreCase, false); // pass false for last arg so that replaceMap() will not call this method in an infinite loop
  	    result.put(Caster.toString(e.getKey()), r);
  	    if (!v.equalsIgnoreCase(r)) isModified = true;
  	}
  
  	if (isModified && count++ < map.size()) result = resolveInternals(result, ignoreCase, count); // recursive call
  
  	return result;
      }
docs: resolves internal values within the map, so if the map has a key "{signature}" and its value is
  "Team {group}" and there's a key with the value {group} whose value is "Lucee", then {signature}
  will resolve to "Team Lucee".
  
  {signature} = "Team {group}" {group} = "Lucee"
  
  then signature will resolve to
  
  {signature} = "Team Lucee"
  
  @param map - key/value pairs for find key/replace with value
  @param ignoreCase - if true then matches will not be case sensitive
  @param count - used internally as safety valve to ensure that we don't go into infinite loop if
  two values reference each-other
  @return
  @throws PageException