
Apache Iceberg
Copyright 2017-2023 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

--------------------------------------------------------------------------------

NOTICE for Group: commons-codec  Name: commons-codec  Version: 1.15

src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
contains test data from http://aspell.net/test/orig/batch0.tab.
Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

===============================================================================

The content of package org.apache.commons.codec.language.bm has been translated
from the original php source code available at http://stevemorse.org/phoneticinfo.htm
with permission from the original authors.
Original source copyright:
Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

--------------------------------------------------------------------------------

NOTICE for Group: software.amazon.awssdk  Name: annotations  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: apache-client  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: arns  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: auth  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: aws-core  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: aws-json-protocol  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: aws-query-protocol  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: aws-xml-protocol  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: dynamodb  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: endpoints-spi  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: glue  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: http-client-spi  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: iam  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: json-utils  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: kms  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: lakeformation  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: metrics-spi  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: netty-nio-client  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: profiles  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: protocol-core  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: regions  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: s3  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: sdk-core  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: sso  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: sts  Version: 2.20.131
NOTICE for Group: software.amazon.awssdk  Name: utils  Version: 2.20.131

AWS SDK for Java 2.0
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

This product includes software developed by
Amazon Technologies, Inc (http://www.amazon.com/).

**********************
THIRD PARTY COMPONENTS
**********************
This software includes third party software subject to the following copyrights:
- XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty.
- PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.
- Apache Commons Lang - https://github.com/apache/commons-lang
- Netty Reactive Streams - https://github.com/playframework/netty-reactive-streams
- Jackson-core - https://github.com/FasterXML/jackson-core
- Jackson-dataformat-cbor - https://github.com/FasterXML/jackson-dataformats-binary

The licenses for these third party components are included in LICENSE.txt

--------------------------------------------------------------------------------

NOTICE for Group: software.amazon.awssdk  Name: third-party-jackson-core  Version: 2.20.18

# Jackson JSON processor

Jackson is a high-performance, Free/Open Source JSON processing library.
It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
been in development since 2007.
It is currently developed by a community of developers.

## Licensing

Jackson 2.x core and extension components are licensed under Apache License 2.0
To find the details that apply to this artifact see the accompanying LICENSE file.

## Credits

A list of contributors may be found from CREDITS(-2.x) file, which is included
in some artifacts (usually source distributions); but is always available
from the source code management (SCM) system project uses.
