//**
source: github.com/go-dronex/dronex@v0.0.0-20181220013224-9a7e689831e9/LICENSE
**//
{{Types "Apache-2.0"}}

The Drone Community Edition
(( (the "Community Edition") ))??
is licensed under the Apache License, Version 2.0 (the "Apache License").
You may obtain a copy of the Apache License at

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

((
The Drone Enterprise Edition (the "Enterprise Edition") is licensed under
the Drone Enterprise License, Version 1.1 (the "Enterprise License"). A copy
of the Enterprise License is provided below.

||

The Drone Enterprise Edition is licensed under the Drone
Non-Commercial License (the "Non-Commercial License"). A copy of
the Non-Commercial License is provided below.
))

((
The source files in this repository have a header indicating which license
they are under. The
((BUILDING || BUILDING_OSS))
file provides instructions for creating the
Community Edition distribution subject to the terms of the Apache License.
))??

((

Licensor:             Drone.IO, Inc
Licensed Work:        Drone Enterprise Edition

Additional Use Grant: Usage of the software is free for entities with both:
                      (a) annual gross revenue under (USD) $1 million
                      (according to GAAP, or the equivalent in its country
                      of domicile); and (b) less than (USD) $5 million in
                      aggregate debt and equity funding. 

Change Date:          2022-01-01

Change License:       Apache-2.0

Notice

The Drone Enterprise License (this document, or the "License") is not an Open
Source license. However, the Licensed Work will eventually be made available
under an Open Source License, as stated in this License.
))??

((
Drone Non-Commercial License

Contributor: Drone.IO, Inc.

Source Code: __8__

This license lets you use and share this software for free,
with a trial-length time limit on commercial use. Specifically:

If you follow the rules below, you may do everything with this
software that would otherwise infringe either the contributor's
copyright in it, any patent claim the contributor can license
that covers this software as of the contributor's latest
contribution, or both.

1. You must limit use of this software in any manner primarily
   intended for or directed toward commercial advantage or
   private monetary compensation to a trial period of 32
   consecutive calendar days. This limit does not apply to use in
   developing feedback, modifications, or extensions that you
   contribute back to those giving this license.

2. Ensure everyone who gets a copy of this software from you, in
   source code or any other form, gets the text of this license
   and the contributor and source code lines above.

3. Do not make any legal claim against anyone for infringing any
   patent claim they would infringe by using this software alone,
   accusing this software, with or without changes, alone or as
   part of a larger application.

You are excused for unknowingly breaking rule 1 if you stop
doing anything requiring this license within 30 days of
learning you broke the rule.

**This software comes as is, without any warranty at all. As far
as the law allows, the contributor will not be liable for any
damages related to this software or this license, for any kind of
legal claim.**
))??

((
Drone Enterprise License 1.1

Terms

The Licensor hereby grants you the right to copy, modify, create derivative
works, redistribute, and make non-production use of the Licensed Work. The
Licensor may make an Additional Use Grant, above, permitting limited
production use.

Effective on the Change Date, or the fourth anniversary of the first publicly
available distribution of a specific version of the Licensed Work under this
License, whichever comes first, the Licensor hereby grants you rights under
the terms of the Change License, and the rights granted in the paragraph
above terminate.

If your use of the Licensed Work does not comply with the requirements
currently in effect as described in this License, you must purchase a
commercial license from the Licensor, its affiliated entities, or authorized
resellers, or you must refrain from using the Licensed Work.

All copies of the original and modified Licensed Work, and derivative works
of the Licensed Work, are subject to this License. This License applies
separately for each version of the Licensed Work and the Change Date may vary
for each version of the Licensed Work released by Licensor.

You must conspicuously display this License on each original or modified copy
of the Licensed Work. If you receive the Licensed Work in original or
modified form from a third party, the terms and conditions set forth in this
License apply to your use of that work.

Any use of the Licensed Work in violation of this License will automatically
terminate your rights under this License for the current and all other
versions of the Licensed Work.

This License does not grant you any right in any trademark or logo of
Licensor or its affiliates (provided that you may use a trademark or logo of
Licensor as expressly required by this License).

TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
TITLE.
))??

((
Waiver: Individual and Small Business

Contributor waives the terms of rule 1 for companies meeting all
the following criteria, counting all subsidiaries and affiliated
entities as one:

1. worldwide annual gross revenue under $5 million US dollars,
   per generally accepted accounting principles

2. less than $5 million US dollars in all-time aggregate debt and
   equity financing

Contributor will not revoke this waiver, but may change terms for
future versions of the software.
))??

((
Waiver: Low Usage

Contributor waives the terms of rule 1 for companies meeting all
the following criteria, counting all subsidiaries and affiliated
entities as one:

1. less than 5,000 total pipelines executed using this software
   in the immediately preceding, year-long period

Contributor will not revoke this waiver, but may change terms for
future versions of the software.
))??
