<?php
/**
 * Copyright (c) 2014, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation) - initial API and implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<div class="col-xs-24">
  <h1><?php print $pageTitle; ?></h1>
  <p>The Eclipse Foundation is looking for college and university students and professors to organize Eclipse Campus DemoCamps
    from November 1-30, 2010.  Building on the success of our regular <a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2010">DemoCamp series</a>,
    we would like to host similar events aimed at students.
  </p>
  <b>Overview</b><br>
  <p>The regular Eclipse DemoCamps are an opportunity to showcase cool technology in the Eclipse community and to meet
    other Eclipse enthusiasts in your city.	Campus DemoCamps are special because demos will be presented by students and professors.
    Topics can include class projects you're working on in Eclipse, an overview of
    an Eclipse project you find interesting, tips and tricks you find useful in Eclipse or anything else
    Eclipse-related that you think might be of interest to other students.
  </p>
  <b>Mentor Companies</b><br>
  <p>For some extra help, you are welcome to invite an Eclipse member company to mentor your DemoCamp.
    Your mentor company can present at the event and may provide additional sponsorship funds. We will post
    their logo on the DemoCamp&#146;s wiki page and they should be acknowledged at the DemoCamp itself.  If
    you'd like help finding a mentor company, please <a href="mailto:democamps@eclipse.org">let us know</a>.
  </p>
  <b>Organizing Guidelines</b>
  <ul>
    <li>You can organize the event any time from November 1-30, 2010.</li>
    <li>The event should be held somewhere on campus at your university or college with any needed a/v
      equipment, like a projector and laptop, available.
    </li>
    <li>Attendees and presenters should be encouraged to register their participation on the
      <a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2010">Eclipse DemoCamp Wiki</a>. We
      can help you get started with a wiki page.
    </li>
    <li>We encourage you to help promote the DemoCamp on campus and to recruit students to present.</li>
    <li>We ask that as the organizer, you also act as the host of the DemoCamp and introduce each presenter.  We recommend keeping
      each demo to no more than 15 minutes.
    </li>
    <li>You must post pictures online after the event. This can be done on the wiki, a web page or any photo sharing site
      such as Flickr, Picasa or Shutterfly.
    </li>
  </ul>
  <b>Funding Information</b>
  <ul>
    <li>In order to qualify for Eclipse funding for a Campus DemoCamp you must be a university or college
      student or instructor with an interest in Eclipse.
    </li>
    <li>Funding will be available for 10 Campus DemoCamps. Any requests beyond this maximum will be placed on a waiting list.</li>
    <li>The Eclipse Foundation will sponsor each event up to $300 USD. The sponsorship funds are to
      help cover the cost of refreshments, snacks and room rental only. We limit the sponsorship
      to $20/attendee, so if you have 10 attendees the limit will be $200 USD. Items such as give-aways, prizes and
      travel expenses are not covered.
    </li>
    <li>An expense form will be emailed to you.  You will need to return this form along with your receipts in order to be
      reimbursed.
    </li>
    <li>You may invite an Eclipse member company as a mentor for your DemoCamp.  The mentor company can
      present at the DemoCamp and may provide additional sponsorship funds.  You can post their logo
      on the DemoCamp wiki page and should acknowledge them at the event.
    </li>
  </ul>
  <b>Sign Up</b><br>
  <p>Please contact <a href="mailto:democamps@eclipse.org">democamps@eclipse.org</a> to register your
    DemoCamp or for more information.
  </p>
  <br><br>
</div>