/// <summary>
            /// Adds an input string and it's stemmer override output to this builder.
            /// </summary>
            /// <param name="input"> the input char sequence </param>
            /// <param name="output"> the stemmer override output char sequence </param>
            /// <returns> <code>false</code> iff the input has already been added to this builder otherwise <code>true</code>. </returns>
            public virtual bool add(ICharSequence input, ICharSequence output)
            {
                int length = input.length();

                if (ignoreCase)
                {
                    // convert on the fly to lowercase
                    charsSpare.grow(length);
                    char[] buffer = charsSpare.chars;
                    for (int i = 0; i < length;)
                    {
                        i += char.toChars(char.ToLower(char.codePointAt(input, i)), buffer, i);
                    }
                    UnicodeUtil.UTF16toUTF8(buffer, 0, length, spare);
                }
                else
                {
                    UnicodeUtil.UTF16toUTF8(input, 0, length, spare);
                }
                if (hash.add(spare) >= 0)
                {
                    outputValues.Add(output);
                    return(true);
                }
                return(false);
            }
		/// <summary>
		/// Adds an input string and it's stemmer override output to this builder.
		/// </summary>
		/// <param name="input"> the input char sequence </param>
		/// <param name="output"> the stemmer override output char sequence </param>
		/// <returns> <code>false</code> iff the input has already been added to this builder otherwise <code>true</code>. </returns>
		public virtual bool add(ICharSequence input, ICharSequence output)
		{
		  int length = input.length();
		  if (ignoreCase)
		  {
			// convert on the fly to lowercase
			charsSpare.grow(length);
			char[] buffer = charsSpare.chars;
			for (int i = 0; i < length;)
			{
				i += char.toChars(char.ToLower(char.codePointAt(input, i)), buffer, i);
			}
			UnicodeUtil.UTF16toUTF8(buffer, 0, length, spare);
		  }
		  else
		  {
			UnicodeUtil.UTF16toUTF8(input, 0, length, spare);
		  }
		  if (hash.add(spare) >= 0)
		  {
			outputValues.Add(output);
			return true;
		  }
		  return false;
		}