.. 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

   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.


The SINGA Team
==============

A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.

Mentors
-------

==================   ============
Name                 Email
==================   ============
Daniel Dai           daijy@apache.org
Ted Dunning          tdunning@apache.org
Alan Gates           gates@apache.org
Thejas Nair          thejas@apache.org
==================   ============


Developers
----------

The SINGA community has developers mainly from National University of Singapore, Zhejiang University, NetEase, Osaka University, yzBigData, etc.

+--------------------+--------------------------------+-----------------------------------------------+
| Name               | Email                          | Organization                                  |
+====================+================================+===============================================+
| Gang Chen          | cg@zju.edu.cn                  | Zhejiang University                           |
+--------------------+--------------------------------+-----------------------------------------------+
| Haibo Chen         | hzchenhaibo@corp.netease.com   | NetEase                                       |
+--------------------+--------------------------------+-----------------------------------------------+
| Anh Dinh           | dinhtta@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Jinyang Gao        | jinyang@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Xin Ji             | jixin@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Chonho Lee         | chonho@gmail.com               | Osaka University                              |
+--------------------+--------------------------------+-----------------------------------------------+
| Zhaojing Luo       | zhaojing@apache.org            | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Beng Chin Ooi      | ooibc@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Kian-Lee Tan       | tankl@apache.org               | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Anthony K. H. Tung | atung@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Ji Wang            | wangji@comp.nus.edu.sg         | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Sheng Wang         | wangsh@apache.org              | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Wei Wang           | wangwei@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Yuan Wang          | wangyuan@corp.netease.com      | NetEase                                       |
+--------------------+--------------------------------+-----------------------------------------------+
| Wenfeng Wu         | wuwf@comp.nus.edu.sg           | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Zhongle Xie        | zhongle@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Meihui Zhang       | meihui_zhang@sutd.edu.sg       | Singapore University of Technology and Design |
+--------------------+--------------------------------+-----------------------------------------------+
| Kaiping Zheng      | kaiping@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Moaz Reyad         | moaz@apache.org                | University of Genoa                           |
+--------------------+--------------------------------+-----------------------------------------------+
| Chang Yao          | yaochang2009@gmail.com         | yzBigdata                                     |
+--------------------+--------------------------------+-----------------------------------------------+
