import java.util.Map;
import java.util.SortedMap;
import lombok.Singular;
@lombok.Builder class BuilderSingularMaps<K, V> {
  public static @java.lang.SuppressWarnings("all") class BuilderSingularMapsBuilder<K, V> {
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<K> women$key;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<V> women$value;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<K> men$key;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<Number> men$value;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<java.lang.Object> rawMap$key;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<java.lang.Object> rawMap$value;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<String> stringMap$key;
    private @java.lang.SuppressWarnings("all") java.util.ArrayList<V> stringMap$value;
    @java.lang.SuppressWarnings("all") BuilderSingularMapsBuilder() {
      super();
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> woman(final K womanKey, final V womanValue) {
      if ((this.women$key == null))
          {
            this.women$key = new java.util.ArrayList<K>();
            this.women$value = new java.util.ArrayList<V>();
          }
      this.women$key.add(womanKey);
      this.women$value.add(womanValue);
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> women(final java.util.Map<? extends K, ? extends V> women) {
      if ((women == null))
          {
            throw new java.lang.NullPointerException("women cannot be null");
          }
      if ((this.women$key == null))
          {
            this.women$key = new java.util.ArrayList<K>();
            this.women$value = new java.util.ArrayList<V>();
          }
      for (java.util.Map.Entry<? extends K, ? extends V> $lombokEntry : women.entrySet()) 
        {
          this.women$key.add($lombokEntry.getKey());
          this.women$value.add($lombokEntry.getValue());
        }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearWomen() {
      if ((this.women$key != null))
          {
            this.women$key.clear();
            this.women$value.clear();
          }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> man(final K manKey, final Number manValue) {
      if ((this.men$key == null))
          {
            this.men$key = new java.util.ArrayList<K>();
            this.men$value = new java.util.ArrayList<Number>();
          }
      this.men$key.add(manKey);
      this.men$value.add(manValue);
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> men(final java.util.Map<? extends K, ? extends Number> men) {
      if ((men == null))
          {
            throw new java.lang.NullPointerException("men cannot be null");
          }
      if ((this.men$key == null))
          {
            this.men$key = new java.util.ArrayList<K>();
            this.men$value = new java.util.ArrayList<Number>();
          }
      for (java.util.Map.Entry<? extends K, ? extends Number> $lombokEntry : men.entrySet()) 
        {
          this.men$key.add($lombokEntry.getKey());
          this.men$value.add($lombokEntry.getValue());
        }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearMen() {
      if ((this.men$key != null))
          {
            this.men$key.clear();
            this.men$value.clear();
          }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> rawMap(final java.lang.Object rawMapKey, final java.lang.Object rawMapValue) {
      if ((this.rawMap$key == null))
          {
            this.rawMap$key = new java.util.ArrayList<java.lang.Object>();
            this.rawMap$value = new java.util.ArrayList<java.lang.Object>();
          }
      this.rawMap$key.add(rawMapKey);
      this.rawMap$value.add(rawMapValue);
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> rawMap(final java.util.Map<?, ?> rawMap) {
      if ((rawMap == null))
          {
            throw new java.lang.NullPointerException("rawMap cannot be null");
          }
      if ((this.rawMap$key == null))
          {
            this.rawMap$key = new java.util.ArrayList<java.lang.Object>();
            this.rawMap$value = new java.util.ArrayList<java.lang.Object>();
          }
      for (java.util.Map.Entry<?, ?> $lombokEntry : rawMap.entrySet()) 
        {
          this.rawMap$key.add($lombokEntry.getKey());
          this.rawMap$value.add($lombokEntry.getValue());
        }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearRawMap() {
      if ((this.rawMap$key != null))
          {
            this.rawMap$key.clear();
            this.rawMap$value.clear();
          }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> stringMap(final String stringMapKey, final V stringMapValue) {
      if ((this.stringMap$key == null))
          {
            this.stringMap$key = new java.util.ArrayList<String>();
            this.stringMap$value = new java.util.ArrayList<V>();
          }
      this.stringMap$key.add(stringMapKey);
      this.stringMap$value.add(stringMapValue);
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> stringMap(final java.util.Map<? extends String, ? extends V> stringMap) {
      if ((stringMap == null))
          {
            throw new java.lang.NullPointerException("stringMap cannot be null");
          }
      if ((this.stringMap$key == null))
          {
            this.stringMap$key = new java.util.ArrayList<String>();
            this.stringMap$value = new java.util.ArrayList<V>();
          }
      for (java.util.Map.Entry<? extends String, ? extends V> $lombokEntry : stringMap.entrySet()) 
        {
          this.stringMap$key.add($lombokEntry.getKey());
          this.stringMap$value.add($lombokEntry.getValue());
        }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearStringMap() {
      if ((this.stringMap$key != null))
          {
            this.stringMap$key.clear();
            this.stringMap$value.clear();
          }
      return this;
    }
    public @java.lang.SuppressWarnings("all") BuilderSingularMaps<K, V> build() {
      java.util.Map<K, V> women;
      switch (((this.women$key == null) ? 0 : this.women$key.size())) {
      case 0 :
          women = java.util.Collections.emptyMap();
          break;
      case 1 :
          women = java.util.Collections.singletonMap(this.women$key.get(0), this.women$value.get(0));
          break;
      default :
          women = new java.util.LinkedHashMap<K, V>(((this.women$key.size() < 0x40000000) ? ((1 + this.women$key.size()) + ((this.women$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));
          for (int $i = 0;; ($i < this.women$key.size()); $i ++) 
            women.put(this.women$key.get($i), this.women$value.get($i));
          women = java.util.Collections.unmodifiableMap(women);
      }
      java.util.SortedMap<K, Number> men = new java.util.TreeMap<K, Number>();
      if ((this.men$key != null))
          for (int $i = 0;; ($i < ((this.men$key == null) ? 0 : this.men$key.size())); $i ++) 
            men.put(this.men$key.get($i), this.men$value.get($i));
      men = java.util.Collections.unmodifiableSortedMap(men);
      java.util.Map<java.lang.Object, java.lang.Object> rawMap;
      switch (((this.rawMap$key == null) ? 0 : this.rawMap$key.size())) {
      case 0 :
          rawMap = java.util.Collections.emptyMap();
          break;
      case 1 :
          rawMap = java.util.Collections.singletonMap(this.rawMap$key.get(0), this.rawMap$value.get(0));
          break;
      default :
          rawMap = new java.util.LinkedHashMap<java.lang.Object, java.lang.Object>(((this.rawMap$key.size() < 0x40000000) ? ((1 + this.rawMap$key.size()) + ((this.rawMap$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));
          for (int $i = 0;; ($i < this.rawMap$key.size()); $i ++) 
            rawMap.put(this.rawMap$key.get($i), this.rawMap$value.get($i));
          rawMap = java.util.Collections.unmodifiableMap(rawMap);
      }
      java.util.Map<String, V> stringMap;
      switch (((this.stringMap$key == null) ? 0 : this.stringMap$key.size())) {
      case 0 :
          stringMap = java.util.Collections.emptyMap();
          break;
      case 1 :
          stringMap = java.util.Collections.singletonMap(this.stringMap$key.get(0), this.stringMap$value.get(0));
          break;
      default :
          stringMap = new java.util.LinkedHashMap<String, V>(((this.stringMap$key.size() < 0x40000000) ? ((1 + this.stringMap$key.size()) + ((this.stringMap$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));
          for (int $i = 0;; ($i < this.stringMap$key.size()); $i ++) 
            stringMap.put(this.stringMap$key.get($i), this.stringMap$value.get($i));
          stringMap = java.util.Collections.unmodifiableMap(stringMap);
      }
      return new BuilderSingularMaps<K, V>(women, men, rawMap, stringMap);
    }
    public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
      return (((((((((((((((("BuilderSingularMaps.BuilderSingularMapsBuilder(women$key=" + this.women$key) + ", women$value=") + this.women$value) + ", men$key=") + this.men$key) + ", men$value=") + this.men$value) + ", rawMap$key=") + this.rawMap$key) + ", rawMap$value=") + this.rawMap$value) + ", stringMap$key=") + this.stringMap$key) + ", stringMap$value=") + this.stringMap$value) + ")");
    }
  }
  private @Singular Map<K, V> women;
  private @Singular SortedMap<K, ? extends Number> men;
  private @SuppressWarnings("all") @Singular("rawMap") Map rawMap;
  private @Singular("stringMap") Map<String, V> stringMap;
  @java.lang.SuppressWarnings("all") BuilderSingularMaps(final Map<K, V> women, final SortedMap<K, ? extends Number> men, final Map rawMap, final Map<String, V> stringMap) {
    super();
    this.women = women;
    this.men = men;
    this.rawMap = rawMap;
    this.stringMap = stringMap;
  }
  public static @java.lang.SuppressWarnings("all") <K, V>BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> builder() {
    return new BuilderSingularMaps.BuilderSingularMapsBuilder<K, V>();
  }
}