Apache NLPCraft is an effort undergoing incubation at The Apache Software Foundation (ASF),
sponsored by the Apache Incubator. Incubation is required of all newly accepted projects
until a further review indicates that the infrastructure, communications, and decision
making process have stabilized in a manner consistent with other successful ASF projects.
While incubation status is not necessarily a reflection of the completeness or stability
of the code, it does indicate that the project has yet to be fully endorsed by the ASF.

Some of the incubating project's releases may not be fully compliant with ASF policy. For
example, releases may have incomplete or un-reviewed licensing conditions. What follows is
a list of known issues the project is currently aware of (note that this list, by definition,
is likely to be incomplete):

 * Releases may have incomplete licensing conditions.

If you are planning to incorporate this work into your product/project, please be aware that
you will need to conduct a thorough licensing review to determine the overall implications of
including this work. For the current status of this project through the Apache Incubator
visit: https://incubator.apache.org/projects/nlpcraft.html