<?xml version="1.0"?>
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       https://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<!--
This file is also used by the maven-changes-plugin to generate the release notes.
Useful ways of finding items to add to this file are:

1.  Add items when you fix a bug or add a feature (this makes the
release process easy :-).

2.  Do a JIRA search for tickets closed since the previous release.

3.  Use the report generated by the maven-changelog-plugin to see all
SVN commits. TBA how to use this with SVN.

To generate the release notes from this file:

mvn changes:announcement-generate -Prelease-notes [-Dchanges.version=m.n]

The <action> type attribute can be add,update,fix,remove.
-->

<document xmlns="http://maven.apache.org/changes/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/changes/2.0.0 https://maven.apache.org/xsd/changes-2.0.0.xsd">
  <properties>
    <title>Apache Commons Codec Release Notes</title>
    <author>Apache Commons Developers</author>
  </properties>
  <body>
    <release version="1.22.1" date="2026-07-27" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <action type="fix" issue="CODEC-344" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Base64.Builder.setEncodeTable(byte...) accepts invalid custom alphabets.</action>
      <action type="fix" issue="CODEC-340" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Base58.Builder.setEncodeTable(byte...) is ignored when encoding and decoding.</action>
      <action type="fix" issue="CODEC-342" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Base32.Builder.setEncodeTable(byte...) can create a codec that cannot decode its own output.</action>
      <action type="fix" issue="CODEC-343" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Base32.Builder.setHexDecodeTable(boolean) sets the encode table to a decode lookup table.</action>
      <action type="fix" issue="CODEC-341" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Base16.Builder.setEncodeTable(byte...) can create a codec that cannot decode its own output.</action>
      <action type="fix" issue="CODEC-339" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">URLCodec.encodeUrl(BitSet, byte[]) allows custom safe sets to emit URL encoding control characters.</action>
      <action type="fix" issue="CODEC-338" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">PercentCodec loses literal '+' when plusForSpace is enabled.</action>
      <action type="fix" issue="CODEC-337" dev="pkarwasz" due-to="Ruiqi Dong, Gary Gregory">Digest ALL reuses System.in, so only the first algorithm sees the real input (#431).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix Base64.toIntegerBytes(BigInteger) for zero edge case (#441).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Add messages when throwing NullPointerException.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Add messages when throwing NullPointerException.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">StringEncoderComparator.StringEncoderComparator(StringEncoder) now fails fast on null input.</action>
      <!-- ADD -->
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 98 to 103.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump commons-io:commons-io from 2.21.0 to 2.22.0.</action>
    </release>
    <release version="1.22.0" date="2026-04-19" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Shalu Jha, Andrey, Gary Gregory" issue="CODEC-249">Fix Incorrect transform of CH digraph according Metaphone basic rules #423.</action>
      <action type="fix" dev="ggregory" due-to="DRUser123, Shalu Jha, Gary Gregory" issue="CODEC-317">ColognePhonetic can create duplicate consecutive codes in some cases.</action>
      <action type="fix" dev="ggregory" due-to="fancying, Gary Gregory">Add boundary tests for BinaryCodec.fromAscii partial-bit inputs #425.</action>
      <action type="fix" dev="ggregory" due-to="Partha Paul, Gary Gregory" issue="CODEC-336">Base64.Builder.setUrlSafe(boolean) Javadoc incorrectly states null is accepted for primitive boolean parameter.</action>
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Inkeet, Gary Gregory, Wolff Bock von Wuelfingen" issue="CODEC-326">Add Base58 support.</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add BaseNCodecInputStream.AbstracBuilder.setByteArray(byte[]).</action>
      <action type="add" issue="CODEC-335" dev="pkarwasz" due-to="Piotr P. Karwasz, Gary Gregory">Add GitIdentifiers to compute Git blob and tree object identifiers.</action>
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 96 to 98.</action>
    </release>
    <release version="1.21.0" date="2026-01-23" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix oak leaf icon references in overview.html when running `mvn clean javadoc:javadoc`.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix Apache RAT plugin console warnings.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix malformed Javadoc comments.</action>
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Aleksandr Beliakov, Gary Gregory" issue="CODEC-333">Add distinct Base64 decoding for standard and URL-safe formats.</action>
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 91 to 96 #415, #418.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump commons-io:commons-io from 2.20.0 to 2.21.0.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-lang3 from 3.19.0 to 3.20.0.</action>
    </release>
    <release version="1.20.0" date="2025-10-30" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate all but one Base32 constructor in favor of the builder added in version 1.17.0.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate all but one Base64 constructor in favor of the builder added in version 1.17.0.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">BaseNCodecInputStream subclasses are now type-safe to match its matching BaseNCodec.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">BaseNCodecOutputStream subclasses are now type-safe to match its matching BaseNCodec.</action>
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Fredrik Kjellberg, Gary Gregory">Add org.apache.commons.codec.digest.Crc16.</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add builders to org.apache.commons.codec.digest streams and deprecate some old constructors.</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add builder to Base16 streams and deprecate some old constructors.</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add support for SHAKE128-256 and SHAKE256-512 to `DigestUtils` and `MessageDigestAlgorithms` on Java 25 and up.</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add BaseNCodec.AbstractBuilder.setDecodeTable(byte[]) and refactor subclasses.</action>
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 85 to 91.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">[test] Bump org.apache.commons:commons-lang3 from 3.18.0 to 3.19.0.</action>
    </release>
    <release version="1.19.0" date="2025-07-19" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Remove -nouses directive from maven-bundle-plugin. OSGi package imports now state 'uses' definitions for package imports, this doesn't affect JPMS (from org.apache.commons:commons-parent:80).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Refactor DigestUtils.updateDigest(MessageDigest, File) to use NIO.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory" issue="CODEC-328" >Clarify Javadoc for org.apache.commons.codec.digest.UnixCrypt.crypt(byte[],String).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Precompile regular expressions in DaitchMokotoffSoundex.Rule.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Precompile regular expressions in DaitchMokotoffSoundex.parseRules(Scanner, String, Map, Map).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Precompile regular expressions in Lang.loadFromResource(String, Languages).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Precompile regular expressions in PhoneticEngine.encode(String, LanguageSet).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Precompile regular expressions in org.apache.commons.codec.language.bm.Rule.parse*(*).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Remove redundant checks for whitespace in DaitchMokotoffSoundex.soundex(String, boolean).</action>
      <action type="fix" dev="ggregory" due-to="Sebastian Baunsgaard">Javadoc typo in Base16.java #380.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate unused constant org.apache.commons.codec.language.bm.Rule.ALL.</action>
      <action type="fix" dev="ggregory" issue="CODEC-331" due-to="IlikeCode, Gary Gregory">org.apache.commons.codec.language.bm.Rule.parsePhonemeExpr(String) adds duplicate empty phoneme when input ends with |.</action>
      <action type="fix" dev="ggregory" issue="CODEC-331" due-to="IlikeCode, Gary Gregory">org.apache.commons.codec.language.DaitchMokotoffSoundex.cleanup(String) does not remove special characters like punctuation.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix PMD multiple UnnecessaryFullyQualifiedName in org.apache.commons.codec.binary.StringUtils.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix PMD UnusedFormalParameter in private constructor in org.apache.commons.codec.binary.Base16.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix PMD multiple UnnecessaryFullyQualifiedName in org.apache.commons.codec.digest.Blake3.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix PMD UnnecessaryFullyQualifiedName in org.apache.commons.codec.digest.Md5Crypt.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix PMD EmptyControlStatement in org.apache.commons.codec.language.Metaphone.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix SpotBugs [ERROR] Medium: org.apache.commons.codec.binary.BaseNCodec$AbstractBuilder.setEncodeTable(byte[]) may expose internal representation by storing an externally mutable object into BaseNCodec$AbstractBuilder.encodeTable [org.apache.commons.codec.binary.BaseNCodec$AbstractBuilder] At BaseNCodec.java:[line 131] EI_EXPOSE_REP2.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">The method org.apache.commons.codec.binary.BaseNCodec.AbstractBuilder.setLineSeparator(byte...) now makes a defensive copy.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Avoid unnecessary String conversion in org.apache.commons.codec.language.bm.PhoneticEngine.applyFinalRules(PhonemeBuilder, Map).</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Fix SpotBugs [ERROR] High: Potentially dangerous use of non-short-circuit logic in org.apache.commons.codec.language.DaitchMokotoffSoundex.cleanup(String) [org.apache.commons.codec.language.DaitchMokotoffSoundex] At DaitchMokotoffSoundex.java:[line 350] NS_DANGEROUS_NON_SHORT_CIRCUIT.</action>
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add HmacUtils.hmac(Path).</action>      
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add HmacUtils.hmacHex(Path).</action>      
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add PMD check to the default Maven goal.</action>      
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add SpotBugs check to the default Maven goal.</action>      
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 79 to 85 #375.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">[test] Bump commons-io:commons-io from 2.18.0 to 2.20.0.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">[test] Bump org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0 #386.</action>
    </release>
    <release version="1.18.0" date="2025-01-24" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Gary Gregory, Julian Reschke">Add Base32.Builder.setHexDecodeTable(boolean).</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory, Julian Reschke">Add Base32.Builder.setHexEncodeTable(boolean).</action>
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 78 to 79.</action>
    </release>
    <release version="1.17.2" date="2024-12-28" description="This is a feature and maintenance release. Java 8 or later is required.">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Rewrite DaitchMokotoffSoundex.soundex(String) using String.join().</action>
      <action type="fix" issue="CODEC-324" dev="ggregory" due-to="Michael Froh">Use Resource.class to load resources, rather than its class loader #353.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate CharSequenceUtils.CharSequenceUtils().</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate Sha2Crypt.Sha2Crypt().</action>
      <!-- ADD -->
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Dependabot">Bump org.apache.commons:commons-lang3 from 3.14.0 to 3.17.0 #296, #305, #313.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 71 to 78 #310, #312, #319, #323, #326, #333.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">[test] Bump commons-io:commons-io from 2.16.1 to 2.18.0 #318, #341.</action>
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.codehaus.mojo:taglist-maven-plugin from 3.1.0 to 3.2.1 #332.</action> 
    </release>
    <release version="1.17.1" date="2024-07-12" description="Feature and fix release. Requires a minimum of Java 8.">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Md5Crypt now throws IllegalArgumentException on an invalid prefix.</action>
      <!-- ADD -->
      <!-- UPDATE -->
      <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 69 to 71 #286.</action>
      <action               dev="ggregory" type="update" due-to="Dependabot">Bump org.codehaus.mojo:animal-sniffer-maven-plugin from 1.23 to 1.24 #293.</action> 
      <action               dev="ggregory" type="update" due-to="Dependabot">Bump org.codehaus.mojo:taglist-maven-plugin from 3.0.0 to 3.1.0 #292.</action> 
    </release>
    <release version="1.17.0" date="2024-04-20" description="Feature and fix release. Requires a minimum of Java 8.">
      <!-- FIX -->
      <action type="fix" issue="CODEC-320" dev="ggregory" due-to="Martin Frydl, Gary Gregory">Wrong output of DoubleMetaphone in 1.16.1.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Optimize memory allocation in PhoneticEngine.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">BCodec and QCodec encode() methods throw UnsupportedCharsetException instead of EncoderException.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Set Javadoc link to latest Java API LTS version.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Base32 constructor fails-fast with a NullPointerException if the custom alphabet array is null.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Base32 constructor makes a defensive copy of the line separator array.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Base64 constructor makes a defensive copy of the line separator array.</action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">Base64 constructor makes a defensive copy of a custom alphabet array.</action>
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add override org.apache.commons.codec.language.bm.Rule.PhonemeExpr.size().</action>
      <action type="add" dev="ggregory" due-to="Chris Kocel, Gary Gregory">Add support for Base64 custom alphabets #266.</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add Base64.Builder (allows custom alphabets).</action> 
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add Base32.Builder (allows custom alphabets).</action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add Base64 support for a custom padding byte (like Base32).</action> 
      <!-- UPDATE -->
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump org.apache.commons:commons-parent from 66 to 69 #250, #261.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump commons-io:commons-io from 2.15.1 to 2.16.1 #258, #265.</action>
    </release>
    <release version="1.16.1" date="2024-02-04" description="Feature and fix release. Requires a minimum of Java 8.">
      <!-- ADD -->
      <action type="add" dev="ggregory" due-to="Gary Gregory">Add Maven property project.build.outputTimestamp for build reproducibility.</action>
      <!-- FIX -->
      <action issue="CODEC-295" dev="ggregory" type="fix" due-to="Gary Gregory">Test clean ups.</action>
      <action                   dev="ggregory" type="fix" due-to="step-security-bot, Gary Gregory">[StepSecurity] ci: Harden GitHub Actions #187.</action>
      <action issue="CODEC-295" dev="ggregory" type="fix" due-to="Evan Saulpaugh">Correct error in Base64 Javadoc #188.</action>
      <action issue="CODEC-295" dev="ggregory" type="fix" due-to="Olivier Jaquemet, Gary Gregory">Add minimum Java version in changes.xml #186.</action>
      <action issue="CODEC-310" dev="ggregory" type="fix" due-to="Yakov Shafranovich">Documentation update for the org.apache.commons.codec.digest.* package #208.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Precompile regular expression in UnixCrypt.crypt(byte[], String).</action>
      <action issue="CODEC-315" dev="ggregory" type="fix" due-to="Arthur Chan, Gary Gregory">Fix possible IndexOutOfBoundException in PhoneticEngine.encode method #223.</action>
      <action issue="CODEC-313" dev="ggregory" type="fix" due-to="Arthur Chan, Gary Gregory">Fix possible ArrayIndexOutOfBoundsException in QuotedPrintableCodec.encodeQuotedPrintable() method #221.</action>
      <action issue="CODEC-312" dev="ggregory" type="fix" due-to="Arthur Chan, Gary Gregory">Fix possible StringIndexOutOfBoundException in MatchRatingApproachEncoder.encode() method #220.</action>
      <action issue="CODEC-311" dev="ggregory" type="fix" due-to="Arthur Chan, Gary Gregory">Fix possible ArrayIndexOutOfBoundException in RefinedSoundex.getMappingCode() #219.</action>
      <action issue="CODEC-314" dev="ggregory" type="fix" due-to="Arthur Chan, Gary Gregory">Fix possible IndexOutOfBoundsException in PercentCodec.insertAlwaysEncodeChars() method #222.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate UnixCrypt 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate Md5Crypt 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate Crypt 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate StringUtils 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate Resources 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate Charsets 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate CharEncoding 0-argument constructor.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Add missing version for animal-sniffer-maven-plugin.</action>
      <!-- UPDATE -->
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump commons-parent from 58 to 66.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump commons-lang3 from 3.12.0 to 3.14.0.</action>      
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump commons-io from 2.13.0 to 2.15.1.</action>      
    </release>
    <release version="1.16.0" date="2023-06-17" description="Feature and fix release. Requires a minimum of Java 8.">
      <!-- FIX -->
      <action issue="CODEC-295" dev="ggregory" type="fix" due-to="Arturo Bernal">Minor improvements #67.</action> 
      <action                   dev="aherbert" type="fix" due-to="James Gan">Remove duplicated words from Javadocs.</action>
      <action issue="CODEC-301" dev="aherbert" type="fix" due-to="Alexander Pinske, Alex Herbert">Simplify assertion #84.</action>
      <action issue="CODEC-300" dev="ggregory" type="fix" due-to="Arturo Bernal">Simplify assertion #84.</action>
      <action issue="CODEC-298" dev="ggregory" type="fix" due-to="Arturo Bernal">Use Standard Charset object #82.</action>
      <action                   dev="ggregory" type="fix" due-to="Arturo Bernal">Use String.contains() functions #125.</action>
      <action                   dev="ggregory" type="fix" due-to="Arturo Bernal">Avoid use toString() or substring() in favor of a simplified expression #126.</action>
      <action issue="CODEC-305" dev="aherbert" type="fix" due-to="Florian">Fix byte-skipping in Base16 decoding #135.</action>
      <action                   dev="kinow" type="fix" due-to="Marc Wrobel">Fix several typos, improve writing in some javadocs #139.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">BaseNCodecOutputStream.eof() should not throw IOException.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Javadoc improvements and cleanups.</action>
      <action                   dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate BaseNCodec.isWhiteSpace(byte) and use Character.isWhitespace(int).</action>
      <!-- ADD -->
      <action issue="CODEC-296" dev="mattsicker" type="add" due-to="Matt Sicker">Add support for Blake3 family of hashes.</action>
      <action                   dev="ggregory" type="add">Add github/codeql-action.</action>
      <!-- UPDATE -->
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump actions/cache from v2 to v3.0.10 #75, #99, #119, #138, #149, #152.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump actions/setup-java from v1.4.1 to 3.5.1 #60, #62, #121.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump actions/checkout from 2.3.2 to 3.1.0 #65, #98, #114, #153.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump commons-parent from 52 to 58, #147, #165, #170.</action>
      <action issue="CODEC-285" dev="ggregory" type="update" due-to="Dependabot, John Patrick">Bump junit from 4.13.1 to 5.9.1 #76, #39, #140, #148.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump Java 7 to 8.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump japicmp-maven-plugin from 0.14.3 to 0.17.1.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump jacoco-maven-plugin from 0.8.5 to 0.8.8 (Fixes Java 15 builds).</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump maven-surefire-plugin from 2.22.2 to 3.0.0-M7 #122, #134.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump maven-javadoc-plugin from 3.2.0 to 3.4.1.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump animal-sniffer-maven-plugin from 1.19 to 1.22.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory, Dependabot">Bump maven-pmd-plugin from 3.13.0 to 3.19.0, #133, #142, #145.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump pmd from 6.47.0 to 6.52.0.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump maven-checkstyle-plugin from 2.17 to 3.2.0 #143.</action>
      <action                   dev="kinow, ggregory" type="update" due-to="Dependabot">Bump checkstyle from 8.45.1 to 9.3 #97, #100, #101, #103.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot">Bump taglist-maven-plugin from 2.4 to 3.0.0 #102.</action>       
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Bump jacoco-maven-plugin from 0.8.7 to 0.8.8.</action>
    </release>

    <release version="1.15" date="2020-09-01" description="Feature and fix release.">
      <action issue="CODEC-264" dev="aherbert" due-to="Andy Seaborne" type="fix">MurmurHash3: Ensure hash128 maintains the sign extension bug.</action>
      <action issue="CODEC-280" dev="aherbert" type="update">Base32/Base64/BCodec: Added strict decoding property to control handling of trailing bits. Default lenient mode discards them without error. Strict mode raise an exception.</action>
      <action issue="CODEC-289" dev="aherbert" type="update">Base32/Base64 Input/OutputStream: Added strict decoding property to control handling of trailing bits. Default lenient mode discards them without error. Strict mode raise an exception.</action>
      <action                   dev="ggregory" type="update" due-to="Gary Gregory">Update tests from JUnit 4.12 to 4.13.</action>
      <action issue="CODEC-290" dev="aherbert" due-to="Adam Retter" type="add">Base16Codec and Base16Input/OutputStream.</action>
      <action issue="CODEC-291" dev="aherbert" due-to="Adam Retter" type="add">Hex encode/decode with existing arrays.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot">Update actions/checkout from v1 to v2.3.2 #50, #56.</action>
      <action                   dev="ggregory" type="update" due-to="Dependabot">Update actions/setup-java from v1.4.0 to v1.4.1 #57.</action>
    </release>

    <release version="1.14" date="2019-12-30" description="Feature and fix release.">
      <action issue="CODEC-261" dev="aherbert" type="fix">Hex: Allow encoding read-only ByteBuffer.</action>
      <action issue="CODEC-259" dev="aherbert" type="fix">Hex: Only use an available ByteBuffer backing array if the length equals the remaining byte count.</action>
      <action issue="CODEC-268" dev="aherbert" type="update">MurmurHash3: Deprecate hash64 methods and hash methods accepting a String that use the default encoding.</action>
      <action issue="CODEC-265" dev="aherbert" type="fix">BaseNCodec to expand buffer using overflow conscious code.</action>
      <action issue="CODEC-270" dev="aherbert" type="fix">Base32/64: Fixed decoding check that all the final trailing bits to discard are zero.</action>
      <action issue="CODEC-264" dev="aherbert" due-to="Claude Warren" type="add">Add MurmurHash3.hash128x64 methods to fix sign extension error during seeding in hash128 methods.</action>
      <action issue="CODEC-267" dev="aherbert" due-to="Claude Warren" type="add">Add MurmurHash3.hash32x86 methods and IncrementalHash32x86 to fix sign extension error in hash32 methods.</action>
      <action issue="CODEC-269" dev="aherbert" type="fix">Allow repeat calls to MurmurHash3.IncrementalHash32.end() to generate the same value.</action>
      <action issue="CODEC-272" dev="ggregory" type="add" due-to="Behrang, Alex Herbert, Gary Gregory">Add RandomAccessFile digest methods #31.</action>
      <action issue="CODEC-273" dev="ggregory" type="add" due-to="Gary Gregory">Add Path APIs to org.apache.commons.codec.digest.DigestUtils similar to File APIs.</action>
      <action issue="CODEC-274" dev="ggregory" type="add" due-to="Gary Gregory">Add SHA-512/224 and SHA-512/256 to DigestUtils for Java 9 and up.</action>
      <action issue="CODEC-275" dev="ggregory" type="add" due-to="Claude Warren">Add missing note in javadoc when sign extension error is present #34.</action>
      <action issue="CODEC-276" dev="ggregory" type="fix" due-to="Gary Gregory">Reliance on default encoding in MurmurHash2 and MurmurHash3.</action>
      <action issue="CODEC-277" dev="ggregory" type="update" due-to="Gary Gregory">Don't reload standard Charsets in org.apache.commons.codec.Charsets.</action>
      <action issue="CODEC-278" dev="ggregory" type="update" due-to="Gary Gregory">Deprecate Charset constants in org.apache.commons.codec.Charsets in favor of java.nio.charset.StandardCharsets.</action>
    </release>

    <release version="1.13" date="2019-07-20" description="Feature and fix release.">
      <action issue="CODEC-255" dev="sebb" due-to="Holger Grote" type="fix">ColognePhonetic handles x incorrectly</action>
      <action issue="CODEC-254" dev="sebb" due-to="Holger Grote" type="fix">ColognePhonetic does not treat the letter H correctly</action>
      <action issue="CODEC-134" dev="tmousaw-ptc" type="fix">Reject any decode request for a value that is impossible to encode to for Base32/Base64 rather than blindly decoding.</action>
      <action issue="CODEC-236" dev="melloware" due-to="Viliam Holub" type="add">MurmurHash2 for 32-bit or 64-bit value.</action>
      <action issue="CODEC-236" dev="melloware" due-to="Austin Appleby" type="add">MurmurHash3 for 32-bit or 128-bit value.</action>
      <action issue="CODEC-236" dev="ggregory" due-to=" Tomas Shestakov, Gary Gregory" type="update">Broken direct java.nio.ByteBuffer support in org.apache.commons.codec.binary.Hex.</action>
    </release>

    <release version="1.12" date="2019-02-04" description="Feature and fix release. Requires a minimum of Java 7.">
      <!-- The first attribute below should be the issue id; makes it easier to navigate in the IDE outline -->
      <action issue="CODEC-252" dev="chtompki" type="fix">B64 salt generator: Random -> ThreadLocalRandom</action>
      <action issue="CODEC-250" dev="sebb" type="fix" due-to="Alex Volodko">Wrong value calculated by Cologne Phonetic if a special character is placed between equal letters</action>
      <action issue="CODEC-244" dev="ggregory" type="update">Update from Java 6 to Java 7</action>
      <action issue="CODEC-240" dev="ggregory" type="add" due-to="Ioannis Sermetziadis">Add Percent-Encoding Codec (described in RFC3986 and RFC7578)</action>
      <action issue="CODEC-246" dev="ggregory" type="fix" due-to="Oscar Luis Vera Pérez">ColognePhoneticTest.testIsEncodeEquals missing assertions</action>
      <action issue="CODEC-251" dev="ggregory" type="add" due-to="Gary Gregory">Add SHA-3 methods in DigestUtils</action>
    </release>
    <release version="1.11" date="2017-10-20" description="Feature and fix release.">
      <!-- The first attribute below should be the issue id; makes it easier to navigate in the IDE outline -->
      <action issue="CODEC-241" type="add">Add support for XXHash32</action>
      <action issue="CODEC-234" dev="ggregory" type="update" due-to="Christopher Schultz, Sebb">Base32.decode should support lowercase letters</action>
      <action issue="CODEC-233" dev="sebb" type="update" due-to="Yossi Tamari">Soundex should support more algorithm variants</action>
      <action issue="CODEC-145" dev="sebb" type="fix" due-to="Jesse Glick">Base64.encodeBase64String could better use newStringUsAscii (ditto encodeBase64URLSafeString)</action>
      <action issue="CODEC-144" dev="sebb" type="fix">BaseNCodec: encodeToString and encodeAsString methods are identical</action>
      <action issue="CODEC-232" dev="sebb" type="fix">URLCodec is neither immutable nor threadsafe</action>
      <action issue="CODEC-231" dev="sebb" type="fix">StringUtils.equals(CharSequence cs1, CharSequence cs2) can fail with String Index OBE</action>
      <action issue="CODEC-230" dev="sebb" type="fix">URLCodec.WWW_FORM_URL should be private</action>
      <action issue="CODEC-229" dev="sebb" type="fix">StringUtils.newStringxxx(null) should return null, not NPE</action>
      <action issue="CODEC-220" dev="sebb" type="add">Fluent interface for DigestUtils</action>
      <action issue="CODEC-222" dev="sebb" type="add">Fluent interface for HmacUtils</action>
      <action issue="CODEC-225" dev="jochen" type="fix" due-to="Svetlin Zarev">Fix minor resource leaks</action>
      <action issue="CODEC-223" dev="sebb" type="remove">Drop obsolete Ant build</action>
      <action issue="CODEC-171" dev="sebb" type="add" due-to="Brett Okken">Add support for CRC32-C</action>
      <action issue="CODEC-221" dev="sebb" type="update">HmacUtils.updateHmac calls reset() unnecessarily</action>
      <action issue="CODEC-200" dev="sebb" type="fix" due-to="Luciano Vernaschi">Base32.HEX_DECODE_TABLE contains the wrong value 32</action>
      <action issue="CODEC-207" dev="ggregory" type="fix" due-to="Gary Gregory">Charsets Javadoc breaks build when using Java 8</action>
      <action issue="CODEC-199" dev="ggregory/sebb" type="fix" due-to="Yossi Tamari">Bug in HW rule in Soundex</action>
      <action issue="CODEC-209" dev="ggregory" type="fix" due-to="Gary Gregory">Javadoc for SHA-224 DigestUtils methods should mention Java 1.8.0 restriction instead of 1.4.0.</action>
      <action issue="CODEC-219" dev="ggregory" type="fix" due-to="Gary Gregory, Sebb">Don't deprecate Charsets Charset constants in favor of Java 7's java.nio.charset.StandardCharsets</action>
      <action issue="CODEC-217" dev="ggregory" type="add" due-to="Gary Gregory">Add HmacAlgorithms.HMAC_SHA_224 (Java 8 only)</action>
      <action issue="CODEC-213" dev="ggregory" type="add" due-to="Gary Gregory">Support JEP 287: SHA-3 Hash Algorithms</action>
      <action issue="CODEC-212" dev="ggregory" type="add" due-to="Gary Gregory">Create a minimal Digest command line utility: org.apache.commons.codec.digest.Digest</action>
      <action issue="CODEC-210" dev="ggregory" type="add" due-to="Gary Gregory">Add DigestUtils.getDigest(String, MessageDigest)</action>
      <action issue="CODEC-208" dev="ggregory" type="add" due-to="Gary Gregory">Make some DigestUtils APIs public</action>
      <action issue="CODEC-206" dev="ggregory" type="add" due-to="Gary Gregory">Add java.io.File APIs to MessageDigestAlgorithm</action>
      <action issue="CODEC-183" dev="ggregory" type="add" due-to="Steven Wurster">BaseNCodecOutputStream only supports writing EOF on close()</action>
      <action issue="CODEC-195" dev="ggregory" type="add" due-to="Gary Gregory">Support SHA-224 in DigestUtils on Java 8</action>
      <action issue="CODEC-194" dev="ggregory" type="add" due-to="Gary Gregory">Support java.nio.ByteBuffer in org.apache.commons.codec.binary.Hex</action>
      <action issue="CODEC-193" dev="ggregory" type="add" due-to="Michael Donaghy">Support java.nio.ByteBuffer in DigestUtils</action>
      <action issue="CODEC-202" dev="ggregory" type="add" due-to="Oleg Kalnichevski">Add BaseNCodec.encode(byte[], int, int) input with offset and length parameters for Base64 and Base32.</action>
      <action issue="CODEC-203" dev="ggregory" type="add" due-to="Gary Gregory">Add convenience method decodeHex(String).</action>
      <action issue="CODEC-205" dev="ggregory" type="add" due-to="Gary Gregory">Add faster CRC32 implementation.</action>
      <action issue="CODEC-224" dev="ggregory" type="add" due-to="Gary Gregory">Add convenience API org.apache.commons.codec.binary.Hex.encodeHexString(byte[]|ByteBuffer, boolean).</action>
      <action issue="CODEC-242" dev="ggregory" type="add" due-to="Gary Gregory">Add Automatic-Module-Name manifest entry for Java 9.</action>
    </release>
    <release version="1.10" date="5 November 2014" description="Feature and fix release.">
      <action dev="ggregory" type="add" issue="CODEC-192" due-to="Thomas Neidhart">Add Daitch-Mokotoff Soundex</action>
      <action dev="ggregory" type="add" issue="CODEC-121" due-to="Thomas Neidhart, Java John">QuotedPrintableCodec does not support soft line break per the 'quoted-printable' example on Wikipedia</action>
      <action dev="tn" type="fix" issue="CODEC-185" due-to="Sean Busbey">Added clarification to Javadoc of Base64 concerning the use of the urlSafe parameter</action>
      <action dev="tn" type="fix" issue="CODEC-191" due-to="Igor Savin">Added clarification to the Javadoc of Base[32|64]OutputStream that it is mandatory to call close()</action>
      <action dev="ggregory" type="fix" issue="CODEC-188" due-to="Hendrik Saly">Add support for HMAC Message Authentication Code (MAC) digests</action>
      <action dev="ggregory" type="fix" issue="CODEC-187" due-to="Michael Tobias, Thomas Neidhart">Beider Morse Phonetic Matching producing incorrect tokens</action>
      <action dev="ggregory" type="fix" issue="CODEC-184" due-to="Cyrille Artho">NullPointerException in DoubleMetaPhone.isDoubleMetaphoneEqual when using empty strings</action>
      <action dev="ggregory" type="add" issue="CODEC-181" due-to="Ivan Martinez-Ortiz">Make possible to provide padding byte to BaseNCodec in constructor</action>
      <action dev="ggregory" type="fix" issue="CODEC-180" due-to="Ville Skyttä">Fix Javadoc 1.8.0 errors</action>
      <action dev="ggregory" type="update" issue="CODEC-178">Deprecate Charsets Charset constants in favor of Java 7's java.nio.charset.StandardCharsets</action>
      <action dev="ggregory" type="fix" issue="CODEC-189">Fix Java 8 build Javadoc errors</action>
      <action dev="ggregory" type="update" issue="CODEC-190">Update from commons-parent 34 to 35</action>
    </release>
    <release version="1.9" date="20 December 2013" description="Feature and fix release.">
      <action dev="ggregory" type="update" issue="CODEC-174" due-to="Thomas Champagne">Improve performance of Beider Morse encoder</action>
      <action dev="ggregory" type="fix" issue="CODEC-175">Beider Morse does not close Scanners used to read config files</action>
      <action dev="sebb" type="fix" issue="CODEC-172" due-to="Matt Bishop">Base32 decode table has spurious value</action>
      <action dev="ggregory" type="fix" issue="CODEC-170" due-to="Ron Wheeler, Henri Yandell">Link broken in Metaphone Javadoc</action>
      <action dev="ggregory" type="fix" issue="CODEC-176" due-to="Ville Skyttä">Spelling fixes in Javadoc and comments</action>
    </release>
    <release version="1.8" date="19 April 2013" description="Feature and fix release. Requires a minimum of Java 6.">
      <action dev="ggregory" type="add" issue="CODEC-168" due-to="Daniel Cassidy">Add DigestUtils.updateDigest(MessageDigest, InputStream).</action>
      <action dev="julius" type="add" issue="CODEC-167">Add JUnit to test our decode with pad character in the middle.</action>
      <action dev="ggregory" type="add" issue="CODEC-161" due-to="crice">Add Match Rating Approach (MRA) phonetic algorithm encoder.</action>
      <action dev="ggregory" type="fix" issue="CODEC-163" due-to="leo141">ColognePhonetic encoder unnecessarily creates many char arrays on every loop run.</action>
      <action dev="sebb" type="fix" issue="CODEC-160">Base64.encodeBase64URLSafeString doesn't add padding characters at the end.</action>
    </release>
    <release version="1.7" date="11 September 2012" description="Feature and fix release. Requires a minimum of Java 6.">
      <action issue="CODEC-157" dev="ggregory" type="add" due-to="ggregory">
        DigestUtils: Add MD2 APIs.
      </action>
      <action issue="CODEC-156" dev="ggregory" type="add" due-to="ggregory">
        DigestUtils: add APIs named after standard algorithm name SHA-1.
      </action>
      <action issue="CODEC-155" dev="ggregory" type="add" due-to="ggregory">
        DigestUtils.getDigest(String) should throw IllegalArgumentException instead of RuntimeException.
      </action>
      <action issue="CODEC-153" dev="ggregory" type="add" due-to="ggregory">
        Create a class MessageDigestAlgorithms to define standard algorithm names.
      </action>
      <action issue="CODEC-152" dev="ggregory" type="add" due-to="ggregory">
        DigestUtils.getDigest(String) loses the original exception.
      </action>
      <action issue="CODEC-151" dev="ggregory" type="add" due-to="lathspell">
        Remove unnecessary attempt to fill up the salt variable in UnixCrypt.
      </action>
      <action issue="CODEC-150" dev="ggregory" type="add" due-to="lathspell">
        Remove unnecessary call to Math.abs().
      </action>
      <action issue="CODEC-148" dev="ggregory" type="add" due-to="lathspell">
        More tests and minor things.
      </action>
      <action issue="CODEC-146" dev="tn" type="add" due-to="Julius Davies">
        Added regression tests for PhoneticEngine based on Solr-3.6.0.
      </action>
      <action issue="CODEC-147" dev="tn" type="update">
        BeiderMorseEncoder/PhoneticEngine: make results deterministic by using a LinkedHashSet
        instead of a HashSet.
      </action>
      <action issue="CODEC-143" dev="sebb" type="update">
        StringBuffer could be replaced by StringBuilder for local variables.
      </action>
      <action issue="CODEC-139" dev="ggregory" type="add" due-to="dsebastien">
        DigestUtils: add updateDigest methods and make methods public.
      </action>
      <action issue="CODEC-133" dev="ggregory" type="add" due-to="lathspell">
        Add classes for MD5/SHA1/SHA-512-based Unix crypt(3) hash variants.
      </action>
      <action issue="CODEC-96" dev="ggregory" type="fix" due-to="sebb">
        Base64 encode() method is no longer thread-safe, breaking clients using it as a shared BinaryEncoder.
        Note: the fix breaks binary compatibility, however the changes are to a class (BaseNCodec) which is
        intended for internal use.
      </action>
      <action issue="CODEC-138" dev="sebb" type="fix">
        Complete FilterInputStream interface for BaseNCodecInputStream.
      </action>
      <action issue="CODEC-136" dev="ggregory" type="fix">
        Use Charset objects when possible, create Charsets for required character encodings.
      </action>
      <action issue="CODEC-132" dev="ggregory" type="fix" due-to="rcmuir">
        BeiderMorseEncoder OOM issues.
      </action>
      <action issue="CODEC-131" dev="tn" type="fix" due-to="smolav">
        DoubleMetaphone Javadoc contains dead links.
      </action>
      <action issue="CODEC-130" dev="ggregory" type="add" due-to="tn">
        Base64InputStream.skip skips underlying stream, not output.
      </action>
      <action issue="CODEC-63" dev="ggregory" type="add" due-to="tn">
        Implement NYSIIS phonetic encoder.
      </action>
    </release>
    <release version="1.6" date="20 November 2011" description="Feature and fix release. Requires a minimum of Java 5.">
      <action dev="ggregory" type="fix" issue="CODEC-129" due-to="ggregory">
        Use standard Maven directory layout.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-128" due-to="ville.skytta@iki.fi">
        Documentation spelling fixes.
      </action>
      <action dev="ggregory, sebb" type="fix" issue="CODEC-127">
        Fix various character encoding issues in comments and test cases.
      </action>
      <action dev="ggregory, matthewpocock" type="update" issue="CODEC-125" due-to="Matthew Pocock">
        Implement a Beider-Morse phonetic matching codec.
      </action>
      <action dev="ggregory" type="update" issue="CODEC-119">
        Migrate to Java 5.
      </action>
      <action dev="ggregory" type="update" issue="CODEC-120">
        Migrate to JUnit 4.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-123">
        ColognePhonetic Javadoc should use HTML entities for special characters.
      </action>
    </release>
    <release version="1.5" date="29 March 2011" description="Feature and fix release. Requires a minimum of Java 1.4.">
      <action dev="sebb" type="add" issue="CODEC-88">
        Added new Base32 encoder.
      </action>
      <action dev="sebb" type="fix" issue="CODEC-89">
        new Base64().encode() appends a CRLF, and chunks results into 76 character lines.
      </action>
      <action dev="sebb" type="fix" issue="CODEC-92">
        Many test cases use getBytes() which uses the default platform encoding so tests may fail on some platforms.
      </action>
      <action dev="sebb, julius, ggregory" type="add" issue="CODEC-93" due-to="sebb">
        Add test(s) to check that encodeBase64() does not chunk output.
      </action>
      <action dev="sebb" type="fix" issue="CODEC-97" due-to="mjryall">
        Base64 default constructor behavior changed to enable chunking in 1.4.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-99" due-to="julius">
        Base64.encodeBase64String() shouldn't chunk.
      </action>
      <action dev="julius" type="fix" issue="CODEC-101" due-to="balusc">
        Base64InputStream#read(byte[]) incorrectly returns 0 at end of any stream which is multiple of 3 bytes long.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-103" due-to="gnuf">
        Typo in DecoderException message thrown from Hex.decodeHex.
      </action>
      <action dev="julius, ggregory" type="add" issue="CODEC-105" due-to="zak">
        ArrayIndexOutOfBoundsException when doing multiple reads() on encoding Base64InputStream.
      </action>
      <action dev="bayard" type="add" issue="CODEC-106" due-to="it2mmeyerfa">
        Add the "Kölner Phonetik" encoder (Cologne Phonetic) to codec.lang.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-111" due-to="ggregory">
        org.apache.commons.codec.net.URLCodec.ESCAPE_CHAR isn't final but should be.
      </action>
      <action dev="sebb" type="add" issue="CODEC-112" due-to="sebb">
        Base64.encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe, int maxResultSize) throws IAE for valid maxResultSize if isChunked is false.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-113" due-to="ggregory">
        org.apache.commons.codec.language.RefinedSoundex.US_ENGLISH_MAPPING should be package protected MALICIOUS_CODE.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-114" due-to="ggregory">
        org.apache.commons.codec.language.Soundex.US_ENGLISH_MAPPING should be package protected MALICIOUS_CODE.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-115" due-to="sebb">
        DoubleMetaphone.maxCodeLen should probably be private.
      </action>
      <action dev="ggregory" type="remove" issue="CODEC-116" due-to="ggregory">
        Remove deprecated package private method Base64.discardWhitespace(byte[])
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-117" due-to="ggregory">
        Caverphone encodes names starting and ending with "mb" incorrectly.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-118" due-to="ggregory">
        Split Caverphone class into two classes for Caverphone 1.0 and 2.0.
      </action>
    </release>
    <release version="1.4" date="9 August 2009" description="Feature and fix release. Requires a minimum of Java 1.4.">
      <action dev="ggregory" type="fix" issue="CODEC-80" due-to="Julius Davies">
        Regression: Base64.encode(chunk=true) has a bug when input length is multiple of 76.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-77" due-to="Julius Davies">
        Base64 bug with empty input (new byte[0]).
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-75" due-to="Julius Davies">
        Make Base64 URL-safe.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-74">
        Allow for uppercase letters output in Hex.encodeHex().
      </action>
      <action dev="bayard" type="fix" issue="CODEC-72" due-to="Sebb">
        Soundex and RefinedSoundex issues with character arrays.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-71" due-to="Sebb">
        Base64.isArrayByteBase64() method is inefficient for large byte arrays.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-70" due-to="Sebb">
        Thread safety and malicious code safety improvements.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-68" due-to="Robert Rodewald">
        isBase64 throws ArrayIndexOutOfBoundsException on some non-BASE64 bytes.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-65" due-to="Benjamin Bentmann">
        Fix case-insensitive string handling.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-61" due-to="Igor Slepchin">
        Base64.encodeBase64() throws NegativeArraySizeException on large files.
      </action>
      <action dev="bayard" type="add" issue="CODEC-60">
        Implement Caverphone.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-58" due-to="Julius Davies">
        Character set used by Base64 not documented.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-56" due-to="Sebb">
        RefinedSoundex creates instance before al fields have been initialized.
      </action>
      <action dev="bayard" type="add" issue="CODEC-52" due-to="Niklas Gustavsson">
        Digest on InputStreams.
      </action>
      <action dev="bayard" type="fix" issue="CODEC-51">
        2 Test failures in SoundexTest.
      </action>
      <action dev="bayard" type="add" issue="CODEC-40" due-to="Chris Black">
        Patch to add crypto-compatible BigInteger encoding support to Base64.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-39" due-to="Jamie Flournoy" due-to-email="jamie@white-mountain.org">
        DigestUtils: Add methods for SHA-256, SHA-384, and SHA-512.
      </action>
      <action dev="tobrien" type="fix" issue="CODEC-10" due-to="Reggie Riser" due-to-email="rriser@informs.com">
        Using US_ENGLISH in Soundex caused an NullPointerException.
      </action>
      <action dev="tobrien" type="fix" issue="CODEC-6" due-to="David Tonhofer">
        Source tarball spews files all over the place.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-22" due-to="Piero Ottuzzi">
        Base64.isArrayByteBase64() throws an ArrayIndexOutOfBoundsException for negative octets
      </action>
      <action dev="jochen" type="add" issue="CODEC-69" due-to="Julius Davies">
        Streaming Base64 (Base64InputStream and Base64OutputStream added).
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-78" due-to="Julius Davies">
        Base64: Improve Code Coverage.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-59" due-to="Julius Davies">
        Add methods to Base64 which work with String instead of byte[].
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-81" due-to="Julius Davies">
        Base64's new constructor parameters ignored.
      </action>
      <action dev="niallp" type="fix" issue="CODEC-83">
        Improve Double Metaphone test coverage.
      </action>
      <action dev="niallp" type="fix" issue="CODEC-84">
        Double Metaphone bugs in alternative encoding.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-73" due-to="Benjamin Bentmann">
        Make string2byte conversions independent of platform default encoding.
      </action>
    </release>
    <release version="1.3" date="10 July 2004" description="Feature and fix release.">
      <action dev="ggregory, tobrien" type="add" issue="CODEC-21" due-to="Alex Karasulu">
        BinaryCodec: Encodes and decodes binary to and from Strings of 0s and 1s.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-41" due-to="Oleg Kalnichevski" due-to-email="olegk@apache.org">
        QuotedPrintableCodec: Codec for RFC 1521 MIME (Multipurpose Internet
        Mail Extensions) Part One. Rules #3, #4, and #5 of the quoted-printable spec
        are not implemented yet. See also issue CODEC-46.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-41" due-to="Oleg Kalnichevski" due-to-email="olegk@apache.org">
        BCodec: Identical to the Base64 encoding defined by RFC 1521 and allows a
        character set to be specified.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-41" due-to="Oleg Kalnichevski" due-to-email="olegk@apache.org">
        QCodec: Similar to the Quoted-Printable content-transfer-encoding defined
        in RFC 1521 and designed to allow text containing mostly ASCII characters to
        be decipherable on an ASCII terminal without decoding.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-45" due-to="Matthew Inger" due-to-email="mattinger@yahoo.com">
        Soundex: Implemented the DIFFERENCE algorithm.
      </action>
      <action dev="ggregory" type="add" issue="CODEC-45" due-to="Matthew Inger" due-to-email="mattinger@yahoo.com">
        RefinedSoundex: Implemented the DIFFERENCE algorithm.
      </action>
      <action dev="ggregory" type="update">
        This version is released under the
        &lt;a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0&lt;/a>
        , please see LICENSE.txt. Previous versions were released under the
        &lt;a href="https://www.apache.org/licenses/LICENSE-1.1">Apache License 1.1&lt;/a>
      </action>
      <action dev="ggregory" type="update">
        The Board recommendation to remove Javadoc author tags has been
        implemented. All author tags are now "Apache Software Foundation".
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-25" due-to="Oleg Kalnichevski" due-to-email="olegk@apache.org">
        The default URL encoding logic was broken.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-31" due-to="Gary D. Gregory">
        Base64 chunked encoding not compliant with RFC 2045 section 2.1 CRLF.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-5">
        Hex converts illegal characters to 255.
      </action>
      <action dev="tobrien" type="fix" issue="CODEC-17">
        Metaphone now correctly handles a silent B in a word that ends in MB.
        "COMB" is encoded as "KM", before this fix "COMB" was encoded as "KMB".
      </action>
      <action dev="ggregory" type="fix">
        Added missing tags in Javadoc comments.
      </action>
      <action dev="ggregory" type="fix">
        General Javadoc improvements.
      </action>
    </release>
    <release version="1.2" date="24 Nov 2003" description="Feature and fix release.">
      <action dev="tobrien" type="add" due-to="Oleg Kalnichevski" due-to-email="olegk@apache.org">
        URLCodec: Implements the www-form-urlencoded encoding scheme.
      </action>
      <action dev="tobrien" type="add" due-to="Dave Dribin, David Graham">
        DigestUtils: Calculates MD5 and SHA digests.
      </action>
      <action dev="tobrien" type="fix" issue="CODEC-26" due-to="Brian Ewins">
        Modified Base64 to remedy non-compliance with RFC
        2045. Non-Base64 characters were not being discarded during the
        decode. RFC 2045 explicitly states that all characters outside of the
        base64 alphabet are to be ignored.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-4">
        Hex.decode(Object) throws a ClassCastException when a String argument is passed in.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-3">
        Soundex: The HW rule is not applied; hyphens and apostrophes are not ignored.
      </action>
      <action dev="ggregory" type="fix" issue="CODEC-29">
        Soundex.setMaxLength causes bugs and is not needed.
        Calling Soundex.setMaxLength() with a value of 2 or less causes the wrong
        answer to be returned. Since the encoding returned by Soundex is always
        of length 4 by definition (we do not use the '-' in as a letter-nnn
        separator) the need for a maxLength attribute is not needed. Deprecate
        the field and accessor methods.
      </action>
      <action dev="Members" type="fix">
        Fix in Metaphone relating to the handling of the maximum code length.
      </action>
    </release>
    <release version="1.1" date="29 April 2003"
      description="The first official release. Numerous projects had been depending on version 1.0-dev while in the Sandbox.">
      <action dev="Members" type="add">
        A newer version of the Base64 class reflecting improvements from
        both the commons-httpclient and xml-rpc versions of code forked
        from catalina.
      </action>
      <action dev="Members" type="add">
        Base64 class from commons-httpclient in org.apache.commons.codec.base64
        has been retained for backwards compatibility but has been deprecated.
      </action>
      <action dev="Members" type="add">
        Soundex class from commons-util in org.apache.commons.codec.
      </action>
      <action dev="Members" type="add">
        Metaphone class from commons-util in org.apache.commons.codec.
      </action>
      <action dev="tobrien" type="add">
        RefinedSoundex class in org.apache.commons.codec.
      </action>
      <action dev="Members" type="add">
        Encoder/Decoder interfaces in org.apache.commons.
      </action>
      <action dev="Members" type="add">
        String and Binary specific Encoder/Decoder interfaces in org.apache.commons.
      </action>
      <action dev="Members" type="add">
        StringEncoderComparator replaces the SoundexComparator from the language package.
      </action>
      <action dev="Members" type="fix">
        Base64 now discards whitespace characters when decoding encoded content.
      </action>
    </release>
    <release version="1.0-dev" date="25 April 2003" description="Last release from the Sandbox.">
      <action dev="tobrien" type="add">
        Base64 class from commons-httpclient in org.apache.commons.codec.base64.
      </action>
      <action dev="tobrien" type="add">
        Soundex class from commons-util in org.apache.commons.codec.
      </action>
      <action dev="tobrien" type="add">
        Metaphone class from commons-util in org.apache.commons.codec.
      </action>
      <action dev="Members" type="add">
        SoundexComparator class from commons-util in org.apache.commons.codec.
      </action>
    </release>
  </body>
</document>
