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

+--------------------+--------------------------------+-----------------------------------------------+
| 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              |
+--------------------+--------------------------------+-----------------------------------------------+
| Xing 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              |
+--------------------+--------------------------------+-----------------------------------------------+

