~~ Licensed 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
~~
~~   http://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. See accompanying LICENSE file.

  ---
  Apache Oozie Credits
  ---
  ---
  ${maven.build.timestamp}

Apache Oozie(TM) Credits

* Oozie Committers


*----------------------+-----------------------+----------------------------------------------------------------------+
||Who                  ||userid                ||Organization                                                         |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Mohammad Islam        |kamrul                 |Yahoo Inc.                                                            |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Alejandro Abdelnur    |tucu                   |Cloudera Inc.                                                         |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Angelo Huang          |angeloh                |Yahoo Inc.                                                            |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Andreas Neumann       |anew                   |Yahoo Inc.                                                            |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Mayank Bansal         |mayank                 |EBay Inc.                                                             |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Chao Wang             |brookwc                |IBM Corporation                                                       |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Virag Kothari         |virag                  |Yahoo Inc.                                                            |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Harsh Chouraria       |harsh                  |Cloudera Inc.
*----------------------+-----------------------+----------------------------------------------------------------------+

* Contributors

  A list of Oozie contributors and their contributions is available from
  {{{https://issues.apache.org/jira/browse/OOZIE}JIRA}}.

* Oozie Mentors

*----------------------+-----------------------+----------------------------------------------------------------------+
||Who                  ||userid                ||Organization                                                         |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Alan Gates            |gates                  |Hortonworks Inc.                                                      |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Christopher Douglas   |cdouglas               |Microsoft Corporation                                                 |
*----------------------+-----------------------+----------------------------------------------------------------------+
|Devaraj Das    |ddas               |Hortonworks Inc.
*----------------------+-----------------------+----------------------------------------------------------------------+

