class PipelineSettings {
  final Language lang;
  final Language motherTongue;
  final TextChecker.QueryParams query;
  final UserConfig userConfig;
  final GlobalConfig globalConfig;

  PipelineSettings(Language lang, UserConfig userConfig) {
    this(lang, null, new TextChecker.QueryParams(), new GlobalConfig(), userConfig);
  }

  PipelineSettings(Language lang, Language motherTongue, TextChecker.QueryParams params, GlobalConfig globalConfig, UserConfig userConfig) {
    this.lang = lang;
    this.motherTongue = motherTongue;
    this.query = params;
    this.userConfig = userConfig;
    this.globalConfig = globalConfig;
  }

  @Override
  public int hashCode() {
    return new HashCodeBuilder(17, 31)
      .append(lang)
      .append(motherTongue)
      .append(query)
      .append(globalConfig)
      .append(userConfig)
      .toHashCode();
  }

  @Override
  public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

  @Override
  public String toString() {
    return new ToStringBuilder(this)
      .append("lang", lang)
      .append("motherTongue", motherTongue)
      .append("query", query)
      .append("globalConfig", globalConfig)
      .append("user", userConfig)
      .build();
  }
}

    if (obj == this) {
      return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
      return false;
    }
    PipelineSettings other = (PipelineSettings) obj;
    return new EqualsBuilder()
      .append(lang, other.lang)
      .append(motherTongue, other.motherTongue)
      .append(query, other.query)
      .append(globalConfig, other.globalConfig)
      .append(userConfig, other.userConfig)
      .isEquals();
  
<no_super_class>