You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/04/02 21:23:40 UTC

[01/24] merging upstream

Repository: incubator-usergrid
Updated Branches:
  refs/heads/master 72b5753a0 -> 1b4038a5d
  refs/pull/96/merge 2b74416bd -> 3bcaa4229 (forced update)
  refs/pull/97/merge [deleted] eac47a35e


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/test/coverage/instrument/js/usergrid.min.js
----------------------------------------------------------------------
diff --git a/portal/test/coverage/instrument/js/usergrid.min.js b/portal/test/coverage/instrument/js/usergrid.min.js
index 0edcba4..6429365 100644
--- a/portal/test/coverage/instrument/js/usergrid.min.js
+++ b/portal/test/coverage/instrument/js/usergrid.min.js
@@ -1,3 +1,3 @@
-/*! usergrid@2.0.2 2014-03-31 */
+/*! usergrid@2.0.2 2014-04-01 */
 angular.module("appservices").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("activities/activities.html",'<section class="row-fluid">\n  <div class="span12">\n    <div class="page-filters">\n      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n    </div>\n  </div>\n\n</section>\n<section class="row-fluid">\n  <div class="span12 tab-content">\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Date</td>\n        <td></td>\n        <td>User</td>\n        <td>Content</td>\n        <td>Verb</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="activity in activities">\n        <td>{{formatDate(activity.created)}}</td>\n        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n        </td>\n        <td>{{activity.actor.displayName}}</td>\n        <td>{{activity.content}}</td>\n        <td>{{activity.verb}}</td>\n  
       <td>{{activity.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n</section>'),$templateCache.put("app-overview/app-overview.html",'<div class="app-overview-content" >\n  <section class="row-fluid">\n\n      <page-title title=" Summary" icon="&#128241;"></page-title>\n  <section class="row-fluid">\n      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n  </section>\n  <section class="row-fluid">\n\n    <div class="span6">\n      <chart id="appOverview"\n             chartdata="appOverview.chart"\n             type="column"></chart>\n    </div>\n\n    <div class="span6">\n      <table class="table table-striped">\n        <tr class="table-header">\n          <td>Path</td>\n          <td>Title</td>\n        </tr>\n        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n          <td>{{v.title}}</td>\n          <td>{{v.count}}</td>\n        </tr>\n      </table>\n    </div>\n\n  </section>\n</div>'),$templateCache.put("app-overview/doc-includ
 es/android.html",'<h2>1. Integrate the SDK into your project</h2>\n<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n\n<ul class="nav nav-tabs" id="myTab">\n	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n</ul>\n\n<div class="tab-content">\n	<div class="tab-pane active" id="existing_project">\n		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n		<p>If you\'ve already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n		<div id="collapse">\n			<a href="#jar_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n		</div>\n		<div id="jar_collapse" class="collapse">\n			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doin
 g the following:</p>\n	\n			<h3>Android 4.0 (or later) projects</h3>\n			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n			\n			<h3>Android 3.0 (or earlier) projects</h3>\n			<ol>\n				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application\'s project folder.</li>\n				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the top of the class path:\n					<ol>\n						<li>In the Eclipse <strong>Package Explorer</strong>, select your application\'s project folder.</li>\n						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n						<li>In the properties dialog, in the&n
 bsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n						<li>\n							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n						</li>\n					</ol>\n				</li>\n			</ol>\n			<div class="warning">\n				<h3>Applications using Ant</h3>\n				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n			</div>\n		</div>\n	</div>\n	<div class="tab-pane" id="new_project">\n		<a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n		<p>If you don\'t have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n		<ul>\n			<li>Locate the project template in the expanded SDK. It should be at the following location:\n
 				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n			</li>\n		</ul>\n	</div>\n</div>\n<h2>2. Update permissions in AndroidManifest.xml</h2>\n<p>Add the following Internet permissions to your application\'s <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n<pre>\n&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n</pre>\n<h2>3. Initialize the SDK</h2>\n<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the fo
 llowing:</p>\n<ol>\n	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n		<pre>\npublic class YourApplication extends Application\n{\n        \n        private ApigeeClient apigeeClient;\n        \n        public YourApplication()\n        {\n                this.apigeeClient = null;\n        }\n        \n        public ApigeeClient getApigeeClient()\n        {\n                return this.apigeeClient;\n        }\n        \n        public void setApigeeClient(ApigeeClient apigeeClient)\n        {\n                this.apigeeClient = apigeeClient;\n        }\n}			\n		</pre>\n	</li>\n	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n		<pre>\n&lt;application&gt;\n    android:allowBackup="true"\n    android:icon="@drawable/ic_launcher"\n    android:label="@string/app_name"\n    android:name=".YourApplication"\n	…\n&lt;/app
 lication&gt;			\n		</pre>\n	</li>\n	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n		<pre>\nimport com.apigee.sdk.ApigeeClient;\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);		\n	\n	String ORGNAME = "{{currentOrg}}";\n	String APPNAME = "{{currentApp}}";\n	\n	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseContext());\n\n	// hold onto the ApigeeClient instance in our application object.\n	yourApp = (YourApplication) getApplication;\n	yourApp.setApigeeClient(apigeeClient);			\n}\n		</pre>\n		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n	</li>\n</ol>\n<h2>4. Import additional SDK classes</h2>\n<p>The following classes will enable you to call common SDK methods:</p>\n<pre>\nimport com.apigee.sdk.data.client.DataClient; //App Services data methods\nim
 port com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\nimport com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\nimport com.apigee.sdk.data.client.response.ApiResponse; //API response object\n</pre>\n		\n<h2>5. Verify SDK installation</h2>\n\n<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n<p>To verify that the SDK has been properly initialized, run your app, then go to \'Monitoring\' > \'App Usage\' in the <a href="https://www.apigee.com/usergrid">App Services admin portal</a> to verify that data is being sent.</p>\n<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n\n<h2>Installation complete! Try these next steps</h2>\n<ul>\n	<li>\n		<h3><strong>Call addit
 ional SDK methods in your code</strong></h3>\n		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n		<ul>\n			<li>\n				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n				<p>Use this object to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</p>\n			</li>\n			<li>\n				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n			</li>\n		</ul>\n	</li>	\n	<li>	\n		<h3><strong>Add App Services features to your app</strong></h3>\n		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links
  to get started with a few of our most popular features:</p>\n		<ul>\n			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n				<ul>\n					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n					<li><strong><a 
 href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n					<li><strong><a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n				</ul>		\n			</li>\n			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about deali
 ng with a database ever again.</li>\n			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n		</ul>\n	</li>\n	<li>	\n		<h3><strong>Check out the sample apps</strong></h3>\n		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You\'ll find the samples in the following location in your SDK download:</p>\n		<pre>\napigee-android-sdk-&lt;version&gt;\n	...\n	/samples\n		</pre>\n		<div id="collapse">\n			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n		</div>\n		<div id="samples_collapse" class="collapse">\n			<p>The samples include the following:</p>\n			<table class="table">\n				<thead>\n					<tr>\n						<th scope="col">Sample</th>\n						<th scope="col">Description</th>\n					</tr>\n				</thead>\n				<tbody>\
 n					<tr>\n						<td>books</td>\n						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n					</tr>\n					<tr>\n						<td>messagee</td>\n						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n					</tr>\n					<tr>\n						<td>push</td>\n						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n					</tr>\n				</tbody>\n			</table>\n		</div>\n	</li>\n</ul>\n'),$templateCache.put("app-overview/doc-includes/ios.html",'<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n<ul class="nav nav-tabs" id="myTab">\n	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n</ul>\n<div class="tab-content">\n	<div class="tab-pane activ
 e" id="existing_project">\n		<p>If you\'ve already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n		<div id="collapse"><a class="btn" data-toggle="collapse" href="#framework_collapse">Details</a></div>\n		<div class="collapse" id="framework_collapse">\n			<ol>\n				<li>\n					<p>Locate the SDK framework file so you can add it to your project. For example, you\'ll find the file at the following path:</p>\n					<pre>\n&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n				</li>\n				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n				<li>Link the Apigee iOS SDK into your project.\n					<ul>\n						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n					</ul>\n					<p>OR</p>\n					<ol>\n						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</
 strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n						<li>Navigate to the directory that contains ApigeeiOSSDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n					</ol>\n				</li>\n			</ol>\n		</div>\n	</div>\n	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n		<p>If you\'re starting with a clean slate (you don\'t have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n		<ol>\n			<li>\n				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n				<pre>\n&lt;sdk_root&gt;/new-project-template</pre>\n			</li>\n			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n			<li>Get acquainted with the template by looking at its readme file.</li>\n		</ol>\n	</div>\n</div>\n<h2>2. Add required iOS framework
 s</h2>\n<p>Ensure that the following iOS frameworks are part of your project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n<ul>\n	<li>QuartzCore.framework</li>\n	<li>CoreLocation.framework</li>\n	<li>CoreTelephony.framework&nbsp;</li>\n	<li>Security.framework</li>\n	<li>SystemConfiguration.framework</li>\n	<li>UIKit.framework</li>\n</ul>\n<h2>3. Update \'Other Linker Flags\'</h2>\n<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n<pre>\n-ObjC -all_load</pre>\n<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n<h2>4. Initialize the SDK</h2>\n<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are a
 vailable in the <em>Getting Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n<ol>\n	<li>Import the SDK\n		<p>Add the following to your source code to import the SDK:</p>\n		<pre>\n#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n	</li>\n	<li>\n		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n		<pre>\n@property (strong, nonatomic) ApigeeClient *apigeeClient; \n@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n		</pre>\n	</li>\n	<li>\n		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n		<pre>\n//Replace \'AppDelegate\' with the name of your app delegate class to instantiate it\nAppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n\n//Sepcify your App Services organiz
 ation and application names\nNSString *orgName = @"{{currentOrg}}";\nNSString *appName = @"{{currentApp}}";\n\n//Instantiate ApigeeClient to initialize the SDK\nappDelegate.apigeeClient = [[ApigeeClient alloc]\n                            initWithOrganizationId:orgName\n                            applicationId:appName];\n                            \n//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\nself.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \nself.dataClient = [appDelegate.apigeeClient dataClient]; \n		</pre>\n	</li>\n</ol>\n\n<h2>5. Verify SDK installation</h2>\n\n<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n\n<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>\'Monitoring\' > \'App Usage\'</strong> in the <a href="https://www.apigee.com/usergrid"
 >App Services admin portal</a> to verify that data is being sent.</p>\n<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n\n<h2>Installation complete! Try these next steps</h2>\n<ul>	\n	<li>\n		<h3><strong>Call additional SDK methods in your code</strong></h3>\n		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n		<div class="collapse" id="client_collapse">\n			<ul>\n				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration
  and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n			</ul>\n			<h3>Example</h3>\n			<p>For example, you could create a new entity with the following:</p>\n			<pre>\nAppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\nApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n			</pre>\n		</div>\n\n	</li>\n	<li>\n		<h3><strong>Add App Services features to your app</strong></h3>\n		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n		<ul>\n			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per 
 month for free!</li>\n			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n		</ul>\n	</li>\n	<li>\n		<h3><strong>Check out the sample apps</strong></h3>\n		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_bla
 nk" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n		<p>You\'ll find the samples in the following location in your SDK download:</p>\n		<pre>\napigee-ios-sdk-&lt;version&gt;\n    ...\n    /samples\n		</pre>\n		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n		<div class="collapse" id="samples_collapse">\n			<p>The samples include the following:</p>\n			<table class="table">\n				<thead>\n					<tr>\n						<th scope="col">Sample</th>\n						<th scope="col">Description</th>\n					</tr>\n				</thead>\n				<tbody>\n					<tr>\n						<td>books</td>\n						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n					</tr>\n					<tr>\n						<td>messagee</td>\n						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n					</tr>\n					<tr>\n		
 				<td>push</td>\n						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n					</tr>\n				</tbody>\n			</table>\n		</div>\n		<p>&nbsp;</p>\n	</li>\n</ul>\n'),$templateCache.put("app-overview/doc-includes/javascript.html",'<h2>1. Import the SDK into your HTML</h2>\n<p>To enable support for Apigee-related functions in your HTML, you\'ll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n<pre>\n&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n</pre>\n<h2>2. Instantiate Apigee.Client</h2>\n<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n<pre>\n//Apigee account credentials, available in the 
 App Services admin portal \nvar client_creds = {\n        orgName:\'{{currentOrg}}\',\n        appName:\'{{currentApp}}\'\n    }\n\n//Initializes the SDK. Also instantiates Apigee.MonitoringClient\nvar dataClient = new Apigee.Client(client_creds);  \n</pre>\n\n<h2>3. Verify SDK installation</h2>\n\n<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n\n<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>\'Monitoring\' > \'App Usage\'</strong> in the <a href="https://www.apigee.com/usergrid">App Services admin portal</a> to verify that data is being sent.</p>\n<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n\n<h2>Installation complete! Try these next steps</h2>\n<ul>\n	<li>	\n		<
 h3><strong>Call additional SDK methods in your code</strong></h3>\n		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n		<div id="collapse">\n			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n		</div>\n		<div id="client_collapse" class="collapse">\n			<ul>\n				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n				<li><code>dataClient.monitor</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n			</ul>\n		</div>\n	</li>	\n	<li>\n		<h3><strong>Add App Services features to your app</strong></h3>\n		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these li
 nks to get started with a few of our most popular features:</p>\n		<ul>\n			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n		</
 ul>\n	</li>\n	<li>\n		<h3><strong>Check out the sample apps</strong></h3>\n		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You\'ll find the samples in the following location in your SDK download:</p>\n		<pre>\napigee-javascript-sdk-master\n    ...\n    /samples		\n		</pre>\n		<div id="collapse">\n			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n		</div>\n		<div id="samples_collapse" class="collapse">\n			<p>The samples include the following:</p>\n			<table class="table">\n				<thead>\n					<tr>\n						<th scope="col">Sample</th>\n						<th scope="col">Description</th>\n					</tr>\n				</thead>\n				<tbody>\n					<tr>\n						<td>booksSample.html</td>\n						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n					</tr>\n					<tr>\n						<td>messagee</td>\n				
 		<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n					</tr>\n					<tr>\n						<td>monitoringSample.html</td>\n						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n					</tr>\n					<tr>\n						<td>readmeSample.html</td>\n						<td>A simple app for reading data from an Apigee database.</td>\n					</tr>\n				</tbody>\n			</table>\n		</div>	\n	</li>				\n</ul>\n'),$templateCache.put("app-overview/doc-includes/net.html",""),$templateCache.put("app-overview/doc-includes/node.html",""),$templateCache.put("app-overview/doc-includes/ruby.html",""),$templateCache.put("app-overview/getting-started.html",'<div class="setup-sdk-content" >\n\n  <bsmodal id="regenerateCredentials"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="regenerateCredentialsDialog"\
 n           extrabuttonlabel="Yes"\n           ng-cloak>\n    Are you sure you want to regenerate the credentials?\n  </bsmodal>\n\n    <page-title icon="&#128640;" title="Getting Started"></page-title>\n\n  <section class="row-fluid">\n\n\n\n\n    <div class="span8">\n\n      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n      <p>Click on a platform icon below to view SDK installation instructions for that platform.</p>\n      <ul class="inline unstyled">\n        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n\n\n        <li ng-click="showSDKDetail(\'ios\')
 "\n            analytics-on="click"\n            analytics-label="App Services"\n            analytics-category="Getting Started"\n            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n        <li ng-click="showSDKDetail(\'android\')"\n            analytics-on="click"\n            analytics-label="App Services"\n            analytics-category="Getting Started"\n            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n        <li ng-click="showSDKDetail(\'javascript\')"\n            analytics-on="click"\n            analytics-label="App Services"\n            analytics-category="Getting Started"\n            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n        <li><a target="_blank"\n               ng-click="showSDKDetail(\'nocontent\')"\n               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n               analytics-on="click"\n               analytics-label="App Services"\n  
              analytics-category="Getting Started"\n               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n        <li><a target="_blank"\n               ng-click="showSDKDetail(\'nocontent\')"\n               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ruby"\n               analytics-on="click"\n               analytics-label="App Services"\n               analytics-category="Getting Started"\n               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n        <li><a target="_blank"\n               ng-click="showSDKDetail(\'nocontent\')"\n               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n               analytics-on="click"\n               analytics-label="App Services"\n               analytics-category="Getting Started"\n               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n       </ul>\n\n      <section id="intro-container" class="row
 -fluid intro-container">\n\n        <div class="sdk-intro">\n        </div>\n\n        <div class="sdk-intro-content">\n\n          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" target="_blank">\n            Download SDK\n          </a>\n          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n            More Docs\n          </a>\n          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n\n          <div ng-include="getIncludeURL()"></div>\n        </div>\n\n      </section>\n    </div>\n\n    <div class="span4 keys-creds">\n      <h2 class="title">Mobile sdk keys</h2>\n      <p>For mobile SDK initialization.</p>\n      <dl class="app-creds">\n        <dt>Org Name</dt>\n        <dd>{{currentOrg}}</dd>\n        <dt>App Name</dt>\n        <dd>{{currentApp}}</dd>\n      </dl>\n      <h2 class="title">Server app credentials</h2>\n      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n   
    <dl class="app-creds">\n        <dt>Client ID</dt>\n        <dd>{{clientID}}</dd>\n        <dt>Client Secret</dt>\n        <dd>{{clientSecret}}</dd>\n        <dt>\n           &nbsp;\n        </dt>\n        <dd>&nbsp;</dd>\n\n        <dt>\n          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n        </dt>\n        <dd></dd>\n      </dl>\n\n    </div>\n\n  </section>\n</div>'),$templateCache.put("data/data.html",'<div class="content-page">\n\n  <bsmodal id="newCollection"\n           title="Create new collection"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="newCollectionDialog"\n           extrabuttonlabel="Create"\n           buttonid="collection"\n           ng-cloak>\n    <fieldset>\n      <div class="control-group">\n        <label for="new-collection-name">Collection Name:</label>\n        <div class="controls">\n          <input type="text" ug-validate required ng-pattern="collection
 NameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n    </fieldset>\n  </bsmodal>\n\n  <page-title title=" Collections" icon="&#128254;"></page-title>\n\n  <section class="row-fluid">\n    <div class="span3 user-col">\n        <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n        <ul  class="user-list">\n          <li ng-class="queryCollection._type === entity.name ? \'selected\' : \'\'" ng-repeat="entity in collectionList" ng-click="loadCollection(\'/\'+entity.name);">\n            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n          </li>\n        </ul>\n\n  </div>\n\n    <div class="span9 tab-content">\n      <div class="content-page">\n      <form name="dataForm" ng-submit="run();">\n
         <fieldset>\n          <div class="control-group">\n            <div class="" data-toggle="buttons-radio">\n              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n              <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n              <input type="r
 adio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE\n            </div>\n          </div>\n\n          <div class="control-group">\n            <strong>Path </strong>\n            <div class="controls">\n              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n            </div>\n          </div>\n          <div class="control-group">\n            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n          </div>\n          <div class="control-group">\n            <strong>Query</strong>\n            <div class="controls">\n              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n              <div style="display
 :none">\n                <a class="btn dropdown-toggle " data-toggle="dropdown">\n                  <span id="query-collections-caret" class="caret"></span>\n                </a>\n                <ul id="query-collections-indexes-list" class="dropdown-menu ">\n                </ul>\n              </div>\n            </div>\n          </div>\n\n\n          <div class="control-group" ng-show="verb==\'GET\' || verb==\'DELETE\'">\n            <label class="control-label" for="query-limit"><strong>Limit</strong> <a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n            <div class="controls">\n              <div class="input-append">\n                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n              </div>\n            </div>\n          </div>\n\n          <div class="control-group" style="display:{{queryBodyDisplay}}">\n            <label class="control-label" for="query-source"><s
 trong>JSON Body</strong> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n            <div class="controls">\n            <textarea ng-model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n      { "name":"value" }\n            </textarea>\n              <br>\n            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n            </div>\n          </div>\n          <div style="clear: both; height: 10px;"></div>\n          <div class="control-group">\n            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n          </div>\n        </fieldset>\n       </form>\n'+"        <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n        <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n        <div ng-include=\"display=='groups' ? 'data/
 display-groups.html' : ''\"></div>\n        <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n\n      </div>\n\n      </div>\n    </section>\n\n\n\n\n</div>\n\n"),$templateCache.put("data/display-generic.html",'\n\n<bsmodal id="deleteEntities"\n         title="Are you sure you want to delete the entities(s)?"\n         close="hideModal"\n         closelabel="Cancel"\n         extrabutton="deleteEntitiesDialog"\n         extrabuttonlabel="Delete"\n         buttonid="del-entity"\n         ng-cloak>\n    <fieldset>\n        <div class="control-group">\n        </div>\n    </fieldset>\n</bsmodal>\n\n<span  class="button-strip">\n  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n</span>\n<table class="table table-striped collection-list">\n  <thead>\n  <tr class="table-header">\n    <th><input type="checkbox" n
 g-show="queryCollection._list.length > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n    <th ng-if="hasProperty(\'name\')">Name</th>\n    <th>UUID</th>\n    <th></th>\n  </tr>\n  </thead>\n  <tbody ng-repeat="entity in queryCollection._list">\n  <tr class="zebraRows" >\n    <td>\n      <input\n        type="checkbox"\n        id="entity-{{entity._data.name}}-cb"\n        ng-value="entity._data.uuid"\n        ng-model="entity.checked"\n        >\n    </td>\n    <td ng-if="hasProperty(\'name\')">{{entity._data.name}}</td>\n    <td>{{entity._data.uuid}}</td>\n    <td><a href="javaScript:void(0)" ng-click="entitySelected[$index] = !entitySelected[$index];selectEntity(entity._data.uuid)">{{entitySelected[$index] ? \'Hide\' : \'View\'}} Details</a></td>\n  </tr>\n  <tr ng-if="entitySelected[$index]">\n    <td colspan="5">\n\n\n      <h4 style="margin: 0 0 20px 0">Entity Detail</h4>\n\n
 \n      <ul class="formatted-json">\n        <li ng-repeat="(k,v) in entity._data track by $index">\n          <span class="key">{{k}} :</span>\n          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n          <span ng-switch on="isDeep(v)">\n            <ul ng-switch-when="true">\n              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n\n                <span ng-switch on="isDeep(v2)">\n                  <ul ng-switch-when="true">\n                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n                  </ul>\n                  <span ng-switch-when="false">\n                    <span class="value">{{v2}}</span>\n                  </span>\n                </span>\n              </li>\n            </ul>\n            <span ng-switch-when="false">\n              <span class="value">{{v}}</span>\n            </span>\n          </span>\n        </li>\n      <
 /ul>\n\n    <div class="control-group">\n      <h4 style="margin: 20px 0 20px 0">Edit Entity</h4>\n      <div class="controls">\n        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n        <br>\n        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n      </div>\n    </div>\n  </td>\n  </tr>\n\n  <tr ng-show="queryCollection._list.length == 0">\n    <td colspan="4">No data found</td>\n  </tr>\n  </tbody>\n</table>\n<div style="padding: 10px 5px 10px 5px">\n  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n  <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n</div>\n\n'),$templateCache.put("data/display-groups.html",""),$templateCache.put("data/displ
 ay-roles.html","roles---------------------------------"),$templateCache.put("data/display-users.html",'\n<table id="query-response-table" class="table">\n  <tbody>\n  <tr class="zebraRows users-row">\n    <td class="checkboxo">\n      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n    <td class="gravatar50-td">&nbsp;</td>\n    <td class="user-details bold-header">Username</td>\n    <td class="user-details bold-header">Display Name</td>\n    <td class="user-details bold-header">UUID</td>\n    <td class="view-details">&nbsp;</td>\n  </tr>\n  <tr class="zebraRows users-row">\n    <td class="checkboxo">\n      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n    </td>\n    <td class="gravatar50-td">\n      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n    </td>\n    <td
  class="details">\n      <a onclick="Usergrid.console.getCollection(\'GET\', \'/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/\'+\'bf9a95da-d508-11e2-bf44-236d2eee13a7\'); $(\'#data-explorer\').show(); return false;" class="view-details">10</a>\n    </td>\n    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n    <td class="view-details">\n      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n    </td>\n  </tr>\n  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n    <td colspan="5">\n      <div>\n        <div style="padding-bottom: 10px;">\n          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d50
 8-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n        </div>\n        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n              <pre>{\n  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n  "uuid": "bf9a95da-d508-11e2-bf44-236d2eee13a7",\n  "type": "user",\n  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n  "created": 1371224432557,\n  "modified": 1371851347024,\n  "username": "10",\n  "email": "fdsafdsa@ookfd.com",\n  "activated": "true",\n  "adr": {\n    "addr1": "",\n    "addr2": "",\n    "city": "",
 \n    "state": "",\n    "zip": "",\n    "country": ""\n  },\n  "metadata": {\n    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n    "sets": {\n      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n    },\n    "collections": {\n      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n      "devices": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n      "roles": "/users/8bb9a3fa-d508-1
 1e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n    }\n  },\n  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n}</pre>\n        </div>\n        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n          <table>\n            <tbody>\n            <tr>\n              <td>picture</td>\n              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>u
 sername</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr
 ><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>
 #&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n            </tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n    </td>\n  </tr>\n  </tbody>\n</table>'),$templateCache.put("data/entity.html",'<div class="content-page">\n\n  <h4>Entity Detail</h4>\n  <div class="well">\n    <a href="#!/data" class="outside-link"><< Back to collection</a>\n  </div>\n  <fieldset>\n    <div class="control-group">\n      <strong>Path </strong>\n      <div class="controls">\n        {{entityType}}/{{entityUUID}}\n      </div>\n    </div>\n\n    <div class="control-group">\n      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n      <div class="controls">\n        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n        <br>\n        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n      </div>\n    </div>\n    <div style="clear: both; height: 10px;"></div>\
 n    <div class="control-group">\n      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n    </div>\n  </fieldset>\n\n</div>\n\n'),$templateCache.put("data/shell.html",'<div class="content-page">\n  <div class="well">\n    <h2>Interactive Shell</h2>\n    <div style="float:right"><a target="_blank" href="http://apigee.com/docs/usergrid/content/usergrid-admin-portal" class="notifications-links">Learn more in our docs</a></div>\n  </div>\n\n  <div class="console-section-contents">\n    <div id="shell-input-div">\n      <p>   Type "help" to view a list of the available commands.</p><hr>\n      <span>&nbsp;&gt;&gt; </span>\n      <!--textarea id="shell-input" rows="2" autofocus="autofocus"></textarea-->\n    </div>\n    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;"><span class="pl
 n">                      </span><p><span class="pln">  </span><span class="typ">Response</span><span class="pun">:</span></p><hr><span class="pln">\n    </span></pre>\n  </div>\n</div>'),$templateCache.put("dialogs/modal.html",'    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n\n        <div class="modal-header">\n            <h1 class="title">{{title}}</h1>\n        </div>\n\n        <div class="modal-body" ng-transclude></div>\n        <div class="modal-footer">\n            {{footertext}}\n            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n                    ng-click="closeDelegate(close)">{{closelabel}}\n            </button>\n        </div>\n       
  </form>    </div>\n'),$templateCache.put("global/appswitcher-template.html",'<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n  <ul class="dropdown-menu pull-right">\n    <li id="globalNavSubmenuContainer">\n      <ul>\n        <li data-globalNavDetail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n      </ul>\n    </li>\n    <li id="globalNavDetail">\n      <div id="globalNavDetailApigeeHome">\n 
        <div class="globalNavDetailApigeeLogo"></div>\n        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n      </div>\n      <div id="globalNavDetailAppServices">\n        <div class="globalNavDetailSubtitle">For App Developers</div>\n        <div class="globalNavDetailTitle">App Services</div>\n        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n      </div>\n      <div id="globalNavDetailApiPlatform">\n        <div class="globalNavDetailSubtitle">For API Developers</div>\n        <div class="globalNavDetailTitle">API Platform</div>\n        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n      </div>\n      <div id="globalNavDetailApiConsoles">\n        <div class="globalNavDetailSubtitle">For API Developers</div>\n        <div class="glo
 balNavDetailTitle">API Consoles</div>\n        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n      </div>\n    </li>\n  </ul>\n</li>'),$templateCache.put("global/insecure-banner.html",'<div ng-if="securityWarning" ng-cloak class="demo-holder">\n    <div class="alert alert-demo alert-animate">\n        <div class="alert-text">\n            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n        </div>\n    </div>\n</div>'),$templateCache.put("global/page-title.html",'<section class="row-fluid">\n    <div class="span12">\n        <div class="page-filters">\n            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}
 </i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n        </div>\n    </div>\n    <bsmodal id="need-help"\n             title="Need Help?"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="sendHelp"\n             extrabuttonlabel="Get Help"\n             ng-cloak>\n        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n    </bsmodal>\n</section>\n\n'),$templateCache.put("groups/groups-activities.html",'<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n\n  <br>\n  <div>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Date</td>\n        <td>Content</td>\n        <td>Verb</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n        <td>{{activity.createdDate}}</td>\n  
       <td>{{activity.content}}</td>\n        <td>{{activity.verb}}</td>\n        <td>{{activity.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n\n\n</div>'),$templateCache.put("groups/groups-details.html",'<div class="content-page" ng-controller="GroupsDetailsCtrl">\n\n  <div>\n      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n          <div style="float: left; padding-right: 30px;">\n              <h4 class="ui-dform-legend">Group Information</h4>\n              <label for="group-title" class="ui-dform-label">Group Title</label>\n              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n              <br/>\n            <label for="group-path" class="ui-dform-label">Group Path</label>\n            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata"
  ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n            <br/>\n          </div>\n          <br style="clear:both"/>\n\n          <div style="width:100%;float:left;padding: 20px 0">\n              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n          </div>\n\n          <div class="content-container">\n              <h4>JSON Group Object</h4>\n              <pre>{{json}}</pre>\n          </div>\n      </form>\n  </div>\n\n\n</div>'),$templateCache.put("groups/groups-members.html",'<div class="content-page" ng-controller="GroupsMembersCtrl">\n\n\n  <bsmodal id="removeFromGroup"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="removeUsersFromGroupDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to remove the users from the seleted group
 (s)?</p>\n  </bsmodal>\n\n  <bsmodal id="addGroupToUser"\n           title="Add user to group"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addGroupToUserDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <div class="btn-group">\n      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n        <span class="filter-label">{{$parent.user != \'\' ? $parent.user.username : \'Select a user...\'}}</span>\n        <span class="caret"></span>\n      </a>\n      <ul class="dropdown-menu">\n        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n      </ul>\n    </div>\n  </bsmodal>\n\n\n  <div class="button-strip">\n    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n    <button class="btn btn-primary" ng-disabled="!hasMembers || !valueSelected(groupsCollection.users
 ._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n  </div>\n  <table class="table table-striped">\n    <tr class="table-header">\n      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n      <td style="width: 50px;"></td>\n      <td>Username</td>\n      <td>Display Name</td>\n    </tr>\n    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n      <td>\n        <input\n          type="checkbox"\n          ng-model="user.checked"\n          >\n      </td>\n      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n      <td>{{user.get(\'username\')}}</td>\n      <td>{{user.get(\'name\')}}</td>\n    </tr>\n  </table>\n  <div style="padding: 10px 5px 10px 5px">\n    <button class="btn btn-primary" ng-click="getPrevious()" style="
 display:{{previous_display}}">< Previous</button>\n    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n  </div>\n</div>'),$templateCache.put("groups/groups-roles.html",'<div class="content-page" ng-controller="GroupsRolesCtrl">\n\n  <bsmodal id="addGroupToRole"\n           title="Add group to role"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addGroupToRoleDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <div class="btn-group">\n      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n        <span class="filter-label">{{$parent.name != \'\' ? $parent.name : \'Role name...\'}}</span>\n        <span class="caret"></span>\n      </a>\n      <ul class="dropdown-menu">\n        <li ng-repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n      </ul>\n    <
 /div>\n  </bsmodal>\n\n  <bsmodal id="leaveRoleFromGroup"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="leaveRoleDialog"\n           extrabuttonlabel="Leave"\n           ng-cloak>\n    <p>Are you sure you want to remove the group from the role(s)?</p>\n  </bsmodal>\n\n\n  <div class="button-strip">\n    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n  </div>\n  <h4>Roles</h4>\n  <table class="table table-striped">\n    <tbody>\n    <tr class="table-header">\n      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" 
 ></td>\n      <td>Role Name</td>\n      <td>Role title</td>\n    </tr>\n    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n      <td>\n        <input\n          type="checkbox"\n          ng-model="role.checked"\n          >\n      </td>\n      <td>{{role._data.name}}</td>\n      <td>{{role._data.title}}</td>\n    </tr>\n    </tbody>\n  </table>\n  <div style="padding: 10px 5px 10px 5px">\n    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n  </div>\n\n\n  <bsmodal id="deletePermission"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="deleteGroupPermissionDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to delete the permission(s)?</p
 >\n  </bsmodal>\n\n\n  <bsmodal id="addPermission"\n           title="New Permission"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addGroupPermissionDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /></p>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n    </div>\n  </bsmodal>\n\n\n  <div class="button-s
 trip">\n    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n  </div>\n  <h4>Permissions</h4>\n  <table class="table table-striped">\n    <tbody>\n    <tr class="table-header">\n      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAllEntities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n      <td>Path</td>\n      <td>GET</td>\n      <td>POST</td>\n      <td>PUT</td>\n      <td>DELETE</td>\n    </tr>\n    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n      <td>\n        <input\n          type="checkbox"\n          ng-model="permission.checked"\n          >\n      </td>\n      <td>{{permissi
 on.path}}</td>\n      <td>{{permission.operations.get}}</td>\n      <td>{{permission.operations.post}}</td>\n      <td>{{permission.operations.put}}</td>\n      <td>{{permission.operations.delete}}</td>\n    </tr>\n    </tbody>\n  </table>\n\n</div>'),$templateCache.put("groups/groups-tabs.html",'<div class="content-page">\n\n  <section class="row-fluid">\n\n    <div class="span12">\n      <div class="page-filters">\n        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n      </div>\n    </div>\n\n  </section>\n\n  <div id="user-panel" class="panel-buffer">\n    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a
 ></li>\n      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n      <li ng-class="rolesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n    </ul>\n  </div>\n\n  <div style="float: left; margin-right: 10px;">\n    <div style="float: left;">\n      <div class="user-header-title"><strong>Group Path: </strong>{{selectedGroup.get(\'path\')}}</div>\n      <div class="user-header-title"><strong>Group Title: </strong>{{selectedGroup.get(\'title\')}}</div>\n    </div>\n  </div>\n</div>\n<br>\n<br>\n'),$templateCache.put("groups/groups.html",'<div class="content-page">\n\n  <page-title title=" Groups" icon="&#128101;"></page-title>\n  <bsmodal id="newGroup"\n           title="New Group"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="newGroupDialog"\n           extrabuttonlabel="Add"\n           ng-model="dialog"\
 n           ng-cloak>\n    <fieldset>\n      <div class="control-group">\n        <label for="title">Title</label>\n        <div class="controls">\n          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n        </div>\n      </div>\n      <div class="control-group">\n        <label for="path">Path</label>\n        <div class="controls">\n          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n        </div>\n      </div>\n    </fieldset>\n  </bsmodal>\n\n  <bsmodal id="deleteGroup"\n           title="Delete Group"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="deleteGroupsDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to delete the gr
 oup(s)?</p>\n  </bsmodal>\n\n\n  <section class="row-fluid">\n    <div class="span3 user-col">\n\n      <div class="button-toolbar span12">\n        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n      </div>\n      <ul class="user-list">\n        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n          <input\n              type="checkbox"\n              ng-
 value="group._data.uuid"\n              ng-checked="group.checked"\n              ng-model="group.checked"\n              >\n          <a href="javaScript:void(0)" >{{group.get(\'title\')}}</a>\n          <br/>\n          <span ng-if="group.get(\'path\')" class="label">Path:</span>/{{group.get(\'path\')}}\n        </li>\n      </ul>\n\n\n      <div style="padding: 10px 5px 10px 5px">\n        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n      </div>\n\n    </div>\n\n    <div class="span9 tab-content" ng-show="selectedGroup.get" >\n      <div class="menu-toolbar">\n        <ul class="inline" >\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/details\')"><i class="p
 ictogram">&#59170;</i>Details</a></li>\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a></li>\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a></li>\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a></li>\n        </ul>\n      </div>\n      <span ng-include="currentGroupsPage.template"></span>\n\n  </section>\n</div>\n'),$templateCache.put("login/forgot-password.html",'<div class="login-content" ng-controller="Forgo
 tPasswordCtrl">\n	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n	<button class="btn btn-primary" ng-click="">Reset Password</button>\n</div>\n'),$templateCache.put("login/loading.html","\n\n<h1>Loading...</h1>"),$templateCache.put("login/login.html",'<div class="login-content">\r\n  <bsmodal id="sendActivationLink"\r\n           title="Resend Activation Link"\r\n           close="hideModal"\r\n           closelabel="Cancel"\r\n           extrabutton="resendActivationLink"\r\n           extrabuttonlabel="Send Activation"\r\n           ng-cloak>\r\n    <fieldset>\r\n      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r\n    </fieldset>\r\n 
  </bsmodal>\r\n  <div class="login-holder">\r\n  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r\n    <h1 class="title">Enter your credentials</h1>\r\n    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r\n    <div class="control-group">\r\n      <label class="control-label" for="login-username">Email or Username:</label>\r\n      <div class="controls">\r\n        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r\n      </div>\r\n    </div>\r\n    <div class="control-group">\r\n      <label class="control-label" for="login-password">Password:</label>\r\n      <div class="controls">\r\n        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r\n      </div>\r\n    </div>\r\n    <div class
 ="control-group" ng-show="requiresDeveloperKey">\r\n      <label class="control-label" for="login-developerkey">Developer Key:</label>\r\n      <div class="controls">\r\n        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r\n      </div>\r\n    </div>\r\n    <div class="form-actions">\r\n      <div class="submit">\r\n        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r\n      </div>\r\n    </div>\r\n  </form>\r\n  </div>\r\n  <div class="extra-actions">\r\n    <div class="submit">\r\n      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r\n         class="btn btn-primary pull-left">Register</a>\r\n    </div>\r\n    <div class="submit">\r\n      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="b
 utton-forgot-password"\r\n         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r\n    </div>\r\n    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r\n       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r\n  </div>\r\n  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r\n</div>\r\n'),$templateCache.put("login/logout.html",'<div id="logut">Logging out...</div>'),$templateCache.put("login/register.html",'<div class="signUp-content">\n  <div class="signUp-holder">\n    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n      <h1 class="title">Register</h1>\n\n      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n      <div class="control-group">\n        <label class="control-label" for="register-orgName">Organization:</label>\n\n        <div class="controls">\n          <input type="
 text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n        </div>\n      </div>\n\n      <div class="control-group">\n        <label class="control-label" for="register-name">Name:</label>\n\n        <div class="controls">\n          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class="" size="20">\n        </div>\n      </div>\n\n      <div class="control-group">\n        <label class="control-label" for="register-userName">Username:</label>\n\n        <div class="controls">\n          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n        </div>\n      </div>\n\n      <div class="control-group">\n        <label 
 class="control-label" for="register-email">Email:</label>\n\n        <div class="controls">\n          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n        </div>\n      </div>\n\n\n      <div class="control-group">\n        <label class="control-label" for="register-password">Password:</label>\n\n        <div class="controls">\n          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n                 size="20">\n        </div>\n      </div>\n      <div class="control-group">\n        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n\n        <div class="controls">\n          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPasswor
 d" ug-validate class="" size="20">\n        </div>\n      </div>\n      <div class="form-actions">\n        <div class="submit">\n          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n                 class="btn btn-primary pull-right">\n        </div>\n        <div class="submit">\n          <a ng-click="cancel()" type="submit" name="button-cancel" id="button-cancel"\n             class="btn btn-primary pull-right">Cancel</a>\n        </div>\n      </div>\n    </form>\n    <div class="console-section well thingy" ng-show="signUpSuccess">\n      <span class="title">We\'re holding a seat for you!</span>\n      <br><br>\n\n      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we\'re ready for\n        you!</p>\n\n      <p>In the mean time, you can stay up to date with App Services on our <a\n          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleG
 roup</a>.</p>\n\n      <p> <a href="#!/login">Back to login</a></p>\n    </div>\n  </div>\n\n</div>\n'),$templateCache.put("menus/appMenu.html",'<ul id="app-menu" class="nav top-nav span12">\n    <li class="span7">\n      <bsmodal id="newApplication"\n               title="Create New Application"\n               close="hideModal"\n               closelabel="Cancel"\n               extrabutton="newApplicationDialog"\n               extrabuttonlabel="Create"\n               buttonid="app"\n               ng-cloak>\n        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n      </bsmodal>\n        <div class="btn-group">\
 n            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n                <span class="caret"></span>\n            </a>\n            <ul class="dropdown-menu app-nav">\n                <li name="app-selector" ng-repeat="app in applications">\n                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n                </li>\n            </ul>\n        </div>\n    </li>\n    <li class="span5">\n      <a ng-if="activeUI"\n         class="btn btn-create zero-out pull-right"\n         ng-click="showModal(\'newApplication\')"\n         analytics-on="click"\n         analytics-category="App Services"\n         analytics-label="Button"\n         analytics-event="Add New App"\n        >\n        <i class="pictogram">&#8862;</i>\n        Add New App\n      </a>\n    </li>\n</ul>'),$templateCache.put("menus/orgMenu.html"
 ,'<ul class="nav top-nav org-nav">\n  <li>\n<div class="btn-group ">\n    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n        <i class="pictogram">&#128193</i> {{currentOrg}}<span class="caret"></span>\n        </a>\n    <ul class="dropdown-menu org-nav">\n          <li name="org-selector" ng-repeat="(k,v) in organizations">\n              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n            </li>\n         </ul>\n    </div>\n  </li></ul>'),$templateCache.put("org-overview/org-overview.html",'<div class="org-overview-content" ng-show="activeUI">\n\n  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n\n  <section class="row-fluid">\n\n  <div class="span6">\n  	<bsmodal id="introjs"\n             title="Welcome to the API BaaS Admin Portal"\n             close="hideModal"\n             closelabel="Skip"\n             extrabutton="startFirstTim
 eUser"\n             extrabuttonlabel="Take the tour"\n             ng-cloak>\n      <p>To get started, click \'Take the tour\' for a full walkthrough of the admin portal, or click \'Skip\' to start working right away.</p>\n    </bsmodal>\n		<div id="intro-4-current-org">	\n	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n	    <table class="table table-striped">\n	      <tr>\n	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n	      </tr>\n	    </table>\n		</div>\n\n    <bsmodal id="newApplication"\n             title="Create New Application"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="newApplicationDialog"\n             extrabuttonlabel="Create"\n  
            ng-cloak>\n      <p>New application name: <input ng-model="$parent.newApp.name"  ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n    </bsmodal>\n		<div id="intro-5-applications">		\n	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n	      <div class="header-button btn-group pull-right">\n	        <a class="btn filter-selector" style="{{applicationsSize === 10 ? \'width:290px\':\'\'}}"  ng-click="showModal(\'newApplication\')">\n	          <span class="filter-label">Add New App</span>\n	        </a>\n	      </div>\n	    </h2>\n		\n	    <table class="table table-striped">\n	      <tr ng-repeat="application in applications">\n	        <td>{{application.name}}</td>\n	        <td style="text-align: right">{{application.uuid}}</td>\n
 	      </tr>\n	    </table>\n		</div>\n    <bsmodal id="regenerateCredentials"\n             title="Confirmation"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="regenerateCredentialsDialog"\n             extrabuttonlabel="Yes"\n             ng-cloak>\n      Are you sure you want to regenerate the credentials?\n    </bsmodal>\n		<div id="intro-6-org-api-creds">\n	    <h2 class="title" >Organization API Credentials <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'api org credentials\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_org_api_creds}}" tooltip-placement="right">(?)</a>\n	      <div class="header-button btn-group pull-right">\n	        <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">\n	          <span class="filter-label">Regenerate Org Credentials</span>\n	        </a>\n	      </div>\n	    </h2>\n	\n	    <table class="table table-striped">\n	      <tr>\n	       
  <td >Client ID</td>\n	        <td style="text-align: right" >{{orgAPICredentials.client_id}}</td>\n	      </tr>\n	      <tr>\n	        <td>Client Secret</td>\n	        <td style="text-align: right">{{orgAPICredentials.client_secret}}</td>\n	      </tr>\n	    </table>\n		</div>\n    <bsmodal id="newAdministrator"\n             title="Create New Administrator"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="newAdministratorDialog"\n             extrabuttonlabel="Create"\n             ng-cloak>\n      <p>New administrator email: <input id="newAdminInput" ug-validate ng-model="$parent.admin.email" pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" required type="email" /></p>\n    </bsmodal>\n		<div id="intro-7-org-admins">\n	    <h2 class="title" >Organization Administrators <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'org admins\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_org_admins}
 }" tooltip-placement="right">(?)</a>\n	      <div class="header-button btn-group pull-right">\n	        <a class="btn filter-selector" ng-click="showModal(\'newAdministrator\')">\n	          <span class="filter-label">Add New Administrator</span>\n	        </a>\n	      </div>\n	    </h2>\n	\n	    <table class="table table-striped">\n	      <tr ng-repeat="administrator in orgAdministrators">\n	        <td><img style="width:30px;height:30px;" ng-src="{{administrator.image}}"> {{administrator.name}}</td>\n	        <td style="text-align: right">{{administrator.email}}</td>\n	      </tr>\n	    </table>\n			</div>\n  </div>\n\n  <div class="span6">\n  	<div id="intro-8-activities">\n	    <h2 class="title">Activities <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'activities\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities}}" tooltip-placement="right">(?)</a></h2>\n	    <table class="table table-striped">\n	      <tr ng-repeat="activity in ac
 tivities">\n	        <td>{{activity.title}}</td>\n	        <td style="text-align: right">{{activity.date}}</td>\n	      </tr>\n	    </table>\n	</div>\n  </div>\n\n\n  </section>\n</div>'),$templateCache.put("profile/account.html",'<page-title title=" Account Settings" icon="&#59170"></page-title>\n\n<section class="row-fluid">\n  <div class="span12 tab-content">\n    <div class="menu-toolbar">\n      <ul class="inline">\n        <li class="tab" ng-show="!use_sso" ng-class="currentAccountPage.route === \'/profile/profile\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="profile-link" ng-click="selectAccountPage(\'/profile/profile\')"><i class="pictogram">&#59170;</i>Profile</a></li>\n        <li class="tab" ng-class="currentAccountPage.route === \'/profile/organizations\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="account-link" ng-click="selectAccountPage(\'/profile/organizations\')"><i class="pictogram">&#128101;</i>Organizations</a></li>\n      </ul
 >\n    </div>\n    <span ng-include="currentAccountPage.template"></span>\n  </div>\n</section>'),$templateCache.put("profile/organizations.html",'<div class="content-page"   ng-controller="OrgCtrl">\n\n\n\n  <bsmodal id="newOrganization"\n           title="Create New Organization"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addOrganization"\n           extrabuttonlabel="Create"\n           ng-cloak>\n    <fieldset>\n\n      <div class="control-group">\n        <label for="new-user-orgname">Organization Name</label>\n\n        <div class="controls">\n          <input type="text" required title="Name" ug-validate ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ng-model="$parent.org.name" name="name" id="new-user-orgname" class="input-xlarge"/>\n\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n\n    </fieldset>\n  </bsmodal>\n\n\n      <div class="row-fluid" >\n      <div class="span3 user-col ">\n\n 
        <div class="button-toolbar span12">\n\n          <button class="btn btn-primary toolbar" ng-click="showModal(\'newOrganization\')" ng-show="true"><i class="pictogram">&#59136;</i>\n          </button>\n        

<TRUNCATED>

[17/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/9011d58a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BASE.31213.js
----------------------------------------------------------------------
diff --git a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BASE.31213.js b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BASE.31213.js
new file mode 100644
index 0000000..e00934e
--- /dev/null
+++ b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BASE.31213.js
@@ -0,0 +1,6 @@
+/*! usergrid@2.0.2 2014-03-31 */
+angular.module("appservices").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("activities/activities.html",'<section class="row-fluid">\n'+'  <div class="span12">\n'+'    <div class="page-filters">\n'+'      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</section>\n"+'<section class="row-fluid">\n'+'  <div class="span12 tab-content">\n'+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td></td>\n"+"        <td>User</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in activities">\n'+"        <td>{{formatDate(activity.created)}}</td>\n"+'        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n'+"        </td>\n"+"        <td>{{activity.actor.displayName}}</td>\n"+"  
       <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"+"  </div>\n"+"</section>");$templateCache.put("app-overview/app-overview.html",'<div class="app-overview-content" >\n'+'  <section class="row-fluid">\n'+"\n"+'      <page-title title=" Summary" icon="&#128241;"></page-title>\n'+'  <section class="row-fluid">\n'+'      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n'+"  </section>\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span6">\n'+'      <chart id="appOverview"\n'+'             chartdata="appOverview.chart"\n'+'             type="column"></chart>\n'+"    </div>\n"+"\n"+'    <div class="span6">\n'+'      <table class="table table-striped">\n'+'        <tr class="table-header">\n'+"          <td>Path</td>\n"+"          <td>Title</td>\n"+"        </tr>\n"+'        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n'+"          <td
 >{{v.title}}</td>\n"+"          <td>{{v.count}}</td>\n"+"        </tr>\n"+"      </table>\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");$templateCache.put("app-overview/doc-includes/android.html","<h2>1. Integrate the SDK into your project</h2>\n"+"<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n"+"\n"+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+"\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+'		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+"		<p>If you've already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n"+'		<div id="collapse">\n'+'			<a href="#jar_collapse" class="btn" d
 ata-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n'+"		</div>\n"+'		<div id="jar_collapse" class="collapse">\n'+"			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n"+"	\n"+"			<h3>Android 4.0 (or later) projects</h3>\n"+"			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n"+"			\n"+"			<h3>Android 3.0 (or earlier) projects</h3>\n"+"			<ol>\n"+"				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n"+"				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n"+"				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n"+"				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the t
 op of the class path:\n"+"					<ol>\n"+"						<li>In the Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n"+"						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n"+"						<li>\n"+"							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n"+"						</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+'			<div class="warning">\n'+"				<h3>Applications using Ant</h3>\n"+"				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n"+"			</div>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project">\n'+'		<a class="jumplink" name=
 "create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you don't have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ul>\n"+"			<li>Locate the project template in the expanded SDK. It should be at the following location:\n"+"				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"		</ul>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Update permissions in AndroidManifest.xml</h2>\n"+"<p>Add the following Internet permissions to your application's <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n"+"<pre>\n"+'&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n'+'&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n'+'&lt;uses-permission andro
 id:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n'+"</pre>\n"+"<h2>3. Initialize the SDK</h2>\n"+"<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the following:</p>\n"+"<ol>\n"+"	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n"+"		<pre>\n"+"public class YourApplication extends Application\n"+"{\n"+"        \n"+"        private ApigeeClient apigeeClient;\n"+"        \n"+"        public YourApplication()\n"+"        {\n"+"                this.apigeeClient = null;\n"+"        }\n"+"        \n"+"        public ApigeeClient getApigeeClient()\n"+"        {\n"+"                return this.apigeeClient;\n"+"        }\n"+"        \n"+"        public void setApigeeClien
 t(ApigeeClient apigeeClient)\n"+"        {\n"+"                this.apigeeClient = apigeeClient;\n"+"        }\n"+"}			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n"+"		<pre>\n"+"&lt;application&gt;\n"+'    android:allowBackup="true"\n'+'    android:icon="@drawable/ic_launcher"\n'+'    android:label="@string/app_name"\n'+'    android:name=".YourApplication"\n'+"	…\n"+"&lt;/application&gt;			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n"+"		<pre>\n"+"import com.apigee.sdk.ApigeeClient;\n"+"\n"+"@Override\n"+"protected void onCreate(Bundle savedInstanceState) {\n"+"    super.onCreate(savedInstanceState);		\n"+"	\n"+'	String ORGNAME = "{{currentOrg}}";\n'+'	String APPNAME = "{{currentApp}}";\n'+"	\n"+"	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseConte
 xt());\n"+"\n"+"	// hold onto the ApigeeClient instance in our application object.\n"+"	yourApp = (YourApplication) getApplication;\n"+"	yourApp.setApigeeClient(apigeeClient);			\n"+"}\n"+"		</pre>\n"+"		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n"+"	</li>\n"+"</ol>\n"+"<h2>4. Import additional SDK classes</h2>\n"+"<p>The following classes will enable you to call common SDK methods:</p>\n"+"<pre>\n"+"import com.apigee.sdk.data.client.DataClient; //App Services data methods\n"+"import com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\n"+"import com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\n"+"import com.apigee.sdk.data.client.response.ApiResponse; //API response object\n"+"</pre>\n"+"		\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logg
 ing usage, crash and error metrics for your app.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+"<p>To verify that the SDK has been properly initialized, run your app, then go to 'Monitoring' > 'App Usage' in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n"+"		<ul>\n"+"			<li>\n"+"				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n"+"				<p>Use this object to access the data methods of the App Services SDK, inclu
 ding those for push notifications, data store, and geolocation.</p>\n"+"			</li>\n"+"			<li>\n"+"				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n"+"				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n"+"			</li>\n"+"		</ul>\n"+"	</li>	\n"+"	<li>	\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\
 n'+'			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n'+"				<ul>\n"+'					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n'+'					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n'+'					<li><strong>
 <a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n'+"				</ul>		\n"+"			</li>\n"+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>	
 \n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-android-sdk-&lt;version&gt;\n"+"	...\n"+"	/samples\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app
  for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/ios.html","<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n"+'<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+"		<p>If you've already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n"+'		<div id="collapse"><a class="btn" d
 ata-toggle="collapse" href="#framework_collapse">Details</a></div>\n'+'		<div class="collapse" id="framework_collapse">\n'+"			<ol>\n"+"				<li>\n"+"					<p>Locate the SDK framework file so you can add it to your project. For example, you'll find the file at the following path:</p>\n"+"					<pre>\n"+"&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n"+"				</li>\n"+"				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n"+"				<li>Link the Apigee iOS SDK into your project.\n"+"					<ul>\n"+"						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n"+"					</ul>\n"+"					<p>OR</p>\n"+"					<ol>\n"+"						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n"+"						<li>Navigate to the directory that contains ApigeeiOS
 SDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you're starting with a clean slate (you don't have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ol>\n"+"			<li>\n"+"				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n"+"				<pre>\n"+"&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n"+"			<li>Get acquainted with the template by looking at its readme file.</li>\n"+"		</ol>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Add required iOS frameworks</h2>\n"+"<p>Ensure that the following iOS frameworks are part of you
 r project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n"+"<ul>\n"+"	<li>QuartzCore.framework</li>\n"+"	<li>CoreLocation.framework</li>\n"+"	<li>CoreTelephony.framework&nbsp;</li>\n"+"	<li>Security.framework</li>\n"+"	<li>SystemConfiguration.framework</li>\n"+"	<li>UIKit.framework</li>\n"+"</ul>\n"+"<h2>3. Update 'Other Linker Flags'</h2>\n"+"<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n"+"<pre>\n"+"-ObjC -all_load</pre>\n"+"<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n"+"<h2>4. Initialize the SDK</h2>\n"+'<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Gett
 ing Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n'+"<ol>\n"+"	<li>Import the SDK\n"+"		<p>Add the following to your source code to import the SDK:</p>\n"+"		<pre>\n"+"#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n"+"		<pre>\n"+"@property (strong, nonatomic) ApigeeClient *apigeeClient; \n"+"@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n"+"@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n"+"		</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n"+"		<pre>\n"+"//Replace 'AppDelegate' with the name of your app delegate class to instantiate it\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"\n"
 +"//Sepcify your App Services organization and application names\n"+'NSString *orgName = @"{{currentOrg}}";\n'+'NSString *appName = @"{{currentApp}}";\n'+"\n"+"//Instantiate ApigeeClient to initialize the SDK\n"+"appDelegate.apigeeClient = [[ApigeeClient alloc]\n"+"                            initWithOrganizationId:orgName\n"+"                            applicationId:appName];\n"+"                            \n"+"//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\n"+"self.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \n"+"self.dataClient = [appDelegate.apigeeClient dataClient]; \n"+"		</pre>\n"+"	</li>\n"+"</ol>\n"+"\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to
  <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>	\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n'+'		<div class="collapse" id="client_collapse">\n'+"			<ul>\n"+"				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifi
 cations, data store, and geolocation.</li>\n"+"				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"			<h3>Example</h3>\n"+"			<p>For example, you could create a new entity with the following:</p>\n"+"			<pre>\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"ApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n"+"			</pre>\n"+"		</div>\n"+"\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications<
 /a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+'		<p>The SDK includes samples that illust
 rate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n'+"		<p>You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-ios-sdk-&lt;version&gt;\n"+"    ...\n"+"    /samples\n"+"		</pre>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n'+'		<div class="collapse" id="samples_collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Ap
 igee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"		<p>&nbsp;</p>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/javascript.html","<h2>1. Import the SDK into your HTML</h2>\n"+"<p>To enable support for Apigee-related functions in your HTML, you'll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n"+"<pre>\n"+'&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n'+"</pre>\n"+"<h2>2. Instantiate Apigee.Clien
 t</h2>\n"+"<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n"+"<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n"+"<pre>\n"+"//Apigee account credentials, available in the App Services admin portal \n"+"var client_creds = {\n"+"        orgName:'{{currentOrg}}',\n"+"        appName:'{{currentApp}}'\n"+"    }\n"+"\n"+"//Initializes the SDK. Also instantiates Apigee.MonitoringClient\n"+"var dataClient = new Apigee.Client(client_creds);  \n"+"</pre>\n"+"\n"+"<h2>3. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https:
 //www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>	\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n"+'		<div id="collapse">\n'+'			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="client_collapse" class="collapse">\n'+"			<ul>\n"+"				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n"+"				<li><code>dataClient.monitor</code>: Used
  to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"		</div>\n"+"	</li>	\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n'+'			<li><strong>
 <a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-javascript-sdk-master\n"+"    ...\n"+"    /samples		\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\
 n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>booksSample.html</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>monitoringSample.html</td>\n"+"						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>readmeSample.html</td>\n"+"						<td>A simple app for reading data from
  an Apigee database.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>	\n"+"	</li>				\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/net.html","");$templateCache.put("app-overview/doc-includes/node.html","");$templateCache.put("app-overview/doc-includes/ruby.html","");$templateCache.put("app-overview/getting-started.html",'<div class="setup-sdk-content" >\n'+"\n"+'  <bsmodal id="regenerateCredentials"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="regenerateCredentialsDialog"\n'+'           extrabuttonlabel="Yes"\n'+"           ng-cloak>\n"+"    Are you sure you want to regenerate the credentials?\n"+"  </bsmodal>\n"+"\n"+'    <page-title icon="&#128640;" title="Getting Started"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+"\n"+"\n"+"\n"+'    <div class="span8">\n'+"\n"+'      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n'+"      <p>Cli
 ck on a platform icon below to view SDK installation instructions for that platform.</p>\n"+'      <ul class="inline unstyled">\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n'+"\n"+"\n"+"        <li ng-click=\"showSDKDetail('ios')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n'+"        <li ng-click=\"showSDKDetail('android')\"\n"+'            analytics-on="click"\n'+'            anal
 ytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n'+"        <li ng-click=\"showSDKDetail('javascript')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apige
 e.com/docs/usergrid/content/sdks-and-examples#ruby"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n'+"       </ul>\n"+"\n"+'      <section id="intro-container" class="row-fluid intro-container">\n'+"\n"+'        <div class="sdk-intro">\n'+"        </div>\n"+"\n"+'        <div class="sdk-intro-content">\n'+"\n"+'          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" targ
 et="_blank">\n'+"            Download SDK\n"+"          </a>\n"+'          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n'+"            More Docs\n"+"          </a>\n"+'          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n'+"\n"+'          <div ng-include="getIncludeURL()"></div>\n'+"        </div>\n"+"\n"+"      </section>\n"+"    </div>\n"+"\n"+'    <div class="span4 keys-creds">\n'+'      <h2 class="title">Mobile sdk keys</h2>\n'+"      <p>For mobile SDK initialization.</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Org Name</dt>\n"+"        <dd>{{currentOrg}}</dd>\n"+"        <dt>App Name</dt>\n"+"        <dd>{{currentApp}}</dd>\n"+"      </dl>\n"+'      <h2 class="title">Server app credentials</h2>\n'+"      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Client ID</dt>\n"+"        <dd>{{clientID}}</dd>\n"+"        <dt>Client Secret</
 dt>\n"+"        <dd>{{clientSecret}}</dd>\n"+"        <dt>\n"+"           &nbsp;\n"+"        </dt>\n"+"        <dd>&nbsp;</dd>\n"+"\n"+"        <dt>\n"+'          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n'+"        </dt>\n"+"        <dd></dd>\n"+"      </dl>\n"+"\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");
+$templateCache.put("data/data.html",'<div class="content-page">\n'+"\n"+'  <bsmodal id="newCollection"\n'+'           title="Create new collection"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newCollectionDialog"\n'+'           extrabuttonlabel="Create"\n'+'           buttonid="collection"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="new-collection-name">Collection Name:</label>\n'+'        <div class="controls">\n'+'          <input type="text" ug-validate required ng-pattern="collectionNameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n'+'          <p class="help-block hide"></p>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <page-title title=" Collections" icon="&#128254;"></page-title>\n'+"\n"+'  <section class="row-
 fluid">\n'+'    <div class="span3 user-col">\n'+'        <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n'+'        <ul  class="user-list">\n'+"          <li ng-class=\"queryCollection._type === entity.name ? 'selected' : ''\" ng-repeat=\"entity in collectionList\" ng-click=\"loadCollection('/'+entity.name);\">\n"+'            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n'+"          </li>\n"+"        </ul>\n"+"\n"+"  </div>\n"+"\n"+'    <div class="span9 tab-content">\n'+'      <div class="content-page">\n'+'      <form name="dataForm" ng-submit="run();">\n'+"        <fieldset>\n"+'          <div class="control-group">\n'+'            <div class="" data-toggle="buttons-radio">\n'+'              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n'+"              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n"+'      
         <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n'+'              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n'+'              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n'+'              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n'+'              <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE\n'+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group">\n'+"            <strong>Path </strong>\n"+'            <div class="contr
 ols">\n'+'              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n'+"            </div>\n"+"          </div>\n"+'          <div class="control-group">\n'+'            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n'+"          </div>\n"+'          <div class="control-group">\n'+"            <strong>Query</strong>\n"+'            <div class="controls">\n'+'              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n'+'              <div style="display:none">\n'+'                <a class="btn dropdown-toggle " data-toggle="dropdown">\n'+'                  <span id="query-collections-caret" class="caret"></span>\n'+"                </a>\n"+'                <ul id="query-collections-indexes-li
 st" class="dropdown-menu ">\n'+"                </ul>\n"+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+"\n"+"          <div class=\"control-group\" ng-show=\"verb=='GET' || verb=='DELETE'\">\n"+'            <label class="control-label" for="query-limit"><strong>Limit</strong> <a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'              <div class="input-append">\n'+'                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n'+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group" style="display:{{queryBodyDisplay}}">\n'+'            <label class="control-label" for="query-source"><strong>JSON Body</strong> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'            <textarea ng-
 model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n'+'      { "name":"value" }\n'+"            </textarea>\n"+"              <br>\n"+'            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"            </div>\n"+"          </div>\n"+'          <div style="clear: both; height: 10px;"></div>\n'+'          <div class="control-group">\n'+'            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n'+"          </div>\n"+"        </fieldset>\n"+"       </form>\n"+"        <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n"+"        <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n"+"        <div ng-include=\"display=='groups' ? 'data/display-groups.html' : ''\"></div>\n"+"        <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n"+"\n"+"
       </div>\n"+"\n"+"      </div>\n"+"    </section>\n"+"\n"+"\n"+"\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/display-generic.html","\n"+"\n"+'<bsmodal id="deleteEntities"\n'+'         title="Are you sure you want to delete the entities(s)?"\n'+'         close="hideModal"\n'+'         closelabel="Cancel"\n'+'         extrabutton="deleteEntitiesDialog"\n'+'         extrabuttonlabel="Delete"\n'+'         buttonid="del-entity"\n'+"         ng-cloak>\n"+"    <fieldset>\n"+'        <div class="control-group">\n'+"        </div>\n"+"    </fieldset>\n"+"</bsmodal>\n"+"\n"+'<span  class="button-strip">\n'+'  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n'+"</span>\n"+'<table class="table table-striped collection-list">\n'+"  <thead>\n"+'  <tr class="table-header">\n'+'    <th><input type="checkbox" ng-show="queryCollection._list.l
 ength > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n'+"    <th ng-if=\"hasProperty('name')\">Name</th>\n"+"    <th>UUID</th>\n"+"    <th></th>\n"+"  </tr>\n"+"  </thead>\n"+'  <tbody ng-repeat="entity in queryCollection._list">\n'+'  <tr class="zebraRows" >\n'+"    <td>\n"+"      <input\n"+'        type="checkbox"\n'+'        id="entity-{{entity._data.name}}-cb"\n'+'        ng-value="entity._data.uuid"\n'+'        ng-model="entity.checked"\n'+"        >\n"+"    </td>\n"+"    <td ng-if=\"hasProperty('name')\">{{entity._data.name}}</td>\n"+"    <td>{{entity._data.uuid}}</td>\n"+"    <td><a href=\"javaScript:void(0)\" ng-click=\"entitySelected[$index] = !entitySelected[$index];selectEntity(entity._data.uuid)\">{{entitySelected[$index] ? 'Hide' : 'View'}} Details</a></td>\n"+"  </tr>\n"+'  <tr ng-if="entitySelected[$index]">\n'+'    <td colspan="5">\n'+"\n"+"\n"+'      <h4 style="m
 argin: 0 0 20px 0">Entity Detail</h4>\n'+"\n"+"\n"+'      <ul class="formatted-json">\n'+'        <li ng-repeat="(k,v) in entity._data track by $index">\n'+'          <span class="key">{{k}} :</span>\n'+"          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n"+'          <span ng-switch on="isDeep(v)">\n'+'            <ul ng-switch-when="true">\n'+'              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n'+"\n"+'                <span ng-switch on="isDeep(v2)">\n'+'                  <ul ng-switch-when="true">\n'+'                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n'+"                  </ul>\n"+'                  <span ng-switch-when="false">\n'+'                    <span class="value">{{v2}}</span>\n'+"                  </span>\n"+"                </span>\n"+"              </li>\n"+"            </ul>\n"+'            <span ng-switch-when="false">\n'+'   
            <span class="value">{{v}}</span>\n'+"            </span>\n"+"          </span>\n"+"        </li>\n"+"      </ul>\n"+"\n"+'    <div class="control-group">\n'+'      <h4 style="margin: 20px 0 20px 0">Edit Entity</h4>\n'+'      <div class="controls">\n'+'        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n'+"        <br>\n"+'        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n'+"      </div>\n"+"    </div>\n"+"  </td>\n"+"  </tr>\n"+"\n"+'  <tr ng-show="queryCollection._list.length == 0">\n'+'    <td colspan="4">No data found</td>\n'+"  </tr>\n"+"  </tbody>\n"+"</table>\n"+'<div style="padding: 10px 5px 10px 5px">\n'+'  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'  <button class="btn btn-primary toolbar"
  ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"</div>\n"+"\n");$templateCache.put("data/display-groups.html","");$templateCache.put("data/display-roles.html","roles---------------------------------");$templateCache.put("data/display-users.html","\n"+'<table id="query-response-table" class="table">\n'+"  <tbody>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n'+'    <td class="gravatar50-td">&nbsp;</td>\n'+'    <td class="user-details bold-header">Username</td>\n'+'    <td class="user-details bold-header">Display Name</td>\n'+'    <td class="user-details bold-header">UUID</td>\n'+'    <td class="view-details">&nbsp;</td>\n'+"  </tr>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf
 44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"    </td>\n"+'    <td class="gravatar50-td">\n'+'      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n'+"    </td>\n"+'    <td class="details">\n'+"      <a onclick=\"Usergrid.console.getCollection('GET', '/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/'+'bf9a95da-d508-11e2-bf44-236d2eee13a7'); $('#data-explorer').show(); return false;\" class=\"view-details\">10</a>\n"+"    </td>\n"+'    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n'+'    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n'+'    <td class="view-details">\n'+'      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n'+"    </td>\n"+"  </tr>\n"+'  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+'    <t
 d colspan="5">\n'+"      <div>\n"+'        <div style="padding-bottom: 10px;">\n'+'          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n'+'          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n'+"        </div>\n"+'        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"              <pre>{\n"+'  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n'+'  "uuid": "bf9a95da-d508-11e2-bf4
 4-236d2eee13a7",\n'+'  "type": "user",\n'+'  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n'+'  "created": 1371224432557,\n'+'  "modified": 1371851347024,\n'+'  "username": "10",\n'+'  "email": "fdsafdsa@ookfd.com",\n'+'  "activated": "true",\n'+'  "adr": {\n'+'    "addr1": "",\n'+'    "addr2": "",\n'+'    "city": "",\n'+'    "state": "",\n'+'    "zip": "",\n'+'    "country": ""\n'+"  },\n"+'  "metadata": {\n'+'    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n'+'    "sets": {\n'+'      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n'+'      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n'+"    },\n"+'    "collections": {\n'+'      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n'+'      "devices": "/user
 s/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n'+'      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n'+'      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n'+'      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n'+'      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n'+'      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n'+"    }\n"+"  },\n"+'  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n'+"}</pre>\n"+"        </div>\n"+'        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+"          <table>\n"+"            <tbody>\n"+"            <tr>\n"+"           
    <td>picture</td>\n"+'              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>
 </td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031
 a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n'+"            </tr>\n"+"            </tbody>\n"+"          </table>\n"+"        </div>\n"+"      </div>\n"+"    </td>\n"+"  </tr>\n"+"  </tbody>\n"+"</table>");$templateCache.put("data/entity.html",'<div class="content-page">\n'+"\n"+"  <h4>Entity Detail</h4>\n"+'  <div class="well">\n'+'    <a href="#!/data" class="outside-link"><< Back to collection</a>\n'+"  </div>\n"+"  <fieldset>\n"+'    <div class="control-group">\n'+"      <strong>Path </strong>\n"+'      <div class="controls">\n'+"        {{entityT
 ype}}/{{entityUUID}}\n"+"      </div>\n"+"    </div>\n"+"\n"+'    <div class="control-group">\n'+'      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n'+'      <div class="controls">\n'+'        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n'+"        <br>\n"+'        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"      </div>\n"+"    </div>\n"+'    <div style="clear: both; height: 10px;"></div>\n'+'    <div class="control-group">\n'+'      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n'+'      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n'+"    </div>\n"+"  </fieldset>\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/shell.html",'<div class="content-page">\n'+'  <div class="well">\n'+"    <h2>Interactive Shell</h2>\n"+'    <div style="float:right"><a target="
 _blank" href="http://apigee.com/docs/usergrid/content/usergrid-admin-portal" class="notifications-links">Learn more in our docs</a></div>\n'+"  </div>\n"+"\n"+'  <div class="console-section-contents">\n'+'    <div id="shell-input-div">\n'+'      <p>   Type "help" to view a list of the available commands.</p><hr>\n'+"      <span>&nbsp;&gt;&gt; </span>\n"+'      <!--textarea id="shell-input" rows="2" autofocus="autofocus"></textarea-->\n'+"    </div>\n"+'    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;"><span class="pln">                      </span><p><span class="pln">  </span><span class="typ">Response</span><span class="pun">:</span></p><hr><span class="pln">\n'+"    </span></pre>\n"+"  </div>\n"+"</div>");$templateCache.put("dialogs/modal.html",'    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n'+'        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n'+"\n"+'        <div cl
 ass="modal-header">\n'+'            <h1 class="title">{{title}}</h1>\n'+"        </div>\n"+"\n"+'        <div class="modal-body" ng-transclude></div>\n'+'        <div class="modal-footer">\n'+"            {{footertext}}\n"+'            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n'+'            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n'+'                    ng-click="closeDelegate(close)">{{closelabel}}\n'+"            </button>\n"+"        </div>\n"+"        </form>    </div>\n");$templateCache.put("global/appswitcher-template.html",'<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n'+'  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n'+'  <ul class="dropdown-menu pull-right">\n'+'    <li id="globalNavSubmenuContainer">\n'+"      <ul>\n"+'        <li data-globalNav
 Detail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n'+"      </ul>\n"+"    </li>\n"+'    <li id="globalNavDetail">\n'+'      <div id="globalNavDetailApigeeHome">\n'+'        <div class="globalNavDetailApigeeLogo"></div>\n'+'        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailAppServices">\n'+'        <div class="globalNavDetailSubtitle">For App De
 velopers</div>\n'+'        <div class="globalNavDetailTitle">App Services</div>\n'+'        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiPlatform">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Platform</div>\n'+'        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiConsoles">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Consoles</div>\n'+'        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n'+"      </div>\n"+"    </li>\n"+"  </ul>\n"+"</li>");$templateCache.put("global/insecure-banner.html
 ",'<div ng-if="securityWarning" ng-cloak class="demo-holder">\n'+'    <div class="alert alert-demo alert-animate">\n'+'        <div class="alert-text">\n'+'            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n'+"        </div>\n"+"    </div>\n"+"</div>");$templateCache.put("global/page-title.html",'<section class="row-fluid">\n'+'    <div class="span12">\n'+'        <div class="page-filters">\n'+'            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n'+"        </div>\n"+"    </div>\n"+'    <bsmodal id="need-help"\n'+'             title="Need Help?"\n'+'
              close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="sendHelp"\n'+'             extrabuttonlabel="Get Help"\n'+"             ng-cloak>\n"+"        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n"+"    </bsmodal>\n"+"</section>\n"+"\n");$templateCache.put("groups/groups-activities.html",'<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n'+"\n"+"  <br>\n"+"  <div>\n"+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n'+"        <td>{{activity.createdDate}}</td>\n"+"        <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"
 +"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-details.html",'<div class="content-page" ng-controller="GroupsDetailsCtrl">\n'+"\n"+"  <div>\n"+'      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n'+'          <div style="float: left; padding-right: 30px;">\n'+'              <h4 class="ui-dform-legend">Group Information</h4>\n'+'              <label for="group-title" class="ui-dform-label">Group Title</label>\n'+'              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n'+"              <br/>\n"+'            <label for="group-path" class="ui-dform-label">Group Path</label>\n'+'            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n'+"            <br/>\n"+"    
       </div>\n"+'          <br style="clear:both"/>\n'+"\n"+'          <div style="width:100%;float:left;padding: 20px 0">\n'+'              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n'+"          </div>\n"+"\n"+'          <div class="content-container">\n'+"              <h4>JSON Group Object</h4>\n"+"              <pre>{{json}}</pre>\n"+"          </div>\n"+"      </form>\n"+"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-members.html",'<div class="content-page" ng-controller="GroupsMembersCtrl">\n'+"\n"+"\n"+'  <bsmodal id="removeFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="removeUsersFromGroupDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the users from the seleted group(s)?</p>\n"+"  </bsmodal>\n"+"
 \n"+'  <bsmodal id="addGroupToUser"\n'+'           title="Add user to group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToUserDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.user != '' ? $parent.user.username : 'Select a user...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasMembers 
 || !valueSelected(groupsCollection.users._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n'+"  </div>\n"+'  <table class="table table-striped">\n'+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n'+'      <td style="width: 50px;"></td>\n'+"      <td>Username</td>\n"+"      <td>Display Name</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="user.checked"\n'+"          >\n"+"      </td>\n"+'      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n'+"      <td>{{user.get('username')}}</td>\n"+"      <td>{{user.get('name')}}</td>\n"+"    </tr>\n"+"  </table>\n"+'  <div style=
 "padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"  </div>\n"+"</div>");$templateCache.put("groups/groups-roles.html",'<div class="content-page" ng-controller="GroupsRolesCtrl">\n'+"\n"+'  <bsmodal id="addGroupToRole"\n'+'           title="Add group to role"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToRoleDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.name != '' ? $parent.name : 'Role name...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-
 repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="leaveRoleFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="leaveRoleDialog"\n'+'           extrabuttonlabel="Leave"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the group from the role(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n'+"  </div>\n"+"  <h4>Roles</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-head
 er">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" ></td>\n'+"      <td>Role Name</td>\n"+"      <td>Role title</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="role.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{role._data.name}}</td>\n"+"      <td>{{role._data.title}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+'  <div style="padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n'+"  </div>\n"+"\n"+"\n"+'  <bsmodal 
 id="deletePermission"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupPermissionDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the permission(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <bsmodal id="addPermission"\n'+'           title="New Permission"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupPermissionDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /></p>\n'+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <inpu
 t type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n'+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n'+"  </div>\n"+"  <h4>Permissions</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAll
 Entities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n'+"      <td>Path</td>\n"+"      <td>GET</td>\n"+"      <td>POST</td>\n"+"      <td>PUT</td>\n"+"      <td>DELETE</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="permission.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{permission.path}}</td>\n"+"      <td>{{permission.operations.get}}</td>\n"+"      <td>{{permission.operations.post}}</td>\n"+"      <td>{{permission.operations.put}}</td>\n"+"      <td>{{permission.operations.delete}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+"\n"+"</div>");
+$templateCache.put("groups/groups-tabs.html",'<div class="content-page">\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span12">\n'+'      <div class="page-filters">\n'+'        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n'+"      </div>\n"+"    </div>\n"+"\n"+"  </section>\n"+"\n"+'  <div id="user-panel" class="panel-buffer">\n'+'    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n'+'      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n'+'      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n'+'      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n'+'      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n'+'      <li ng-class="rolesSelected"><a href="javaScript:v
 oid(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n'+"    </ul>\n"+"  </div>\n"+"\n"+'  <div style="float: left; margin-right: 10px;">\n'+'    <div style="float: left;">\n'+"      <div class=\"user-header-title\"><strong>Group Path: </strong>{{selectedGroup.get('path')}}</div>\n"+"      <div class=\"user-header-title\"><strong>Group Title: </strong>{{selectedGroup.get('title')}}</div>\n"+"    </div>\n"+"  </div>\n"+"</div>\n"+"<br>\n"+"<br>\n");$templateCache.put("groups/groups.html",'<div class="content-page">\n'+"\n"+'  <page-title title=" Groups" icon="&#128101;"></page-title>\n'+'  <bsmodal id="newGroup"\n'+'           title="New Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newGroupDialog"\n'+'           extrabuttonlabel="Add"\n'+'           ng-model="dialog"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="title">Title</label>\n'+'    
     <div class="controls">\n'+'          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label for="path">Path</label>\n'+'        <div class="controls">\n'+'          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="deleteGroup"\n'+'           title="Delete Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupsDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the group(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <section class=
 "row-fluid">\n'+'    <div class="span3 user-col">\n'+"\n"+'      <div class="button-toolbar span12">\n'+'        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n'+'        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n'+'        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n'+"      </div>\n"+'      <ul class="user-list">\n'+'        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n'+"          <input\n"+'              type="checkbox"\n'+'              ng-value="group
 ._data.uuid"\n'+'              ng-checked="group.checked"\n'+'              ng-model="group.checked"\n'+"              >\n"+"          <a href=\"javaScript:void(0)\" >{{group.get('title')}}</a>\n"+"          <br/>\n"+"          <span ng-if=\"group.get('path')\" class=\"label\">Path:</span>/{{group.get('path')}}\n"+"        </li>\n"+"      </ul>\n"+"\n"+"\n"+'      <div style="padding: 10px 5px 10px 5px">\n'+'        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"      </div>\n"+"\n"+"    </div>\n"+"\n"+'    <div class="span9 tab-content" ng-show="selectedGroup.get" >\n'+'      <div class="menu-toolbar">\n'+'        <ul class="inline" >\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click
 ="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a></li>\n'+"        </ul>\n"+"      </div>\n"+'      <span ng-include="currentGroupsPage.template"></span>\n'+"\n"+"  </section>\n"+"</div>\n");$templateCache.put
 ("login/forgot-password.html",'<div class="login-content" ng-controller="ForgotPasswordCtrl">\n'+'	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n'+'	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n'+'	<button class="btn btn-primary" ng-click="">Reset Password</button>\n'+"</div>\n");$templateCache.put("login/loading.html","\n"+"\n"+"<h1>Loading...</h1>");$templateCache.put("login/login.html",'<div class="login-content">\r'+"\n"+'  <bsmodal id="sendActivationLink"\r'+"\n"+'           title="Resend Activation Link"\r'+"\n"+'           close="hideModal"\r'+"\n"+'           closelabel="Cancel"\r'+"\n"+'           extrabutton="resendActivationLink"\r'+"\n"+'           extrabuttonlabel="Send Activation"\r'+"\n"+"           ng-cloak>\r"+"\n"+"    <fieldset>\r"+"\n"+'      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-patter
 n="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r'+"\n"+"    </fieldset>\r"+"\n"+"  </bsmodal>\r"+"\n"+'  <div class="login-holder">\r'+"\n"+'  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r'+"\n"+'    <h1 class="title">Enter your credentials</h1>\r'+"\n"+'    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r'+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-username">Email or Username:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-password">Password:</
 label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group" ng-show="requiresDeveloperKey">\r'+"\n"+'      <label class="control-label" for="login-developerkey">Developer Key:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="form-actions">\r'+"\n"+'      <div class="submit">\r'+"\n"+'        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+"  </form>\r"+"\n"+"  </div>\r"+
 "\n"+'  <div class="extra-actions">\r'+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r'+"\n"+'         class="btn btn-primary pull-left">Register</a>\r'+"\n"+"    </div>\r"+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="button-forgot-password"\r'+"\n"+'         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r'+"\n"+"    </div>\r"+"\n"+'    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r'+"\n"+'       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r'+"\n"+"  </div>\r"+"\n"+'  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r'+"\n"+"</div>\r"+"\n");$templateCache.put("login/logout.html",'<div id="logut">Logging out...</div>');$templateCache.put("login/register.html",'<div class="signUp-content">\n'+'  <div class="signUp-
 holder">\n'+'    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n'+'      <h1 class="title">Register</h1>\n'+"\n"+'      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n'+'      <div class="control-group">\n'+'        <label class="control-label" for="register-orgName">Organization:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-name">Name:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class=""
  size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-userName">Username:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-email">Email:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-password">Password:</label>\n'+"\n"+'        <div
  class="controls">\n'+'          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n'+'                 size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPassword" ug-validate class="" size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="form-actions">\n'+'        <div class="submit">\n'+'          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n'+'                 class="btn btn-primary pull-right">\n'+"        </div>\n"+'        <div class="submit">\n'+'          <a ng-click="cancel()" type="submi
 t" name="button-cancel" id="button-cancel"\n'+'             class="btn btn-primary pull-right">Cancel</a>\n'+"        </div>\n"+"      </div>\n"+"    </form>\n"+'    <div class="console-section well thingy" ng-show="signUpSuccess">\n'+'      <span class="title">We\'re holding a seat for you!</span>\n'+"      <br><br>\n"+"\n"+"      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we're ready for\n"+"        you!</p>\n"+"\n"+"      <p>In the mean time, you can stay up to date with App Services on our <a\n"+'          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleGroup</a>.</p>\n'+"\n"+'      <p> <a href="#!/login">Back to login</a></p>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</div>\n");$templateCache.put("menus/appMenu.html",'<ul id="app-menu" class="nav top-nav span12">\n'+'    <li class="span7">\n'+'      <bsmodal id="newApplication"\n'+'               title="Create New Application"\n'+'               close="hideM
 odal"\n'+'               closelabel="Cancel"\n'+'               extrabutton="newApplicationDialog"\n'+'               extrabuttonlabel="Create"\n'+'               buttonid="app"\n'+"               ng-cloak>\n"+'        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n'+'        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n'+'        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n'+"      </bsmodal>\n"+'        <div class="btn-group">\n'+'            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n'+'                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n'+'                <span class="caret"></span>\n'+"            </a>\n"+'            <ul class="dro
 pdown-menu app-nav">\n'+'                <li name="app-selector" ng-repeat="app in applications">\n'+'                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n'+"                </li>\n"+"            </ul>\n"+"        </div>\n"+"    </li>\n"+'    <li class="span5">\n'+'      <a ng-if="activeUI"\n'+'         class="btn btn-create zero-out pull-right"\n'+"         ng-click=\"showModal('newApplication')\"\n"+'         analytics-on="click"\n'+'         analytics-category="App Services"\n'+'         analytics-label="Button"\n'+'         analytics-event="Add New App"\n'+"        >\n"+'        <i class="pictogram">&#8862;</i>\n'+"        Add New App\n"+"      </a>\n"+"    </li>\n"+"</ul>");$templateCache.put("menus/orgMenu.html",'<ul class="nav top-nav org-nav">\n'+"  <li>\n"+'<div class="btn-group ">\n'+'    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n'+'        <i class="pictogram
 ">&#128193</i> {{currentOrg}}<span class="caret"></span>\n'+"        </a>\n"+'    <ul class="dropdown-menu org-nav">\n'+'          <li name="org-selector" ng-repeat="(k,v) in organizations">\n'+'              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n'+"            </li>\n"+"         </ul>\n"+"    </div>\n"+"  </li></ul>");$templateCache.put("org-overview/org-overview.html",'<div class="org-overview-content" ng-show="activeUI">\n'+"\n"+'  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'  <div class="span6">\n'+'  	<bsmodal id="introjs"\n'+'             title="Welcome to the API BaaS Admin Portal"\n'+'             close="hideModal"\n'+'             closelabel="Skip"\n'+'             extrabutton="startFirstTimeUser"\n'+'             extrabuttonlabel="Take the tour"\n'+"             ng-cloak>\n"+"      <p>To get started, click 'Take the tour' for a full walkth
 rough of the admin portal, or click 'Skip' to start working right away.</p>\n"+"    </bsmodal>\n"+'		<div id="intro-4-current-org">	\n'+'	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n'+'	    <table class="table table-striped">\n'+"	      <tr>\n"+'	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n'+'	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n"+"\n"+'    <bsmodal id="newApplication"\n'+'             title="Create New Application"\n'+'             close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="newApplicationDialog"\n'+'             extrabuttonlabel="Create"\n'+"             ng-cloak>\n"+'      <p>New application name: <input ng-model="$parent.newApp.name"
   ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n'+"    </bsmodal>\n"+'		<div id="intro-5-applications">		\n'+'	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n'+'	      <div class="header-button btn-group pull-right">\n'+"	        <a class=\"btn filter-selector\" style=\"{{applicationsSize === 10 ? 'width:290px':''}}\"  ng-click=\"showModal('newApplication')\">\n"+'	          <span class="filter-label">Add New App</span>\n'+"	        </a>\n"+"	      </div>\n"+"	    </h2>\n"+"		\n"+'	    <table class="table table-striped">\n'+'	      <tr ng-repeat="application in applications">\n'+"	        <td>{{application.name}}</td>\n"+'	        <td style="text-align: right">{{application.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n
 "+'    <bsmodal id="regenerateCredentials"\n'+'             title="Confirm

<TRUNCATED>

[11/24] fixed help url

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/77ecd142/portal/js/usergrid.min.js
----------------------------------------------------------------------
diff --git a/portal/js/usergrid.min.js b/portal/js/usergrid.min.js
index 463b47e..119af23 100644
--- a/portal/js/usergrid.min.js
+++ b/portal/js/usergrid.min.js
@@ -1,6 +1,6 @@
-/*! usergrid@2.0.2 2014-04-01 */
+/*! usergrid@2.0.2 2014-04-02 */
 !function(exports,global){function renderChart(chartsDefaults,chartdata){var newSettings={};$.extend(!0,newSettings,chartsDefaults,chartdata);new Highcharts.Chart(newSettings)}function menuBindClick(scope,lElement,cevent,menuContext){var currentSelection=angular.element(cevent.srcElement).parent(),previousSelection=scope[menuContext];previousSelection!==currentSelection&&(previousSelection&&angular.element(previousSelection).removeClass("active"),scope[menuContext]=currentSelection,scope.$apply(function(){currentSelection.addClass("active")}))}global["true"]=exports;var polyfills=function(window,Object){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}(),Object.defineProperty(Object.prototype,"clone",{enumerable:!1,writable:!0,value:function(){var i,newObj=this instanceof Arra
 y?[]:{};for(i in this)"clone"!==i&&(newObj[i]=this[i]&&"object"==typeof this[i]?this[i].clone():this[i]);return newObj}}),Object.defineProperty(Object.prototype,"stringifyJSON",{enumerable:!1,writable:!0,value:function(){return JSON.stringify(this,null,"	")}})};polyfills(window,Object);var global=global||this,AppServices=AppServices||{};global.AppServices=global.AppServices||AppServices,AppServices.Constants=angular.module("appservices.constants",[]),AppServices.Services=angular.module("appservices.services",[]),AppServices.Controllers=angular.module("appservices.controllers",[]),AppServices.Filters=angular.module("appservices.filters",[]),AppServices.Directives=angular.module("appservices.directives",[]),AppServices.Performance=angular.module("appservices.performance",[]),AppServices.MAX=angular.module("appservices.max",[]),angular.module("appservices",["ngRoute","ngResource","ngSanitize","ui.bootstrap","angulartics","angulartics.google.analytics","appservices.filters","appservices
 .services","appservices.directives","appservices.constants","appservices.controllers","appservices.max","angular-intro"]).config(["$routeProvider","$locationProvider","$sceDelegateProvider","$analyticsProvider",function($routeProvider,$locationProvider,$sceDelegateProvider,$analyticsProvider){$routeProvider.when("/org-overview",{templateUrl:"org-overview/org-overview.html",controller:"OrgOverviewCtrl"}).when("/login",{templateUrl:"login/login.html",controller:"LoginCtrl"}).when("/login/loading",{templateUrl:"login/loading.html",controller:"LoginCtrl"}).when("/app-overview/summary",{templateUrl:"app-overview/app-overview.html",controller:"AppOverviewCtrl"}).when("/getting-started/setup",{templateUrl:"app-overview/getting-started.html",controller:"GettingStartedCtrl"}).when("/forgot-password",{templateUrl:"login/forgot-password.html",controller:"ForgotPasswordCtrl"}).when("/register",{templateUrl:"login/register.html",controller:"RegisterCtrl"}).when("/users",{templateUrl:"users/users
 .html",controller:"UsersCtrl"}).when("/users/profile",{templateUrl:"users/users-profile.html",controller:"UsersProfileCtrl"}).when("/users/groups",{templateUrl:"users/users-groups.html",controller:"UsersGroupsCtrl"}).when("/users/activities",{templateUrl:"users/users-activities.html",controller:"UsersActivitiesCtrl"}).when("/users/feed",{templateUrl:"users/users-feed.html",controller:"UsersFeedCtrl"}).when("/users/graph",{templateUrl:"users/users-graph.html",controller:"UsersGraphCtrl"}).when("/users/roles",{templateUrl:"users/users-roles.html",controller:"UsersRolesCtrl"}).when("/groups",{templateUrl:"groups/groups.html",controller:"GroupsCtrl"}).when("/groups/details",{templateUrl:"groups/groups-details.html",controller:"GroupsDetailsCtrl"}).when("/groups/members",{templateUrl:"groups/groups-members.html",controller:"GroupsMembersCtrl"}).when("/groups/activities",{templateUrl:"groups/groups-activities.html",controller:"GroupsActivitiesCtrl"}).when("/groups/roles",{templateUrl:"gro
 ups/groups-roles.html",controller:"GroupsRolesCtrl"}).when("/roles",{templateUrl:"roles/roles.html",controller:"RolesCtrl"}).when("/roles/settings",{templateUrl:"roles/roles-settings.html",controller:"RolesSettingsCtrl"}).when("/roles/users",{templateUrl:"roles/roles-users.html",controller:"RolesUsersCtrl"}).when("/roles/groups",{templateUrl:"roles/roles-groups.html",controller:"RolesGroupsCtrl"}).when("/data",{templateUrl:"data/data.html",controller:"DataCtrl"}).when("/data/entity",{templateUrl:"data/entity.html",controller:"EntityCtrl"}).when("/data/shell",{templateUrl:"data/shell.html",controller:"ShellCtrl"}).when("/profile/organizations",{templateUrl:"profile/organizations.html",controller:"OrgCtrl"}).when("/profile/profile",{templateUrl:"profile/profile.html",controller:"ProfileCtrl"}).when("/profile",{templateUrl:"profile/account.html",controller:"AccountCtrl"}).when("/activities",{templateUrl:"activities/activities.html",controller:"ActivitiesCtrl"}).when("/shell",{templateU
 rl:"shell/shell.html",controller:"ShellCtrl"}).when("/logout",{templateUrl:"login/logout.html",controller:"LogoutCtrl"}).otherwise({redirectTo:"/org-overview"}),$locationProvider.html5Mode(!1).hashPrefix("!"),$sceDelegateProvider.resourceUrlWhitelist(["self","http://apigee-internal-prod.jupiter.apigee.net/**","http://apigee-internal-prod.mars.apigee.net/**","https://appservices.apigee.com/**","https://api.usergrid.com/**"]),$analyticsProvider.virtualPageviews(!1),$analyticsProvider.firstPageview(!1)}]),AppServices.Controllers.controller("ActivitiesCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope){$scope.$on("app-activities-received",function(evt,data){$scope.activities=data,$scope.$apply()}),$scope.$on("app-activities-error",function(){$rootScope.$broadcast("alert","error","Application failed to retreive activities data.")}),ug.getActivities()}]),AppServices.Controllers.controller("AppOverviewCtrl",["ug","charts","$scope","$rootScope","$log",funct
 ion(ug,charts,$scope,$rootScope,$log){var createGradient=function(color1,color2){var perShapeGradient={x1:0,y1:0,x2:0,y2:1};return{linearGradient:perShapeGradient,stops:[[0,color1],[1,color2]]}};$scope.appOverview={},$scope.collections=[],$scope.graph="",$scope.$on("top-collections-received",function(event,collections){var dataDescription={bar1:{labels:["Total"],dataAttr:["title","count"],colors:[createGradient("rgba(36,151,212,0.6)","rgba(119,198,240,0.6)")],borderColor:"#1b97d1"}};$scope.collections=collections;var arr=[];for(var i in collections)collections.hasOwnProperty(i)&&arr.push(collections[i]);$scope.appOverview={},$rootScope.chartTemplate?($scope.appOverview.chart=angular.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()):ug.httpGet(null,"js/charts/highcharts.json").then(function(success){$rootScope.chartTemplate=success,$scope.appOverview.chart=angular
 .copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()},function(fail){$log.error("Problem getting chart template",fail)})}),$scope.$on("app-initialized",function(){ug.getTopCollections()}),$rootScope.activeUI&&ug.getTopCollections()}]),AppServices.Controllers.controller("GettingStartedCtrl",["ug","$scope","$rootScope","$location","$timeout","$anchorScroll",function(ug,$scope,$rootScope,$location,$timeout,$anchorScroll){$scope.collections=[],$scope.graph="",$scope.clientID="",$scope.clientSecret="";$scope.regenerateCredentialsDialog=function(modalId){$scope.orgAPICredentials={client_id:"regenerating...",client_secret:"regenerating..."},ug.regenerateAppCredentials(),$scope.hideModal(modalId)},$scope.$on("app-creds-updated",function(event,credentials){credentials?($scope.clientID=credentials.client_id,$scope.clientSecret=credentials.client_secret,$scope.$$phase||$scope.
 $apply()):setTimeout(function(){ug.getAppCredentials()},5e3)}),ug.getAppCredentials(),$scope.contentTitle,$scope.showSDKDetail=function(name){var introContainer=document.getElementById("intro-container");if("nocontent"===name)return introContainer.style.height="0",!0;introContainer.style.opacity=.1,introContainer.style.height="0";var timeout=0;$scope.contentTitle&&(timeout=500),$timeout(function(){introContainer.style.height="1000px",introContainer.style.opacity=1},timeout),$scope.optionName=name,$scope.contentTitle=name,$scope.sdkLink="http://apigee.com/docs/content/"+name+"-sdk-redirect",$scope.docsLink="http://apigee.com/docs/app-services/content/installing-apigee-sdk-"+name,$scope.getIncludeURL=function(){return"app-overview/doc-includes/"+$scope.optionName+".html"}},$scope.scrollToElement=function(elem){return $location.hash(elem),$anchorScroll(),!1}}]),AppServices.Controllers.controller("ChartCtrl",["$scope","$location",function(){}]),AppServices.Directives.directive("chart",f
 unction(){return{restrict:"E",scope:{chartdata:"=chartdata"},template:"<div></div>",replace:!0,controller:function(){},link:function(scope,element,attrs){scope.$watch("chartdata",function(chartdata){if(chartdata){var chartsDefaults={chart:{renderTo:element[0],type:attrs.type||null,height:attrs.height||null,width:attrs.width||null,reflow:!0,animation:!1,zoomType:"x"}};if("pie"===attrs.type&&(chartsDefaults.chart.margin=[0,0,0,0],chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.spacingTop=0,chartsDefaults.chart.spacingBottom=0,attrs.titleimage&&(chartdata.title.text='<img src="'+attrs.titleimage+'">'),attrs.titleicon&&(chartdata.title.text='<i class="pictogram '+attrs.titleiconclass+'">'+attrs.titleicon+"</i>"),attrs.titlecolor&&(chartdata.title.style.color=attrs.titlecolor),attrs.titleimagetop&&(chartdata.title.style.marginTop=attrs.titleimagetop),attrs.titleimageleft&&(chartdata.title.style.marginLeft=attrs.titleimageleft)),"line"===attrs.t
 ype&&(chartsDefaults.chart.marginTop=30,chartsDefaults.chart.spacingTop=50),"column"===attrs.type&&(chartsDefaults.chart.marginBottom=80),"area"===attrs.type&&(chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.marginLeft=0,chartsDefaults.chart.marginRight=0),Highcharts.setOptions({global:{useUTC:!1},chart:{style:{fontFamily:"marquette-light, Helvetica, Arial, sans-serif"}}}),"line"===attrs.type){var xAxis1=chartdata.xAxis[0];xAxis1.labels.formatter||(xAxis1.labels.formatter=new Function(attrs.xaxislabel)),xAxis1.labels.step||(xAxis1.labels.step=attrs.xaxisstep)}chartdata.tooltip&&"string"==typeof chartdata.tooltip.formatter&&(chartdata.tooltip.formatter=new Function(chartdata.tooltip.formatter)),renderChart(chartsDefaults,chartdata)}},!0)}}}),AppServices.Services.factory("charts",function(){function sortJsonArrayByProperty(objArray,prop){if(arguments.length<2)throw new Error("sortJsonArrayByProp requires 2 arguments");var direct=arguments.le
 ngth>2?arguments[2]:1;if(objArray&&objArray.constructor===Array){var propPath=prop.constructor===Array?prop:prop.split(".");objArray.sort(function(a,b){for(var p in propPath)a[propPath[p]]&&b[propPath[p]]&&(a=a[propPath[p]],b=b[propPath[p]]);return a=a.match(/^\d+$/)?+a:a,b=b.match(/^\d+$/)?+b:b,b>a?-1*direct:a>b?1*direct:0})}}var lineChart,areaChart,paretoChart,pieChart,xaxis,seriesIndex;return{convertLineChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)lineChart.series[localCounter].data.push("undefined"==typeof dp?[i,0]:[i,dp[dataAttrs[j]]]),detailedView||localCounter++}lineChart=chartTemplate,"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex
 =dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(lineChart=chartTemplate,seriesIndex=0,lineChart.series=[],label=""),xaxis=lineChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,lineChart.series[l]={},lineChart.series[l].data=[],lineChart.series[l].name=chartData[l].chartGroupName,lineChart.series[l].yAxis=0,lineChart.series[l].type="line",lineChart.series[l].color=dataDescription.colors[i],lineChart.series[l].dashStyle="solid",lineChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var
  steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;lineChart.series[i]={},lineChart.series[i].data=[],lineChart.series[i].name=label+dataDescription.labels[steadyCounter],lineChart.series[i].yAxis=yAxisIndex,lineChart.series[i].type="line",lineChart.series[i].color=dataDescription.colors[i],lineChart.series[i].dashStyle="solid",lineChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return lineChart},convertAreaChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)areaChart.series[localCounter].data.push("undefined"==typeof dp?0:dp[dataAttrs[j]]
 ),detailedView||localCounter++}areaChart=angular.copy(areaChart),"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(areaChart=chartTemplate,seriesIndex=0,areaChart.series=[],label=""),xaxis=areaChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,areaChart.series[l]={},areaChart.series[l].data=[],areaChart.series[l].fillColor=dataDescription.areaColors[l],areaChart.series[l].name=chart
 Data[l].chartGroupName,areaChart.series[l].yAxis=0,areaChart.series[l].type="area",areaChart.series[l].pointInterval=1,areaChart.series[l].color=dataDescription.colors[l],areaChart.series[l].dashStyle="solid",areaChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;areaChart.series[i]={},areaChart.series[i].data=[],areaChart.series[i].fillColor=dataDescription.areaColors[i],areaChart.series[i].name=label+dataDescription.labels[steadyCounter],areaChart.series[i].yAxis=yAxisIndex,areaChart.series[i].type="area",areaChart.series[i].pointInterval=1,areaChart.series[i].color=dataDescription.colors[i],areaChart.series[i].dashStyle="solid",areaChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0
 ],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return areaChart},convertParetoChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function getPreviousData(){for(var i=0;i<chartTemplate.series[0].data.length;i++)allParetoOptions.push(chartTemplate.xAxis.categories[i])}function createStackedBar(dataDescription,paretoChart){paretoChart.plotOptions={series:{shadow:!1,borderColor:dataDescription.borderColor,borderWidth:1},column:{stacking:"normal",dataLabels:{enabled:!0,color:Highcharts.theme&&Highcharts.theme.dataLabelsColor||"white"}}};var start=dataDescription.dataAttr[1].length,steadyCounter=0;compare&&(paretoChart.legend.enabled=!0);for(var f=seriesIndex;start+seriesIndex>f;f++)paretoChart.series[f]||(paretoChart.series[f]={data:[]}),paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]),paretoChart.series[f].name=""!==label?label+" "+dataDescription.labels[steadyCounter]:dataDescription.l
 abels[steadyCounter],paretoChart.series[f].color=dataDescription.colors[f],paretoChart.series[f].stack=label,steadyCounter++}paretoChart=chartTemplate,"undefined"==typeof chartData&&(chartData=[]);var label,cdLength=chartData.length,compare=!1,allParetoOptions=[],stackedBar=!1;if(seriesIndex=0,"object"==typeof dataDescription.dataAttr[1]&&(stackedBar=!0),"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),getPreviousData()):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),seriesIndex=getPreviousData()):(compare=!1,label="",paretoChart.xAxis.categories=[],paretoChart.series=[],paretoChart.series[0]={},paretoChart.series[0].data=[],paretoChart.legend.enabled=!1),paretoChart.plotOptions.series.borderColor=dataDescription.borderColor,compare&&!stackedBar){paretoChart.series[1]={},paretoChart.series[1].data=[];for(var i=0;i<allParetoOptions.length;i
 ++)paretoChart.series[1].data.push(0);paretoChart.legend.enabled=!0}for(var i=0;cdLength>i;i++){var bar=chartData[i];if(compare){var newLabel=bar[dataDescription.dataAttr[0]],newValue=bar[dataDescription.dataAttr[1]],previousIndex=allParetoOptions.indexOf(newLabel);previousIndex>-1&&("object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[1].data[previousIndex]=newValue,paretoChart.series[1].name=""!==label?label+" "+dataDescription.labels[0]:dataDescription.labels[0],paretoChart.series[1].color=dataDescription.colors[1]))}else paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]),"object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]),paretoChart.series[0].name=dataDescription.labels[0],paretoChart.series[0].color=dataDescription.colors[0])}return paretoChart},co
 nvertPieChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){var label,cdLength=chartData.length,compare=!1;pieChart=chartTemplate,"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!1):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!1):(compare=!1,pieChart.series[0].data=[],pieChart.series[0].dataLabels&&"string"==typeof pieChart.series[0].dataLabels.formatter&&(pieChart.series[0].dataLabels.formatter=new Function(pieChart.series[0].dataLabels.formatter))),pieChart.plotOptions.pie.borderColor=dataDescription.borderColor,compare&&(pieChart.series[1].data=[],pieChart.series[1].dataLabels&&"string"==typeof pieChart.series[1].dataLabels.formatter&&(pieChart.series[1].dataLabels.formatter=new Function(pieChart.series[1].dataLabels.formatter)));for(var tempArray=[],i=0;cdLength>i;i++){var pie=chartData[i];tempArray.push({name:pie[dataDescription.dataAttr[0]],y:pie[dataDescription.dataAttr[1]],color:""})}sortJsonArrayByProperty(tempArray,"name");
 for(var i=0;i<tempArray.length;i++)tempArray[i].color=dataDescription.colors[i];return compare?pieChart.series[1].data=tempArray:pieChart.series[0].data=tempArray,pieChart}}}),$(".sessions-bar").sparkline([3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,1],{type:"bar",barColor:"#c5c5c5",width:"800px",height:100,barWidth:12,barSpacing:"1px"}),AppServices.Controllers.controller("DataCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope){var init=function(){$scope.verb="GET",$scope.display="",$scope.queryBodyDetail={},$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.entitySelected={},$scope.newCollection={},$rootScope.queryCollection={},$scope.data={},$scope.data.queryPath="",$scope.data.queryBody='{ "name":"value" }',$scope.data.searchString="",$scope.data.queryLimit=""},runQuery=function(verb){$scope.loading=!0;var queryPath=$scope.remove
 FirstSlash($scope.data.queryPath||""),searchString=$scope.data.searchString||"",queryLimit=$scope.data.queryLimit||"",body=JSON.parse($scope.data.queryBody||"{}");"POST"==verb&&$scope.validateJson(!0)?ug.runDataPOSTQuery(queryPath,body):"PUT"==verb&&$scope.validateJson(!0)?ug.runDataPutQuery(queryPath,searchString,queryLimit,body):"DELETE"==verb?ug.runDataDeleteQuery(queryPath,searchString,queryLimit):ug.runDataQuery(queryPath,searchString,queryLimit)};$scope.$on("top-collections-received",function(event,collectionList){$scope.loading=!1;var ignoredCollections=["events"];ignoredCollections.forEach(function(ignoredCollection){collectionList.hasOwnProperty(ignoredCollection)&&delete collectionList[ignoredCollection]}),$scope.collectionList=collectionList,$scope.queryBoxesSelected=!1,$scope.queryPath||$scope.loadCollection("/"+collectionList[Object.keys(collectionList).sort()[0]].name),$scope.applyScope()}),$scope.$on("error-running-query",function(){$scope.loading=!1,runQuery("GET"),$
 scope.applyScope()}),$scope.$on("entity-deleted",function(){$scope.deleteLoading=!1,$rootScope.$broadcast("alert","success","Entities deleted sucessfully"),$scope.queryBoxesSelected=!1,$scope.checkNextPrev(),$scope.applyScope()}),$scope.$on("entity-deleted-error",function(){$scope.deleteLoading=!1,runQuery("GET"),$scope.applyScope()}),$scope.$on("collection-created",function(){$scope.newCollection.name=""}),$scope.$on("query-received",function(event,collection){$scope.loading=!1,$rootScope.queryCollection=collection,ug.getIndexes($scope.data.queryPath),$scope.setDisplayType(),$scope.checkNextPrev(),$scope.applyScope(),$scope.queryBoxesSelected=!1}),$scope.$on("indexes-received",function(event,indexes){}),$scope.$on("app-changed",function(){init()}),$scope.setDisplayType=function(){$scope.display="generic"},$scope.deleteEntitiesDialog=function(modalId){$scope.deleteLoading=!1,$scope.deleteEntities($rootScope.queryCollection,"entity-deleted","error deleting entity"),$scope.hideModal(m
 odalId)},$scope.newCollectionDialog=function(modalId){$scope.newCollection.name?(ug.createCollection($scope.newCollection.name),ug.getTopCollections(),$rootScope.$broadcast("alert","success","Collection created successfully."),$scope.hideModal(modalId)):$rootScope.$broadcast("alert","error","You must specify a collection name.")},$scope.addToPath=function(uuid){$scope.data.queryPath="/"+$rootScope.queryCollection._type+"/"+uuid},$scope.isDeep=function(item){return"[object Object]"===Object.prototype.toString.call(item)},$scope.loadCollection=function(type){$scope.data.queryPath="/"+type.substring(1,type.length),$scope.data.searchString="",$scope.data.queryLimit="",$scope.data.body='{ "name":"value" }',$scope.selectGET(),$scope.applyScope(),$scope.run()},$scope.selectGET=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="GET"},$scope.selectPOST=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="n
 one",$scope.queryStringDisplay="none",$scope.verb="POST"},$scope.selectPUT=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="PUT"},$scope.selectDELETE=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="DELETE"},$scope.validateJson=function(skipMessage){var queryBody=$scope.data.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),!skipMessage&&$rootScope.$broadcast("alert","success","JSON is valid"),$scope.data.queryBody=queryBody,!0},$scope.saveEntity=function(entity){if(!$scope.validateJson())return!1;var queryBody=entity._json;queryBody=JSON.parse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",entity._data.type),$rootScope.selectedEntity.set("uuid
 ",entity._data.uuid),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})},$scope.run=function(){$rootScope.queryCollection="";var verb=$scope.verb;runQuery(verb)},$scope.hasProperty=function(prop){var retval=!1;return"undefined"!=typeof $rootScope.queryCollection._list&&angular.forEach($rootScope.queryCollection._list,function(value){retval||value._data[prop]&&(retval=!0)}),retval},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$rootScope.queryCollection.hasPreviousPage()&&($scope.previous_display="default"),$rootScope.queryCollection.hasNextPage()&&($scope.next_display="default")},$scope.selectEntity=function(uuid){$rootScope.selectedEntity=$rootScope.queryCollection.getEntityByUUID(uuid),$scope.addToPath(uuid)},$scope.getJSONView=function(entity){var tem
 pjson=entity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2)},$scope.getPrevious=function(){$rootScope.queryCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of data"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$rootScope.queryCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of data"),$scope.checkNextPrev(),$scope.applyScope()})},init(),$rootScope.queryCollection=$rootScope.queryCollection||{},$rootScope.selectedEntity={},$rootScope.queryCollection&&$rootScope.queryCollection._type&&($scope.loadCollection($rootScope.queryCollection._type),$scope.setDisplayType()),ug.getTopCollections(),$scope.resetNextPrev()}]),AppServices.Controllers.con
 troller("EntityCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){if(!$rootScope.selectedEntity)return void $location.path("/data");$scope.entityUUID=$rootScope.selectedEntity.get("uuid"),$scope.entityType=$rootScope.selectedEntity.get("type");var tempjson=$rootScope.selectedEntity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2),$scope.validateJson=function(){var queryBody=$scope.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),$rootScope.$broadcast("alert","success","JSON is valid"),$scope.queryBody=queryBody,!0},$scope.saveEntity=function(){if(!$scope.validateJson())return!1;var queryBody=$scope.queryBody;queryBody=JSON.par
 se(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",$scope.entityType),$rootScope.selectedEntity.set("uuid",$scope.entityUUID),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})}}]),AppServices.Directives.directive("balloon",["$window","$timeout",function($window,$timeout){return{restrict:"ECA",scope:"=",template:'<div class="baloon {{direction}}" ng-transclude></div>',replace:!0,transclude:!0,link:function(scope,lElement,attrs){scope.direction=attrs.direction;var runScroll=!0,windowEl=angular.element($window);windowEl.on("scroll",function(){runScroll&&(lElement.addClass("fade-out"),$timeout(function(){lElement.addClass("hide")},1e3),runScroll=!1)})}}}]),AppServices.Directives.directive("bsmodal",["$rootScope",function($rootScope){return{restrict:"ECA",scope:{title:"@title",buttoni
 d:"=buttonid",footertext:"=footertext",closelabel:"=closelabel"},transclude:!0,templateUrl:"dialogs/modal.html",replace:!0,link:function(scope,lElement,attrs,parentCtrl){scope.title=attrs.title,scope.footertext=attrs.footertext,scope.closelabel=attrs.closelabel,scope.close=attrs.close,scope.extrabutton=attrs.extrabutton,scope.extrabuttonlabel=attrs.extrabuttonlabel,scope.buttonId=attrs.buttonid,scope.closeDelegate=function(attr){scope.$parent[attr](attrs.id,scope)},scope.extraDelegate=function(attr){scope.dialogForm.$valid?(console.log(parentCtrl),scope.$parent[attr](attrs.id)):$rootScope.$broadcast("alert","error","Please check your form input and resubmit.")}}}}]),AppServices.Controllers.controller("AlertCtrl",["$scope","$rootScope","$timeout",function($scope,$rootScope,$timeout){$scope.alertDisplay="none",$scope.alerts=[],$scope.$on("alert",function(event,type,message,permanent){$scope.addAlert(type,message,permanent)}),$scope.$on("clear-alerts",function(){$scope.alerts=[]}),$sco
 pe.addAlert=function(type,message,permanent){$scope.alertDisplay="block",$scope.alerts.push({type:type,msg:message}),$scope.applyScope(),permanent||$timeout(function(){$scope.alerts.shift()},5e3)},$scope.closeAlert=function(index){$scope.alerts.splice(index,1)}}]),AppServices.Directives.directive("alerti",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"ECA",scope:{type:"=type",closeable:"@closeable",index:"&index"},template:'<div class="alert" ng-class="type && \'alert-\' + type">    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i><div ng-transclude></div></div>',replace:!0,tr
 ansclude:!0,link:function(scope,lElement,attrs){$timeout(function(){lElement.addClass("fade-out")},4e3),lElement.click(function(){attrs.index&&scope.$parent.closeAlert(attrs.index)}),setTimeout(function(){lElement.addClass("alert-animate")},10)}}}]),AppServices.Directives.directive("appswitcher",["$rootScope",function(){return{restrict:"ECA",scope:"=",templateUrl:"global/appswitcher-template.html",replace:!0,transclude:!0,link:function(){function globalNavDetail(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#globalNavDetailApiPlatform").addClass(classNameOpen)}var classNameOpen="open";$("ul.nav li.dropdownContainingSubmenu").hover(function(){$(this).addClass(classNameOpen)},function(){$(this).removeClass(classNameOpen)}),$("#globalNav > a").mouseover(globalNavDetail),$("#globalNavDetail").mouseover(globalNavDetail),$("#globalNavSubmenuContainer ul li").mouseover(function(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#"+this.getAttribute("data-globalNavDet
 ail")).addClass(classNameOpen)})}}}]),AppServices.Services.factory("help",function($rootScope,$http,$analytics){$rootScope.help={},$rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1,$rootScope.help.clicked=!1,$rootScope.help.showHelpButtons=!1;
-var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){va
 r shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("https://sdk.apigee.com/portal_help"+path+"/helpJson.json?c
 allback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!initialized&&ug.getRo
 les(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootScope.activeUI=!1;f
 or(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_token",null),$locati
 on.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBroadcast),$scope.ap
 plyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSelected=function(li
 st){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),$scope.queryStrin
 gApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferredLogin.resolve()
 ,$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("request-times-slow",fu
 nction(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restrict:"E",transclude
 :!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};return{get:functio
 n(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastIndexOf("/")===DATA_
 URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appName");var key,size
 =0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthenticate(email,functi
 on(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEmail",null),this.c
 lient().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$broadcast("collec
 tion-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("administrators-received"
 ,administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",self.groupsCollec
 tion),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?options.qs.ql+" ord
 er by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={method:"PUT",endpo
 int:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){this.getCollection
 ("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function(event,receipts){
 self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,searchBy,orderBy){var
  search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups){err?$rootScope.$broadcast("alert","error","error getting groups"):$rootScope.$broadcast("user-groups-received",groups)})},ad
 dUserToGroup:function(user,group){var options={type:"users/"+user+"/groups/"+group};this.client().createEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to group"):$rootScope.$broadcast("user-added-to-group-received")})},addUserToRole:function(user,role){var options={method:"POST",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to role"):$rootScope.$broadcast("role-update-received")})},addGroupToRole:function(group,role){var options={method:"POST",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding group to role"):$rootScope.$broadcast("role-update-received")})},followUser:function(user){var username=$rootScope.selectedUser.get("uuid"),options={method:"POST",endpoint:"users/"+username+"/following/users/"+user};this.client().request(options,function(err){err?$ro
 otScope.$broadcast("alert","error","error following user"):$rootScope.$broadcast("follow-user-received")})},newPermission:function(permission,type,entity){var options={method:"POST",endpoint:type+"/"+entity+"/permissions",body:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding permission"):$rootScope.$broadcast("permission-update-received")})},newUserPermission:function(permission,username){this.newPermission(permission,"users",username)},newGroupPermission:function(permission,path){this.newPermission(permission,"groups",path)},newRolePermission:function(permission,name){this.newPermission(permission,"roles",name)},deletePermission:function(permission,type,entity){var options={method:"DELETE",endpoint:type+"/"+entity+"/permissions",qs:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting permission"):$rootScope.$broadcast("permission-upda
 te-received")})},deleteUserPermission:function(permission,user){this.deletePermission(permission,"users",user)},deleteGroupPermission:function(permission,group){this.deletePermission(permission,"groups",group)},deleteRolePermission:function(permission,rolename){this.deletePermission(permission,"roles",rolename)},removeUserFromRole:function(user,role){var options={method:"DELETE",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing user from role"):$rootScope.$broadcast("role-update-received")})},removeUserFromGroup:function(group,role){var options={method:"DELETE",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing role from the group"):$rootScope.$broadcast("role-update-received")})},createAndroidNotifier:function(name,APIkey){var options={method:"POST",endpoint:"notifiers",body:{apiKey:APIkey,name:name,pr
 ovider:"google"}};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error","error creating notifier ")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},createAppleNotifier:function(file,name,environment,certificatePassword){var provider="apple",formData=new FormData;formData.append("p12Certificate",file),formData.append("name",name),formData.append("provider",provider),formData.append("environment",environment),formData.append("certificatePassword",certificatePassword||"");var options={method:"POST",endpoint:"notifiers",formData:formData};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error",data.error_description||"error creating notifier")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},deleteNotifier:function(name){var
  options={method:"DELETE",endpoint:"notifiers/"+name};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting notifier"):$rootScope.$broadcast("notifier-update")})},initializeCurrentUser:function(callback){if(callback=callback||function(){},$rootScope.currentUser&&!$rootScope.currentUser.reset)return callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized","");var options={method:"GET",endpoint:"management/users/"+this.client().get("email"),mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Error getting user info"):($rootScope.currentUser=data.data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email),$rootScope.userEmail=$rootScope.currentUser.email,callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized",$rootScope.currentUser))})},updateUser:function(user){var body=$rootScope.currentUser;body.username=u
 ser.username,body.name=user.name,body.email=user.email;var options={method:"PUT",endpoint:"management/users/"+user.uuid+"/",mQuery:!0,body:body},self=this;this.client().request(options,function(err,data){return self.client().set("email",user.email),self.client().set("username",user.username),err?$rootScope.$broadcast("user-update-error",data):($rootScope.currentUser.reset=!0,void self.initializeCurrentUser(function(){$rootScope.$broadcast("user-update-success",$rootScope.currentUser)}))})},resetUserPassword:function(user){var pwdata={};pwdata.oldpassword=user.oldPassword,pwdata.newpassword=user.newPassword,pwdata.username=user.username;var options={method:"PUT",endpoint:"users/"+pwdata.uuid+"/",body:pwdata};this.client().request(options,function(err){return err?$rootScope.$broadcast("alert","error","Error resetting password"):($rootScope.currentUser.oldPassword="",$rootScope.currentUser.newPassword="",void $rootScope.$broadcast("user-reset-password-success",$rootScope.currentUser))}
 )},getOrgCredentials:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("org-creds-updated",data.credentials)})},regenerateOrgCredentials:function(){var options={method:"POST",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("org-creds-updated",data.credentials))})},getAppCredentials:function(){var options={method:"GET",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting
  credentials"):$rootScope.$broadcast("app-creds-updated",data.credentials)})},regenerateAppCredentials:function(){var options={method:"POST",endpoint:"credentials"};
+var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){va
 r shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("https://s3.amazonaws.com/sdk.apigee.com/portal_help"+path+
 "/helpJson.json?callback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!init
 ialized&&ug.getRoles(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootSc
 ope.activeUI=!1;for(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_tok
 en",null),$location.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBro
 adcast),$scope.applyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSel
 ected=function(list){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),
 $scope.queryStringApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferr
 edLogin.resolve(),$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("reque
 st-times-slow",function(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restri
 ct:"E",transclude:!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};r
 eturn{get:function(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastInd
 exOf("/")===DATA_URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appNa
 me");var key,size=0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthenti
 cate(email,function(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEm
 ail",null),this.client().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$
 broadcast("collection-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("adminis
 trators-received",administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",
 self.groupsCollection),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?op
 tions.qs.ql+" order by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={m
 ethod:"PUT",endpoint:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){t
 his.getCollection("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function
 (event,receipts){self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,sear
 chBy,orderBy){var search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups)

<TRUNCATED>

[13/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/67108093/portal/dist/usergrid-portal/js/usergrid.min.js
----------------------------------------------------------------------
diff --cc portal/dist/usergrid-portal/js/usergrid.min.js
index 0000000,3adab1b..119af23
mode 000000,100644..100644
--- a/portal/dist/usergrid-portal/js/usergrid.min.js
+++ b/portal/dist/usergrid-portal/js/usergrid.min.js
@@@ -1,0 -1,6 +1,6 @@@
+ /*! usergrid@2.0.2 2014-04-02 */
+ !function(exports,global){function renderChart(chartsDefaults,chartdata){var newSettings={};$.extend(!0,newSettings,chartsDefaults,chartdata);new Highcharts.Chart(newSettings)}function menuBindClick(scope,lElement,cevent,menuContext){var currentSelection=angular.element(cevent.srcElement).parent(),previousSelection=scope[menuContext];previousSelection!==currentSelection&&(previousSelection&&angular.element(previousSelection).removeClass("active"),scope[menuContext]=currentSelection,scope.$apply(function(){currentSelection.addClass("active")}))}global["true"]=exports;var polyfills=function(window,Object){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}(),Object.defineProperty(Object.prototype,"clone",{enumerable:!1,writable:!0,value:function(){var i,newObj=this instanceof Arr
 ay?[]:{};for(i in this)"clone"!==i&&(newObj[i]=this[i]&&"object"==typeof this[i]?this[i].clone():this[i]);return newObj}}),Object.defineProperty(Object.prototype,"stringifyJSON",{enumerable:!1,writable:!0,value:function(){return JSON.stringify(this,null,"	")}})};polyfills(window,Object);var global=global||this,AppServices=AppServices||{};global.AppServices=global.AppServices||AppServices,AppServices.Constants=angular.module("appservices.constants",[]),AppServices.Services=angular.module("appservices.services",[]),AppServices.Controllers=angular.module("appservices.controllers",[]),AppServices.Filters=angular.module("appservices.filters",[]),AppServices.Directives=angular.module("appservices.directives",[]),AppServices.Performance=angular.module("appservices.performance",[]),AppServices.MAX=angular.module("appservices.max",[]),angular.module("appservices",["ngRoute","ngResource","ngSanitize","ui.bootstrap","angulartics","angulartics.google.analytics","appservices.filters","appservice
 s.services","appservices.directives","appservices.constants","appservices.controllers","appservices.max","angular-intro"]).config(["$routeProvider","$locationProvider","$sceDelegateProvider","$analyticsProvider",function($routeProvider,$locationProvider,$sceDelegateProvider,$analyticsProvider){$routeProvider.when("/org-overview",{templateUrl:"org-overview/org-overview.html",controller:"OrgOverviewCtrl"}).when("/login",{templateUrl:"login/login.html",controller:"LoginCtrl"}).when("/login/loading",{templateUrl:"login/loading.html",controller:"LoginCtrl"}).when("/app-overview/summary",{templateUrl:"app-overview/app-overview.html",controller:"AppOverviewCtrl"}).when("/getting-started/setup",{templateUrl:"app-overview/getting-started.html",controller:"GettingStartedCtrl"}).when("/forgot-password",{templateUrl:"login/forgot-password.html",controller:"ForgotPasswordCtrl"}).when("/register",{templateUrl:"login/register.html",controller:"RegisterCtrl"}).when("/users",{templateUrl:"users/user
 s.html",controller:"UsersCtrl"}).when("/users/profile",{templateUrl:"users/users-profile.html",controller:"UsersProfileCtrl"}).when("/users/groups",{templateUrl:"users/users-groups.html",controller:"UsersGroupsCtrl"}).when("/users/activities",{templateUrl:"users/users-activities.html",controller:"UsersActivitiesCtrl"}).when("/users/feed",{templateUrl:"users/users-feed.html",controller:"UsersFeedCtrl"}).when("/users/graph",{templateUrl:"users/users-graph.html",controller:"UsersGraphCtrl"}).when("/users/roles",{templateUrl:"users/users-roles.html",controller:"UsersRolesCtrl"}).when("/groups",{templateUrl:"groups/groups.html",controller:"GroupsCtrl"}).when("/groups/details",{templateUrl:"groups/groups-details.html",controller:"GroupsDetailsCtrl"}).when("/groups/members",{templateUrl:"groups/groups-members.html",controller:"GroupsMembersCtrl"}).when("/groups/activities",{templateUrl:"groups/groups-activities.html",controller:"GroupsActivitiesCtrl"}).when("/groups/roles",{templateUrl:"gr
 oups/groups-roles.html",controller:"GroupsRolesCtrl"}).when("/roles",{templateUrl:"roles/roles.html",controller:"RolesCtrl"}).when("/roles/settings",{templateUrl:"roles/roles-settings.html",controller:"RolesSettingsCtrl"}).when("/roles/users",{templateUrl:"roles/roles-users.html",controller:"RolesUsersCtrl"}).when("/roles/groups",{templateUrl:"roles/roles-groups.html",controller:"RolesGroupsCtrl"}).when("/data",{templateUrl:"data/data.html",controller:"DataCtrl"}).when("/data/entity",{templateUrl:"data/entity.html",controller:"EntityCtrl"}).when("/data/shell",{templateUrl:"data/shell.html",controller:"ShellCtrl"}).when("/profile/organizations",{templateUrl:"profile/organizations.html",controller:"OrgCtrl"}).when("/profile/profile",{templateUrl:"profile/profile.html",controller:"ProfileCtrl"}).when("/profile",{templateUrl:"profile/account.html",controller:"AccountCtrl"}).when("/activities",{templateUrl:"activities/activities.html",controller:"ActivitiesCtrl"}).when("/shell",{template
 Url:"shell/shell.html",controller:"ShellCtrl"}).when("/logout",{templateUrl:"login/logout.html",controller:"LogoutCtrl"}).otherwise({redirectTo:"/org-overview"}),$locationProvider.html5Mode(!1).hashPrefix("!"),$sceDelegateProvider.resourceUrlWhitelist(["self","http://apigee-internal-prod.jupiter.apigee.net/**","http://apigee-internal-prod.mars.apigee.net/**","https://appservices.apigee.com/**","https://api.usergrid.com/**"]),$analyticsProvider.virtualPageviews(!1),$analyticsProvider.firstPageview(!1)}]),AppServices.Controllers.controller("ActivitiesCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope){$scope.$on("app-activities-received",function(evt,data){$scope.activities=data,$scope.$apply()}),$scope.$on("app-activities-error",function(){$rootScope.$broadcast("alert","error","Application failed to retreive activities data.")}),ug.getActivities()}]),AppServices.Controllers.controller("AppOverviewCtrl",["ug","charts","$scope","$rootScope","$log",func
 tion(ug,charts,$scope,$rootScope,$log){var createGradient=function(color1,color2){var perShapeGradient={x1:0,y1:0,x2:0,y2:1};return{linearGradient:perShapeGradient,stops:[[0,color1],[1,color2]]}};$scope.appOverview={},$scope.collections=[],$scope.graph="",$scope.$on("top-collections-received",function(event,collections){var dataDescription={bar1:{labels:["Total"],dataAttr:["title","count"],colors:[createGradient("rgba(36,151,212,0.6)","rgba(119,198,240,0.6)")],borderColor:"#1b97d1"}};$scope.collections=collections;var arr=[];for(var i in collections)collections.hasOwnProperty(i)&&arr.push(collections[i]);$scope.appOverview={},$rootScope.chartTemplate?($scope.appOverview.chart=angular.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()):ug.httpGet(null,"js/charts/highcharts.json").then(function(success){$rootScope.chartTemplate=success,$scope.appOverview.chart=angula
 r.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()},function(fail){$log.error("Problem getting chart template",fail)})}),$scope.$on("app-initialized",function(){ug.getTopCollections()}),$rootScope.activeUI&&ug.getTopCollections()}]),AppServices.Controllers.controller("GettingStartedCtrl",["ug","$scope","$rootScope","$location","$timeout","$anchorScroll",function(ug,$scope,$rootScope,$location,$timeout,$anchorScroll){$scope.collections=[],$scope.graph="",$scope.clientID="",$scope.clientSecret="";$scope.regenerateCredentialsDialog=function(modalId){$scope.orgAPICredentials={client_id:"regenerating...",client_secret:"regenerating..."},ug.regenerateAppCredentials(),$scope.hideModal(modalId)},$scope.$on("app-creds-updated",function(event,credentials){credentials?($scope.clientID=credentials.client_id,$scope.clientSecret=credentials.client_secret,$scope.$$phase||$scope
 .$apply()):setTimeout(function(){ug.getAppCredentials()},5e3)}),ug.getAppCredentials(),$scope.contentTitle,$scope.showSDKDetail=function(name){var introContainer=document.getElementById("intro-container");if("nocontent"===name)return introContainer.style.height="0",!0;introContainer.style.opacity=.1,introContainer.style.height="0";var timeout=0;$scope.contentTitle&&(timeout=500),$timeout(function(){introContainer.style.height="1000px",introContainer.style.opacity=1},timeout),$scope.optionName=name,$scope.contentTitle=name,$scope.sdkLink="http://apigee.com/docs/content/"+name+"-sdk-redirect",$scope.docsLink="http://apigee.com/docs/app-services/content/installing-apigee-sdk-"+name,$scope.getIncludeURL=function(){return"app-overview/doc-includes/"+$scope.optionName+".html"}},$scope.scrollToElement=function(elem){return $location.hash(elem),$anchorScroll(),!1}}]),AppServices.Controllers.controller("ChartCtrl",["$scope","$location",function(){}]),AppServices.Directives.directive("chart",
 function(){return{restrict:"E",scope:{chartdata:"=chartdata"},template:"<div></div>",replace:!0,controller:function(){},link:function(scope,element,attrs){scope.$watch("chartdata",function(chartdata){if(chartdata){var chartsDefaults={chart:{renderTo:element[0],type:attrs.type||null,height:attrs.height||null,width:attrs.width||null,reflow:!0,animation:!1,zoomType:"x"}};if("pie"===attrs.type&&(chartsDefaults.chart.margin=[0,0,0,0],chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.spacingTop=0,chartsDefaults.chart.spacingBottom=0,attrs.titleimage&&(chartdata.title.text='<img src="'+attrs.titleimage+'">'),attrs.titleicon&&(chartdata.title.text='<i class="pictogram '+attrs.titleiconclass+'">'+attrs.titleicon+"</i>"),attrs.titlecolor&&(chartdata.title.style.color=attrs.titlecolor),attrs.titleimagetop&&(chartdata.title.style.marginTop=attrs.titleimagetop),attrs.titleimageleft&&(chartdata.title.style.marginLeft=attrs.titleimageleft)),"line"===attrs.
 type&&(chartsDefaults.chart.marginTop=30,chartsDefaults.chart.spacingTop=50),"column"===attrs.type&&(chartsDefaults.chart.marginBottom=80),"area"===attrs.type&&(chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.marginLeft=0,chartsDefaults.chart.marginRight=0),Highcharts.setOptions({global:{useUTC:!1},chart:{style:{fontFamily:"marquette-light, Helvetica, Arial, sans-serif"}}}),"line"===attrs.type){var xAxis1=chartdata.xAxis[0];xAxis1.labels.formatter||(xAxis1.labels.formatter=new Function(attrs.xaxislabel)),xAxis1.labels.step||(xAxis1.labels.step=attrs.xaxisstep)}chartdata.tooltip&&"string"==typeof chartdata.tooltip.formatter&&(chartdata.tooltip.formatter=new Function(chartdata.tooltip.formatter)),renderChart(chartsDefaults,chartdata)}},!0)}}}),AppServices.Services.factory("charts",function(){function sortJsonArrayByProperty(objArray,prop){if(arguments.length<2)throw new Error("sortJsonArrayByProp requires 2 arguments");var direct=arguments.l
 ength>2?arguments[2]:1;if(objArray&&objArray.constructor===Array){var propPath=prop.constructor===Array?prop:prop.split(".");objArray.sort(function(a,b){for(var p in propPath)a[propPath[p]]&&b[propPath[p]]&&(a=a[propPath[p]],b=b[propPath[p]]);return a=a.match(/^\d+$/)?+a:a,b=b.match(/^\d+$/)?+b:b,b>a?-1*direct:a>b?1*direct:0})}}var lineChart,areaChart,paretoChart,pieChart,xaxis,seriesIndex;return{convertLineChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)lineChart.series[localCounter].data.push("undefined"==typeof dp?[i,0]:[i,dp[dataAttrs[j]]]),detailedView||localCounter++}lineChart=chartTemplate,"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesInde
 x=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(lineChart=chartTemplate,seriesIndex=0,lineChart.series=[],label=""),xaxis=lineChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,lineChart.series[l]={},lineChart.series[l].data=[],lineChart.series[l].name=chartData[l].chartGroupName,lineChart.series[l].yAxis=0,lineChart.series[l].type="line",lineChart.series[l].color=dataDescription.colors[i],lineChart.series[l].dashStyle="solid",lineChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(va
 r steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;lineChart.series[i]={},lineChart.series[i].data=[],lineChart.series[i].name=label+dataDescription.labels[steadyCounter],lineChart.series[i].yAxis=yAxisIndex,lineChart.series[i].type="line",lineChart.series[i].color=dataDescription.colors[i],lineChart.series[i].dashStyle="solid",lineChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return lineChart},convertAreaChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)areaChart.series[localCounter].data.push("undefined"==typeof dp?0:dp[dataAttrs[j]
 ]),detailedView||localCounter++}areaChart=angular.copy(areaChart),"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(areaChart=chartTemplate,seriesIndex=0,areaChart.series=[],label=""),xaxis=areaChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,areaChart.series[l]={},areaChart.series[l].data=[],areaChart.series[l].fillColor=dataDescription.areaColors[l],areaChart.series[l].name=char
 tData[l].chartGroupName,areaChart.series[l].yAxis=0,areaChart.series[l].type="area",areaChart.series[l].pointInterval=1,areaChart.series[l].color=dataDescription.colors[l],areaChart.series[l].dashStyle="solid",areaChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;areaChart.series[i]={},areaChart.series[i].data=[],areaChart.series[i].fillColor=dataDescription.areaColors[i],areaChart.series[i].name=label+dataDescription.labels[steadyCounter],areaChart.series[i].yAxis=yAxisIndex,areaChart.series[i].type="area",areaChart.series[i].pointInterval=1,areaChart.series[i].color=dataDescription.colors[i],areaChart.series[i].dashStyle="solid",areaChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:
 0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return areaChart},convertParetoChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function getPreviousData(){for(var i=0;i<chartTemplate.series[0].data.length;i++)allParetoOptions.push(chartTemplate.xAxis.categories[i])}function createStackedBar(dataDescription,paretoChart){paretoChart.plotOptions={series:{shadow:!1,borderColor:dataDescription.borderColor,borderWidth:1},column:{stacking:"normal",dataLabels:{enabled:!0,color:Highcharts.theme&&Highcharts.theme.dataLabelsColor||"white"}}};var start=dataDescription.dataAttr[1].length,steadyCounter=0;compare&&(paretoChart.legend.enabled=!0);for(var f=seriesIndex;start+seriesIndex>f;f++)paretoChart.series[f]||(paretoChart.series[f]={data:[]}),paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]),paretoChart.series[f].name=""!==label?label+" "+dataDescription.labels[steadyCounter]:dataDescription.
 labels[steadyCounter],paretoChart.series[f].color=dataDescription.colors[f],paretoChart.series[f].stack=label,steadyCounter++}paretoChart=chartTemplate,"undefined"==typeof chartData&&(chartData=[]);var label,cdLength=chartData.length,compare=!1,allParetoOptions=[],stackedBar=!1;if(seriesIndex=0,"object"==typeof dataDescription.dataAttr[1]&&(stackedBar=!0),"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),getPreviousData()):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),seriesIndex=getPreviousData()):(compare=!1,label="",paretoChart.xAxis.categories=[],paretoChart.series=[],paretoChart.series[0]={},paretoChart.series[0].data=[],paretoChart.legend.enabled=!1),paretoChart.plotOptions.series.borderColor=dataDescription.borderColor,compare&&!stackedBar){paretoChart.series[1]={},paretoChart.series[1].data=[];for(var i=0;i<allParetoOptions.length;
 i++)paretoChart.series[1].data.push(0);paretoChart.legend.enabled=!0}for(var i=0;cdLength>i;i++){var bar=chartData[i];if(compare){var newLabel=bar[dataDescription.dataAttr[0]],newValue=bar[dataDescription.dataAttr[1]],previousIndex=allParetoOptions.indexOf(newLabel);previousIndex>-1&&("object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[1].data[previousIndex]=newValue,paretoChart.series[1].name=""!==label?label+" "+dataDescription.labels[0]:dataDescription.labels[0],paretoChart.series[1].color=dataDescription.colors[1]))}else paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]),"object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]),paretoChart.series[0].name=dataDescription.labels[0],paretoChart.series[0].color=dataDescription.colors[0])}return paretoChart},c
 onvertPieChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){var label,cdLength=chartData.length,compare=!1;pieChart=chartTemplate,"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!1):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!1):(compare=!1,pieChart.series[0].data=[],pieChart.series[0].dataLabels&&"string"==typeof pieChart.series[0].dataLabels.formatter&&(pieChart.series[0].dataLabels.formatter=new Function(pieChart.series[0].dataLabels.formatter))),pieChart.plotOptions.pie.borderColor=dataDescription.borderColor,compare&&(pieChart.series[1].data=[],pieChart.series[1].dataLabels&&"string"==typeof pieChart.series[1].dataLabels.formatter&&(pieChart.series[1].dataLabels.formatter=new Function(pieChart.series[1].dataLabels.formatter)));for(var tempArray=[],i=0;cdLength>i;i++){var pie=chartData[i];tempArray.push({name:pie[dataDescription.dataAttr[0]],y:pie[dataDescription.dataAttr[1]],color:""})}sortJsonArrayByProperty(tempArray,"name")
 ;for(var i=0;i<tempArray.length;i++)tempArray[i].color=dataDescription.colors[i];return compare?pieChart.series[1].data=tempArray:pieChart.series[0].data=tempArray,pieChart}}}),$(".sessions-bar").sparkline([3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,1],{type:"bar",barColor:"#c5c5c5",width:"800px",height:100,barWidth:12,barSpacing:"1px"}),AppServices.Controllers.controller("DataCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope){var init=function(){$scope.verb="GET",$scope.display="",$scope.queryBodyDetail={},$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.entitySelected={},$scope.newCollection={},$rootScope.queryCollection={},$scope.data={},$scope.data.queryPath="",$scope.data.queryBody='{ "name":"value" }',$scope.data.searchString="",$scope.data.queryLimit=""},runQuery=function(verb){$scope.loading=!0;var queryPath=$scope.remov
 eFirstSlash($scope.data.queryPath||""),searchString=$scope.data.searchString||"",queryLimit=$scope.data.queryLimit||"",body=JSON.parse($scope.data.queryBody||"{}");"POST"==verb&&$scope.validateJson(!0)?ug.runDataPOSTQuery(queryPath,body):"PUT"==verb&&$scope.validateJson(!0)?ug.runDataPutQuery(queryPath,searchString,queryLimit,body):"DELETE"==verb?ug.runDataDeleteQuery(queryPath,searchString,queryLimit):ug.runDataQuery(queryPath,searchString,queryLimit)};$scope.$on("top-collections-received",function(event,collectionList){$scope.loading=!1;var ignoredCollections=["events"];ignoredCollections.forEach(function(ignoredCollection){collectionList.hasOwnProperty(ignoredCollection)&&delete collectionList[ignoredCollection]}),$scope.collectionList=collectionList,$scope.queryBoxesSelected=!1,$scope.queryPath||$scope.loadCollection("/"+collectionList[Object.keys(collectionList).sort()[0]].name),$scope.applyScope()}),$scope.$on("error-running-query",function(){$scope.loading=!1,runQuery("GET"),
 $scope.applyScope()}),$scope.$on("entity-deleted",function(){$scope.deleteLoading=!1,$rootScope.$broadcast("alert","success","Entities deleted sucessfully"),$scope.queryBoxesSelected=!1,$scope.checkNextPrev(),$scope.applyScope()}),$scope.$on("entity-deleted-error",function(){$scope.deleteLoading=!1,runQuery("GET"),$scope.applyScope()}),$scope.$on("collection-created",function(){$scope.newCollection.name=""}),$scope.$on("query-received",function(event,collection){$scope.loading=!1,$rootScope.queryCollection=collection,ug.getIndexes($scope.data.queryPath),$scope.setDisplayType(),$scope.checkNextPrev(),$scope.applyScope(),$scope.queryBoxesSelected=!1}),$scope.$on("indexes-received",function(event,indexes){}),$scope.$on("app-changed",function(){init()}),$scope.setDisplayType=function(){$scope.display="generic"},$scope.deleteEntitiesDialog=function(modalId){$scope.deleteLoading=!1,$scope.deleteEntities($rootScope.queryCollection,"entity-deleted","error deleting entity"),$scope.hideModal(
 modalId)},$scope.newCollectionDialog=function(modalId){$scope.newCollection.name?(ug.createCollection($scope.newCollection.name),ug.getTopCollections(),$rootScope.$broadcast("alert","success","Collection created successfully."),$scope.hideModal(modalId)):$rootScope.$broadcast("alert","error","You must specify a collection name.")},$scope.addToPath=function(uuid){$scope.data.queryPath="/"+$rootScope.queryCollection._type+"/"+uuid},$scope.isDeep=function(item){return"[object Object]"===Object.prototype.toString.call(item)},$scope.loadCollection=function(type){$scope.data.queryPath="/"+type.substring(1,type.length),$scope.data.searchString="",$scope.data.queryLimit="",$scope.data.body='{ "name":"value" }',$scope.selectGET(),$scope.applyScope(),$scope.run()},$scope.selectGET=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="GET"},$scope.selectPOST=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="
 none",$scope.queryStringDisplay="none",$scope.verb="POST"},$scope.selectPUT=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="PUT"},$scope.selectDELETE=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="DELETE"},$scope.validateJson=function(skipMessage){var queryBody=$scope.data.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),!skipMessage&&$rootScope.$broadcast("alert","success","JSON is valid"),$scope.data.queryBody=queryBody,!0},$scope.saveEntity=function(entity){if(!$scope.validateJson())return!1;var queryBody=entity._json;queryBody=JSON.parse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",entity._data.type),$rootScope.selectedEntity.set("uui
 d",entity._data.uuid),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})},$scope.run=function(){$rootScope.queryCollection="";var verb=$scope.verb;runQuery(verb)},$scope.hasProperty=function(prop){var retval=!1;return"undefined"!=typeof $rootScope.queryCollection._list&&angular.forEach($rootScope.queryCollection._list,function(value){retval||value._data[prop]&&(retval=!0)}),retval},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$rootScope.queryCollection.hasPreviousPage()&&($scope.previous_display="default"),$rootScope.queryCollection.hasNextPage()&&($scope.next_display="default")},$scope.selectEntity=function(uuid){$rootScope.selectedEntity=$rootScope.queryCollection.getEntityByUUID(uuid),$scope.addToPath(uuid)},$scope.getJSONView=function(entity){var te
 mpjson=entity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2)},$scope.getPrevious=function(){$rootScope.queryCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of data"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$rootScope.queryCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of data"),$scope.checkNextPrev(),$scope.applyScope()})},init(),$rootScope.queryCollection=$rootScope.queryCollection||{},$rootScope.selectedEntity={},$rootScope.queryCollection&&$rootScope.queryCollection._type&&($scope.loadCollection($rootScope.queryCollection._type),$scope.setDisplayType()),ug.getTopCollections(),$scope.resetNextPrev()}]),AppServices.Controllers.co
 ntroller("EntityCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){if(!$rootScope.selectedEntity)return void $location.path("/data");$scope.entityUUID=$rootScope.selectedEntity.get("uuid"),$scope.entityType=$rootScope.selectedEntity.get("type");var tempjson=$rootScope.selectedEntity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2),$scope.validateJson=function(){var queryBody=$scope.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),$rootScope.$broadcast("alert","success","JSON is valid"),$scope.queryBody=queryBody,!0},$scope.saveEntity=function(){if(!$scope.validateJson())return!1;var queryBody=$scope.queryBody;queryBody=JSON.pa
 rse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",$scope.entityType),$rootScope.selectedEntity.set("uuid",$scope.entityUUID),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})}}]),AppServices.Directives.directive("balloon",["$window","$timeout",function($window,$timeout){return{restrict:"ECA",scope:"=",template:'<div class="baloon {{direction}}" ng-transclude></div>',replace:!0,transclude:!0,link:function(scope,lElement,attrs){scope.direction=attrs.direction;var runScroll=!0,windowEl=angular.element($window);windowEl.on("scroll",function(){runScroll&&(lElement.addClass("fade-out"),$timeout(function(){lElement.addClass("hide")},1e3),runScroll=!1)})}}}]),AppServices.Directives.directive("bsmodal",["$rootScope",function($rootScope){return{restrict:"ECA",scope:{title:"@title",button
 id:"=buttonid",footertext:"=footertext",closelabel:"=closelabel"},transclude:!0,templateUrl:"dialogs/modal.html",replace:!0,link:function(scope,lElement,attrs,parentCtrl){scope.title=attrs.title,scope.footertext=attrs.footertext,scope.closelabel=attrs.closelabel,scope.close=attrs.close,scope.extrabutton=attrs.extrabutton,scope.extrabuttonlabel=attrs.extrabuttonlabel,scope.buttonId=attrs.buttonid,scope.closeDelegate=function(attr){scope.$parent[attr](attrs.id,scope)},scope.extraDelegate=function(attr){scope.dialogForm.$valid?(console.log(parentCtrl),scope.$parent[attr](attrs.id)):$rootScope.$broadcast("alert","error","Please check your form input and resubmit.")}}}}]),AppServices.Controllers.controller("AlertCtrl",["$scope","$rootScope","$timeout",function($scope,$rootScope,$timeout){$scope.alertDisplay="none",$scope.alerts=[],$scope.$on("alert",function(event,type,message,permanent){$scope.addAlert(type,message,permanent)}),$scope.$on("clear-alerts",function(){$scope.alerts=[]}),$sc
 ope.addAlert=function(type,message,permanent){$scope.alertDisplay="block",$scope.alerts.push({type:type,msg:message}),$scope.applyScope(),permanent||$timeout(function(){$scope.alerts.shift()},5e3)},$scope.closeAlert=function(index){$scope.alerts.splice(index,1)}}]),AppServices.Directives.directive("alerti",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"ECA",scope:{type:"=type",closeable:"@closeable",index:"&index"},template:'<div class="alert" ng-class="type && \'alert-\' + type">    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i><div ng-transclude></div></div>',replace:!0,t
 ransclude:!0,link:function(scope,lElement,attrs){$timeout(function(){lElement.addClass("fade-out")},4e3),lElement.click(function(){attrs.index&&scope.$parent.closeAlert(attrs.index)}),setTimeout(function(){lElement.addClass("alert-animate")},10)}}}]),AppServices.Directives.directive("appswitcher",["$rootScope",function(){return{restrict:"ECA",scope:"=",templateUrl:"global/appswitcher-template.html",replace:!0,transclude:!0,link:function(){function globalNavDetail(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#globalNavDetailApiPlatform").addClass(classNameOpen)}var classNameOpen="open";$("ul.nav li.dropdownContainingSubmenu").hover(function(){$(this).addClass(classNameOpen)},function(){$(this).removeClass(classNameOpen)}),$("#globalNav > a").mouseover(globalNavDetail),$("#globalNavDetail").mouseover(globalNavDetail),$("#globalNavSubmenuContainer ul li").mouseover(function(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#"+this.getAttribute("data-globalNavDe
 tail")).addClass(classNameOpen)})}}}]),AppServices.Services.factory("help",function($rootScope,$http,$analytics){$rootScope.help={},$rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1,$rootScope.help.clicked=!1,$rootScope.help.showHelpButtons=!1;
 -var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){v
 ar shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help"+path+
 "/helpJson.json?callback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!init
 ialized&&ug.getRoles(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootSc
 ope.activeUI=!1;for(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_tok
 en",null),$location.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBro
 adcast),$scope.applyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSel
 ected=function(list){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),
 $scope.queryStringApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferr
 edLogin.resolve(),$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("reque
 st-times-slow",function(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restri
 ct:"E",transclude:!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};r
 eturn{get:function(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastInd
 exOf("/")===DATA_URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appNa
 me");var key,size=0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthenti
 cate(email,function(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEm
 ail",null),this.client().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$
 broadcast("collection-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("adminis
 trators-received",administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",
 self.groupsCollection),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?op
 tions.qs.ql+" order by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={m
 ethod:"PUT",endpoint:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){t
 his.getCollection("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function
 (event,receipts){self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,sear
 chBy,orderBy){var search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups){err?$rootScope.$broadcast("alert","error","error getting groups"):$rootScope.$broadcast("user-groups-receiv
 ed",groups)})},addUserToGroup:function(user,group){var options={type:"users/"+user+"/groups/"+group};this.client().createEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to group"):$rootScope.$broadcast("user-added-to-group-received")})},addUserToRole:function(user,role){var options={method:"POST",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to role"):$rootScope.$broadcast("role-update-received")})},addGroupToRole:function(group,role){var options={method:"POST",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding group to role"):$rootScope.$broadcast("role-update-received")})},followUser:function(user){var username=$rootScope.selectedUser.get("uuid"),options={method:"POST",endpoint:"users/"+username+"/following/users/"+user};this.client().request(options,func
 tion(err){err?$rootScope.$broadcast("alert","error","error following user"):$rootScope.$broadcast("follow-user-received")})},newPermission:function(permission,type,entity){var options={method:"POST",endpoint:type+"/"+entity+"/permissions",body:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding permission"):$rootScope.$broadcast("permission-update-received")})},newUserPermission:function(permission,username){this.newPermission(permission,"users",username)},newGroupPermission:function(permission,path){this.newPermission(permission,"groups",path)},newRolePermission:function(permission,name){this.newPermission(permission,"roles",name)},deletePermission:function(permission,type,entity){var options={method:"DELETE",endpoint:type+"/"+entity+"/permissions",qs:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting permission"):$rootScope.$broadcast
 ("permission-update-received")})},deleteUserPermission:function(permission,user){this.deletePermission(permission,"users",user)},deleteGroupPermission:function(permission,group){this.deletePermission(permission,"groups",group)},deleteRolePermission:function(permission,rolename){this.deletePermission(permission,"roles",rolename)},removeUserFromRole:function(user,role){var options={method:"DELETE",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing user from role"):$rootScope.$broadcast("role-update-received")})},removeUserFromGroup:function(group,role){var options={method:"DELETE",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing role from the group"):$rootScope.$broadcast("role-update-received")})},createAndroidNotifier:function(name,APIkey){var options={method:"POST",endpoint:"notifiers",body:{apiKey:AP
 Ikey,name:name,provider:"google"}};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error","error creating notifier ")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},createAppleNotifier:function(file,name,environment,certificatePassword){var provider="apple",formData=new FormData;formData.append("p12Certificate",file),formData.append("name",name),formData.append("provider",provider),formData.append("environment",environment),formData.append("certificatePassword",certificatePassword||"");var options={method:"POST",endpoint:"notifiers",formData:formData};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error",data.error_description||"error creating notifier")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},deleteNotifier:f
 unction(name){var options={method:"DELETE",endpoint:"notifiers/"+name};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting notifier"):$rootScope.$broadcast("notifier-update")})},initializeCurrentUser:function(callback){if(callback=callback||function(){},$rootScope.currentUser&&!$rootScope.currentUser.reset)return callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized","");var options={method:"GET",endpoint:"management/users/"+this.client().get("email"),mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Error getting user info"):($rootScope.currentUser=data.data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email),$rootScope.userEmail=$rootScope.currentUser.email,callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized",$rootScope.currentUser))})},updateUser:function(user){var body=$rootScope.currentUse
 r;body.username=user.username,body.name=user.name,body.email=user.email;var options={method:"PUT",endpoint:"management/users/"+user.uuid+"/",mQuery:!0,body:body},self=this;this.client().request(options,function(err,data){return self.client().set("email",user.email),self.client().set("username",user.username),err?$rootScope.$broadcast("user-update-error",data):($rootScope.currentUser.reset=!0,void self.initializeCurrentUser(function(){$rootScope.$broadcast("user-update-success",$rootScope.currentUser)}))})},resetUserPassword:function(user){var pwdata={};pwdata.oldpassword=user.oldPassword,pwdata.newpassword=user.newPassword,pwdata.username=user.username;var options={method:"PUT",endpoint:"users/"+pwdata.uuid+"/",body:pwdata};this.client().request(options,function(err){return err?$rootScope.$broadcast("alert","error","Error resetting password"):($rootScope.currentUser.oldPassword="",$rootScope.currentUser.newPassword="",void $rootScope.$broadcast("user-reset-password-success",$rootSco
 pe.currentUser))})},getOrgCredentials:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("org-creds-updated",data.credentials)})},regenerateOrgCredentials:function(){var options={method:"POST",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("org-creds-updated",data.credentials))})},getAppCredentials:function(){var options={method:"GET",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","erro
 r","Error getting credentials"):$rootScope.$broadcast("app-creds-updated",data.credentials)})},regenerateAppCredentials:function(){var options={method:"POST",endpoint:"credentials"};
++var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){v
 ar shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("https://s3.amazonaws.com/sdk.apigee.com/portal_help"+path
 +"/helpJson.json?callback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!ini
 tialized&&ug.getRoles(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootS
 cope.activeUI=!1;for(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_to
 ken",null),$location.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBr
 oadcast),$scope.applyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSe
 lected=function(list){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope()
 ,$scope.queryStringApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.defer
 redLogin.resolve(),$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("requ
 est-times-slow",function(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restr
 ict:"E",transclude:!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};
 return{get:function(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastIn
 dexOf("/")===DATA_URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appN
 ame");var key,size=0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthent
 icate(email,function(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userE
 mail",null),this.client().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.
 $broadcast("collection-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("admini
 strators-received",administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success"
 ,self.groupsCollection),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?o
 ptions.qs.ql+" order by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={
 method:"PUT",endpoint:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){
 this.getCollection("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",functio
 n(event,receipts){self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,sea
 rchBy,orderBy){var search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+u

<TRUNCATED>

[12/24] git commit: fixed help url

Posted by sn...@apache.org.
fixed help url


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/77ecd142
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/77ecd142
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/77ecd142

Branch: refs/pull/96/merge
Commit: 77ecd14225f0ca9189666841d37614f85a1dc63d
Parents: 0818271
Author: amuramoto <am...@apigee.com>
Authored: Wed Apr 2 09:25:15 2014 -0700
Committer: amuramoto <am...@apigee.com>
Committed: Wed Apr 2 09:25:15 2014 -0700

----------------------------------------------------------------------
 portal/js/global/help-service.js | 2 +-
 portal/js/usergrid-dev.min.js    | 4 ++--
 portal/js/usergrid.min.js        | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/77ecd142/portal/js/global/help-service.js
----------------------------------------------------------------------
diff --git a/portal/js/global/help-service.js b/portal/js/global/help-service.js
index 6335e3c..5a1203d 100644
--- a/portal/js/global/help-service.js
+++ b/portal/js/global/help-service.js
@@ -122,7 +122,7 @@ AppServices.Services.factory('help', function($rootScope, $http, $analytics) {
 
 
   var getHelpJson = function(path) {
-    return $http.jsonp('https://sdk.apigee.com/portal_help' + path + '/helpJson.json?callback=JSON_CALLBACK');
+    return $http.jsonp('https://s3.amazonaws.com/sdk.apigee.com/portal_help' + path + '/helpJson.json?callback=JSON_CALLBACK');
   };
 
   var getHelpStatus = function(helpType) {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/77ecd142/portal/js/usergrid-dev.min.js
----------------------------------------------------------------------
diff --git a/portal/js/usergrid-dev.min.js b/portal/js/usergrid-dev.min.js
index 805a4dc..1568183 100644
--- a/portal/js/usergrid-dev.min.js
+++ b/portal/js/usergrid-dev.min.js
@@ -1,4 +1,4 @@
-/*! usergrid@2.0.2 2014-04-01 */
+/*! usergrid@2.0.2 2014-04-02 */
 (function(exports, global) {
     global["true"] = exports;
     "use strict";
@@ -1237,7 +1237,7 @@
             introjs_step++;
         };
         var getHelpJson = function(path) {
-            return $http.jsonp("https://sdk.apigee.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
+            return $http.jsonp("https://s3.amazonaws.com/sdk.apigee.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
         };
         var getHelpStatus = function(helpType) {
             var status;


[05/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/js/usergrid-dev.min.js.orig
----------------------------------------------------------------------
diff --git a/portal/js/usergrid-dev.min.js.orig b/portal/js/usergrid-dev.min.js.orig
new file mode 100644
index 0000000..af849c2
--- /dev/null
+++ b/portal/js/usergrid-dev.min.js.orig
@@ -0,0 +1,4939 @@
+/*! usergrid@2.0.2 2014-03-31 */
+(function(exports, global) {
+    global["true"] = exports;
+    "use strict";
+    var polyfills = function(window, Object) {
+        window.requestAnimFrame = function() {
+            return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {
+                window.setTimeout(callback, 1e3 / 60);
+            };
+        }();
+        Object.defineProperty(Object.prototype, "clone", {
+            enumerable: false,
+            writable: true,
+            value: function() {
+                var i, newObj = this instanceof Array ? [] : {};
+                for (i in this) {
+                    if (i === "clone") {
+                        continue;
+                    }
+                    if (this[i] && typeof this[i] === "object") {
+                        newObj[i] = this[i].clone();
+                    } else {
+                        newObj[i] = this[i];
+                    }
+                }
+                return newObj;
+            }
+        });
+        Object.defineProperty(Object.prototype, "stringifyJSON", {
+            enumerable: false,
+            writable: true,
+            value: function() {
+                return JSON.stringify(this, null, "	");
+            }
+        });
+    };
+    polyfills(window, Object);
+    var global = global || this;
+    var AppServices = AppServices || {};
+    global.AppServices = global.AppServices || AppServices;
+    AppServices.Constants = angular.module("appservices.constants", []);
+    AppServices.Services = angular.module("appservices.services", []);
+    AppServices.Controllers = angular.module("appservices.controllers", []);
+    AppServices.Filters = angular.module("appservices.filters", []);
+    AppServices.Directives = angular.module("appservices.directives", []);
+    AppServices.Performance = angular.module("appservices.performance", []);
+    AppServices.MAX = angular.module("appservices.max", []);
+    angular.module("appservices", [ "ngRoute", "ngResource", "ngSanitize", "ui.bootstrap", "angulartics", "angulartics.google.analytics", "appservices.filters", "appservices.services", "appservices.directives", "appservices.constants", "appservices.controllers", "appservices.max", "angular-intro" ]).config([ "$routeProvider", "$locationProvider", "$sceDelegateProvider", "$analyticsProvider", function($routeProvider, $locationProvider, $sceDelegateProvider, $analyticsProvider) {
+        $routeProvider.when("/org-overview", {
+            templateUrl: "org-overview/org-overview.html",
+            controller: "OrgOverviewCtrl"
+        }).when("/login", {
+            templateUrl: "login/login.html",
+            controller: "LoginCtrl"
+        }).when("/login/loading", {
+            templateUrl: "login/loading.html",
+            controller: "LoginCtrl"
+        }).when("/app-overview/summary", {
+            templateUrl: "app-overview/app-overview.html",
+            controller: "AppOverviewCtrl"
+        }).when("/getting-started/setup", {
+            templateUrl: "app-overview/getting-started.html",
+            controller: "GettingStartedCtrl"
+        }).when("/forgot-password", {
+            templateUrl: "login/forgot-password.html",
+            controller: "ForgotPasswordCtrl"
+        }).when("/register", {
+            templateUrl: "login/register.html",
+            controller: "RegisterCtrl"
+        }).when("/users", {
+            templateUrl: "users/users.html",
+            controller: "UsersCtrl"
+        }).when("/users/profile", {
+            templateUrl: "users/users-profile.html",
+            controller: "UsersProfileCtrl"
+        }).when("/users/groups", {
+            templateUrl: "users/users-groups.html",
+            controller: "UsersGroupsCtrl"
+        }).when("/users/activities", {
+            templateUrl: "users/users-activities.html",
+            controller: "UsersActivitiesCtrl"
+        }).when("/users/feed", {
+            templateUrl: "users/users-feed.html",
+            controller: "UsersFeedCtrl"
+        }).when("/users/graph", {
+            templateUrl: "users/users-graph.html",
+            controller: "UsersGraphCtrl"
+        }).when("/users/roles", {
+            templateUrl: "users/users-roles.html",
+            controller: "UsersRolesCtrl"
+        }).when("/groups", {
+            templateUrl: "groups/groups.html",
+            controller: "GroupsCtrl"
+        }).when("/groups/details", {
+            templateUrl: "groups/groups-details.html",
+            controller: "GroupsDetailsCtrl"
+        }).when("/groups/members", {
+            templateUrl: "groups/groups-members.html",
+            controller: "GroupsMembersCtrl"
+        }).when("/groups/activities", {
+            templateUrl: "groups/groups-activities.html",
+            controller: "GroupsActivitiesCtrl"
+        }).when("/groups/roles", {
+            templateUrl: "groups/groups-roles.html",
+            controller: "GroupsRolesCtrl"
+        }).when("/roles", {
+            templateUrl: "roles/roles.html",
+            controller: "RolesCtrl"
+        }).when("/roles/settings", {
+            templateUrl: "roles/roles-settings.html",
+            controller: "RolesSettingsCtrl"
+        }).when("/roles/users", {
+            templateUrl: "roles/roles-users.html",
+            controller: "RolesUsersCtrl"
+        }).when("/roles/groups", {
+            templateUrl: "roles/roles-groups.html",
+            controller: "RolesGroupsCtrl"
+        }).when("/data", {
+            templateUrl: "data/data.html",
+            controller: "DataCtrl"
+        }).when("/data/entity", {
+            templateUrl: "data/entity.html",
+            controller: "EntityCtrl"
+        }).when("/data/shell", {
+            templateUrl: "data/shell.html",
+            controller: "ShellCtrl"
+        }).when("/profile/organizations", {
+            templateUrl: "profile/organizations.html",
+            controller: "OrgCtrl"
+        }).when("/profile/profile", {
+            templateUrl: "profile/profile.html",
+            controller: "ProfileCtrl"
+        }).when("/profile", {
+            templateUrl: "profile/account.html",
+            controller: "AccountCtrl"
+        }).when("/activities", {
+            templateUrl: "activities/activities.html",
+            controller: "ActivitiesCtrl"
+        }).when("/shell", {
+            templateUrl: "shell/shell.html",
+            controller: "ShellCtrl"
+        }).when("/logout", {
+            templateUrl: "login/logout.html",
+            controller: "LogoutCtrl"
+        }).otherwise({
+            redirectTo: "/org-overview"
+        });
+        $locationProvider.html5Mode(false).hashPrefix("!");
+        $sceDelegateProvider.resourceUrlWhitelist([ "self", "http://apigee-internal-prod.jupiter.apigee.net/**", "http://apigee-internal-prod.mars.apigee.net/**", "https://appservices.apigee.com/**", "https://api.usergrid.com/**" ]);
+        $analyticsProvider.virtualPageviews(false);
+        $analyticsProvider.firstPageview(false);
+    } ]);
+    AppServices.Controllers.controller("ActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
+        $scope.$on("app-activities-received", function(evt, data) {
+            $scope.activities = data;
+            $scope.$apply();
+        });
+        $scope.$on("app-activities-error", function(evt, data) {
+            $rootScope.$broadcast("alert", "error", "Application failed to retreive activities data.");
+        });
+        ug.getActivities();
+    } ]);
+    "use strict";
+    AppServices.Controllers.controller("AppOverviewCtrl", [ "ug", "charts", "$scope", "$rootScope", "$log", function(ug, charts, $scope, $rootScope, $log) {
+        var createGradient = function(color1, color2) {
+            var perShapeGradient = {
+                x1: 0,
+                y1: 0,
+                x2: 0,
+                y2: 1
+            };
+            return {
+                linearGradient: perShapeGradient,
+                stops: [ [ 0, color1 ], [ 1, color2 ] ]
+            };
+        };
+        $scope.appOverview = {};
+        $scope.collections = [];
+        $scope.graph = "";
+        $scope.$on("top-collections-received", function(event, collections) {
+            var dataDescription = {
+                bar1: {
+                    labels: [ "Total" ],
+                    dataAttr: [ "title", "count" ],
+                    colors: [ createGradient("rgba(36,151,212,0.6)", "rgba(119,198,240,0.6)") ],
+                    borderColor: "#1b97d1"
+                }
+            };
+            $scope.collections = collections;
+            var arr = [];
+            for (var i in collections) {
+                if (collections.hasOwnProperty(i)) {
+                    arr.push(collections[i]);
+                }
+            }
+            $scope.appOverview = {};
+            if (!$rootScope.chartTemplate) {
+                ug.httpGet(null, "js/charts/highcharts.json").then(function(success) {
+                    $rootScope.chartTemplate = success;
+                    $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
+                    $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
+                    $scope.applyScope();
+                }, function(fail) {
+                    $log.error("Problem getting chart template", fail);
+                });
+            } else {
+                $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
+                $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
+                $scope.applyScope();
+            }
+        });
+        $scope.$on("app-initialized", function() {
+            ug.getTopCollections();
+        });
+        if ($rootScope.activeUI) {
+            ug.getTopCollections();
+        }
+    } ]);
+    "use strict";
+    AppServices.Controllers.controller("GettingStartedCtrl", [ "ug", "$scope", "$rootScope", "$location", "$timeout", "$anchorScroll", function(ug, $scope, $rootScope, $location, $timeout, $anchorScroll) {
+        $scope.collections = [];
+        $scope.graph = "";
+        $scope.clientID = "";
+        $scope.clientSecret = "";
+        var getKeys = function() {
+            return ug.jsonpRaw("credentials", "", {});
+        };
+        $scope.regenerateCredentialsDialog = function(modalId) {
+            $scope.orgAPICredentials = {
+                client_id: "regenerating...",
+                client_secret: "regenerating..."
+            };
+            ug.regenerateAppCredentials();
+            $scope.hideModal(modalId);
+        };
+        $scope.$on("app-creds-updated", function(event, credentials) {
+            if (credentials) {
+                $scope.clientID = credentials.client_id;
+                $scope.clientSecret = credentials.client_secret;
+                if (!$scope.$$phase) {
+                    $scope.$apply();
+                }
+            } else {
+                setTimeout(function() {
+                    ug.getAppCredentials();
+                }, 5e3);
+            }
+        });
+        ug.getAppCredentials();
+        $scope.contentTitle;
+        $scope.showSDKDetail = function(name) {
+            var introContainer = document.getElementById("intro-container");
+            if (name === "nocontent") {
+                introContainer.style.height = "0";
+                return true;
+            }
+            introContainer.style.opacity = .1;
+            introContainer.style.height = "0";
+            var timeout = 0;
+            if ($scope.contentTitle) {
+                timeout = 500;
+            }
+            $timeout(function() {
+                introContainer.style.height = "1000px";
+                introContainer.style.opacity = 1;
+            }, timeout);
+            $scope.optionName = name;
+            $scope.contentTitle = name;
+            $scope.sdkLink = "http://apigee.com/docs/content/" + name + "-sdk-redirect";
+            $scope.docsLink = "http://apigee.com/docs/app-services/content/installing-apigee-sdk-" + name;
+            $scope.getIncludeURL = function() {
+                return "app-overview/doc-includes/" + $scope.optionName + ".html";
+            };
+        };
+        $scope.scrollToElement = function(elem) {
+            $location.hash(elem);
+            $anchorScroll();
+            return false;
+        };
+    } ]);
+    "use strict";
+    AppServices.Controllers.controller("ChartCtrl", [ "$scope", "$location", function($scope, $location) {} ]);
+    "use strict";
+    AppServices.Directives.directive("chart", function($rootScope) {
+        return {
+            restrict: "E",
+            scope: {
+                chartdata: "=chartdata"
+            },
+            template: "<div></div>",
+            replace: true,
+            controller: function($scope, $element) {},
+            link: function(scope, element, attrs) {
+                scope.$watch("chartdata", function(chartdata, oldchartdata) {
+                    if (chartdata) {
+                        var chartsDefaults = {
+                            chart: {
+                                renderTo: element[0],
+                                type: attrs.type || null,
+                                height: attrs.height || null,
+                                width: attrs.width || null,
+                                reflow: true,
+                                animation: false,
+                                zoomType: "x"
+                            }
+                        };
+                        if (attrs.type === "pie") {
+                            chartsDefaults.chart.margin = [ 0, 0, 0, 0 ];
+                            chartsDefaults.chart.spacingLeft = 0;
+                            chartsDefaults.chart.spacingRight = 0;
+                            chartsDefaults.chart.spacingTop = 0;
+                            chartsDefaults.chart.spacingBottom = 0;
+                            if (attrs.titleimage) {
+                                chartdata.title.text = '<img src="' + attrs.titleimage + '">';
+                            }
+                            if (attrs.titleicon) {
+                                chartdata.title.text = '<i class="pictogram ' + attrs.titleiconclass + '">' + attrs.titleicon + "</i>";
+                            }
+                            if (attrs.titlecolor) {
+                                chartdata.title.style.color = attrs.titlecolor;
+                            }
+                            if (attrs.titleimagetop) {
+                                chartdata.title.style.marginTop = attrs.titleimagetop;
+                            }
+                            if (attrs.titleimageleft) {
+                                chartdata.title.style.marginLeft = attrs.titleimageleft;
+                            }
+                        }
+                        if (attrs.type === "line") {
+                            chartsDefaults.chart.marginTop = 30;
+                            chartsDefaults.chart.spacingTop = 50;
+                        }
+                        if (attrs.type === "column") {
+                            chartsDefaults.chart.marginBottom = 80;
+                        }
+                        if (attrs.type === "area") {
+                            chartsDefaults.chart.spacingLeft = 0;
+                            chartsDefaults.chart.spacingRight = 0;
+                            chartsDefaults.chart.marginLeft = 0;
+                            chartsDefaults.chart.marginRight = 0;
+                        }
+                        Highcharts.setOptions({
+                            global: {
+                                useUTC: false
+                            },
+                            chart: {
+                                style: {
+                                    fontFamily: "marquette-light, Helvetica, Arial, sans-serif"
+                                }
+                            }
+                        });
+                        if (attrs.type === "line") {
+                            var xAxis1 = chartdata.xAxis[0];
+                            if (!xAxis1.labels.formatter) {
+                                xAxis1.labels.formatter = new Function(attrs.xaxislabel);
+                            }
+                            if (!xAxis1.labels.step) {
+                                xAxis1.labels.step = attrs.xaxisstep;
+                            }
+                        }
+                        if (chartdata.tooltip) {
+                            if (typeof chartdata.tooltip.formatter === "string") {
+                                chartdata.tooltip.formatter = new Function(chartdata.tooltip.formatter);
+                            }
+                        }
+                        renderChart(chartsDefaults, chartdata);
+                    }
+                }, true);
+            }
+        };
+    });
+    function renderChart(chartsDefaults, chartdata, attrs) {
+        var newSettings = {};
+        $.extend(true, newSettings, chartsDefaults, chartdata);
+        var chart = new Highcharts.Chart(newSettings);
+    }
+    AppServices.Services.factory("charts", function() {
+        var lineChart, areaChart, paretoChart, pieChart, pieCompare, xaxis, seriesIndex;
+        return {
+            convertLineChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                lineChart = chartTemplate;
+                if (typeof chartData[0] === "undefined") {
+                    chartData[0] = {};
+                    chartData[0].datapoints = [];
+                }
+                var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
+                if (currentCompare === "YESTERDAY") {
+                    seriesIndex = dataDescription.dataAttr.length;
+                    label = "Yesterday ";
+                } else if (currentCompare === "LAST_WEEK") {
+                    seriesIndex = dataDescription.dataAttr.length;
+                    label = "Last Week ";
+                } else {
+                    lineChart = chartTemplate;
+                    seriesIndex = 0;
+                    lineChart.series = [];
+                    label = "";
+                }
+                xaxis = lineChart.xAxis[0];
+                xaxis.categories = [];
+                if (settings.xaxisformat) {
+                    xaxis.labels.formatter = new Function(settings.xaxisformat);
+                }
+                if (settings.step) {
+                    xaxis.labels.step = settings.step;
+                }
+                for (var i = 0; i < dPLength; i++) {
+                    var dp = dataPoints[i];
+                    xaxis.categories.push(dp.timestamp);
+                }
+                if (chartData.length > 1) {
+                    for (var l = 0; l < chartData.length; l++) {
+                        if (chartData[l].chartGroupName) {
+                            dataPoints = chartData[l].datapoints;
+                            lineChart.series[l] = {};
+                            lineChart.series[l].data = [];
+                            lineChart.series[l].name = chartData[l].chartGroupName;
+                            lineChart.series[l].yAxis = 0;
+                            lineChart.series[l].type = "line";
+                            lineChart.series[l].color = dataDescription.colors[i];
+                            lineChart.series[l].dashStyle = "solid";
+                            lineChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
+                            plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
+                        }
+                    }
+                } else {
+                    var steadyCounter = 0;
+                    for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
+                        var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
+                        lineChart.series[i] = {};
+                        lineChart.series[i].data = [];
+                        lineChart.series[i].name = label + dataDescription.labels[steadyCounter];
+                        lineChart.series[i].yAxis = yAxisIndex;
+                        lineChart.series[i].type = "line";
+                        lineChart.series[i].color = dataDescription.colors[i];
+                        lineChart.series[i].dashStyle = "solid";
+                        lineChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
+                        steadyCounter++;
+                    }
+                    plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
+                }
+                function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
+                    for (var i = 0; i < dPLength; i++) {
+                        var dp = dataPoints[i];
+                        var localCounter = counter;
+                        for (var j = 0; j < dataAttrs.length; j++) {
+                            if (typeof dp === "undefined") {
+                                lineChart.series[localCounter].data.push([ i, 0 ]);
+                            } else {
+                                lineChart.series[localCounter].data.push([ i, dp[dataAttrs[j]] ]);
+                            }
+                            if (!detailedView) {
+                                localCounter++;
+                            }
+                        }
+                    }
+                }
+                return lineChart;
+            },
+            convertAreaChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                areaChart = angular.copy(areaChart);
+                if (typeof chartData[0] === "undefined") {
+                    chartData[0] = {};
+                    chartData[0].datapoints = [];
+                }
+                var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
+                if (currentCompare === "YESTERDAY") {
+                    seriesIndex = dataDescription.dataAttr.length;
+                    label = "Yesterday ";
+                } else if (currentCompare === "LAST_WEEK") {
+                    seriesIndex = dataDescription.dataAttr.length;
+                    label = "Last Week ";
+                } else {
+                    areaChart = chartTemplate;
+                    seriesIndex = 0;
+                    areaChart.series = [];
+                    label = "";
+                }
+                xaxis = areaChart.xAxis[0];
+                xaxis.categories = [];
+                if (settings.xaxisformat) {
+                    xaxis.labels.formatter = new Function(settings.xaxisformat);
+                }
+                if (settings.step) {
+                    xaxis.labels.step = settings.step;
+                }
+                for (var i = 0; i < dPLength; i++) {
+                    var dp = dataPoints[i];
+                    xaxis.categories.push(dp.timestamp);
+                }
+                if (chartData.length > 1) {
+                    for (var l = 0; l < chartData.length; l++) {
+                        if (chartData[l].chartGroupName) {
+                            dataPoints = chartData[l].datapoints;
+                            areaChart.series[l] = {};
+                            areaChart.series[l].data = [];
+                            areaChart.series[l].fillColor = dataDescription.areaColors[l];
+                            areaChart.series[l].name = chartData[l].chartGroupName;
+                            areaChart.series[l].yAxis = 0;
+                            areaChart.series[l].type = "area";
+                            areaChart.series[l].pointInterval = 1;
+                            areaChart.series[l].color = dataDescription.colors[l];
+                            areaChart.series[l].dashStyle = "solid";
+                            areaChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
+                            plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
+                        }
+                    }
+                } else {
+                    var steadyCounter = 0;
+                    for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
+                        var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
+                        areaChart.series[i] = {};
+                        areaChart.series[i].data = [];
+                        areaChart.series[i].fillColor = dataDescription.areaColors[i];
+                        areaChart.series[i].name = label + dataDescription.labels[steadyCounter];
+                        areaChart.series[i].yAxis = yAxisIndex;
+                        areaChart.series[i].type = "area";
+                        areaChart.series[i].pointInterval = 1;
+                        areaChart.series[i].color = dataDescription.colors[i];
+                        areaChart.series[i].dashStyle = "solid";
+                        areaChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
+                        steadyCounter++;
+                    }
+                    plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
+                }
+                function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
+                    for (var i = 0; i < dPLength; i++) {
+                        var dp = dataPoints[i];
+                        var localCounter = counter;
+                        for (var j = 0; j < dataAttrs.length; j++) {
+                            if (typeof dp === "undefined") {
+                                areaChart.series[localCounter].data.push(0);
+                            } else {
+                                areaChart.series[localCounter].data.push(dp[dataAttrs[j]]);
+                            }
+                            if (!detailedView) {
+                                localCounter++;
+                            }
+                        }
+                    }
+                }
+                return areaChart;
+            },
+            convertParetoChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                paretoChart = chartTemplate;
+                if (typeof chartData === "undefined") {
+                    chartData = [];
+                }
+                var label, cdLength = chartData.length, compare = false, allParetoOptions = [], stackedBar = false;
+                seriesIndex = 0;
+                function getPreviousData() {
+                    for (var i = 0; i < chartTemplate.series[0].data.length; i++) {
+                        allParetoOptions.push(chartTemplate.xAxis.categories[i]);
+                    }
+                }
+                if (typeof dataDescription.dataAttr[1] === "object") {
+                    stackedBar = true;
+                }
+                if (currentCompare === "YESTERDAY") {
+                    label = "Yesterday ";
+                    compare = true;
+                    if (stackedBar) {
+                        seriesIndex = dataDescription.dataAttr[1].length;
+                    }
+                    getPreviousData();
+                } else if (currentCompare === "LAST_WEEK") {
+                    label = "Last Week ";
+                    compare = true;
+                    if (stackedBar) {
+                        seriesIndex = dataDescription.dataAttr[1].length;
+                    }
+                    seriesIndex = getPreviousData();
+                } else {
+                    compare = false;
+                    label = "";
+                    paretoChart.xAxis.categories = [];
+                    paretoChart.series = [];
+                    paretoChart.series[0] = {};
+                    paretoChart.series[0].data = [];
+                    paretoChart.legend.enabled = false;
+                }
+                paretoChart.plotOptions.series.borderColor = dataDescription.borderColor;
+                if (compare && !stackedBar) {
+                    paretoChart.series[1] = {};
+                    paretoChart.series[1].data = [];
+                    for (var i = 0; i < allParetoOptions.length; i++) {
+                        paretoChart.series[1].data.push(0);
+                    }
+                    paretoChart.legend.enabled = true;
+                }
+                for (var i = 0; i < cdLength; i++) {
+                    var bar = chartData[i];
+                    if (!compare) {
+                        paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]);
+                        if (typeof dataDescription.dataAttr[1] === "object") {
+                            createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
+                        } else {
+                            paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]);
+                            paretoChart.series[0].name = dataDescription.labels[0];
+                            paretoChart.series[0].color = dataDescription.colors[0];
+                        }
+                    } else {
+                        var newLabel = bar[dataDescription.dataAttr[0]], newValue = bar[dataDescription.dataAttr[1]], previousIndex = allParetoOptions.indexOf(newLabel);
+                        if (previousIndex > -1) {
+                            if (typeof dataDescription.dataAttr[1] === "object") {
+                                createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
+                            } else {
+                                paretoChart.series[1].data[previousIndex] = newValue;
+                                paretoChart.series[1].name = label !== "" ? label + " " + dataDescription.labels[0] : dataDescription.labels[0];
+                                paretoChart.series[1].color = dataDescription.colors[1];
+                            }
+                        } else {}
+                    }
+                }
+                function createStackedBar(dataDescription, paretoChart, startingPoint) {
+                    paretoChart.plotOptions = {
+                        series: {
+                            shadow: false,
+                            borderColor: dataDescription.borderColor,
+                            borderWidth: 1
+                        },
+                        column: {
+                            stacking: "normal",
+                            dataLabels: {
+                                enabled: true,
+                                color: Highcharts.theme && Highcharts.theme.dataLabelsColor || "white"
+                            }
+                        }
+                    };
+                    var start = dataDescription.dataAttr[1].length, steadyCounter = 0, stackName = label;
+                    if (compare) {
+                        paretoChart.legend.enabled = true;
+                    }
+                    for (var f = seriesIndex; f < start + seriesIndex; f++) {
+                        if (!paretoChart.series[f]) {
+                            paretoChart.series[f] = {
+                                data: []
+                            };
+                        }
+                        paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]);
+                        paretoChart.series[f].name = label !== "" ? label + " " + dataDescription.labels[steadyCounter] : dataDescription.labels[steadyCounter];
+                        paretoChart.series[f].color = dataDescription.colors[f];
+                        paretoChart.series[f].stack = label;
+                        steadyCounter++;
+                    }
+                }
+                return paretoChart;
+            },
+            convertPieChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                var label, cdLength = chartData.length, compare = false;
+                pieChart = chartTemplate;
+                if (currentCompare === "YESTERDAY") {
+                    label = "Yesterday ";
+                    compare = false;
+                } else if (currentCompare === "LAST_WEEK") {
+                    label = "Last Week ";
+                    compare = false;
+                } else {
+                    compare = false;
+                    pieChart.series[0].data = [];
+                    if (pieChart.series[0].dataLabels) {
+                        if (typeof pieChart.series[0].dataLabels.formatter === "string") {
+                            pieChart.series[0].dataLabels.formatter = new Function(pieChart.series[0].dataLabels.formatter);
+                        }
+                    }
+                }
+                pieChart.plotOptions.pie.borderColor = dataDescription.borderColor;
+                if (compare) {
+                    pieChart.series[1].data = [];
+                    if (pieChart.series[1].dataLabels) {
+                        if (typeof pieChart.series[1].dataLabels.formatter === "string") {
+                            pieChart.series[1].dataLabels.formatter = new Function(pieChart.series[1].dataLabels.formatter);
+                        }
+                    }
+                }
+                var tempArray = [];
+                for (var i = 0; i < cdLength; i++) {
+                    var pie = chartData[i];
+                    tempArray.push({
+                        name: pie[dataDescription.dataAttr[0]],
+                        y: pie[dataDescription.dataAttr[1]],
+                        color: ""
+                    });
+                }
+                sortJsonArrayByProperty(tempArray, "name");
+                for (var i = 0; i < tempArray.length; i++) {
+                    tempArray[i].color = dataDescription.colors[i];
+                }
+                if (!compare) {
+                    pieChart.series[0].data = tempArray;
+                } else {
+                    pieChart.series[1].data = tempArray;
+                }
+                return pieChart;
+            }
+        };
+        function sortJsonArrayByProperty(objArray, prop, direction) {
+            if (arguments.length < 2) throw new Error("sortJsonArrayByProp requires 2 arguments");
+            var direct = arguments.length > 2 ? arguments[2] : 1;
+            if (objArray && objArray.constructor === Array) {
+                var propPath = prop.constructor === Array ? prop : prop.split(".");
+                objArray.sort(function(a, b) {
+                    for (var p in propPath) {
+                        if (a[propPath[p]] && b[propPath[p]]) {
+                            a = a[propPath[p]];
+                            b = b[propPath[p]];
+                        }
+                    }
+                    a = a.match(/^\d+$/) ? +a : a;
+                    b = b.match(/^\d+$/) ? +b : b;
+                    return a < b ? -1 * direct : a > b ? 1 * direct : 0;
+                });
+            }
+        }
+    });
+    $(".sessions-bar").sparkline([ 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 1 ], {
+        type: "bar",
+        barColor: "#c5c5c5",
+        width: "800px",
+        height: 100,
+        barWidth: 12,
+        barSpacing: "1px"
+    });
+    "use strict";
+    AppServices.Controllers.controller("DataCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
+        var init = function() {
+            $scope.verb = "GET";
+            $scope.display = "";
+            $scope.queryBodyDetail = {};
+            $scope.queryBodyDisplay = "none";
+            $scope.queryLimitDisplay = "block";
+            $scope.queryStringDisplay = "block";
+            $scope.entitySelected = {};
+            $scope.newCollection = {};
+            $rootScope.queryCollection = {};
+            $scope.data = {};
+            $scope.data.queryPath = "";
+            $scope.data.queryBody = '{ "name":"value" }';
+            $scope.data.searchString = "";
+            $scope.data.queryLimit = "";
+        };
+        var runQuery = function(verb) {
+            $scope.loading = true;
+            var queryPath = $scope.removeFirstSlash($scope.data.queryPath || "");
+            var searchString = $scope.data.searchString || "";
+            var queryLimit = $scope.data.queryLimit || "";
+            var body = JSON.parse($scope.data.queryBody || "{}");
+            if (verb == "POST" && $scope.validateJson(true)) {
+                ug.runDataPOSTQuery(queryPath, body);
+            } else if (verb == "PUT" && $scope.validateJson(true)) {
+                ug.runDataPutQuery(queryPath, searchString, queryLimit, body);
+            } else if (verb == "DELETE") {
+                ug.runDataDeleteQuery(queryPath, searchString, queryLimit);
+            } else {
+                ug.runDataQuery(queryPath, searchString, queryLimit);
+            }
+        };
+        $scope.$on("top-collections-received", function(event, collectionList) {
+            $scope.loading = false;
+            var ignoredCollections = [ "events" ];
+            ignoredCollections.forEach(function(ignoredCollection) {
+                collectionList.hasOwnProperty(ignoredCollection) && delete collectionList[ignoredCollection];
+            });
+            $scope.collectionList = collectionList;
+            $scope.queryBoxesSelected = false;
+            if (!$scope.queryPath) {
+                $scope.loadCollection("/" + collectionList[Object.keys(collectionList).sort()[0]].name);
+            }
+            $scope.applyScope();
+        });
+        $scope.$on("error-running-query", function(event) {
+            $scope.loading = false;
+            runQuery("GET");
+            $scope.applyScope();
+        });
+        $scope.$on("entity-deleted", function(event) {
+            $scope.deleteLoading = false;
+            $rootScope.$broadcast("alert", "success", "Entities deleted sucessfully");
+            $scope.queryBoxesSelected = false;
+            $scope.checkNextPrev();
+            $scope.applyScope();
+        });
+        $scope.$on("entity-deleted-error", function(event) {
+            $scope.deleteLoading = false;
+            runQuery("GET");
+            $scope.applyScope();
+        });
+        $scope.$on("collection-created", function() {
+            $scope.newCollection.name = "";
+        });
+        $scope.$on("query-received", function(event, collection) {
+            $scope.loading = false;
+            $rootScope.queryCollection = collection;
+            ug.getIndexes($scope.data.queryPath);
+            $scope.setDisplayType();
+            $scope.checkNextPrev();
+            $scope.applyScope();
+            $scope.queryBoxesSelected = false;
+        });
+        $scope.$on("indexes-received", function(event, indexes) {
+            var fred = indexes;
+        });
+        $scope.$on("app-changed", function() {
+            init();
+        });
+        $scope.setDisplayType = function() {
+            $scope.display = "generic";
+        };
+        $scope.deleteEntitiesDialog = function(modalId) {
+            $scope.deleteLoading = false;
+            $scope.deleteEntities($rootScope.queryCollection, "entity-deleted", "error deleting entity");
+            $scope.hideModal(modalId);
+        };
+        $scope.newCollectionDialog = function(modalId) {
+            if ($scope.newCollection.name) {
+                ug.createCollection($scope.newCollection.name);
+                ug.getTopCollections();
+                $rootScope.$broadcast("alert", "success", "Collection created successfully.");
+                $scope.hideModal(modalId);
+            } else {
+                $rootScope.$broadcast("alert", "error", "You must specify a collection name.");
+            }
+        };
+        $scope.addToPath = function(uuid) {
+            $scope.data.queryPath = "/" + $rootScope.queryCollection._type + "/" + uuid;
+        };
+        $scope.isDeep = function(item) {
+            return Object.prototype.toString.call(item) === "[object Object]";
+        };
+        $scope.loadCollection = function(type) {
+            $scope.data.queryPath = "/" + type.substring(1, type.length);
+            $scope.data.searchString = "";
+            $scope.data.queryLimit = "";
+            $scope.data.body = '{ "name":"value" }';
+            $scope.selectGET();
+            $scope.applyScope();
+            $scope.run();
+        };
+        $scope.selectGET = function() {
+            $scope.queryBodyDisplay = "none";
+            $scope.queryLimitDisplay = "block";
+            $scope.queryStringDisplay = "block";
+            $scope.verb = "GET";
+        };
+        $scope.selectPOST = function() {
+            $scope.queryBodyDisplay = "block";
+            $scope.queryLimitDisplay = "none";
+            $scope.queryStringDisplay = "none";
+            $scope.verb = "POST";
+        };
+        $scope.selectPUT = function() {
+            $scope.queryBodyDisplay = "block";
+            $scope.queryLimitDisplay = "block";
+            $scope.queryStringDisplay = "block";
+            $scope.verb = "PUT";
+        };
+        $scope.selectDELETE = function() {
+            $scope.queryBodyDisplay = "none";
+            $scope.queryLimitDisplay = "block";
+            $scope.queryStringDisplay = "block";
+            $scope.verb = "DELETE";
+        };
+        $scope.validateJson = function(skipMessage) {
+            var queryBody = $scope.data.queryBody;
+            try {
+                queryBody = JSON.parse(queryBody);
+            } catch (e) {
+                $rootScope.$broadcast("alert", "error", "JSON is not valid");
+                return false;
+            }
+            queryBody = JSON.stringify(queryBody, null, 2);
+            !skipMessage && $rootScope.$broadcast("alert", "success", "JSON is valid");
+            $scope.data.queryBody = queryBody;
+            return true;
+        };
+        $scope.saveEntity = function(entity) {
+            if (!$scope.validateJson()) {
+                return false;
+            }
+            var queryBody = entity._json;
+            queryBody = JSON.parse(queryBody);
+            $rootScope.selectedEntity.set();
+            $rootScope.selectedEntity.set(queryBody);
+            $rootScope.selectedEntity.set("type", entity._data.type);
+            $rootScope.selectedEntity.set("uuid", entity._data.uuid);
+            $rootScope.selectedEntity.save(function(err, data) {
+                if (err) {
+                    $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
+                } else {
+                    $rootScope.$broadcast("alert", "success", "entity saved");
+                }
+            });
+        };
+        $scope.run = function() {
+            $rootScope.queryCollection = "";
+            var verb = $scope.verb;
+            runQuery(verb);
+        };
+        $scope.hasProperty = function(prop) {
+            var retval = false;
+            if (typeof $rootScope.queryCollection._list !== "undefined") {
+                angular.forEach($rootScope.queryCollection._list, function(value, key) {
+                    if (!retval) {
+                        if (value._data[prop]) {
+                            retval = true;
+                        }
+                    }
+                });
+            }
+            return retval;
+        };
+        $scope.resetNextPrev = function() {
+            $scope.previous_display = "none";
+            $scope.next_display = "none";
+        };
+        $scope.checkNextPrev = function() {
+            $scope.resetNextPrev();
+            if ($rootScope.queryCollection.hasPreviousPage()) {
+                $scope.previous_display = "default";
+            }
+            if ($rootScope.queryCollection.hasNextPage()) {
+                $scope.next_display = "default";
+            }
+        };
+        $scope.selectEntity = function(uuid) {
+            $rootScope.selectedEntity = $rootScope.queryCollection.getEntityByUUID(uuid);
+            $scope.addToPath(uuid);
+        };
+        $scope.getJSONView = function(entity) {
+            var tempjson = entity.get();
+            var queryBody = JSON.stringify(tempjson, null, 2);
+            queryBody = JSON.parse(queryBody);
+            delete queryBody.metadata;
+            delete queryBody.uuid;
+            delete queryBody.created;
+            delete queryBody.modified;
+            delete queryBody.type;
+            $scope.queryBody = JSON.stringify(queryBody, null, 2);
+        };
+        $scope.getPrevious = function() {
+            $rootScope.queryCollection.getPreviousPage(function(err) {
+                if (err) {
+                    $rootScope.$broadcast("alert", "error", "error getting previous page of data");
+                }
+                $scope.checkNextPrev();
+                $scope.applyScope();
+            });
+        };
+        $scope.getNext = function() {
+            $rootScope.queryCollection.getNextPage(function(err) {
+                if (err) {
+                    $rootScope.$broadcast("alert", "error", "error getting next page of data");
+                }
+                $scope.checkNextPrev();
+                $scope.applyScope();
+            });
+        };
+        init();
+        $rootScope.queryCollection = $rootScope.queryCollection || {};
+        $rootScope.selectedEntity = {};
+        if ($rootScope.queryCollection && $rootScope.queryCollection._type) {
+            $scope.loadCollection($rootScope.queryCollection._type);
+            $scope.setDisplayType();
+        }
+        ug.getTopCollections();
+        $scope.resetNextPrev();
+    } ]);
+    "use strict";
+    AppServices.Controllers.controller("EntityCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
+        if (!$rootScope.selectedEntity) {
+            $location.path("/data");
+            return;
+        }
+        $scope.entityUUID = $rootScope.selectedEntity.get("uuid");
+        $scope.entityType = $rootScope.selectedEntity.get("type");
+        var tempjson = $rootScope.selectedEntity.get();
+        var queryBody = JSON.stringify(tempjson, null, 2);
+        queryBody = JSON.parse(queryBody);
+        delete queryBody.metadata;
+        delete queryBody.uuid;
+        delete queryBody.created;
+        delete queryBody.modified;
+        delete queryBody.type;
+        $scope.queryBody = JSON.stringify(queryBody, null, 2);
+        $scope.validateJson = function() {
+            var queryBody = $scope.queryBody;
+            try {
+                queryBody = JSON.parse(queryBody);
+            } catch (e) {
+                $rootScope.$broadcast("alert", "error", "JSON is not valid");
+                return false;
+            }
+            queryBody = JSON.stringify(queryBody, null, 2);
+            $rootScope.$broadcast("alert", "success", "JSON is valid");
+            $scope.queryBody = queryBody;
+            return true;
+        };
+        $scope.saveEntity = function() {
+            if (!$scope.validateJson()) {
+                return false;
+            }
+            var queryBody = $scope.queryBody;
+            queryBody = JSON.parse(queryBody);
+            $rootScope.selectedEntity.set();
+            $rootScope.selectedEntity.set(queryBody);
+            $rootScope.selectedEntity.set("type", $scope.entityType);
+            $rootScope.selectedEntity.set("uuid", $scope.entityUUID);
+            $rootScope.selectedEntity.save(function(err, data) {
+                if (err) {
+                    $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
+                } else {
+                    $rootScope.$broadcast("alert", "success", "entity saved");
+                }
+            });
+        };
+    } ]);
+    "use strict";
+    AppServices.Directives.directive("balloon", [ "$window", "$timeout", function($window, $timeout) {
+        return {
+            restrict: "ECA",
+            scope: "=",
+            template: "" + '<div class="baloon {{direction}}" ng-transclude>' + "</div>",
+            replace: true,
+            transclude: true,
+            link: function linkFn(scope, lElement, attrs) {
+                scope.direction = attrs.direction;
+                var runScroll = true;
+                var windowEl = angular.element($window);
+                windowEl.on("scroll", function() {
+                    if (runScroll) {
+                        lElement.addClass("fade-out");
+                        $timeout(function() {
+                            lElement.addClass("hide");
+                        }, 1e3);
+                        runScroll = false;
+                    }
+                });
+            }
+        };
+    } ]);
+    "use strict";
+    AppServices.Directives.directive("bsmodal", [ "$rootScope", function($rootScope) {
+        return {
+            restrict: "ECA",
+            scope: {
+                title: "@title",
+                buttonid: "=buttonid",
+                footertext: "=footertext",
+                closelabel: "=closelabel"
+            },
+            transclude: true,
+            templateUrl: "dialogs/modal.html",
+            replace: true,
+            link: function linkFn(scope, lElement, attrs, parentCtrl) {
+                scope.title = attrs.title;
+                scope.footertext = attrs.footertext;
+                scope.closelabel = attrs.closelabel;
+                scope.close = attrs.close;
+                scope.extrabutton = attrs.extrabutton;
+                scope.extrabuttonlabel = attrs.extrabuttonlabel;
+                scope.buttonId = attrs.buttonid;
+                scope.closeDelegate = function(attr) {
+                    scope.$parent[attr](attrs.id, scope);
+                };
+                scope.extraDelegate = function(attr) {
+                    if (scope.dialogForm.$valid) {
+                        console.log(parentCtrl);
+                        scope.$parent[attr](attrs.id);
+                    } else {
+                        $rootScope.$broadcast("alert", "error", "Please check your form input and resubmit.");
+                    }
+                };
+            }
+        };
+    } ]);
+    "use strict";
+    AppServices.Controllers.controller("AlertCtrl", [ "$scope", "$rootScope", "$timeout", function($scope, $rootScope, $timeout) {
+        $scope.alertDisplay = "none";
+        $scope.alerts = [];
+        $scope.$on("alert", function(event, type, message, permanent) {
+            $scope.addAlert(type, message, permanent);
+        });
+        $scope.$on("clear-alerts", function(event, message) {
+            $scope.alerts = [];
+        });
+        $scope.addAlert = function(type, message, permanent) {
+            $scope.alertDisplay = "block";
+            $scope.alerts.push({
+                type: type,
+                msg: message
+            });
+            $scope.applyScope();
+            if (!permanent) {
+                $timeout(function() {
+                    $scope.alerts.shift();
+                }, 5e3);
+            }
+        };
+        $scope.closeAlert = function(index) {
+            $scope.alerts.splice(index, 1);
+        };
+    } ]);
+    "use strict";
+    AppServices.Directives.directive("alerti", [ "$rootScope", "$timeout", function($rootScope, $timeout) {
+        return {
+            restrict: "ECA",
+            scope: {
+                type: "=type",
+                closeable: "@closeable",
+                index: "&index"
+            },
+            template: '<div class="alert" ng-class="type && \'alert-\' + type">' + '    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>' + '    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>' + '    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>' + '    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>' + '    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i>' + "<div ng-transclude></div>" + "</div>",
+            replace: true,
+            transclude: true,
+            link: function linkFn(scope, lElement, attrs) {
+                $timeout(function() {
+                    lElement.addClass("fade-out");
+                }, 4e3);
+                lElement.click(function() {
+                    if (attrs.index) {
+                        scope.$parent.closeAlert(attrs.index);
+                    }
+                });
+                setTimeout(function() {
+                    lElement.addClass("alert-animate");
+                }, 10);
+            }
+        };
+    } ]);
+    "use strict";
+    AppServices.Directives.directive("appswitcher", [ "$rootScope", function($rootScope) {
+        return {
+            restrict: "ECA",
+            scope: "=",
+            templateUrl: "global/appswitcher-template.html",
+            replace: true,
+            transclude: true,
+            link: function linkFn(scope, lElement, attrs) {
+                var classNameOpen = "open";
+                $("ul.nav li.dropdownContainingSubmenu").hover(function() {
+                    $(this).addClass(classNameOpen);
+                }, function() {
+                    $(this).removeClass(classNameOpen);
+                });
+                $("#globalNav > a").mouseover(globalNavDetail);
+                $("#globalNavDetail").mouseover(globalNavDetail);
+                $("#globalNavSubmenuContainer ul li").mouseover(function() {
+                    $("#globalNavDetail > div").removeClass(classNameOpen);
+                    $("#" + this.getAttribute("data-globalNavDetail")).addClass(classNameOpen);
+                });
+                function globalNavDetail() {
+                    $("#globalNavDetail > div").removeClass(classNameOpen);
+                    $("#globalNavDetailApiPlatform").addClass(classNameOpen);
+                }
+            }
+        };
+    } ]);
+    "use strict";
+    AppServices.Services.factory("help", function($rootScope, $http, $analytics) {
+        $rootScope.help = {};
+        $rootScope.help.helpButtonStatus = "Enable Help";
+        $rootScope.help.helpTooltipsEnabled = false;
+        $rootScope.help.clicked = false;
+        $rootScope.help.showHelpButtons = false;
+        var tooltipStartTime;
+        var helpStartTime;
+        var introjs_step;
+        $rootScope.help.sendTooltipGA = function(tooltipName) {
+            $analytics.eventTrack("tooltip - " + $rootScope.currentPath, {
+                category: "App Services",
+                label: tooltipName
+            });
+        };
+        $rootScope.help.toggleTooltips = function() {
+            if ($rootScope.help.helpTooltipsEnabled == false) {
+                $rootScope.help.helpButtonStatus = "Disable Help";
+                $rootScope.help.helpTooltipsEnabled = true;
+                showHelpModal("tooltips");
+            } else {
+                $rootScope.help.helpButtonStatus = "Enable Help";
+                $rootScope.help.helpTooltipsEnabled = false;
+            }
+        };
+        $rootScope.help.IntroOptions = {
+            steps: [],
+            showStepNumbers: false,
+            exitOnOverlayClick: true,
+            exitOnEsc: true,
+            nextLabel: "Next",
+            prevLabel: "Back",
+            skipLabel: "Exit",
+            doneLabel: "Done"
+        };
+        $rootScope.$on("$routeChangeSuccess", function(event, current) {
+            var path = current.$$route ? current.$$route.originalPath : null;
+            if (path == "/org-overview") {
+                $rootScope.help.showHelpButtons = true;
+                getHelpJson(path).success(function(json) {
+                    var helpJson = json;
+                    setHelpStrings(helpJson);
+                    showHelpModal("tour");
+                });
+            } else {
+                $rootScope.help.showHelpButtons = false;
+            }
+        });
+        var showHelpModal = function(helpType) {
+            var shouldHelp = location.search.indexOf("noHelp") <= 0;
+            if (helpType == "tour" && !getHelpStatus(helpType)) {
+                shouldHelp && $rootScope.showModal("introjs");
+            } else if (helpType == "tooltips" && !getHelpStatus(helpType)) {
+                shouldHelp && $rootScope.showModal("tooltips");
+            }
+        };
+        var setHelpStrings = function(helpJson) {
+            $rootScope.help.IntroOptions.steps = helpJson.introjs;
+            angular.forEach(helpJson.tooltip, function(value, binding) {
+                $rootScope[binding] = value;
+            });
+        };
+        $rootScope.help.introjs_StartEvent = function() {
+            helpStartTime = Date.now();
+            introjs_step = 1;
+        };
+        $rootScope.help.introjs_ExitEvent = function() {
+            var introjs_time = Math.round((Date.now() - helpStartTime) / 1e3);
+            $analytics.eventTrack("introjs timing - " + $rootScope.currentPath, {
+                category: "App Services",
+                label: introjs_time + "s"
+            });
+            $analytics.eventTrack("introjs exit - " + $rootScope.currentPath, {
+                category: "App Services",
+                label: "step" + introjs_step
+            });
+        };
+        $rootScope.help.introjs_ChangeEvent = function() {
+            introjs_step++;
+        };
+        var getHelpJson = function(path) {
+            return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
+        };
+        var getHelpStatus = function(helpType) {
+            var status;
+            if (helpType == "tour") {
+                status = localStorage.getItem("ftu_tour");
+                localStorage.setItem("ftu_tour", "false");
+            } else if (helpType == "tooltips") {
+                status = localStorage.getItem("ftu_tooltips");
+                localStorage.setItem("ftu_tooltips", "false");
+            }
+            return status;
+        };
+    });
+    AppServices.Directives.directive("insecureBanner", [ "$rootScope", "ug", function($rootScope, ug) {
+        return {
+            restrict: "E",
+            transclude: true,
+            templateUrl: "global/insecure-banner.html",
+            link: function linkFn(scope, lElement, attrs) {
+                scope.securityWarning = false;
+                scope.$on("roles-received", function(evt, roles) {
+                    scope.securityWarning = false;
+                    if (!roles || !roles._list) return;
+                    roles._list.forEach(function(roleHolder) {
+                        var role = roleHolder._data;
+                        if (role.name.toUpperCase() === "GUEST") {
+                            roleHolder.getPermissions(function(err, data) {
+                                if (!err) {
+                                    if (roleHolder.permissions) {
+                                        roleHolder.permissions.forEach(function(permission) {
+                                            if (permission.path.indexOf("/**") >= 0) {
+                                                scope.securityWarning = true;
+                                                scope.applyScope();
+                                            }
+                                        });
+                                    }
+                                }
+                            });
+                        }
+                    });
+                });
+                var initialized = false;
+                scope.$on("app-initialized", function() {
+                    !initialized && ug.getRoles();
+                    initialized = true;
+                });
+                scope.$on("app-changed", function() {
+                    scope.securityWarning = false;
+                    ug.getRoles();
+                });
+            }
+        };
+    } ]);
+    "use strict";
+    AppServices.Constants.constant("configuration", {
+        ITEMS_URL: "global/temp.json"
+    });
+    "use strict";
+    AppServices.Controllers.controller("PageCtrl", [ "ug", "help", "utility", "$scope", "$rootScope", "$location", "$routeParams", "$q", "$route", "$log", "$analytics", function(ug, help, utility, $scope, $rootScope, $location, $routeParams, $q, $route, $log, $analytics) {
+        var initScopeVariables = function() {
+            $scope.loadingText = "Loading...";
+            $scope.use_sso = false;
+            $scope.newApp = {
+                name: ""
+            };
+            $scope.getPerm = "";
+            $scope.postPerm = "";
+            $scope.putPerm = "";
+            $scope.deletePerm = "";
+            $scope.usersTypeaheadValues = [];
+            $scope.groupsTypeaheadValues = [];
+            $scope.rolesTypeaheadValues = [];
+            $rootScope.sdkActive = false;
+            $rootScope.demoData = false;
+            $scope.queryStringApplied = false;
+            $rootScope.autoUpdateTimer = Usergrid.config ? Usergrid.config.autoUpdateTimer : 61;
+            $rootScope.requiresDeveloperKey = Usergrid.config ? Usergrid.config.client.requiresDeveloperKey : false;
+            $rootScope.loaded = $rootScope.activeUI = false;
+            for (var key in Usergrid.regex) {
+                $scope[key] = Usergrid.regex[key];
+            }
+            $scope.options = Usergrid.options;
+            var getQuery = function() {
+                var result = {}, queryString = location.search.slice(1), re = /([^&=]+)=([^&]*)/g, m;
+                while (m = re.exec(queryString)) {
+                    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
+                }
+                return result;
+            };
+            $scope.queryString = getQuery();
+        };
+        initScopeVariables();
+        $rootScope.urls = function() {
+            var urls = ug.getUrls($scope.queryString);
+            $scope.apiUrl = urls.apiUrl;
+            $scope.use_sso = urls.use_sso;
+            return urls;
+        };
+        $rootScope.gotoPage = function(path) {
+            $location.path(path);
+        };
+        var notRegistration = function() {
+            return "/forgot-password" !== $location.path() && "/register" !== $location.path();
+        };
+        var verifyUser = function() {
+            if ($location.path().slice(0, "/login".length) !== "/login") {
+                $rootScope.currentPath = $location.path();
+            }
+            if ($routeParams.access_token && $routeParams.admin_email && $routeParams.uuid) {
+                ug.set("token", $routeParams.access_token);
+                ug.set("email", $routeParams.admin_email);
+                ug.set("uuid", $routeParams.uuid);
+                $location.search("access_token", null);
+                $location.search("admin_email", null);
+                $location.search("uuid", null);
+            }
+            ug.checkAuthentication(true);
+        };
+        $scope.profile = function() {
+            if ($scope.use_sso) {
+                window.location = $rootScope.urls().PROFILE_URL + "?callback=" + encodeURIComponent($location.absUrl());
+            } else {
+                $location.path("/profile");
+            }
+        };
+        $rootScope.showModal = function(id) {
+            $("#" + id).modal("show");
+        };
+        $rootScope.hideModal = function(id) {
+            $("#" + id).modal("hide");
+        };
+        $scope.deleteEntities = function(collection, successBroadcast, errorMessage) {
+            collection.resetEntityPointer();
+            var entitiesToDelete = [];
+            while (collection.hasNextEntity()) {
+                var entity = collection.getNextEntity();
+                var checked = entity.checked;
+                if (checked) {
+                    entitiesToDelete.push(entity);
+                }
+            }
+            var count = 0, success = false;
+            for (var i = 0; i < entitiesToDelete.length; i++) {
+                var entity = entitiesToDelete[i];
+                collection.destroyEntity(entity, function(err) {
+                    count++;
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", errorMessage);
+                        $rootScope.$broadcast(successBroadcast + "-error", err);
+                    } else {
+                        success = true;
+                    }
+                    if (count === entitiesToDelete.length) {
+                        success && $rootScope.$broadcast(successBroadcast);
+                        $scope.applyScope();
+                    }
+                });
+            }
+        };
+        $scope.selectAllEntities = function(list, that, varName, setValue) {
+            varName = varName || "master";
+            var val = that[varName];
+            if (setValue == undefined) {
+                setValue = true;
+            }
+            if (setValue) {
+                that[varName] = val = !val;
+            }
+            list.forEach(function(entitiy) {
+                entitiy.checked = val;
+            });
+        };
+        $scope.createPermission = function(type, entity, path, permissions) {
+            if (path.charAt(0) != "/") {
+                path = "/" + path;
+            }
+            var ops = "";
+            var s = "";
+            if (permissions.getPerm) {
+                ops = "get";
+                s = ",";
+            }
+            if (permissions.postPerm) {
+                ops = ops + s + "post";
+                s = ",";
+            }
+            if (permissions.putPerm) {
+                ops = ops + s + "put";
+                s = ",";
+            }
+            if (permissions.deletePerm) {
+                ops = ops + s + "delete";
+                s = ",";
+            }
+            var permission = ops + ":" + path;
+            return permission;
+        };
+        $scope.formatDate = function(date) {
+            return new Date(date).toUTCString();
+        };
+        $scope.clearCheckbox = function(id) {
+            if ($("#" + id).attr("checked")) {
+                $("#" + id).click();
+            }
+        };
+        $scope.removeFirstSlash = function(path) {
+            return path.indexOf("/") === 0 ? path.substring(1, path.length) : path;
+        };
+        $scope.applyScope = function(cb) {
+            cb = typeof cb === "function" ? cb : function() {};
+            if (!this.$$phase) {
+                return this.$apply(cb);
+            } else {
+                cb();
+            }
+        };
+        $scope.valueSelected = function(list) {
+            return list && list.some(function(item) {
+                return item.checked;
+            });
+        };
+        $scope.sendHelp = function(modalId) {
+            ug.jsonpRaw("apigeeuihelpemail", "", {
+                useremail: $rootScope.userEmail
+            }).then(function() {
+                $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
+            }, function() {
+                $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
+            });
+            $scope.hideModal(modalId);
+        };
+        $scope.$on("users-typeahead-received", function(event, users) {
+            $scope.usersTypeaheadValues = users;
+            if (!$scope.$$phase) {
+                $scope.$apply();
+            }
+        });
+        $scope.$on("groups-typeahead-received", function(event, groups) {
+            $scope.groupsTypeaheadValues = groups;
+            if (!$scope.$$phase) {
+                $scope.$apply();
+            }
+        });
+        $scope.$on("roles-typeahead-received", function(event, roles) {
+            $scope.rolesTypeaheadValues = roles;
+            if (!$scope.$$phase) {
+                $scope.$apply();
+            }
+        });
+        $scope.$on("checkAuthentication-success", function() {
+            sessionStorage.setItem("authenticateAttempts", 0);
+            $scope.loaded = true;
+            $rootScope.activeUI = true;
+            $scope.applyScope();
+            if (!$scope.queryStringApplied) {
+                $scope.queryStringApplied = true;
+                setTimeout(function() {
+                    if ($scope.queryString.org) {
+                        $rootScope.$broadcast("change-org", $scope.queryString.org);
+                    }
+                }, 1e3);
+            }
+            $rootScope.$broadcast("app-initialized");
+        });
+        $scope.$on("checkAuthentication-error", function(args, err, missingData, email) {
+            $scope.loaded = true;
+            if (err && !$scope.use_sso && notRegistration()) {
+                ug.logout();
+                $location.path("/login");
+                $scope.applyScope();
+            } else {
+                if (missingData && notRegistration()) {
+                    if (!email && $scope.use_sso) {
+                        window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
+                        return;
+                    }
+                    ug.reAuthenticate(email);
+                }
+            }
+        });
+        $scope.$on("reAuthenticate-success", function(args, err, data, user, organizations, applications) {
+            sessionStorage.setItem("authenticateAttempts", 0);
+            $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
+            $rootScope.$emit("loginSuccesful", user, organizations, applications);
+            $rootScope.$broadcast("checkAuthentication-success");
+            $scope.applyScope(function() {
+                $scope.deferredLogin.resolve();
+                $location.path("/org-overview");
+            });
+        });
+        var authenticateAttempts = parseInt(sessionStorage.getItem("authenticateAttempts") || 0);
+        $scope.$on("reAuthenticate-error", function() {
+            if ($scope.use_sso) {
+                if (authenticateAttempts++ > 5) {
+                    $rootScope.$broadcast("alert", "error", "There is an issue with authentication. Please contact support.");
+                    return;
+                }
+                console.error("Failed to login via sso " + authenticateAttempts);
+                sessionStorage.setItem("authenticateAttempts", authenticateAttempts);
+                window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
+            } else {
+                if (notRegistration()) {
+                    ug.logout();
+                    $location.path("/login");
+                    $scope.applyScope();
+                }
+            }
+        });
+        $scope.$on("loginSuccessful", function() {
+            $rootScope.activeUI = true;
+        });
+        $scope.$on("app-changed", function(args, oldVal, newVal, preventReload) {
+            if (newVal !== oldVal && !preventReload) {
+                $route.reload();
+            }
+        });
+        $scope.$on("org-changed", function(args, oldOrg, newOrg) {
+            ug.getApplications();
+            $route.reload();
+        });
+        $scope.$on("app-settings-received", function(evt, data) {});
+        $scope.$on("request-times-slow", function(evt, averageRequestTimes) {
+            $rootScope.$broadcast("alert", "info", "We are experiencing performance issues on our server.  Please click Get Help for support if this continues.");
+        });
+        var lastPage = "";
+        $scope.$on("$routeChangeSuccess", function() {
+            verifyUser();
+            $scope.showDemoBar = $location.path().slice(0, "/performance".length) === "/performance";
+            if (!$scope.showDemoBar) {
+                $rootScope.demoData = false;
+            }
+            setTimeout(function() {
+                lastPage = "";
+            }, 50);
+            var path = window.location.pathname.replace("index-debug.html", "");
+            lastPage === "" && $analytics.pageTrack((path + $location.path()).replace("//", "/"));
+            lastPage = $location.path();
+        });
+        $scope.$on("applications-received", function(event, applications) {
+            $scope.applications = applications;
+            $scope.hasApplications = Object.keys(applications).length > 0;
+        });
+        ug.getAppSettings();
+        $rootScope.startFirstTimeUser = function() {
+            $rootScope.hideModal("introjs");
+            $rootScope.help.introjs_StartEvent();
+            $scope.startHelp();
+        };
+    } ]);
+    "use strict";
+    AppServices.Directives.directive("pageTitle", [ "$rootScope", "ug", function($rootScope, ug) {
+        return {
+            restrict: "E",
+            transclude: true,
+            templateUrl: "global/page-title.html",
+            link: function linkFn(scope, lElement, attrs) {
+                scope.title = attrs.title;
+                scope.icon = attrs.icon;
+                scope.showHelp = function() {
+                    $("#need-help").modal("show");
+                };
+                scope.sendHelp = function() {
+                    data.jsonp_raw("apigeeuihelpemail", "", {
+                        useremail: $rootScope.userEmail
+                    }).then(function() {
+                        $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
+                    }, function() {
+                        $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
+                    });
+                    $("#need-help").modal("hide");
+                };
+            }
+        };
+    } ]);
+    "use strict";
+    AppServices.Services.factory("ug", function(configuration, $rootScope, utility, $q, $http, $resource, $log, $analytics, $location) {
+        var requestTimes = [], running = false, currentRequests = {};
+        function reportError(data, config) {
+            try {
+                $analytics.eventTrack("error", {
+                    category: "App Services",
+                    label: data + ":" + config.url + ":" + (sessionStorage["apigee_uuid"] || "na")
+                });
+            } catch (e) {
+                console.log(e);
+            }
+        }
+        var getAccessToken = function() {
+            return sessionStorage.getItem("accessToken");
+        };
+        return {
+            get: function(prop, isObject) {
+                return isObject ? this.client().getObject(prop) : this.client().get(prop);
+            },
+            set: function(prop, value) {
+                this.client().set(prop, value);
+            },
+            getUrls: function(qs) {
+                var host = $location.host();
+                var BASE_URL = "";
+                var DATA_URL = "";
+                var use_sso = false;
+                switch (true) {
+                  case host === "appservices.apigee.com" && location.pathname.indexOf("/dit") >= 0:
+                    BASE_URL = "https://accounts.jupiter.apigee.net";
+                    DATA_URL = "http://apigee-internal-prod.jupiter.apigee.net";
+                    use_sso = true;
+                    break;
+
+                  case host === "appservices.apigee.com" && location.pathname.indexOf("/mars") >= 0:
+                    BASE_URL = "https://accounts.mars.apigee.net";
+                    DATA_URL = "http://apigee-internal-prod.mars.apigee.net";
+                    use_sso = true;
+                    break;
+
+                  case host === "appservices.apigee.com":
+                    DATA_URL = Usergrid.overrideUrl;
+                    break;
+
+                  case host === "apigee.com":
+                    BASE_URL = "https://accounts.apigee.com";
+                    DATA_URL = "https://api.usergrid.com";
+                    use_sso = true;
+                    break;
+
+                  case host === "usergrid.dev":
+                    DATA_URL = "https://api.usergrid.com";
+                    break;
+
+                  default:
+                    DATA_URL = Usergrid.overrideUrl;
+                    break;
+                }
+                DATA_URL = qs.api_url || DATA_URL;
+                DATA_URL = DATA_URL.lastIndexOf("/") === DATA_URL.length - 1 ? DATA_URL.substring(0, DATA_URL.length - 1) : DATA_URL;
+                return {
+                    DATA_URL: DATA_URL,
+                    LOGIN_URL: BASE_URL + "/accounts/sign_in",
+                    PROFILE_URL: BASE_URL + "/accounts/my_account",
+                    LOGOUT_URL: BASE_URL + "/accounts/sign_out",
+                    apiUrl: DATA_URL,
+                    use_sso: use_sso
+                };
+            },
+            orgLogin: function(username, password) {
+                var self = this;
+                this.client().set("email", username);
+                this.client().set("token", null);
+                this.client().orgLogin(username, password, function(err, data, user, organizations, applications) {
+                    if (err) {
+                        $rootScope.$broadcast("loginFailed", err, data);
+                    } else {
+                        self.initializeCurrentUser(function() {
+                            $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
+                        });
+                    }
+                });
+            },
+            checkAuthentication: function(force) {
+                var ug = this;
+                var client = ug.client();
+                var initialize = function() {
+                    ug.initializeCurrentUser(function() {
+                        $rootScope.userEmail = client.get("email");
+                        $rootScope.organizations = client.getObject("organizations");
+                        $rootScope.applications = client.getObject("applications");
+                        $rootScope.currentOrg = client.get("orgName");
+                        $rootScope.currentApp = client.get("appName");
+                        var size = 0, key;
+                        for (key in $rootScope.applications) {
+                            if ($rootScope.applications.hasOwnProperty(key)) size++;
+                        }
+                        $rootScope.$broadcast("checkAuthentication-success", client.getObject("organizations"), client.getObject("applications"), client.get("orgName"), client.get("appName"), client.get("email"));
+                    });
+                }, isAuthenticated = function() {
+                    var authenticated = client.get("token") !== null && client.get("organizations") !== null;
+                    if (authenticated) {
+                        initialize();
+                    }
+                    return authenticated;
+                };
+                if (!isAuthenticated() || force) {
+                    if (!client.get("token")) {
+                        return $rootScope.$broadcast("checkAuthentication-error", "no token", {}, client.get("email"));
+                    }
+                    this.client().reAuthenticateLite(function(err) {
+                        var missingData = err || (!client.get("orgName") || !client.get("appName") || !client.getObject("organizations") || !client.getObject("applications"));
+                        var email = client.get("email");
+                        if (err || missingData) {
+                            $rootScope.$broadcast("checkAuthentication-error", err, missingData, email);
+                        } else {
+                            initialize();
+                        }
+                    });
+                }
+            },
+            reAuthenticate: function(email, eventOveride) {
+                var ug = this;
+                this.client().reAuthenticate(email, function(err, data, user, organizations, applications) {
+                    if (!err) {
+                        $rootScope.currentUser = user;
+                    }
+                    if (!err) {
+                        $rootScope.userEmail = user.get("email");
+                        $rootScope.organizations = organizations;
+                        $rootScope.applications = applications;
+                        $rootScope.currentOrg = ug.get("orgName");
+                        $rootScope.currentApp = ug.get("appName");
+                        $rootScope.currentUser = user._data;
+                        $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
+                    }
+                    $rootScope.$broadcast((eventOveride || "reAuthenticate") + "-" + (err ? "error" : "success"), err, data, user, organizations, applications);
+                });
+            },
+            logoutCallback: function() {
+                $rootScope.$broadcast("userNotAuthenticated");
+            },
+            logout: function() {
+                $rootScope.activeUI = false;
+                $rootScope.userEmail = "user@apigee.com";
+                $rootScope.organizations = {
+                    noOrg: {
+                        name: "No Orgs Found"
+                    }
+                };
+                $rootScope.applications = {
+                    noApp: {
+                        name: "No Apps Found"
+                    }
+                };
+                $rootScope.currentOrg = "No Org Found";
+                $rootScope.currentApp = "No App Found";
+                sessionStorage.setItem("accessToken", null);
+                sessionStorage.setItem("userUUID", null);
+                sessionStorage.setItem("userEmail", null);
+                this.client().logout();
+                this._client = null;
+            },
+            client: function() {
+                var options = {
+                    buildCurl: true,
+                    logging: true
+                };
+                if (Usergrid.options && Usergrid.options.client) {
+                    options.keys = Usergrid.options.client;
+                }
+                this._client = this._client || new Usergrid.Client(options, $rootScope.urls().DATA_URL);
+                return this._client;
+            },
+            setClientProperty: function(key, value) {
+                this.client().set(key, value);
+            },
+            getTopCollections: function() {
+                var options = {
+                    method: "GET",
+                    endpoint: ""
+                };
+                this.client().request(options, function(err, data) {
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", "error getting collections");
+                    } else {
+                        var collections = data.entities[0].metadata.collections;
+                        $rootScope.$broadcast("top-collections-received", collections);
+                    }
+                });
+            },
+            createCollection: function(collectionName) {
+                var collections = {};
+                collections[collectionName] = {};
+                var metadata = {
+                    metadata: {
+                        collections: collections
+                    }
+                };
+                var options = {
+                    method: "PUT",
+                    body: metadata,
+                    endpoint: ""
+                };
+                this.client().request(options, function(err, data) {
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", "error creating collection");
+                    } else {
+                        $rootScope.$broadcast("collection-created", collections);
+                    }
+                });
+            },
+            getApplications: function() {
+                this.client().getApplications(function(err, applications) {
+                    if (err) {
+                        applications && console.error(applications);
+                    } else {
+                        $rootScope.$broadcast("applications-received", applications);
+                    }
+                });
+            },
+            getAdministrators: function() {
+                this.client().getAdministrators(function(err, administrators) {
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", "error getting administrators");
+                    }
+                    $rootScope.$broadcast("administrators-received", administrators);
+                });
+            },
+            createApplication: function(appName) {
+                this.client().createApplication(appName, function(err, applications) {
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", "error creating application");
+                    } else {
+                        $rootScope.$broadcast("applications-created", applications, appName);
+                        $rootScope.$broadcast("applications-received", applications);
+                    }
+                });
+            },
+            createAdministrator: function(adminName) {
+                this.client().createAdministrator(adminName, function(err, administrators) {
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", "error creating administrator");
+                    }
+                    $rootScope.$broadcast("administrators-received", administrators);
+                });
+            },
+            getFeed: function() {
+                var options = {
+                    method: "GET",
+                    endpoint: "management/organizations/" + this.client().get("orgName") + "/feed",
+                    mQuery: true
+                };
+                this.client().request(options, function(err, data) {
+                    if (err) {
+                        $rootScope.$broadcast("alert", "error", "error getting feed");
+                    } else {
+                        var feedData = data.entities;
+                        var feed = [];
+                        var i = 0;
+                        for (i = 0; i < feedData.length; i++) {
+                            var date = new Date(feedData[i].created).toUTCString();
+                            var title = feedData[i].title;
+                            var n = title.indexOf(">");
+                            title = title.substring(n + 1, title.length);
+                            n = title.indexOf(">");
+                            title = title.substring(n + 1, title.length);
+                            if (feedData[i].actor) {
+                                title = feedData[i].actor.displayName + " " + title;
+                            }
+                            feed.push({
+                                date: date,
+                                title: title
+                            });
+                        }
+                        if (i === 0) {
+                            feed.push({
+                                date: "",
+                                title: "No Activities found."
+                            });
+                        }
+                        $rootScope.$broadcast("feed-received", feed);
+                    }
+                });
+        

<TRUNCATED>

[14/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/67108093/portal/dist/usergrid-portal/js/usergrid-dev.min.js
----------------------------------------------------------------------
diff --cc portal/dist/usergrid-portal/js/usergrid-dev.min.js
index 0000000,66264b7..1568183
mode 000000,100644..100644
--- a/portal/dist/usergrid-portal/js/usergrid-dev.min.js
+++ b/portal/dist/usergrid-portal/js/usergrid-dev.min.js
@@@ -1,0 -1,4939 +1,4939 @@@
+ /*! usergrid@2.0.2 2014-04-02 */
+ (function(exports, global) {
+     global["true"] = exports;
+     "use strict";
+     var polyfills = function(window, Object) {
+         window.requestAnimFrame = function() {
+             return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {
+                 window.setTimeout(callback, 1e3 / 60);
+             };
+         }();
+         Object.defineProperty(Object.prototype, "clone", {
+             enumerable: false,
+             writable: true,
+             value: function() {
+                 var i, newObj = this instanceof Array ? [] : {};
+                 for (i in this) {
+                     if (i === "clone") {
+                         continue;
+                     }
+                     if (this[i] && typeof this[i] === "object") {
+                         newObj[i] = this[i].clone();
+                     } else {
+                         newObj[i] = this[i];
+                     }
+                 }
+                 return newObj;
+             }
+         });
+         Object.defineProperty(Object.prototype, "stringifyJSON", {
+             enumerable: false,
+             writable: true,
+             value: function() {
+                 return JSON.stringify(this, null, "	");
+             }
+         });
+     };
+     polyfills(window, Object);
+     var global = global || this;
+     var AppServices = AppServices || {};
+     global.AppServices = global.AppServices || AppServices;
+     AppServices.Constants = angular.module("appservices.constants", []);
+     AppServices.Services = angular.module("appservices.services", []);
+     AppServices.Controllers = angular.module("appservices.controllers", []);
+     AppServices.Filters = angular.module("appservices.filters", []);
+     AppServices.Directives = angular.module("appservices.directives", []);
+     AppServices.Performance = angular.module("appservices.performance", []);
+     AppServices.MAX = angular.module("appservices.max", []);
+     angular.module("appservices", [ "ngRoute", "ngResource", "ngSanitize", "ui.bootstrap", "angulartics", "angulartics.google.analytics", "appservices.filters", "appservices.services", "appservices.directives", "appservices.constants", "appservices.controllers", "appservices.max", "angular-intro" ]).config([ "$routeProvider", "$locationProvider", "$sceDelegateProvider", "$analyticsProvider", function($routeProvider, $locationProvider, $sceDelegateProvider, $analyticsProvider) {
+         $routeProvider.when("/org-overview", {
+             templateUrl: "org-overview/org-overview.html",
+             controller: "OrgOverviewCtrl"
+         }).when("/login", {
+             templateUrl: "login/login.html",
+             controller: "LoginCtrl"
+         }).when("/login/loading", {
+             templateUrl: "login/loading.html",
+             controller: "LoginCtrl"
+         }).when("/app-overview/summary", {
+             templateUrl: "app-overview/app-overview.html",
+             controller: "AppOverviewCtrl"
+         }).when("/getting-started/setup", {
+             templateUrl: "app-overview/getting-started.html",
+             controller: "GettingStartedCtrl"
+         }).when("/forgot-password", {
+             templateUrl: "login/forgot-password.html",
+             controller: "ForgotPasswordCtrl"
+         }).when("/register", {
+             templateUrl: "login/register.html",
+             controller: "RegisterCtrl"
+         }).when("/users", {
+             templateUrl: "users/users.html",
+             controller: "UsersCtrl"
+         }).when("/users/profile", {
+             templateUrl: "users/users-profile.html",
+             controller: "UsersProfileCtrl"
+         }).when("/users/groups", {
+             templateUrl: "users/users-groups.html",
+             controller: "UsersGroupsCtrl"
+         }).when("/users/activities", {
+             templateUrl: "users/users-activities.html",
+             controller: "UsersActivitiesCtrl"
+         }).when("/users/feed", {
+             templateUrl: "users/users-feed.html",
+             controller: "UsersFeedCtrl"
+         }).when("/users/graph", {
+             templateUrl: "users/users-graph.html",
+             controller: "UsersGraphCtrl"
+         }).when("/users/roles", {
+             templateUrl: "users/users-roles.html",
+             controller: "UsersRolesCtrl"
+         }).when("/groups", {
+             templateUrl: "groups/groups.html",
+             controller: "GroupsCtrl"
+         }).when("/groups/details", {
+             templateUrl: "groups/groups-details.html",
+             controller: "GroupsDetailsCtrl"
+         }).when("/groups/members", {
+             templateUrl: "groups/groups-members.html",
+             controller: "GroupsMembersCtrl"
+         }).when("/groups/activities", {
+             templateUrl: "groups/groups-activities.html",
+             controller: "GroupsActivitiesCtrl"
+         }).when("/groups/roles", {
+             templateUrl: "groups/groups-roles.html",
+             controller: "GroupsRolesCtrl"
+         }).when("/roles", {
+             templateUrl: "roles/roles.html",
+             controller: "RolesCtrl"
+         }).when("/roles/settings", {
+             templateUrl: "roles/roles-settings.html",
+             controller: "RolesSettingsCtrl"
+         }).when("/roles/users", {
+             templateUrl: "roles/roles-users.html",
+             controller: "RolesUsersCtrl"
+         }).when("/roles/groups", {
+             templateUrl: "roles/roles-groups.html",
+             controller: "RolesGroupsCtrl"
+         }).when("/data", {
+             templateUrl: "data/data.html",
+             controller: "DataCtrl"
+         }).when("/data/entity", {
+             templateUrl: "data/entity.html",
+             controller: "EntityCtrl"
+         }).when("/data/shell", {
+             templateUrl: "data/shell.html",
+             controller: "ShellCtrl"
+         }).when("/profile/organizations", {
+             templateUrl: "profile/organizations.html",
+             controller: "OrgCtrl"
+         }).when("/profile/profile", {
+             templateUrl: "profile/profile.html",
+             controller: "ProfileCtrl"
+         }).when("/profile", {
+             templateUrl: "profile/account.html",
+             controller: "AccountCtrl"
+         }).when("/activities", {
+             templateUrl: "activities/activities.html",
+             controller: "ActivitiesCtrl"
+         }).when("/shell", {
+             templateUrl: "shell/shell.html",
+             controller: "ShellCtrl"
+         }).when("/logout", {
+             templateUrl: "login/logout.html",
+             controller: "LogoutCtrl"
+         }).otherwise({
+             redirectTo: "/org-overview"
+         });
+         $locationProvider.html5Mode(false).hashPrefix("!");
+         $sceDelegateProvider.resourceUrlWhitelist([ "self", "http://apigee-internal-prod.jupiter.apigee.net/**", "http://apigee-internal-prod.mars.apigee.net/**", "https://appservices.apigee.com/**", "https://api.usergrid.com/**" ]);
+         $analyticsProvider.virtualPageviews(false);
+         $analyticsProvider.firstPageview(false);
+     } ]);
+     AppServices.Controllers.controller("ActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
+         $scope.$on("app-activities-received", function(evt, data) {
+             $scope.activities = data;
+             $scope.$apply();
+         });
+         $scope.$on("app-activities-error", function(evt, data) {
+             $rootScope.$broadcast("alert", "error", "Application failed to retreive activities data.");
+         });
+         ug.getActivities();
+     } ]);
+     "use strict";
+     AppServices.Controllers.controller("AppOverviewCtrl", [ "ug", "charts", "$scope", "$rootScope", "$log", function(ug, charts, $scope, $rootScope, $log) {
+         var createGradient = function(color1, color2) {
+             var perShapeGradient = {
+                 x1: 0,
+                 y1: 0,
+                 x2: 0,
+                 y2: 1
+             };
+             return {
+                 linearGradient: perShapeGradient,
+                 stops: [ [ 0, color1 ], [ 1, color2 ] ]
+             };
+         };
+         $scope.appOverview = {};
+         $scope.collections = [];
+         $scope.graph = "";
+         $scope.$on("top-collections-received", function(event, collections) {
+             var dataDescription = {
+                 bar1: {
+                     labels: [ "Total" ],
+                     dataAttr: [ "title", "count" ],
+                     colors: [ createGradient("rgba(36,151,212,0.6)", "rgba(119,198,240,0.6)") ],
+                     borderColor: "#1b97d1"
+                 }
+             };
+             $scope.collections = collections;
+             var arr = [];
+             for (var i in collections) {
+                 if (collections.hasOwnProperty(i)) {
+                     arr.push(collections[i]);
+                 }
+             }
+             $scope.appOverview = {};
+             if (!$rootScope.chartTemplate) {
+                 ug.httpGet(null, "js/charts/highcharts.json").then(function(success) {
+                     $rootScope.chartTemplate = success;
+                     $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
+                     $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
+                     $scope.applyScope();
+                 }, function(fail) {
+                     $log.error("Problem getting chart template", fail);
+                 });
+             } else {
+                 $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
+                 $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
+                 $scope.applyScope();
+             }
+         });
+         $scope.$on("app-initialized", function() {
+             ug.getTopCollections();
+         });
+         if ($rootScope.activeUI) {
+             ug.getTopCollections();
+         }
+     } ]);
+     "use strict";
+     AppServices.Controllers.controller("GettingStartedCtrl", [ "ug", "$scope", "$rootScope", "$location", "$timeout", "$anchorScroll", function(ug, $scope, $rootScope, $location, $timeout, $anchorScroll) {
+         $scope.collections = [];
+         $scope.graph = "";
+         $scope.clientID = "";
+         $scope.clientSecret = "";
+         var getKeys = function() {
+             return ug.jsonpRaw("credentials", "", {});
+         };
+         $scope.regenerateCredentialsDialog = function(modalId) {
+             $scope.orgAPICredentials = {
+                 client_id: "regenerating...",
+                 client_secret: "regenerating..."
+             };
+             ug.regenerateAppCredentials();
+             $scope.hideModal(modalId);
+         };
+         $scope.$on("app-creds-updated", function(event, credentials) {
+             if (credentials) {
+                 $scope.clientID = credentials.client_id;
+                 $scope.clientSecret = credentials.client_secret;
+                 if (!$scope.$$phase) {
+                     $scope.$apply();
+                 }
+             } else {
+                 setTimeout(function() {
+                     ug.getAppCredentials();
+                 }, 5e3);
+             }
+         });
+         ug.getAppCredentials();
+         $scope.contentTitle;
+         $scope.showSDKDetail = function(name) {
+             var introContainer = document.getElementById("intro-container");
+             if (name === "nocontent") {
+                 introContainer.style.height = "0";
+                 return true;
+             }
+             introContainer.style.opacity = .1;
+             introContainer.style.height = "0";
+             var timeout = 0;
+             if ($scope.contentTitle) {
+                 timeout = 500;
+             }
+             $timeout(function() {
+                 introContainer.style.height = "1000px";
+                 introContainer.style.opacity = 1;
+             }, timeout);
+             $scope.optionName = name;
+             $scope.contentTitle = name;
+             $scope.sdkLink = "http://apigee.com/docs/content/" + name + "-sdk-redirect";
+             $scope.docsLink = "http://apigee.com/docs/app-services/content/installing-apigee-sdk-" + name;
+             $scope.getIncludeURL = function() {
+                 return "app-overview/doc-includes/" + $scope.optionName + ".html";
+             };
+         };
+         $scope.scrollToElement = function(elem) {
+             $location.hash(elem);
+             $anchorScroll();
+             return false;
+         };
+     } ]);
+     "use strict";
+     AppServices.Controllers.controller("ChartCtrl", [ "$scope", "$location", function($scope, $location) {} ]);
+     "use strict";
+     AppServices.Directives.directive("chart", function($rootScope) {
+         return {
+             restrict: "E",
+             scope: {
+                 chartdata: "=chartdata"
+             },
+             template: "<div></div>",
+             replace: true,
+             controller: function($scope, $element) {},
+             link: function(scope, element, attrs) {
+                 scope.$watch("chartdata", function(chartdata, oldchartdata) {
+                     if (chartdata) {
+                         var chartsDefaults = {
+                             chart: {
+                                 renderTo: element[0],
+                                 type: attrs.type || null,
+                                 height: attrs.height || null,
+                                 width: attrs.width || null,
+                                 reflow: true,
+                                 animation: false,
+                                 zoomType: "x"
+                             }
+                         };
+                         if (attrs.type === "pie") {
+                             chartsDefaults.chart.margin = [ 0, 0, 0, 0 ];
+                             chartsDefaults.chart.spacingLeft = 0;
+                             chartsDefaults.chart.spacingRight = 0;
+                             chartsDefaults.chart.spacingTop = 0;
+                             chartsDefaults.chart.spacingBottom = 0;
+                             if (attrs.titleimage) {
+                                 chartdata.title.text = '<img src="' + attrs.titleimage + '">';
+                             }
+                             if (attrs.titleicon) {
+                                 chartdata.title.text = '<i class="pictogram ' + attrs.titleiconclass + '">' + attrs.titleicon + "</i>";
+                             }
+                             if (attrs.titlecolor) {
+                                 chartdata.title.style.color = attrs.titlecolor;
+                             }
+                             if (attrs.titleimagetop) {
+                                 chartdata.title.style.marginTop = attrs.titleimagetop;
+                             }
+                             if (attrs.titleimageleft) {
+                                 chartdata.title.style.marginLeft = attrs.titleimageleft;
+                             }
+                         }
+                         if (attrs.type === "line") {
+                             chartsDefaults.chart.marginTop = 30;
+                             chartsDefaults.chart.spacingTop = 50;
+                         }
+                         if (attrs.type === "column") {
+                             chartsDefaults.chart.marginBottom = 80;
+                         }
+                         if (attrs.type === "area") {
+                             chartsDefaults.chart.spacingLeft = 0;
+                             chartsDefaults.chart.spacingRight = 0;
+                             chartsDefaults.chart.marginLeft = 0;
+                             chartsDefaults.chart.marginRight = 0;
+                         }
+                         Highcharts.setOptions({
+                             global: {
+                                 useUTC: false
+                             },
+                             chart: {
+                                 style: {
+                                     fontFamily: "marquette-light, Helvetica, Arial, sans-serif"
+                                 }
+                             }
+                         });
+                         if (attrs.type === "line") {
+                             var xAxis1 = chartdata.xAxis[0];
+                             if (!xAxis1.labels.formatter) {
+                                 xAxis1.labels.formatter = new Function(attrs.xaxislabel);
+                             }
+                             if (!xAxis1.labels.step) {
+                                 xAxis1.labels.step = attrs.xaxisstep;
+                             }
+                         }
+                         if (chartdata.tooltip) {
+                             if (typeof chartdata.tooltip.formatter === "string") {
+                                 chartdata.tooltip.formatter = new Function(chartdata.tooltip.formatter);
+                             }
+                         }
+                         renderChart(chartsDefaults, chartdata);
+                     }
+                 }, true);
+             }
+         };
+     });
+     function renderChart(chartsDefaults, chartdata, attrs) {
+         var newSettings = {};
+         $.extend(true, newSettings, chartsDefaults, chartdata);
+         var chart = new Highcharts.Chart(newSettings);
+     }
+     AppServices.Services.factory("charts", function() {
+         var lineChart, areaChart, paretoChart, pieChart, pieCompare, xaxis, seriesIndex;
+         return {
+             convertLineChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                 lineChart = chartTemplate;
+                 if (typeof chartData[0] === "undefined") {
+                     chartData[0] = {};
+                     chartData[0].datapoints = [];
+                 }
+                 var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
+                 if (currentCompare === "YESTERDAY") {
+                     seriesIndex = dataDescription.dataAttr.length;
+                     label = "Yesterday ";
+                 } else if (currentCompare === "LAST_WEEK") {
+                     seriesIndex = dataDescription.dataAttr.length;
+                     label = "Last Week ";
+                 } else {
+                     lineChart = chartTemplate;
+                     seriesIndex = 0;
+                     lineChart.series = [];
+                     label = "";
+                 }
+                 xaxis = lineChart.xAxis[0];
+                 xaxis.categories = [];
+                 if (settings.xaxisformat) {
+                     xaxis.labels.formatter = new Function(settings.xaxisformat);
+                 }
+                 if (settings.step) {
+                     xaxis.labels.step = settings.step;
+                 }
+                 for (var i = 0; i < dPLength; i++) {
+                     var dp = dataPoints[i];
+                     xaxis.categories.push(dp.timestamp);
+                 }
+                 if (chartData.length > 1) {
+                     for (var l = 0; l < chartData.length; l++) {
+                         if (chartData[l].chartGroupName) {
+                             dataPoints = chartData[l].datapoints;
+                             lineChart.series[l] = {};
+                             lineChart.series[l].data = [];
+                             lineChart.series[l].name = chartData[l].chartGroupName;
+                             lineChart.series[l].yAxis = 0;
+                             lineChart.series[l].type = "line";
+                             lineChart.series[l].color = dataDescription.colors[i];
+                             lineChart.series[l].dashStyle = "solid";
+                             lineChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
+                             plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
+                         }
+                     }
+                 } else {
+                     var steadyCounter = 0;
+                     for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
+                         var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
+                         lineChart.series[i] = {};
+                         lineChart.series[i].data = [];
+                         lineChart.series[i].name = label + dataDescription.labels[steadyCounter];
+                         lineChart.series[i].yAxis = yAxisIndex;
+                         lineChart.series[i].type = "line";
+                         lineChart.series[i].color = dataDescription.colors[i];
+                         lineChart.series[i].dashStyle = "solid";
+                         lineChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
+                         steadyCounter++;
+                     }
+                     plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
+                 }
+                 function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
+                     for (var i = 0; i < dPLength; i++) {
+                         var dp = dataPoints[i];
+                         var localCounter = counter;
+                         for (var j = 0; j < dataAttrs.length; j++) {
+                             if (typeof dp === "undefined") {
+                                 lineChart.series[localCounter].data.push([ i, 0 ]);
+                             } else {
+                                 lineChart.series[localCounter].data.push([ i, dp[dataAttrs[j]] ]);
+                             }
+                             if (!detailedView) {
+                                 localCounter++;
+                             }
+                         }
+                     }
+                 }
+                 return lineChart;
+             },
+             convertAreaChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                 areaChart = angular.copy(areaChart);
+                 if (typeof chartData[0] === "undefined") {
+                     chartData[0] = {};
+                     chartData[0].datapoints = [];
+                 }
+                 var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
+                 if (currentCompare === "YESTERDAY") {
+                     seriesIndex = dataDescription.dataAttr.length;
+                     label = "Yesterday ";
+                 } else if (currentCompare === "LAST_WEEK") {
+                     seriesIndex = dataDescription.dataAttr.length;
+                     label = "Last Week ";
+                 } else {
+                     areaChart = chartTemplate;
+                     seriesIndex = 0;
+                     areaChart.series = [];
+                     label = "";
+                 }
+                 xaxis = areaChart.xAxis[0];
+                 xaxis.categories = [];
+                 if (settings.xaxisformat) {
+                     xaxis.labels.formatter = new Function(settings.xaxisformat);
+                 }
+                 if (settings.step) {
+                     xaxis.labels.step = settings.step;
+                 }
+                 for (var i = 0; i < dPLength; i++) {
+                     var dp = dataPoints[i];
+                     xaxis.categories.push(dp.timestamp);
+                 }
+                 if (chartData.length > 1) {
+                     for (var l = 0; l < chartData.length; l++) {
+                         if (chartData[l].chartGroupName) {
+                             dataPoints = chartData[l].datapoints;
+                             areaChart.series[l] = {};
+                             areaChart.series[l].data = [];
+                             areaChart.series[l].fillColor = dataDescription.areaColors[l];
+                             areaChart.series[l].name = chartData[l].chartGroupName;
+                             areaChart.series[l].yAxis = 0;
+                             areaChart.series[l].type = "area";
+                             areaChart.series[l].pointInterval = 1;
+                             areaChart.series[l].color = dataDescription.colors[l];
+                             areaChart.series[l].dashStyle = "solid";
+                             areaChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
+                             plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
+                         }
+                     }
+                 } else {
+                     var steadyCounter = 0;
+                     for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
+                         var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
+                         areaChart.series[i] = {};
+                         areaChart.series[i].data = [];
+                         areaChart.series[i].fillColor = dataDescription.areaColors[i];
+                         areaChart.series[i].name = label + dataDescription.labels[steadyCounter];
+                         areaChart.series[i].yAxis = yAxisIndex;
+                         areaChart.series[i].type = "area";
+                         areaChart.series[i].pointInterval = 1;
+                         areaChart.series[i].color = dataDescription.colors[i];
+                         areaChart.series[i].dashStyle = "solid";
+                         areaChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
+                         steadyCounter++;
+                     }
+                     plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
+                 }
+                 function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
+                     for (var i = 0; i < dPLength; i++) {
+                         var dp = dataPoints[i];
+                         var localCounter = counter;
+                         for (var j = 0; j < dataAttrs.length; j++) {
+                             if (typeof dp === "undefined") {
+                                 areaChart.series[localCounter].data.push(0);
+                             } else {
+                                 areaChart.series[localCounter].data.push(dp[dataAttrs[j]]);
+                             }
+                             if (!detailedView) {
+                                 localCounter++;
+                             }
+                         }
+                     }
+                 }
+                 return areaChart;
+             },
+             convertParetoChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                 paretoChart = chartTemplate;
+                 if (typeof chartData === "undefined") {
+                     chartData = [];
+                 }
+                 var label, cdLength = chartData.length, compare = false, allParetoOptions = [], stackedBar = false;
+                 seriesIndex = 0;
+                 function getPreviousData() {
+                     for (var i = 0; i < chartTemplate.series[0].data.length; i++) {
+                         allParetoOptions.push(chartTemplate.xAxis.categories[i]);
+                     }
+                 }
+                 if (typeof dataDescription.dataAttr[1] === "object") {
+                     stackedBar = true;
+                 }
+                 if (currentCompare === "YESTERDAY") {
+                     label = "Yesterday ";
+                     compare = true;
+                     if (stackedBar) {
+                         seriesIndex = dataDescription.dataAttr[1].length;
+                     }
+                     getPreviousData();
+                 } else if (currentCompare === "LAST_WEEK") {
+                     label = "Last Week ";
+                     compare = true;
+                     if (stackedBar) {
+                         seriesIndex = dataDescription.dataAttr[1].length;
+                     }
+                     seriesIndex = getPreviousData();
+                 } else {
+                     compare = false;
+                     label = "";
+                     paretoChart.xAxis.categories = [];
+                     paretoChart.series = [];
+                     paretoChart.series[0] = {};
+                     paretoChart.series[0].data = [];
+                     paretoChart.legend.enabled = false;
+                 }
+                 paretoChart.plotOptions.series.borderColor = dataDescription.borderColor;
+                 if (compare && !stackedBar) {
+                     paretoChart.series[1] = {};
+                     paretoChart.series[1].data = [];
+                     for (var i = 0; i < allParetoOptions.length; i++) {
+                         paretoChart.series[1].data.push(0);
+                     }
+                     paretoChart.legend.enabled = true;
+                 }
+                 for (var i = 0; i < cdLength; i++) {
+                     var bar = chartData[i];
+                     if (!compare) {
+                         paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]);
+                         if (typeof dataDescription.dataAttr[1] === "object") {
+                             createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
+                         } else {
+                             paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]);
+                             paretoChart.series[0].name = dataDescription.labels[0];
+                             paretoChart.series[0].color = dataDescription.colors[0];
+                         }
+                     } else {
+                         var newLabel = bar[dataDescription.dataAttr[0]], newValue = bar[dataDescription.dataAttr[1]], previousIndex = allParetoOptions.indexOf(newLabel);
+                         if (previousIndex > -1) {
+                             if (typeof dataDescription.dataAttr[1] === "object") {
+                                 createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
+                             } else {
+                                 paretoChart.series[1].data[previousIndex] = newValue;
+                                 paretoChart.series[1].name = label !== "" ? label + " " + dataDescription.labels[0] : dataDescription.labels[0];
+                                 paretoChart.series[1].color = dataDescription.colors[1];
+                             }
+                         } else {}
+                     }
+                 }
+                 function createStackedBar(dataDescription, paretoChart, startingPoint) {
+                     paretoChart.plotOptions = {
+                         series: {
+                             shadow: false,
+                             borderColor: dataDescription.borderColor,
+                             borderWidth: 1
+                         },
+                         column: {
+                             stacking: "normal",
+                             dataLabels: {
+                                 enabled: true,
+                                 color: Highcharts.theme && Highcharts.theme.dataLabelsColor || "white"
+                             }
+                         }
+                     };
+                     var start = dataDescription.dataAttr[1].length, steadyCounter = 0, stackName = label;
+                     if (compare) {
+                         paretoChart.legend.enabled = true;
+                     }
+                     for (var f = seriesIndex; f < start + seriesIndex; f++) {
+                         if (!paretoChart.series[f]) {
+                             paretoChart.series[f] = {
+                                 data: []
+                             };
+                         }
+                         paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]);
+                         paretoChart.series[f].name = label !== "" ? label + " " + dataDescription.labels[steadyCounter] : dataDescription.labels[steadyCounter];
+                         paretoChart.series[f].color = dataDescription.colors[f];
+                         paretoChart.series[f].stack = label;
+                         steadyCounter++;
+                     }
+                 }
+                 return paretoChart;
+             },
+             convertPieChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+                 var label, cdLength = chartData.length, compare = false;
+                 pieChart = chartTemplate;
+                 if (currentCompare === "YESTERDAY") {
+                     label = "Yesterday ";
+                     compare = false;
+                 } else if (currentCompare === "LAST_WEEK") {
+                     label = "Last Week ";
+                     compare = false;
+                 } else {
+                     compare = false;
+                     pieChart.series[0].data = [];
+                     if (pieChart.series[0].dataLabels) {
+                         if (typeof pieChart.series[0].dataLabels.formatter === "string") {
+                             pieChart.series[0].dataLabels.formatter = new Function(pieChart.series[0].dataLabels.formatter);
+                         }
+                     }
+                 }
+                 pieChart.plotOptions.pie.borderColor = dataDescription.borderColor;
+                 if (compare) {
+                     pieChart.series[1].data = [];
+                     if (pieChart.series[1].dataLabels) {
+                         if (typeof pieChart.series[1].dataLabels.formatter === "string") {
+                             pieChart.series[1].dataLabels.formatter = new Function(pieChart.series[1].dataLabels.formatter);
+                         }
+                     }
+                 }
+                 var tempArray = [];
+                 for (var i = 0; i < cdLength; i++) {
+                     var pie = chartData[i];
+                     tempArray.push({
+                         name: pie[dataDescription.dataAttr[0]],
+                         y: pie[dataDescription.dataAttr[1]],
+                         color: ""
+                     });
+                 }
+                 sortJsonArrayByProperty(tempArray, "name");
+                 for (var i = 0; i < tempArray.length; i++) {
+                     tempArray[i].color = dataDescription.colors[i];
+                 }
+                 if (!compare) {
+                     pieChart.series[0].data = tempArray;
+                 } else {
+                     pieChart.series[1].data = tempArray;
+                 }
+                 return pieChart;
+             }
+         };
+         function sortJsonArrayByProperty(objArray, prop, direction) {
+             if (arguments.length < 2) throw new Error("sortJsonArrayByProp requires 2 arguments");
+             var direct = arguments.length > 2 ? arguments[2] : 1;
+             if (objArray && objArray.constructor === Array) {
+                 var propPath = prop.constructor === Array ? prop : prop.split(".");
+                 objArray.sort(function(a, b) {
+                     for (var p in propPath) {
+                         if (a[propPath[p]] && b[propPath[p]]) {
+                             a = a[propPath[p]];
+                             b = b[propPath[p]];
+                         }
+                     }
+                     a = a.match(/^\d+$/) ? +a : a;
+                     b = b.match(/^\d+$/) ? +b : b;
+                     return a < b ? -1 * direct : a > b ? 1 * direct : 0;
+                 });
+             }
+         }
+     });
+     $(".sessions-bar").sparkline([ 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 1 ], {
+         type: "bar",
+         barColor: "#c5c5c5",
+         width: "800px",
+         height: 100,
+         barWidth: 12,
+         barSpacing: "1px"
+     });
+     "use strict";
+     AppServices.Controllers.controller("DataCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
+         var init = function() {
+             $scope.verb = "GET";
+             $scope.display = "";
+             $scope.queryBodyDetail = {};
+             $scope.queryBodyDisplay = "none";
+             $scope.queryLimitDisplay = "block";
+             $scope.queryStringDisplay = "block";
+             $scope.entitySelected = {};
+             $scope.newCollection = {};
+             $rootScope.queryCollection = {};
+             $scope.data = {};
+             $scope.data.queryPath = "";
+             $scope.data.queryBody = '{ "name":"value" }';
+             $scope.data.searchString = "";
+             $scope.data.queryLimit = "";
+         };
+         var runQuery = function(verb) {
+             $scope.loading = true;
+             var queryPath = $scope.removeFirstSlash($scope.data.queryPath || "");
+             var searchString = $scope.data.searchString || "";
+             var queryLimit = $scope.data.queryLimit || "";
+             var body = JSON.parse($scope.data.queryBody || "{}");
+             if (verb == "POST" && $scope.validateJson(true)) {
+                 ug.runDataPOSTQuery(queryPath, body);
+             } else if (verb == "PUT" && $scope.validateJson(true)) {
+                 ug.runDataPutQuery(queryPath, searchString, queryLimit, body);
+             } else if (verb == "DELETE") {
+                 ug.runDataDeleteQuery(queryPath, searchString, queryLimit);
+             } else {
+                 ug.runDataQuery(queryPath, searchString, queryLimit);
+             }
+         };
+         $scope.$on("top-collections-received", function(event, collectionList) {
+             $scope.loading = false;
+             var ignoredCollections = [ "events" ];
+             ignoredCollections.forEach(function(ignoredCollection) {
+                 collectionList.hasOwnProperty(ignoredCollection) && delete collectionList[ignoredCollection];
+             });
+             $scope.collectionList = collectionList;
+             $scope.queryBoxesSelected = false;
+             if (!$scope.queryPath) {
+                 $scope.loadCollection("/" + collectionList[Object.keys(collectionList).sort()[0]].name);
+             }
+             $scope.applyScope();
+         });
+         $scope.$on("error-running-query", function(event) {
+             $scope.loading = false;
+             runQuery("GET");
+             $scope.applyScope();
+         });
+         $scope.$on("entity-deleted", function(event) {
+             $scope.deleteLoading = false;
+             $rootScope.$broadcast("alert", "success", "Entities deleted sucessfully");
+             $scope.queryBoxesSelected = false;
+             $scope.checkNextPrev();
+             $scope.applyScope();
+         });
+         $scope.$on("entity-deleted-error", function(event) {
+             $scope.deleteLoading = false;
+             runQuery("GET");
+             $scope.applyScope();
+         });
+         $scope.$on("collection-created", function() {
+             $scope.newCollection.name = "";
+         });
+         $scope.$on("query-received", function(event, collection) {
+             $scope.loading = false;
+             $rootScope.queryCollection = collection;
+             ug.getIndexes($scope.data.queryPath);
+             $scope.setDisplayType();
+             $scope.checkNextPrev();
+             $scope.applyScope();
+             $scope.queryBoxesSelected = false;
+         });
+         $scope.$on("indexes-received", function(event, indexes) {
+             var fred = indexes;
+         });
+         $scope.$on("app-changed", function() {
+             init();
+         });
+         $scope.setDisplayType = function() {
+             $scope.display = "generic";
+         };
+         $scope.deleteEntitiesDialog = function(modalId) {
+             $scope.deleteLoading = false;
+             $scope.deleteEntities($rootScope.queryCollection, "entity-deleted", "error deleting entity");
+             $scope.hideModal(modalId);
+         };
+         $scope.newCollectionDialog = function(modalId) {
+             if ($scope.newCollection.name) {
+                 ug.createCollection($scope.newCollection.name);
+                 ug.getTopCollections();
+                 $rootScope.$broadcast("alert", "success", "Collection created successfully.");
+                 $scope.hideModal(modalId);
+             } else {
+                 $rootScope.$broadcast("alert", "error", "You must specify a collection name.");
+             }
+         };
+         $scope.addToPath = function(uuid) {
+             $scope.data.queryPath = "/" + $rootScope.queryCollection._type + "/" + uuid;
+         };
+         $scope.isDeep = function(item) {
+             return Object.prototype.toString.call(item) === "[object Object]";
+         };
+         $scope.loadCollection = function(type) {
+             $scope.data.queryPath = "/" + type.substring(1, type.length);
+             $scope.data.searchString = "";
+             $scope.data.queryLimit = "";
+             $scope.data.body = '{ "name":"value" }';
+             $scope.selectGET();
+             $scope.applyScope();
+             $scope.run();
+         };
+         $scope.selectGET = function() {
+             $scope.queryBodyDisplay = "none";
+             $scope.queryLimitDisplay = "block";
+             $scope.queryStringDisplay = "block";
+             $scope.verb = "GET";
+         };
+         $scope.selectPOST = function() {
+             $scope.queryBodyDisplay = "block";
+             $scope.queryLimitDisplay = "none";
+             $scope.queryStringDisplay = "none";
+             $scope.verb = "POST";
+         };
+         $scope.selectPUT = function() {
+             $scope.queryBodyDisplay = "block";
+             $scope.queryLimitDisplay = "block";
+             $scope.queryStringDisplay = "block";
+             $scope.verb = "PUT";
+         };
+         $scope.selectDELETE = function() {
+             $scope.queryBodyDisplay = "none";
+             $scope.queryLimitDisplay = "block";
+             $scope.queryStringDisplay = "block";
+             $scope.verb = "DELETE";
+         };
+         $scope.validateJson = function(skipMessage) {
+             var queryBody = $scope.data.queryBody;
+             try {
+                 queryBody = JSON.parse(queryBody);
+             } catch (e) {
+                 $rootScope.$broadcast("alert", "error", "JSON is not valid");
+                 return false;
+             }
+             queryBody = JSON.stringify(queryBody, null, 2);
+             !skipMessage && $rootScope.$broadcast("alert", "success", "JSON is valid");
+             $scope.data.queryBody = queryBody;
+             return true;
+         };
+         $scope.saveEntity = function(entity) {
+             if (!$scope.validateJson()) {
+                 return false;
+             }
+             var queryBody = entity._json;
+             queryBody = JSON.parse(queryBody);
+             $rootScope.selectedEntity.set();
+             $rootScope.selectedEntity.set(queryBody);
+             $rootScope.selectedEntity.set("type", entity._data.type);
+             $rootScope.selectedEntity.set("uuid", entity._data.uuid);
+             $rootScope.selectedEntity.save(function(err, data) {
+                 if (err) {
+                     $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
+                 } else {
+                     $rootScope.$broadcast("alert", "success", "entity saved");
+                 }
+             });
+         };
+         $scope.run = function() {
+             $rootScope.queryCollection = "";
+             var verb = $scope.verb;
+             runQuery(verb);
+         };
+         $scope.hasProperty = function(prop) {
+             var retval = false;
+             if (typeof $rootScope.queryCollection._list !== "undefined") {
+                 angular.forEach($rootScope.queryCollection._list, function(value, key) {
+                     if (!retval) {
+                         if (value._data[prop]) {
+                             retval = true;
+                         }
+                     }
+                 });
+             }
+             return retval;
+         };
+         $scope.resetNextPrev = function() {
+             $scope.previous_display = "none";
+             $scope.next_display = "none";
+         };
+         $scope.checkNextPrev = function() {
+             $scope.resetNextPrev();
+             if ($rootScope.queryCollection.hasPreviousPage()) {
+                 $scope.previous_display = "default";
+             }
+             if ($rootScope.queryCollection.hasNextPage()) {
+                 $scope.next_display = "default";
+             }
+         };
+         $scope.selectEntity = function(uuid) {
+             $rootScope.selectedEntity = $rootScope.queryCollection.getEntityByUUID(uuid);
+             $scope.addToPath(uuid);
+         };
+         $scope.getJSONView = function(entity) {
+             var tempjson = entity.get();
+             var queryBody = JSON.stringify(tempjson, null, 2);
+             queryBody = JSON.parse(queryBody);
+             delete queryBody.metadata;
+             delete queryBody.uuid;
+             delete queryBody.created;
+             delete queryBody.modified;
+             delete queryBody.type;
+             $scope.queryBody = JSON.stringify(queryBody, null, 2);
+         };
+         $scope.getPrevious = function() {
+             $rootScope.queryCollection.getPreviousPage(function(err) {
+                 if (err) {
+                     $rootScope.$broadcast("alert", "error", "error getting previous page of data");
+                 }
+                 $scope.checkNextPrev();
+                 $scope.applyScope();
+             });
+         };
+         $scope.getNext = function() {
+             $rootScope.queryCollection.getNextPage(function(err) {
+                 if (err) {
+                     $rootScope.$broadcast("alert", "error", "error getting next page of data");
+                 }
+                 $scope.checkNextPrev();
+                 $scope.applyScope();
+             });
+         };
+         init();
+         $rootScope.queryCollection = $rootScope.queryCollection || {};
+         $rootScope.selectedEntity = {};
+         if ($rootScope.queryCollection && $rootScope.queryCollection._type) {
+             $scope.loadCollection($rootScope.queryCollection._type);
+             $scope.setDisplayType();
+         }
+         ug.getTopCollections();
+         $scope.resetNextPrev();
+     } ]);
+     "use strict";
+     AppServices.Controllers.controller("EntityCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
+         if (!$rootScope.selectedEntity) {
+             $location.path("/data");
+             return;
+         }
+         $scope.entityUUID = $rootScope.selectedEntity.get("uuid");
+         $scope.entityType = $rootScope.selectedEntity.get("type");
+         var tempjson = $rootScope.selectedEntity.get();
+         var queryBody = JSON.stringify(tempjson, null, 2);
+         queryBody = JSON.parse(queryBody);
+         delete queryBody.metadata;
+         delete queryBody.uuid;
+         delete queryBody.created;
+         delete queryBody.modified;
+         delete queryBody.type;
+         $scope.queryBody = JSON.stringify(queryBody, null, 2);
+         $scope.validateJson = function() {
+             var queryBody = $scope.queryBody;
+             try {
+                 queryBody = JSON.parse(queryBody);
+             } catch (e) {
+                 $rootScope.$broadcast("alert", "error", "JSON is not valid");
+                 return false;
+             }
+             queryBody = JSON.stringify(queryBody, null, 2);
+             $rootScope.$broadcast("alert", "success", "JSON is valid");
+             $scope.queryBody = queryBody;
+             return true;
+         };
+         $scope.saveEntity = function() {
+             if (!$scope.validateJson()) {
+                 return false;
+             }
+             var queryBody = $scope.queryBody;
+             queryBody = JSON.parse(queryBody);
+             $rootScope.selectedEntity.set();
+             $rootScope.selectedEntity.set(queryBody);
+             $rootScope.selectedEntity.set("type", $scope.entityType);
+             $rootScope.selectedEntity.set("uuid", $scope.entityUUID);
+             $rootScope.selectedEntity.save(function(err, data) {
+                 if (err) {
+                     $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
+                 } else {
+                     $rootScope.$broadcast("alert", "success", "entity saved");
+                 }
+             });
+         };
+     } ]);
+     "use strict";
+     AppServices.Directives.directive("balloon", [ "$window", "$timeout", function($window, $timeout) {
+         return {
+             restrict: "ECA",
+             scope: "=",
+             template: "" + '<div class="baloon {{direction}}" ng-transclude>' + "</div>",
+             replace: true,
+             transclude: true,
+             link: function linkFn(scope, lElement, attrs) {
+                 scope.direction = attrs.direction;
+                 var runScroll = true;
+                 var windowEl = angular.element($window);
+                 windowEl.on("scroll", function() {
+                     if (runScroll) {
+                         lElement.addClass("fade-out");
+                         $timeout(function() {
+                             lElement.addClass("hide");
+                         }, 1e3);
+                         runScroll = false;
+                     }
+                 });
+             }
+         };
+     } ]);
+     "use strict";
+     AppServices.Directives.directive("bsmodal", [ "$rootScope", function($rootScope) {
+         return {
+             restrict: "ECA",
+             scope: {
+                 title: "@title",
+                 buttonid: "=buttonid",
+                 footertext: "=footertext",
+                 closelabel: "=closelabel"
+             },
+             transclude: true,
+             templateUrl: "dialogs/modal.html",
+             replace: true,
+             link: function linkFn(scope, lElement, attrs, parentCtrl) {
+                 scope.title = attrs.title;
+                 scope.footertext = attrs.footertext;
+                 scope.closelabel = attrs.closelabel;
+                 scope.close = attrs.close;
+                 scope.extrabutton = attrs.extrabutton;
+                 scope.extrabuttonlabel = attrs.extrabuttonlabel;
+                 scope.buttonId = attrs.buttonid;
+                 scope.closeDelegate = function(attr) {
+                     scope.$parent[attr](attrs.id, scope);
+                 };
+                 scope.extraDelegate = function(attr) {
+                     if (scope.dialogForm.$valid) {
+                         console.log(parentCtrl);
+                         scope.$parent[attr](attrs.id);
+                     } else {
+                         $rootScope.$broadcast("alert", "error", "Please check your form input and resubmit.");
+                     }
+                 };
+             }
+         };
+     } ]);
+     "use strict";
+     AppServices.Controllers.controller("AlertCtrl", [ "$scope", "$rootScope", "$timeout", function($scope, $rootScope, $timeout) {
+         $scope.alertDisplay = "none";
+         $scope.alerts = [];
+         $scope.$on("alert", function(event, type, message, permanent) {
+             $scope.addAlert(type, message, permanent);
+         });
+         $scope.$on("clear-alerts", function(event, message) {
+             $scope.alerts = [];
+         });
+         $scope.addAlert = function(type, message, permanent) {
+             $scope.alertDisplay = "block";
+             $scope.alerts.push({
+                 type: type,
+                 msg: message
+             });
+             $scope.applyScope();
+             if (!permanent) {
+                 $timeout(function() {
+                     $scope.alerts.shift();
+                 }, 5e3);
+             }
+         };
+         $scope.closeAlert = function(index) {
+             $scope.alerts.splice(index, 1);
+         };
+     } ]);
+     "use strict";
+     AppServices.Directives.directive("alerti", [ "$rootScope", "$timeout", function($rootScope, $timeout) {
+         return {
+             restrict: "ECA",
+             scope: {
+                 type: "=type",
+                 closeable: "@closeable",
+                 index: "&index"
+             },
+             template: '<div class="alert" ng-class="type && \'alert-\' + type">' + '    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>' + '    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>' + '    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>' + '    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>' + '    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i>' + "<div ng-transclude></div>" + "</div>",
+             replace: true,
+             transclude: true,
+             link: function linkFn(scope, lElement, attrs) {
+                 $timeout(function() {
+                     lElement.addClass("fade-out");
+                 }, 4e3);
+                 lElement.click(function() {
+                     if (attrs.index) {
+                         scope.$parent.closeAlert(attrs.index);
+                     }
+                 });
+                 setTimeout(function() {
+                     lElement.addClass("alert-animate");
+                 }, 10);
+             }
+         };
+     } ]);
+     "use strict";
+     AppServices.Directives.directive("appswitcher", [ "$rootScope", function($rootScope) {
+         return {
+             restrict: "ECA",
+             scope: "=",
+             templateUrl: "global/appswitcher-template.html",
+             replace: true,
+             transclude: true,
+             link: function linkFn(scope, lElement, attrs) {
+                 var classNameOpen = "open";
+                 $("ul.nav li.dropdownContainingSubmenu").hover(function() {
+                     $(this).addClass(classNameOpen);
+                 }, function() {
+                     $(this).removeClass(classNameOpen);
+                 });
+                 $("#globalNav > a").mouseover(globalNavDetail);
+                 $("#globalNavDetail").mouseover(globalNavDetail);
+                 $("#globalNavSubmenuContainer ul li").mouseover(function() {
+                     $("#globalNavDetail > div").removeClass(classNameOpen);
+                     $("#" + this.getAttribute("data-globalNavDetail")).addClass(classNameOpen);
+                 });
+                 function globalNavDetail() {
+                     $("#globalNavDetail > div").removeClass(classNameOpen);
+                     $("#globalNavDetailApiPlatform").addClass(classNameOpen);
+                 }
+             }
+         };
+     } ]);
+     "use strict";
+     AppServices.Services.factory("help", function($rootScope, $http, $analytics) {
+         $rootScope.help = {};
+         $rootScope.help.helpButtonStatus = "Enable Help";
+         $rootScope.help.helpTooltipsEnabled = false;
+         $rootScope.help.clicked = false;
+         $rootScope.help.showHelpButtons = false;
+         var tooltipStartTime;
+         var helpStartTime;
+         var introjs_step;
+         $rootScope.help.sendTooltipGA = function(tooltipName) {
+             $analytics.eventTrack("tooltip - " + $rootScope.currentPath, {
+                 category: "App Services",
+                 label: tooltipName
+             });
+         };
+         $rootScope.help.toggleTooltips = function() {
+             if ($rootScope.help.helpTooltipsEnabled == false) {
+                 $rootScope.help.helpButtonStatus = "Disable Help";
+                 $rootScope.help.helpTooltipsEnabled = true;
+                 showHelpModal("tooltips");
+             } else {
+                 $rootScope.help.helpButtonStatus = "Enable Help";
+                 $rootScope.help.helpTooltipsEnabled = false;
+             }
+         };
+         $rootScope.help.IntroOptions = {
+             steps: [],
+             showStepNumbers: false,
+             exitOnOverlayClick: true,
+             exitOnEsc: true,
+             nextLabel: "Next",
+             prevLabel: "Back",
+             skipLabel: "Exit",
+             doneLabel: "Done"
+         };
+         $rootScope.$on("$routeChangeSuccess", function(event, current) {
+             var path = current.$$route ? current.$$route.originalPath : null;
+             if (path == "/org-overview") {
+                 $rootScope.help.showHelpButtons = true;
+                 getHelpJson(path).success(function(json) {
+                     var helpJson = json;
+                     setHelpStrings(helpJson);
+                     showHelpModal("tour");
+                 });
+             } else {
+                 $rootScope.help.showHelpButtons = false;
+             }
+         });
+         var showHelpModal = function(helpType) {
+             var shouldHelp = location.search.indexOf("noHelp") <= 0;
+             if (helpType == "tour" && !getHelpStatus(helpType)) {
+                 shouldHelp && $rootScope.showModal("introjs");
+             } else if (helpType == "tooltips" && !getHelpStatus(helpType)) {
+                 shouldHelp && $rootScope.showModal("tooltips");
+             }
+         };
+         var setHelpStrings = function(helpJson) {
+             $rootScope.help.IntroOptions.steps = helpJson.introjs;
+             angular.forEach(helpJson.tooltip, function(value, binding) {
+                 $rootScope[binding] = value;
+             });
+         };
+         $rootScope.help.introjs_StartEvent = function() {
+             helpStartTime = Date.now();
+             introjs_step = 1;
+         };
+         $rootScope.help.introjs_ExitEvent = function() {
+             var introjs_time = Math.round((Date.now() - helpStartTime) / 1e3);
+             $analytics.eventTrack("introjs timing - " + $rootScope.currentPath, {
+                 category: "App Services",
+                 label: introjs_time + "s"
+             });
+             $analytics.eventTrack("introjs exit - " + $rootScope.currentPath, {
+                 category: "App Services",
+                 label: "step" + introjs_step
+             });
+         };
+         $rootScope.help.introjs_ChangeEvent = function() {
+             introjs_step++;
+         };
+         var getHelpJson = function(path) {
 -            return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
++            return $http.jsonp("https://s3.amazonaws.com/sdk.apigee.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
+         };
+         var getHelpStatus = function(helpType) {
+             var status;
+             if (helpType == "tour") {
+                 status = localStorage.getItem("ftu_tour");
+                 localStorage.setItem("ftu_tour", "false");
+             } else if (helpType == "tooltips") {
+                 status = localStorage.getItem("ftu_tooltips");
+                 localStorage.setItem("ftu_tooltips", "false");
+             }
+             return status;
+         };
+     });
+     AppServices.Directives.directive("insecureBanner", [ "$rootScope", "ug", function($rootScope, ug) {
+         return {
+             restrict: "E",
+             transclude: true,
+             templateUrl: "global/insecure-banner.html",
+             link: function linkFn(scope, lElement, attrs) {
+                 scope.securityWarning = false;
+                 scope.$on("roles-received", function(evt, roles) {
+                     scope.securityWarning = false;
+                     if (!roles || !roles._list) return;
+                     roles._list.forEach(function(roleHolder) {
+                         var role = roleHolder._data;
+                         if (role.name.toUpperCase() === "GUEST") {
+                             roleHolder.getPermissions(function(err, data) {
+                                 if (!err) {
+                                     if (roleHolder.permissions) {
+                                         roleHolder.permissions.forEach(function(permission) {
+                                             if (permission.path.indexOf("/**") >= 0) {
+                                                 scope.securityWarning = true;
+                                                 scope.applyScope();
+                                             }
+                                         });
+                                     }
+                                 }
+                             });
+                         }
+                     });
+                 });
+                 var initialized = false;
+                 scope.$on("app-initialized", function() {
+                     !initialized && ug.getRoles();
+                     initialized = true;
+                 });
+                 scope.$on("app-changed", function() {
+                     scope.securityWarning = false;
+                     ug.getRoles();
+                 });
+             }
+         };
+     } ]);
+     "use strict";
+     AppServices.Constants.constant("configuration", {
+         ITEMS_URL: "global/temp.json"
+     });
+     "use strict";
+     AppServices.Controllers.controller("PageCtrl", [ "ug", "help", "utility", "$scope", "$rootScope", "$location", "$routeParams", "$q", "$route", "$log", "$analytics", function(ug, help, utility, $scope, $rootScope, $location, $routeParams, $q, $route, $log, $analytics) {
+         var initScopeVariables = function() {
+             $scope.loadingText = "Loading...";
+             $scope.use_sso = false;
+             $scope.newApp = {
+                 name: ""
+             };
+             $scope.getPerm = "";
+             $scope.postPerm = "";
+             $scope.putPerm = "";
+             $scope.deletePerm = "";
+             $scope.usersTypeaheadValues = [];
+             $scope.groupsTypeaheadValues = [];
+             $scope.rolesTypeaheadValues = [];
+             $rootScope.sdkActive = false;
+             $rootScope.demoData = false;
+             $scope.queryStringApplied = false;
+             $rootScope.autoUpdateTimer = Usergrid.config ? Usergrid.config.autoUpdateTimer : 61;
+             $rootScope.requiresDeveloperKey = Usergrid.config ? Usergrid.config.client.requiresDeveloperKey : false;
+             $rootScope.loaded = $rootScope.activeUI = false;
+             for (var key in Usergrid.regex) {
+                 $scope[key] = Usergrid.regex[key];
+             }
+             $scope.options = Usergrid.options;
+             var getQuery = function() {
+                 var result = {}, queryString = location.search.slice(1), re = /([^&=]+)=([^&]*)/g, m;
+                 while (m = re.exec(queryString)) {
+                     result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
+                 }
+                 return result;
+             };
+             $scope.queryString = getQuery();
+         };
+         initScopeVariables();
+         $rootScope.urls = function() {
+             var urls = ug.getUrls($scope.queryString);
+             $scope.apiUrl = urls.apiUrl;
+             $scope.use_sso = urls.use_sso;
+             return urls;
+         };
+         $rootScope.gotoPage = function(path) {
+             $location.path(path);
+         };
+         var notRegistration = function() {
+             return "/forgot-password" !== $location.path() && "/register" !== $location.path();
+         };
+         var verifyUser = function() {
+             if ($location.path().slice(0, "/login".length) !== "/login") {
+                 $rootScope.currentPath = $location.path();
+             }
+             if ($routeParams.access_token && $routeParams.admin_email && $routeParams.uuid) {
+                 ug.set("token", $routeParams.access_token);
+                 ug.set("email", $routeParams.admin_email);
+                 ug.set("uuid", $routeParams.uuid);
+                 $location.search("access_token", null);
+                 $location.search("admin_email", null);
+                 $location.search("uuid", null);
+             }
+             ug.checkAuthentication(true);
+         };
+         $scope.profile = function() {
+             if ($scope.use_sso) {
+                 window.location = $rootScope.urls().PROFILE_URL + "?callback=" + encodeURIComponent($location.absUrl());
+             } else {
+                 $location.path("/profile");
+             }
+         };
+         $rootScope.showModal = function(id) {
+             $("#" + id).modal("show");
+         };
+         $rootScope.hideModal = function(id) {
+             $("#" + id).modal("hide");
+         };
+         $scope.deleteEntities = function(collection, successBroadcast, errorMessage) {
+             collection.resetEntityPointer();
+             var entitiesToDelete = [];
+             while (collection.hasNextEntity()) {
+                 var entity = collection.getNextEntity();
+                 var checked = entity.checked;
+                 if (checked) {
+                     entitiesToDelete.push(entity);
+                 }
+             }
+             var count = 0, success = false;
+             for (var i = 0; i < entitiesToDelete.length; i++) {
+                 var entity = entitiesToDelete[i];
+                 collection.destroyEntity(entity, function(err) {
+                     count++;
+                     if (err) {
+                         $rootScope.$broadcast("alert", "error", errorMessage);
+                         $rootScope.$broadcast(successBroadcast + "-error", err);
+                     } else {
+                         success = true;
+                     }
+                     if (count === entitiesToDelete.length) {
+                         success && $rootScope.$broadcast(successBroadcast);
+                         $scope.applyScope();
+                     }
+                 });
+             }
+         };
+         $scope.selectAllEntities = function(list, that, varName, setValue) {
+             varName = varName || "master";
+             var val = that[varName];
+             if (setValue == undefined) {
+                 setValue = true;
+             }
+             if (setValue) {
+                 that[varName] = val = !val;
+             }
+             list.forEach(function(entitiy) {
+                 entitiy.checked = val;
+             });
+         };
+         $scope.createPermission = function(type, entity, path, permissions) {
+             if (path.charAt(0) != "/") {
+                 path = "/" + path;
+             }
+             var ops = "";
+             var s = "";
+             if (permissions.getPerm) {
+                 ops = "get";
+                 s = ",";
+             }
+             if (permissions.postPerm) {
+                 ops = ops + s + "post";
+                 s = ",";
+             }
+             if (permissions.putPerm) {
+                 ops = ops + s + "put";
+                 s = ",";
+             }
+             if (permissions.deletePerm) {
+                 ops = ops + s + "delete";
+                 s = ",";
+             }
+             var permission = ops + ":" + path;
+             return permission;
+         };
+         $scope.formatDate = function(date) {
+             return new Date(date).toUTCString();
+         };
+         $scope.clearCheckbox = function(id) {
+             if ($("#" + id).attr("checked")) {
+                 $("#" + id).click();
+             }
+         };
+         $scope.removeFirstSlash = function(path) {
+             return path.indexOf("/") === 0 ? path.substring(1, path.length) : path;
+         };
+         $scope.applyScope = function(cb) {
+             cb = typeof cb === "function" ? cb : function() {};
+             if (!this.$$phase) {
+                 return this.$apply(cb);
+             } else {
+                 cb();
+             }
+         };
+         $scope.valueSelected = function(list) {
+             return list && list.some(function(item) {
+                 return item.checked;
+             });
+         };
+         $scope.sendHelp = function(modalId) {
+             ug.jsonpRaw("apigeeuihelpemail", "", {
+                 useremail: $rootScope.userEmail
+             }).then(function() {
+                 $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
+             }, function() {
+                 $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
+             });
+             $scope.hideModal(modalId);
+         };
+         $scope.$on("users-typeahead-received", function(event, users) {
+             $scope.usersTypeaheadValues = users;
+             if (!$scope.$$phase) {
+                 $scope.$apply();
+             }
+         });
+         $scope.$on("groups-typeahead-received", function(event, groups) {
+             $scope.groupsTypeaheadValues = groups;
+             if (!$scope.$$phase) {
+                 $scope.$apply();
+             }
+         });
+         $scope.$on("roles-typeahead-received", function(event, roles) {
+             $scope.rolesTypeaheadValues = roles;
+             if (!$scope.$$phase) {
+                 $scope.$apply();
+             }
+         });
+         $scope.$on("checkAuthentication-success", function() {
+             sessionStorage.setItem("authenticateAttempts", 0);
+             $scope.loaded = true;
+             $rootScope.activeUI = true;
+             $scope.applyScope();
+             if (!$scope.queryStringApplied) {
+                 $scope.queryStringApplied = true;
+                 setTimeout(function() {
+                     if ($scope.queryString.org) {
+                         $rootScope.$broadcast("change-org", $scope.queryString.org);
+                     }
+                 }, 1e3);
+             }
+             $rootScope.$broadcast("app-initialized");
+         });
+         $scope.$on("checkAuthentication-error", function(args, err, missingData, email) {
+             $scope.loaded = true;
+             if (err && !$scope.use_sso && notRegistration()) {
+                 ug.logout();
+                 $location.path("/login");
+                 $scope.applyScope();
+             } else {
+                 if (missingData && notRegistration()) {
+                     if (!email && $scope.use_sso) {
+                         window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
+                         return;
+                     }
+                     ug.reAuthenticate(email);
+                 }
+             }
+         });
+         $scope.$on("reAuthenticate-success", function(args, err, data, user, organizations, applications) {
+             sessionStorage.setItem("authenticateAttempts", 0);
+             $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
+             $rootScope.$emit("loginSuccesful", user, organizations, applications);
+             $rootScope.$broadcast("checkAuthentication-success");
+             $scope.applyScope(function() {
+                 $scope.deferredLogin.resolve();
+                 $location.path("/org-overview");
+             });
+         });
+         var authenticateAttempts = parseInt(sessionStorage.getItem("authenticateAttempts") || 0);
+         $scope.$on("reAuthenticate-error", function() {
+             if ($scope.use_sso) {
+                 if (authenticateAttempts++ > 5) {
+                     $rootScope.$broadcast("alert", "error", "There is an issue with authentication. Please contact support.");
+                     return;
+                 }
+                 console.error("Failed to login via sso " + authenticateAttempts);
+                 sessionStorage.setItem("authenticateAttempts", authenticateAttempts);
+                 window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
+             } else {
+                 if (notRegistration()) {
+                     ug.logout();
+                     $location.path("/login");
+                     $scope.applyScope();
+                 }
+             }
+         });
+         $scope.$on("loginSuccessful", function() {
+             $rootScope.activeUI = true;
+         });
+         $scope.$on("app-changed", function(args, oldVal, newVal, preventReload) {
+             if (newVal !== oldVal && !preventReload) {
+                 $route.reload();
+             }
+         });
+         $scope.$on("org-changed", function(args, oldOrg, newOrg) {
+             ug.getApplications();
+             $route.reload();
+         });
+         $scope.$on("app-settings-received", function(evt, data) {});
+         $scope.$on("request-times-slow", function(evt, averageRequestTimes) {
+             $rootScope.$broadcast("alert", "info", "We are experiencing performance issues on our server.  Please click Get Help for support if this continues.");
+         });
+         var lastPage = "";
+         $scope.$on("$routeChangeSuccess", function() {
+             verifyUser();
+             $scope.showDemoBar = $location.path().slice(0, "/performance".length) === "/performance";
+             if (!$scope.showDemoBar) {
+                 $rootScope.demoData = false;
+             }
+             setTimeout(function() {
+                 lastPage = "";
+             }, 50);
+             var path = window.location.pathname.replace("index-debug.html", "");
+             lastPage === "" && $analytics.pageTrack((path + $location.path()).replace("//", "/"));
+             lastPage = $location.path();
+         });
+         $scope.$on("applications-received", function(event, applications) {
+             $scope.applications = applications;
+             $scope.hasApplications = Object.keys(applications).length > 0;
+         });
+         ug.getAppSettings();
+         $rootScope.startFirstTimeUser = function() {
+             $rootScope.hideModal("introjs");
+             $rootScope.help.introjs_StartEvent();
+             $scope.startHelp();
+         };
+     } ]);
+     "use strict";
+     AppServices.Directives.directive("pageTitle", [ "$rootScope", "ug", function($rootScope, ug) {
+         return {
+             restrict: "E",
+             transclude: true,
+             templateUrl: "global/page-title.html",
+             link: function linkFn(scope, lElement, attrs) {
+                 scope.title = attrs.title;
+                 scope.icon = attrs.icon;
+                 scope.showHelp = function() {
+                     $("#need-help").modal("show");
+                 };
+                 scope.sendHelp = function() {
+                     data.jsonp_raw("apigeeuihelpemail", "", {
+                         useremail: $rootScope.userEmail
+                     }).then(function() {
+                         $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
+                     }, function() {
+                         $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
+                     });
+                     $("#need-help").modal("hide");
+                 };
+             }
+         };
+     } ]);
+     "use strict";
+     AppServices.Services.factory("ug", function(configuration, $rootScope, utility, $q, $http, $resource, $log, $analytics, $location) {
+         var requestTimes = [], running = false, currentRequests = {};
+         function reportError(data, config) {
+             try {
+                 $analytics.eventTrack("error", {
+                     category: "App Services",
+                     label: data + ":" + config.url + ":" + (sessionStorage["apigee_uuid"] || "na")
+                 });
+             } catch (e) {
+                 console.log(e);
+             }
+         }
+         var getAccessToken = function() {
+             return sessionStorage.getItem("accessToken");
+         };
+         return {
+             get: function(prop, isObject) {
+                 return isObject ? this.client().getObject(prop) : this.client().get(prop);
+             },
+             set: function(prop, value) {
+                 this.client().set(prop, value);
+             },
+             getUrls: function(qs) {
+                 var host = $location.host();
+                 var BASE_URL = "";
+                 var DATA_URL = "";
+                 var use_sso = false;
+                 switch (true) {
+                   case host === "appservices.apigee.com" && location.pathname.indexOf("/dit") >= 0:
+                     BASE_URL = "https://accounts.jupiter.apigee.net";
+                     DATA_URL = "http://apigee-internal-prod.jupiter.apigee.net";
+                     use_sso = true;
+                     break;
+ 
+                   case host === "appservices.apigee.com" && location.pathname.indexOf("/mars") >= 0:
+                     BASE_URL = "https://accounts.mars.apigee.net";
+                     DATA_URL = "http://apigee-internal-prod.mars.apigee.net";
+                     use_sso = true;
+                     break;
+ 
+                   case host === "appservices.apigee.com":
+                     DATA_URL = Usergrid.overrideUrl;
+                     break;
+ 
+                   case host === "apigee.com":
+                     BASE_URL = "https://accounts.apigee.com";
+                     DATA_URL = "https://api.usergrid.com";
+                     use_sso = true;
+                     break;
+ 
+                   case host === "usergrid.dev":
+                     DATA_URL = "https://api.usergrid.com";
+                     break;
+ 
+                   default:
+                     DATA_URL = Usergrid.overrideUrl;
+                     break;
+                 }
+                 DATA_URL = qs.api_url || DATA_URL;
+                 DATA_URL = DATA_URL.lastIndexOf("/") === DATA_URL.length - 1 ? DATA_URL.substring(0, DATA_URL.length - 1) : DATA_URL;
+                 return {
+                     DATA_URL: DATA_URL,
+                     LOGIN_URL: BASE_URL + "/accounts/sign_in",
+                     PROFILE_URL: BASE_URL + "/accounts/my_account",
+                     LOGOUT_URL: BASE_URL + "/accounts/sign_out",
+                     apiUrl: DATA_URL,
+                     use_sso: use_sso
+                 };
+             },
+             orgLogin: function(username, password) {
+                 var self = this;
+                 this.client().set("email", username);
+                 this.client().set("token", null);
+                 this.client().orgLogin(username, password, function(err, data, user, organizations, applications) {
+                     if (err) {
+                         $rootScope.$broadcast("loginFailed", err, data);
+                     } else {
+                         self.initializeCurrentUser(function() {
+                             $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
+                         });
+                     }
+                 });
+             },
+             checkAuthentication: function(force) {
+                 var ug = this;
+                 var client = ug.client();
+                 var initialize = function() {
+                     ug.initializeCurrentUser(function() {
+                         $rootScope.userEmail = client.get("email");
+                         $rootScope.organizations = client.getObject("organizations");
+                         $rootScope.applications = client.getObject("applications");
+                         $rootScope.currentOrg = client.get("orgName");
+                         $rootScope.currentApp = client.get("appName");
+                         var size = 0, key;
+                         for (key in $rootScope.applications) {
+                             if ($rootScope.applications.hasOwnProperty(key)) size++;
+                         }
+                         $rootScope.$broadcast("checkAuthentication-success", client.getObject("organizations"), client.getObject("applications"), client.get("orgName"), client.get("appName"), client.get("email"));
+                     });
+                 }, isAuthenticated = function() {
+                     var authenticated = client.get("token") !== null && client.get("organizations") !== null;
+                     if (authenticated) {
+                         initialize();
+                     }
+                     return authenticated;
+                 };
+                 if (!isAuthenticated() || force) {
+                     if (!client.get("token")) {
+                         return $rootScope.$broadcast("checkAuthentication-error", "no token", {}, client.get("email"));
+                     }
+                     this.client().reAuthenticateLite(function(err) {
+                         var missingData = err || (!client.get("orgName") || !client.get("appName") || !client.getObject("organizations") || !client.getObject("applications"));
+                         var email = client.get("email");
+                         if (err || missingData) {
+                             $rootScope.$broadcast("checkAuthentication-error", err, missingData, email);
+                         } else {
+                             initialize();
+                         }
+                     });
+                 }
+             },
+             reAuthenticate: function(email, eventOveride) {
+                 var ug = this;
+                 this.client().reAuthenticate(email, function(err, data, user, organizations, applications) {
+                     if (!err) {
+                         $rootScope.currentUser = user;
+                     }
+                     if (!err) {
+                         $rootScope.userEmail = user.get("email");
+                         $rootScope.organizations = organizations;
+                         $rootScope.applications = applications;
+                         $rootScope.currentOrg = ug.get("orgName");
+                         $rootScope.currentApp = ug.get("appName");
+                         $rootScope.currentUser = user._data;
+                         $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
+                     }
+                     $rootScope.$broadcast((eventOveride || "reAuthenticate") + "-" + (err ? "error" : "success"), err, data, user, organizations, applications);
+                 });
+             },
+             logoutCallback: function() {
+                 $rootScope.$broadcast("userNotAuthenticated");
+             },
+             logout: function() {
+                 $rootScope.activeUI = false;
+                 $rootScope.userEmail = "user@apigee.com";
+                 $rootScope.organizations = {
+                     noOrg: {
+                         name: "No Orgs Found"
+                     }
+                 };
+                 $rootScope.applications = {
+                     noApp: {
+                         name: "No Apps Found"
+                     }
+                 };
+                 $rootScope.currentOrg = "No Org Found";
+                 $rootScope.currentApp = "No App Found";
+                 sessionStorage.setItem("accessToken", null);
+                 sessionStorage.setItem("userUUID", null);
+                 sessionStorage.setItem("userEmail", null);
+                 this.client().logout();
+                 this._client = null;
+             },
+             client: function() {
+                 var options = {
+                     buildCurl: true,
+                     logging: true
+                 };
+                 if (Usergrid.options && Usergrid.options.client) {
+                     options.keys = Usergrid.options.client;
+                 }
+                 this._client = this._client || new Usergrid.Client(options, $rootScope.urls().DATA_URL);
+                 return this._client;
+             },
+             setClientProperty: function(key, value) {
+                 this.client().set(key, value);
+             },
+             getTopCollections: function() {
+                 var options = {
+                     method: "GET",
+                     endpoint: ""
+                 };
+                 this.client().request(options, function(err, data) {
+                     if (err) {
+                         $rootScope.$broadcast("alert", "error", "error getting collections");
+                     } else {
+                         var collections = data.entities[0].metadata.collections;
+                         $rootScope.$broadcast("top-collections-received", collections);
+                     }
+                 });
+             },
+             createCollection: function(collectionName) {
+                 var collections = {};
+                 collections[collectionName] = {};
+                 var metadata = {
+                     metadata: {
+                         collections: collections
+                     }
+                 };
+                 var options = {
+                     method: "PUT",
+                     body: metadata,
+                     endpoint: ""
+                 };
+                 this.client().request(options, function(err, data) {
+                     if (err) {
+                         $rootScope.$broadcast("alert", "error", "error creating collection");
+                     } else {
+                         $rootScope.$broadcast("collection-created", collections);
+                     }
+                 });
+             },
+             getApplications: function() {
+                 this.client().getApplications(function(err, applications) {
+                     if (err) {
+                         applications && console.error(applications);
+                     } else {
+                         $rootScope.$broadcast("applications-received", applications);
+                     }
+                 });
+             },
+             getAdministrators: function() {
+                 this.client().getAdministrators(function(err, administrators) {
+                     if (err) {
+                         $rootScope.$broadcast("alert", "error", "error getting administrators");
+                     }
+                     $rootScope.$broadcast("administrators-received", administrators);
+                 });
+             },
+             createApplication: function(appName) {
+                 this.client().createApplication(appName, function(err, applications) {
+                     if (err) {
+                         $rootScope.$broadcast("alert", "error", "error creating application");
+                     } else {
+                         $rootScope.$broadcast("applications-created", applications, appName);
+                         $rootScope.$broadcast("applications-received", applications);
+                     }
+                 });
+             },
+             createAdministrator: function(adminName) {
+                 this.client().createAdministrator(adminName, function(err, administrators) {
+                     

<TRUNCATED>

[09/24] git commit: update readme

Posted by sn...@apache.org.
update readme


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/ded28e5b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/ded28e5b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/ded28e5b

Branch: refs/heads/master
Commit: ded28e5b0354bdd4a3aa657b34d605bf8b487010
Parents: cc610ce
Author: Shawn Feldman <sh...@gmail.com>
Authored: Wed Apr 2 08:56:43 2014 -0600
Committer: Shawn Feldman <sh...@gmail.com>
Committed: Wed Apr 2 08:56:43 2014 -0600

----------------------------------------------------------------------
 portal/README.md | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/ded28e5b/portal/README.md
----------------------------------------------------------------------
diff --git a/portal/README.md b/portal/README.md
index 809468e..2e264a2 100644
--- a/portal/README.md
+++ b/portal/README.md
@@ -19,17 +19,19 @@ Use the admin portal for administrative operations, including:
 
 ##Deploying or Developing
 
-If you are just deploying:
+If you are just running the portal:
 
 1. Install Node.js from http://nodejs.org/download/.
-2. From the root directory, run `./build.sh`.
-3. This will create a directory in the root called dist. In dist is a zip file called appsvc-ui.zip. Unzip and deploy to your favorite web server or if you run "./build.sh dev" you can then navigate to http://localhost:3000/ .
+2. From the root directory, run `./build.sh dev`.
+3. This will build and run a lightweight server. Naviate to http://localhost:3000
+4. If that doesn't work, in dist is a built copy and a file called rel-usergrid-portal.zip. Unzip and deploy to your favorite web server.
 
 If you are developing:
 
 1. From the root directory, run `./build.sh dev`.
 2. To debug in the browser go to http://localhost:3000/index-debug.html; http://localhost:3000/ will point to the compressed files.
-3. If the libraries get out of sync, run `./build.sh` again and this will run grunt build in the background.
+3. If the libraries get out of sync, run `./build.sh` again and this will run "grunt build" in the background.
+4. If you then want to update bower and create a distributable copy, run "grunt build-release", check in all the built files to distribute via bower
 
 If you want to run the e2e tests:
 


[08/24] git commit: merging upstream

Posted by sn...@apache.org.
merging upstream


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/0818271c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/0818271c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/0818271c

Branch: refs/pull/96/merge
Commit: 0818271cf1375cd8909bf1a7b182962587c21f87
Parents: fb0aab0
Author: amuramoto <am...@apigee.com>
Authored: Tue Apr 1 10:53:03 2014 -0700
Committer: amuramoto <am...@apigee.com>
Committed: Tue Apr 1 10:53:03 2014 -0700

----------------------------------------------------------------------
 portal/js/global/help-service.js                |    2 +-
 portal/js/libs/usergrid-libs.min.js             |    4 +-
 portal/js/usergrid-dev.min.js                   |    4 +-
 portal/js/usergrid-dev.min.js.orig              | 4939 ++++++++++++++++++
 portal/js/usergrid.min.js                       |    4 +-
 portal/js/usergrid.min.js.orig                  |    6 +
 .../instrument/js/usergrid-coverage.min.js      |    2 +-
 .../test/coverage/instrument/js/usergrid.min.js |    2 +-
 8 files changed, 4954 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/js/global/help-service.js
----------------------------------------------------------------------
diff --git a/portal/js/global/help-service.js b/portal/js/global/help-service.js
index de067df..6335e3c 100644
--- a/portal/js/global/help-service.js
+++ b/portal/js/global/help-service.js
@@ -122,7 +122,7 @@ AppServices.Services.factory('help', function($rootScope, $http, $analytics) {
 
 
   var getHelpJson = function(path) {
-    return $http.jsonp('http://sdk.apigee.com.s3.amazonaws.com/portal_help' + path + '/helpJson.json?callback=JSON_CALLBACK');
+    return $http.jsonp('https://sdk.apigee.com/portal_help' + path + '/helpJson.json?callback=JSON_CALLBACK');
   };
 
   var getHelpStatus = function(helpType) {


[16/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/9011d58a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.LOCAL.31213.js
----------------------------------------------------------------------
diff --git a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.LOCAL.31213.js b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.LOCAL.31213.js
new file mode 100644
index 0000000..b59eb7a
--- /dev/null
+++ b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.LOCAL.31213.js
@@ -0,0 +1,6 @@
+/*! usergrid@2.0.2 2014-04-01 */
+angular.module("appservices").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("activities/activities.html",'<section class="row-fluid">\n'+'  <div class="span12">\n'+'    <div class="page-filters">\n'+'      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</section>\n"+'<section class="row-fluid">\n'+'  <div class="span12 tab-content">\n'+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td></td>\n"+"        <td>User</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in activities">\n'+"        <td>{{formatDate(activity.created)}}</td>\n"+'        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n'+"        </td>\n"+"        <td>{{activity.actor.displayName}}</td>\n"+"  
       <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"+"  </div>\n"+"</section>");$templateCache.put("app-overview/app-overview.html",'<div class="app-overview-content" >\n'+'  <section class="row-fluid">\n'+"\n"+'      <page-title title=" Summary" icon="&#128241;"></page-title>\n'+'  <section class="row-fluid">\n'+'      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n'+"  </section>\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span6">\n'+'      <chart id="appOverview"\n'+'             chartdata="appOverview.chart"\n'+'             type="column"></chart>\n'+"    </div>\n"+"\n"+'    <div class="span6">\n'+'      <table class="table table-striped">\n'+'        <tr class="table-header">\n'+"          <td>Path</td>\n"+"          <td>Title</td>\n"+"        </tr>\n"+'        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n'+"          <td
 >{{v.title}}</td>\n"+"          <td>{{v.count}}</td>\n"+"        </tr>\n"+"      </table>\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");$templateCache.put("app-overview/doc-includes/android.html","<h2>1. Integrate the SDK into your project</h2>\n"+"<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n"+"\n"+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+"\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+'		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+"		<p>If you've already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n"+'		<div id="collapse">\n'+'			<a href="#jar_collapse" class="btn" d
 ata-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n'+"		</div>\n"+'		<div id="jar_collapse" class="collapse">\n'+"			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n"+"	\n"+"			<h3>Android 4.0 (or later) projects</h3>\n"+"			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n"+"			\n"+"			<h3>Android 3.0 (or earlier) projects</h3>\n"+"			<ol>\n"+"				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n"+"				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n"+"				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n"+"				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the t
 op of the class path:\n"+"					<ol>\n"+"						<li>In the Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n"+"						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n"+"						<li>\n"+"							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n"+"						</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+'			<div class="warning">\n'+"				<h3>Applications using Ant</h3>\n"+"				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n"+"			</div>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project">\n'+'		<a class="jumplink" name=
 "create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you don't have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ul>\n"+"			<li>Locate the project template in the expanded SDK. It should be at the following location:\n"+"				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"		</ul>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Update permissions in AndroidManifest.xml</h2>\n"+"<p>Add the following Internet permissions to your application's <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n"+"<pre>\n"+'&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n'+'&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n'+'&lt;uses-permission andro
 id:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n'+"</pre>\n"+"<h2>3. Initialize the SDK</h2>\n"+"<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the following:</p>\n"+"<ol>\n"+"	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n"+"		<pre>\n"+"public class YourApplication extends Application\n"+"{\n"+"        \n"+"        private ApigeeClient apigeeClient;\n"+"        \n"+"        public YourApplication()\n"+"        {\n"+"                this.apigeeClient = null;\n"+"        }\n"+"        \n"+"        public ApigeeClient getApigeeClient()\n"+"        {\n"+"                return this.apigeeClient;\n"+"        }\n"+"        \n"+"        public void setApigeeClien
 t(ApigeeClient apigeeClient)\n"+"        {\n"+"                this.apigeeClient = apigeeClient;\n"+"        }\n"+"}			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n"+"		<pre>\n"+"&lt;application&gt;\n"+'    android:allowBackup="true"\n'+'    android:icon="@drawable/ic_launcher"\n'+'    android:label="@string/app_name"\n'+'    android:name=".YourApplication"\n'+"	…\n"+"&lt;/application&gt;			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n"+"		<pre>\n"+"import com.apigee.sdk.ApigeeClient;\n"+"\n"+"@Override\n"+"protected void onCreate(Bundle savedInstanceState) {\n"+"    super.onCreate(savedInstanceState);		\n"+"	\n"+'	String ORGNAME = "{{currentOrg}}";\n'+'	String APPNAME = "{{currentApp}}";\n'+"	\n"+"	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseConte
 xt());\n"+"\n"+"	// hold onto the ApigeeClient instance in our application object.\n"+"	yourApp = (YourApplication) getApplication;\n"+"	yourApp.setApigeeClient(apigeeClient);			\n"+"}\n"+"		</pre>\n"+"		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n"+"	</li>\n"+"</ol>\n"+"<h2>4. Import additional SDK classes</h2>\n"+"<p>The following classes will enable you to call common SDK methods:</p>\n"+"<pre>\n"+"import com.apigee.sdk.data.client.DataClient; //App Services data methods\n"+"import com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\n"+"import com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\n"+"import com.apigee.sdk.data.client.response.ApiResponse; //API response object\n"+"</pre>\n"+"		\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logg
 ing usage, crash and error metrics for your app.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+"<p>To verify that the SDK has been properly initialized, run your app, then go to 'Monitoring' > 'App Usage' in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n"+"		<ul>\n"+"			<li>\n"+"				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n"+"				<p>Use this object to access the data methods of the App Services SDK, inclu
 ding those for push notifications, data store, and geolocation.</p>\n"+"			</li>\n"+"			<li>\n"+"				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n"+"				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n"+"			</li>\n"+"		</ul>\n"+"	</li>	\n"+"	<li>	\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\
 n'+'			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n'+"				<ul>\n"+'					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n'+'					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n'+'					<li><strong>
 <a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n'+"				</ul>		\n"+"			</li>\n"+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>	
 \n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-android-sdk-&lt;version&gt;\n"+"	...\n"+"	/samples\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app
  for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/ios.html","<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n"+'<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+"		<p>If you've already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n"+'		<div id="collapse"><a class="btn" d
 ata-toggle="collapse" href="#framework_collapse">Details</a></div>\n'+'		<div class="collapse" id="framework_collapse">\n'+"			<ol>\n"+"				<li>\n"+"					<p>Locate the SDK framework file so you can add it to your project. For example, you'll find the file at the following path:</p>\n"+"					<pre>\n"+"&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n"+"				</li>\n"+"				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n"+"				<li>Link the Apigee iOS SDK into your project.\n"+"					<ul>\n"+"						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n"+"					</ul>\n"+"					<p>OR</p>\n"+"					<ol>\n"+"						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n"+"						<li>Navigate to the directory that contains ApigeeiOS
 SDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you're starting with a clean slate (you don't have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ol>\n"+"			<li>\n"+"				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n"+"				<pre>\n"+"&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n"+"			<li>Get acquainted with the template by looking at its readme file.</li>\n"+"		</ol>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Add required iOS frameworks</h2>\n"+"<p>Ensure that the following iOS frameworks are part of you
 r project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n"+"<ul>\n"+"	<li>QuartzCore.framework</li>\n"+"	<li>CoreLocation.framework</li>\n"+"	<li>CoreTelephony.framework&nbsp;</li>\n"+"	<li>Security.framework</li>\n"+"	<li>SystemConfiguration.framework</li>\n"+"	<li>UIKit.framework</li>\n"+"</ul>\n"+"<h2>3. Update 'Other Linker Flags'</h2>\n"+"<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n"+"<pre>\n"+"-ObjC -all_load</pre>\n"+"<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n"+"<h2>4. Initialize the SDK</h2>\n"+'<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Gett
 ing Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n'+"<ol>\n"+"	<li>Import the SDK\n"+"		<p>Add the following to your source code to import the SDK:</p>\n"+"		<pre>\n"+"#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n"+"		<pre>\n"+"@property (strong, nonatomic) ApigeeClient *apigeeClient; \n"+"@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n"+"@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n"+"		</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n"+"		<pre>\n"+"//Replace 'AppDelegate' with the name of your app delegate class to instantiate it\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"\n"
 +"//Sepcify your App Services organization and application names\n"+'NSString *orgName = @"{{currentOrg}}";\n'+'NSString *appName = @"{{currentApp}}";\n'+"\n"+"//Instantiate ApigeeClient to initialize the SDK\n"+"appDelegate.apigeeClient = [[ApigeeClient alloc]\n"+"                            initWithOrganizationId:orgName\n"+"                            applicationId:appName];\n"+"                            \n"+"//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\n"+"self.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \n"+"self.dataClient = [appDelegate.apigeeClient dataClient]; \n"+"		</pre>\n"+"	</li>\n"+"</ol>\n"+"\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to
  <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>	\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n'+'		<div class="collapse" id="client_collapse">\n'+"			<ul>\n"+"				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifi
 cations, data store, and geolocation.</li>\n"+"				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"			<h3>Example</h3>\n"+"			<p>For example, you could create a new entity with the following:</p>\n"+"			<pre>\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"ApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n"+"			</pre>\n"+"		</div>\n"+"\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications<
 /a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+'		<p>The SDK includes samples that illust
 rate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n'+"		<p>You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-ios-sdk-&lt;version&gt;\n"+"    ...\n"+"    /samples\n"+"		</pre>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n'+'		<div class="collapse" id="samples_collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Ap
 igee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"		<p>&nbsp;</p>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/javascript.html","<h2>1. Import the SDK into your HTML</h2>\n"+"<p>To enable support for Apigee-related functions in your HTML, you'll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n"+"<pre>\n"+'&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n'+"</pre>\n"+"<h2>2. Instantiate Apigee.Clien
 t</h2>\n"+"<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n"+"<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n"+"<pre>\n"+"//Apigee account credentials, available in the App Services admin portal \n"+"var client_creds = {\n"+"        orgName:'{{currentOrg}}',\n"+"        appName:'{{currentApp}}'\n"+"    }\n"+"\n"+"//Initializes the SDK. Also instantiates Apigee.MonitoringClient\n"+"var dataClient = new Apigee.Client(client_creds);  \n"+"</pre>\n"+"\n"+"<h2>3. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https:
 //www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>	\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n"+'		<div id="collapse">\n'+'			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="client_collapse" class="collapse">\n'+"			<ul>\n"+"				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n"+"				<li><code>dataClient.monitor</code>: Used
  to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"		</div>\n"+"	</li>	\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n'+'			<li><strong>
 <a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-javascript-sdk-master\n"+"    ...\n"+"    /samples		\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\
 n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>booksSample.html</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>monitoringSample.html</td>\n"+"						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>readmeSample.html</td>\n"+"						<td>A simple app for reading data from
  an Apigee database.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>	\n"+"	</li>				\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/net.html","");$templateCache.put("app-overview/doc-includes/node.html","");$templateCache.put("app-overview/doc-includes/ruby.html","");$templateCache.put("app-overview/getting-started.html",'<div class="setup-sdk-content" >\n'+"\n"+'  <bsmodal id="regenerateCredentials"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="regenerateCredentialsDialog"\n'+'           extrabuttonlabel="Yes"\n'+"           ng-cloak>\n"+"    Are you sure you want to regenerate the credentials?\n"+"  </bsmodal>\n"+"\n"+'    <page-title icon="&#128640;" title="Getting Started"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+"\n"+"\n"+"\n"+'    <div class="span8">\n'+"\n"+'      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n'+"      <p>Cli
 ck on a platform icon below to view SDK installation instructions for that platform.</p>\n"+'      <ul class="inline unstyled">\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n'+"\n"+"\n"+"        <li ng-click=\"showSDKDetail('ios')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n'+"        <li ng-click=\"showSDKDetail('android')\"\n"+'            analytics-on="click"\n'+'            anal
 ytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n'+"        <li ng-click=\"showSDKDetail('javascript')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apige
 e.com/docs/usergrid/content/sdks-and-examples#ruby"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n'+"       </ul>\n"+"\n"+'      <section id="intro-container" class="row-fluid intro-container">\n'+"\n"+'        <div class="sdk-intro">\n'+"        </div>\n"+"\n"+'        <div class="sdk-intro-content">\n'+"\n"+'          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" targ
 et="_blank">\n'+"            Download SDK\n"+"          </a>\n"+'          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n'+"            More Docs\n"+"          </a>\n"+'          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n'+"\n"+'          <div ng-include="getIncludeURL()"></div>\n'+"        </div>\n"+"\n"+"      </section>\n"+"    </div>\n"+"\n"+'    <div class="span4 keys-creds">\n'+'      <h2 class="title">Mobile sdk keys</h2>\n'+"      <p>For mobile SDK initialization.</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Org Name</dt>\n"+"        <dd>{{currentOrg}}</dd>\n"+"        <dt>App Name</dt>\n"+"        <dd>{{currentApp}}</dd>\n"+"      </dl>\n"+'      <h2 class="title">Server app credentials</h2>\n'+"      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Client ID</dt>\n"+"        <dd>{{clientID}}</dd>\n"+"        <dt>Client Secret</
 dt>\n"+"        <dd>{{clientSecret}}</dd>\n"+"        <dt>\n"+"           &nbsp;\n"+"        </dt>\n"+"        <dd>&nbsp;</dd>\n"+"\n"+"        <dt>\n"+'          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n'+"        </dt>\n"+"        <dd></dd>\n"+"      </dl>\n"+"\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");
+$templateCache.put("data/data.html",'<div class="content-page">\n'+"\n"+'  <bsmodal id="newCollection"\n'+'           title="Create new collection"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newCollectionDialog"\n'+'           extrabuttonlabel="Create"\n'+'           buttonid="collection"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="new-collection-name">Collection Name:</label>\n'+'        <div class="controls">\n'+'          <input type="text" ug-validate required ng-pattern="collectionNameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n'+'          <p class="help-block hide"></p>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <page-title title=" Collections" icon="&#128254;"></page-title>\n'+"\n"+'  <section class="row-
 fluid">\n'+'    <div class="span3 user-col">\n'+'        <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n'+'        <ul  class="user-list">\n'+"          <li ng-class=\"queryCollection._type === entity.name ? 'selected' : ''\" ng-repeat=\"entity in collectionList\" ng-click=\"loadCollection('/'+entity.name);\">\n"+'            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n'+"          </li>\n"+"        </ul>\n"+"\n"+"  </div>\n"+"\n"+'    <div class="span9 tab-content">\n'+'      <div class="content-page">\n'+'      <form name="dataForm" ng-submit="run();">\n'+"        <fieldset>\n"+'          <div class="control-group">\n'+'            <div class="" data-toggle="buttons-radio">\n'+'              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n'+"              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n"+'      
         <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n'+'              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n'+'              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n'+'              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n'+'              <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE\n'+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group">\n'+"            <strong>Path </strong>\n"+'            <div class="contr
 ols">\n'+'              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n'+"            </div>\n"+"          </div>\n"+'          <div class="control-group">\n'+'            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n'+"          </div>\n"+'          <div class="control-group">\n'+"            <strong>Query</strong>\n"+'            <div class="controls">\n'+'              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n'+'              <div style="display:none">\n'+'                <a class="btn dropdown-toggle " data-toggle="dropdown">\n'+'                  <span id="query-collections-caret" class="caret"></span>\n'+"                </a>\n"+'                <ul id="query-collections-indexes-li
 st" class="dropdown-menu ">\n'+"                </ul>\n"+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+"\n"+"          <div class=\"control-group\" ng-show=\"verb=='GET' || verb=='DELETE'\">\n"+'            <label class="control-label" for="query-limit"><strong>Limit</strong> <a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'              <div class="input-append">\n'+'                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n'+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group" style="display:{{queryBodyDisplay}}">\n'+'            <label class="control-label" for="query-source"><strong>JSON Body</strong> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'            <textarea ng-
 model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n'+'      { "name":"value" }\n'+"            </textarea>\n"+"              <br>\n"+'            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"            </div>\n"+"          </div>\n"+'          <div style="clear: both; height: 10px;"></div>\n'+'          <div class="control-group">\n'+'            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n'+"          </div>\n"+"        </fieldset>\n"+"       </form>\n"+"        <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n"+"        <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n"+"        <div ng-include=\"display=='groups' ? 'data/display-groups.html' : ''\"></div>\n"+"        <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n"+"\n"+"
       </div>\n"+"\n"+"      </div>\n"+"    </section>\n"+"\n"+"\n"+"\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/display-generic.html","\n"+"\n"+'<bsmodal id="deleteEntities"\n'+'         title="Are you sure you want to delete the entities(s)?"\n'+'         close="hideModal"\n'+'         closelabel="Cancel"\n'+'         extrabutton="deleteEntitiesDialog"\n'+'         extrabuttonlabel="Delete"\n'+'         buttonid="del-entity"\n'+"         ng-cloak>\n"+"    <fieldset>\n"+'        <div class="control-group">\n'+"        </div>\n"+"    </fieldset>\n"+"</bsmodal>\n"+"\n"+'<span  class="button-strip">\n'+'  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n'+"</span>\n"+'<table class="table table-striped collection-list">\n'+"  <thead>\n"+'  <tr class="table-header">\n'+'    <th><input type="checkbox" ng-show="queryCollection._list.l
 ength > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n'+"    <th ng-if=\"hasProperty('name')\">Name</th>\n"+"    <th>UUID</th>\n"+"    <th></th>\n"+"  </tr>\n"+"  </thead>\n"+'  <tbody ng-repeat="entity in queryCollection._list">\n'+'  <tr class="zebraRows" >\n'+"    <td>\n"+"      <input\n"+'        type="checkbox"\n'+'        id="entity-{{entity._data.name}}-cb"\n'+'        ng-value="entity._data.uuid"\n'+'        ng-model="entity.checked"\n'+"        >\n"+"    </td>\n"+"    <td ng-if=\"hasProperty('name')\">{{entity._data.name}}</td>\n"+"    <td>{{entity._data.uuid}}</td>\n"+"    <td><a href=\"javaScript:void(0)\" ng-click=\"entitySelected[$index] = !entitySelected[$index];selectEntity(entity._data.uuid)\">{{entitySelected[$index] ? 'Hide' : 'View'}} Details</a></td>\n"+"  </tr>\n"+'  <tr ng-if="entitySelected[$index]">\n'+'    <td colspan="5">\n'+"\n"+"\n"+'      <h4 style="m
 argin: 0 0 20px 0">Entity Detail</h4>\n'+"\n"+"\n"+'      <ul class="formatted-json">\n'+'        <li ng-repeat="(k,v) in entity._data track by $index">\n'+'          <span class="key">{{k}} :</span>\n'+"          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n"+'          <span ng-switch on="isDeep(v)">\n'+'            <ul ng-switch-when="true">\n'+'              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n'+"\n"+'                <span ng-switch on="isDeep(v2)">\n'+'                  <ul ng-switch-when="true">\n'+'                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n'+"                  </ul>\n"+'                  <span ng-switch-when="false">\n'+'                    <span class="value">{{v2}}</span>\n'+"                  </span>\n"+"                </span>\n"+"              </li>\n"+"            </ul>\n"+'            <span ng-switch-when="false">\n'+'   
            <span class="value">{{v}}</span>\n'+"            </span>\n"+"          </span>\n"+"        </li>\n"+"      </ul>\n"+"\n"+'    <div class="control-group">\n'+'      <h4 style="margin: 20px 0 20px 0">Edit Entity</h4>\n'+'      <div class="controls">\n'+'        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n'+"        <br>\n"+'        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n'+"      </div>\n"+"    </div>\n"+"  </td>\n"+"  </tr>\n"+"\n"+'  <tr ng-show="queryCollection._list.length == 0">\n'+'    <td colspan="4">No data found</td>\n'+"  </tr>\n"+"  </tbody>\n"+"</table>\n"+'<div style="padding: 10px 5px 10px 5px">\n'+'  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'  <button class="btn btn-primary toolbar"
  ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"</div>\n"+"\n");$templateCache.put("data/display-groups.html","");$templateCache.put("data/display-roles.html","roles---------------------------------");$templateCache.put("data/display-users.html","\n"+'<table id="query-response-table" class="table">\n'+"  <tbody>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n'+'    <td class="gravatar50-td">&nbsp;</td>\n'+'    <td class="user-details bold-header">Username</td>\n'+'    <td class="user-details bold-header">Display Name</td>\n'+'    <td class="user-details bold-header">UUID</td>\n'+'    <td class="view-details">&nbsp;</td>\n'+"  </tr>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf
 44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"    </td>\n"+'    <td class="gravatar50-td">\n'+'      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n'+"    </td>\n"+'    <td class="details">\n'+"      <a onclick=\"Usergrid.console.getCollection('GET', '/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/'+'bf9a95da-d508-11e2-bf44-236d2eee13a7'); $('#data-explorer').show(); return false;\" class=\"view-details\">10</a>\n"+"    </td>\n"+'    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n'+'    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n'+'    <td class="view-details">\n'+'      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n'+"    </td>\n"+"  </tr>\n"+'  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+'    <t
 d colspan="5">\n'+"      <div>\n"+'        <div style="padding-bottom: 10px;">\n'+'          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n'+'          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n'+"        </div>\n"+'        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"              <pre>{\n"+'  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n'+'  "uuid": "bf9a95da-d508-11e2-bf4
 4-236d2eee13a7",\n'+'  "type": "user",\n'+'  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n'+'  "created": 1371224432557,\n'+'  "modified": 1371851347024,\n'+'  "username": "10",\n'+'  "email": "fdsafdsa@ookfd.com",\n'+'  "activated": "true",\n'+'  "adr": {\n'+'    "addr1": "",\n'+'    "addr2": "",\n'+'    "city": "",\n'+'    "state": "",\n'+'    "zip": "",\n'+'    "country": ""\n'+"  },\n"+'  "metadata": {\n'+'    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n'+'    "sets": {\n'+'      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n'+'      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n'+"    },\n"+'    "collections": {\n'+'      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n'+'      "devices": "/user
 s/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n'+'      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n'+'      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n'+'      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n'+'      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n'+'      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n'+"    }\n"+"  },\n"+'  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n'+"}</pre>\n"+"        </div>\n"+'        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+"          <table>\n"+"            <tbody>\n"+"            <tr>\n"+"           
    <td>picture</td>\n"+'              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>
 </td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031
 a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n'+"            </tr>\n"+"            </tbody>\n"+"          </table>\n"+"        </div>\n"+"      </div>\n"+"    </td>\n"+"  </tr>\n"+"  </tbody>\n"+"</table>");$templateCache.put("data/entity.html",'<div class="content-page">\n'+"\n"+"  <h4>Entity Detail</h4>\n"+'  <div class="well">\n'+'    <a href="#!/data" class="outside-link"><< Back to collection</a>\n'+"  </div>\n"+"  <fieldset>\n"+'    <div class="control-group">\n'+"      <strong>Path </strong>\n"+'      <div class="controls">\n'+"        {{entityT
 ype}}/{{entityUUID}}\n"+"      </div>\n"+"    </div>\n"+"\n"+'    <div class="control-group">\n'+'      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n'+'      <div class="controls">\n'+'        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n'+"        <br>\n"+'        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"      </div>\n"+"    </div>\n"+'    <div style="clear: both; height: 10px;"></div>\n'+'    <div class="control-group">\n'+'      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n'+'      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n'+"    </div>\n"+"  </fieldset>\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/shell.html",'<div class="content-page">\n'+'  <div class="well">\n'+"    <h2>Interactive Shell</h2>\n"+'    <div style="float:right"><a target="
 _blank" href="http://apigee.com/docs/usergrid/content/usergrid-admin-portal" class="notifications-links">Learn more in our docs</a></div>\n'+"  </div>\n"+"\n"+'  <div class="console-section-contents">\n'+'    <div id="shell-input-div">\n'+'      <p>   Type "help" to view a list of the available commands.</p><hr>\n'+"      <span>&nbsp;&gt;&gt; </span>\n"+'      <!--textarea id="shell-input" rows="2" autofocus="autofocus"></textarea-->\n'+"    </div>\n"+'    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;"><span class="pln">                      </span><p><span class="pln">  </span><span class="typ">Response</span><span class="pun">:</span></p><hr><span class="pln">\n'+"    </span></pre>\n"+"  </div>\n"+"</div>");$templateCache.put("dialogs/modal.html",'    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n'+'        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n'+"\n"+'        <div cl
 ass="modal-header">\n'+'            <h1 class="title">{{title}}</h1>\n'+"        </div>\n"+"\n"+'        <div class="modal-body" ng-transclude></div>\n'+'        <div class="modal-footer">\n'+"            {{footertext}}\n"+'            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n'+'            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n'+'                    ng-click="closeDelegate(close)">{{closelabel}}\n'+"            </button>\n"+"        </div>\n"+"        </form>    </div>\n");$templateCache.put("global/appswitcher-template.html",'<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n'+'  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n'+'  <ul class="dropdown-menu pull-right">\n'+'    <li id="globalNavSubmenuContainer">\n'+"      <ul>\n"+'        <li data-globalNav
 Detail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n'+"      </ul>\n"+"    </li>\n"+'    <li id="globalNavDetail">\n'+'      <div id="globalNavDetailApigeeHome">\n'+'        <div class="globalNavDetailApigeeLogo"></div>\n'+'        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailAppServices">\n'+'        <div class="globalNavDetailSubtitle">For App De
 velopers</div>\n'+'        <div class="globalNavDetailTitle">App Services</div>\n'+'        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiPlatform">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Platform</div>\n'+'        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiConsoles">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Consoles</div>\n'+'        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n'+"      </div>\n"+"    </li>\n"+"  </ul>\n"+"</li>");$templateCache.put("global/insecure-banner.html
 ",'<div ng-if="securityWarning" ng-cloak class="demo-holder">\n'+'    <div class="alert alert-demo alert-animate">\n'+'        <div class="alert-text">\n'+'            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n'+"        </div>\n"+"    </div>\n"+"</div>");$templateCache.put("global/page-title.html",'<section class="row-fluid">\n'+'    <div class="span12">\n'+'        <div class="page-filters">\n'+'            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n'+"        </div>\n"+"    </div>\n"+'    <bsmodal id="need-help"\n'+'             title="Need Help?"\n'+'
              close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="sendHelp"\n'+'             extrabuttonlabel="Get Help"\n'+"             ng-cloak>\n"+"        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n"+"    </bsmodal>\n"+"</section>\n"+"\n");$templateCache.put("groups/groups-activities.html",'<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n'+"\n"+"  <br>\n"+"  <div>\n"+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n'+"        <td>{{activity.createdDate}}</td>\n"+"        <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"
 +"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-details.html",'<div class="content-page" ng-controller="GroupsDetailsCtrl">\n'+"\n"+"  <div>\n"+'      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n'+'          <div style="float: left; padding-right: 30px;">\n'+'              <h4 class="ui-dform-legend">Group Information</h4>\n'+'              <label for="group-title" class="ui-dform-label">Group Title</label>\n'+'              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n'+"              <br/>\n"+'            <label for="group-path" class="ui-dform-label">Group Path</label>\n'+'            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n'+"            <br/>\n"+"    
       </div>\n"+'          <br style="clear:both"/>\n'+"\n"+'          <div style="width:100%;float:left;padding: 20px 0">\n'+'              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n'+"          </div>\n"+"\n"+'          <div class="content-container">\n'+"              <h4>JSON Group Object</h4>\n"+"              <pre>{{json}}</pre>\n"+"          </div>\n"+"      </form>\n"+"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-members.html",'<div class="content-page" ng-controller="GroupsMembersCtrl">\n'+"\n"+"\n"+'  <bsmodal id="removeFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="removeUsersFromGroupDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the users from the seleted group(s)?</p>\n"+"  </bsmodal>\n"+"
 \n"+'  <bsmodal id="addGroupToUser"\n'+'           title="Add user to group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToUserDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.user != '' ? $parent.user.username : 'Select a user...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasMembers 
 || !valueSelected(groupsCollection.users._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n'+"  </div>\n"+'  <table class="table table-striped">\n'+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n'+'      <td style="width: 50px;"></td>\n'+"      <td>Username</td>\n"+"      <td>Display Name</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="user.checked"\n'+"          >\n"+"      </td>\n"+'      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n'+"      <td>{{user.get('username')}}</td>\n"+"      <td>{{user.get('name')}}</td>\n"+"    </tr>\n"+"  </table>\n"+'  <div style=
 "padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"  </div>\n"+"</div>");$templateCache.put("groups/groups-roles.html",'<div class="content-page" ng-controller="GroupsRolesCtrl">\n'+"\n"+'  <bsmodal id="addGroupToRole"\n'+'           title="Add group to role"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToRoleDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.name != '' ? $parent.name : 'Role name...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-
 repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="leaveRoleFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="leaveRoleDialog"\n'+'           extrabuttonlabel="Leave"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the group from the role(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n'+"  </div>\n"+"  <h4>Roles</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-head
 er">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" ></td>\n'+"      <td>Role Name</td>\n"+"      <td>Role title</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="role.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{role._data.name}}</td>\n"+"      <td>{{role._data.title}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+'  <div style="padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n'+"  </div>\n"+"\n"+"\n"+'  <bsmodal 
 id="deletePermission"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupPermissionDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the permission(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <bsmodal id="addPermission"\n'+'           title="New Permission"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupPermissionDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /></p>\n'+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <inpu
 t type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n'+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n'+"  </div>\n"+"  <h4>Permissions</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAll
 Entities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n'+"      <td>Path</td>\n"+"      <td>GET</td>\n"+"      <td>POST</td>\n"+"      <td>PUT</td>\n"+"      <td>DELETE</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="permission.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{permission.path}}</td>\n"+"      <td>{{permission.operations.get}}</td>\n"+"      <td>{{permission.operations.post}}</td>\n"+"      <td>{{permission.operations.put}}</td>\n"+"      <td>{{permission.operations.delete}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+"\n"+"</div>");
+$templateCache.put("groups/groups-tabs.html",'<div class="content-page">\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span12">\n'+'      <div class="page-filters">\n'+'        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n'+"      </div>\n"+"    </div>\n"+"\n"+"  </section>\n"+"\n"+'  <div id="user-panel" class="panel-buffer">\n'+'    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n'+'      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n'+'      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n'+'      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n'+'      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n'+'      <li ng-class="rolesSelected"><a href="javaScript:v
 oid(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n'+"    </ul>\n"+"  </div>\n"+"\n"+'  <div style="float: left; margin-right: 10px;">\n'+'    <div style="float: left;">\n'+"      <div class=\"user-header-title\"><strong>Group Path: </strong>{{selectedGroup.get('path')}}</div>\n"+"      <div class=\"user-header-title\"><strong>Group Title: </strong>{{selectedGroup.get('title')}}</div>\n"+"    </div>\n"+"  </div>\n"+"</div>\n"+"<br>\n"+"<br>\n");$templateCache.put("groups/groups.html",'<div class="content-page">\n'+"\n"+'  <page-title title=" Groups" icon="&#128101;"></page-title>\n'+'  <bsmodal id="newGroup"\n'+'           title="New Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newGroupDialog"\n'+'           extrabuttonlabel="Add"\n'+'           ng-model="dialog"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="title">Title</label>\n'+'    
     <div class="controls">\n'+'          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label for="path">Path</label>\n'+'        <div class="controls">\n'+'          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="deleteGroup"\n'+'           title="Delete Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupsDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the group(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <section class=
 "row-fluid">\n'+'    <div class="span3 user-col">\n'+"\n"+'      <div class="button-toolbar span12">\n'+'        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n'+'        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n'+'        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n'+"      </div>\n"+'      <ul class="user-list">\n'+'        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n'+"          <input\n"+'              type="checkbox"\n'+'              ng-value="group
 ._data.uuid"\n'+'              ng-checked="group.checked"\n'+'              ng-model="group.checked"\n'+"              >\n"+"          <a href=\"javaScript:void(0)\" >{{group.get('title')}}</a>\n"+"          <br/>\n"+"          <span ng-if=\"group.get('path')\" class=\"label\">Path:</span>/{{group.get('path')}}\n"+"        </li>\n"+"      </ul>\n"+"\n"+"\n"+'      <div style="padding: 10px 5px 10px 5px">\n'+'        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"      </div>\n"+"\n"+"    </div>\n"+"\n"+'    <div class="span9 tab-content" ng-show="selectedGroup.get" >\n'+'      <div class="menu-toolbar">\n'+'        <ul class="inline" >\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click
 ="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a></li>\n'+"        </ul>\n"+"      </div>\n"+'      <span ng-include="currentGroupsPage.template"></span>\n'+"\n"+"  </section>\n"+"</div>\n");$templateCache.put
 ("login/forgot-password.html",'<div class="login-content" ng-controller="ForgotPasswordCtrl">\n'+'	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n'+'	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n'+'	<button class="btn btn-primary" ng-click="">Reset Password</button>\n'+"</div>\n");$templateCache.put("login/loading.html","\n"+"\n"+"<h1>Loading...</h1>");$templateCache.put("login/login.html",'<div class="login-content">\r'+"\n"+'  <bsmodal id="sendActivationLink"\r'+"\n"+'           title="Resend Activation Link"\r'+"\n"+'           close="hideModal"\r'+"\n"+'           closelabel="Cancel"\r'+"\n"+'           extrabutton="resendActivationLink"\r'+"\n"+'           extrabuttonlabel="Send Activation"\r'+"\n"+"           ng-cloak>\r"+"\n"+"    <fieldset>\r"+"\n"+'      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-patter
 n="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r'+"\n"+"    </fieldset>\r"+"\n"+"  </bsmodal>\r"+"\n"+'  <div class="login-holder">\r'+"\n"+'  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r'+"\n"+'    <h1 class="title">Enter your credentials</h1>\r'+"\n"+'    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r'+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-username">Email or Username:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-password">Password:</
 label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group" ng-show="requiresDeveloperKey">\r'+"\n"+'      <label class="control-label" for="login-developerkey">Developer Key:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="form-actions">\r'+"\n"+'      <div class="submit">\r'+"\n"+'        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+"  </form>\r"+"\n"+"  </div>\r"+
 "\n"+'  <div class="extra-actions">\r'+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r'+"\n"+'         class="btn btn-primary pull-left">Register</a>\r'+"\n"+"    </div>\r"+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="button-forgot-password"\r'+"\n"+'         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r'+"\n"+"    </div>\r"+"\n"+'    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r'+"\n"+'       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r'+"\n"+"  </div>\r"+"\n"+'  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r'+"\n"+"</div>\r"+"\n");$templateCache.put("login/logout.html",'<div id="logut">Logging out...</div>');$templateCache.put("login/register.html",'<div class="signUp-content">\n'+'  <div class="signUp-
 holder">\n'+'    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n'+'      <h1 class="title">Register</h1>\n'+"\n"+'      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n'+'      <div class="control-group">\n'+'        <label class="control-label" for="register-orgName">Organization:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-name">Name:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class=""
  size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-userName">Username:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-email">Email:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-password">Password:</label>\n'+"\n"+'        <div
  class="controls">\n'+'          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n'+'                 size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPassword" ug-validate class="" size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="form-actions">\n'+'        <div class="submit">\n'+'          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n'+'                 class="btn btn-primary pull-right">\n'+"        </div>\n"+'        <div class="submit">\n'+'          <a ng-click="cancel()" type="submi
 t" name="button-cancel" id="button-cancel"\n'+'             class="btn btn-primary pull-right">Cancel</a>\n'+"        </div>\n"+"      </div>\n"+"    </form>\n"+'    <div class="console-section well thingy" ng-show="signUpSuccess">\n'+'      <span class="title">We\'re holding a seat for you!</span>\n'+"      <br><br>\n"+"\n"+"      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we're ready for\n"+"        you!</p>\n"+"\n"+"      <p>In the mean time, you can stay up to date with App Services on our <a\n"+'          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleGroup</a>.</p>\n'+"\n"+'      <p> <a href="#!/login">Back to login</a></p>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</div>\n");$templateCache.put("menus/appMenu.html",'<ul id="app-menu" class="nav top-nav span12">\n'+'    <li class="span7">\n'+'      <bsmodal id="newApplication"\n'+'               title="Create New Application"\n'+'               close="hideM
 odal"\n'+'               closelabel="Cancel"\n'+'               extrabutton="newApplicationDialog"\n'+'               extrabuttonlabel="Create"\n'+'               buttonid="app"\n'+"               ng-cloak>\n"+'        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n'+'        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n'+'        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n'+"      </bsmodal>\n"+'        <div class="btn-group">\n'+'            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n'+'                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n'+'                <span class="caret"></span>\n'+"            </a>\n"+'            <ul class="dro
 pdown-menu app-nav">\n'+'                <li name="app-selector" ng-repeat="app in applications">\n'+'                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n'+"                </li>\n"+"            </ul>\n"+"        </div>\n"+"    </li>\n"+'    <li class="span5">\n'+'      <a ng-if="activeUI"\n'+'         class="btn btn-create zero-out pull-right"\n'+"         ng-click=\"showModal('newApplication')\"\n"+'         analytics-on="click"\n'+'         analytics-category="App Services"\n'+'         analytics-label="Button"\n'+'         analytics-event="Add New App"\n'+"        >\n"+'        <i class="pictogram">&#8862;</i>\n'+"        Add New App\n"+"      </a>\n"+"    </li>\n"+"</ul>");$templateCache.put("menus/orgMenu.html",'<ul class="nav top-nav org-nav">\n'+"  <li>\n"+'<div class="btn-group ">\n'+'    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n'+'        <i class="pictogram
 ">&#128193</i> {{currentOrg}}<span class="caret"></span>\n'+"        </a>\n"+'    <ul class="dropdown-menu org-nav">\n'+'          <li name="org-selector" ng-repeat="(k,v) in organizations">\n'+'              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n'+"            </li>\n"+"         </ul>\n"+"    </div>\n"+"  </li></ul>");$templateCache.put("org-overview/org-overview.html",'<div class="org-overview-content" ng-show="activeUI">\n'+"\n"+'  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'  <div class="span6">\n'+'  	<bsmodal id="introjs"\n'+'             title="Welcome to the API BaaS Admin Portal"\n'+'             close="hideModal"\n'+'             closelabel="Skip"\n'+'             extrabutton="startFirstTimeUser"\n'+'             extrabuttonlabel="Take the tour"\n'+"             ng-cloak>\n"+"      <p>To get started, click 'Take the tour' for a full walkth
 rough of the admin portal, or click 'Skip' to start working right away.</p>\n"+"    </bsmodal>\n"+'		<div id="intro-4-current-org">	\n'+'	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n'+'	    <table class="table table-striped">\n'+"	      <tr>\n"+'	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n'+'	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n"+"\n"+'    <bsmodal id="newApplication"\n'+'             title="Create New Application"\n'+'             close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="newApplicationDialog"\n'+'             extrabuttonlabel="Create"\n'+"             ng-cloak>\n"+'      <p>New application name: <input ng-model="$parent.newApp.name"
   ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n'+"    </bsmodal>\n"+'		<div id="intro-5-applications">		\n'+'	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n'+'	      <div class="header-button btn-group pull-right">\n'+"	        <a class=\"btn filter-selector\" style=\"{{applicationsSize === 10 ? 'width:290px':''}}\"  ng-click=\"showModal('newApplication')\">\n"+'	          <span class="filter-label">Add New App</span>\n'+"	        </a>\n"+"	      </div>\n"+"	    </h2>\n"+"		\n"+'	    <table class="table table-striped">\n'+'	      <tr ng-repeat="application in applications">\n'+"	        <td>{{application.name}}</td>\n"+'	        <td style="text-align: right">{{application.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n
 "+'    <bsmodal id="regenerateCredentials"\n'+'             title="Con

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/9011d58a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.REMOTE.31213.js
----------------------------------------------------------------------
diff --git a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.REMOTE.31213.js b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.REMOTE.31213.js
new file mode 100644
index 0000000..e69de29


[07/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/js/libs/usergrid-libs.min.js
----------------------------------------------------------------------
diff --git a/portal/js/libs/usergrid-libs.min.js b/portal/js/libs/usergrid-libs.min.js
index 18d3ba2..96f702b 100644
--- a/portal/js/libs/usergrid-libs.min.js
+++ b/portal/js/libs/usergrid-libs.min.js
@@ -1,4 +1,4 @@
-/*! usergrid@2.0.2 2014-03-31 */
+/*! usergrid@2.0.2 2014-04-01 */
 !function(e,t){function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)dele
 te o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function it(){return!0}function ot(){return!1}function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0==
 =n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){for(var n,r=0;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t
 ).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}function tn(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;i--;)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function 
 rn(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(
 e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(
 b.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}var o={},a=e===jn;return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);for(;"*"===l[0];)l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataT
 ype)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){for(var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;u>a;a++)
 l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.css
 Hooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",
 {}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],
 :{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementB
 yId(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.cal
 l(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},
 isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.
 replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a)for(;o>i&&(r=t.apply(e[i],n),r!==!1);i++);else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a)for(;o>i&&(r=t.call(e[i],i,e[i]),r!==!1);i++);else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call(" ")?function(e){return 
 null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else for(;n[o]!==t;)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid
 ||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.to
 LowerCase()}),r=b(o);var _={};b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;!function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})}(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){for(var r;(r=b.inArray(t,u,r))>-1;)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u|
 |i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]
 +"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var s,u,l,t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}};if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t
 ={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t
 "),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;bo
 rder:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.fir
 stChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf(
 "data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}}),b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e
 ,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};for("string"!=typeof e&&(n=e,e=t),e=e||"fx";s--;)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q
 =b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){for(o=0;i=t[o++];)0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||
 "").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return this.each(b.isFunction(e)?function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var o,a=0,s=b(this),u=t,l=e.match(w)||[];o=l[a++];)u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o);else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];return arguments.length?(i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType
 &&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))})):o?(r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)):void 0}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inA
 rray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;return e&&3!==u&&8!==u&&2!==u?typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t)):void 0},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)for(;n=o[i++];)r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpad
 ding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;return e&&3!==s&&8!==s&&2!==s?(a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]):void 0},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.
 nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)
 }}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected|
 |(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){for(r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f
 .elem=e),n=(n||"").match(w)||[""],l=n.length;l--;)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){for(t=(t||"").match(w)||[""],l=t.length;l--;)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.l
 ength;o--;)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||
 p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}for(d=0;(l=h[d++])&&!n.isPropagationStopped();)n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=b.event.handlers.call(this,e,l),n=
 0;(o=s[n++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,a=0;(i=o.handlers[a++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=tt.test(i)?this.mouse
 Hooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;t--;)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.sc
 rollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof
  e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i
 =e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this.
 _just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}})
 ,b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undeleg
 ate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e
 ),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;u--;)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;
 )n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);for(s=e,u=[],l=i.preFilter;s;){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){for(;t=t[i];)if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){for(;t=t[i];)if((1===t.nodeType||o)&&e(t,n,s))return!0}else for(;t=t[i];)if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return
  e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r)for(l=mt(y,d),r(l,[],s,u),c=l.length;c--;)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p));if(o){if(i||e){if(i){for(l=[],c=y.length;c--;)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}for(c=y.length;c--;)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){for(var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeTyp
 e?c(e,n,r):p(e,n,r))}];o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r&&!i.relative[e[r].type];r++);return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){for(g=0;m=e[g++];)if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){for(g=0;m=t[g++];)m(x,y,u,c);if(s){if(v>0)for(;b--;)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}function xt(e,t,n){for(var r=0,i=t.length;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1
 ===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}for(o=U.needsContext.test(e)?0:a.length;o--&&(u=a[o],!i.relative[l=u.type]);)if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}return s(e,p)(r,t,d,n,V.test(e)),n}function Tt(){}var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((
 ?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n
 +65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){for(var t,n=[];t=this[e++];)n.push(t);return n}}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a>
 <div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&
 &e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length|
 |h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t
 ];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);for(r=e;r=r.parentNode;)s.unshift(r);for(r=t;r=r.parentNode;)l.unshift(r);for(;s[i]===l[i];)i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "
 +e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));for(;i--;)e.splice(n[i],1)}return e},o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e
 ){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u
 ){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];p=++d&&p&&p[g]||(f=d=0)||h.pop();)if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else for(;(p=++d&&p&&p[g]||(f=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++f||(v&&((p[x]||(p[x]={}))[e]=[N,f]),p!==t)););return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){for(var i,o=r(e,t),a=o.length;a--;)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){r
 eturn r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e)
 {return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){for(var r
 =0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){for(var r=0>n?n+t:n;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){for(t||(t=ft(e)),n=t.length;n--;)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o},i.pseudos.nth=i.pseudos.eq,i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,th
 is[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n.ownerDocument&&n!==t&&11!==n.nodeType;){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==type
 of e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack,b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.
 fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)
 }}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,
 "<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return t
 his},wrapInner:function(e){return this.each(b.isFunction(e)?function(t){b(this).wrapInner(e.call(this,t))}:function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function
 (e,t){for(var n,r=0;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&b.cleanData(Ot(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)}
 ,null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"glo
 balEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}}),b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){for(var n,r=0,i=[],o=b(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}}),b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&
 &Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){for(var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){for(s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];i--;)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody)for(o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l);for(b.merge(d,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));for(s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;o=d[h++];)if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),
 "script"),a&&Mt(s),n))for(i=0;o=s[i++];)kt.test(o.type||"")&&n.push(o);return s=null,f},cleanData:function(e,t){for(var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;
 i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.sup
 port.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=fu
 nction(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u}),b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),
 ""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:i
 nput|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")},b.each("blur focus focusin focusout load resize scroll unload click dblclick moused
 own mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[],b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o
 =arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t
 ){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{}
 ,y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c)for(c={};t=Tn.exec(a);)c[t[1].toLowerCase()]=t[2];t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&
 "string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(j
 n,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}}),b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&
 &(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=
 a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.te
 xt=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}}),b.Tween=rr,rr.prototype={constructor:rr,init
 :function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.el
 em[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n
 )&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration

<TRUNCATED>

[19/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/9011d58a/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js.orig
----------------------------------------------------------------------
diff --git a/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js.orig b/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js.orig
new file mode 100644
index 0000000..9575b61
--- /dev/null
+++ b/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js.orig
@@ -0,0 +1,26 @@
+<<<<<<< HEAD:portal/js/libs/usergrid-libs.min.js
+/*! usergrid@2.0.2 2014-04-01 */
+=======
+/*! usergrid@2.0.2 2014-04-02 */
+>>>>>>> upstream/master:portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js
+!function(e,t){function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)dele
 te o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function it(){return!0}function ot(){return!1}function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0==
 =n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){for(var n,r=0;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t
 ).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}function tn(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;i--;)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function 
 rn(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(
 e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(
 b.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}var o={},a=e===jn;return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);for(;"*"===l[0];)l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataT
 ype)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){for(var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;u>a;a++)
 l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.css
 Hooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",
 {}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],
 :{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementB
 yId(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.cal
 l(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},
 isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.
 replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a)for(;o>i&&(r=t.apply(e[i],n),r!==!1);i++);else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a)for(;o>i&&(r=t.call(e[i],i,e[i]),r!==!1);i++);else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call(" ")?function(e){return 
 null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else for(;n[o]!==t;)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid
 ||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.to
 LowerCase()}),r=b(o);var _={};b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;!function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})}(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){for(var r;(r=b.inArray(t,u,r))>-1;)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u|
 |i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]
 +"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var s,u,l,t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}};if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t
 ={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t
 "),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;bo
 rder:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.fir
 stChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf(
 "data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}}),b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e
 ,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};for("string"!=typeof e&&(n=e,e=t),e=e||"fx";s--;)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q
 =b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){for(o=0;i=t[o++];)0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||
 "").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return this.each(b.isFunction(e)?function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var o,a=0,s=b(this),u=t,l=e.match(w)||[];o=l[a++];)u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o);else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];return arguments.length?(i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType
 &&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))})):o?(r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)):void 0}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inA
 rray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;return e&&3!==u&&8!==u&&2!==u?typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t)):void 0},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)for(;n=o[i++];)r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpad
 ding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;return e&&3!==s&&8!==s&&2!==s?(a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]):void 0},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.
 nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)
+}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected|
 |(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){for(r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f
 .elem=e),n=(n||"").match(w)||[""],l=n.length;l--;)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){for(t=(t||"").match(w)||[""],l=t.length;l--;)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.l
 ength;o--;)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||
 p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}for(d=0;(l=h[d++])&&!n.isPropagationStopped();)n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=b.event.handlers.call(this,e,l),n=
 0;(o=s[n++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,a=0;(i=o.handlers[a++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=tt.test(i)?this.mouse
 Hooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;t--;)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.sc
 rollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof
  e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i
 =e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this.
 _just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}})
 ,b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undeleg
 ate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e
 ),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;u--;)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;
 )n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);for(s=e,u=[],l=i.preFilter;s;){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){for(;t=t[i];)if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){for(;t=t[i];)if((1===t.nodeType||o)&&e(t,n,s))return!0}else for(;t=t[i];)if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return
  e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r)for(l=mt(y,d),r(l,[],s,u),c=l.length;c--;)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p));if(o){if(i||e){if(i){for(l=[],c=y.length;c--;)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}for(c=y.length;c--;)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){for(var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeTyp
 e?c(e,n,r):p(e,n,r))}];o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r&&!i.relative[e[r].type];r++);return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){for(g=0;m=e[g++];)if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){for(g=0;m=t[g++];)m(x,y,u,c);if(s){if(v>0)for(;b--;)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}function xt(e,t,n){for(var r=0,i=t.length;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1
 ===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}for(o=U.needsContext.test(e)?0:a.length;o--&&(u=a[o],!i.relative[l=u.type]);)if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}return s(e,p)(r,t,d,n,V.test(e)),n}function Tt(){}var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((
 ?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n
 +65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){for(var t,n=[];t=this[e++];)n.push(t);return n}}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a>
 <div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&
 &e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length|
 |h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t
 ];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);for(r=e;r=r.parentNode;)s.unshift(r);for(r=t;r=r.parentNode;)l.unshift(r);for(;s[i]===l[i];)i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "
 +e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));for(;i--;)e.splice(n[i],1)}return e},o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e
 ){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u
 ){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];p=++d&&p&&p[g]||(f=d=0)||h.pop();)if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else for(;(p=++d&&p&&p[g]||(f=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++f||(v&&((p[x]||(p[x]={}))[e]=[N,f]),p!==t)););return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){for(var i,o=r(e,t),a=o.length;a--;)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){r
 eturn r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e)
 {return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){for(var r
 =0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){for(var r=0>n?n+t:n;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){for(t||(t=ft(e)),n=t.length;n--;)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o},i.pseudos.nth=i.pseudos.eq,i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,th
 is[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n.ownerDocument&&n!==t&&11!==n.nodeType;){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==type
 of e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack,b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.
 fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)
+}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,
 "<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return t
 his},wrapInner:function(e){return this.each(b.isFunction(e)?function(t){b(this).wrapInner(e.call(this,t))}:function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function
 (e,t){for(var n,r=0;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&b.cleanData(Ot(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)}
 ,null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"glo
 balEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}}),b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){for(var n,r=0,i=[],o=b(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}}),b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&
 &Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){for(var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){for(s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];i--;)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody)for(o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l);for(b.merge(d,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));for(s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;o=d[h++];)if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),
 "script"),a&&Mt(s),n))for(i=0;o=s[i++];)kt.test(o.type||"")&&n.push(o);return s=null,f},cleanData:function(e,t){for(var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;
 i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.sup
 port.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=fu
 nction(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u}),b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),
 ""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:i
 nput|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")},b.each("blur focus focusin focusout load resize scroll unload click dblclick moused
 own mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[],b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o
 =arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t
 ){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{}
 ,y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c)for(c={};t=Tn.exec(a);)c[t[1].toLowerCase()]=t[2];t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&
 "string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(j
 n,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}}),b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&
 &(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=
 a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.te
 xt=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}}),b.Tween=rr,rr.prototype={constructor:rr,init
 :function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.el
 em[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n
 )&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(

<TRUNCATED>

[23/24] git commit: Merge pull request #97 from shawnfeldman/master

Posted by sn...@apache.org.
Merge pull request #97 from shawnfeldman/master

update readme

Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/1b4038a5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/1b4038a5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/1b4038a5

Branch: refs/heads/master
Commit: 1b4038a5d26a863dece8e21d3e63745686cfe2c5
Parents: 72b5753 ded28e5
Author: Rod Simpson <ro...@rodsimpson.com>
Authored: Wed Apr 2 12:31:57 2014 -0600
Committer: Rod Simpson <ro...@rodsimpson.com>
Committed: Wed Apr 2 12:31:57 2014 -0600

----------------------------------------------------------------------
 portal/README.md | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------



[21/24] git commit: Merge pull request #98 from amuramoto/master

Posted by sn...@apache.org.
Merge pull request #98 from amuramoto/master

Fixed help s3 url

Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/72b5753a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/72b5753a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/72b5753a

Branch: refs/pull/96/merge
Commit: 72b5753a057b738898d5a53065c4c27f15f4f27b
Parents: cc610ce 9011d58
Author: Shawn Feldman <sh...@gmail.com>
Authored: Wed Apr 2 11:17:01 2014 -0600
Committer: Shawn Feldman <sh...@gmail.com>
Committed: Wed Apr 2 11:17:01 2014 -0600

----------------------------------------------------------------------
 .../js/libs/usergrid-libs.min.js.orig           |   26 +
 .../dist/usergrid-portal/js/usergrid-dev.min.js |    2 +-
 portal/dist/usergrid-portal/js/usergrid.min.js  |    2 +-
 portal/js/global/help-service.js                |    2 +-
 portal/js/usergrid-dev.min.js.orig              | 4939 ++++++++++++++++++
 portal/js/usergrid.min.js.orig                  |    6 +
 .../js/usergrid-coverage.min.js.BACKUP.31213.js |    6 +
 .../js/usergrid-coverage.min.js.BASE.31213.js   |    6 +
 .../js/usergrid-coverage.min.js.LOCAL.31213.js  |    6 +
 .../js/usergrid-coverage.min.js.REMOTE.31213.js |    0
 10 files changed, 4992 insertions(+), 3 deletions(-)
----------------------------------------------------------------------



[24/24] git commit: Merge e576e0a304999fe9f26c2ab9c3ab4bce8eec326a into 1b4038a5d26a863dece8e21d3e63745686cfe2c5

Posted by sn...@apache.org.
Merge e576e0a304999fe9f26c2ab9c3ab4bce8eec326a into 1b4038a5d26a863dece8e21d3e63745686cfe2c5


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/3bcaa422
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/3bcaa422
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/3bcaa422

Branch: refs/pull/96/merge
Commit: 3bcaa4229114ac3b7475d725cfce2309396707cf
Parents: 1b4038a e576e0a
Author: ryan bridges <ry...@fasterness.com>
Authored: Wed Apr 2 18:32:06 2014 +0000
Committer: ryan bridges <ry...@fasterness.com>
Committed: Wed Apr 2 18:32:06 2014 +0000

----------------------------------------------------------------------
 sdks/html5-javascript/changelog.md              |  13 +-
 sdks/html5-javascript/examples/dogs/app.js      |   6 +-
 sdks/html5-javascript/examples/test/test.js     |  46 +-
 sdks/html5-javascript/index.html                |  12 +-
 sdks/html5-javascript/lib/Usergrid.js           | 171 ++--
 sdks/html5-javascript/lib/modules/Asset.js      |  93 +-
 sdks/html5-javascript/lib/modules/Client.js     | 528 +++++-----
 sdks/html5-javascript/lib/modules/Collection.js | 236 ++---
 sdks/html5-javascript/lib/modules/Counter.js    | 166 ++--
 sdks/html5-javascript/lib/modules/Entity.js     | 470 ++++-----
 sdks/html5-javascript/lib/modules/Error.js      | 112 ++-
 sdks/html5-javascript/lib/modules/Folder.js     |  46 +-
 sdks/html5-javascript/lib/modules/Group.js      | 160 ++-
 sdks/html5-javascript/lib/modules/util/Ajax.js  |  16 +-
 sdks/html5-javascript/lib/modules/util/Event.js |   8 +-
 .../html5-javascript/lib/modules/util/Logger.js |  18 +-
 .../lib/modules/util/Promise.js                 |   5 +-
 sdks/html5-javascript/tests/mocha/test.js       | 107 +-
 sdks/html5-javascript/usergrid.js               | 989 ++++++++++---------
 sdks/html5-javascript/usergrid.min.js           |   6 +-
 20 files changed, 1684 insertions(+), 1524 deletions(-)
----------------------------------------------------------------------



[18/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/9011d58a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BACKUP.31213.js
----------------------------------------------------------------------
diff --git a/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BACKUP.31213.js b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BACKUP.31213.js
new file mode 100644
index 0000000..b59eb7a
--- /dev/null
+++ b/portal/test/coverage/instrument/js/usergrid-coverage.min.js.BACKUP.31213.js
@@ -0,0 +1,6 @@
+/*! usergrid@2.0.2 2014-04-01 */
+angular.module("appservices").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("activities/activities.html",'<section class="row-fluid">\n'+'  <div class="span12">\n'+'    <div class="page-filters">\n'+'      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</section>\n"+'<section class="row-fluid">\n'+'  <div class="span12 tab-content">\n'+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td></td>\n"+"        <td>User</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in activities">\n'+"        <td>{{formatDate(activity.created)}}</td>\n"+'        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n'+"        </td>\n"+"        <td>{{activity.actor.displayName}}</td>\n"+"  
       <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"+"  </div>\n"+"</section>");$templateCache.put("app-overview/app-overview.html",'<div class="app-overview-content" >\n'+'  <section class="row-fluid">\n'+"\n"+'      <page-title title=" Summary" icon="&#128241;"></page-title>\n'+'  <section class="row-fluid">\n'+'      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n'+"  </section>\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span6">\n'+'      <chart id="appOverview"\n'+'             chartdata="appOverview.chart"\n'+'             type="column"></chart>\n'+"    </div>\n"+"\n"+'    <div class="span6">\n'+'      <table class="table table-striped">\n'+'        <tr class="table-header">\n'+"          <td>Path</td>\n"+"          <td>Title</td>\n"+"        </tr>\n"+'        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n'+"          <td
 >{{v.title}}</td>\n"+"          <td>{{v.count}}</td>\n"+"        </tr>\n"+"      </table>\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");$templateCache.put("app-overview/doc-includes/android.html","<h2>1. Integrate the SDK into your project</h2>\n"+"<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n"+"\n"+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+"\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+'		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+"		<p>If you've already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n"+'		<div id="collapse">\n'+'			<a href="#jar_collapse" class="btn" d
 ata-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n'+"		</div>\n"+'		<div id="jar_collapse" class="collapse">\n'+"			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n"+"	\n"+"			<h3>Android 4.0 (or later) projects</h3>\n"+"			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n"+"			\n"+"			<h3>Android 3.0 (or earlier) projects</h3>\n"+"			<ol>\n"+"				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n"+"				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n"+"				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n"+"				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the t
 op of the class path:\n"+"					<ol>\n"+"						<li>In the Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n"+"						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n"+"						<li>\n"+"							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n"+"						</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+'			<div class="warning">\n'+"				<h3>Applications using Ant</h3>\n"+"				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n"+"			</div>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project">\n'+'		<a class="jumplink" name=
 "create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you don't have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ul>\n"+"			<li>Locate the project template in the expanded SDK. It should be at the following location:\n"+"				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"		</ul>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Update permissions in AndroidManifest.xml</h2>\n"+"<p>Add the following Internet permissions to your application's <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n"+"<pre>\n"+'&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n'+'&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n'+'&lt;uses-permission andro
 id:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n'+"</pre>\n"+"<h2>3. Initialize the SDK</h2>\n"+"<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the following:</p>\n"+"<ol>\n"+"	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n"+"		<pre>\n"+"public class YourApplication extends Application\n"+"{\n"+"        \n"+"        private ApigeeClient apigeeClient;\n"+"        \n"+"        public YourApplication()\n"+"        {\n"+"                this.apigeeClient = null;\n"+"        }\n"+"        \n"+"        public ApigeeClient getApigeeClient()\n"+"        {\n"+"                return this.apigeeClient;\n"+"        }\n"+"        \n"+"        public void setApigeeClien
 t(ApigeeClient apigeeClient)\n"+"        {\n"+"                this.apigeeClient = apigeeClient;\n"+"        }\n"+"}			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n"+"		<pre>\n"+"&lt;application&gt;\n"+'    android:allowBackup="true"\n'+'    android:icon="@drawable/ic_launcher"\n'+'    android:label="@string/app_name"\n'+'    android:name=".YourApplication"\n'+"	…\n"+"&lt;/application&gt;			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n"+"		<pre>\n"+"import com.apigee.sdk.ApigeeClient;\n"+"\n"+"@Override\n"+"protected void onCreate(Bundle savedInstanceState) {\n"+"    super.onCreate(savedInstanceState);		\n"+"	\n"+'	String ORGNAME = "{{currentOrg}}";\n'+'	String APPNAME = "{{currentApp}}";\n'+"	\n"+"	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseConte
 xt());\n"+"\n"+"	// hold onto the ApigeeClient instance in our application object.\n"+"	yourApp = (YourApplication) getApplication;\n"+"	yourApp.setApigeeClient(apigeeClient);			\n"+"}\n"+"		</pre>\n"+"		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n"+"	</li>\n"+"</ol>\n"+"<h2>4. Import additional SDK classes</h2>\n"+"<p>The following classes will enable you to call common SDK methods:</p>\n"+"<pre>\n"+"import com.apigee.sdk.data.client.DataClient; //App Services data methods\n"+"import com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\n"+"import com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\n"+"import com.apigee.sdk.data.client.response.ApiResponse; //API response object\n"+"</pre>\n"+"		\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logg
 ing usage, crash and error metrics for your app.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+"<p>To verify that the SDK has been properly initialized, run your app, then go to 'Monitoring' > 'App Usage' in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n"+"		<ul>\n"+"			<li>\n"+"				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n"+"				<p>Use this object to access the data methods of the App Services SDK, inclu
 ding those for push notifications, data store, and geolocation.</p>\n"+"			</li>\n"+"			<li>\n"+"				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n"+"				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n"+"			</li>\n"+"		</ul>\n"+"	</li>	\n"+"	<li>	\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\
 n'+'			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n'+"				<ul>\n"+'					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n'+'					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n'+'					<li><strong>
 <a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n'+"				</ul>		\n"+"			</li>\n"+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>	
 \n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-android-sdk-&lt;version&gt;\n"+"	...\n"+"	/samples\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app
  for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/ios.html","<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n"+'<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+"		<p>If you've already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n"+'		<div id="collapse"><a class="btn" d
 ata-toggle="collapse" href="#framework_collapse">Details</a></div>\n'+'		<div class="collapse" id="framework_collapse">\n'+"			<ol>\n"+"				<li>\n"+"					<p>Locate the SDK framework file so you can add it to your project. For example, you'll find the file at the following path:</p>\n"+"					<pre>\n"+"&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n"+"				</li>\n"+"				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n"+"				<li>Link the Apigee iOS SDK into your project.\n"+"					<ul>\n"+"						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n"+"					</ul>\n"+"					<p>OR</p>\n"+"					<ol>\n"+"						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n"+"						<li>Navigate to the directory that contains ApigeeiOS
 SDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you're starting with a clean slate (you don't have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ol>\n"+"			<li>\n"+"				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n"+"				<pre>\n"+"&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n"+"			<li>Get acquainted with the template by looking at its readme file.</li>\n"+"		</ol>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Add required iOS frameworks</h2>\n"+"<p>Ensure that the following iOS frameworks are part of you
 r project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n"+"<ul>\n"+"	<li>QuartzCore.framework</li>\n"+"	<li>CoreLocation.framework</li>\n"+"	<li>CoreTelephony.framework&nbsp;</li>\n"+"	<li>Security.framework</li>\n"+"	<li>SystemConfiguration.framework</li>\n"+"	<li>UIKit.framework</li>\n"+"</ul>\n"+"<h2>3. Update 'Other Linker Flags'</h2>\n"+"<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n"+"<pre>\n"+"-ObjC -all_load</pre>\n"+"<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n"+"<h2>4. Initialize the SDK</h2>\n"+'<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Gett
 ing Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n'+"<ol>\n"+"	<li>Import the SDK\n"+"		<p>Add the following to your source code to import the SDK:</p>\n"+"		<pre>\n"+"#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n"+"		<pre>\n"+"@property (strong, nonatomic) ApigeeClient *apigeeClient; \n"+"@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n"+"@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n"+"		</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n"+"		<pre>\n"+"//Replace 'AppDelegate' with the name of your app delegate class to instantiate it\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"\n"
 +"//Sepcify your App Services organization and application names\n"+'NSString *orgName = @"{{currentOrg}}";\n'+'NSString *appName = @"{{currentApp}}";\n'+"\n"+"//Instantiate ApigeeClient to initialize the SDK\n"+"appDelegate.apigeeClient = [[ApigeeClient alloc]\n"+"                            initWithOrganizationId:orgName\n"+"                            applicationId:appName];\n"+"                            \n"+"//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\n"+"self.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \n"+"self.dataClient = [appDelegate.apigeeClient dataClient]; \n"+"		</pre>\n"+"	</li>\n"+"</ol>\n"+"\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to
  <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>	\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n'+'		<div class="collapse" id="client_collapse">\n'+"			<ul>\n"+"				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifi
 cations, data store, and geolocation.</li>\n"+"				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"			<h3>Example</h3>\n"+"			<p>For example, you could create a new entity with the following:</p>\n"+"			<pre>\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"ApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n"+"			</pre>\n"+"		</div>\n"+"\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications<
 /a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+'		<p>The SDK includes samples that illust
 rate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n'+"		<p>You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-ios-sdk-&lt;version&gt;\n"+"    ...\n"+"    /samples\n"+"		</pre>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n'+'		<div class="collapse" id="samples_collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Ap
 igee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"		<p>&nbsp;</p>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/javascript.html","<h2>1. Import the SDK into your HTML</h2>\n"+"<p>To enable support for Apigee-related functions in your HTML, you'll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n"+"<pre>\n"+'&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n'+"</pre>\n"+"<h2>2. Instantiate Apigee.Clien
 t</h2>\n"+"<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n"+"<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n"+"<pre>\n"+"//Apigee account credentials, available in the App Services admin portal \n"+"var client_creds = {\n"+"        orgName:'{{currentOrg}}',\n"+"        appName:'{{currentApp}}'\n"+"    }\n"+"\n"+"//Initializes the SDK. Also instantiates Apigee.MonitoringClient\n"+"var dataClient = new Apigee.Client(client_creds);  \n"+"</pre>\n"+"\n"+"<h2>3. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https:
 //www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>	\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n"+'		<div id="collapse">\n'+'			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="client_collapse" class="collapse">\n'+"			<ul>\n"+"				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n"+"				<li><code>dataClient.monitor</code>: Used
  to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"		</div>\n"+"	</li>	\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n'+'			<li><strong>
 <a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-javascript-sdk-master\n"+"    ...\n"+"    /samples		\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\
 n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>booksSample.html</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>monitoringSample.html</td>\n"+"						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>readmeSample.html</td>\n"+"						<td>A simple app for reading data from
  an Apigee database.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>	\n"+"	</li>				\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/net.html","");$templateCache.put("app-overview/doc-includes/node.html","");$templateCache.put("app-overview/doc-includes/ruby.html","");$templateCache.put("app-overview/getting-started.html",'<div class="setup-sdk-content" >\n'+"\n"+'  <bsmodal id="regenerateCredentials"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="regenerateCredentialsDialog"\n'+'           extrabuttonlabel="Yes"\n'+"           ng-cloak>\n"+"    Are you sure you want to regenerate the credentials?\n"+"  </bsmodal>\n"+"\n"+'    <page-title icon="&#128640;" title="Getting Started"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+"\n"+"\n"+"\n"+'    <div class="span8">\n'+"\n"+'      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n'+"      <p>Cli
 ck on a platform icon below to view SDK installation instructions for that platform.</p>\n"+'      <ul class="inline unstyled">\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n'+"\n"+"\n"+"        <li ng-click=\"showSDKDetail('ios')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n'+"        <li ng-click=\"showSDKDetail('android')\"\n"+'            analytics-on="click"\n'+'            anal
 ytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n'+"        <li ng-click=\"showSDKDetail('javascript')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apige
 e.com/docs/usergrid/content/sdks-and-examples#ruby"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n'+"       </ul>\n"+"\n"+'      <section id="intro-container" class="row-fluid intro-container">\n'+"\n"+'        <div class="sdk-intro">\n'+"        </div>\n"+"\n"+'        <div class="sdk-intro-content">\n'+"\n"+'          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" targ
 et="_blank">\n'+"            Download SDK\n"+"          </a>\n"+'          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n'+"            More Docs\n"+"          </a>\n"+'          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n'+"\n"+'          <div ng-include="getIncludeURL()"></div>\n'+"        </div>\n"+"\n"+"      </section>\n"+"    </div>\n"+"\n"+'    <div class="span4 keys-creds">\n'+'      <h2 class="title">Mobile sdk keys</h2>\n'+"      <p>For mobile SDK initialization.</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Org Name</dt>\n"+"        <dd>{{currentOrg}}</dd>\n"+"        <dt>App Name</dt>\n"+"        <dd>{{currentApp}}</dd>\n"+"      </dl>\n"+'      <h2 class="title">Server app credentials</h2>\n'+"      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Client ID</dt>\n"+"        <dd>{{clientID}}</dd>\n"+"        <dt>Client Secret</
 dt>\n"+"        <dd>{{clientSecret}}</dd>\n"+"        <dt>\n"+"           &nbsp;\n"+"        </dt>\n"+"        <dd>&nbsp;</dd>\n"+"\n"+"        <dt>\n"+'          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n'+"        </dt>\n"+"        <dd></dd>\n"+"      </dl>\n"+"\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");
+$templateCache.put("data/data.html",'<div class="content-page">\n'+"\n"+'  <bsmodal id="newCollection"\n'+'           title="Create new collection"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newCollectionDialog"\n'+'           extrabuttonlabel="Create"\n'+'           buttonid="collection"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="new-collection-name">Collection Name:</label>\n'+'        <div class="controls">\n'+'          <input type="text" ug-validate required ng-pattern="collectionNameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n'+'          <p class="help-block hide"></p>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <page-title title=" Collections" icon="&#128254;"></page-title>\n'+"\n"+'  <section class="row-
 fluid">\n'+'    <div class="span3 user-col">\n'+'        <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n'+'        <ul  class="user-list">\n'+"          <li ng-class=\"queryCollection._type === entity.name ? 'selected' : ''\" ng-repeat=\"entity in collectionList\" ng-click=\"loadCollection('/'+entity.name);\">\n"+'            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n'+"          </li>\n"+"        </ul>\n"+"\n"+"  </div>\n"+"\n"+'    <div class="span9 tab-content">\n'+'      <div class="content-page">\n'+'      <form name="dataForm" ng-submit="run();">\n'+"        <fieldset>\n"+'          <div class="control-group">\n'+'            <div class="" data-toggle="buttons-radio">\n'+'              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n'+"              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n"+'      
         <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n'+'              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n'+'              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n'+'              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n'+'              <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE\n'+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group">\n'+"            <strong>Path </strong>\n"+'            <div class="contr
 ols">\n'+'              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n'+"            </div>\n"+"          </div>\n"+'          <div class="control-group">\n'+'            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n'+"          </div>\n"+'          <div class="control-group">\n'+"            <strong>Query</strong>\n"+'            <div class="controls">\n'+'              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n'+'              <div style="display:none">\n'+'                <a class="btn dropdown-toggle " data-toggle="dropdown">\n'+'                  <span id="query-collections-caret" class="caret"></span>\n'+"                </a>\n"+'                <ul id="query-collections-indexes-li
 st" class="dropdown-menu ">\n'+"                </ul>\n"+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+"\n"+"          <div class=\"control-group\" ng-show=\"verb=='GET' || verb=='DELETE'\">\n"+'            <label class="control-label" for="query-limit"><strong>Limit</strong> <a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'              <div class="input-append">\n'+'                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n'+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group" style="display:{{queryBodyDisplay}}">\n'+'            <label class="control-label" for="query-source"><strong>JSON Body</strong> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'            <textarea ng-
 model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n'+'      { "name":"value" }\n'+"            </textarea>\n"+"              <br>\n"+'            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"            </div>\n"+"          </div>\n"+'          <div style="clear: both; height: 10px;"></div>\n'+'          <div class="control-group">\n'+'            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n'+"          </div>\n"+"        </fieldset>\n"+"       </form>\n"+"        <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n"+"        <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n"+"        <div ng-include=\"display=='groups' ? 'data/display-groups.html' : ''\"></div>\n"+"        <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n"+"\n"+"
       </div>\n"+"\n"+"      </div>\n"+"    </section>\n"+"\n"+"\n"+"\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/display-generic.html","\n"+"\n"+'<bsmodal id="deleteEntities"\n'+'         title="Are you sure you want to delete the entities(s)?"\n'+'         close="hideModal"\n'+'         closelabel="Cancel"\n'+'         extrabutton="deleteEntitiesDialog"\n'+'         extrabuttonlabel="Delete"\n'+'         buttonid="del-entity"\n'+"         ng-cloak>\n"+"    <fieldset>\n"+'        <div class="control-group">\n'+"        </div>\n"+"    </fieldset>\n"+"</bsmodal>\n"+"\n"+'<span  class="button-strip">\n'+'  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n'+"</span>\n"+'<table class="table table-striped collection-list">\n'+"  <thead>\n"+'  <tr class="table-header">\n'+'    <th><input type="checkbox" ng-show="queryCollection._list.l
 ength > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n'+"    <th ng-if=\"hasProperty('name')\">Name</th>\n"+"    <th>UUID</th>\n"+"    <th></th>\n"+"  </tr>\n"+"  </thead>\n"+'  <tbody ng-repeat="entity in queryCollection._list">\n'+'  <tr class="zebraRows" >\n'+"    <td>\n"+"      <input\n"+'        type="checkbox"\n'+'        id="entity-{{entity._data.name}}-cb"\n'+'        ng-value="entity._data.uuid"\n'+'        ng-model="entity.checked"\n'+"        >\n"+"    </td>\n"+"    <td ng-if=\"hasProperty('name')\">{{entity._data.name}}</td>\n"+"    <td>{{entity._data.uuid}}</td>\n"+"    <td><a href=\"javaScript:void(0)\" ng-click=\"entitySelected[$index] = !entitySelected[$index];selectEntity(entity._data.uuid)\">{{entitySelected[$index] ? 'Hide' : 'View'}} Details</a></td>\n"+"  </tr>\n"+'  <tr ng-if="entitySelected[$index]">\n'+'    <td colspan="5">\n'+"\n"+"\n"+'      <h4 style="m
 argin: 0 0 20px 0">Entity Detail</h4>\n'+"\n"+"\n"+'      <ul class="formatted-json">\n'+'        <li ng-repeat="(k,v) in entity._data track by $index">\n'+'          <span class="key">{{k}} :</span>\n'+"          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n"+'          <span ng-switch on="isDeep(v)">\n'+'            <ul ng-switch-when="true">\n'+'              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n'+"\n"+'                <span ng-switch on="isDeep(v2)">\n'+'                  <ul ng-switch-when="true">\n'+'                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n'+"                  </ul>\n"+'                  <span ng-switch-when="false">\n'+'                    <span class="value">{{v2}}</span>\n'+"                  </span>\n"+"                </span>\n"+"              </li>\n"+"            </ul>\n"+'            <span ng-switch-when="false">\n'+'   
            <span class="value">{{v}}</span>\n'+"            </span>\n"+"          </span>\n"+"        </li>\n"+"      </ul>\n"+"\n"+'    <div class="control-group">\n'+'      <h4 style="margin: 20px 0 20px 0">Edit Entity</h4>\n'+'      <div class="controls">\n'+'        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n'+"        <br>\n"+'        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n'+"      </div>\n"+"    </div>\n"+"  </td>\n"+"  </tr>\n"+"\n"+'  <tr ng-show="queryCollection._list.length == 0">\n'+'    <td colspan="4">No data found</td>\n'+"  </tr>\n"+"  </tbody>\n"+"</table>\n"+'<div style="padding: 10px 5px 10px 5px">\n'+'  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'  <button class="btn btn-primary toolbar"
  ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"</div>\n"+"\n");$templateCache.put("data/display-groups.html","");$templateCache.put("data/display-roles.html","roles---------------------------------");$templateCache.put("data/display-users.html","\n"+'<table id="query-response-table" class="table">\n'+"  <tbody>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n'+'    <td class="gravatar50-td">&nbsp;</td>\n'+'    <td class="user-details bold-header">Username</td>\n'+'    <td class="user-details bold-header">Display Name</td>\n'+'    <td class="user-details bold-header">UUID</td>\n'+'    <td class="view-details">&nbsp;</td>\n'+"  </tr>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf
 44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"    </td>\n"+'    <td class="gravatar50-td">\n'+'      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n'+"    </td>\n"+'    <td class="details">\n'+"      <a onclick=\"Usergrid.console.getCollection('GET', '/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/'+'bf9a95da-d508-11e2-bf44-236d2eee13a7'); $('#data-explorer').show(); return false;\" class=\"view-details\">10</a>\n"+"    </td>\n"+'    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n'+'    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n'+'    <td class="view-details">\n'+'      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n'+"    </td>\n"+"  </tr>\n"+'  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+'    <t
 d colspan="5">\n'+"      <div>\n"+'        <div style="padding-bottom: 10px;">\n'+'          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n'+'          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n'+"        </div>\n"+'        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"              <pre>{\n"+'  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n'+'  "uuid": "bf9a95da-d508-11e2-bf4
 4-236d2eee13a7",\n'+'  "type": "user",\n'+'  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n'+'  "created": 1371224432557,\n'+'  "modified": 1371851347024,\n'+'  "username": "10",\n'+'  "email": "fdsafdsa@ookfd.com",\n'+'  "activated": "true",\n'+'  "adr": {\n'+'    "addr1": "",\n'+'    "addr2": "",\n'+'    "city": "",\n'+'    "state": "",\n'+'    "zip": "",\n'+'    "country": ""\n'+"  },\n"+'  "metadata": {\n'+'    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n'+'    "sets": {\n'+'      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n'+'      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n'+"    },\n"+'    "collections": {\n'+'      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n'+'      "devices": "/user
 s/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n'+'      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n'+'      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n'+'      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n'+'      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n'+'      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n'+"    }\n"+"  },\n"+'  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n'+"}</pre>\n"+"        </div>\n"+'        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+"          <table>\n"+"            <tbody>\n"+"            <tr>\n"+"           
    <td>picture</td>\n"+'              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>
 </td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031
 a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n'+"            </tr>\n"+"            </tbody>\n"+"          </table>\n"+"        </div>\n"+"      </div>\n"+"    </td>\n"+"  </tr>\n"+"  </tbody>\n"+"</table>");$templateCache.put("data/entity.html",'<div class="content-page">\n'+"\n"+"  <h4>Entity Detail</h4>\n"+'  <div class="well">\n'+'    <a href="#!/data" class="outside-link"><< Back to collection</a>\n'+"  </div>\n"+"  <fieldset>\n"+'    <div class="control-group">\n'+"      <strong>Path </strong>\n"+'      <div class="controls">\n'+"        {{entityT
 ype}}/{{entityUUID}}\n"+"      </div>\n"+"    </div>\n"+"\n"+'    <div class="control-group">\n'+'      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n'+'      <div class="controls">\n'+'        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n'+"        <br>\n"+'        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"      </div>\n"+"    </div>\n"+'    <div style="clear: both; height: 10px;"></div>\n'+'    <div class="control-group">\n'+'      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n'+'      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n'+"    </div>\n"+"  </fieldset>\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/shell.html",'<div class="content-page">\n'+'  <div class="well">\n'+"    <h2>Interactive Shell</h2>\n"+'    <div style="float:right"><a target="
 _blank" href="http://apigee.com/docs/usergrid/content/usergrid-admin-portal" class="notifications-links">Learn more in our docs</a></div>\n'+"  </div>\n"+"\n"+'  <div class="console-section-contents">\n'+'    <div id="shell-input-div">\n'+'      <p>   Type "help" to view a list of the available commands.</p><hr>\n'+"      <span>&nbsp;&gt;&gt; </span>\n"+'      <!--textarea id="shell-input" rows="2" autofocus="autofocus"></textarea-->\n'+"    </div>\n"+'    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;"><span class="pln">                      </span><p><span class="pln">  </span><span class="typ">Response</span><span class="pun">:</span></p><hr><span class="pln">\n'+"    </span></pre>\n"+"  </div>\n"+"</div>");$templateCache.put("dialogs/modal.html",'    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n'+'        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n'+"\n"+'        <div cl
 ass="modal-header">\n'+'            <h1 class="title">{{title}}</h1>\n'+"        </div>\n"+"\n"+'        <div class="modal-body" ng-transclude></div>\n'+'        <div class="modal-footer">\n'+"            {{footertext}}\n"+'            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n'+'            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n'+'                    ng-click="closeDelegate(close)">{{closelabel}}\n'+"            </button>\n"+"        </div>\n"+"        </form>    </div>\n");$templateCache.put("global/appswitcher-template.html",'<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n'+'  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n'+'  <ul class="dropdown-menu pull-right">\n'+'    <li id="globalNavSubmenuContainer">\n'+"      <ul>\n"+'        <li data-globalNav
 Detail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n'+"      </ul>\n"+"    </li>\n"+'    <li id="globalNavDetail">\n'+'      <div id="globalNavDetailApigeeHome">\n'+'        <div class="globalNavDetailApigeeLogo"></div>\n'+'        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailAppServices">\n'+'        <div class="globalNavDetailSubtitle">For App De
 velopers</div>\n'+'        <div class="globalNavDetailTitle">App Services</div>\n'+'        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiPlatform">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Platform</div>\n'+'        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiConsoles">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Consoles</div>\n'+'        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n'+"      </div>\n"+"    </li>\n"+"  </ul>\n"+"</li>");$templateCache.put("global/insecure-banner.html
 ",'<div ng-if="securityWarning" ng-cloak class="demo-holder">\n'+'    <div class="alert alert-demo alert-animate">\n'+'        <div class="alert-text">\n'+'            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n'+"        </div>\n"+"    </div>\n"+"</div>");$templateCache.put("global/page-title.html",'<section class="row-fluid">\n'+'    <div class="span12">\n'+'        <div class="page-filters">\n'+'            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n'+"        </div>\n"+"    </div>\n"+'    <bsmodal id="need-help"\n'+'             title="Need Help?"\n'+'
              close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="sendHelp"\n'+'             extrabuttonlabel="Get Help"\n'+"             ng-cloak>\n"+"        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n"+"    </bsmodal>\n"+"</section>\n"+"\n");$templateCache.put("groups/groups-activities.html",'<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n'+"\n"+"  <br>\n"+"  <div>\n"+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n'+"        <td>{{activity.createdDate}}</td>\n"+"        <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"
 +"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-details.html",'<div class="content-page" ng-controller="GroupsDetailsCtrl">\n'+"\n"+"  <div>\n"+'      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n'+'          <div style="float: left; padding-right: 30px;">\n'+'              <h4 class="ui-dform-legend">Group Information</h4>\n'+'              <label for="group-title" class="ui-dform-label">Group Title</label>\n'+'              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n'+"              <br/>\n"+'            <label for="group-path" class="ui-dform-label">Group Path</label>\n'+'            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n'+"            <br/>\n"+"    
       </div>\n"+'          <br style="clear:both"/>\n'+"\n"+'          <div style="width:100%;float:left;padding: 20px 0">\n'+'              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n'+"          </div>\n"+"\n"+'          <div class="content-container">\n'+"              <h4>JSON Group Object</h4>\n"+"              <pre>{{json}}</pre>\n"+"          </div>\n"+"      </form>\n"+"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-members.html",'<div class="content-page" ng-controller="GroupsMembersCtrl">\n'+"\n"+"\n"+'  <bsmodal id="removeFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="removeUsersFromGroupDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the users from the seleted group(s)?</p>\n"+"  </bsmodal>\n"+"
 \n"+'  <bsmodal id="addGroupToUser"\n'+'           title="Add user to group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToUserDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.user != '' ? $parent.user.username : 'Select a user...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasMembers 
 || !valueSelected(groupsCollection.users._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n'+"  </div>\n"+'  <table class="table table-striped">\n'+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n'+'      <td style="width: 50px;"></td>\n'+"      <td>Username</td>\n"+"      <td>Display Name</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="user.checked"\n'+"          >\n"+"      </td>\n"+'      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n'+"      <td>{{user.get('username')}}</td>\n"+"      <td>{{user.get('name')}}</td>\n"+"    </tr>\n"+"  </table>\n"+'  <div style=
 "padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"  </div>\n"+"</div>");$templateCache.put("groups/groups-roles.html",'<div class="content-page" ng-controller="GroupsRolesCtrl">\n'+"\n"+'  <bsmodal id="addGroupToRole"\n'+'           title="Add group to role"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToRoleDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.name != '' ? $parent.name : 'Role name...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-
 repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="leaveRoleFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="leaveRoleDialog"\n'+'           extrabuttonlabel="Leave"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the group from the role(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n'+"  </div>\n"+"  <h4>Roles</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-head
 er">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" ></td>\n'+"      <td>Role Name</td>\n"+"      <td>Role title</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="role.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{role._data.name}}</td>\n"+"      <td>{{role._data.title}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+'  <div style="padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n'+"  </div>\n"+"\n"+"\n"+'  <bsmodal 
 id="deletePermission"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupPermissionDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the permission(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <bsmodal id="addPermission"\n'+'           title="New Permission"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupPermissionDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /></p>\n'+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <inpu
 t type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n'+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n'+"  </div>\n"+"  <h4>Permissions</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAll
 Entities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n'+"      <td>Path</td>\n"+"      <td>GET</td>\n"+"      <td>POST</td>\n"+"      <td>PUT</td>\n"+"      <td>DELETE</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="permission.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{permission.path}}</td>\n"+"      <td>{{permission.operations.get}}</td>\n"+"      <td>{{permission.operations.post}}</td>\n"+"      <td>{{permission.operations.put}}</td>\n"+"      <td>{{permission.operations.delete}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+"\n"+"</div>");
+$templateCache.put("groups/groups-tabs.html",'<div class="content-page">\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span12">\n'+'      <div class="page-filters">\n'+'        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n'+"      </div>\n"+"    </div>\n"+"\n"+"  </section>\n"+"\n"+'  <div id="user-panel" class="panel-buffer">\n'+'    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n'+'      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n'+'      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n'+'      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n'+'      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n'+'      <li ng-class="rolesSelected"><a href="javaScript:v
 oid(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n'+"    </ul>\n"+"  </div>\n"+"\n"+'  <div style="float: left; margin-right: 10px;">\n'+'    <div style="float: left;">\n'+"      <div class=\"user-header-title\"><strong>Group Path: </strong>{{selectedGroup.get('path')}}</div>\n"+"      <div class=\"user-header-title\"><strong>Group Title: </strong>{{selectedGroup.get('title')}}</div>\n"+"    </div>\n"+"  </div>\n"+"</div>\n"+"<br>\n"+"<br>\n");$templateCache.put("groups/groups.html",'<div class="content-page">\n'+"\n"+'  <page-title title=" Groups" icon="&#128101;"></page-title>\n'+'  <bsmodal id="newGroup"\n'+'           title="New Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newGroupDialog"\n'+'           extrabuttonlabel="Add"\n'+'           ng-model="dialog"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="title">Title</label>\n'+'    
     <div class="controls">\n'+'          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label for="path">Path</label>\n'+'        <div class="controls">\n'+'          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="deleteGroup"\n'+'           title="Delete Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupsDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the group(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <section class=
 "row-fluid">\n'+'    <div class="span3 user-col">\n'+"\n"+'      <div class="button-toolbar span12">\n'+'        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n'+'        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n'+'        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n'+"      </div>\n"+'      <ul class="user-list">\n'+'        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n'+"          <input\n"+'              type="checkbox"\n'+'              ng-value="group
 ._data.uuid"\n'+'              ng-checked="group.checked"\n'+'              ng-model="group.checked"\n'+"              >\n"+"          <a href=\"javaScript:void(0)\" >{{group.get('title')}}</a>\n"+"          <br/>\n"+"          <span ng-if=\"group.get('path')\" class=\"label\">Path:</span>/{{group.get('path')}}\n"+"        </li>\n"+"      </ul>\n"+"\n"+"\n"+'      <div style="padding: 10px 5px 10px 5px">\n'+'        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"      </div>\n"+"\n"+"    </div>\n"+"\n"+'    <div class="span9 tab-content" ng-show="selectedGroup.get" >\n'+'      <div class="menu-toolbar">\n'+'        <ul class="inline" >\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click
 ="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a></li>\n'+"        </ul>\n"+"      </div>\n"+'      <span ng-include="currentGroupsPage.template"></span>\n'+"\n"+"  </section>\n"+"</div>\n");$templateCache.put
 ("login/forgot-password.html",'<div class="login-content" ng-controller="ForgotPasswordCtrl">\n'+'	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n'+'	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n'+'	<button class="btn btn-primary" ng-click="">Reset Password</button>\n'+"</div>\n");$templateCache.put("login/loading.html","\n"+"\n"+"<h1>Loading...</h1>");$templateCache.put("login/login.html",'<div class="login-content">\r'+"\n"+'  <bsmodal id="sendActivationLink"\r'+"\n"+'           title="Resend Activation Link"\r'+"\n"+'           close="hideModal"\r'+"\n"+'           closelabel="Cancel"\r'+"\n"+'           extrabutton="resendActivationLink"\r'+"\n"+'           extrabuttonlabel="Send Activation"\r'+"\n"+"           ng-cloak>\r"+"\n"+"    <fieldset>\r"+"\n"+'      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-patter
 n="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r'+"\n"+"    </fieldset>\r"+"\n"+"  </bsmodal>\r"+"\n"+'  <div class="login-holder">\r'+"\n"+'  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r'+"\n"+'    <h1 class="title">Enter your credentials</h1>\r'+"\n"+'    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r'+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-username">Email or Username:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-password">Password:</
 label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group" ng-show="requiresDeveloperKey">\r'+"\n"+'      <label class="control-label" for="login-developerkey">Developer Key:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="form-actions">\r'+"\n"+'      <div class="submit">\r'+"\n"+'        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+"  </form>\r"+"\n"+"  </div>\r"+
 "\n"+'  <div class="extra-actions">\r'+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r'+"\n"+'         class="btn btn-primary pull-left">Register</a>\r'+"\n"+"    </div>\r"+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="button-forgot-password"\r'+"\n"+'         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r'+"\n"+"    </div>\r"+"\n"+'    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r'+"\n"+'       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r'+"\n"+"  </div>\r"+"\n"+'  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r'+"\n"+"</div>\r"+"\n");$templateCache.put("login/logout.html",'<div id="logut">Logging out...</div>');$templateCache.put("login/register.html",'<div class="signUp-content">\n'+'  <div class="signUp-
 holder">\n'+'    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n'+'      <h1 class="title">Register</h1>\n'+"\n"+'      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n'+'      <div class="control-group">\n'+'        <label class="control-label" for="register-orgName">Organization:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-name">Name:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class=""
  size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-userName">Username:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-email">Email:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-password">Password:</label>\n'+"\n"+'        <div
  class="controls">\n'+'          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n'+'                 size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPassword" ug-validate class="" size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="form-actions">\n'+'        <div class="submit">\n'+'          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n'+'                 class="btn btn-primary pull-right">\n'+"        </div>\n"+'        <div class="submit">\n'+'          <a ng-click="cancel()" type="submi
 t" name="button-cancel" id="button-cancel"\n'+'             class="btn btn-primary pull-right">Cancel</a>\n'+"        </div>\n"+"      </div>\n"+"    </form>\n"+'    <div class="console-section well thingy" ng-show="signUpSuccess">\n'+'      <span class="title">We\'re holding a seat for you!</span>\n'+"      <br><br>\n"+"\n"+"      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we're ready for\n"+"        you!</p>\n"+"\n"+"      <p>In the mean time, you can stay up to date with App Services on our <a\n"+'          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleGroup</a>.</p>\n'+"\n"+'      <p> <a href="#!/login">Back to login</a></p>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</div>\n");$templateCache.put("menus/appMenu.html",'<ul id="app-menu" class="nav top-nav span12">\n'+'    <li class="span7">\n'+'      <bsmodal id="newApplication"\n'+'               title="Create New Application"\n'+'               close="hideM
 odal"\n'+'               closelabel="Cancel"\n'+'               extrabutton="newApplicationDialog"\n'+'               extrabuttonlabel="Create"\n'+'               buttonid="app"\n'+"               ng-cloak>\n"+'        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n'+'        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n'+'        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n'+"      </bsmodal>\n"+'        <div class="btn-group">\n'+'            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n'+'                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n'+'                <span class="caret"></span>\n'+"            </a>\n"+'            <ul class="dro
 pdown-menu app-nav">\n'+'                <li name="app-selector" ng-repeat="app in applications">\n'+'                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n'+"                </li>\n"+"            </ul>\n"+"        </div>\n"+"    </li>\n"+'    <li class="span5">\n'+'      <a ng-if="activeUI"\n'+'         class="btn btn-create zero-out pull-right"\n'+"         ng-click=\"showModal('newApplication')\"\n"+'         analytics-on="click"\n'+'         analytics-category="App Services"\n'+'         analytics-label="Button"\n'+'         analytics-event="Add New App"\n'+"        >\n"+'        <i class="pictogram">&#8862;</i>\n'+"        Add New App\n"+"      </a>\n"+"    </li>\n"+"</ul>");$templateCache.put("menus/orgMenu.html",'<ul class="nav top-nav org-nav">\n'+"  <li>\n"+'<div class="btn-group ">\n'+'    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n'+'        <i class="pictogram
 ">&#128193</i> {{currentOrg}}<span class="caret"></span>\n'+"        </a>\n"+'    <ul class="dropdown-menu org-nav">\n'+'          <li name="org-selector" ng-repeat="(k,v) in organizations">\n'+'              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n'+"            </li>\n"+"         </ul>\n"+"    </div>\n"+"  </li></ul>");$templateCache.put("org-overview/org-overview.html",'<div class="org-overview-content" ng-show="activeUI">\n'+"\n"+'  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'  <div class="span6">\n'+'  	<bsmodal id="introjs"\n'+'             title="Welcome to the API BaaS Admin Portal"\n'+'             close="hideModal"\n'+'             closelabel="Skip"\n'+'             extrabutton="startFirstTimeUser"\n'+'             extrabuttonlabel="Take the tour"\n'+"             ng-cloak>\n"+"      <p>To get started, click 'Take the tour' for a full walkth
 rough of the admin portal, or click 'Skip' to start working right away.</p>\n"+"    </bsmodal>\n"+'		<div id="intro-4-current-org">	\n'+'	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n'+'	    <table class="table table-striped">\n'+"	      <tr>\n"+'	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n'+'	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n"+"\n"+'    <bsmodal id="newApplication"\n'+'             title="Create New Application"\n'+'             close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="newApplicationDialog"\n'+'             extrabuttonlabel="Create"\n'+"             ng-cloak>\n"+'      <p>New application name: <input ng-model="$parent.newApp.name"
   ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n'+"    </bsmodal>\n"+'		<div id="intro-5-applications">		\n'+'	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n'+'	      <div class="header-button btn-group pull-right">\n'+"	        <a class=\"btn filter-selector\" style=\"{{applicationsSize === 10 ? 'width:290px':''}}\"  ng-click=\"showModal('newApplication')\">\n"+'	          <span class="filter-label">Add New App</span>\n'+"	        </a>\n"+"	      </div>\n"+"	    </h2>\n"+"		\n"+'	    <table class="table table-striped">\n'+'	      <tr ng-repeat="application in applications">\n'+"	        <td>{{application.name}}</td>\n"+'	        <td style="text-align: right">{{application.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n
 "+'    <bsmodal id="regenerateCredentials"\n'+'             title=

<TRUNCATED>

[02/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/test/coverage/instrument/js/usergrid-coverage.min.js
----------------------------------------------------------------------
diff --git a/portal/test/coverage/instrument/js/usergrid-coverage.min.js b/portal/test/coverage/instrument/js/usergrid-coverage.min.js
index e00934e..b59eb7a 100644
--- a/portal/test/coverage/instrument/js/usergrid-coverage.min.js
+++ b/portal/test/coverage/instrument/js/usergrid-coverage.min.js
@@ -1,4 +1,4 @@
-/*! usergrid@2.0.2 2014-03-31 */
+/*! usergrid@2.0.2 2014-04-01 */
 angular.module("appservices").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("activities/activities.html",'<section class="row-fluid">\n'+'  <div class="span12">\n'+'    <div class="page-filters">\n'+'      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</section>\n"+'<section class="row-fluid">\n'+'  <div class="span12 tab-content">\n'+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td></td>\n"+"        <td>User</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in activities">\n'+"        <td>{{formatDate(activity.created)}}</td>\n"+'        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n'+"        </td>\n"+"        <td>{{activity.actor.displayName}}</td>\n"+"  
       <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"+"  </div>\n"+"</section>");$templateCache.put("app-overview/app-overview.html",'<div class="app-overview-content" >\n'+'  <section class="row-fluid">\n'+"\n"+'      <page-title title=" Summary" icon="&#128241;"></page-title>\n'+'  <section class="row-fluid">\n'+'      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n'+"  </section>\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span6">\n'+'      <chart id="appOverview"\n'+'             chartdata="appOverview.chart"\n'+'             type="column"></chart>\n'+"    </div>\n"+"\n"+'    <div class="span6">\n'+'      <table class="table table-striped">\n'+'        <tr class="table-header">\n'+"          <td>Path</td>\n"+"          <td>Title</td>\n"+"        </tr>\n"+'        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n'+"          <td
 >{{v.title}}</td>\n"+"          <td>{{v.count}}</td>\n"+"        </tr>\n"+"      </table>\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");$templateCache.put("app-overview/doc-includes/android.html","<h2>1. Integrate the SDK into your project</h2>\n"+"<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n"+"\n"+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+"\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+'		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+"		<p>If you've already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n"+'		<div id="collapse">\n'+'			<a href="#jar_collapse" class="btn" d
 ata-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n'+"		</div>\n"+'		<div id="jar_collapse" class="collapse">\n'+"			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n"+"	\n"+"			<h3>Android 4.0 (or later) projects</h3>\n"+"			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n"+"			\n"+"			<h3>Android 3.0 (or earlier) projects</h3>\n"+"			<ol>\n"+"				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n"+"				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n"+"				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n"+"				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the t
 op of the class path:\n"+"					<ol>\n"+"						<li>In the Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+"						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n"+"						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n"+"						<li>\n"+"							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n"+"						</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+'			<div class="warning">\n'+"				<h3>Applications using Ant</h3>\n"+"				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n"+"			</div>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project">\n'+'		<a class="jumplink" name=
 "create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you don't have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ul>\n"+"			<li>Locate the project template in the expanded SDK. It should be at the following location:\n"+"				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"		</ul>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Update permissions in AndroidManifest.xml</h2>\n"+"<p>Add the following Internet permissions to your application's <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n"+"<pre>\n"+'&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n'+'&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n'+'&lt;uses-permission andro
 id:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n'+'&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n'+"</pre>\n"+"<h2>3. Initialize the SDK</h2>\n"+"<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the following:</p>\n"+"<ol>\n"+"	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n"+"		<pre>\n"+"public class YourApplication extends Application\n"+"{\n"+"        \n"+"        private ApigeeClient apigeeClient;\n"+"        \n"+"        public YourApplication()\n"+"        {\n"+"                this.apigeeClient = null;\n"+"        }\n"+"        \n"+"        public ApigeeClient getApigeeClient()\n"+"        {\n"+"                return this.apigeeClient;\n"+"        }\n"+"        \n"+"        public void setApigeeClien
 t(ApigeeClient apigeeClient)\n"+"        {\n"+"                this.apigeeClient = apigeeClient;\n"+"        }\n"+"}			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n"+"		<pre>\n"+"&lt;application&gt;\n"+'    android:allowBackup="true"\n'+'    android:icon="@drawable/ic_launcher"\n'+'    android:label="@string/app_name"\n'+'    android:name=".YourApplication"\n'+"	…\n"+"&lt;/application&gt;			\n"+"		</pre>\n"+"	</li>\n"+"	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n"+"		<pre>\n"+"import com.apigee.sdk.ApigeeClient;\n"+"\n"+"@Override\n"+"protected void onCreate(Bundle savedInstanceState) {\n"+"    super.onCreate(savedInstanceState);		\n"+"	\n"+'	String ORGNAME = "{{currentOrg}}";\n'+'	String APPNAME = "{{currentApp}}";\n'+"	\n"+"	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseConte
 xt());\n"+"\n"+"	// hold onto the ApigeeClient instance in our application object.\n"+"	yourApp = (YourApplication) getApplication;\n"+"	yourApp.setApigeeClient(apigeeClient);			\n"+"}\n"+"		</pre>\n"+"		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n"+"	</li>\n"+"</ol>\n"+"<h2>4. Import additional SDK classes</h2>\n"+"<p>The following classes will enable you to call common SDK methods:</p>\n"+"<pre>\n"+"import com.apigee.sdk.data.client.DataClient; //App Services data methods\n"+"import com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\n"+"import com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\n"+"import com.apigee.sdk.data.client.response.ApiResponse; //API response object\n"+"</pre>\n"+"		\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logg
 ing usage, crash and error metrics for your app.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+"<p>To verify that the SDK has been properly initialized, run your app, then go to 'Monitoring' > 'App Usage' in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n"+"		<ul>\n"+"			<li>\n"+"				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n"+"				<p>Use this object to access the data methods of the App Services SDK, inclu
 ding those for push notifications, data store, and geolocation.</p>\n"+"			</li>\n"+"			<li>\n"+"				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n"+"				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n"+"			</li>\n"+"		</ul>\n"+"	</li>	\n"+"	<li>	\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\
 n'+'			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n'+"				<ul>\n"+'					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n'+'					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n'+'					<li><strong>
 <a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n'+"				</ul>		\n"+"			</li>\n"+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>	
 \n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-android-sdk-&lt;version&gt;\n"+"	...\n"+"	/samples\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app
  for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/ios.html","<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n"+'<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n'+'<ul class="nav nav-tabs" id="myTab">\n'+'	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n'+'	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n'+"</ul>\n"+'<div class="tab-content">\n'+'	<div class="tab-pane active" id="existing_project">\n'+"		<p>If you've already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n"+'		<div id="collapse"><a class="btn" d
 ata-toggle="collapse" href="#framework_collapse">Details</a></div>\n'+'		<div class="collapse" id="framework_collapse">\n'+"			<ol>\n"+"				<li>\n"+"					<p>Locate the SDK framework file so you can add it to your project. For example, you'll find the file at the following path:</p>\n"+"					<pre>\n"+"&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n"+"				</li>\n"+"				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n"+"				<li>Link the Apigee iOS SDK into your project.\n"+"					<ul>\n"+"						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n"+"					</ul>\n"+"					<p>OR</p>\n"+"					<ol>\n"+"						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n"+"						<li>Navigate to the directory that contains ApigeeiOS
 SDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n"+"					</ol>\n"+"				</li>\n"+"			</ol>\n"+"		</div>\n"+"	</div>\n"+'	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n'+"		<p>If you're starting with a clean slate (you don't have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n"+"		<ol>\n"+"			<li>\n"+"				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n"+"				<pre>\n"+"&lt;sdk_root&gt;/new-project-template</pre>\n"+"			</li>\n"+"			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n"+"			<li>Get acquainted with the template by looking at its readme file.</li>\n"+"		</ol>\n"+"	</div>\n"+"</div>\n"+"<h2>2. Add required iOS frameworks</h2>\n"+"<p>Ensure that the following iOS frameworks are part of you
 r project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n"+"<ul>\n"+"	<li>QuartzCore.framework</li>\n"+"	<li>CoreLocation.framework</li>\n"+"	<li>CoreTelephony.framework&nbsp;</li>\n"+"	<li>Security.framework</li>\n"+"	<li>SystemConfiguration.framework</li>\n"+"	<li>UIKit.framework</li>\n"+"</ul>\n"+"<h2>3. Update 'Other Linker Flags'</h2>\n"+"<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n"+"<pre>\n"+"-ObjC -all_load</pre>\n"+"<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n"+"<h2>4. Initialize the SDK</h2>\n"+'<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Gett
 ing Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n'+"<ol>\n"+"	<li>Import the SDK\n"+"		<p>Add the following to your source code to import the SDK:</p>\n"+"		<pre>\n"+"#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n"+"		<pre>\n"+"@property (strong, nonatomic) ApigeeClient *apigeeClient; \n"+"@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n"+"@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n"+"		</pre>\n"+"	</li>\n"+"	<li>\n"+"		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n"+"		<pre>\n"+"//Replace 'AppDelegate' with the name of your app delegate class to instantiate it\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"\n"
 +"//Sepcify your App Services organization and application names\n"+'NSString *orgName = @"{{currentOrg}}";\n'+'NSString *appName = @"{{currentApp}}";\n'+"\n"+"//Instantiate ApigeeClient to initialize the SDK\n"+"appDelegate.apigeeClient = [[ApigeeClient alloc]\n"+"                            initWithOrganizationId:orgName\n"+"                            applicationId:appName];\n"+"                            \n"+"//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\n"+"self.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \n"+"self.dataClient = [appDelegate.apigeeClient dataClient]; \n"+"		</pre>\n"+"	</li>\n"+"</ol>\n"+"\n"+"<h2>5. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to
  <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>	\n"+"	<li>\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n'+'		<div class="collapse" id="client_collapse">\n'+"			<ul>\n"+"				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifi
 cations, data store, and geolocation.</li>\n"+"				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"			<h3>Example</h3>\n"+"			<p>For example, you could create a new entity with the following:</p>\n"+"			<pre>\n"+"AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n"+"ApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n"+"			</pre>\n"+"		</div>\n"+"\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications<
 /a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+'		<p>The SDK includes samples that illust
 rate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n'+"		<p>You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-ios-sdk-&lt;version&gt;\n"+"    ...\n"+"    /samples\n"+"		</pre>\n"+'		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n'+'		<div class="collapse" id="samples_collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>books</td>\n"+"						<td>An app for storing a list of books that shows Ap
 igee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>push</td>\n"+"						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>\n"+"		<p>&nbsp;</p>\n"+"	</li>\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/javascript.html","<h2>1. Import the SDK into your HTML</h2>\n"+"<p>To enable support for Apigee-related functions in your HTML, you'll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n"+"<pre>\n"+'&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n'+"</pre>\n"+"<h2>2. Instantiate Apigee.Clien
 t</h2>\n"+"<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n"+"<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n"+"<pre>\n"+"//Apigee account credentials, available in the App Services admin portal \n"+"var client_creds = {\n"+"        orgName:'{{currentOrg}}',\n"+"        appName:'{{currentApp}}'\n"+"    }\n"+"\n"+"//Initializes the SDK. Also instantiates Apigee.MonitoringClient\n"+"var dataClient = new Apigee.Client(client_creds);  \n"+"</pre>\n"+"\n"+"<h2>3. Verify SDK installation</h2>\n"+"\n"+"<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n"+"\n"+"<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https:
 //www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n"+'<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n'+'<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n'+"\n"+"<h2>Installation complete! Try these next steps</h2>\n"+"<ul>\n"+"	<li>	\n"+"		<h3><strong>Call additional SDK methods in your code</strong></h3>\n"+"		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n"+'		<div id="collapse">\n'+'			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\n"+'		<div id="client_collapse" class="collapse">\n'+"			<ul>\n"+"				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n"+"				<li><code>dataClient.monitor</code>: Used
  to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n"+"			</ul>\n"+"		</div>\n"+"	</li>	\n"+"	<li>\n"+"		<h3><strong>Add App Services features to your app</strong></h3>\n"+"		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n"+"		<ul>\n"+'			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n'+'			<li><strong>
 <a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n'+'			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n'+"		</ul>\n"+"	</li>\n"+"	<li>\n"+"		<h3><strong>Check out the sample apps</strong></h3>\n"+"		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You'll find the samples in the following location in your SDK download:</p>\n"+"		<pre>\n"+"apigee-javascript-sdk-master\n"+"    ...\n"+"    /samples		\n"+"		</pre>\n"+'		<div id="collapse">\n'+'			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n'+"		</div>\
 n"+'		<div id="samples_collapse" class="collapse">\n'+"			<p>The samples include the following:</p>\n"+'			<table class="table">\n'+"				<thead>\n"+"					<tr>\n"+'						<th scope="col">Sample</th>\n'+'						<th scope="col">Description</th>\n'+"					</tr>\n"+"				</thead>\n"+"				<tbody>\n"+"					<tr>\n"+"						<td>booksSample.html</td>\n"+"						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>messagee</td>\n"+"						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>monitoringSample.html</td>\n"+"						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n"+"					</tr>\n"+"					<tr>\n"+"						<td>readmeSample.html</td>\n"+"						<td>A simple app for reading data from
  an Apigee database.</td>\n"+"					</tr>\n"+"				</tbody>\n"+"			</table>\n"+"		</div>	\n"+"	</li>				\n"+"</ul>\n");$templateCache.put("app-overview/doc-includes/net.html","");$templateCache.put("app-overview/doc-includes/node.html","");$templateCache.put("app-overview/doc-includes/ruby.html","");$templateCache.put("app-overview/getting-started.html",'<div class="setup-sdk-content" >\n'+"\n"+'  <bsmodal id="regenerateCredentials"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="regenerateCredentialsDialog"\n'+'           extrabuttonlabel="Yes"\n'+"           ng-cloak>\n"+"    Are you sure you want to regenerate the credentials?\n"+"  </bsmodal>\n"+"\n"+'    <page-title icon="&#128640;" title="Getting Started"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+"\n"+"\n"+"\n"+'    <div class="span8">\n'+"\n"+'      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n'+"      <p>Cli
 ck on a platform icon below to view SDK installation instructions for that platform.</p>\n"+'      <ul class="inline unstyled">\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n'+'        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n'+"\n"+"\n"+"        <li ng-click=\"showSDKDetail('ios')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n'+"        <li ng-click=\"showSDKDetail('android')\"\n"+'            analytics-on="click"\n'+'            anal
 ytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n'+"        <li ng-click=\"showSDKDetail('javascript')\"\n"+'            analytics-on="click"\n'+'            analytics-label="App Services"\n'+'            analytics-category="Getting Started"\n'+'            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apige
 e.com/docs/usergrid/content/sdks-and-examples#ruby"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n'+'        <li><a target="_blank"\n'+"               ng-click=\"showSDKDetail('nocontent')\"\n"+'               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n'+'               analytics-on="click"\n'+'               analytics-label="App Services"\n'+'               analytics-category="Getting Started"\n'+'               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n'+"       </ul>\n"+"\n"+'      <section id="intro-container" class="row-fluid intro-container">\n'+"\n"+'        <div class="sdk-intro">\n'+"        </div>\n"+"\n"+'        <div class="sdk-intro-content">\n'+"\n"+'          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" targ
 et="_blank">\n'+"            Download SDK\n"+"          </a>\n"+'          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n'+"            More Docs\n"+"          </a>\n"+'          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n'+"\n"+'          <div ng-include="getIncludeURL()"></div>\n'+"        </div>\n"+"\n"+"      </section>\n"+"    </div>\n"+"\n"+'    <div class="span4 keys-creds">\n'+'      <h2 class="title">Mobile sdk keys</h2>\n'+"      <p>For mobile SDK initialization.</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Org Name</dt>\n"+"        <dd>{{currentOrg}}</dd>\n"+"        <dt>App Name</dt>\n"+"        <dd>{{currentApp}}</dd>\n"+"      </dl>\n"+'      <h2 class="title">Server app credentials</h2>\n'+"      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n"+'      <dl class="app-creds">\n'+"        <dt>Client ID</dt>\n"+"        <dd>{{clientID}}</dd>\n"+"        <dt>Client Secret</
 dt>\n"+"        <dd>{{clientSecret}}</dd>\n"+"        <dt>\n"+"           &nbsp;\n"+"        </dt>\n"+"        <dd>&nbsp;</dd>\n"+"\n"+"        <dt>\n"+'          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n'+"        </dt>\n"+"        <dd></dd>\n"+"      </dl>\n"+"\n"+"    </div>\n"+"\n"+"  </section>\n"+"</div>");
 $templateCache.put("data/data.html",'<div class="content-page">\n'+"\n"+'  <bsmodal id="newCollection"\n'+'           title="Create new collection"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newCollectionDialog"\n'+'           extrabuttonlabel="Create"\n'+'           buttonid="collection"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="new-collection-name">Collection Name:</label>\n'+'        <div class="controls">\n'+'          <input type="text" ug-validate required ng-pattern="collectionNameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n'+'          <p class="help-block hide"></p>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <page-title title=" Collections" icon="&#128254;"></page-title>\n'+"\n"+'  <section class="row-
 fluid">\n'+'    <div class="span3 user-col">\n'+'        <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n'+'        <ul  class="user-list">\n'+"          <li ng-class=\"queryCollection._type === entity.name ? 'selected' : ''\" ng-repeat=\"entity in collectionList\" ng-click=\"loadCollection('/'+entity.name);\">\n"+'            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n'+"          </li>\n"+"        </ul>\n"+"\n"+"  </div>\n"+"\n"+'    <div class="span9 tab-content">\n'+'      <div class="content-page">\n'+'      <form name="dataForm" ng-submit="run();">\n'+"        <fieldset>\n"+'          <div class="control-group">\n'+'            <div class="" data-toggle="buttons-radio">\n'+'              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n'+"              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n"+'      
         <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n'+'              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n'+'              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n'+'              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n'+'              <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE\n'+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group">\n'+"            <strong>Path </strong>\n"+'            <div class="contr
 ols">\n'+'              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n'+"            </div>\n"+"          </div>\n"+'          <div class="control-group">\n'+'            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n'+"          </div>\n"+'          <div class="control-group">\n'+"            <strong>Query</strong>\n"+'            <div class="controls">\n'+'              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n'+'              <div style="display:none">\n'+'                <a class="btn dropdown-toggle " data-toggle="dropdown">\n'+'                  <span id="query-collections-caret" class="caret"></span>\n'+"                </a>\n"+'                <ul id="query-collections-indexes-li
 st" class="dropdown-menu ">\n'+"                </ul>\n"+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+"\n"+"          <div class=\"control-group\" ng-show=\"verb=='GET' || verb=='DELETE'\">\n"+'            <label class="control-label" for="query-limit"><strong>Limit</strong> <a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'              <div class="input-append">\n'+'                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n'+"              </div>\n"+"            </div>\n"+"          </div>\n"+"\n"+'          <div class="control-group" style="display:{{queryBodyDisplay}}">\n'+'            <label class="control-label" for="query-source"><strong>JSON Body</strong> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n'+'            <div class="controls">\n'+'            <textarea ng-
 model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n'+'      { "name":"value" }\n'+"            </textarea>\n"+"              <br>\n"+'            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"            </div>\n"+"          </div>\n"+'          <div style="clear: both; height: 10px;"></div>\n'+'          <div class="control-group">\n'+'            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n'+"          </div>\n"+"        </fieldset>\n"+"       </form>\n"+"        <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n"+"        <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n"+"        <div ng-include=\"display=='groups' ? 'data/display-groups.html' : ''\"></div>\n"+"        <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n"+"\n"+"
       </div>\n"+"\n"+"      </div>\n"+"    </section>\n"+"\n"+"\n"+"\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/display-generic.html","\n"+"\n"+'<bsmodal id="deleteEntities"\n'+'         title="Are you sure you want to delete the entities(s)?"\n'+'         close="hideModal"\n'+'         closelabel="Cancel"\n'+'         extrabutton="deleteEntitiesDialog"\n'+'         extrabuttonlabel="Delete"\n'+'         buttonid="del-entity"\n'+"         ng-cloak>\n"+"    <fieldset>\n"+'        <div class="control-group">\n'+"        </div>\n"+"    </fieldset>\n"+"</bsmodal>\n"+"\n"+'<span  class="button-strip">\n'+'  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n'+"</span>\n"+'<table class="table table-striped collection-list">\n'+"  <thead>\n"+'  <tr class="table-header">\n'+'    <th><input type="checkbox" ng-show="queryCollection._list.l
 ength > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n'+"    <th ng-if=\"hasProperty('name')\">Name</th>\n"+"    <th>UUID</th>\n"+"    <th></th>\n"+"  </tr>\n"+"  </thead>\n"+'  <tbody ng-repeat="entity in queryCollection._list">\n'+'  <tr class="zebraRows" >\n'+"    <td>\n"+"      <input\n"+'        type="checkbox"\n'+'        id="entity-{{entity._data.name}}-cb"\n'+'        ng-value="entity._data.uuid"\n'+'        ng-model="entity.checked"\n'+"        >\n"+"    </td>\n"+"    <td ng-if=\"hasProperty('name')\">{{entity._data.name}}</td>\n"+"    <td>{{entity._data.uuid}}</td>\n"+"    <td><a href=\"javaScript:void(0)\" ng-click=\"entitySelected[$index] = !entitySelected[$index];selectEntity(entity._data.uuid)\">{{entitySelected[$index] ? 'Hide' : 'View'}} Details</a></td>\n"+"  </tr>\n"+'  <tr ng-if="entitySelected[$index]">\n'+'    <td colspan="5">\n'+"\n"+"\n"+'      <h4 style="m
 argin: 0 0 20px 0">Entity Detail</h4>\n'+"\n"+"\n"+'      <ul class="formatted-json">\n'+'        <li ng-repeat="(k,v) in entity._data track by $index">\n'+'          <span class="key">{{k}} :</span>\n'+"          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n"+'          <span ng-switch on="isDeep(v)">\n'+'            <ul ng-switch-when="true">\n'+'              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n'+"\n"+'                <span ng-switch on="isDeep(v2)">\n'+'                  <ul ng-switch-when="true">\n'+'                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n'+"                  </ul>\n"+'                  <span ng-switch-when="false">\n'+'                    <span class="value">{{v2}}</span>\n'+"                  </span>\n"+"                </span>\n"+"              </li>\n"+"            </ul>\n"+'            <span ng-switch-when="false">\n'+'   
            <span class="value">{{v}}</span>\n'+"            </span>\n"+"          </span>\n"+"        </li>\n"+"      </ul>\n"+"\n"+'    <div class="control-group">\n'+'      <h4 style="margin: 20px 0 20px 0">Edit Entity</h4>\n'+'      <div class="controls">\n'+'        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n'+"        <br>\n"+'        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n'+"      </div>\n"+"    </div>\n"+"  </td>\n"+"  </tr>\n"+"\n"+'  <tr ng-show="queryCollection._list.length == 0">\n'+'    <td colspan="4">No data found</td>\n'+"  </tr>\n"+"  </tbody>\n"+"</table>\n"+'<div style="padding: 10px 5px 10px 5px">\n'+'  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'  <button class="btn btn-primary toolbar"
  ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"</div>\n"+"\n");$templateCache.put("data/display-groups.html","");$templateCache.put("data/display-roles.html","roles---------------------------------");$templateCache.put("data/display-users.html","\n"+'<table id="query-response-table" class="table">\n'+"  <tbody>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n'+'    <td class="gravatar50-td">&nbsp;</td>\n'+'    <td class="user-details bold-header">Username</td>\n'+'    <td class="user-details bold-header">Display Name</td>\n'+'    <td class="user-details bold-header">UUID</td>\n'+'    <td class="view-details">&nbsp;</td>\n'+"  </tr>\n"+'  <tr class="zebraRows users-row">\n'+'    <td class="checkboxo">\n'+'      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf
 44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"    </td>\n"+'    <td class="gravatar50-td">\n'+'      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n'+"    </td>\n"+'    <td class="details">\n'+"      <a onclick=\"Usergrid.console.getCollection('GET', '/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/'+'bf9a95da-d508-11e2-bf44-236d2eee13a7'); $('#data-explorer').show(); return false;\" class=\"view-details\">10</a>\n"+"    </td>\n"+'    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n'+'    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n'+'    <td class="view-details">\n'+'      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n'+"    </td>\n"+"  </tr>\n"+'  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+'    <t
 d colspan="5">\n'+"      <div>\n"+'        <div style="padding-bottom: 10px;">\n'+'          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n'+'          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n'+"        </div>\n"+'        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n'+"              <pre>{\n"+'  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n'+'  "uuid": "bf9a95da-d508-11e2-bf4
 4-236d2eee13a7",\n'+'  "type": "user",\n'+'  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n'+'  "created": 1371224432557,\n'+'  "modified": 1371851347024,\n'+'  "username": "10",\n'+'  "email": "fdsafdsa@ookfd.com",\n'+'  "activated": "true",\n'+'  "adr": {\n'+'    "addr1": "",\n'+'    "addr2": "",\n'+'    "city": "",\n'+'    "state": "",\n'+'    "zip": "",\n'+'    "country": ""\n'+"  },\n"+'  "metadata": {\n'+'    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n'+'    "sets": {\n'+'      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n'+'      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n'+"    },\n"+'    "collections": {\n'+'      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n'+'      "devices": "/user
 s/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n'+'      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n'+'      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n'+'      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n'+'      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n'+'      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n'+"    }\n"+"  },\n"+'  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n'+"}</pre>\n"+"        </div>\n"+'        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n'+"          <table>\n"+"            <tbody>\n"+"            <tr>\n"+"           
    <td>picture</td>\n"+'              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>
 </td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031
 a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n'+"            </tr>\n"+"            </tbody>\n"+"          </table>\n"+"        </div>\n"+"      </div>\n"+"    </td>\n"+"  </tr>\n"+"  </tbody>\n"+"</table>");$templateCache.put("data/entity.html",'<div class="content-page">\n'+"\n"+"  <h4>Entity Detail</h4>\n"+'  <div class="well">\n'+'    <a href="#!/data" class="outside-link"><< Back to collection</a>\n'+"  </div>\n"+"  <fieldset>\n"+'    <div class="control-group">\n'+"      <strong>Path </strong>\n"+'      <div class="controls">\n'+"        {{entityT
 ype}}/{{entityUUID}}\n"+"      </div>\n"+"    </div>\n"+"\n"+'    <div class="control-group">\n'+'      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n'+'      <div class="controls">\n'+'        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n'+"        <br>\n"+'        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n'+"      </div>\n"+"    </div>\n"+'    <div style="clear: both; height: 10px;"></div>\n'+'    <div class="control-group">\n'+'      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n'+'      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n'+"    </div>\n"+"  </fieldset>\n"+"\n"+"</div>\n"+"\n");$templateCache.put("data/shell.html",'<div class="content-page">\n'+'  <div class="well">\n'+"    <h2>Interactive Shell</h2>\n"+'    <div style="float:right"><a target="
 _blank" href="http://apigee.com/docs/usergrid/content/usergrid-admin-portal" class="notifications-links">Learn more in our docs</a></div>\n'+"  </div>\n"+"\n"+'  <div class="console-section-contents">\n'+'    <div id="shell-input-div">\n'+'      <p>   Type "help" to view a list of the available commands.</p><hr>\n'+"      <span>&nbsp;&gt;&gt; </span>\n"+'      <!--textarea id="shell-input" rows="2" autofocus="autofocus"></textarea-->\n'+"    </div>\n"+'    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;"><span class="pln">                      </span><p><span class="pln">  </span><span class="typ">Response</span><span class="pun">:</span></p><hr><span class="pln">\n'+"    </span></pre>\n"+"  </div>\n"+"</div>");$templateCache.put("dialogs/modal.html",'    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n'+'        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n'+"\n"+'        <div cl
 ass="modal-header">\n'+'            <h1 class="title">{{title}}</h1>\n'+"        </div>\n"+"\n"+'        <div class="modal-body" ng-transclude></div>\n'+'        <div class="modal-footer">\n'+"            {{footertext}}\n"+'            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n'+'            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n'+'                    ng-click="closeDelegate(close)">{{closelabel}}\n'+"            </button>\n"+"        </div>\n"+"        </form>    </div>\n");$templateCache.put("global/appswitcher-template.html",'<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n'+'  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n'+'  <ul class="dropdown-menu pull-right">\n'+'    <li id="globalNavSubmenuContainer">\n'+"      <ul>\n"+'        <li data-globalNav
 Detail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n'+'        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n'+"      </ul>\n"+"    </li>\n"+'    <li id="globalNavDetail">\n'+'      <div id="globalNavDetailApigeeHome">\n'+'        <div class="globalNavDetailApigeeLogo"></div>\n'+'        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailAppServices">\n'+'        <div class="globalNavDetailSubtitle">For App De
 velopers</div>\n'+'        <div class="globalNavDetailTitle">App Services</div>\n'+'        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiPlatform">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Platform</div>\n'+'        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n'+"      </div>\n"+'      <div id="globalNavDetailApiConsoles">\n'+'        <div class="globalNavDetailSubtitle">For API Developers</div>\n'+'        <div class="globalNavDetailTitle">API Consoles</div>\n'+'        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n'+"      </div>\n"+"    </li>\n"+"  </ul>\n"+"</li>");$templateCache.put("global/insecure-banner.html
 ",'<div ng-if="securityWarning" ng-cloak class="demo-holder">\n'+'    <div class="alert alert-demo alert-animate">\n'+'        <div class="alert-text">\n'+'            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n'+"        </div>\n"+"    </div>\n"+"</div>");$templateCache.put("global/page-title.html",'<section class="row-fluid">\n'+'    <div class="span12">\n'+'        <div class="page-filters">\n'+'            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n'+"        </div>\n"+"    </div>\n"+'    <bsmodal id="need-help"\n'+'             title="Need Help?"\n'+'
              close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="sendHelp"\n'+'             extrabuttonlabel="Get Help"\n'+"             ng-cloak>\n"+"        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n"+"    </bsmodal>\n"+"</section>\n"+"\n");$templateCache.put("groups/groups-activities.html",'<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n'+"\n"+"  <br>\n"+"  <div>\n"+'    <table class="table table-striped">\n'+"      <tbody>\n"+'      <tr class="table-header">\n'+"        <td>Date</td>\n"+"        <td>Content</td>\n"+"        <td>Verb</td>\n"+"        <td>UUID</td>\n"+"      </tr>\n"+'      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n'+"        <td>{{activity.createdDate}}</td>\n"+"        <td>{{activity.content}}</td>\n"+"        <td>{{activity.verb}}</td>\n"+"        <td>{{activity.uuid}}</td>\n"+"      </tr>\n"+"      </tbody>\n"+"    </table>\n"
 +"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-details.html",'<div class="content-page" ng-controller="GroupsDetailsCtrl">\n'+"\n"+"  <div>\n"+'      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n'+'          <div style="float: left; padding-right: 30px;">\n'+'              <h4 class="ui-dform-legend">Group Information</h4>\n'+'              <label for="group-title" class="ui-dform-label">Group Title</label>\n'+'              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n'+"              <br/>\n"+'            <label for="group-path" class="ui-dform-label">Group Path</label>\n'+'            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n'+"            <br/>\n"+"    
       </div>\n"+'          <br style="clear:both"/>\n'+"\n"+'          <div style="width:100%;float:left;padding: 20px 0">\n'+'              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n'+"          </div>\n"+"\n"+'          <div class="content-container">\n'+"              <h4>JSON Group Object</h4>\n"+"              <pre>{{json}}</pre>\n"+"          </div>\n"+"      </form>\n"+"  </div>\n"+"\n"+"\n"+"</div>");$templateCache.put("groups/groups-members.html",'<div class="content-page" ng-controller="GroupsMembersCtrl">\n'+"\n"+"\n"+'  <bsmodal id="removeFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="removeUsersFromGroupDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the users from the seleted group(s)?</p>\n"+"  </bsmodal>\n"+"
 \n"+'  <bsmodal id="addGroupToUser"\n'+'           title="Add user to group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToUserDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.user != '' ? $parent.user.username : 'Select a user...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasMembers 
 || !valueSelected(groupsCollection.users._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n'+"  </div>\n"+'  <table class="table table-striped">\n'+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n'+'      <td style="width: 50px;"></td>\n'+"      <td>Username</td>\n"+"      <td>Display Name</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="user.checked"\n'+"          >\n"+"      </td>\n"+'      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n'+"      <td>{{user.get('username')}}</td>\n"+"      <td>{{user.get('name')}}</td>\n"+"    </tr>\n"+"  </table>\n"+'  <div style=
 "padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"  </div>\n"+"</div>");$templateCache.put("groups/groups-roles.html",'<div class="content-page" ng-controller="GroupsRolesCtrl">\n'+"\n"+'  <bsmodal id="addGroupToRole"\n'+'           title="Add group to role"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupToRoleDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <div class="btn-group">\n'+'      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n'+"        <span class=\"filter-label\">{{$parent.name != '' ? $parent.name : 'Role name...'}}</span>\n"+'        <span class="caret"></span>\n'+"      </a>\n"+'      <ul class="dropdown-menu">\n'+'        <li ng-
 repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n'+"      </ul>\n"+"    </div>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="leaveRoleFromGroup"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="leaveRoleDialog"\n'+'           extrabuttonlabel="Leave"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to remove the group from the role(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n'+"  </div>\n"+"  <h4>Roles</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-head
 er">\n'+'      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" ></td>\n'+"      <td>Role Name</td>\n"+"      <td>Role title</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="role.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{role._data.name}}</td>\n"+"      <td>{{role._data.title}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+'  <div style="padding: 10px 5px 10px 5px">\n'+'    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n'+'    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n'+"  </div>\n"+"\n"+"\n"+'  <bsmodal 
 id="deletePermission"\n'+'           title="Confirmation"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupPermissionDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the permission(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <bsmodal id="addPermission"\n'+'           title="New Permission"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="addGroupPermissionDialog"\n'+'           extrabuttonlabel="Add"\n'+"           ng-cloak>\n"+'    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /></p>\n'+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <inpu
 t type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n'+"    </div>\n"+'    <div class="control-group">\n'+'      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n'+"    </div>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <div class="button-strip">\n'+'    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n'+'    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n'+"  </div>\n"+"  <h4>Permissions</h4>\n"+'  <table class="table table-striped">\n'+"    <tbody>\n"+'    <tr class="table-header">\n'+'      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAll
 Entities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n'+"      <td>Path</td>\n"+"      <td>GET</td>\n"+"      <td>POST</td>\n"+"      <td>PUT</td>\n"+"      <td>DELETE</td>\n"+"    </tr>\n"+'    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n'+"      <td>\n"+"        <input\n"+'          type="checkbox"\n'+'          ng-model="permission.checked"\n'+"          >\n"+"      </td>\n"+"      <td>{{permission.path}}</td>\n"+"      <td>{{permission.operations.get}}</td>\n"+"      <td>{{permission.operations.post}}</td>\n"+"      <td>{{permission.operations.put}}</td>\n"+"      <td>{{permission.operations.delete}}</td>\n"+"    </tr>\n"+"    </tbody>\n"+"  </table>\n"+"\n"+"</div>");
 $templateCache.put("groups/groups-tabs.html",'<div class="content-page">\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'    <div class="span12">\n'+'      <div class="page-filters">\n'+'        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n'+"      </div>\n"+"    </div>\n"+"\n"+"  </section>\n"+"\n"+'  <div id="user-panel" class="panel-buffer">\n'+'    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n'+'      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n'+'      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n'+'      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n'+'      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n'+'      <li ng-class="rolesSelected"><a href="javaScript:v
 oid(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n'+"    </ul>\n"+"  </div>\n"+"\n"+'  <div style="float: left; margin-right: 10px;">\n'+'    <div style="float: left;">\n'+"      <div class=\"user-header-title\"><strong>Group Path: </strong>{{selectedGroup.get('path')}}</div>\n"+"      <div class=\"user-header-title\"><strong>Group Title: </strong>{{selectedGroup.get('title')}}</div>\n"+"    </div>\n"+"  </div>\n"+"</div>\n"+"<br>\n"+"<br>\n");$templateCache.put("groups/groups.html",'<div class="content-page">\n'+"\n"+'  <page-title title=" Groups" icon="&#128101;"></page-title>\n'+'  <bsmodal id="newGroup"\n'+'           title="New Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="newGroupDialog"\n'+'           extrabuttonlabel="Add"\n'+'           ng-model="dialog"\n'+"           ng-cloak>\n"+"    <fieldset>\n"+'      <div class="control-group">\n'+'        <label for="title">Title</label>\n'+'    
     <div class="controls">\n'+'          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label for="path">Path</label>\n'+'        <div class="controls">\n'+'          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n'+"        </div>\n"+"      </div>\n"+"    </fieldset>\n"+"  </bsmodal>\n"+"\n"+'  <bsmodal id="deleteGroup"\n'+'           title="Delete Group"\n'+'           close="hideModal"\n'+'           closelabel="Cancel"\n'+'           extrabutton="deleteGroupsDialog"\n'+'           extrabuttonlabel="Delete"\n'+"           ng-cloak>\n"+"    <p>Are you sure you want to delete the group(s)?</p>\n"+"  </bsmodal>\n"+"\n"+"\n"+'  <section class=
 "row-fluid">\n'+'    <div class="span3 user-col">\n'+"\n"+'      <div class="button-toolbar span12">\n'+'        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n'+'        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n'+'        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n'+"      </div>\n"+'      <ul class="user-list">\n'+'        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n'+"          <input\n"+'              type="checkbox"\n'+'              ng-value="group
 ._data.uuid"\n'+'              ng-checked="group.checked"\n'+'              ng-model="group.checked"\n'+"              >\n"+"          <a href=\"javaScript:void(0)\" >{{group.get('title')}}</a>\n"+"          <br/>\n"+"          <span ng-if=\"group.get('path')\" class=\"label\">Path:</span>/{{group.get('path')}}\n"+"        </li>\n"+"      </ul>\n"+"\n"+"\n"+'      <div style="padding: 10px 5px 10px 5px">\n'+'        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n'+'        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n'+"      </div>\n"+"\n"+"    </div>\n"+"\n"+'    <div class="span9 tab-content" ng-show="selectedGroup.get" >\n'+'      <div class="menu-toolbar">\n'+'        <ul class="inline" >\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click
 ="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a></li>\n'+'          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a></li>\n'+"        </ul>\n"+"      </div>\n"+'      <span ng-include="currentGroupsPage.template"></span>\n'+"\n"+"  </section>\n"+"</div>\n");$templateCache.put
 ("login/forgot-password.html",'<div class="login-content" ng-controller="ForgotPasswordCtrl">\n'+'	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n'+'	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n'+'	<button class="btn btn-primary" ng-click="">Reset Password</button>\n'+"</div>\n");$templateCache.put("login/loading.html","\n"+"\n"+"<h1>Loading...</h1>");$templateCache.put("login/login.html",'<div class="login-content">\r'+"\n"+'  <bsmodal id="sendActivationLink"\r'+"\n"+'           title="Resend Activation Link"\r'+"\n"+'           close="hideModal"\r'+"\n"+'           closelabel="Cancel"\r'+"\n"+'           extrabutton="resendActivationLink"\r'+"\n"+'           extrabuttonlabel="Send Activation"\r'+"\n"+"           ng-cloak>\r"+"\n"+"    <fieldset>\r"+"\n"+'      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-patter
 n="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r'+"\n"+"    </fieldset>\r"+"\n"+"  </bsmodal>\r"+"\n"+'  <div class="login-holder">\r'+"\n"+'  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r'+"\n"+'    <h1 class="title">Enter your credentials</h1>\r'+"\n"+'    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r'+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-username">Email or Username:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group">\r'+"\n"+'      <label class="control-label" for="login-password">Password:</
 label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="control-group" ng-show="requiresDeveloperKey">\r'+"\n"+'      <label class="control-label" for="login-developerkey">Developer Key:</label>\r'+"\n"+'      <div class="controls">\r'+"\n"+'        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+'    <div class="form-actions">\r'+"\n"+'      <div class="submit">\r'+"\n"+'        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r'+"\n"+"      </div>\r"+"\n"+"    </div>\r"+"\n"+"  </form>\r"+"\n"+"  </div>\r"+
 "\n"+'  <div class="extra-actions">\r'+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r'+"\n"+'         class="btn btn-primary pull-left">Register</a>\r'+"\n"+"    </div>\r"+"\n"+'    <div class="submit">\r'+"\n"+'      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="button-forgot-password"\r'+"\n"+'         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r'+"\n"+"    </div>\r"+"\n"+'    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r'+"\n"+'       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r'+"\n"+"  </div>\r"+"\n"+'  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r'+"\n"+"</div>\r"+"\n");$templateCache.put("login/logout.html",'<div id="logut">Logging out...</div>');$templateCache.put("login/register.html",'<div class="signUp-content">\n'+'  <div class="signUp-
 holder">\n'+'    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n'+'      <h1 class="title">Register</h1>\n'+"\n"+'      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n'+'      <div class="control-group">\n'+'        <label class="control-label" for="register-orgName">Organization:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-name">Name:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class=""
  size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-userName">Username:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-email">Email:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n'+"        </div>\n"+"      </div>\n"+"\n"+"\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-password">Password:</label>\n'+"\n"+'        <div
  class="controls">\n'+'          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n'+'                 size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="control-group">\n'+'        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n'+"\n"+'        <div class="controls">\n'+'          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPassword" ug-validate class="" size="20">\n'+"        </div>\n"+"      </div>\n"+'      <div class="form-actions">\n'+'        <div class="submit">\n'+'          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n'+'                 class="btn btn-primary pull-right">\n'+"        </div>\n"+'        <div class="submit">\n'+'          <a ng-click="cancel()" type="submi
 t" name="button-cancel" id="button-cancel"\n'+'             class="btn btn-primary pull-right">Cancel</a>\n'+"        </div>\n"+"      </div>\n"+"    </form>\n"+'    <div class="console-section well thingy" ng-show="signUpSuccess">\n'+'      <span class="title">We\'re holding a seat for you!</span>\n'+"      <br><br>\n"+"\n"+"      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we're ready for\n"+"        you!</p>\n"+"\n"+"      <p>In the mean time, you can stay up to date with App Services on our <a\n"+'          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleGroup</a>.</p>\n'+"\n"+'      <p> <a href="#!/login">Back to login</a></p>\n'+"    </div>\n"+"  </div>\n"+"\n"+"</div>\n");$templateCache.put("menus/appMenu.html",'<ul id="app-menu" class="nav top-nav span12">\n'+'    <li class="span7">\n'+'      <bsmodal id="newApplication"\n'+'               title="Create New Application"\n'+'               close="hideM
 odal"\n'+'               closelabel="Cancel"\n'+'               extrabutton="newApplicationDialog"\n'+'               extrabuttonlabel="Create"\n'+'               buttonid="app"\n'+"               ng-cloak>\n"+'        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n'+'        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n'+'        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n'+"      </bsmodal>\n"+'        <div class="btn-group">\n'+'            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n'+'                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n'+'                <span class="caret"></span>\n'+"            </a>\n"+'            <ul class="dro
 pdown-menu app-nav">\n'+'                <li name="app-selector" ng-repeat="app in applications">\n'+'                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n'+"                </li>\n"+"            </ul>\n"+"        </div>\n"+"    </li>\n"+'    <li class="span5">\n'+'      <a ng-if="activeUI"\n'+'         class="btn btn-create zero-out pull-right"\n'+"         ng-click=\"showModal('newApplication')\"\n"+'         analytics-on="click"\n'+'         analytics-category="App Services"\n'+'         analytics-label="Button"\n'+'         analytics-event="Add New App"\n'+"        >\n"+'        <i class="pictogram">&#8862;</i>\n'+"        Add New App\n"+"      </a>\n"+"    </li>\n"+"</ul>");$templateCache.put("menus/orgMenu.html",'<ul class="nav top-nav org-nav">\n'+"  <li>\n"+'<div class="btn-group ">\n'+'    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n'+'        <i class="pictogram
 ">&#128193</i> {{currentOrg}}<span class="caret"></span>\n'+"        </a>\n"+'    <ul class="dropdown-menu org-nav">\n'+'          <li name="org-selector" ng-repeat="(k,v) in organizations">\n'+'              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n'+"            </li>\n"+"         </ul>\n"+"    </div>\n"+"  </li></ul>");$templateCache.put("org-overview/org-overview.html",'<div class="org-overview-content" ng-show="activeUI">\n'+"\n"+'  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n'+"\n"+'  <section class="row-fluid">\n'+"\n"+'  <div class="span6">\n'+'  	<bsmodal id="introjs"\n'+'             title="Welcome to the API BaaS Admin Portal"\n'+'             close="hideModal"\n'+'             closelabel="Skip"\n'+'             extrabutton="startFirstTimeUser"\n'+'             extrabuttonlabel="Take the tour"\n'+"             ng-cloak>\n"+"      <p>To get started, click 'Take the tour' for a full walkth
 rough of the admin portal, or click 'Skip' to start working right away.</p>\n"+"    </bsmodal>\n"+'		<div id="intro-4-current-org">	\n'+'	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n'+'	    <table class="table table-striped">\n'+"	      <tr>\n"+'	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n'+'	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n"+"\n"+'    <bsmodal id="newApplication"\n'+'             title="Create New Application"\n'+'             close="hideModal"\n'+'             closelabel="Cancel"\n'+'             extrabutton="newApplicationDialog"\n'+'             extrabuttonlabel="Create"\n'+"             ng-cloak>\n"+'      <p>New application name: <input ng-model="$parent.newApp.name"
   ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n'+"    </bsmodal>\n"+'		<div id="intro-5-applications">		\n'+'	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n'+'	      <div class="header-button btn-group pull-right">\n'+"	        <a class=\"btn filter-selector\" style=\"{{applicationsSize === 10 ? 'width:290px':''}}\"  ng-click=\"showModal('newApplication')\">\n"+'	          <span class="filter-label">Add New App</span>\n'+"	        </a>\n"+"	      </div>\n"+"	    </h2>\n"+"		\n"+'	    <table class="table table-striped">\n'+'	      <tr ng-repeat="application in applications">\n'+"	        <td>{{application.name}}</td>\n"+'	        <td style="text-align: right">{{application.uuid}}</td>\n'+"	      </tr>\n"+"	    </table>\n"+"		</div>\n
 "+'    <bsmodal id="regenerateCredentials"\n'+'           

<TRUNCATED>

[10/24] git commit: update readme

Posted by sn...@apache.org.
update readme


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/ded28e5b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/ded28e5b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/ded28e5b

Branch: refs/pull/96/merge
Commit: ded28e5b0354bdd4a3aa657b34d605bf8b487010
Parents: cc610ce
Author: Shawn Feldman <sh...@gmail.com>
Authored: Wed Apr 2 08:56:43 2014 -0600
Committer: Shawn Feldman <sh...@gmail.com>
Committed: Wed Apr 2 08:56:43 2014 -0600

----------------------------------------------------------------------
 portal/README.md | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/ded28e5b/portal/README.md
----------------------------------------------------------------------
diff --git a/portal/README.md b/portal/README.md
index 809468e..2e264a2 100644
--- a/portal/README.md
+++ b/portal/README.md
@@ -19,17 +19,19 @@ Use the admin portal for administrative operations, including:
 
 ##Deploying or Developing
 
-If you are just deploying:
+If you are just running the portal:
 
 1. Install Node.js from http://nodejs.org/download/.
-2. From the root directory, run `./build.sh`.
-3. This will create a directory in the root called dist. In dist is a zip file called appsvc-ui.zip. Unzip and deploy to your favorite web server or if you run "./build.sh dev" you can then navigate to http://localhost:3000/ .
+2. From the root directory, run `./build.sh dev`.
+3. This will build and run a lightweight server. Naviate to http://localhost:3000
+4. If that doesn't work, in dist is a built copy and a file called rel-usergrid-portal.zip. Unzip and deploy to your favorite web server.
 
 If you are developing:
 
 1. From the root directory, run `./build.sh dev`.
 2. To debug in the browser go to http://localhost:3000/index-debug.html; http://localhost:3000/ will point to the compressed files.
-3. If the libraries get out of sync, run `./build.sh` again and this will run grunt build in the background.
+3. If the libraries get out of sync, run `./build.sh` again and this will run "grunt build" in the background.
+4. If you then want to update bower and create a distributable copy, run "grunt build-release", check in all the built files to distribute via bower
 
 If you want to run the e2e tests:
 


[15/24] git commit: merging upstream

Posted by sn...@apache.org.
merging upstream


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/67108093
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/67108093
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/67108093

Branch: refs/pull/96/merge
Commit: 6710809398d813c90c3876a2335a26459667bc85
Parents: 77ecd14 cc610ce
Author: amuramoto <am...@apigee.com>
Authored: Wed Apr 2 09:27:57 2014 -0700
Committer: amuramoto <am...@apigee.com>
Committed: Wed Apr 2 09:27:57 2014 -0700

----------------------------------------------------------------------
 .gitignore                                      |     8 +-
 portal/Gruntfile.js                             |    60 +-
 portal/bower.json                               |     2 +-
 portal/config.js                                |    15 -
 .../bower_components/angular-intro.js/LICENSE   |    20 -
 .../angular-intro.js/angular-intro.js           |    60 -
 .../angular-intro.js/bower.json                 |    20 -
 .../angular-intro.js/build/angular-intro.min.js |     1 -
 .../angular-intro.js/example/app.js             |    51 -
 .../angular-intro.js/lib/app.js                 |    49 -
 .../angular-intro.js/lib/intro.min.js           |    20 -
 .../angular-intro.js/lib/introjs.css            |   216 -
 .../2.0.2/bower_components/angular/README.md    |    48 -
 .../bower_components/angular/angular-csp.css    |    18 -
 .../2.0.2/bower_components/angular/angular.js   | 21734 -----------
 .../bower_components/angular/angular.min.js     |   211 -
 .../angular/angular.min.js.gzip                 |   Bin 38778 -> 0 bytes
 .../bower_components/angular/angular.min.js.map |     8 -
 .../2.0.2/bower_components/angular/bower.json   |     7 -
 .../bower_components/angularitics/Gruntfile.js  |    62 -
 .../2.0.2/bower_components/angularitics/LICENSE |    22 -
 .../bower_components/angularitics/README.md     |   115 -
 .../bower_components/angularitics/bower.json    |    12 -
 .../dist/angulartics-chartbeat.min.js           |     7 -
 .../dist/angulartics-ga-cordova.min.js          |     6 -
 .../angularitics/dist/angulartics-ga.min.js     |     7 -
 .../dist/angulartics-google-analytics.min.js    |     7 -
 .../dist/angulartics-kissmetrics.min.js         |     6 -
 .../dist/angulartics-mixpanel.min.js            |     7 -
 .../angularitics/dist/angulartics-scroll.min.js |    14 -
 .../dist/angulartics-segmentio.min.js           |     6 -
 .../angularitics/dist/angulartics.min.js        |     6 -
 .../bower_components/angularitics/karma.conf.js |    22 -
 .../bower_components/angularitics/package.json  |    43 -
 .../angularitics/samples/chartbeat.html         |    79 -
 .../angularitics/samples/google-analytics.html  |    68 -
 .../angularitics/samples/kissmetrics.html       |    75 -
 .../angularitics/samples/mixpanel.html          |    65 -
 .../angularitics/samples/partials/a.tpl.html    |     1 -
 .../angularitics/samples/partials/b.tpl.html    |     1 -
 .../angularitics/samples/partials/c.tpl.html    |     1 -
 .../angularitics/samples/partials/root.tpl.html |     1 -
 .../angularitics/samples/scroll.html            |    82 -
 .../angularitics/samples/segmentio.html         |    65 -
 .../angularitics/src/angulartics-chartbeat.js   |    29 -
 .../angularitics/src/angulartics-ga-cordova.js  |    91 -
 .../angularitics/src/angulartics-ga.js          |    32 -
 .../angularitics/src/angulartics-kissmetrics.js |    29 -
 .../angularitics/src/angulartics-mixpanel.js    |    29 -
 .../angularitics/src/angulartics-scroll.js      |    47 -
 .../angularitics/src/angulartics-segmentio.js   |    24 -
 .../angularitics/src/angulartics.js             |   132 -
 .../angularitics/test/angularticsSpec.js        |    38 -
 .../2.0.2/bower_components/apigee-sdk/apigee.js |  3260 --
 .../bower_components/apigee-sdk/apigee.min.js   |     3 -
 .../bower_components/apigee-sdk/bower.json      |    13 -
 .../samples/collections/css/apigee.min.css      |   213 -
 .../collections/css/jquery.mobile.icons.min.css |     3 -
 .../samples/collections/css/theme.min.css       |   213 -
 .../apigee-sdk/samples/collections/js/index.js  |   360 -
 .../entities/css/jquery.mobile.icons.min.css    |     3 -
 .../samples/entities/css/theme.min.css          |   213 -
 .../apigee-sdk/samples/entities/js/index.js     |   228 -
 .../geolocation/css/jquery.mobile.icons.min.css |     3 -
 .../samples/geolocation/css/theme.min.css       |   213 -
 .../apigee-sdk/samples/geolocation/js/index.js  |   133 -
 .../apigee-sdk/samples/messagee/app.js          |   634 -
 .../samples/messagee/usergrid.validation.js     |   249 -
 .../samples/push/android/AndroidManifest.xml    |    79 -
 .../samples/push/android/ant.properties         |    17 -
 .../push/android/assets/www/PushNotification.js |    65 -
 .../push/android/assets/www/cordova-2.7.0.js    |  6836 ----
 .../push/android/assets/www/css/index.css       |   115 -
 .../push/android/assets/www/img/cordova.png     |   Bin 19932 -> 0 bytes
 .../push/android/assets/www/img/logo.png        |   Bin 21814 -> 0 bytes
 .../samples/push/android/assets/www/js/index.js |   241 -
 .../samples/push/android/assets/www/main.js     |   165 -
 .../samples/push/android/assets/www/master.css  |   116 -
 .../screen/android/screen-hdpi-landscape.png    |   Bin 218302 -> 0 bytes
 .../res/screen/android/screen-hdpi-portrait.png |   Bin 222148 -> 0 bytes
 .../screen/android/screen-ldpi-landscape.png    |   Bin 42616 -> 0 bytes
 .../res/screen/android/screen-ldpi-portrait.png |   Bin 42034 -> 0 bytes
 .../screen/android/screen-mdpi-landscape.png    |   Bin 92347 -> 0 bytes
 .../res/screen/android/screen-mdpi-portrait.png |   Bin 90555 -> 0 bytes
 .../screen/android/screen-xhdpi-landscape.png   |   Bin 489604 -> 0 bytes
 .../screen/android/screen-xhdpi-portrait.png    |   Bin 504508 -> 0 bytes
 .../samples/push/android/assets/www/spec.html   |    68 -
 .../push/android/assets/www/spec/helper.js      |    33 -
 .../push/android/assets/www/spec/index.js       |    67 -
 .../www/spec/lib/jasmine-1.2.0/MIT.LICENSE      |    20 -
 .../www/spec/lib/jasmine-1.2.0/jasmine-html.js  |   616 -
 .../www/spec/lib/jasmine-1.2.0/jasmine.css      |    81 -
 .../www/spec/lib/jasmine-1.2.0/jasmine.js       |  2529 --
 .../apigee-sdk/samples/push/android/build.xml   |    92 -
 .../samples/push/android/cordova/appinfo.jar    |   Bin 1574 -> 0 bytes
 .../samples/push/android/cordova/build          |    24 -
 .../samples/push/android/cordova/clean          |    24 -
 .../samples/push/android/cordova/cordova        |   159 -
 .../apigee-sdk/samples/push/android/cordova/log |    24 -
 .../samples/push/android/cordova/release        |    24 -
 .../apigee-sdk/samples/push/android/cordova/run |    24 -
 .../push/android/libs/android-support-v13.jar   |   Bin 402581 -> 0 bytes
 .../samples/push/android/libs/cordova-2.7.0.jar |   Bin 256941 -> 0 bytes
 .../samples/push/android/libs/gcm.jar           |   Bin 13662 -> 0 bytes
 .../samples/push/android/proguard-project.txt   |    20 -
 .../samples/push/android/project.properties     |    14 -
 .../android/res/drawable-hdpi/ic_launcher.png   |   Bin 9397 -> 0 bytes
 .../push/android/res/drawable-hdpi/icon.png     |   Bin 6080 -> 0 bytes
 .../android/res/drawable-ldpi/ic_launcher.png   |   Bin 2729 -> 0 bytes
 .../push/android/res/drawable-ldpi/icon.png     |   Bin 3096 -> 0 bytes
 .../android/res/drawable-mdpi/ic_launcher.png   |   Bin 5237 -> 0 bytes
 .../push/android/res/drawable-mdpi/icon.png     |   Bin 4090 -> 0 bytes
 .../android/res/drawable-xhdpi/ic_launcher.png  |   Bin 14383 -> 0 bytes
 .../push/android/res/drawable-xhdpi/icon.png    |   Bin 7685 -> 0 bytes
 .../samples/push/android/res/drawable/icon.png  |   Bin 7685 -> 0 bytes
 .../samples/push/android/res/layout/main.xml    |    13 -
 .../samples/push/android/res/values/strings.xml |     4 -
 .../samples/push/android/res/xml/config.xml     |    62 -
 .../plugin/gcm/CordovaGCMBroadcastReceiver.java |    19 -
 .../src/com/plugin/gcm/GCMIntentService.java    |   163 -
 .../src/com/plugin/gcm/PushHandlerActivity.java |    66 -
 .../android/src/com/plugin/gcm/PushPlugin.java  |   216 -
 .../src/me/mdob/android/androidpush.java        |    36 -
 .../samples/push/ios/CordovaLib/Classes/CDV.h   |    57 -
 .../ios/CordovaLib/Classes/CDVAccelerometer.h   |    39 -
 .../ios/CordovaLib/Classes/CDVAccelerometer.m   |   128 -
 .../ios/CordovaLib/Classes/CDVAvailability.h    |    87 -
 .../push/ios/CordovaLib/Classes/CDVBattery.h    |    40 -
 .../push/ios/CordovaLib/Classes/CDVBattery.m    |   152 -
 .../push/ios/CordovaLib/Classes/CDVCamera.h     |    92 -
 .../push/ios/CordovaLib/Classes/CDVCamera.m     |   570 -
 .../push/ios/CordovaLib/Classes/CDVCapture.h    |   118 -
 .../push/ios/CordovaLib/Classes/CDVCapture.m    |   847 -
 .../ios/CordovaLib/Classes/CDVCommandDelegate.h |    54 -
 .../CordovaLib/Classes/CDVCommandDelegateImpl.h |    33 -
 .../CordovaLib/Classes/CDVCommandDelegateImpl.m |   145 -
 .../ios/CordovaLib/Classes/CDVCommandQueue.h    |    40 -
 .../ios/CordovaLib/Classes/CDVCommandQueue.m    |   169 -
 .../ios/CordovaLib/Classes/CDVConfigParser.h    |    28 -
 .../ios/CordovaLib/Classes/CDVConfigParser.m    |    70 -
 .../push/ios/CordovaLib/Classes/CDVConnection.h |    34 -
 .../push/ios/CordovaLib/Classes/CDVConnection.m |   132 -
 .../push/ios/CordovaLib/Classes/CDVContact.h    |   136 -
 .../push/ios/CordovaLib/Classes/CDVContact.m    |  1752 -
 .../push/ios/CordovaLib/Classes/CDVContacts.h   |   151 -
 .../push/ios/CordovaLib/Classes/CDVContacts.m   |   593 -
 .../push/ios/CordovaLib/Classes/CDVDebug.h      |    25 -
 .../ios/CordovaLib/Classes/CDVDebugConsole.h    |    28 -
 .../ios/CordovaLib/Classes/CDVDebugConsole.m    |    37 -
 .../push/ios/CordovaLib/Classes/CDVDevice.h     |    30 -
 .../push/ios/CordovaLib/Classes/CDVDevice.m     |    90 -
 .../push/ios/CordovaLib/Classes/CDVEcho.h       |    23 -
 .../push/ios/CordovaLib/Classes/CDVEcho.m       |    61 -
 .../push/ios/CordovaLib/Classes/CDVExif.h       |    43 -
 .../push/ios/CordovaLib/Classes/CDVFile.h       |   106 -
 .../push/ios/CordovaLib/Classes/CDVFile.m       |  1409 -
 .../ios/CordovaLib/Classes/CDVFileTransfer.h    |    74 -
 .../ios/CordovaLib/Classes/CDVFileTransfer.m    |   625 -
 .../ios/CordovaLib/Classes/CDVGlobalization.h   |   150 -
 .../ios/CordovaLib/Classes/CDVGlobalization.m   |   790 -
 .../ios/CordovaLib/Classes/CDVInAppBrowser.h    |    88 -
 .../ios/CordovaLib/Classes/CDVInAppBrowser.m    |   581 -
 .../CordovaLib/Classes/CDVInvokedUrlCommand.h   |    57 -
 .../CordovaLib/Classes/CDVInvokedUrlCommand.m   |   140 -
 .../push/ios/CordovaLib/Classes/CDVJSON.h       |    30 -
 .../push/ios/CordovaLib/Classes/CDVJSON.m       |    77 -
 .../CordovaLib/Classes/CDVJpegHeaderWriter.h    |    62 -
 .../CordovaLib/Classes/CDVJpegHeaderWriter.m    |   522 -
 .../ios/CordovaLib/Classes/CDVLocalStorage.h    |    50 -
 .../ios/CordovaLib/Classes/CDVLocalStorage.m    |   485 -
 .../push/ios/CordovaLib/Classes/CDVLocation.h   |   104 -
 .../push/ios/CordovaLib/Classes/CDVLocation.m   |   623 -
 .../push/ios/CordovaLib/Classes/CDVLogger.h     |    26 -
 .../push/ios/CordovaLib/Classes/CDVLogger.m     |    38 -
 .../ios/CordovaLib/Classes/CDVNotification.h    |    37 -
 .../ios/CordovaLib/Classes/CDVNotification.m    |   126 -
 .../push/ios/CordovaLib/Classes/CDVPlugin.h     |    64 -
 .../push/ios/CordovaLib/Classes/CDVPlugin.m     |   152 -
 .../ios/CordovaLib/Classes/CDVPluginResult.h    |    68 -
 .../ios/CordovaLib/Classes/CDVPluginResult.m    |   224 -
 .../ios/CordovaLib/Classes/CDVReachability.h    |    85 -
 .../ios/CordovaLib/Classes/CDVReachability.m    |   260 -
 .../Classes/CDVScreenOrientationDelegate.h      |    28 -
 .../push/ios/CordovaLib/Classes/CDVSound.h      |   116 -
 .../push/ios/CordovaLib/Classes/CDVSound.m      |   699 -
 .../ios/CordovaLib/Classes/CDVSplashScreen.h    |    33 -
 .../ios/CordovaLib/Classes/CDVSplashScreen.m    |   225 -
 .../ios/CordovaLib/Classes/CDVURLProtocol.h     |    29 -
 .../ios/CordovaLib/Classes/CDVURLProtocol.m     |   230 -
 .../ios/CordovaLib/Classes/CDVUserAgentUtil.h   |    27 -
 .../ios/CordovaLib/Classes/CDVUserAgentUtil.m   |   120 -
 .../ios/CordovaLib/Classes/CDVViewController.h  |    73 -
 .../ios/CordovaLib/Classes/CDVViewController.m  |   931 -
 .../ios/CordovaLib/Classes/CDVWebViewDelegate.h |    37 -
 .../ios/CordovaLib/Classes/CDVWebViewDelegate.m |   171 -
 .../push/ios/CordovaLib/Classes/CDVWhitelist.h  |    36 -
 .../push/ios/CordovaLib/Classes/CDVWhitelist.m  |   192 -
 .../CordovaLib/Classes/NSArray+Comparisons.h    |    26 -
 .../CordovaLib/Classes/NSArray+Comparisons.m    |    41 -
 .../push/ios/CordovaLib/Classes/NSData+Base64.h |    33 -
 .../push/ios/CordovaLib/Classes/NSData+Base64.m |   281 -
 .../Classes/NSDictionary+Extensions.h           |    35 -
 .../Classes/NSDictionary+Extensions.m           |   159 -
 .../Classes/NSMutableArray+QueueAdditions.h     |    29 -
 .../Classes/NSMutableArray+QueueAdditions.m     |    58 -
 .../CordovaLib/Classes/UIDevice+Extensions.h    |    31 -
 .../CordovaLib/Classes/UIDevice+Extensions.m    |    47 -
 .../Classes/compatibility/0.9.6/CDV.h           |    30 -
 .../Classes/compatibility/0.9.6/CDVPlugin.h     |    46 -
 .../Classes/compatibility/0.9.6/CDVPlugin.m     |    29 -
 .../Classes/compatibility/1.5.0/CDV.h           |    32 -
 .../Classes/compatibility/1.5.0/CDVPlugin.h     |    23 -
 .../CordovaLib/Classes/compatibility/README.txt |    23 -
 .../CordovaLib.xcodeproj/project.pbxproj        |   667 -
 .../push/ios/CordovaLib/CordovaLib_Prefix.pch   |    22 -
 .../samples/push/ios/CordovaLib/VERSION         |     1 -
 .../apigee-sdk/samples/push/ios/cordova/build   |    51 -
 .../apigee-sdk/samples/push/ios/cordova/emulate |    55 -
 .../apigee-sdk/samples/push/ios/cordova/log     |    23 -
 .../apigee-sdk/samples/push/ios/cordova/release |    51 -
 .../apigee-sdk/samples/push/ios/cordova/run     |    58 -
 .../push/ios/iospush.xcodeproj/project.pbxproj  |   623 -
 .../push/ios/iospush/Classes/AppDelegate.h      |    42 -
 .../push/ios/iospush/Classes/AppDelegate.m      |   122 -
 .../ios/iospush/Classes/MainViewController.h    |    40 -
 .../ios/iospush/Classes/MainViewController.m    |   174 -
 .../ios/iospush/Classes/MainViewController.xib  |   138 -
 .../iospush/Plugins/AppDelegate+notification.h  |    20 -
 .../iospush/Plugins/AppDelegate+notification.m  |   119 -
 .../push/ios/iospush/Plugins/PushPlugin.h       |    54 -
 .../push/ios/iospush/Plugins/PushPlugin.m       |   248 -
 .../samples/push/ios/iospush/Plugins/README     |    20 -
 .../Resources/Capture.bundle/controls_bg.png    |   Bin 955 -> 0 bytes
 .../Resources/Capture.bundle/controls_bg@2x.png |   Bin 971 -> 0 bytes
 .../Capture.bundle/controls_bg@2x~ipad.png      |   Bin 2858 -> 0 bytes
 .../Capture.bundle/controls_bg~ipad.png         |   Bin 969 -> 0 bytes
 .../microphone-568h@2x~iphone.png               |   Bin 531673 -> 0 bytes
 .../Resources/Capture.bundle/microphone.png     |   Bin 72226 -> 0 bytes
 .../Resources/Capture.bundle/microphone@2x.png  |   Bin 282409 -> 0 bytes
 .../Capture.bundle/microphone@2x~ipad.png       |   Bin 911582 -> 0 bytes
 .../Capture.bundle/microphone~ipad.png          |   Bin 393975 -> 0 bytes
 .../Resources/Capture.bundle/record_button.png  |   Bin 5852 -> 0 bytes
 .../Capture.bundle/record_button@2x.png         |   Bin 13875 -> 0 bytes
 .../Capture.bundle/record_button@2x~ipad.png    |   Bin 15822 -> 0 bytes
 .../Capture.bundle/record_button~ipad.png       |   Bin 7547 -> 0 bytes
 .../Resources/Capture.bundle/recording_bg.png   |   Bin 973 -> 0 bytes
 .../Capture.bundle/recording_bg@2x.png          |   Bin 990 -> 0 bytes
 .../Capture.bundle/recording_bg@2x~ipad.png     |   Bin 1026 -> 0 bytes
 .../Capture.bundle/recording_bg~ipad.png        |   Bin 996 -> 0 bytes
 .../Resources/Capture.bundle/stop_button.png    |   Bin 5514 -> 0 bytes
 .../Resources/Capture.bundle/stop_button@2x.png |   Bin 12965 -> 0 bytes
 .../Capture.bundle/stop_button@2x~ipad.png      |   Bin 14474 -> 0 bytes
 .../Capture.bundle/stop_button~ipad.png         |   Bin 7119 -> 0 bytes
 .../Resources/de.lproj/Localizable.strings      |    26 -
 .../Resources/en.lproj/Localizable.strings      |    25 -
 .../Resources/es.lproj/Localizable.strings      |    25 -
 .../ios/iospush/Resources/icons/icon-72.png     |   Bin 4944 -> 0 bytes
 .../ios/iospush/Resources/icons/icon-72@2x.png  |   Bin 11706 -> 0 bytes
 .../push/ios/iospush/Resources/icons/icon.png   |   Bin 3902 -> 0 bytes
 .../ios/iospush/Resources/icons/icon@2x.png     |   Bin 7869 -> 0 bytes
 .../Resources/se.lproj/Localizable.strings      |    26 -
 .../Resources/splash/Default-568h@2x~iphone.png |   Bin 34225 -> 0 bytes
 .../splash/Default-Landscape@2x~ipad.png        |   Bin 77300 -> 0 bytes
 .../Resources/splash/Default-Landscape~ipad.png |   Bin 34935 -> 0 bytes
 .../splash/Default-Portrait@2x~ipad.png         |   Bin 76546 -> 0 bytes
 .../Resources/splash/Default-Portrait~ipad.png  |   Bin 34278 -> 0 bytes
 .../Resources/splash/Default@2x~iphone.png      |   Bin 29475 -> 0 bytes
 .../iospush/Resources/splash/Default~iphone.png |   Bin 10394 -> 0 bytes
 .../samples/push/ios/iospush/config.xml         |    65 -
 .../samples/push/ios/iospush/iospush-Info.plist |    78 -
 .../samples/push/ios/iospush/iospush-Prefix.pch |    26 -
 .../apigee-sdk/samples/push/ios/iospush/main.m  |    35 -
 .../samples/push/ios/www/PushNotification.js    |    65 -
 .../samples/push/ios/www/cordova-2.6.0.js       |  6433 ----
 .../samples/push/ios/www/css/index.css          |   115 -
 .../samples/push/ios/www/img/logo.png           |   Bin 21814 -> 0 bytes
 .../apigee-sdk/samples/push/ios/www/js/index.js |   217 -
 .../res/screen/ios/screen-ipad-landscape-2x.png |   Bin 1534088 -> 0 bytes
 .../res/screen/ios/screen-ipad-landscape.png    |   Bin 407370 -> 0 bytes
 .../res/screen/ios/screen-ipad-portrait-2x.png  |   Bin 1610434 -> 0 bytes
 .../www/res/screen/ios/screen-ipad-portrait.png |   Bin 422441 -> 0 bytes
 .../screen/ios/screen-iphone-landscape-2x.png   |   Bin 339639 -> 0 bytes
 .../res/screen/ios/screen-iphone-landscape.png  |   Bin 92301 -> 0 bytes
 .../screen/ios/screen-iphone-portrait-2x.png    |   Bin 350593 -> 0 bytes
 .../res/screen/ios/screen-iphone-portrait.png   |   Bin 93897 -> 0 bytes
 .../apigee-sdk/samples/push/ios/www/spec.html   |    68 -
 .../samples/push/ios/www/spec/helper.js         |    33 -
 .../samples/push/ios/www/spec/index.js          |    67 -
 .../ios/www/spec/lib/jasmine-1.2.0/MIT.LICENSE  |    20 -
 .../www/spec/lib/jasmine-1.2.0/jasmine-html.js  |   616 -
 .../ios/www/spec/lib/jasmine-1.2.0/jasmine.css  |    81 -
 .../ios/www/spec/lib/jasmine-1.2.0/jasmine.js   |  2529 --
 .../samples/usersAndGroups/README.txt           |    22 -
 .../usersAndGroups/css/codiqa.ext.min.css       |     1 -
 .../usersAndGroups/css/images/ajax-loader.gif   |   Bin 7825 -> 0 bytes
 .../css/images/icons-18-black.png               |   Bin 1968 -> 0 bytes
 .../css/images/icons-18-white.png               |   Bin 1988 -> 0 bytes
 .../css/images/icons-36-black.png               |   Bin 3859 -> 0 bytes
 .../css/images/icons-36-white.png               |   Bin 3861 -> 0 bytes
 .../css/jquery.mobile-1.3.1.min.css             |     3 -
 .../samples/usersAndGroups/js/codiqa.ext.min.js |     6 -
 .../samples/usersAndGroups/js/index.js          |   345 -
 .../usersAndGroups/js/jquery-1.9.1.min.js       |     5 -
 .../js/jquery.mobile-1.3.1.min.js               |     7 -
 .../bower_components/apigee.max.ui/bower.json   |    19 -
 .../apigee.max.ui/dist/css/max.min.css          |     1 -
 .../apigee.max.ui/dist/img/no-data1.png         |   Bin 45300 -> 0 bytes
 .../apigee.max.ui/dist/img/phone-small.gif      |   Bin 1300 -> 0 bytes
 .../apigee.max.ui/dist/img/tablet-small.gif     |   Bin 1390 -> 0 bytes
 .../apigee.max.ui/dist/js/max-dev.min.js        |  1781 -
 .../apigee.max.ui/dist/js/max.min.js            |     4 -
 .../bower_components/intro.js/BUILD/BUILD.js    |    43 -
 .../2.0.2/bower_components/intro.js/Makefile    |     6 -
 .../2.0.2/bower_components/intro.js/README.md   |   487 -
 .../2.0.2/bower_components/intro.js/bower.json  |     9 -
 .../bower_components/intro.js/component.json    |    13 -
 .../2.0.2/bower_components/intro.js/intro.js    |   940 -
 .../bower_components/intro.js/introjs-rtl.css   |    22 -
 .../2.0.2/bower_components/intro.js/introjs.css |   248 -
 .../intro.js/minified/intro.min.js              |    24 -
 .../intro.js/minified/introjs-rtl.min.css       |     1 -
 .../intro.js/minified/introjs.min.css           |     1 -
 .../bower_components/intro.js/package.json      |    17 -
 .../jquery-waypoints/CHANGELOG.md               |    92 -
 .../jquery-waypoints/README.markdown            |    47 -
 .../jquery-waypoints/bower.json                 |    19 -
 .../jquery-waypoints/licenses.txt               |    23 -
 .../jquery-waypoints/package.json               |    19 -
 .../infinite-scroll/waypoints-infinite.js       |    67 -
 .../infinite-scroll/waypoints-infinite.min.js   |     8 -
 .../sticky-elements/waypoints-sticky.js         |    55 -
 .../sticky-elements/waypoints-sticky.min.js     |     8 -
 .../jquery-waypoints/waypoints.js               |   520 -
 .../jquery-waypoints/waypoints.min.js           |     8 -
 .../bower_components/jquery/MIT-LICENSE.txt     |    21 -
 .../2.0.2/bower_components/jquery/bower.json    |    27 -
 .../bower_components/jquery/dist/jquery.js      |  9174 -----
 .../bower_components/jquery/dist/jquery.min.js  |     5 -
 .../bower_components/jquery/dist/jquery.min.map |     1 -
 .../2.0.2/bower_components/jquery/src/ajax.js   |   806 -
 .../bower_components/jquery/src/ajax/jsonp.js   |    89 -
 .../bower_components/jquery/src/ajax/load.js    |    75 -
 .../jquery/src/ajax/parseJSON.js                |    13 -
 .../jquery/src/ajax/parseXML.js                 |    28 -
 .../bower_components/jquery/src/ajax/script.js  |    64 -
 .../jquery/src/ajax/var/nonce.js                |     5 -
 .../jquery/src/ajax/var/rquery.js               |     3 -
 .../bower_components/jquery/src/ajax/xhr.js     |   135 -
 .../bower_components/jquery/src/attributes.js   |    11 -
 .../jquery/src/attributes/attr.js               |   143 -
 .../jquery/src/attributes/classes.js            |   158 -
 .../jquery/src/attributes/prop.js               |    96 -
 .../jquery/src/attributes/support.js            |    35 -
 .../jquery/src/attributes/val.js                |   163 -
 .../bower_components/jquery/src/callbacks.js    |   205 -
 .../2.0.2/bower_components/jquery/src/core.js   |   498 -
 .../bower_components/jquery/src/core/access.js  |    60 -
 .../bower_components/jquery/src/core/init.js    |   123 -
 .../jquery/src/core/parseHTML.js                |    39 -
 .../bower_components/jquery/src/core/ready.js   |    97 -
 .../jquery/src/core/var/rsingleTag.js           |     4 -
 .../2.0.2/bower_components/jquery/src/css.js    |   451 -
 .../jquery/src/css/addGetHookIf.js              |    24 -
 .../bower_components/jquery/src/css/curCSS.js   |    57 -
 .../jquery/src/css/defaultDisplay.js            |    70 -
 .../jquery/src/css/hiddenVisibleSelectors.js    |    15 -
 .../bower_components/jquery/src/css/support.js  |    91 -
 .../bower_components/jquery/src/css/swap.js     |    28 -
 .../jquery/src/css/var/cssExpand.js             |     3 -
 .../jquery/src/css/var/getStyles.js             |     5 -
 .../jquery/src/css/var/isHidden.js              |    13 -
 .../jquery/src/css/var/rmargin.js               |     3 -
 .../jquery/src/css/var/rnumnonpx.js             |     5 -
 .../2.0.2/bower_components/jquery/src/data.js   |   175 -
 .../bower_components/jquery/src/data/Data.js    |   181 -
 .../bower_components/jquery/src/data/accepts.js |    20 -
 .../jquery/src/data/var/data_priv.js            |     5 -
 .../jquery/src/data/var/data_user.js            |     5 -
 .../bower_components/jquery/src/deferred.js     |   149 -
 .../bower_components/jquery/src/deprecated.js   |    13 -
 .../bower_components/jquery/src/dimensions.js   |    50 -
 .../bower_components/jquery/src/effects.js      |   647 -
 .../jquery/src/effects/Tween.js                 |   114 -
 .../jquery/src/effects/animatedSelector.js      |    13 -
 .../2.0.2/bower_components/jquery/src/event.js  |   868 -
 .../bower_components/jquery/src/event/alias.js  |    39 -
 .../jquery/src/event/support.js                 |     9 -
 .../bower_components/jquery/src/exports/amd.js  |    24 -
 .../jquery/src/exports/global.js                |    32 -
 .../2.0.2/bower_components/jquery/src/intro.js  |    44 -
 .../2.0.2/bower_components/jquery/src/jquery.js |    36 -
 .../bower_components/jquery/src/manipulation.js |   582 -
 .../jquery/src/manipulation/_evalUrl.js         |    18 -
 .../jquery/src/manipulation/support.js          |    31 -
 .../src/manipulation/var/rcheckableType.js      |     3 -
 .../2.0.2/bower_components/jquery/src/offset.js |   204 -
 .../2.0.2/bower_components/jquery/src/outro.js  |     1 -
 .../2.0.2/bower_components/jquery/src/queue.js  |   142 -
 .../bower_components/jquery/src/queue/delay.js  |    22 -
 .../jquery/src/selector-native.js               |   172 -
 .../jquery/src/selector-sizzle.js               |    14 -
 .../bower_components/jquery/src/selector.js     |     1 -
 .../bower_components/jquery/src/serialize.js    |   111 -
 .../jquery/src/sizzle/dist/sizzle.js            |  2034 --
 .../jquery/src/sizzle/dist/sizzle.min.js        |     3 -
 .../jquery/src/sizzle/dist/sizzle.min.map       |     1 -
 .../bower_components/jquery/src/traversing.js   |   200 -
 .../jquery/src/traversing/findFilter.js         |   100 -
 .../jquery/src/traversing/var/rneedsContext.js  |     6 -
 .../bower_components/jquery/src/var/arr.js      |     3 -
 .../jquery/src/var/class2type.js                |     4 -
 .../bower_components/jquery/src/var/concat.js   |     5 -
 .../bower_components/jquery/src/var/hasOwn.js   |     5 -
 .../bower_components/jquery/src/var/indexOf.js  |     5 -
 .../bower_components/jquery/src/var/pnum.js     |     3 -
 .../bower_components/jquery/src/var/push.js     |     5 -
 .../jquery/src/var/rnotwhite.js                 |     3 -
 .../bower_components/jquery/src/var/slice.js    |     5 -
 .../jquery/src/var/strundefined.js              |     3 -
 .../bower_components/jquery/src/var/support.js  |     4 -
 .../bower_components/jquery/src/var/toString.js |     5 -
 .../bower_components/jquery/src/var/trim.js     |     3 -
 .../2.0.2/bower_components/jquery/src/wrap.js   |    78 -
 .../bower_components/sizzle/dist/sizzle.js      |  2015 -
 .../bower_components/sizzle/dist/sizzle.min.js  |     3 -
 .../bower_components/sizzle/dist/sizzle.min.map |     1 -
 .../bower_components/sizzle/tasks/commit.js     |    10 -
 .../bower_components/sizzle/tasks/compile.js    |    34 -
 .../2.0.2/bower_components/sizzle/tasks/dist.js |    35 -
 .../bower_components/sizzle/tasks/release.js    |    43 -
 .../2.0.2/bower_components/sizzle/tasks/tag.js  |     9 -
 .../bower_components/sizzle/tasks/version.js    |    35 -
 .../bower_components/sizzle/test/data/empty.js  |     0
 .../sizzle/test/data/mixed_sort.html            |    22 -
 .../sizzle/test/data/testinit.js                |   136 -
 .../bower_components/sizzle/test/jquery.js      |  9597 -----
 .../sizzle/test/libs/qunit/qunit.css            |   244 -
 .../sizzle/test/libs/qunit/qunit.js             |  2212 --
 .../sizzle/test/unit/extending.js               |    95 -
 .../sizzle/test/unit/selector.js                |  1138 -
 .../sizzle/test/unit/utilities.js               |   169 -
 .../2.0.2/css/apigeeGlobalNavigation.css        |   274 -
 .../css/arsmarquette/ARSMaquettePro-Light.otf   |   Bin 184600 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Medium.otf  |   Bin 188020 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Regular.otf |   Bin 188096 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/css/dash.min.css    |     1 -
 .../dist/appsvc-ui/2.0.2/css/entypo/entypo.eot  |   Bin 35540 -> 0 bytes
 .../dist/appsvc-ui/2.0.2/css/entypo/entypo.svg  |    13 -
 .../dist/appsvc-ui/2.0.2/css/entypo/entypo.ttf  |   Bin 35392 -> 0 bytes
 .../dist/appsvc-ui/2.0.2/css/entypo/entypo.woff |   Bin 21916 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/css/main.css        |  1970 -
 .../2.0.2/img/appswitcher/apiPlatform_lg.png    |   Bin 2397 -> 0 bytes
 .../2.0.2/img/appswitcher/appServices_lg.png    |   Bin 2295 -> 0 bytes
 .../2.0.2/img/appswitcher/console_lg.png        |   Bin 1453 -> 0 bytes
 .../appsvc-ui/2.0.2/img/appswitcher/home_lg.png |   Bin 1522 -> 0 bytes
 .../2.0.2/img/appswitcher/logo_color.png        |   Bin 3459 -> 0 bytes
 .../appsvc-ui/2.0.2/img/appswitcher/max_lg.png  |   Bin 1970 -> 0 bytes
 .../img/appswitcher/triangleMenuItem_right.png  |   Bin 1158 -> 0 bytes
 .../triangleMenuItem_right_hover.png            |   Bin 1169 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/blue-bars.png   |   Bin 3635 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/blue-bolt.png   |   Bin 3942 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/blue-carat.png  |   Bin 1006 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/green_dot.png   |   Bin 3472 -> 0 bytes
 .../2.0.2/img/introjs_arrow_step_next.png       |   Bin 219 -> 0 bytes
 .../img/introjs_arrow_step_next_disabled.png    |   Bin 220 -> 0 bytes
 .../2.0.2/img/introjs_arrow_step_prev.png       |   Bin 217 -> 0 bytes
 .../img/introjs_arrow_step_prev_disabled.png    |   Bin 218 -> 0 bytes
 .../dist/appsvc-ui/2.0.2/img/introjs_close.png  |   Bin 274 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/logo.gif        |   Bin 2279 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/nav-device.gif  |   Bin 2184 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/nav-sprites.png |   Bin 7953 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/no-data1.png    |   Bin 45300 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/phone-small.gif |   Bin 1300 -> 0 bytes
 .../2.0.2/img/push/APNS_cert_upload.png         |   Bin 33956 -> 0 bytes
 .../2.0.2/img/push/APNS_certification.png       |   Bin 16855 -> 0 bytes
 .../2.0.2/img/push/android-notification.png     |   Bin 41629 -> 0 bytes
 .../appsvc-ui/2.0.2/img/push/google_api_key.png |   Bin 98118 -> 0 bytes
 .../appsvc-ui/2.0.2/img/push/iphone_message.png |   Bin 90307 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/push/step_1.png |   Bin 1953 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/push/step_2.png |   Bin 2117 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/push/step_3.png |   Bin 2162 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/red_dot.png     |   Bin 3482 -> 0 bytes
 .../appsvc-ui/2.0.2/img/sdk-sprites-large.png   |   Bin 14642 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/sdk-sprites.png |   Bin 5027 -> 0 bytes
 .../dist/appsvc-ui/2.0.2/img/tablet-small.gif   |   Bin 1390 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/user-photo.png  |   Bin 3849 -> 0 bytes
 .../dist/appsvc-ui/2.0.2/img/user_profile.png   |   Bin 3775 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/verify.png      |   Bin 22934 -> 0 bytes
 portal/dist/appsvc-ui/2.0.2/img/yellow_dot.png  |   Bin 3475 -> 0 bytes
 .../2.0.2/js/libs/Highcharts-2.3.5/index.htm    |    79 -
 .../js/adapters/mootools-adapter.js             |    13 -
 .../js/adapters/mootools-adapter.src.js         |   328 -
 .../js/adapters/prototype-adapter.js            |    16 -
 .../js/adapters/prototype-adapter.src.js        |   385 -
 .../libs/Highcharts-2.3.5/js/highcharts-more.js |    35 -
 .../Highcharts-2.3.5/js/highcharts-more.src.js  |  1581 -
 .../js/libs/Highcharts-2.3.5/js/highcharts.js   |   250 -
 .../libs/Highcharts-2.3.5/js/highcharts.src.js  | 15281 --------
 .../Highcharts-2.3.5/js/modules/canvas-tools.js |   133 -
 .../js/modules/canvas-tools.src.js              |  3113 --
 .../js/libs/Highcharts-2.3.5/js/modules/data.js |    14 -
 .../Highcharts-2.3.5/js/modules/data.src.js     |   512 -
 .../Highcharts-2.3.5/js/modules/exporting.js    |    23 -
 .../js/modules/exporting.src.js                 |   752 -
 .../Highcharts-2.3.5/js/themes/dark-blue.js     |   263 -
 .../Highcharts-2.3.5/js/themes/dark-green.js    |   263 -
 .../js/libs/Highcharts-2.3.5/js/themes/gray.js  |   262 -
 .../js/libs/Highcharts-2.3.5/js/themes/grid.js  |    95 -
 .../js/libs/Highcharts-2.3.5/js/themes/skies.js |    89 -
 portal/dist/appsvc-ui/2.0.2/js/libs/MD5.min.js  |     1 -
 .../js/libs/angular-1.0.5/angular-cookies.js    |   183 -
 .../libs/angular-1.0.5/angular-cookies.min.js   |     7 -
 .../js/libs/angular-1.0.5/angular-loader.js     |   276 -
 .../js/libs/angular-1.0.5/angular-loader.min.js |     7 -
 .../js/libs/angular-1.0.5/angular-mocks.js      |  1886 -
 .../js/libs/angular-1.0.5/angular-resource.js   |   445 -
 .../libs/angular-1.0.5/angular-resource.min.js  |    10 -
 .../js/libs/angular-1.0.5/angular-sanitize.js   |   535 -
 .../libs/angular-1.0.5/angular-sanitize.min.js  |    13 -
 .../2.0.2/js/libs/angular-1.0.5/angular.js      | 14733 --------
 .../2.0.2/js/libs/angular-1.0.5/angular.min.js  |   161 -
 .../2.0.2/js/libs/angular-1.0.5/version.txt     |     1 -
 .../js/libs/angular-1.1.5/angular-1.1.5.js      | 16876 ---------
 .../js/libs/angular-1.1.5/angular-merge.min.js  |     8 -
 .../angular-1.1.5/angular-resource-1.1.5.js     |   537 -
 .../js/libs/angular-1.2.5/angular-animate.js    |  1323 -
 .../libs/angular-1.2.5/angular-animate.min.js   |    23 -
 .../angular-1.2.5/angular-animate.min.js.map    |     8 -
 .../js/libs/angular-1.2.5/angular-cookies.js    |   202 -
 .../libs/angular-1.2.5/angular-cookies.min.js   |     8 -
 .../angular-1.2.5/angular-cookies.min.js.map    |     8 -
 .../2.0.2/js/libs/angular-1.2.5/angular-csp.css |    24 -
 .../js/libs/angular-1.2.5/angular-loader.js     |   410 -
 .../js/libs/angular-1.2.5/angular-loader.min.js |     9 -
 .../angular-1.2.5/angular-loader.min.js.map     |     8 -
 .../js/libs/angular-1.2.5/angular-mocks.js      |  2116 --
 .../js/libs/angular-1.2.5/angular-resource.js   |   565 -
 .../libs/angular-1.2.5/angular-resource.min.js  |    13 -
 .../angular-1.2.5/angular-resource.min.js.map   |     8 -
 .../js/libs/angular-1.2.5/angular-route.js      |   911 -
 .../js/libs/angular-1.2.5/angular-route.min.js  |    14 -
 .../libs/angular-1.2.5/angular-route.min.js.map |     8 -
 .../js/libs/angular-1.2.5/angular-sanitize.js   |   622 -
 .../libs/angular-1.2.5/angular-sanitize.min.js  |    14 -
 .../angular-1.2.5/angular-sanitize.min.js.map   |     8 -
 .../js/libs/angular-1.2.5/angular-scenario.js   | 32374 -----------------
 .../js/libs/angular-1.2.5/angular-touch.js      |   563 -
 .../js/libs/angular-1.2.5/angular-touch.min.js  |    13 -
 .../libs/angular-1.2.5/angular-touch.min.js.map |     8 -
 .../2.0.2/js/libs/angular-1.2.5/angular.js      | 20369 -----------
 .../2.0.2/js/libs/angular-1.2.5/angular.min.js  |   201 -
 .../js/libs/angular-1.2.5/angular.min.js.map    |     8 -
 .../2.0.2/js/libs/angular-1.2.5/errors.json     |     1 -
 .../2.0.2/js/libs/angular-1.2.5/version.json    |     1 -
 .../2.0.2/js/libs/angular-1.2.5/version.txt     |     1 -
 .../angularitics-0.8.5-google-analytics.js      |     7 -
 .../js/libs/angularitics/angularitics-0.8.5.js  |     6 -
 .../libs/bootstrap/css/bootstrap-responsive.css |  1345 -
 .../bootstrap/css/bootstrap-responsive.min.css  |  1245 -
 .../2.0.2/js/libs/bootstrap/css/bootstrap.css   |  6169 ----
 .../js/libs/bootstrap/css/bootstrap.min.css     |  5469 ---
 .../js/libs/bootstrap/custom/css/bootstrap.css  |  6316 ----
 .../libs/bootstrap/custom/css/bootstrap.min.css |     9 -
 .../custom/img/glyphicons-halflings-white.png   |   Bin 8777 -> 0 bytes
 .../custom/img/glyphicons-halflings.png         |   Bin 12799 -> 0 bytes
 .../js/libs/bootstrap/custom/js/bootstrap.js    |  2291 --
 .../libs/bootstrap/custom/js/bootstrap.min.js   |     7 -
 .../img/glyphicons-halflings-white.png          |   Bin 8777 -> 0 bytes
 .../libs/bootstrap/img/glyphicons-halflings.png |   Bin 12799 -> 0 bytes
 .../2.0.2/js/libs/bootstrap/js/bootstrap.js     |  2117 --
 .../2.0.2/js/libs/bootstrap/js/bootstrap.min.js |   644 -
 .../appsvc-ui/2.0.2/js/libs/google-viz-api.js   |    49 -
 .../2.0.2/js/libs/jquery/jquery-1.9.1.min.js    |     5 -
 .../js/libs/jquery/jquery-migrate-1.1.1.min.js  |     3 -
 .../js/libs/jquery/jquery.sparkline.min.js      |     5 -
 .../2.0.2/js/libs/jqueryui/date.min.js          |     2 -
 .../ui-bg_diagonals-thick_90_eeeeee_40x40.png   |   Bin 251 -> 0 bytes
 .../images/ui-bg_flat_100_deedf7_40x100.png     |   Bin 182 -> 0 bytes
 .../images/ui-bg_flat_100_e4f1fb_40x100.png     |   Bin 213 -> 0 bytes
 .../images/ui-bg_flat_100_f2f5f7_40x100.png     |   Bin 212 -> 0 bytes
 .../images/ui-bg_flat_15_cd0a0a_40x100.png      |   Bin 181 -> 0 bytes
 .../images/ui-bg_flat_50_3baae3_40x100.png      |   Bin 182 -> 0 bytes
 .../images/ui-bg_flat_80_d7ebf9_40x100.png      |   Bin 183 -> 0 bytes
 .../ui-bg_highlight-hard_70_000000_1x100.png    |   Bin 118 -> 0 bytes
 .../ui-bg_highlight-soft_25_ffef8f_1x100.png    |   Bin 153 -> 0 bytes
 .../jqueryui/images/ui-icons_000000_256x240.png |   Bin 4369 -> 0 bytes
 .../jqueryui/images/ui-icons_2694e8_256x240.png |   Bin 4369 -> 0 bytes
 .../jqueryui/images/ui-icons_2e83ff_256x240.png |   Bin 4369 -> 0 bytes
 .../jqueryui/images/ui-icons_3d80b3_256x240.png |   Bin 4369 -> 0 bytes
 .../jqueryui/images/ui-icons_72a7cf_256x240.png |   Bin 4369 -> 0 bytes
 .../jqueryui/images/ui-icons_ffffff_256x240.png |   Bin 4369 -> 0 bytes
 .../js/libs/jqueryui/jquery-ui-1.8.18.min.js    |    15 -
 .../js/libs/jqueryui/jquery-ui-1.8.9.custom.css |     1 -
 .../js/libs/jqueryui/jquery-ui-timepicker.css   |     1 -
 .../libs/jqueryui/jquery.ui.timepicker.min.js   |     1 -
 .../ui-bootstrap-custom-0.3.0.min.js            |     1 -
 .../ui-bootstrap-custom-tpls-0.3.0.min.js       |     1 -
 .../2.0.2/js/libs/usergrid-libs.min.js          |    22 -
 .../appsvc-ui/2.0.2/js/libs/usergrid.sdk.js     |  2474 --
 .../dist/appsvc-ui/2.0.2/js/usergrid-dev.min.js |  4939 ---
 portal/dist/appsvc-ui/2.0.2/js/usergrid.min.js  |     6 -
 portal/dist/appsvc-ui/archive/coming_soon.html  |    31 -
 .../ui-bg_diagonals-thick_90_eeeeee_40x40.png   |   Bin 251 -> 0 bytes
 .../images/ui-bg_flat_100_deedf7_40x100.png     |   Bin 182 -> 0 bytes
 .../images/ui-bg_flat_100_e4f1fb_40x100.png     |   Bin 213 -> 0 bytes
 .../images/ui-bg_flat_100_f2f5f7_40x100.png     |   Bin 212 -> 0 bytes
 .../images/ui-bg_flat_15_cd0a0a_40x100.png      |   Bin 181 -> 0 bytes
 .../images/ui-bg_flat_50_3baae3_40x100.png      |   Bin 182 -> 0 bytes
 .../images/ui-bg_flat_80_d7ebf9_40x100.png      |   Bin 183 -> 0 bytes
 .../ui-bg_highlight-hard_70_000000_1x100.png    |   Bin 118 -> 0 bytes
 .../ui-bg_highlight-soft_25_ffef8f_1x100.png    |   Bin 153 -> 0 bytes
 .../images/ui-icons_000000_256x240.png          |   Bin 4369 -> 0 bytes
 .../images/ui-icons_2694e8_256x240.png          |   Bin 4369 -> 0 bytes
 .../images/ui-icons_2e83ff_256x240.png          |   Bin 4369 -> 0 bytes
 .../images/ui-icons_3d80b3_256x240.png          |   Bin 4369 -> 0 bytes
 .../images/ui-icons_72a7cf_256x240.png          |   Bin 4369 -> 0 bytes
 .../images/ui-icons_ffffff_256x240.png          |   Bin 4369 -> 0 bytes
 .../css/custom-theme/jquery-ui-1.8.9.custom.css |   573 -
 .../archive/css/jquery-ui-timepicker.css        |    53 -
 .../archive/css/jquery.ui.statusbar.css         |    25 -
 portal/dist/appsvc-ui/archive/css/prettify.css  |    52 -
 .../appsvc-ui/archive/css/usergrid-stripped.css |  5199 ---
 portal/dist/appsvc-ui/archive/css/usergrid.css  |  5203 ---
 portal/dist/appsvc-ui/archive/dash/README.md    |     3 -
 .../archive/dash/config/testacular-e2e.conf.js  |    22 -
 .../archive/dash/config/testacular.conf.js      |    20 -
 .../appsvc-ui/archive/dash/test/e2e/runner.html |    10 -
 .../archive/dash/test/e2e/scenarios.js          |    45 -
 .../dash/test/lib/angular/angular-mocks.js      |  1764 -
 .../dash/test/lib/angular/angular-scenario.js   | 26195 -------------
 .../archive/dash/test/lib/angular/version.txt   |     1 -
 .../archive/dash/test/unit/controllersSpec.js   |    31 -
 .../archive/dash/test/unit/directivesSpec.js    |    19 -
 .../archive/dash/test/unit/filtersSpec.js       |    19 -
 .../archive/dash/test/unit/servicesSpec.js      |    14 -
 .../archive/images/APNS_cert_upload.png         |   Bin 33956 -> 0 bytes
 .../archive/images/APNS_certification.png       |   Bin 16855 -> 0 bytes
 .../archive/images/android-notification.png     |   Bin 41629 -> 0 bytes
 .../archive/images/android-sdk-download.png     |   Bin 4848 -> 0 bytes
 .../appsvc-ui/archive/images/api-activity.gif   |   Bin 10819 -> 0 bytes
 .../appsvc-ui/archive/images/apigee-logo.png    |   Bin 3647 -> 0 bytes
 .../appsvc-ui/archive/images/apigeetopbar.png   |   Bin 4658 -> 0 bytes
 .../archive/images/background_one_col.png       |   Bin 3126 -> 0 bytes
 .../archive/images/btn-copyCurl-up.png          |   Bin 2762 -> 0 bytes
 .../dist/appsvc-ui/archive/images/clippy-bg.png |   Bin 561 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/close.gif  |   Bin 718 -> 0 bytes
 .../archive/images/dotnet-sdk-download.png      |   Bin 7149 -> 0 bytes
 .../appsvc-ui/archive/images/down_arrow.png     |   Bin 1285 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/error.png  |   Bin 2009 -> 0 bytes
 .../appsvc-ui/archive/images/faviconApigee.ico  |   Bin 1150 -> 0 bytes
 .../images/glyphicons-halflings-white.png       |   Bin 4352 -> 0 bytes
 .../archive/images/glyphicons-halflings.png     |   Bin 4352 -> 0 bytes
 .../glyphicons_halflings_135_wrench-white2.pdn  |   Bin 5400 -> 0 bytes
 .../glyphicons_halflings_135_wrench-white2.png  |   Bin 296 -> 0 bytes
 .../images/glyphicons_halflings_135_wrench.png  |   Bin 228 -> 0 bytes
 .../glyphicons_halflings_135_wrench_white.png   |   Bin 251 -> 0 bytes
 .../glyphicons_halflings_wrench_white.png       |   Bin 1016 -> 0 bytes
 .../appsvc-ui/archive/images/google_api_key.png |   Bin 98118 -> 0 bytes
 .../dist/appsvc-ui/archive/images/green_dot.png |   Bin 3472 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/grid.png   |   Bin 166 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/icons.png  |   Bin 13132 -> 0 bytes
 .../archive/images/ios-sdk-download.png         |   Bin 4886 -> 0 bytes
 .../appsvc-ui/archive/images/iphone_message.png |   Bin 90307 -> 0 bytes
 .../archive/images/javascript-sdk-download.png  |   Bin 4618 -> 0 bytes
 .../appsvc-ui/archive/images/left_arrow.png     |   Bin 1257 -> 0 bytes
 .../appsvc-ui/archive/images/logo-white.png     |   Bin 2014 -> 0 bytes
 .../archive/images/menuActiveTriangle.png       |   Bin 315 -> 0 bytes
 .../archive/images/nodejs-sdk-download.png      |   Bin 5273 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/notice.png |   Bin 2112 -> 0 bytes
 .../appsvc-ui/archive/images/orange-arrow.png   |   Bin 242 -> 0 bytes
 .../archive/images/push_notifications_icon.png  |   Bin 338 -> 0 bytes
 .../dist/appsvc-ui/archive/images/red_dot.png   |   Bin 3482 -> 0 bytes
 .../appsvc-ui/archive/images/right_arrow.png    |   Bin 1251 -> 0 bytes
 .../archive/images/ruby-sdk-download.png        |   Bin 6343 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/step_1.png |   Bin 1953 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/step_2.png |   Bin 2117 -> 0 bytes
 portal/dist/appsvc-ui/archive/images/step_3.png |   Bin 2162 -> 0 bytes
 .../dist/appsvc-ui/archive/images/success.png   |   Bin 1863 -> 0 bytes
 .../appsvc-ui/archive/images/swish_arrow.png    |   Bin 220 -> 0 bytes
 .../appsvc-ui/archive/images/topbackground.png  |   Bin 2890 -> 0 bytes
 .../dist/appsvc-ui/archive/images/up_arrow.png  |   Bin 1292 -> 0 bytes
 .../appsvc-ui/archive/images/user-photo.png     |   Bin 3849 -> 0 bytes
 .../appsvc-ui/archive/images/user_profile.png   |   Bin 3775 -> 0 bytes
 .../appsvc-ui/archive/images/usergrid_200.png   |   Bin 6397 -> 0 bytes
 .../appsvc-ui/archive/images/usergrid_400.png   |   Bin 8746 -> 0 bytes
 .../dist/appsvc-ui/archive/images/warning.png   |   Bin 1179 -> 0 bytes
 .../appsvc-ui/archive/images/yellow_dot.png     |   Bin 3475 -> 0 bytes
 .../dist/appsvc-ui/archive/index-stripped2.html |  1795 -
 portal/dist/appsvc-ui/archive/index.html        |  1931 -
 portal/dist/appsvc-ui/archive/js/app/app.js     |   131 -
 portal/dist/appsvc-ui/archive/js/app/console.js |  5397 ---
 portal/dist/appsvc-ui/archive/js/app/helpers.js |   241 -
 .../dist/appsvc-ui/archive/js/app/navigation.js |   251 -
 portal/dist/appsvc-ui/archive/js/app/pages.js   |   161 -
 portal/dist/appsvc-ui/archive/js/app/params.js  |    30 -
 .../dist/appsvc-ui/archive/js/app/quickLogin.js |    30 -
 portal/dist/appsvc-ui/archive/js/app/session.js |   176 -
 portal/dist/appsvc-ui/archive/js/app/sso.js     |   135 -
 portal/dist/appsvc-ui/archive/js/app/status.js  |    37 -
 .../archive/js/app/ui/collections.entity.js     |   320 -
 .../archive/js/app/ui/collections.user.js       |   120 -
 portal/dist/appsvc-ui/archive/js/app/ui/ui.js   |   415 -
 .../appsvc-ui/archive/js/app/usergrid.appSDK.js |  2097 --
 .../archive/js/app/usergrid.appSDK.orig.js      |  2070 --
 portal/dist/appsvc-ui/archive/js/lib/MD5.min.js |     1 -
 .../dist/appsvc-ui/archive/js/lib/backbone.js   |  1431 -
 .../appsvc-ui/archive/js/lib/bootstrap.min.js   |     7 -
 .../dist/appsvc-ui/archive/js/lib/date.min.js   |     2 -
 .../archive/js/lib/jquery-1.7.2.min.js          |     4 -
 .../archive/js/lib/jquery-ui-1.8.18.min.js      |    15 -
 .../archive/js/lib/jquery.dataset.min.js        |     1 -
 .../archive/js/lib/jquery.dform-0.1.3.min.js    |    16 -
 .../archive/js/lib/jquery.jsonp-2.3.1.min.js    |     3 -
 .../appsvc-ui/archive/js/lib/jquery.tmpl.min.js |    10 -
 .../archive/js/lib/jquery.ui.statusbar.min.js   |     1 -
 .../archive/js/lib/jquery.ui.timepicker.min.js  |     1 -
 .../dist/appsvc-ui/archive/js/lib/prettify.js   |  1477 -
 .../appsvc-ui/archive/js/lib/underscore-min.js  |     5 -
 .../appsvc-ui/archive/js/spec/client-tests.js   |   159 -
 .../dist/appsvc-ui/archive/js/spec/index.html   |    20 -
 .../appsvc-ui/archive/js/spec/qunit-git.css     |   238 -
 .../dist/appsvc-ui/archive/js/spec/qunit-git.js |  1865 -
 .../archive/js/unit-tests/appSDK-tests.js       |   255 -
 .../archive/js/unit-tests/ie-jquery-tests.js    |   191 -
 .../appsvc-ui/archive/js/unit-tests/qunit.css   |   231 -
 .../appsvc-ui/archive/js/unit-tests/qunit.js    |  1934 -
 portal/dist/appsvc-ui/archive/loading.html      |     9 -
 portal/dist/appsvc-ui/archive/max/index.html    |     0
 .../dist/appsvc-ui/archive/planned_outage.html  |    48 -
 portal/dist/appsvc-ui/archive/push/index.html   |    34 -
 portal/dist/appsvc-ui/archive/service_down.html |    48 -
 .../apigee.ui.activities.table_rows.html        |    14 -
 .../templates/apigee.ui.admins.table_rows.html  |     8 -
 .../apigee.ui.applications.table_rows.html      |     4 -
 .../apigee.ui.collection.table_rows.html        |    67 -
 .../apigee.ui.collections.query.indexes.html    |     5 -
 .../apigee.ui.collections.table_rows.html       |     9 -
 .../apigee.ui.collections.user.header.html      |    21 -
 .../templates/apigee.ui.curl.detail.html        |    11 -
 .../templates/apigee.ui.feed.table_rows.html    |    15 -
 .../templates/apigee.ui.groups.table_rows.html  |    14 -
 .../apigee.ui.panels.group.activities.html      |    28 -
 .../apigee.ui.panels.group.details.html         |    97 -
 .../apigee.ui.panels.group.memberships.html     |    40 -
 .../apigee.ui.panels.group.permissions.html     |    99 -
 ...pigee.ui.panels.notifications.configure.html |    14 -
 .../apigee.ui.panels.role.permissions.html      |    58 -
 .../templates/apigee.ui.panels.role.users.html  |    38 -
 .../apigee.ui.panels.user.activities.html       |    40 -
 .../templates/apigee.ui.panels.user.graph.html  |    80 -
 .../apigee.ui.panels.user.memberships.html      |    40 -
 .../apigee.ui.panels.user.permissions.html      |   105 -
 .../apigee.ui.panels.user.profile.html          |   113 -
 .../apigee.ui.role.groups.table_rows.html       |    44 -
 .../templates/apigee.ui.roles.table_rows.html   |    15 -
 .../templates/apigee.ui.users.table_rows.html   |    18 -
 .../archive/templates/test/modalForm2.html      |    32 -
 .../appsvc-ui/archive/test/autocomplete.html    |    25 -
 .../dist/appsvc-ui/archive/test/modalForm.html  |    32 -
 portal/dist/appsvc-ui/config.js                 |    60 -
 .../appsvc-ui/css/apigeeGlobalNavigation.css    |   274 -
 .../css/arsmarquette/ARSMaquettePro-Light.otf   |   Bin 184600 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Medium.otf  |   Bin 188020 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Regular.otf |   Bin 188096 -> 0 bytes
 portal/dist/appsvc-ui/css/dash.min.css          |     1 -
 portal/dist/appsvc-ui/css/entypo/entypo.eot     |   Bin 35540 -> 0 bytes
 portal/dist/appsvc-ui/css/entypo/entypo.svg     |    13 -
 portal/dist/appsvc-ui/css/entypo/entypo.ttf     |   Bin 35392 -> 0 bytes
 portal/dist/appsvc-ui/css/entypo/entypo.woff    |   Bin 21916 -> 0 bytes
 portal/dist/appsvc-ui/css/main.css              |  1970 -
 portal/dist/appsvc-ui/favicon.ico               |   Bin 1150 -> 0 bytes
 .../img/appswitcher/apiPlatform_lg.png          |   Bin 2397 -> 0 bytes
 .../img/appswitcher/appServices_lg.png          |   Bin 2295 -> 0 bytes
 .../appsvc-ui/img/appswitcher/console_lg.png    |   Bin 1453 -> 0 bytes
 .../dist/appsvc-ui/img/appswitcher/home_lg.png  |   Bin 1522 -> 0 bytes
 .../appsvc-ui/img/appswitcher/logo_color.png    |   Bin 3459 -> 0 bytes
 .../dist/appsvc-ui/img/appswitcher/max_lg.png   |   Bin 1970 -> 0 bytes
 .../img/appswitcher/triangleMenuItem_right.png  |   Bin 1158 -> 0 bytes
 .../triangleMenuItem_right_hover.png            |   Bin 1169 -> 0 bytes
 portal/dist/appsvc-ui/img/blue-bars.png         |   Bin 3635 -> 0 bytes
 portal/dist/appsvc-ui/img/blue-bolt.png         |   Bin 3942 -> 0 bytes
 portal/dist/appsvc-ui/img/blue-carat.png        |   Bin 1006 -> 0 bytes
 portal/dist/appsvc-ui/img/green_dot.png         |   Bin 3472 -> 0 bytes
 .../appsvc-ui/img/introjs_arrow_step_next.png   |   Bin 219 -> 0 bytes
 .../img/introjs_arrow_step_next_disabled.png    |   Bin 220 -> 0 bytes
 .../appsvc-ui/img/introjs_arrow_step_prev.png   |   Bin 217 -> 0 bytes
 .../img/introjs_arrow_step_prev_disabled.png    |   Bin 218 -> 0 bytes
 portal/dist/appsvc-ui/img/introjs_close.png     |   Bin 274 -> 0 bytes
 portal/dist/appsvc-ui/img/logo.gif              |   Bin 2279 -> 0 bytes
 portal/dist/appsvc-ui/img/nav-device.gif        |   Bin 2184 -> 0 bytes
 portal/dist/appsvc-ui/img/nav-sprites.png       |   Bin 7953 -> 0 bytes
 portal/dist/appsvc-ui/img/no-data1.png          |   Bin 45300 -> 0 bytes
 portal/dist/appsvc-ui/img/phone-small.gif       |   Bin 1300 -> 0 bytes
 .../appsvc-ui/img/push/APNS_cert_upload.png     |   Bin 33956 -> 0 bytes
 .../appsvc-ui/img/push/APNS_certification.png   |   Bin 16855 -> 0 bytes
 .../appsvc-ui/img/push/android-notification.png |   Bin 41629 -> 0 bytes
 .../dist/appsvc-ui/img/push/google_api_key.png  |   Bin 98118 -> 0 bytes
 .../dist/appsvc-ui/img/push/iphone_message.png  |   Bin 90307 -> 0 bytes
 portal/dist/appsvc-ui/img/push/step_1.png       |   Bin 1953 -> 0 bytes
 portal/dist/appsvc-ui/img/push/step_2.png       |   Bin 2117 -> 0 bytes
 portal/dist/appsvc-ui/img/push/step_3.png       |   Bin 2162 -> 0 bytes
 portal/dist/appsvc-ui/img/red_dot.png           |   Bin 3482 -> 0 bytes
 portal/dist/appsvc-ui/img/sdk-sprites-large.png |   Bin 14642 -> 0 bytes
 portal/dist/appsvc-ui/img/sdk-sprites.png       |   Bin 5027 -> 0 bytes
 portal/dist/appsvc-ui/img/tablet-small.gif      |   Bin 1390 -> 0 bytes
 portal/dist/appsvc-ui/img/user-photo.png        |   Bin 3849 -> 0 bytes
 portal/dist/appsvc-ui/img/user_profile.png      |   Bin 3775 -> 0 bytes
 portal/dist/appsvc-ui/img/verify.png            |   Bin 22934 -> 0 bytes
 portal/dist/appsvc-ui/img/yellow_dot.png        |   Bin 3475 -> 0 bytes
 portal/dist/appsvc-ui/index-debug.html          |   167 -
 portal/dist/appsvc-ui/index-template.html       |   172 -
 portal/dist/appsvc-ui/index.html                |   167 -
 portal/dist/appsvc-ui/js/charts/highcharts.json |   329 -
 portal/dist/appsvc-ui/sdk/usergrid.0.10.4.js    |  1402 -
 portal/dist/appsvc-ui/sdk/usergrid.0.10.5.js    |  1755 -
 portal/dist/appsvc-ui/sdk/usergrid.0.10.7.js    |  2265 --
 portal/dist/rel-usergrid-portal.2.0.3.zip       |   Bin 0 -> 16313787 bytes
 .../usergrid-portal/archive/coming_soon.html    |    31 +
 .../ui-bg_diagonals-thick_90_eeeeee_40x40.png   |   Bin 0 -> 251 bytes
 .../images/ui-bg_flat_100_deedf7_40x100.png     |   Bin 0 -> 182 bytes
 .../images/ui-bg_flat_100_e4f1fb_40x100.png     |   Bin 0 -> 213 bytes
 .../images/ui-bg_flat_100_f2f5f7_40x100.png     |   Bin 0 -> 212 bytes
 .../images/ui-bg_flat_15_cd0a0a_40x100.png      |   Bin 0 -> 181 bytes
 .../images/ui-bg_flat_50_3baae3_40x100.png      |   Bin 0 -> 182 bytes
 .../images/ui-bg_flat_80_d7ebf9_40x100.png      |   Bin 0 -> 183 bytes
 .../ui-bg_highlight-hard_70_000000_1x100.png    |   Bin 0 -> 118 bytes
 .../ui-bg_highlight-soft_25_ffef8f_1x100.png    |   Bin 0 -> 153 bytes
 .../images/ui-icons_000000_256x240.png          |   Bin 0 -> 4369 bytes
 .../images/ui-icons_2694e8_256x240.png          |   Bin 0 -> 4369 bytes
 .../images/ui-icons_2e83ff_256x240.png          |   Bin 0 -> 4369 bytes
 .../images/ui-icons_3d80b3_256x240.png          |   Bin 0 -> 4369 bytes
 .../images/ui-icons_72a7cf_256x240.png          |   Bin 0 -> 4369 bytes
 .../images/ui-icons_ffffff_256x240.png          |   Bin 0 -> 4369 bytes
 .../css/custom-theme/jquery-ui-1.8.9.custom.css |   573 +
 .../archive/css/jquery-ui-timepicker.css        |    53 +
 .../archive/css/jquery.ui.statusbar.css         |    25 +
 .../usergrid-portal/archive/css/prettify.css    |    52 +
 .../archive/css/usergrid-stripped.css           |  5199 +++
 .../usergrid-portal/archive/css/usergrid.css    |  5203 +++
 .../dist/usergrid-portal/archive/dash/README.md |     3 +
 .../archive/dash/config/testacular-e2e.conf.js  |    22 +
 .../archive/dash/config/testacular.conf.js      |    20 +
 .../archive/dash/test/e2e/runner.html           |    10 +
 .../archive/dash/test/e2e/scenarios.js          |    45 +
 .../dash/test/lib/angular/angular-mocks.js      |  1764 +
 .../dash/test/lib/angular/angular-scenario.js   | 26195 +++++++++++++
 .../archive/dash/test/lib/angular/version.txt   |     1 +
 .../archive/dash/test/unit/controllersSpec.js   |    31 +
 .../archive/dash/test/unit/directivesSpec.js    |    19 +
 .../archive/dash/test/unit/filtersSpec.js       |    19 +
 .../archive/dash/test/unit/servicesSpec.js      |    14 +
 .../archive/images/APNS_cert_upload.png         |   Bin 0 -> 33956 bytes
 .../archive/images/APNS_certification.png       |   Bin 0 -> 16855 bytes
 .../archive/images/android-notification.png     |   Bin 0 -> 41629 bytes
 .../archive/images/android-sdk-download.png     |   Bin 0 -> 4848 bytes
 .../archive/images/api-activity.gif             |   Bin 0 -> 10819 bytes
 .../archive/images/apigee-logo.png              |   Bin 0 -> 3647 bytes
 .../archive/images/apigeetopbar.png             |   Bin 0 -> 4658 bytes
 .../archive/images/background_one_col.png       |   Bin 0 -> 3126 bytes
 .../archive/images/btn-copyCurl-up.png          |   Bin 0 -> 2762 bytes
 .../archive/images/clippy-bg.png                |   Bin 0 -> 561 bytes
 .../usergrid-portal/archive/images/close.gif    |   Bin 0 -> 718 bytes
 .../archive/images/dotnet-sdk-download.png      |   Bin 0 -> 7149 bytes
 .../archive/images/down_arrow.png               |   Bin 0 -> 1285 bytes
 .../usergrid-portal/archive/images/error.png    |   Bin 0 -> 2009 bytes
 .../archive/images/faviconApigee.ico            |   Bin 0 -> 1150 bytes
 .../images/glyphicons-halflings-white.png       |   Bin 0 -> 4352 bytes
 .../archive/images/glyphicons-halflings.png     |   Bin 0 -> 4352 bytes
 .../glyphicons_halflings_135_wrench-white2.pdn  |   Bin 0 -> 5400 bytes
 .../glyphicons_halflings_135_wrench-white2.png  |   Bin 0 -> 296 bytes
 .../images/glyphicons_halflings_135_wrench.png  |   Bin 0 -> 228 bytes
 .../glyphicons_halflings_135_wrench_white.png   |   Bin 0 -> 251 bytes
 .../glyphicons_halflings_wrench_white.png       |   Bin 0 -> 1016 bytes
 .../archive/images/google_api_key.png           |   Bin 0 -> 98118 bytes
 .../archive/images/green_dot.png                |   Bin 0 -> 3472 bytes
 .../usergrid-portal/archive/images/grid.png     |   Bin 0 -> 166 bytes
 .../usergrid-portal/archive/images/icons.png    |   Bin 0 -> 13132 bytes
 .../archive/images/ios-sdk-download.png         |   Bin 0 -> 4886 bytes
 .../archive/images/iphone_message.png           |   Bin 0 -> 90307 bytes
 .../archive/images/javascript-sdk-download.png  |   Bin 0 -> 4618 bytes
 .../archive/images/left_arrow.png               |   Bin 0 -> 1257 bytes
 .../archive/images/logo-white.png               |   Bin 0 -> 2014 bytes
 .../archive/images/menuActiveTriangle.png       |   Bin 0 -> 315 bytes
 .../archive/images/nodejs-sdk-download.png      |   Bin 0 -> 5273 bytes
 .../usergrid-portal/archive/images/notice.png   |   Bin 0 -> 2112 bytes
 .../archive/images/orange-arrow.png             |   Bin 0 -> 242 bytes
 .../archive/images/push_notifications_icon.png  |   Bin 0 -> 338 bytes
 .../usergrid-portal/archive/images/red_dot.png  |   Bin 0 -> 3482 bytes
 .../archive/images/right_arrow.png              |   Bin 0 -> 1251 bytes
 .../archive/images/ruby-sdk-download.png        |   Bin 0 -> 6343 bytes
 .../usergrid-portal/archive/images/step_1.png   |   Bin 0 -> 1953 bytes
 .../usergrid-portal/archive/images/step_2.png   |   Bin 0 -> 2117 bytes
 .../usergrid-portal/archive/images/step_3.png   |   Bin 0 -> 2162 bytes
 .../usergrid-portal/archive/images/success.png  |   Bin 0 -> 1863 bytes
 .../archive/images/swish_arrow.png              |   Bin 0 -> 220 bytes
 .../archive/images/topbackground.png            |   Bin 0 -> 2890 bytes
 .../usergrid-portal/archive/images/up_arrow.png |   Bin 0 -> 1292 bytes
 .../archive/images/user-photo.png               |   Bin 0 -> 3849 bytes
 .../archive/images/user_profile.png             |   Bin 0 -> 3775 bytes
 .../archive/images/usergrid_200.png             |   Bin 0 -> 6397 bytes
 .../archive/images/usergrid_400.png             |   Bin 0 -> 8746 bytes
 .../usergrid-portal/archive/images/warning.png  |   Bin 0 -> 1179 bytes
 .../archive/images/yellow_dot.png               |   Bin 0 -> 3475 bytes
 .../archive/index-stripped2.html                |  1795 +
 portal/dist/usergrid-portal/archive/index.html  |  1931 +
 .../dist/usergrid-portal/archive/js/app/app.js  |   131 +
 .../usergrid-portal/archive/js/app/console.js   |  5397 +++
 .../usergrid-portal/archive/js/app/helpers.js   |   241 +
 .../archive/js/app/navigation.js                |   251 +
 .../usergrid-portal/archive/js/app/pages.js     |   161 +
 .../usergrid-portal/archive/js/app/params.js    |    30 +
 .../archive/js/app/quickLogin.js                |    30 +
 .../usergrid-portal/archive/js/app/session.js   |   176 +
 .../dist/usergrid-portal/archive/js/app/sso.js  |   135 +
 .../usergrid-portal/archive/js/app/status.js    |    37 +
 .../archive/js/app/ui/collections.entity.js     |   320 +
 .../archive/js/app/ui/collections.user.js       |   120 +
 .../usergrid-portal/archive/js/app/ui/ui.js     |   415 +
 .../archive/js/app/usergrid.appSDK.js           |  2097 ++
 .../archive/js/app/usergrid.appSDK.orig.js      |  2070 ++
 .../usergrid-portal/archive/js/lib/MD5.min.js   |     1 +
 .../usergrid-portal/archive/js/lib/backbone.js  |  1431 +
 .../archive/js/lib/bootstrap.min.js             |     7 +
 .../usergrid-portal/archive/js/lib/date.min.js  |     2 +
 .../archive/js/lib/jquery-1.7.2.min.js          |     4 +
 .../archive/js/lib/jquery-ui-1.8.18.min.js      |    15 +
 .../archive/js/lib/jquery.dataset.min.js        |     1 +
 .../archive/js/lib/jquery.dform-0.1.3.min.js    |    16 +
 .../archive/js/lib/jquery.jsonp-2.3.1.min.js    |     3 +
 .../archive/js/lib/jquery.tmpl.min.js           |    10 +
 .../archive/js/lib/jquery.ui.statusbar.min.js   |     1 +
 .../archive/js/lib/jquery.ui.timepicker.min.js  |     1 +
 .../usergrid-portal/archive/js/lib/prettify.js  |  1477 +
 .../archive/js/lib/underscore-min.js            |     5 +
 .../archive/js/spec/client-tests.js             |   159 +
 .../usergrid-portal/archive/js/spec/index.html  |    20 +
 .../archive/js/spec/qunit-git.css               |   238 +
 .../archive/js/spec/qunit-git.js                |  1865 +
 .../archive/js/unit-tests/appSDK-tests.js       |   255 +
 .../archive/js/unit-tests/ie-jquery-tests.js    |   191 +
 .../archive/js/unit-tests/qunit.css             |   231 +
 .../archive/js/unit-tests/qunit.js              |  1934 +
 .../dist/usergrid-portal/archive/loading.html   |     9 +
 .../dist/usergrid-portal/archive/max/index.html |     0
 .../usergrid-portal/archive/planned_outage.html |    48 +
 .../usergrid-portal/archive/push/index.html     |    34 +
 .../usergrid-portal/archive/service_down.html   |    48 +
 .../apigee.ui.activities.table_rows.html        |    14 +
 .../templates/apigee.ui.admins.table_rows.html  |     8 +
 .../apigee.ui.applications.table_rows.html      |     4 +
 .../apigee.ui.collection.table_rows.html        |    67 +
 .../apigee.ui.collections.query.indexes.html    |     5 +
 .../apigee.ui.collections.table_rows.html       |     9 +
 .../apigee.ui.collections.user.header.html      |    21 +
 .../templates/apigee.ui.curl.detail.html        |    11 +
 .../templates/apigee.ui.feed.table_rows.html    |    15 +
 .../templates/apigee.ui.groups.table_rows.html  |    14 +
 .../apigee.ui.panels.group.activities.html      |    28 +
 .../apigee.ui.panels.group.details.html         |    97 +
 .../apigee.ui.panels.group.memberships.html     |    40 +
 .../apigee.ui.panels.group.permissions.html     |    99 +
 ...pigee.ui.panels.notifications.configure.html |    14 +
 .../apigee.ui.panels.role.permissions.html      |    58 +
 .../templates/apigee.ui.panels.role.users.html  |    38 +
 .../apigee.ui.panels.user.activities.html       |    40 +
 .../templates/apigee.ui.panels.user.graph.html  |    80 +
 .../apigee.ui.panels.user.memberships.html      |    40 +
 .../apigee.ui.panels.user.permissions.html      |   105 +
 .../apigee.ui.panels.user.profile.html          |   113 +
 .../apigee.ui.role.groups.table_rows.html       |    44 +
 .../templates/apigee.ui.roles.table_rows.html   |    15 +
 .../templates/apigee.ui.users.table_rows.html   |    18 +
 .../archive/templates/test/modalForm2.html      |    32 +
 .../archive/test/autocomplete.html              |    25 +
 .../usergrid-portal/archive/test/modalForm.html |    32 +
 .../bower_components/angular-intro.js/LICENSE   |    20 +
 .../angular-intro.js/angular-intro.js           |    60 +
 .../angular-intro.js/bower.json                 |    20 +
 .../angular-intro.js/build/angular-intro.min.js |     1 +
 .../angular-intro.js/example/app.js             |    51 +
 .../angular-intro.js/lib/app.js                 |    49 +
 .../angular-intro.js/lib/intro.min.js           |    20 +
 .../angular-intro.js/lib/introjs.css            |   216 +
 .../bower_components/angular/README.md          |    48 +
 .../bower_components/angular/angular-csp.css    |    18 +
 .../bower_components/angular/angular.js         | 21734 +++++++++++
 .../bower_components/angular/angular.min.js     |   211 +
 .../angular/angular.min.js.gzip                 |   Bin 0 -> 38778 bytes
 .../bower_components/angular/angular.min.js.map |     8 +
 .../bower_components/angular/bower.json         |     7 +
 .../bower_components/angularitics/Gruntfile.js  |    62 +
 .../bower_components/angularitics/LICENSE       |    22 +
 .../bower_components/angularitics/README.md     |   115 +
 .../bower_components/angularitics/bower.json    |    12 +
 .../dist/angulartics-chartbeat.min.js           |     7 +
 .../dist/angulartics-ga-cordova.min.js          |     6 +
 .../angularitics/dist/angulartics-ga.min.js     |     7 +
 .../dist/angulartics-google-analytics.min.js    |     7 +
 .../dist/angulartics-kissmetrics.min.js         |     6 +
 .../dist/angulartics-mixpanel.min.js            |     7 +
 .../angularitics/dist/angulartics-scroll.min.js |    14 +
 .../dist/angulartics-segmentio.min.js           |     6 +
 .../angularitics/dist/angulartics.min.js        |     6 +
 .../bower_components/angularitics/karma.conf.js |    22 +
 .../bower_components/angularitics/package.json  |    43 +
 .../angularitics/samples/chartbeat.html         |    79 +
 .../angularitics/samples/google-analytics.html  |    68 +
 .../angularitics/samples/kissmetrics.html       |    75 +
 .../angularitics/samples/mixpanel.html          |    65 +
 .../angularitics/samples/partials/a.tpl.html    |     1 +
 .../angularitics/samples/partials/b.tpl.html    |     1 +
 .../angularitics/samples/partials/c.tpl.html    |     1 +
 .../angularitics/samples/partials/root.tpl.html |     1 +
 .../angularitics/samples/scroll.html            |    82 +
 .../angularitics/samples/segmentio.html         |    65 +
 .../angularitics/src/angulartics-chartbeat.js   |    29 +
 .../angularitics/src/angulartics-ga-cordova.js  |    91 +
 .../angularitics/src/angulartics-ga.js          |    32 +
 .../angularitics/src/angulartics-kissmetrics.js |    29 +
 .../angularitics/src/angulartics-mixpanel.js    |    29 +
 .../angularitics/src/angulartics-scroll.js      |    47 +
 .../angularitics/src/angulartics-segmentio.js   |    24 +
 .../angularitics/src/angulartics.js             |   132 +
 .../angularitics/test/angularticsSpec.js        |    38 +
 .../bower_components/apigee-sdk/apigee.js       |  3260 ++
 .../bower_components/apigee-sdk/apigee.min.js   |     3 +
 .../bower_components/apigee-sdk/bower.json      |    13 +
 .../samples/collections/css/apigee.min.css      |   213 +
 .../collections/css/jquery.mobile.icons.min.css |     3 +
 .../samples/collections/css/theme.min.css       |   213 +
 .../apigee-sdk/samples/collections/js/index.js  |   360 +
 .../entities/css/jquery.mobile.icons.min.css    |     3 +
 .../samples/entities/css/theme.min.css          |   213 +
 .../apigee-sdk/samples/entities/js/index.js     |   228 +
 .../geolocation/css/jquery.mobile.icons.min.css |     3 +
 .../samples/geolocation/css/theme.min.css       |   213 +
 .../apigee-sdk/samples/geolocation/js/index.js  |   133 +
 .../apigee-sdk/samples/messagee/app.js          |   634 +
 .../samples/messagee/usergrid.validation.js     |   249 +
 .../samples/push/android/AndroidManifest.xml    |    79 +
 .../samples/push/android/ant.properties         |    17 +
 .../push/android/assets/www/PushNotification.js |    65 +
 .../push/android/assets/www/cordova-2.7.0.js    |  6836 ++++
 .../push/android/assets/www/css/index.css       |   115 +
 .../push/android/assets/www/img/cordova.png     |   Bin 0 -> 19932 bytes
 .../push/android/assets/www/img/logo.png        |   Bin 0 -> 21814 bytes
 .../samples/push/android/assets/www/js/index.js |   241 +
 .../samples/push/android/assets/www/main.js     |   165 +
 .../samples/push/android/assets/www/master.css  |   116 +
 .../screen/android/screen-hdpi-landscape.png    |   Bin 0 -> 218302 bytes
 .../res/screen/android/screen-hdpi-portrait.png |   Bin 0 -> 222148 bytes
 .../screen/android/screen-ldpi-landscape.png    |   Bin 0 -> 42616 bytes
 .../res/screen/android/screen-ldpi-portrait.png |   Bin 0 -> 42034 bytes
 .../screen/android/screen-mdpi-landscape.png    |   Bin 0 -> 92347 bytes
 .../res/screen/android/screen-mdpi-portrait.png |   Bin 0 -> 90555 bytes
 .../screen/android/screen-xhdpi-landscape.png   |   Bin 0 -> 489604 bytes
 .../screen/android/screen-xhdpi-portrait.png    |   Bin 0 -> 504508 bytes
 .../samples/push/android/assets/www/spec.html   |    68 +
 .../push/android/assets/www/spec/helper.js      |    33 +
 .../push/android/assets/www/spec/index.js       |    67 +
 .../www/spec/lib/jasmine-1.2.0/MIT.LICENSE      |    20 +
 .../www/spec/lib/jasmine-1.2.0/jasmine-html.js  |   616 +
 .../www/spec/lib/jasmine-1.2.0/jasmine.css      |    81 +
 .../www/spec/lib/jasmine-1.2.0/jasmine.js       |  2529 ++
 .../apigee-sdk/samples/push/android/build.xml   |    92 +
 .../samples/push/android/cordova/appinfo.jar    |   Bin 0 -> 1574 bytes
 .../samples/push/android/cordova/build          |    24 +
 .../samples/push/android/cordova/clean          |    24 +
 .../samples/push/android/cordova/cordova        |   159 +
 .../apigee-sdk/samples/push/android/cordova/log |    24 +
 .../samples/push/android/cordova/release        |    24 +
 .../apigee-sdk/samples/push/android/cordova/run |    24 +
 .../push/android/libs/android-support-v13.jar   |   Bin 0 -> 402581 bytes
 .../samples/push/android/libs/cordova-2.7.0.jar |   Bin 0 -> 256941 bytes
 .../samples/push/android/libs/gcm.jar           |   Bin 0 -> 13662 bytes
 .../samples/push/android/proguard-project.txt   |    20 +
 .../samples/push/android/project.properties     |    14 +
 .../android/res/drawable-hdpi/ic_launcher.png   |   Bin 0 -> 9397 bytes
 .../push/android/res/drawable-hdpi/icon.png     |   Bin 0 -> 6080 bytes
 .../android/res/drawable-ldpi/ic_launcher.png   |   Bin 0 -> 2729 bytes
 .../push/android/res/drawable-ldpi/icon.png     |   Bin 0 -> 3096 bytes
 .../android/res/drawable-mdpi/ic_launcher.png   |   Bin 0 -> 5237 bytes
 .../push/android/res/drawable-mdpi/icon.png     |   Bin 0 -> 4090 bytes
 .../android/res/drawable-xhdpi/ic_launcher.png  |   Bin 0 -> 14383 bytes
 .../push/android/res/drawable-xhdpi/icon.png    |   Bin 0 -> 7685 bytes
 .../samples/push/android/res/drawable/icon.png  |   Bin 0 -> 7685 bytes
 .../samples/push/android/res/layout/main.xml    |    13 +
 .../samples/push/android/res/values/strings.xml |     4 +
 .../samples/push/android/res/xml/config.xml     |    62 +
 .../plugin/gcm/CordovaGCMBroadcastReceiver.java |    19 +
 .../src/com/plugin/gcm/GCMIntentService.java    |   163 +
 .../src/com/plugin/gcm/PushHandlerActivity.java |    66 +
 .../android/src/com/plugin/gcm/PushPlugin.java  |   216 +
 .../src/me/mdob/android/androidpush.java        |    36 +
 .../samples/push/ios/CordovaLib/Classes/CDV.h   |    57 +
 .../ios/CordovaLib/Classes/CDVAccelerometer.h   |    39 +
 .../ios/CordovaLib/Classes/CDVAccelerometer.m   |   128 +
 .../ios/CordovaLib/Classes/CDVAvailability.h    |    87 +
 .../push/ios/CordovaLib/Classes/CDVBattery.h    |    40 +
 .../push/ios/CordovaLib/Classes/CDVBattery.m    |   152 +
 .../push/ios/CordovaLib/Classes/CDVCamera.h     |    92 +
 .../push/ios/CordovaLib/Classes/CDVCamera.m     |   570 +
 .../push/ios/CordovaLib/Classes/CDVCapture.h    |   118 +
 .../push/ios/CordovaLib/Classes/CDVCapture.m    |   847 +
 .../ios/CordovaLib/Classes/CDVCommandDelegate.h |    54 +
 .../CordovaLib/Classes/CDVCommandDelegateImpl.h |    33 +
 .../CordovaLib/Classes/CDVCommandDelegateImpl.m |   145 +
 .../ios/CordovaLib/Classes/CDVCommandQueue.h    |    40 +
 .../ios/CordovaLib/Classes/CDVCommandQueue.m    |   169 +
 .../ios/CordovaLib/Classes/CDVConfigParser.h    |    28 +
 .../ios/CordovaLib/Classes/CDVConfigParser.m    |    70 +
 .../push/ios/CordovaLib/Classes/CDVConnection.h |    34 +
 .../push/ios/CordovaLib/Classes/CDVConnection.m |   132 +
 .../push/ios/CordovaLib/Classes/CDVContact.h    |   136 +
 .../push/ios/CordovaLib/Classes/CDVContact.m    |  1752 +
 .../push/ios/CordovaLib/Classes/CDVContacts.h   |   151 +
 .../push/ios/CordovaLib/Classes/CDVContacts.m   |   593 +
 .../push/ios/CordovaLib/Classes/CDVDebug.h      |    25 +
 .../ios/CordovaLib/Classes/CDVDebugConsole.h    |    28 +
 .../ios/CordovaLib/Classes/CDVDebugConsole.m    |    37 +
 .../push/ios/CordovaLib/Classes/CDVDevice.h     |    30 +
 .../push/ios/CordovaLib/Classes/CDVDevice.m     |    90 +
 .../push/ios/CordovaLib/Classes/CDVEcho.h       |    23 +
 .../push/ios/CordovaLib/Classes/CDVEcho.m       |    61 +
 .../push/ios/CordovaLib/Classes/CDVExif.h       |    43 +
 .../push/ios/CordovaLib/Classes/CDVFile.h       |   106 +
 .../push/ios/CordovaLib/Classes/CDVFile.m       |  1409 +
 .../ios/CordovaLib/Classes/CDVFileTransfer.h    |    74 +
 .../ios/CordovaLib/Classes/CDVFileTransfer.m    |   625 +
 .../ios/CordovaLib/Classes/CDVGlobalization.h   |   150 +
 .../ios/CordovaLib/Classes/CDVGlobalization.m   |   790 +
 .../ios/CordovaLib/Classes/CDVInAppBrowser.h    |    88 +
 .../ios/CordovaLib/Classes/CDVInAppBrowser.m    |   581 +
 .../CordovaLib/Classes/CDVInvokedUrlCommand.h   |    57 +
 .../CordovaLib/Classes/CDVInvokedUrlCommand.m   |   140 +
 .../push/ios/CordovaLib/Classes/CDVJSON.h       |    30 +
 .../push/ios/CordovaLib/Classes/CDVJSON.m       |    77 +
 .../CordovaLib/Classes/CDVJpegHeaderWriter.h    |    62 +
 .../CordovaLib/Classes/CDVJpegHeaderWriter.m    |   522 +
 .../ios/CordovaLib/Classes/CDVLocalStorage.h    |    50 +
 .../ios/CordovaLib/Classes/CDVLocalStorage.m    |   485 +
 .../push/ios/CordovaLib/Classes/CDVLocation.h   |   104 +
 .../push/ios/CordovaLib/Classes/CDVLocation.m   |   623 +
 .../push/ios/CordovaLib/Classes/CDVLogger.h     |    26 +
 .../push/ios/CordovaLib/Classes/CDVLogger.m     |    38 +
 .../ios/CordovaLib/Classes/CDVNotification.h    |    37 +
 .../ios/CordovaLib/Classes/CDVNotification.m    |   126 +
 .../push/ios/CordovaLib/Classes/CDVPlugin.h     |    64 +
 .../push/ios/CordovaLib/Classes/CDVPlugin.m     |   152 +
 .../ios/CordovaLib/Classes/CDVPluginResult.h    |    68 +
 .../ios/CordovaLib/Classes/CDVPluginResult.m    |   224 +
 .../ios/CordovaLib/Classes/CDVReachability.h    |    85 +
 .../ios/CordovaLib/Classes/CDVReachability.m    |   260 +
 .../Classes/CDVScreenOrientationDelegate.h      |    28 +
 .../push/ios/CordovaLib/Classes/CDVSound.h      |   116 +
 .../push/ios/CordovaLib/Classes/CDVSound.m      |   699 +
 .../ios/CordovaLib/Classes/CDVSplashScreen.h    |    33 +
 .../ios/CordovaLib/Classes/CDVSplashScreen.m    |   225 +
 .../ios/CordovaLib/Classes/CDVURLProtocol.h     |    29 +
 .../ios/CordovaLib/Classes/CDVURLProtocol.m     |   230 +
 .../ios/CordovaLib/Classes/CDVUserAgentUtil.h   |    27 +
 .../ios/CordovaLib/Classes/CDVUserAgentUtil.m   |   120 +
 .../ios/CordovaLib/Classes/CDVViewController.h  |    73 +
 .../ios/CordovaLib/Classes/CDVViewController.m  |   931 +
 .../ios/CordovaLib/Classes/CDVWebViewDelegate.h |    37 +
 .../ios/CordovaLib/Classes/CDVWebViewDelegate.m |   171 +
 .../push/ios/CordovaLib/Classes/CDVWhitelist.h  |    36 +
 .../push/ios/CordovaLib/Classes/CDVWhitelist.m  |   192 +
 .../CordovaLib/Classes/NSArray+Comparisons.h    |    26 +
 .../CordovaLib/Classes/NSArray+Comparisons.m    |    41 +
 .../push/ios/CordovaLib/Classes/NSData+Base64.h |    33 +
 .../push/ios/CordovaLib/Classes/NSData+Base64.m |   281 +
 .../Classes/NSDictionary+Extensions.h           |    35 +
 .../Classes/NSDictionary+Extensions.m           |   159 +
 .../Classes/NSMutableArray+QueueAdditions.h     |    29 +
 .../Classes/NSMutableArray+QueueAdditions.m     |    58 +
 .../CordovaLib/Classes/UIDevice+Extensions.h    |    31 +
 .../CordovaLib/Classes/UIDevice+Extensions.m    |    47 +
 .../Classes/compatibility/0.9.6/CDV.h           |    30 +
 .../Classes/compatibility/0.9.6/CDVPlugin.h     |    46 +
 .../Classes/compatibility/0.9.6/CDVPlugin.m     |    29 +
 .../Classes/compatibility/1.5.0/CDV.h           |    32 +
 .../Classes/compatibility/1.5.0/CDVPlugin.h     |    23 +
 .../CordovaLib/Classes/compatibility/README.txt |    23 +
 .../CordovaLib.xcodeproj/project.pbxproj        |   667 +
 .../push/ios/CordovaLib/CordovaLib_Prefix.pch   |    22 +
 .../samples/push/ios/CordovaLib/VERSION         |     1 +
 .../apigee-sdk/samples/push/ios/cordova/build   |    51 +
 .../apigee-sdk/samples/push/ios/cordova/emulate |    55 +
 .../apigee-sdk/samples/push/ios/cordova/log     |    23 +
 .../apigee-sdk/samples/push/ios/cordova/release |    51 +
 .../apigee-sdk/samples/push/ios/cordova/run     |    58 +
 .../push/ios/iospush.xcodeproj/project.pbxproj  |   623 +
 .../push/ios/iospush/Classes/AppDelegate.h      |    42 +
 .../push/ios/iospush/Classes/AppDelegate.m      |   122 +
 .../ios/iospush/Classes/MainViewController.h    |    40 +
 .../ios/iospush/Classes/MainViewController.m    |   174 +
 .../ios/iospush/Classes/MainViewController.xib  |   138 +
 .../iospush/Plugins/AppDelegate+notification.h  |    20 +
 .../iospush/Plugins/AppDelegate+notification.m  |   119 +
 .../push/ios/iospush/Plugins/PushPlugin.h       |    54 +
 .../push/ios/iospush/Plugins/PushPlugin.m       |   248 +
 .../samples/push/ios/iospush/Plugins/README     |    20 +
 .../Resources/Capture.bundle/controls_bg.png    |   Bin 0 -> 955 bytes
 .../Resources/Capture.bundle/controls_bg@2x.png |   Bin 0 -> 971 bytes
 .../Capture.bundle/controls_bg@2x~ipad.png      |   Bin 0 -> 2858 bytes
 .../Capture.bundle/controls_bg~ipad.png         |   Bin 0 -> 969 bytes
 .../microphone-568h@2x~iphone.png               |   Bin 0 -> 531673 bytes
 .../Resources/Capture.bundle/microphone.png     |   Bin 0 -> 72226 bytes
 .../Resources/Capture.bundle/microphone@2x.png  |   Bin 0 -> 282409 bytes
 .../Capture.bundle/microphone@2x~ipad.png       |   Bin 0 -> 911582 bytes
 .../Capture.bundle/microphone~ipad.png          |   Bin 0 -> 393975 bytes
 .../Resources/Capture.bundle/record_button.png  |   Bin 0 -> 5852 bytes
 .../Capture.bundle/record_button@2x.png         |   Bin 0 -> 13875 bytes
 .../Capture.bundle/record_button@2x~ipad.png    |   Bin 0 -> 15822 bytes
 .../Capture.bundle/record_button~ipad.png       |   Bin 0 -> 7547 bytes
 .../Resources/Capture.bundle/recording_bg.png   |   Bin 0 -> 973 bytes
 .../Capture.bundle/recording_bg@2x.png          |   Bin 0 -> 990 bytes
 .../Capture.bundle/recording_bg@2x~ipad.png     |   Bin 0 -> 1026 bytes
 .../Capture.bundle/recording_bg~ipad.png        |   Bin 0 -> 996 bytes
 .../Resources/Capture.bundle/stop_button.png    |   Bin 0 -> 5514 bytes
 .../Resources/Capture.bundle/stop_button@2x.png |   Bin 0 -> 12965 bytes
 .../Capture.bundle/stop_button@2x~ipad.png      |   Bin 0 -> 14474 bytes
 .../Capture.bundle/stop_button~ipad.png         |   Bin 0 -> 7119 bytes
 .../Resources/de.lproj/Localizable.strings      |    26 +
 .../Resources/en.lproj/Localizable.strings      |    25 +
 .../Resources/es.lproj/Localizable.strings      |    25 +
 .../ios/iospush/Resources/icons/icon-72.png     |   Bin 0 -> 4944 bytes
 .../ios/iospush/Resources/icons/icon-72@2x.png  |   Bin 0 -> 11706 bytes
 .../push/ios/iospush/Resources/icons/icon.png   |   Bin 0 -> 3902 bytes
 .../ios/iospush/Resources/icons/icon@2x.png     |   Bin 0 -> 7869 bytes
 .../Resources/se.lproj/Localizable.strings      |    26 +
 .../Resources/splash/Default-568h@2x~iphone.png |   Bin 0 -> 34225 bytes
 .../splash/Default-Landscape@2x~ipad.png        |   Bin 0 -> 77300 bytes
 .../Resources/splash/Default-Landscape~ipad.png |   Bin 0 -> 34935 bytes
 .../splash/Default-Portrait@2x~ipad.png         |   Bin 0 -> 76546 bytes
 .../Resources/splash/Default-Portrait~ipad.png  |   Bin 0 -> 34278 bytes
 .../Resources/splash/Default@2x~iphone.png      |   Bin 0 -> 29475 bytes
 .../iospush/Resources/splash/Default~iphone.png |   Bin 0 -> 10394 bytes
 .../samples/push/ios/iospush/config.xml         |    65 +
 .../samples/push/ios/iospush/iospush-Info.plist |    78 +
 .../samples/push/ios/iospush/iospush-Prefix.pch |    26 +
 .../apigee-sdk/samples/push/ios/iospush/main.m  |    35 +
 .../samples/push/ios/www/PushNotification.js    |    65 +
 .../samples/push/ios/www/cordova-2.6.0.js       |  6433 ++++
 .../samples/push/ios/www/css/index.css          |   115 +
 .../samples/push/ios/www/img/logo.png           |   Bin 0 -> 21814 bytes
 .../apigee-sdk/samples/push/ios/www/js/index.js |   217 +
 .../res/screen/ios/screen-ipad-landscape-2x.png |   Bin 0 -> 1534088 bytes
 .../res/screen/ios/screen-ipad-landscape.png    |   Bin 0 -> 407370 bytes
 .../res/screen/ios/screen-ipad-portrait-2x.png  |   Bin 0 -> 1610434 bytes
 .../www/res/screen/ios/screen-ipad-portrait.png |   Bin 0 -> 422441 bytes
 .../screen/ios/screen-iphone-landscape-2x.png   |   Bin 0 -> 339639 bytes
 .../res/screen/ios/screen-iphone-landscape.png  |   Bin 0 -> 92301 bytes
 .../screen/ios/screen-iphone-portrait-2x.png    |   Bin 0 -> 350593 bytes
 .../res/screen/ios/screen-iphone-portrait.png   |   Bin 0 -> 93897 bytes
 .../apigee-sdk/samples/push/ios/www/spec.html   |    68 +
 .../samples/push/ios/www/spec/helper.js         |    33 +
 .../samples/push/ios/www/spec/index.js          |    67 +
 .../ios/www/spec/lib/jasmine-1.2.0/MIT.LICENSE  |    20 +
 .../www/spec/lib/jasmine-1.2.0/jasmine-html.js  |   616 +
 .../ios/www/spec/lib/jasmine-1.2.0/jasmine.css  |    81 +
 .../ios/www/spec/lib/jasmine-1.2.0/jasmine.js   |  2529 ++
 .../samples/usersAndGroups/README.txt           |    22 +
 .../usersAndGroups/css/codiqa.ext.min.css       |     1 +
 .../usersAndGroups/css/images/ajax-loader.gif   |   Bin 0 -> 7825 bytes
 .../css/images/icons-18-black.png               |   Bin 0 -> 1968 bytes
 .../css/images/icons-18-white.png               |   Bin 0 -> 1988 bytes
 .../css/images/icons-36-black.png               |   Bin 0 -> 3859 bytes
 .../css/images/icons-36-white.png               |   Bin 0 -> 3861 bytes
 .../css/jquery.mobile-1.3.1.min.css             |     3 +
 .../samples/usersAndGroups/js/codiqa.ext.min.js |     6 +
 .../samples/usersAndGroups/js/index.js          |   345 +
 .../usersAndGroups/js/jquery-1.9.1.min.js       |     5 +
 .../js/jquery.mobile-1.3.1.min.js               |     7 +
 .../bower_components/apigee.max.ui/bower.json   |    19 +
 .../apigee.max.ui/dist/css/max.min.css          |     1 +
 .../apigee.max.ui/dist/img/no-data1.png         |   Bin 0 -> 45300 bytes
 .../apigee.max.ui/dist/img/phone-small.gif      |   Bin 0 -> 1300 bytes
 .../apigee.max.ui/dist/img/tablet-small.gif     |   Bin 0 -> 1390 bytes
 .../apigee.max.ui/dist/js/max-dev.min.js        |  1781 +
 .../apigee.max.ui/dist/js/max.min.js            |     4 +
 .../bower_components/intro.js/BUILD/BUILD.js    |    43 +
 .../bower_components/intro.js/Makefile          |     6 +
 .../bower_components/intro.js/README.md         |   487 +
 .../bower_components/intro.js/bower.json        |     9 +
 .../bower_components/intro.js/component.json    |    13 +
 .../bower_components/intro.js/intro.js          |   940 +
 .../bower_components/intro.js/introjs-rtl.css   |    22 +
 .../bower_components/intro.js/introjs.css       |   248 +
 .../intro.js/minified/intro.min.js              |    24 +
 .../intro.js/minified/introjs-rtl.min.css       |     1 +
 .../intro.js/minified/introjs.min.css           |     1 +
 .../bower_components/intro.js/package.json      |    17 +
 .../jquery-waypoints/CHANGELOG.md               |    92 +
 .../jquery-waypoints/README.markdown            |    47 +
 .../jquery-waypoints/bower.json                 |    19 +
 .../jquery-waypoints/licenses.txt               |    23 +
 .../jquery-waypoints/package.json               |    19 +
 .../infinite-scroll/waypoints-infinite.js       |    67 +
 .../infinite-scroll/waypoints-infinite.min.js   |     8 +
 .../sticky-elements/waypoints-sticky.js         |    55 +
 .../sticky-elements/waypoints-sticky.min.js     |     8 +
 .../jquery-waypoints/waypoints.js               |   520 +
 .../jquery-waypoints/waypoints.min.js           |     8 +
 .../bower_components/jquery/MIT-LICENSE.txt     |    21 +
 .../bower_components/jquery/bower.json          |    27 +
 .../bower_components/jquery/dist/jquery.js      |  9174 +++++
 .../bower_components/jquery/dist/jquery.min.js  |     5 +
 .../bower_components/jquery/dist/jquery.min.map |     1 +
 .../bower_components/jquery/src/ajax.js         |   806 +
 .../bower_components/jquery/src/ajax/jsonp.js   |    89 +
 .../bower_components/jquery/src/ajax/load.js    |    75 +
 .../jquery/src/ajax/parseJSON.js                |    13 +
 .../jquery/src/ajax/parseXML.js                 |    28 +
 .../bower_components/jquery/src/ajax/script.js  |    64 +
 .../jquery/src/ajax/var/nonce.js                |     5 +
 .../jquery/src/ajax/var/rquery.js               |     3 +
 .../bower_components/jquery/src/ajax/xhr.js     |   135 +
 .../bower_components/jquery/src/attributes.js   |    11 +
 .../jquery/src/attributes/attr.js               |   143 +
 .../jquery/src/attributes/classes.js            |   158 +
 .../jquery/src/attributes/prop.js               |    96 +
 .../jquery/src/attributes/support.js            |    35 +
 .../jquery/src/attributes/val.js                |   163 +
 .../bower_components/jquery/src/callbacks.js    |   205 +
 .../bower_components/jquery/src/core.js         |   498 +
 .../bower_components/jquery/src/core/access.js  |    60 +
 .../bower_components/jquery/src/core/init.js    |   123 +
 .../jquery/src/core/parseHTML.js                |    39 +
 .../bower_components/jquery/src/core/ready.js   |    97 +
 .../jquery/src/core/var/rsingleTag.js           |     4 +
 .../bower_components/jquery/src/css.js          |   451 +
 .../jquery/src/css/addGetHookIf.js              |    24 +
 .../bower_components/jquery/src/css/curCSS.js   |    57 +
 .../jquery/src/css/defaultDisplay.js            |    70 +
 .../jquery/src/css/hiddenVisibleSelectors.js    |    15 +
 .../bower_components/jquery/src/css/support.js  |    91 +
 .../bower_components/jquery/src/css/swap.js     |    28 +
 .../jquery/src/css/var/cssExpand.js             |     3 +
 .../jquery/src/css/var/getStyles.js             |     5 +
 .../jquery/src/css/var/isHidden.js              |    13 +
 .../jquery/src/css/var/rmargin.js               |     3 +
 .../jquery/src/css/var/rnumnonpx.js             |     5 +
 .../bower_components/jquery/src/data.js         |   175 +
 .../bower_components/jquery/src/data/Data.js    |   181 +
 .../bower_components/jquery/src/data/accepts.js |    20 +
 .../jquery/src/data/var/data_priv.js            |     5 +
 .../jquery/src/data/var/data_user.js            |     5 +
 .../bower_components/jquery/src/deferred.js     |   149 +
 .../bower_components/jquery/src/deprecated.js   |    13 +
 .../bower_components/jquery/src/dimensions.js   |    50 +
 .../bower_components/jquery/src/effects.js      |   647 +
 .../jquery/src/effects/Tween.js                 |   114 +
 .../jquery/src/effects/animatedSelector.js      |    13 +
 .../bower_components/jquery/src/event.js        |   868 +
 .../bower_components/jquery/src/event/alias.js  |    39 +
 .../jquery/src/event/support.js                 |     9 +
 .../bower_components/jquery/src/exports/amd.js  |    24 +
 .../jquery/src/exports/global.js                |    32 +
 .../bower_components/jquery/src/intro.js        |    44 +
 .../bower_components/jquery/src/jquery.js       |    36 +
 .../bower_components/jquery/src/manipulation.js |   582 +
 .../jquery/src/manipulation/_evalUrl.js         |    18 +
 .../jquery/src/manipulation/support.js          |    31 +
 .../src/manipulation/var/rcheckableType.js      |     3 +
 .../bower_components/jquery/src/offset.js       |   204 +
 .../bower_components/jquery/src/outro.js        |     1 +
 .../bower_components/jquery/src/queue.js        |   142 +
 .../bower_components/jquery/src/queue/delay.js  |    22 +
 .../jquery/src/selector-native.js               |   172 +
 .../jquery/src/selector-sizzle.js               |    14 +
 .../bower_components/jquery/src/selector.js     |     1 +
 .../bower_components/jquery/src/serialize.js    |   111 +
 .../jquery/src/sizzle/dist/sizzle.js            |  2034 ++
 .../jquery/src/sizzle/dist/sizzle.min.js        |     3 +
 .../jquery/src/sizzle/dist/sizzle.min.map       |     1 +
 .../bower_components/jquery/src/traversing.js   |   200 +
 .../jquery/src/traversing/findFilter.js         |   100 +
 .../jquery/src/traversing/var/rneedsContext.js  |     6 +
 .../bower_components/jquery/src/var/arr.js      |     3 +
 .../jquery/src/var/class2type.js                |     4 +
 .../bower_components/jquery/src/var/concat.js   |     5 +
 .../bower_components/jquery/src/var/hasOwn.js   |     5 +
 .../bower_components/jquery/src/var/indexOf.js  |     5 +
 .../bower_components/jquery/src/var/pnum.js     |     3 +
 .../bower_components/jquery/src/var/push.js     |     5 +
 .../jquery/src/var/rnotwhite.js                 |     3 +
 .../bower_components/jquery/src/var/slice.js    |     5 +
 .../jquery/src/var/strundefined.js              |     3 +
 .../bower_components/jquery/src/var/support.js  |     4 +
 .../bower_components/jquery/src/var/toString.js |     5 +
 .../bower_components/jquery/src/var/trim.js     |     3 +
 .../bower_components/jquery/src/wrap.js         |    78 +
 .../bower_components/sizzle/dist/sizzle.js      |  2015 +
 .../bower_components/sizzle/dist/sizzle.min.js  |     3 +
 .../bower_components/sizzle/dist/sizzle.min.map |     1 +
 .../bower_components/sizzle/tasks/commit.js     |    10 +
 .../bower_components/sizzle/tasks/compile.js    |    34 +
 .../bower_components/sizzle/tasks/dist.js       |    35 +
 .../bower_components/sizzle/tasks/release.js    |    43 +
 .../bower_components/sizzle/tasks/tag.js        |     9 +
 .../bower_components/sizzle/tasks/version.js    |    35 +
 .../bower_components/sizzle/test/data/empty.js  |     0
 .../sizzle/test/data/mixed_sort.html            |    22 +
 .../sizzle/test/data/testinit.js                |   136 +
 .../bower_components/sizzle/test/jquery.js      |  9597 +++++
 .../sizzle/test/libs/qunit/qunit.css            |   244 +
 .../sizzle/test/libs/qunit/qunit.js             |  2212 ++
 .../sizzle/test/unit/extending.js               |    95 +
 .../sizzle/test/unit/selector.js                |  1138 +
 .../sizzle/test/unit/utilities.js               |   169 +
 portal/dist/usergrid-portal/config.js           |    45 +
 .../css/apigeeGlobalNavigation.css              |   274 +
 .../css/arsmarquette/ARSMaquettePro-Light.otf   |   Bin 0 -> 184600 bytes
 .../css/arsmarquette/ARSMaquettePro-Medium.otf  |   Bin 0 -> 188020 bytes
 .../css/arsmarquette/ARSMaquettePro-Regular.otf |   Bin 0 -> 188096 bytes
 portal/dist/usergrid-portal/css/dash.min.css    |     1 +
 .../dist/usergrid-portal/css/entypo/entypo.eot  |   Bin 0 -> 35540 bytes
 .../dist/usergrid-portal/css/entypo/entypo.svg  |    13 +
 .../dist/usergrid-portal/css/entypo/entypo.ttf  |   Bin 0 -> 35392 bytes
 .../dist/usergrid-portal/css/entypo/entypo.woff |   Bin 0 -> 21916 bytes
 portal/dist/usergrid-portal/css/main.css        |  1970 +
 portal/dist/usergrid-portal/favicon.ico         |   Bin 0 -> 1150 bytes
 .../img/appswitcher/apiPlatform_lg.png          |   Bin 0 -> 2397 bytes
 .../img/appswitcher/appServices_lg.png          |   Bin 0 -> 2295 bytes
 .../img/appswitcher/console_lg.png              |   Bin 0 -> 1453 bytes
 .../usergrid-portal/img/appswitcher/home_lg.png |   Bin 0 -> 1522 bytes
 .../img/appswitcher/logo_color.png              |   Bin 0 -> 3459 bytes
 .../usergrid-portal/img/appswitcher/max_lg.png  |   Bin 0 -> 1970 bytes
 .../img/appswitcher/triangleMenuItem_right.png  |   Bin 0 -> 1158 bytes
 .../triangleMenuItem_right_hover.png            |   Bin 0 -> 1169 bytes
 portal/dist/usergrid-portal/img/blue-bars.png   |   Bin 0 -> 3635 bytes
 portal/dist/usergrid-portal/img/blue-bolt.png   |   Bin 0 -> 3942 bytes
 portal/dist/usergrid-portal/img/blue-carat.png  |   Bin 0 -> 1006 bytes
 portal/dist/usergrid-portal/img/green_dot.png   |   Bin 0 -> 3472 bytes
 .../img/introjs_arrow_step_next.png             |   Bin 0 -> 219 bytes
 .../img/introjs_arrow_step_next_disabled.png    |   Bin 0 -> 220 bytes
 .../img/introjs_arrow_step_prev.png             |   Bin 0 -> 217 bytes
 .../img/introjs_arrow_step_prev_disabled.png    |   Bin 0 -> 218 bytes
 .../dist/usergrid-portal/img/introjs_close.png  |   Bin 0 -> 274 bytes
 portal/dist/usergrid-portal/img/logo.gif        |   Bin 0 -> 2279 bytes
 portal/dist/usergrid-portal/img/nav-device.gif  |   Bin 0 -> 2184 bytes
 portal/dist/usergrid-portal/img/nav-sprites.png |   Bin 0 -> 7953 bytes
 portal/dist/usergrid-portal/img/no-data1.png    |   Bin 0 -> 45300 bytes
 portal/dist/usergrid-portal/img/phone-small.gif |   Bin 0 -> 1300 bytes
 .../img/push/APNS_cert_upload.png               |   Bin 0 -> 33956 bytes
 .../img/push/APNS_certification.png             |   Bin 0 -> 16855 bytes
 .../img/push/android-notification.png           |   Bin 0 -> 41629 bytes
 .../usergrid-portal/img/push/google_api_key.png |   Bin 0 -> 98118 bytes
 .../usergrid-portal/img/push/iphone_message.png |   Bin 0 -> 90307 bytes
 portal/dist/usergrid-portal/img/push/step_1.png |   Bin 0 -> 1953 bytes
 portal/dist/usergrid-portal/img/push/step_2.png |   Bin 0 -> 2117 bytes
 portal/dist/usergrid-portal/img/push/step_3.png |   Bin 0 -> 2162 bytes
 portal/dist/usergrid-portal/img/red_dot.png     |   Bin 0 -> 3482 bytes
 .../usergrid-portal/img/sdk-sprites-large.png   |   Bin 0 -> 14642 bytes
 portal/dist/usergrid-portal/img/sdk-sprites.png |   Bin 0 -> 5027 bytes
 .../dist/usergrid-portal/img/tablet-small.gif   |   Bin 0 -> 1390 bytes
 portal/dist/usergrid-portal/img/user-photo.png  |   Bin 0 -> 3849 bytes
 .../dist/usergrid-portal/img/user_profile.png   |   Bin 0 -> 3775 bytes
 portal/dist/usergrid-portal/img/verify.png      |   Bin 0 -> 22934 bytes
 portal/dist/usergrid-portal/img/yellow_dot.png  |   Bin 0 -> 3475 bytes
 portal/dist/usergrid-portal/index-debug.html    |   183 +
 portal/dist/usergrid-portal/index-template.html |   188 +
 portal/dist/usergrid-portal/index.html          |   183 +
 .../usergrid-portal/js/charts/highcharts.json   |   329 +
 .../js/libs/Highcharts-2.3.5/index.htm          |    79 +
 .../js/adapters/mootools-adapter.js             |    13 +
 .../js/adapters/mootools-adapter.src.js         |   328 +
 .../js/adapters/prototype-adapter.js            |    16 +
 .../js/adapters/prototype-adapter.src.js        |   385 +
 .../libs/Highcharts-2.3.5/js/highcharts-more.js |    35 +
 .../Highcharts-2.3.5/js/highcharts-more.src.js  |  1581 +
 .../js/libs/Highcharts-2.3.5/js/highcharts.js   |   250 +
 .../libs/Highcharts-2.3.5/js/highcharts.src.js  | 15281 ++++++++
 .../Highcharts-2.3.5/js/modules/canvas-tools.js |   133 +
 .../js/modules/canvas-tools.src.js              |  3113 ++
 .../js/libs/Highcharts-2.3.5/js/modules/data.js |    14 +
 .../Highcharts-2.3.5/js/modules/data.src.js     |   512 +
 .../Highcharts-2.3.5/js/modules/exporting.js    |    23 +
 .../js/modules/exporting.src.js                 |   752 +
 .../Highcharts-2.3.5/js/themes/dark-blue.js     |   263 +
 .../Highcharts-2.3.5/js/themes/dark-green.js    |   263 +
 .../js/libs/Highcharts-2.3.5/js/themes/gray.js  |   262 +
 .../js/libs/Highcharts-2.3.5/js/themes/grid.js  |    95 +
 .../js/libs/Highcharts-2.3.5/js/themes/skies.js |    89 +
 portal/dist/usergrid-portal/js/libs/MD5.min.js  |     1 +
 .../js/libs/angular-1.0.5/angular-cookies.js    |   183 +
 .../libs/angular-1.0.5/angular-cookies.min.js   |     7 +
 .../js/libs/angular-1.0.5/angular-loader.js     |   276 +
 .../js/libs/angular-1.0.5/angular-loader.min.js |     7 +
 .../js/libs/angular-1.0.5/angular-mocks.js      |  1886 +
 .../js/libs/angular-1.0.5/angular-resource.js   |   445 +
 .../libs/angular-1.0.5/angular-resource.min.js  |    10 +
 .../js/libs/angular-1.0.5/angular-sanitize.js   |   535 +
 .../libs/angular-1.0.5/angular-sanitize.min.js  |    13 +
 .../js/libs/angular-1.0.5/angular.js            | 14733 ++++++++
 .../js/libs/angular-1.0.5/angular.min.js        |   161 +
 .../js/libs/angular-1.0.5/version.txt           |     1 +
 .../js/libs/angular-1.1.5/angular-1.1.5.js      | 16876 +++++++++
 .../js/libs/angular-1.1.5/angular-merge.min.js  |     8 +
 .../angular-1.1.5/angular-resource-1.1.5.js     |   537 +
 .../js/libs/angular-1.2.5/angular-animate.js    |  1323 +
 .../libs/angular-1.2.5/angular-animate.min.js   |    23 +
 .../angular-1.2.5/angular-animate.min.js.map    |     8 +
 .../js/libs/angular-1.2.5/angular-cookies.js    |   202 +
 .../libs/angular-1.2.5/angular-cookies.min.js   |     8 +
 .../angular-1.2.5/angular-cookies.min.js.map    |     8 +
 .../js/libs/angular-1.2.5/angular-csp.css       |    24 +
 .../js/libs/angular-1.2.5/angular-loader.js     |   410 +
 .../js/libs/angular-1.2.5/angular-loader.min.js |     9 +
 .../angular-1.2.5/angular-loader.min.js.map     |     8 +
 .../js/libs/angular-1.2.5/angular-mocks.js      |  2116 ++
 .../js/libs/angular-1.2.5/angular-resource.js   |   565 +
 .../libs/angular-1.2.5/angular-resource.min.js  |    13 +
 .../angular-1.2.5/angular-resource.min.js.map   |     8 +
 .../js/libs/angular-1.2.5/angular-route.js      |   911 +
 .../js/libs/angular-1.2.5/angular-route.min.js  |    14 +
 .../libs/angular-1.2.5/angular-route.min.js.map |     8 +
 .../js/libs/angular-1.2.5/angular-sanitize.js   |   622 +
 .../libs/angular-1.2.5/angular-sanitize.min.js  |    14 +
 .../angular-1.2.5/angular-sanitize.min.js.map   |     8 +
 .../js/libs/angular-1.2.5/angular-scenario.js   | 32374 +++++++++++++++++
 .../js/libs/angular-1.2.5/angular-touch.js      |   563 +
 .../js/libs/angular-1.2.5/angular-touch.min.js  |    13 +
 .../libs/angular-1.2.5/angular-touch.min.js.map |     8 +
 .../js/libs/angular-1.2.5/angular.js            | 20369 +++++++++++
 .../js/libs/angular-1.2.5/angular.min.js        |   201 +
 .../js/libs/angular-1.2.5/angular.min.js.map    |     8 +
 .../js/libs/angular-1.2.5/errors.json           |     1 +
 .../js/libs/angular-1.2.5/version.json          |     1 +
 .../js/libs/angular-1.2.5/version.txt           |     1 +
 .../angularitics-0.8.5-google-analytics.js      |     7 +
 .../js/libs/angularitics/angularitics-0.8.5.js  |     6 +
 .../libs/bootstrap/css/bootstrap-responsive.css |  1345 +
 .../bootstrap/css/bootstrap-responsive.min.css  |  1245 +
 .../js/libs/bootstrap/css/bootstrap.css         |  6169 ++++
 .../js/libs/bootstrap/css/bootstrap.min.css     |  5469 +++
 .../js/libs/bootstrap/custom/css/bootstrap.css  |  6316 ++++
 .../libs/bootstrap/custom/css/bootstrap.min.css |     9 +
 .../custom/img/glyphicons-halflings-white.png   |   Bin 0 -> 8777 bytes
 .../custom/img/glyphicons-halflings.png         |   Bin 0 -> 12799 bytes
 .../js/libs/bootstrap/custom/js/bootstrap.js    |  2291 ++
 .../libs/bootstrap/custom/js/bootstrap.min.js   |     7 +
 .../img/glyphicons-halflings-white.png          |   Bin 0 -> 8777 bytes
 .../libs/bootstrap/img/glyphicons-halflings.png |   Bin 0 -> 12799 bytes
 .../js/libs/bootstrap/js/bootstrap.js           |  2117 ++
 .../js/libs/bootstrap/js/bootstrap.min.js       |   644 +
 .../usergrid-portal/js/libs/google-viz-api.js   |    49 +
 .../js/libs/jquery/jquery-1.9.1.min.js          |     5 +
 .../js/libs/jquery/jquery-migrate-1.1.1.min.js  |     3 +
 .../js/libs/jquery/jquery.sparkline.min.js      |     5 +
 .../js/libs/jqueryui/date.min.js                |     2 +
 .../ui-bg_diagonals-thick_90_eeeeee_40x40.png   |   Bin 0 -> 251 bytes
 .../images/ui-bg_flat_100_deedf7_40x100.png     |   Bin 0 -> 182 bytes
 .../images/ui-bg_flat_100_e4f1fb_40x100.png     |   Bin 0 -> 213 bytes
 .../images/ui-bg_flat_100_f2f5f7_40x100.png     |   Bin 0 -> 212 bytes
 .../images/ui-bg_flat_15_cd0a0a_40x100.png      |   Bin 0 -> 181 bytes
 .../images/ui-bg_flat_50_3baae3_40x100.png      |   Bin 0 -> 182 bytes
 .../images/ui-bg_flat_80_d7ebf9_40x100.png      |   Bin 0 -> 183 bytes
 .../ui-bg_highlight-hard_70_000000_1x100.png    |   Bin 0 -> 118 bytes
 .../ui-bg_highlight-soft_25_ffef8f_1x100.png    |   Bin 0 -> 153 bytes
 .../jqueryui/images/ui-icons_000000_256x240.png |   Bin 0 -> 4369 bytes
 .../jqueryui/images/ui-icons_2694e8_256x240.png |   Bin 0 -> 4369 bytes
 .../jqueryui/images/ui-icons_2e83ff_256x240.png |   Bin 0 -> 4369 bytes
 .../jqueryui/images/ui-icons_3d80b3_256x240.png |   Bin 0 -> 4369 bytes
 .../jqueryui/images/ui-icons_72a7cf_256x240.png |   Bin 0 -> 4369 bytes
 .../jqueryui/images/ui-icons_ffffff_256x240.png |   Bin 0 -> 4369 bytes
 .../js/libs/jqueryui/jquery-ui-1.8.18.min.js    |    15 +
 .../js/libs/jqueryui/jquery-ui-1.8.9.custom.css |     1 +
 .../js/libs/jqueryui/jquery-ui-timepicker.css   |     1 +
 .../libs/jqueryui/jquery.ui.timepicker.min.js   |     1 +
 .../ui-bootstrap-custom-0.3.0.min.js            |     1 +
 .../ui-bootstrap-custom-tpls-0.3.0.min.js       |     1 +
 .../js/libs/usergrid-libs.min.js                |    22 +
 .../usergrid-portal/js/libs/usergrid.sdk.js     |  2474 ++
 .../dist/usergrid-portal/js/usergrid-dev.min.js |  4939 +++
 portal/dist/usergrid-portal/js/usergrid.min.js  |     6 +
 .../dist/usergrid-portal/sdk/usergrid.0.10.4.js |  1402 +
 .../dist/usergrid-portal/sdk/usergrid.0.10.5.js |  1755 +
 .../dist/usergrid-portal/sdk/usergrid.0.10.7.js |  2265 ++
 portal/index-debug.html                         |    34 +-
 portal/index-template.html                      |    16 +
 portal/index.html                               |    34 +-
 portal/js/libs/usergrid-libs.min.js             |    22 -
 portal/js/usergrid-dev.min.js                   |  4939 ---
 portal/js/usergrid.min.js                       |     6 -
 .../instrument/js/usergrid-coverage.min.js      |     6 -
 .../test/coverage/instrument/js/usergrid.min.js |     3 -
 1589 files changed, 335549 insertions(+), 342735 deletions(-)
----------------------------------------------------------------------



[04/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/js/usergrid.min.js
----------------------------------------------------------------------
diff --git a/portal/js/usergrid.min.js b/portal/js/usergrid.min.js
index 1deafc9..463b47e 100644
--- a/portal/js/usergrid.min.js
+++ b/portal/js/usergrid.min.js
@@ -1,6 +1,6 @@
-/*! usergrid@2.0.2 2014-03-31 */
+/*! usergrid@2.0.2 2014-04-01 */
 !function(exports,global){function renderChart(chartsDefaults,chartdata){var newSettings={};$.extend(!0,newSettings,chartsDefaults,chartdata);new Highcharts.Chart(newSettings)}function menuBindClick(scope,lElement,cevent,menuContext){var currentSelection=angular.element(cevent.srcElement).parent(),previousSelection=scope[menuContext];previousSelection!==currentSelection&&(previousSelection&&angular.element(previousSelection).removeClass("active"),scope[menuContext]=currentSelection,scope.$apply(function(){currentSelection.addClass("active")}))}global["true"]=exports;var polyfills=function(window,Object){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}(),Object.defineProperty(Object.prototype,"clone",{enumerable:!1,writable:!0,value:function(){var i,newObj=this instanceof Arra
 y?[]:{};for(i in this)"clone"!==i&&(newObj[i]=this[i]&&"object"==typeof this[i]?this[i].clone():this[i]);return newObj}}),Object.defineProperty(Object.prototype,"stringifyJSON",{enumerable:!1,writable:!0,value:function(){return JSON.stringify(this,null,"	")}})};polyfills(window,Object);var global=global||this,AppServices=AppServices||{};global.AppServices=global.AppServices||AppServices,AppServices.Constants=angular.module("appservices.constants",[]),AppServices.Services=angular.module("appservices.services",[]),AppServices.Controllers=angular.module("appservices.controllers",[]),AppServices.Filters=angular.module("appservices.filters",[]),AppServices.Directives=angular.module("appservices.directives",[]),AppServices.Performance=angular.module("appservices.performance",[]),AppServices.MAX=angular.module("appservices.max",[]),angular.module("appservices",["ngRoute","ngResource","ngSanitize","ui.bootstrap","angulartics","angulartics.google.analytics","appservices.filters","appservices
 .services","appservices.directives","appservices.constants","appservices.controllers","appservices.max","angular-intro"]).config(["$routeProvider","$locationProvider","$sceDelegateProvider","$analyticsProvider",function($routeProvider,$locationProvider,$sceDelegateProvider,$analyticsProvider){$routeProvider.when("/org-overview",{templateUrl:"org-overview/org-overview.html",controller:"OrgOverviewCtrl"}).when("/login",{templateUrl:"login/login.html",controller:"LoginCtrl"}).when("/login/loading",{templateUrl:"login/loading.html",controller:"LoginCtrl"}).when("/app-overview/summary",{templateUrl:"app-overview/app-overview.html",controller:"AppOverviewCtrl"}).when("/getting-started/setup",{templateUrl:"app-overview/getting-started.html",controller:"GettingStartedCtrl"}).when("/forgot-password",{templateUrl:"login/forgot-password.html",controller:"ForgotPasswordCtrl"}).when("/register",{templateUrl:"login/register.html",controller:"RegisterCtrl"}).when("/users",{templateUrl:"users/users
 .html",controller:"UsersCtrl"}).when("/users/profile",{templateUrl:"users/users-profile.html",controller:"UsersProfileCtrl"}).when("/users/groups",{templateUrl:"users/users-groups.html",controller:"UsersGroupsCtrl"}).when("/users/activities",{templateUrl:"users/users-activities.html",controller:"UsersActivitiesCtrl"}).when("/users/feed",{templateUrl:"users/users-feed.html",controller:"UsersFeedCtrl"}).when("/users/graph",{templateUrl:"users/users-graph.html",controller:"UsersGraphCtrl"}).when("/users/roles",{templateUrl:"users/users-roles.html",controller:"UsersRolesCtrl"}).when("/groups",{templateUrl:"groups/groups.html",controller:"GroupsCtrl"}).when("/groups/details",{templateUrl:"groups/groups-details.html",controller:"GroupsDetailsCtrl"}).when("/groups/members",{templateUrl:"groups/groups-members.html",controller:"GroupsMembersCtrl"}).when("/groups/activities",{templateUrl:"groups/groups-activities.html",controller:"GroupsActivitiesCtrl"}).when("/groups/roles",{templateUrl:"gro
 ups/groups-roles.html",controller:"GroupsRolesCtrl"}).when("/roles",{templateUrl:"roles/roles.html",controller:"RolesCtrl"}).when("/roles/settings",{templateUrl:"roles/roles-settings.html",controller:"RolesSettingsCtrl"}).when("/roles/users",{templateUrl:"roles/roles-users.html",controller:"RolesUsersCtrl"}).when("/roles/groups",{templateUrl:"roles/roles-groups.html",controller:"RolesGroupsCtrl"}).when("/data",{templateUrl:"data/data.html",controller:"DataCtrl"}).when("/data/entity",{templateUrl:"data/entity.html",controller:"EntityCtrl"}).when("/data/shell",{templateUrl:"data/shell.html",controller:"ShellCtrl"}).when("/profile/organizations",{templateUrl:"profile/organizations.html",controller:"OrgCtrl"}).when("/profile/profile",{templateUrl:"profile/profile.html",controller:"ProfileCtrl"}).when("/profile",{templateUrl:"profile/account.html",controller:"AccountCtrl"}).when("/activities",{templateUrl:"activities/activities.html",controller:"ActivitiesCtrl"}).when("/shell",{templateU
 rl:"shell/shell.html",controller:"ShellCtrl"}).when("/logout",{templateUrl:"login/logout.html",controller:"LogoutCtrl"}).otherwise({redirectTo:"/org-overview"}),$locationProvider.html5Mode(!1).hashPrefix("!"),$sceDelegateProvider.resourceUrlWhitelist(["self","http://apigee-internal-prod.jupiter.apigee.net/**","http://apigee-internal-prod.mars.apigee.net/**","https://appservices.apigee.com/**","https://api.usergrid.com/**"]),$analyticsProvider.virtualPageviews(!1),$analyticsProvider.firstPageview(!1)}]),AppServices.Controllers.controller("ActivitiesCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope){$scope.$on("app-activities-received",function(evt,data){$scope.activities=data,$scope.$apply()}),$scope.$on("app-activities-error",function(){$rootScope.$broadcast("alert","error","Application failed to retreive activities data.")}),ug.getActivities()}]),AppServices.Controllers.controller("AppOverviewCtrl",["ug","charts","$scope","$rootScope","$log",funct
 ion(ug,charts,$scope,$rootScope,$log){var createGradient=function(color1,color2){var perShapeGradient={x1:0,y1:0,x2:0,y2:1};return{linearGradient:perShapeGradient,stops:[[0,color1],[1,color2]]}};$scope.appOverview={},$scope.collections=[],$scope.graph="",$scope.$on("top-collections-received",function(event,collections){var dataDescription={bar1:{labels:["Total"],dataAttr:["title","count"],colors:[createGradient("rgba(36,151,212,0.6)","rgba(119,198,240,0.6)")],borderColor:"#1b97d1"}};$scope.collections=collections;var arr=[];for(var i in collections)collections.hasOwnProperty(i)&&arr.push(collections[i]);$scope.appOverview={},$rootScope.chartTemplate?($scope.appOverview.chart=angular.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()):ug.httpGet(null,"js/charts/highcharts.json").then(function(success){$rootScope.chartTemplate=success,$scope.appOverview.chart=angular
 .copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()},function(fail){$log.error("Problem getting chart template",fail)})}),$scope.$on("app-initialized",function(){ug.getTopCollections()}),$rootScope.activeUI&&ug.getTopCollections()}]),AppServices.Controllers.controller("GettingStartedCtrl",["ug","$scope","$rootScope","$location","$timeout","$anchorScroll",function(ug,$scope,$rootScope,$location,$timeout,$anchorScroll){$scope.collections=[],$scope.graph="",$scope.clientID="",$scope.clientSecret="";$scope.regenerateCredentialsDialog=function(modalId){$scope.orgAPICredentials={client_id:"regenerating...",client_secret:"regenerating..."},ug.regenerateAppCredentials(),$scope.hideModal(modalId)},$scope.$on("app-creds-updated",function(event,credentials){credentials?($scope.clientID=credentials.client_id,$scope.clientSecret=credentials.client_secret,$scope.$$phase||$scope.
 $apply()):setTimeout(function(){ug.getAppCredentials()},5e3)}),ug.getAppCredentials(),$scope.contentTitle,$scope.showSDKDetail=function(name){var introContainer=document.getElementById("intro-container");if("nocontent"===name)return introContainer.style.height="0",!0;introContainer.style.opacity=.1,introContainer.style.height="0";var timeout=0;$scope.contentTitle&&(timeout=500),$timeout(function(){introContainer.style.height="1000px",introContainer.style.opacity=1},timeout),$scope.optionName=name,$scope.contentTitle=name,$scope.sdkLink="http://apigee.com/docs/content/"+name+"-sdk-redirect",$scope.docsLink="http://apigee.com/docs/app-services/content/installing-apigee-sdk-"+name,$scope.getIncludeURL=function(){return"app-overview/doc-includes/"+$scope.optionName+".html"}},$scope.scrollToElement=function(elem){return $location.hash(elem),$anchorScroll(),!1}}]),AppServices.Controllers.controller("ChartCtrl",["$scope","$location",function(){}]),AppServices.Directives.directive("chart",f
 unction(){return{restrict:"E",scope:{chartdata:"=chartdata"},template:"<div></div>",replace:!0,controller:function(){},link:function(scope,element,attrs){scope.$watch("chartdata",function(chartdata){if(chartdata){var chartsDefaults={chart:{renderTo:element[0],type:attrs.type||null,height:attrs.height||null,width:attrs.width||null,reflow:!0,animation:!1,zoomType:"x"}};if("pie"===attrs.type&&(chartsDefaults.chart.margin=[0,0,0,0],chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.spacingTop=0,chartsDefaults.chart.spacingBottom=0,attrs.titleimage&&(chartdata.title.text='<img src="'+attrs.titleimage+'">'),attrs.titleicon&&(chartdata.title.text='<i class="pictogram '+attrs.titleiconclass+'">'+attrs.titleicon+"</i>"),attrs.titlecolor&&(chartdata.title.style.color=attrs.titlecolor),attrs.titleimagetop&&(chartdata.title.style.marginTop=attrs.titleimagetop),attrs.titleimageleft&&(chartdata.title.style.marginLeft=attrs.titleimageleft)),"line"===attrs.t
 ype&&(chartsDefaults.chart.marginTop=30,chartsDefaults.chart.spacingTop=50),"column"===attrs.type&&(chartsDefaults.chart.marginBottom=80),"area"===attrs.type&&(chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.marginLeft=0,chartsDefaults.chart.marginRight=0),Highcharts.setOptions({global:{useUTC:!1},chart:{style:{fontFamily:"marquette-light, Helvetica, Arial, sans-serif"}}}),"line"===attrs.type){var xAxis1=chartdata.xAxis[0];xAxis1.labels.formatter||(xAxis1.labels.formatter=new Function(attrs.xaxislabel)),xAxis1.labels.step||(xAxis1.labels.step=attrs.xaxisstep)}chartdata.tooltip&&"string"==typeof chartdata.tooltip.formatter&&(chartdata.tooltip.formatter=new Function(chartdata.tooltip.formatter)),renderChart(chartsDefaults,chartdata)}},!0)}}}),AppServices.Services.factory("charts",function(){function sortJsonArrayByProperty(objArray,prop){if(arguments.length<2)throw new Error("sortJsonArrayByProp requires 2 arguments");var direct=arguments.le
 ngth>2?arguments[2]:1;if(objArray&&objArray.constructor===Array){var propPath=prop.constructor===Array?prop:prop.split(".");objArray.sort(function(a,b){for(var p in propPath)a[propPath[p]]&&b[propPath[p]]&&(a=a[propPath[p]],b=b[propPath[p]]);return a=a.match(/^\d+$/)?+a:a,b=b.match(/^\d+$/)?+b:b,b>a?-1*direct:a>b?1*direct:0})}}var lineChart,areaChart,paretoChart,pieChart,xaxis,seriesIndex;return{convertLineChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)lineChart.series[localCounter].data.push("undefined"==typeof dp?[i,0]:[i,dp[dataAttrs[j]]]),detailedView||localCounter++}lineChart=chartTemplate,"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex
 =dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(lineChart=chartTemplate,seriesIndex=0,lineChart.series=[],label=""),xaxis=lineChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,lineChart.series[l]={},lineChart.series[l].data=[],lineChart.series[l].name=chartData[l].chartGroupName,lineChart.series[l].yAxis=0,lineChart.series[l].type="line",lineChart.series[l].color=dataDescription.colors[i],lineChart.series[l].dashStyle="solid",lineChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var
  steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;lineChart.series[i]={},lineChart.series[i].data=[],lineChart.series[i].name=label+dataDescription.labels[steadyCounter],lineChart.series[i].yAxis=yAxisIndex,lineChart.series[i].type="line",lineChart.series[i].color=dataDescription.colors[i],lineChart.series[i].dashStyle="solid",lineChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return lineChart},convertAreaChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)areaChart.series[localCounter].data.push("undefined"==typeof dp?0:dp[dataAttrs[j]]
 ),detailedView||localCounter++}areaChart=angular.copy(areaChart),"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(areaChart=chartTemplate,seriesIndex=0,areaChart.series=[],label=""),xaxis=areaChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,areaChart.series[l]={},areaChart.series[l].data=[],areaChart.series[l].fillColor=dataDescription.areaColors[l],areaChart.series[l].name=chart
 Data[l].chartGroupName,areaChart.series[l].yAxis=0,areaChart.series[l].type="area",areaChart.series[l].pointInterval=1,areaChart.series[l].color=dataDescription.colors[l],areaChart.series[l].dashStyle="solid",areaChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;areaChart.series[i]={},areaChart.series[i].data=[],areaChart.series[i].fillColor=dataDescription.areaColors[i],areaChart.series[i].name=label+dataDescription.labels[steadyCounter],areaChart.series[i].yAxis=yAxisIndex,areaChart.series[i].type="area",areaChart.series[i].pointInterval=1,areaChart.series[i].color=dataDescription.colors[i],areaChart.series[i].dashStyle="solid",areaChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0
 ],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return areaChart},convertParetoChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function getPreviousData(){for(var i=0;i<chartTemplate.series[0].data.length;i++)allParetoOptions.push(chartTemplate.xAxis.categories[i])}function createStackedBar(dataDescription,paretoChart){paretoChart.plotOptions={series:{shadow:!1,borderColor:dataDescription.borderColor,borderWidth:1},column:{stacking:"normal",dataLabels:{enabled:!0,color:Highcharts.theme&&Highcharts.theme.dataLabelsColor||"white"}}};var start=dataDescription.dataAttr[1].length,steadyCounter=0;compare&&(paretoChart.legend.enabled=!0);for(var f=seriesIndex;start+seriesIndex>f;f++)paretoChart.series[f]||(paretoChart.series[f]={data:[]}),paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]),paretoChart.series[f].name=""!==label?label+" "+dataDescription.labels[steadyCounter]:dataDescription.l
 abels[steadyCounter],paretoChart.series[f].color=dataDescription.colors[f],paretoChart.series[f].stack=label,steadyCounter++}paretoChart=chartTemplate,"undefined"==typeof chartData&&(chartData=[]);var label,cdLength=chartData.length,compare=!1,allParetoOptions=[],stackedBar=!1;if(seriesIndex=0,"object"==typeof dataDescription.dataAttr[1]&&(stackedBar=!0),"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),getPreviousData()):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),seriesIndex=getPreviousData()):(compare=!1,label="",paretoChart.xAxis.categories=[],paretoChart.series=[],paretoChart.series[0]={},paretoChart.series[0].data=[],paretoChart.legend.enabled=!1),paretoChart.plotOptions.series.borderColor=dataDescription.borderColor,compare&&!stackedBar){paretoChart.series[1]={},paretoChart.series[1].data=[];for(var i=0;i<allParetoOptions.length;i
 ++)paretoChart.series[1].data.push(0);paretoChart.legend.enabled=!0}for(var i=0;cdLength>i;i++){var bar=chartData[i];if(compare){var newLabel=bar[dataDescription.dataAttr[0]],newValue=bar[dataDescription.dataAttr[1]],previousIndex=allParetoOptions.indexOf(newLabel);previousIndex>-1&&("object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[1].data[previousIndex]=newValue,paretoChart.series[1].name=""!==label?label+" "+dataDescription.labels[0]:dataDescription.labels[0],paretoChart.series[1].color=dataDescription.colors[1]))}else paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]),"object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]),paretoChart.series[0].name=dataDescription.labels[0],paretoChart.series[0].color=dataDescription.colors[0])}return paretoChart},co
 nvertPieChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){var label,cdLength=chartData.length,compare=!1;pieChart=chartTemplate,"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!1):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!1):(compare=!1,pieChart.series[0].data=[],pieChart.series[0].dataLabels&&"string"==typeof pieChart.series[0].dataLabels.formatter&&(pieChart.series[0].dataLabels.formatter=new Function(pieChart.series[0].dataLabels.formatter))),pieChart.plotOptions.pie.borderColor=dataDescription.borderColor,compare&&(pieChart.series[1].data=[],pieChart.series[1].dataLabels&&"string"==typeof pieChart.series[1].dataLabels.formatter&&(pieChart.series[1].dataLabels.formatter=new Function(pieChart.series[1].dataLabels.formatter)));for(var tempArray=[],i=0;cdLength>i;i++){var pie=chartData[i];tempArray.push({name:pie[dataDescription.dataAttr[0]],y:pie[dataDescription.dataAttr[1]],color:""})}sortJsonArrayByProperty(tempArray,"name");
 for(var i=0;i<tempArray.length;i++)tempArray[i].color=dataDescription.colors[i];return compare?pieChart.series[1].data=tempArray:pieChart.series[0].data=tempArray,pieChart}}}),$(".sessions-bar").sparkline([3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,1],{type:"bar",barColor:"#c5c5c5",width:"800px",height:100,barWidth:12,barSpacing:"1px"}),AppServices.Controllers.controller("DataCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope){var init=function(){$scope.verb="GET",$scope.display="",$scope.queryBodyDetail={},$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.entitySelected={},$scope.newCollection={},$rootScope.queryCollection={},$scope.data={},$scope.data.queryPath="",$scope.data.queryBody='{ "name":"value" }',$scope.data.searchString="",$scope.data.queryLimit=""},runQuery=function(verb){$scope.loading=!0;var queryPath=$scope.remove
 FirstSlash($scope.data.queryPath||""),searchString=$scope.data.searchString||"",queryLimit=$scope.data.queryLimit||"",body=JSON.parse($scope.data.queryBody||"{}");"POST"==verb&&$scope.validateJson(!0)?ug.runDataPOSTQuery(queryPath,body):"PUT"==verb&&$scope.validateJson(!0)?ug.runDataPutQuery(queryPath,searchString,queryLimit,body):"DELETE"==verb?ug.runDataDeleteQuery(queryPath,searchString,queryLimit):ug.runDataQuery(queryPath,searchString,queryLimit)};$scope.$on("top-collections-received",function(event,collectionList){$scope.loading=!1;var ignoredCollections=["events"];ignoredCollections.forEach(function(ignoredCollection){collectionList.hasOwnProperty(ignoredCollection)&&delete collectionList[ignoredCollection]}),$scope.collectionList=collectionList,$scope.queryBoxesSelected=!1,$scope.queryPath||$scope.loadCollection("/"+collectionList[Object.keys(collectionList).sort()[0]].name),$scope.applyScope()}),$scope.$on("error-running-query",function(){$scope.loading=!1,runQuery("GET"),$
 scope.applyScope()}),$scope.$on("entity-deleted",function(){$scope.deleteLoading=!1,$rootScope.$broadcast("alert","success","Entities deleted sucessfully"),$scope.queryBoxesSelected=!1,$scope.checkNextPrev(),$scope.applyScope()}),$scope.$on("entity-deleted-error",function(){$scope.deleteLoading=!1,runQuery("GET"),$scope.applyScope()}),$scope.$on("collection-created",function(){$scope.newCollection.name=""}),$scope.$on("query-received",function(event,collection){$scope.loading=!1,$rootScope.queryCollection=collection,ug.getIndexes($scope.data.queryPath),$scope.setDisplayType(),$scope.checkNextPrev(),$scope.applyScope(),$scope.queryBoxesSelected=!1}),$scope.$on("indexes-received",function(event,indexes){}),$scope.$on("app-changed",function(){init()}),$scope.setDisplayType=function(){$scope.display="generic"},$scope.deleteEntitiesDialog=function(modalId){$scope.deleteLoading=!1,$scope.deleteEntities($rootScope.queryCollection,"entity-deleted","error deleting entity"),$scope.hideModal(m
 odalId)},$scope.newCollectionDialog=function(modalId){$scope.newCollection.name?(ug.createCollection($scope.newCollection.name),ug.getTopCollections(),$rootScope.$broadcast("alert","success","Collection created successfully."),$scope.hideModal(modalId)):$rootScope.$broadcast("alert","error","You must specify a collection name.")},$scope.addToPath=function(uuid){$scope.data.queryPath="/"+$rootScope.queryCollection._type+"/"+uuid},$scope.isDeep=function(item){return"[object Object]"===Object.prototype.toString.call(item)},$scope.loadCollection=function(type){$scope.data.queryPath="/"+type.substring(1,type.length),$scope.data.searchString="",$scope.data.queryLimit="",$scope.data.body='{ "name":"value" }',$scope.selectGET(),$scope.applyScope(),$scope.run()},$scope.selectGET=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="GET"},$scope.selectPOST=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="n
 one",$scope.queryStringDisplay="none",$scope.verb="POST"},$scope.selectPUT=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="PUT"},$scope.selectDELETE=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="DELETE"},$scope.validateJson=function(skipMessage){var queryBody=$scope.data.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),!skipMessage&&$rootScope.$broadcast("alert","success","JSON is valid"),$scope.data.queryBody=queryBody,!0},$scope.saveEntity=function(entity){if(!$scope.validateJson())return!1;var queryBody=entity._json;queryBody=JSON.parse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",entity._data.type),$rootScope.selectedEntity.set("uuid
 ",entity._data.uuid),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})},$scope.run=function(){$rootScope.queryCollection="";var verb=$scope.verb;runQuery(verb)},$scope.hasProperty=function(prop){var retval=!1;return"undefined"!=typeof $rootScope.queryCollection._list&&angular.forEach($rootScope.queryCollection._list,function(value){retval||value._data[prop]&&(retval=!0)}),retval},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$rootScope.queryCollection.hasPreviousPage()&&($scope.previous_display="default"),$rootScope.queryCollection.hasNextPage()&&($scope.next_display="default")},$scope.selectEntity=function(uuid){$rootScope.selectedEntity=$rootScope.queryCollection.getEntityByUUID(uuid),$scope.addToPath(uuid)},$scope.getJSONView=function(entity){var tem
 pjson=entity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2)},$scope.getPrevious=function(){$rootScope.queryCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of data"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$rootScope.queryCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of data"),$scope.checkNextPrev(),$scope.applyScope()})},init(),$rootScope.queryCollection=$rootScope.queryCollection||{},$rootScope.selectedEntity={},$rootScope.queryCollection&&$rootScope.queryCollection._type&&($scope.loadCollection($rootScope.queryCollection._type),$scope.setDisplayType()),ug.getTopCollections(),$scope.resetNextPrev()}]),AppServices.Controllers.con
 troller("EntityCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){if(!$rootScope.selectedEntity)return void $location.path("/data");$scope.entityUUID=$rootScope.selectedEntity.get("uuid"),$scope.entityType=$rootScope.selectedEntity.get("type");var tempjson=$rootScope.selectedEntity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2),$scope.validateJson=function(){var queryBody=$scope.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),$rootScope.$broadcast("alert","success","JSON is valid"),$scope.queryBody=queryBody,!0},$scope.saveEntity=function(){if(!$scope.validateJson())return!1;var queryBody=$scope.queryBody;queryBody=JSON.par
 se(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",$scope.entityType),$rootScope.selectedEntity.set("uuid",$scope.entityUUID),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})}}]),AppServices.Directives.directive("balloon",["$window","$timeout",function($window,$timeout){return{restrict:"ECA",scope:"=",template:'<div class="baloon {{direction}}" ng-transclude></div>',replace:!0,transclude:!0,link:function(scope,lElement,attrs){scope.direction=attrs.direction;var runScroll=!0,windowEl=angular.element($window);windowEl.on("scroll",function(){runScroll&&(lElement.addClass("fade-out"),$timeout(function(){lElement.addClass("hide")},1e3),runScroll=!1)})}}}]),AppServices.Directives.directive("bsmodal",["$rootScope",function($rootScope){return{restrict:"ECA",scope:{title:"@title",buttoni
 d:"=buttonid",footertext:"=footertext",closelabel:"=closelabel"},transclude:!0,templateUrl:"dialogs/modal.html",replace:!0,link:function(scope,lElement,attrs,parentCtrl){scope.title=attrs.title,scope.footertext=attrs.footertext,scope.closelabel=attrs.closelabel,scope.close=attrs.close,scope.extrabutton=attrs.extrabutton,scope.extrabuttonlabel=attrs.extrabuttonlabel,scope.buttonId=attrs.buttonid,scope.closeDelegate=function(attr){scope.$parent[attr](attrs.id,scope)},scope.extraDelegate=function(attr){scope.dialogForm.$valid?(console.log(parentCtrl),scope.$parent[attr](attrs.id)):$rootScope.$broadcast("alert","error","Please check your form input and resubmit.")}}}}]),AppServices.Controllers.controller("AlertCtrl",["$scope","$rootScope","$timeout",function($scope,$rootScope,$timeout){$scope.alertDisplay="none",$scope.alerts=[],$scope.$on("alert",function(event,type,message,permanent){$scope.addAlert(type,message,permanent)}),$scope.$on("clear-alerts",function(){$scope.alerts=[]}),$sco
 pe.addAlert=function(type,message,permanent){$scope.alertDisplay="block",$scope.alerts.push({type:type,msg:message}),$scope.applyScope(),permanent||$timeout(function(){$scope.alerts.shift()},5e3)},$scope.closeAlert=function(index){$scope.alerts.splice(index,1)}}]),AppServices.Directives.directive("alerti",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"ECA",scope:{type:"=type",closeable:"@closeable",index:"&index"},template:'<div class="alert" ng-class="type && \'alert-\' + type">    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i><div ng-transclude></div></div>',replace:!0,tr
 ansclude:!0,link:function(scope,lElement,attrs){$timeout(function(){lElement.addClass("fade-out")},4e3),lElement.click(function(){attrs.index&&scope.$parent.closeAlert(attrs.index)}),setTimeout(function(){lElement.addClass("alert-animate")},10)}}}]),AppServices.Directives.directive("appswitcher",["$rootScope",function(){return{restrict:"ECA",scope:"=",templateUrl:"global/appswitcher-template.html",replace:!0,transclude:!0,link:function(){function globalNavDetail(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#globalNavDetailApiPlatform").addClass(classNameOpen)}var classNameOpen="open";$("ul.nav li.dropdownContainingSubmenu").hover(function(){$(this).addClass(classNameOpen)},function(){$(this).removeClass(classNameOpen)}),$("#globalNav > a").mouseover(globalNavDetail),$("#globalNavDetail").mouseover(globalNavDetail),$("#globalNavSubmenuContainer ul li").mouseover(function(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#"+this.getAttribute("data-globalNavDet
 ail")).addClass(classNameOpen)})}}}]),AppServices.Services.factory("help",function($rootScope,$http,$analytics){$rootScope.help={},$rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1,$rootScope.help.clicked=!1,$rootScope.help.showHelpButtons=!1;
-var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){va
 r shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help"+path+"
 /helpJson.json?callback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!initi
 alized&&ug.getRoles(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootSco
 pe.activeUI=!1;for(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_toke
 n",null),$location.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBroa
 dcast),$scope.applyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSele
 cted=function(list){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),$
 scope.queryStringApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferre
 dLogin.resolve(),$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("reques
 t-times-slow",function(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restric
 t:"E",transclude:!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};re
 turn{get:function(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastInde
 xOf("/")===DATA_URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appNam
 e");var key,size=0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthentic
 ate(email,function(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEma
 il",null),this.client().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$b
 roadcast("collection-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("administ
 rators-received",administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",s
 elf.groupsCollection),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?opt
 ions.qs.ql+" order by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={me
 thod:"PUT",endpoint:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){th
 is.getCollection("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function(
 event,receipts){self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,searc
 hBy,orderBy){var search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups){err?$rootScope.$broadcast("alert","error","error getting groups"):$rootScope.$broadcast("user-groups-receive
 d",groups)})},addUserToGroup:function(user,group){var options={type:"users/"+user+"/groups/"+group};this.client().createEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to group"):$rootScope.$broadcast("user-added-to-group-received")})},addUserToRole:function(user,role){var options={method:"POST",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to role"):$rootScope.$broadcast("role-update-received")})},addGroupToRole:function(group,role){var options={method:"POST",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding group to role"):$rootScope.$broadcast("role-update-received")})},followUser:function(user){var username=$rootScope.selectedUser.get("uuid"),options={method:"POST",endpoint:"users/"+username+"/following/users/"+user};this.client().request(options,funct
 ion(err){err?$rootScope.$broadcast("alert","error","error following user"):$rootScope.$broadcast("follow-user-received")})},newPermission:function(permission,type,entity){var options={method:"POST",endpoint:type+"/"+entity+"/permissions",body:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding permission"):$rootScope.$broadcast("permission-update-received")})},newUserPermission:function(permission,username){this.newPermission(permission,"users",username)},newGroupPermission:function(permission,path){this.newPermission(permission,"groups",path)},newRolePermission:function(permission,name){this.newPermission(permission,"roles",name)},deletePermission:function(permission,type,entity){var options={method:"DELETE",endpoint:type+"/"+entity+"/permissions",qs:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting permission"):$rootScope.$broadcast(
 "permission-update-received")})},deleteUserPermission:function(permission,user){this.deletePermission(permission,"users",user)},deleteGroupPermission:function(permission,group){this.deletePermission(permission,"groups",group)},deleteRolePermission:function(permission,rolename){this.deletePermission(permission,"roles",rolename)},removeUserFromRole:function(user,role){var options={method:"DELETE",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing user from role"):$rootScope.$broadcast("role-update-received")})},removeUserFromGroup:function(group,role){var options={method:"DELETE",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing role from the group"):$rootScope.$broadcast("role-update-received")})},createAndroidNotifier:function(name,APIkey){var options={method:"POST",endpoint:"notifiers",body:{apiKey:API
 key,name:name,provider:"google"}};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error","error creating notifier ")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},createAppleNotifier:function(file,name,environment,certificatePassword){var provider="apple",formData=new FormData;formData.append("p12Certificate",file),formData.append("name",name),formData.append("provider",provider),formData.append("environment",environment),formData.append("certificatePassword",certificatePassword||"");var options={method:"POST",endpoint:"notifiers",formData:formData};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error",data.error_description||"error creating notifier")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},deleteNotifier:fu
 nction(name){var options={method:"DELETE",endpoint:"notifiers/"+name};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting notifier"):$rootScope.$broadcast("notifier-update")})},initializeCurrentUser:function(callback){if(callback=callback||function(){},$rootScope.currentUser&&!$rootScope.currentUser.reset)return callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized","");var options={method:"GET",endpoint:"management/users/"+this.client().get("email"),mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Error getting user info"):($rootScope.currentUser=data.data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email),$rootScope.userEmail=$rootScope.currentUser.email,callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized",$rootScope.currentUser))})},updateUser:function(user){var body=$rootScope.currentUser
 ;body.username=user.username,body.name=user.name,body.email=user.email;var options={method:"PUT",endpoint:"management/users/"+user.uuid+"/",mQuery:!0,body:body},self=this;this.client().request(options,function(err,data){return self.client().set("email",user.email),self.client().set("username",user.username),err?$rootScope.$broadcast("user-update-error",data):($rootScope.currentUser.reset=!0,void self.initializeCurrentUser(function(){$rootScope.$broadcast("user-update-success",$rootScope.currentUser)}))})},resetUserPassword:function(user){var pwdata={};pwdata.oldpassword=user.oldPassword,pwdata.newpassword=user.newPassword,pwdata.username=user.username;var options={method:"PUT",endpoint:"users/"+pwdata.uuid+"/",body:pwdata};this.client().request(options,function(err){return err?$rootScope.$broadcast("alert","error","Error resetting password"):($rootScope.currentUser.oldPassword="",$rootScope.currentUser.newPassword="",void $rootScope.$broadcast("user-reset-password-success",$rootScop
 e.currentUser))})},getOrgCredentials:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("org-creds-updated",data.credentials)})},regenerateOrgCredentials:function(){var options={method:"POST",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("org-creds-updated",data.credentials))})},getAppCredentials:function(){var options={method:"GET",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error
 ","Error getting credentials"):$rootScope.$broadcast("app-creds-updated",data.credentials)})},regenerateAppCredentials:function(){var options={method:"POST",endpoint:"credentials"};
+var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){va
 r shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("https://sdk.apigee.com/portal_help"+path+"/helpJson.json?c
 allback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!initialized&&ug.getRo
 les(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootScope.activeUI=!1;f
 or(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_token",null),$locati
 on.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBroadcast),$scope.ap
 plyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSelected=function(li
 st){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),$scope.queryStrin
 gApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferredLogin.resolve()
 ,$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("request-times-slow",fu
 nction(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restrict:"E",transclude
 :!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};return{get:functio
 n(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastIndexOf("/")===DATA_
 URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appName");var key,size
 =0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthenticate(email,functi
 on(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEmail",null),this.c
 lient().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$broadcast("collec
 tion-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("administrators-received"
 ,administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",self.groupsCollec
 tion),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?options.qs.ql+" ord
 er by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={method:"PUT",endpo
 int:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){this.getCollection
 ("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function(event,receipts){
 self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,searchBy,orderBy){var
  search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups){

<TRUNCATED>

[22/24] git commit: Merge pull request #97 from shawnfeldman/master

Posted by sn...@apache.org.
Merge pull request #97 from shawnfeldman/master

update readme

Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/1b4038a5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/1b4038a5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/1b4038a5

Branch: refs/pull/96/merge
Commit: 1b4038a5d26a863dece8e21d3e63745686cfe2c5
Parents: 72b5753 ded28e5
Author: Rod Simpson <ro...@rodsimpson.com>
Authored: Wed Apr 2 12:31:57 2014 -0600
Committer: Rod Simpson <ro...@rodsimpson.com>
Committed: Wed Apr 2 12:31:57 2014 -0600

----------------------------------------------------------------------
 portal/README.md | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------



[03/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/js/usergrid.min.js.orig
----------------------------------------------------------------------
diff --git a/portal/js/usergrid.min.js.orig b/portal/js/usergrid.min.js.orig
new file mode 100644
index 0000000..1deafc9
--- /dev/null
+++ b/portal/js/usergrid.min.js.orig
@@ -0,0 +1,6 @@
+/*! usergrid@2.0.2 2014-03-31 */
+!function(exports,global){function renderChart(chartsDefaults,chartdata){var newSettings={};$.extend(!0,newSettings,chartsDefaults,chartdata);new Highcharts.Chart(newSettings)}function menuBindClick(scope,lElement,cevent,menuContext){var currentSelection=angular.element(cevent.srcElement).parent(),previousSelection=scope[menuContext];previousSelection!==currentSelection&&(previousSelection&&angular.element(previousSelection).removeClass("active"),scope[menuContext]=currentSelection,scope.$apply(function(){currentSelection.addClass("active")}))}global["true"]=exports;var polyfills=function(window,Object){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}(),Object.defineProperty(Object.prototype,"clone",{enumerable:!1,writable:!0,value:function(){var i,newObj=this instanceof Arra
 y?[]:{};for(i in this)"clone"!==i&&(newObj[i]=this[i]&&"object"==typeof this[i]?this[i].clone():this[i]);return newObj}}),Object.defineProperty(Object.prototype,"stringifyJSON",{enumerable:!1,writable:!0,value:function(){return JSON.stringify(this,null,"	")}})};polyfills(window,Object);var global=global||this,AppServices=AppServices||{};global.AppServices=global.AppServices||AppServices,AppServices.Constants=angular.module("appservices.constants",[]),AppServices.Services=angular.module("appservices.services",[]),AppServices.Controllers=angular.module("appservices.controllers",[]),AppServices.Filters=angular.module("appservices.filters",[]),AppServices.Directives=angular.module("appservices.directives",[]),AppServices.Performance=angular.module("appservices.performance",[]),AppServices.MAX=angular.module("appservices.max",[]),angular.module("appservices",["ngRoute","ngResource","ngSanitize","ui.bootstrap","angulartics","angulartics.google.analytics","appservices.filters","appservices
 .services","appservices.directives","appservices.constants","appservices.controllers","appservices.max","angular-intro"]).config(["$routeProvider","$locationProvider","$sceDelegateProvider","$analyticsProvider",function($routeProvider,$locationProvider,$sceDelegateProvider,$analyticsProvider){$routeProvider.when("/org-overview",{templateUrl:"org-overview/org-overview.html",controller:"OrgOverviewCtrl"}).when("/login",{templateUrl:"login/login.html",controller:"LoginCtrl"}).when("/login/loading",{templateUrl:"login/loading.html",controller:"LoginCtrl"}).when("/app-overview/summary",{templateUrl:"app-overview/app-overview.html",controller:"AppOverviewCtrl"}).when("/getting-started/setup",{templateUrl:"app-overview/getting-started.html",controller:"GettingStartedCtrl"}).when("/forgot-password",{templateUrl:"login/forgot-password.html",controller:"ForgotPasswordCtrl"}).when("/register",{templateUrl:"login/register.html",controller:"RegisterCtrl"}).when("/users",{templateUrl:"users/users
 .html",controller:"UsersCtrl"}).when("/users/profile",{templateUrl:"users/users-profile.html",controller:"UsersProfileCtrl"}).when("/users/groups",{templateUrl:"users/users-groups.html",controller:"UsersGroupsCtrl"}).when("/users/activities",{templateUrl:"users/users-activities.html",controller:"UsersActivitiesCtrl"}).when("/users/feed",{templateUrl:"users/users-feed.html",controller:"UsersFeedCtrl"}).when("/users/graph",{templateUrl:"users/users-graph.html",controller:"UsersGraphCtrl"}).when("/users/roles",{templateUrl:"users/users-roles.html",controller:"UsersRolesCtrl"}).when("/groups",{templateUrl:"groups/groups.html",controller:"GroupsCtrl"}).when("/groups/details",{templateUrl:"groups/groups-details.html",controller:"GroupsDetailsCtrl"}).when("/groups/members",{templateUrl:"groups/groups-members.html",controller:"GroupsMembersCtrl"}).when("/groups/activities",{templateUrl:"groups/groups-activities.html",controller:"GroupsActivitiesCtrl"}).when("/groups/roles",{templateUrl:"gro
 ups/groups-roles.html",controller:"GroupsRolesCtrl"}).when("/roles",{templateUrl:"roles/roles.html",controller:"RolesCtrl"}).when("/roles/settings",{templateUrl:"roles/roles-settings.html",controller:"RolesSettingsCtrl"}).when("/roles/users",{templateUrl:"roles/roles-users.html",controller:"RolesUsersCtrl"}).when("/roles/groups",{templateUrl:"roles/roles-groups.html",controller:"RolesGroupsCtrl"}).when("/data",{templateUrl:"data/data.html",controller:"DataCtrl"}).when("/data/entity",{templateUrl:"data/entity.html",controller:"EntityCtrl"}).when("/data/shell",{templateUrl:"data/shell.html",controller:"ShellCtrl"}).when("/profile/organizations",{templateUrl:"profile/organizations.html",controller:"OrgCtrl"}).when("/profile/profile",{templateUrl:"profile/profile.html",controller:"ProfileCtrl"}).when("/profile",{templateUrl:"profile/account.html",controller:"AccountCtrl"}).when("/activities",{templateUrl:"activities/activities.html",controller:"ActivitiesCtrl"}).when("/shell",{templateU
 rl:"shell/shell.html",controller:"ShellCtrl"}).when("/logout",{templateUrl:"login/logout.html",controller:"LogoutCtrl"}).otherwise({redirectTo:"/org-overview"}),$locationProvider.html5Mode(!1).hashPrefix("!"),$sceDelegateProvider.resourceUrlWhitelist(["self","http://apigee-internal-prod.jupiter.apigee.net/**","http://apigee-internal-prod.mars.apigee.net/**","https://appservices.apigee.com/**","https://api.usergrid.com/**"]),$analyticsProvider.virtualPageviews(!1),$analyticsProvider.firstPageview(!1)}]),AppServices.Controllers.controller("ActivitiesCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope){$scope.$on("app-activities-received",function(evt,data){$scope.activities=data,$scope.$apply()}),$scope.$on("app-activities-error",function(){$rootScope.$broadcast("alert","error","Application failed to retreive activities data.")}),ug.getActivities()}]),AppServices.Controllers.controller("AppOverviewCtrl",["ug","charts","$scope","$rootScope","$log",funct
 ion(ug,charts,$scope,$rootScope,$log){var createGradient=function(color1,color2){var perShapeGradient={x1:0,y1:0,x2:0,y2:1};return{linearGradient:perShapeGradient,stops:[[0,color1],[1,color2]]}};$scope.appOverview={},$scope.collections=[],$scope.graph="",$scope.$on("top-collections-received",function(event,collections){var dataDescription={bar1:{labels:["Total"],dataAttr:["title","count"],colors:[createGradient("rgba(36,151,212,0.6)","rgba(119,198,240,0.6)")],borderColor:"#1b97d1"}};$scope.collections=collections;var arr=[];for(var i in collections)collections.hasOwnProperty(i)&&arr.push(collections[i]);$scope.appOverview={},$rootScope.chartTemplate?($scope.appOverview.chart=angular.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()):ug.httpGet(null,"js/charts/highcharts.json").then(function(success){$rootScope.chartTemplate=success,$scope.appOverview.chart=angular
 .copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()},function(fail){$log.error("Problem getting chart template",fail)})}),$scope.$on("app-initialized",function(){ug.getTopCollections()}),$rootScope.activeUI&&ug.getTopCollections()}]),AppServices.Controllers.controller("GettingStartedCtrl",["ug","$scope","$rootScope","$location","$timeout","$anchorScroll",function(ug,$scope,$rootScope,$location,$timeout,$anchorScroll){$scope.collections=[],$scope.graph="",$scope.clientID="",$scope.clientSecret="";$scope.regenerateCredentialsDialog=function(modalId){$scope.orgAPICredentials={client_id:"regenerating...",client_secret:"regenerating..."},ug.regenerateAppCredentials(),$scope.hideModal(modalId)},$scope.$on("app-creds-updated",function(event,credentials){credentials?($scope.clientID=credentials.client_id,$scope.clientSecret=credentials.client_secret,$scope.$$phase||$scope.
 $apply()):setTimeout(function(){ug.getAppCredentials()},5e3)}),ug.getAppCredentials(),$scope.contentTitle,$scope.showSDKDetail=function(name){var introContainer=document.getElementById("intro-container");if("nocontent"===name)return introContainer.style.height="0",!0;introContainer.style.opacity=.1,introContainer.style.height="0";var timeout=0;$scope.contentTitle&&(timeout=500),$timeout(function(){introContainer.style.height="1000px",introContainer.style.opacity=1},timeout),$scope.optionName=name,$scope.contentTitle=name,$scope.sdkLink="http://apigee.com/docs/content/"+name+"-sdk-redirect",$scope.docsLink="http://apigee.com/docs/app-services/content/installing-apigee-sdk-"+name,$scope.getIncludeURL=function(){return"app-overview/doc-includes/"+$scope.optionName+".html"}},$scope.scrollToElement=function(elem){return $location.hash(elem),$anchorScroll(),!1}}]),AppServices.Controllers.controller("ChartCtrl",["$scope","$location",function(){}]),AppServices.Directives.directive("chart",f
 unction(){return{restrict:"E",scope:{chartdata:"=chartdata"},template:"<div></div>",replace:!0,controller:function(){},link:function(scope,element,attrs){scope.$watch("chartdata",function(chartdata){if(chartdata){var chartsDefaults={chart:{renderTo:element[0],type:attrs.type||null,height:attrs.height||null,width:attrs.width||null,reflow:!0,animation:!1,zoomType:"x"}};if("pie"===attrs.type&&(chartsDefaults.chart.margin=[0,0,0,0],chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.spacingTop=0,chartsDefaults.chart.spacingBottom=0,attrs.titleimage&&(chartdata.title.text='<img src="'+attrs.titleimage+'">'),attrs.titleicon&&(chartdata.title.text='<i class="pictogram '+attrs.titleiconclass+'">'+attrs.titleicon+"</i>"),attrs.titlecolor&&(chartdata.title.style.color=attrs.titlecolor),attrs.titleimagetop&&(chartdata.title.style.marginTop=attrs.titleimagetop),attrs.titleimageleft&&(chartdata.title.style.marginLeft=attrs.titleimageleft)),"line"===attrs.t
 ype&&(chartsDefaults.chart.marginTop=30,chartsDefaults.chart.spacingTop=50),"column"===attrs.type&&(chartsDefaults.chart.marginBottom=80),"area"===attrs.type&&(chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.marginLeft=0,chartsDefaults.chart.marginRight=0),Highcharts.setOptions({global:{useUTC:!1},chart:{style:{fontFamily:"marquette-light, Helvetica, Arial, sans-serif"}}}),"line"===attrs.type){var xAxis1=chartdata.xAxis[0];xAxis1.labels.formatter||(xAxis1.labels.formatter=new Function(attrs.xaxislabel)),xAxis1.labels.step||(xAxis1.labels.step=attrs.xaxisstep)}chartdata.tooltip&&"string"==typeof chartdata.tooltip.formatter&&(chartdata.tooltip.formatter=new Function(chartdata.tooltip.formatter)),renderChart(chartsDefaults,chartdata)}},!0)}}}),AppServices.Services.factory("charts",function(){function sortJsonArrayByProperty(objArray,prop){if(arguments.length<2)throw new Error("sortJsonArrayByProp requires 2 arguments");var direct=arguments.le
 ngth>2?arguments[2]:1;if(objArray&&objArray.constructor===Array){var propPath=prop.constructor===Array?prop:prop.split(".");objArray.sort(function(a,b){for(var p in propPath)a[propPath[p]]&&b[propPath[p]]&&(a=a[propPath[p]],b=b[propPath[p]]);return a=a.match(/^\d+$/)?+a:a,b=b.match(/^\d+$/)?+b:b,b>a?-1*direct:a>b?1*direct:0})}}var lineChart,areaChart,paretoChart,pieChart,xaxis,seriesIndex;return{convertLineChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)lineChart.series[localCounter].data.push("undefined"==typeof dp?[i,0]:[i,dp[dataAttrs[j]]]),detailedView||localCounter++}lineChart=chartTemplate,"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex
 =dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(lineChart=chartTemplate,seriesIndex=0,lineChart.series=[],label=""),xaxis=lineChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,lineChart.series[l]={},lineChart.series[l].data=[],lineChart.series[l].name=chartData[l].chartGroupName,lineChart.series[l].yAxis=0,lineChart.series[l].type="line",lineChart.series[l].color=dataDescription.colors[i],lineChart.series[l].dashStyle="solid",lineChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var
  steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;lineChart.series[i]={},lineChart.series[i].data=[],lineChart.series[i].name=label+dataDescription.labels[steadyCounter],lineChart.series[i].yAxis=yAxisIndex,lineChart.series[i].type="line",lineChart.series[i].color=dataDescription.colors[i],lineChart.series[i].dashStyle="solid",lineChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return lineChart},convertAreaChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)areaChart.series[localCounter].data.push("undefined"==typeof dp?0:dp[dataAttrs[j]]
 ),detailedView||localCounter++}areaChart=angular.copy(areaChart),"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(areaChart=chartTemplate,seriesIndex=0,areaChart.series=[],label=""),xaxis=areaChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,areaChart.series[l]={},areaChart.series[l].data=[],areaChart.series[l].fillColor=dataDescription.areaColors[l],areaChart.series[l].name=chart
 Data[l].chartGroupName,areaChart.series[l].yAxis=0,areaChart.series[l].type="area",areaChart.series[l].pointInterval=1,areaChart.series[l].color=dataDescription.colors[l],areaChart.series[l].dashStyle="solid",areaChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;areaChart.series[i]={},areaChart.series[i].data=[],areaChart.series[i].fillColor=dataDescription.areaColors[i],areaChart.series[i].name=label+dataDescription.labels[steadyCounter],areaChart.series[i].yAxis=yAxisIndex,areaChart.series[i].type="area",areaChart.series[i].pointInterval=1,areaChart.series[i].color=dataDescription.colors[i],areaChart.series[i].dashStyle="solid",areaChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0
 ],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return areaChart},convertParetoChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function getPreviousData(){for(var i=0;i<chartTemplate.series[0].data.length;i++)allParetoOptions.push(chartTemplate.xAxis.categories[i])}function createStackedBar(dataDescription,paretoChart){paretoChart.plotOptions={series:{shadow:!1,borderColor:dataDescription.borderColor,borderWidth:1},column:{stacking:"normal",dataLabels:{enabled:!0,color:Highcharts.theme&&Highcharts.theme.dataLabelsColor||"white"}}};var start=dataDescription.dataAttr[1].length,steadyCounter=0;compare&&(paretoChart.legend.enabled=!0);for(var f=seriesIndex;start+seriesIndex>f;f++)paretoChart.series[f]||(paretoChart.series[f]={data:[]}),paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]),paretoChart.series[f].name=""!==label?label+" "+dataDescription.labels[steadyCounter]:dataDescription.l
 abels[steadyCounter],paretoChart.series[f].color=dataDescription.colors[f],paretoChart.series[f].stack=label,steadyCounter++}paretoChart=chartTemplate,"undefined"==typeof chartData&&(chartData=[]);var label,cdLength=chartData.length,compare=!1,allParetoOptions=[],stackedBar=!1;if(seriesIndex=0,"object"==typeof dataDescription.dataAttr[1]&&(stackedBar=!0),"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),getPreviousData()):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),seriesIndex=getPreviousData()):(compare=!1,label="",paretoChart.xAxis.categories=[],paretoChart.series=[],paretoChart.series[0]={},paretoChart.series[0].data=[],paretoChart.legend.enabled=!1),paretoChart.plotOptions.series.borderColor=dataDescription.borderColor,compare&&!stackedBar){paretoChart.series[1]={},paretoChart.series[1].data=[];for(var i=0;i<allParetoOptions.length;i
 ++)paretoChart.series[1].data.push(0);paretoChart.legend.enabled=!0}for(var i=0;cdLength>i;i++){var bar=chartData[i];if(compare){var newLabel=bar[dataDescription.dataAttr[0]],newValue=bar[dataDescription.dataAttr[1]],previousIndex=allParetoOptions.indexOf(newLabel);previousIndex>-1&&("object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[1].data[previousIndex]=newValue,paretoChart.series[1].name=""!==label?label+" "+dataDescription.labels[0]:dataDescription.labels[0],paretoChart.series[1].color=dataDescription.colors[1]))}else paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]),"object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]),paretoChart.series[0].name=dataDescription.labels[0],paretoChart.series[0].color=dataDescription.colors[0])}return paretoChart},co
 nvertPieChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){var label,cdLength=chartData.length,compare=!1;pieChart=chartTemplate,"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!1):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!1):(compare=!1,pieChart.series[0].data=[],pieChart.series[0].dataLabels&&"string"==typeof pieChart.series[0].dataLabels.formatter&&(pieChart.series[0].dataLabels.formatter=new Function(pieChart.series[0].dataLabels.formatter))),pieChart.plotOptions.pie.borderColor=dataDescription.borderColor,compare&&(pieChart.series[1].data=[],pieChart.series[1].dataLabels&&"string"==typeof pieChart.series[1].dataLabels.formatter&&(pieChart.series[1].dataLabels.formatter=new Function(pieChart.series[1].dataLabels.formatter)));for(var tempArray=[],i=0;cdLength>i;i++){var pie=chartData[i];tempArray.push({name:pie[dataDescription.dataAttr[0]],y:pie[dataDescription.dataAttr[1]],color:""})}sortJsonArrayByProperty(tempArray,"name");
 for(var i=0;i<tempArray.length;i++)tempArray[i].color=dataDescription.colors[i];return compare?pieChart.series[1].data=tempArray:pieChart.series[0].data=tempArray,pieChart}}}),$(".sessions-bar").sparkline([3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,1],{type:"bar",barColor:"#c5c5c5",width:"800px",height:100,barWidth:12,barSpacing:"1px"}),AppServices.Controllers.controller("DataCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope){var init=function(){$scope.verb="GET",$scope.display="",$scope.queryBodyDetail={},$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.entitySelected={},$scope.newCollection={},$rootScope.queryCollection={},$scope.data={},$scope.data.queryPath="",$scope.data.queryBody='{ "name":"value" }',$scope.data.searchString="",$scope.data.queryLimit=""},runQuery=function(verb){$scope.loading=!0;var queryPath=$scope.remove
 FirstSlash($scope.data.queryPath||""),searchString=$scope.data.searchString||"",queryLimit=$scope.data.queryLimit||"",body=JSON.parse($scope.data.queryBody||"{}");"POST"==verb&&$scope.validateJson(!0)?ug.runDataPOSTQuery(queryPath,body):"PUT"==verb&&$scope.validateJson(!0)?ug.runDataPutQuery(queryPath,searchString,queryLimit,body):"DELETE"==verb?ug.runDataDeleteQuery(queryPath,searchString,queryLimit):ug.runDataQuery(queryPath,searchString,queryLimit)};$scope.$on("top-collections-received",function(event,collectionList){$scope.loading=!1;var ignoredCollections=["events"];ignoredCollections.forEach(function(ignoredCollection){collectionList.hasOwnProperty(ignoredCollection)&&delete collectionList[ignoredCollection]}),$scope.collectionList=collectionList,$scope.queryBoxesSelected=!1,$scope.queryPath||$scope.loadCollection("/"+collectionList[Object.keys(collectionList).sort()[0]].name),$scope.applyScope()}),$scope.$on("error-running-query",function(){$scope.loading=!1,runQuery("GET"),$
 scope.applyScope()}),$scope.$on("entity-deleted",function(){$scope.deleteLoading=!1,$rootScope.$broadcast("alert","success","Entities deleted sucessfully"),$scope.queryBoxesSelected=!1,$scope.checkNextPrev(),$scope.applyScope()}),$scope.$on("entity-deleted-error",function(){$scope.deleteLoading=!1,runQuery("GET"),$scope.applyScope()}),$scope.$on("collection-created",function(){$scope.newCollection.name=""}),$scope.$on("query-received",function(event,collection){$scope.loading=!1,$rootScope.queryCollection=collection,ug.getIndexes($scope.data.queryPath),$scope.setDisplayType(),$scope.checkNextPrev(),$scope.applyScope(),$scope.queryBoxesSelected=!1}),$scope.$on("indexes-received",function(event,indexes){}),$scope.$on("app-changed",function(){init()}),$scope.setDisplayType=function(){$scope.display="generic"},$scope.deleteEntitiesDialog=function(modalId){$scope.deleteLoading=!1,$scope.deleteEntities($rootScope.queryCollection,"entity-deleted","error deleting entity"),$scope.hideModal(m
 odalId)},$scope.newCollectionDialog=function(modalId){$scope.newCollection.name?(ug.createCollection($scope.newCollection.name),ug.getTopCollections(),$rootScope.$broadcast("alert","success","Collection created successfully."),$scope.hideModal(modalId)):$rootScope.$broadcast("alert","error","You must specify a collection name.")},$scope.addToPath=function(uuid){$scope.data.queryPath="/"+$rootScope.queryCollection._type+"/"+uuid},$scope.isDeep=function(item){return"[object Object]"===Object.prototype.toString.call(item)},$scope.loadCollection=function(type){$scope.data.queryPath="/"+type.substring(1,type.length),$scope.data.searchString="",$scope.data.queryLimit="",$scope.data.body='{ "name":"value" }',$scope.selectGET(),$scope.applyScope(),$scope.run()},$scope.selectGET=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="GET"},$scope.selectPOST=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="n
 one",$scope.queryStringDisplay="none",$scope.verb="POST"},$scope.selectPUT=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="PUT"},$scope.selectDELETE=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="DELETE"},$scope.validateJson=function(skipMessage){var queryBody=$scope.data.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),!skipMessage&&$rootScope.$broadcast("alert","success","JSON is valid"),$scope.data.queryBody=queryBody,!0},$scope.saveEntity=function(entity){if(!$scope.validateJson())return!1;var queryBody=entity._json;queryBody=JSON.parse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",entity._data.type),$rootScope.selectedEntity.set("uuid
 ",entity._data.uuid),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})},$scope.run=function(){$rootScope.queryCollection="";var verb=$scope.verb;runQuery(verb)},$scope.hasProperty=function(prop){var retval=!1;return"undefined"!=typeof $rootScope.queryCollection._list&&angular.forEach($rootScope.queryCollection._list,function(value){retval||value._data[prop]&&(retval=!0)}),retval},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$rootScope.queryCollection.hasPreviousPage()&&($scope.previous_display="default"),$rootScope.queryCollection.hasNextPage()&&($scope.next_display="default")},$scope.selectEntity=function(uuid){$rootScope.selectedEntity=$rootScope.queryCollection.getEntityByUUID(uuid),$scope.addToPath(uuid)},$scope.getJSONView=function(entity){var tem
 pjson=entity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2)},$scope.getPrevious=function(){$rootScope.queryCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of data"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$rootScope.queryCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of data"),$scope.checkNextPrev(),$scope.applyScope()})},init(),$rootScope.queryCollection=$rootScope.queryCollection||{},$rootScope.selectedEntity={},$rootScope.queryCollection&&$rootScope.queryCollection._type&&($scope.loadCollection($rootScope.queryCollection._type),$scope.setDisplayType()),ug.getTopCollections(),$scope.resetNextPrev()}]),AppServices.Controllers.con
 troller("EntityCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){if(!$rootScope.selectedEntity)return void $location.path("/data");$scope.entityUUID=$rootScope.selectedEntity.get("uuid"),$scope.entityType=$rootScope.selectedEntity.get("type");var tempjson=$rootScope.selectedEntity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2),$scope.validateJson=function(){var queryBody=$scope.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),$rootScope.$broadcast("alert","success","JSON is valid"),$scope.queryBody=queryBody,!0},$scope.saveEntity=function(){if(!$scope.validateJson())return!1;var queryBody=$scope.queryBody;queryBody=JSON.par
 se(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",$scope.entityType),$rootScope.selectedEntity.set("uuid",$scope.entityUUID),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})}}]),AppServices.Directives.directive("balloon",["$window","$timeout",function($window,$timeout){return{restrict:"ECA",scope:"=",template:'<div class="baloon {{direction}}" ng-transclude></div>',replace:!0,transclude:!0,link:function(scope,lElement,attrs){scope.direction=attrs.direction;var runScroll=!0,windowEl=angular.element($window);windowEl.on("scroll",function(){runScroll&&(lElement.addClass("fade-out"),$timeout(function(){lElement.addClass("hide")},1e3),runScroll=!1)})}}}]),AppServices.Directives.directive("bsmodal",["$rootScope",function($rootScope){return{restrict:"ECA",scope:{title:"@title",buttoni
 d:"=buttonid",footertext:"=footertext",closelabel:"=closelabel"},transclude:!0,templateUrl:"dialogs/modal.html",replace:!0,link:function(scope,lElement,attrs,parentCtrl){scope.title=attrs.title,scope.footertext=attrs.footertext,scope.closelabel=attrs.closelabel,scope.close=attrs.close,scope.extrabutton=attrs.extrabutton,scope.extrabuttonlabel=attrs.extrabuttonlabel,scope.buttonId=attrs.buttonid,scope.closeDelegate=function(attr){scope.$parent[attr](attrs.id,scope)},scope.extraDelegate=function(attr){scope.dialogForm.$valid?(console.log(parentCtrl),scope.$parent[attr](attrs.id)):$rootScope.$broadcast("alert","error","Please check your form input and resubmit.")}}}}]),AppServices.Controllers.controller("AlertCtrl",["$scope","$rootScope","$timeout",function($scope,$rootScope,$timeout){$scope.alertDisplay="none",$scope.alerts=[],$scope.$on("alert",function(event,type,message,permanent){$scope.addAlert(type,message,permanent)}),$scope.$on("clear-alerts",function(){$scope.alerts=[]}),$sco
 pe.addAlert=function(type,message,permanent){$scope.alertDisplay="block",$scope.alerts.push({type:type,msg:message}),$scope.applyScope(),permanent||$timeout(function(){$scope.alerts.shift()},5e3)},$scope.closeAlert=function(index){$scope.alerts.splice(index,1)}}]),AppServices.Directives.directive("alerti",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"ECA",scope:{type:"=type",closeable:"@closeable",index:"&index"},template:'<div class="alert" ng-class="type && \'alert-\' + type">    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i><div ng-transclude></div></div>',replace:!0,tr
 ansclude:!0,link:function(scope,lElement,attrs){$timeout(function(){lElement.addClass("fade-out")},4e3),lElement.click(function(){attrs.index&&scope.$parent.closeAlert(attrs.index)}),setTimeout(function(){lElement.addClass("alert-animate")},10)}}}]),AppServices.Directives.directive("appswitcher",["$rootScope",function(){return{restrict:"ECA",scope:"=",templateUrl:"global/appswitcher-template.html",replace:!0,transclude:!0,link:function(){function globalNavDetail(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#globalNavDetailApiPlatform").addClass(classNameOpen)}var classNameOpen="open";$("ul.nav li.dropdownContainingSubmenu").hover(function(){$(this).addClass(classNameOpen)},function(){$(this).removeClass(classNameOpen)}),$("#globalNav > a").mouseover(globalNavDetail),$("#globalNavDetail").mouseover(globalNavDetail),$("#globalNavSubmenuContainer ul li").mouseover(function(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#"+this.getAttribute("data-globalNavDet
 ail")).addClass(classNameOpen)})}}}]),AppServices.Services.factory("help",function($rootScope,$http,$analytics){$rootScope.help={},$rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1,$rootScope.help.clicked=!1,$rootScope.help.showHelpButtons=!1;
+var helpStartTime,introjs_step;$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1)},$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"==path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){va
 r shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value})};$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_ChangeEvent=function(){introjs_step++};var getHelpJson=function(path){return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help"+path+"
 /helpJson.json?callback=JSON_CALLBACK")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!initi
 alized&&ug.getRoles(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics){var initScopeVariables=function(){$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootSco
 pe.activeUI=!1;for(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_toke
 n",null),$location.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBroa
 dcast),$scope.applyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSele
 cted=function(list){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),$
 scope.queryStringApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferre
 dLogin.resolve(),$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("reques
 t-times-slow",function(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()}}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restric
 t:"E",transclude:!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};re
 turn{get:function(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="http://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="http://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastInde
 xOf("/")===DATA_URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appNam
 e");var key,size=0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthentic
 ate(email,function(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEma
 il",null),this.client().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$b
 roadcast("collection-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("administ
 rators-received",administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",s
 elf.groupsCollection),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?opt
 ions.qs.ql+" order by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={me
 thod:"PUT",endpoint:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){th
 is.getCollection("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function(
 event,receipts){self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,searc
 hBy,orderBy){var search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups){err?$rootScope.$broadcast("alert","error","error getting groups"):$rootScope.$broadcast("user-groups-receive
 d",groups)})},addUserToGroup:function(user,group){var options={type:"users/"+user+"/groups/"+group};this.client().createEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to group"):$rootScope.$broadcast("user-added-to-group-received")})},addUserToRole:function(user,role){var options={method:"POST",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to role"):$rootScope.$broadcast("role-update-received")})},addGroupToRole:function(group,role){var options={method:"POST",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding group to role"):$rootScope.$broadcast("role-update-received")})},followUser:function(user){var username=$rootScope.selectedUser.get("uuid"),options={method:"POST",endpoint:"users/"+username+"/following/users/"+user};this.client().request(options,funct
 ion(err){err?$rootScope.$broadcast("alert","error","error following user"):$rootScope.$broadcast("follow-user-received")})},newPermission:function(permission,type,entity){var options={method:"POST",endpoint:type+"/"+entity+"/permissions",body:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding permission"):$rootScope.$broadcast("permission-update-received")})},newUserPermission:function(permission,username){this.newPermission(permission,"users",username)},newGroupPermission:function(permission,path){this.newPermission(permission,"groups",path)},newRolePermission:function(permission,name){this.newPermission(permission,"roles",name)},deletePermission:function(permission,type,entity){var options={method:"DELETE",endpoint:type+"/"+entity+"/permissions",qs:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting permission"):$rootScope.$broadcast(
 "permission-update-received")})},deleteUserPermission:function(permission,user){this.deletePermission(permission,"users",user)},deleteGroupPermission:function(permission,group){this.deletePermission(permission,"groups",group)},deleteRolePermission:function(permission,rolename){this.deletePermission(permission,"roles",rolename)},removeUserFromRole:function(user,role){var options={method:"DELETE",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing user from role"):$rootScope.$broadcast("role-update-received")})},removeUserFromGroup:function(group,role){var options={method:"DELETE",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing role from the group"):$rootScope.$broadcast("role-update-received")})},createAndroidNotifier:function(name,APIkey){var options={method:"POST",endpoint:"notifiers",body:{apiKey:API
 key,name:name,provider:"google"}};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error","error creating notifier ")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},createAppleNotifier:function(file,name,environment,certificatePassword){var provider="apple",formData=new FormData;formData.append("p12Certificate",file),formData.append("name",name),formData.append("provider",provider),formData.append("environment",environment),formData.append("certificatePassword",certificatePassword||"");var options={method:"POST",endpoint:"notifiers",formData:formData};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error",data.error_description||"error creating notifier")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},deleteNotifier:fu
 nction(name){var options={method:"DELETE",endpoint:"notifiers/"+name};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting notifier"):$rootScope.$broadcast("notifier-update")})},initializeCurrentUser:function(callback){if(callback=callback||function(){},$rootScope.currentUser&&!$rootScope.currentUser.reset)return callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized","");var options={method:"GET",endpoint:"management/users/"+this.client().get("email"),mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Error getting user info"):($rootScope.currentUser=data.data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email),$rootScope.userEmail=$rootScope.currentUser.email,callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized",$rootScope.currentUser))})},updateUser:function(user){var body=$rootScope.currentUser
 ;body.username=user.username,body.name=user.name,body.email=user.email;var options={method:"PUT",endpoint:"management/users/"+user.uuid+"/",mQuery:!0,body:body},self=this;this.client().request(options,function(err,data){return self.client().set("email",user.email),self.client().set("username",user.username),err?$rootScope.$broadcast("user-update-error",data):($rootScope.currentUser.reset=!0,void self.initializeCurrentUser(function(){$rootScope.$broadcast("user-update-success",$rootScope.currentUser)}))})},resetUserPassword:function(user){var pwdata={};pwdata.oldpassword=user.oldPassword,pwdata.newpassword=user.newPassword,pwdata.username=user.username;var options={method:"PUT",endpoint:"users/"+pwdata.uuid+"/",body:pwdata};this.client().request(options,function(err){return err?$rootScope.$broadcast("alert","error","Error resetting password"):($rootScope.currentUser.oldPassword="",$rootScope.currentUser.newPassword="",void $rootScope.$broadcast("user-reset-password-success",$rootScop
 e.currentUser))})},getOrgCredentials:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("org-creds-updated",data.credentials)})},regenerateOrgCredentials:function(){var options={method:"POST",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("org-creds-updated",data.credentials))})},getAppCredentials:function(){var options={method:"GET",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error
 ","Error getting credentials"):$rootScope.$broadcast("app-creds-updated",data.credentials)})},regenerateAppCredentials:function(){var options={method:"POST",endpoint:"credentials"};
+this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("app-creds-updated",data.credentials))})},signUpUser:function(orgName,userName,name,email,password){var formData={organization:orgName,username:userName,name:name,email:email,password:password},options={method:"POST",endpoint:"management/organizations",body:formData,mQuery:!0},client=this.client();client.request(options,function(err,data){err?$rootScope.$broadcast("register-error",data):$rootScope.$broadcast("register-success",data)})},resendActivationLink:function(id){var options={method:"GET",endpoint:"management/users/"+id+"/reactivate",mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("resend-activate-error",data):$rootScope.$broadcast("resend-activate-success",data)})},getAppSettings:function(){$root
 Scope.$broadcast("app-settings-received",{})},getActivities:function(){this.client().request({method:"GET",endpoint:"activities",qs:{limit:200}},function(err,data){if(err)return $rootScope.$broadcast("app-activities-error",data);var entities=data.entities;entities.forEach(function(entity){entity.actor.picture?(entity.actor.picture=entity.actor.picture.replace(/^http:\/\/www.gravatar/i,"https://secure.gravatar"),entity.actor.picture=~entity.actor.picture.indexOf("http")?entity.actor.picture:"https://apigee.com/usergrid/img/user_profile.png"):entity.actor.picture=window.location.protocol+"//"+window.location.host+window.location.pathname+"img/user_profile.png"}),$rootScope.$broadcast("app-activities-received",data.entities)})},getEntityActivities:function(entity,isFeed){var route=isFeed?"feed":"activities",endpoint=entity.get("type")+"/"+entity.get("uuid")+"/"+route,options={method:"GET",endpoint:endpoint,qs:{limit:200}};this.client().request(options,function(err,data){err&&$rootScope
 .$broadcast(entity.get("type")+"-"+route+"-error",data),data.entities.forEach(function(entityInstance){entityInstance.createdDate=new Date(entityInstance.created).toUTCString()}),$rootScope.$broadcast(entity.get("type")+"-"+route+"-received",data.entities)})},addUserActivity:function(user,content){var options={actor:{displayName:user.get("username"),uuid:user.get("uuid"),username:user.get("username")},verb:"post",content:content};this.client().createUserActivity(user.get("username"),options,function(err,activity){err?$rootScope.$broadcast("user-activity-add-error",err):$rootScope.$broadcast("user-activity-add-success",activity)})},runShellQuery:function(method,path,payload){var path=path.replace(/^\//,""),options={method:method,endpoint:path};payload&&(options.body=payload),this.client().request(options,function(err,data){err?$rootScope.$broadcast("shell-error",data):$rootScope.$broadcast("shell-success",data)})},addOrganization:function(user,orgName){var options={method:"POST",endp
 oint:"management/users/"+user.uuid+"/organizations",body:{organization:orgName},mQuery:!0},client=this.client();client.request(options,function(err,data){err?$rootScope.$broadcast("user-add-org-error",data):$rootScope.$broadcast("user-add-org-success",$rootScope.organizations)})},leaveOrganization:function(user,org){var options={method:"DELETE",endpoint:"management/users/"+user.uuid+"/organizations/"+org.uuid,mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("user-leave-org-error",data):(delete $rootScope.organizations[org.name],$rootScope.$broadcast("user-leave-org-success",$rootScope.organizations))})},httpGet:function(id,url){var deferred;return deferred=$q.defer(),$http.get(url||configuration.ITEMS_URL).success(function(data){var result;id?angular.forEach(data,function(obj){obj.id===id&&(result=obj)}):result=data,deferred.resolve(result)}).error(function(data,status,headers,config){$log.error(data,status,headers,config),reportError(data,config
 ),deferred.reject(data)}),deferred.promise},jsonp:function(objectType,criteriaId,params,successCallback){params||(params={}),params.demoApp=$rootScope.demoData,params.access_token=getAccessToken(),params.callback="JSON_CALLBACK";var uri=$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/apm/"+objectType+"/"+criteriaId;return this.jsonpRaw(objectType,criteriaId,params,uri,successCallback)},jsonpSimple:function(objectType,appId,params){var uri=$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/apm/"+objectType+"/"+appId;return this.jsonpRaw(objectType,appId,params,uri)},calculateAverageRequestTimes:function(){if(!running){var self=this;running=!0,setTimeout(function(){running=!1;var length=requestTimes.length<10?requestTimes.length:10,sum=requestTimes.slice(0,length).reduce(function(a,b){return a+b}),avg=sum/length;self.averageRequestTimes=avg/1e3,self.averageRequestTimes>5&&$rootScope.$broadcast("request-times-slow",self.ave
 rageRequestTimes)},3e3)}},jsonpRaw:function(objectType,appId,params,uri,successCallback){"function"!=typeof successCallback&&(successCallback=null),uri=uri||$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/"+objectType,params||(params={});var start=(new Date).getTime(),self=this;params.access_token=getAccessToken(),params.callback="JSON_CALLBACK";var deferred=$q.defer(),diff=function(){currentRequests[uri]--,requestTimes.splice(0,0,(new Date).getTime()-start),self.calculateAverageRequestTimes()};successCallback&&$rootScope.$broadcast("ajax_loading",objectType);var reqCount=currentRequests[uri]||0;return self.averageRequestTimes>5&&reqCount>1?(setTimeout(function(){deferred.reject(new Error("query in progress"))},50),deferred):(currentRequests[uri]=(currentRequests[uri]||0)+1,$http.jsonp(uri,{params:params}).success(function(data,status,headers,config){diff(),successCallback&&(successCallback(data,status,headers,config),$rootScope.$broadcast("ajax_fini
 shed",objectType)),deferred.resolve(data)}).error(function(data,status,headers,config){diff(),$log.error("ERROR: Could not get jsonp data. "+uri),reportError(data,config),deferred.reject(data)}),deferred.promise)},resource:function(params,isArray){return $resource($rootScope.urls().DATA_URL+"/:orgname/:appname/:username/:endpoint",{},{get:{method:"JSONP",isArray:isArray,params:params},login:{method:"GET",url:$rootScope.urls().DATA_URL+"/management/token",isArray:!1,params:params},save:{url:$rootScope.urls().DATA_URL+"/"+params.orgname+"/"+params.appname,method:"PUT",isArray:!1,params:params}})},httpPost:function(url,callback,payload,headers){var accessToken=getAccessToken();payload?payload.access_token=accessToken:payload={access_token:accessToken},headers||(headers={Bearer:accessToken}),$http({method:"POST",url:url,data:payload,headers:headers}).success(function(data){callback(data)}).error(function(data,status,headers,config){reportError(data,config),callback(data)})}}}),AppServic
 es.Directives.directive("ngFocus",["$parse",function($parse){return function(scope,element,attr){var fn=$parse(attr.ngFocus);element.bind("focus",function(event){scope.$apply(function(){fn(scope,{$event:event})})})}}]),AppServices.Directives.directive("ngBlur",["$parse",function($parse){return function(scope,element,attr){var fn=$parse(attr.ngBlur);element.bind("blur",function(event){scope.$apply(function(){fn(scope,{$event:event})})})}}]),AppServices.Services.factory("utility",function(){return{keys:function(o){var a=[];for(var propertyName in o)a.push(propertyName);return a},get_gravatar:function(email,size){try{var size=size||50;return email.length?"https://secure.gravatar.com/avatar/"+MD5(email)+"?s="+size:"https://apigee.com/usergrid/img/user_profile.png"}catch(e){return"https://apigee.com/usergrid/img/user_profile.png"}},get_qs_params:function(){var queryParams={};if(window.location.search)for(var params=window.location.search.slice(1).split("&"),i=0;i<params.length;i++){var t
 mp=params[i].split("=");queryParams[tmp[0]]=unescape(tmp[1])}return queryParams},safeApply:function(fn){var phase=this.$root.$$phase;"$apply"==phase||"$digest"==phase?fn&&"function"==typeof fn&&fn():this.$apply(fn)}}}),AppServices.Directives.directive("ugValidate",["$rootScope",function(){return{scope:!0,restrict:"A",require:"ng-model",replace:!0,link:function(scope,element,attrs,ctrl){var validate=function(){var id=element.attr("id"),validator=id+"-validator",title=element.attr("title");if(title=title&&title.length?title:"Please enter data",$("#"+validator).remove(),ctrl.$valid)element.removeClass("has-error"),$("#"+validator).remove();else{var validatorElem='<div id="'+validator+'"><span  class="validator-error-message">'+title+"</span></div>";$("#"+id).after(validatorElem),element.addClass("has-error")}},firing=!1;element.bind("blur",function(){validate(scope,element,attrs,ctrl)}).bind("input",function(){firing||(firing=!0,setTimeout(function(){validate(scope,element,attrs,ctrl),
 firing=!1},500))})}}}]),AppServices.Controllers.controller("GroupsActivitiesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.activitiesSelected="active",$rootScope.selectedGroup?($rootScope.selectedGroup.activities=[],void $rootScope.selectedGroup.getActivities(function(err){err||$rootScope.$$phase||$rootScope.$apply()})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope,$location,$route){$scope.groupsCollection={},$rootScope.selectedGroup={},$scope.previous_display="none",$scope.next_display="none",$scope.hasGroups=!1,$scope.newGroup={path:"",title:""},ug.getGroups(),$scope.currentGroupsPage={},$scope.selectGroupPage=function(route){$scope.currentGroupsPage.template=$route.routes[route].templateUrl,$scope.currentGroupsPage.route=route},$scope.newGroupDialog=function(modalId){$scope.newGroup.path&&$scope.newGroup.title?(ug
 .createGroup($scope.removeFirstSlash($scope.newGroup.path),$scope.newGroup.title),$scope.hideModal(modalId),$scope.newGroup={path:"",title:""}):$rootScope.$broadcast("alert","error","Missing required information.")},$scope.deleteGroupsDialog=function(modalId){$scope.deleteEntities($scope.groupsCollection,"group-deleted","error deleting group"),$scope.hideModal(modalId),$scope.newGroup={path:"",title:""}},$scope.$on("group-deleted",function(){$rootScope.$broadcast("alert","success","Group deleted successfully.")}),$scope.$on("group-deleted-error",function(){ug.getGroups()}),$scope.$on("groups-create-success",function(){$rootScope.$broadcast("alert","success","Group created successfully.")}),$scope.$on("groups-create-error",function(){$rootScope.$broadcast("alert","error","Error creating group. Make sure you don't have spaces in the path.")}),$scope.$on("groups-received",function(event,groups){$scope.groupBoxesSelected=!1,$scope.groupsCollection=groups,$scope.newGroup.path="",$scope.n
 ewGroup.title="",!(groups._list.length>0)||$rootScope.selectedGroup._data&&groups._list.some(function(group){return $rootScope.selectedGroup._data.uuid===group._data.uuid})||$scope.selectGroup(groups._list[0]._data.uuid),$scope.hasGroups=groups._list.length>0,$scope.received=!0,$scope.checkNextPrev(),$scope.applyScope()}),$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.groupsCollection.hasPreviousPage()&&($scope.previous_display="block"),$scope.groupsCollection.hasNextPage()&&($scope.next_display="block")},$scope.selectGroup=function(uuid){$rootScope.selectedGroup=$scope.groupsCollection.getEntityByUUID(uuid),$scope.currentGroupsPage.template="groups/groups-details.html",$scope.currentGroupsPage.route="/groups/details",$rootScope.$broadcast("group-selection-changed",$rootScope.selectedGroup)},$scope.getPrevious=function(){$scope.groupsCollection.getPreviousPage(function(err){err&
 &$rootScope.$broadcast("alert","error","error getting previous page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.groupsCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.$on("group-deleted",function(){$route.reload(),$scope.master=""})}]),AppServices.Controllers.controller("GroupsDetailsCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){var selectedGroup=$rootScope.selectedGroup.clone();return $scope.detailsSelected="active",$scope.json=selectedGroup._json||selectedGroup._data.stringifyJSON(),$scope.group=selectedGroup._data,$scope.group.path=0!=$scope.group.path.indexOf("/")?"/"+$scope.group.path:$scope.group.path,$scope.group.title=$scope.group.title,$rootScope.selectedGroup?($scope.$on("group-selection-changed",function(evt,selectedGroup){$scope.group.path=0!=selectedGroup._data.pat
 h.indexOf("/")?"/"+selectedGroup._data.path:selectedGroup._data.path,$scope.group.title=selectedGroup._data.title,$scope.detailsSelected="active",$scope.json=selectedGroup._json||selectedGroup._data.stringifyJSON()}),void($rootScope.saveSelectedGroup=function(){$rootScope.selectedGroup._data.title=$scope.group.title,$rootScope.selectedGroup._data.path=$scope.removeFirstSlash($scope.group.path),$rootScope.selectedGroup.save(function(err){err?$rootScope.$broadcast("alert","error","error saving group"):$rootScope.$broadcast("alert","success","group saved")})})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsMembersCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.membersSelected="active",$scope.previous_display="none",$scope.next_display="none",$scope.user="",$scope.master="",$scope.hasMembers=!1,ug.getUsersTypeAhead(),$scope.usersTypeaheadValues=[],$scope.$on("users-typeahead-received",function(event,users
 ){$scope.usersTypeaheadValues=users,$scope.applyScope()}),$scope.addGroupToUserDialog=function(modalId){if($scope.user){var path=$rootScope.selectedGroup.get("path");ug.addUserToGroup($scope.user.uuid,path),$scope.user="",$scope.hideModal(modalId)}else $rootScope.$broadcast("alert","error","Please select a user.")},$scope.removeUsersFromGroupDialog=function(modalId){$scope.deleteEntities($scope.groupsCollection.users,"group-update-received","Error removing user from group"),$scope.hideModal(modalId)},$scope.get=function(){if($rootScope.selectedGroup.get){var options={type:"groups/"+$rootScope.selectedGroup.get("path")+"/users"};$scope.groupsCollection.addCollection("users",options,function(err){$scope.groupMembersSelected=!1,err?$rootScope.$broadcast("alert","error","error getting users for group"):($scope.hasMembers=$scope.groupsCollection.users._list.length>0,$scope.checkNextPrev(),$scope.applyScope())})}},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_
 display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.groupsCollection.users.hasPreviousPage()&&($scope.previous_display="block"),$scope.groupsCollection.users.hasNextPage()&&($scope.next_display="block")},$rootScope.selectedGroup?($scope.get(),$scope.getPrevious=function(){$scope.groupsCollection.users.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of users"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.getNext=function(){$scope.groupsCollection.users.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of users"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.$on("group-update-received",function(){$scope.get()}),void $scope.$on("user-added-to-group-received",function(){$scope.get()})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsRolesCtrl",["ug","$scope","$rootScope","$location",
 function(ug,$scope,$rootScope,$location){return $scope.rolesSelected="active",$scope.roles_previous_display="none",$scope.roles_next_display="none",$scope.name="",$scope.master="",$scope.hasRoles=!1,$scope.hasPermissions=!1,$scope.permissions={},$scope.addGroupToRoleDialog=function(modalId){if($scope.name){var path=$rootScope.selectedGroup.get("path");ug.addGroupToRole(path,$scope.name),$scope.hideModal(modalId),$scope.name=""}else $rootScope.$broadcast("alert","error","You must specify a role name.")},$scope.leaveRoleDialog=function(modalId){for(var path=$rootScope.selectedGroup.get("path"),roles=$scope.groupsCollection.roles._list,i=0;i<roles.length;i++)roles[i].checked&&ug.removeUserFromGroup(path,roles[i]._data.name);$scope.hideModal(modalId)},$scope.addGroupPermissionDialog=function(modalId){if($scope.permissions.path){var permission=$scope.createPermission(null,null,$scope.removeFirstSlash($scope.permissions.path),$scope.permissions),path=$rootScope.selectedGroup.get("path");u
 g.newGroupPermission(permission,path),$scope.hideModal(modalId),$scope.permissions&&($scope.permissions={})}else $rootScope.$broadcast("alert","error","You must specify a name for the permission.")},$scope.deleteGroupPermissionDialog=function(modalId){for(var path=$rootScope.selectedGroup.get("path"),permissions=$rootScope.selectedGroup.permissions,i=0;i<permissions.length;i++)permissions[i].checked&&ug.deleteGroupPermission(permissions[i].perm,path);$scope.hideModal(modalId)},$scope.resetNextPrev=function(){$scope.roles_previous_display="none",$scope.roles_next_display="none",$scope.permissions_previous_display="none",$scope.permissions_next_display="none"},$scope.resetNextPrev(),$scope.checkNextPrevRoles=function(){$scope.resetNextPrev(),$scope.groupsCollection.roles.hasPreviousPage()&&($scope.roles_previous_display="block"),$scope.groupsCollection.roles.hasNextPage()&&($scope.roles_next_display="block")},$scope.checkNextPrevPermissions=function(){$scope.groupsCollection.permissio
 ns.hasPreviousPage()&&($scope.permissions_previous_display="block"),$scope.groupsCollection.permissions.hasNextPage()&&($scope.permissions_next_display="block")},$scope.getRoles=function(){var path=$rootScope.selectedGroup.get("path"),options={type:"groups/"+path+"/roles"};$scope.groupsCollection.addCollection("roles",options,function(err){$scope.groupRoleSelected=!1,err?$rootScope.$broadcast("alert","error","error getting roles for group"):($scope.hasRoles=$scope.groupsCollection.roles._list.length>0,$scope.checkNextPrevRoles(),$scope.applyScope())})},$scope.getPermissions=function(){$rootScope.selectedGroup.permissions=[],$rootScope.selectedGroup.getPermissions(function(err){$scope.groupPermissionsSelected=!1,$scope.hasPermissions=$scope.selectedGroup.permissions.length,err||$scope.applyScope()})},$scope.getPreviousRoles=function(){$scope.groupsCollection.roles.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of roles"),$scope.c
 heckNextPrevRoles(),$scope.applyScope()})},$scope.getNextRoles=function(){$scope.groupsCollection.roles.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of roles"),$scope.checkNextPrevRoles(),$scope.applyScope()})},$scope.getPreviousPermissions=function(){$scope.groupsCollection.permissions.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of permissions"),$scope.checkNextPrevPermissions(),$scope.applyScope()})},$scope.getNextPermissions=function(){$scope.groupsCollection.permissions.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of permissions"),$scope.checkNextPrevPermissions(),$scope.applyScope()})},$scope.$on("role-update-received",function(){$scope.getRoles()}),$scope.$on("permission-update-received",function(){$scope.getPermissions()}),$scope.$on("groups-received",function(evt,data){$scope.groupsCollection=data,$scope.getRoles(),$scope
 .getPermissions()}),$rootScope.selectedGroup?(ug.getRolesTypeAhead(),void ug.getGroups()):void $location.path("/groups")}]),AppServices.Controllers.controller("ForgotPasswordCtrl",["ug","$scope","$rootScope","$location","$sce","utility",function(ug,$scope,$rootScope,$location,$sce){$rootScope.activeUI&&$location.path("/"),$scope.forgotPWiframeURL=$sce.trustAsResourceUrl($scope.apiUrl+"/management/users/resetpw")}]),AppServices.Controllers.controller("LoginCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){$scope.loading=!1,$scope.login={},$scope.activation={},$scope.requiresDeveloperKey=$scope.options.client.requiresDeveloperKey||!1,!$scope.requiresDeveloperKey&&$scope.options.client.apiKey&&ug.setClientProperty("developerkey",$scope.options.client.apiKey),$rootScope.gotoForgotPasswordPage=function(){$location.path("/forgot-password")},$rootScope.gotoSignUp=function(){$location.path("/register")},$scope.login=
 function(){var username=$scope.login.username,password=$scope.login.password;$scope.loginMessage="",$scope.loading=!0,$scope.requiresDeveloperKey&&ug.setClientProperty("developerkey",$scope.login.developerkey),ug.orgLogin(username,password)},$scope.$on("loginFailed",function(){$scope.loading=!1,ug.setClientProperty("developerkey",null),$scope.loginMessage="Error: the username / password combination was not valid",$scope.applyScope()}),$scope.logout=function(){ug.logout(),ug.setClientProperty("developerkey",null),$scope.use_sso?window.location=$rootScope.urls().LOGOUT_URL+"?redirect=no&callback="+encodeURIComponent($location.absUrl().split("?")[0]):($location.path("/login"),$scope.applyScope())},$rootScope.$on("userNotAuthenticated",function(){"/forgot-password"!==$location.path()&&($location.path("/login"),$scope.logout()),$scope.applyScope()}),$scope.$on("loginSuccesful",function(){$scope.loading=!1,$scope.login={},$location.path("/login"===$rootScope.currentPath||"/login/loading"=
 ==$rootScope.currentPath||"undefined"==typeof $rootScope.currentPath?"/org-overview":$rootScope.currentPath),$scope.applyScope()}),$scope.resendActivationLink=function(modalId){var id=$scope.activation.id;ug.resendActivationLink(id),$scope.activation={},$scope.hideModal(modalId)},$scope.$on("resend-activate-success",function(){$scope.activationId="",$scope.$apply(),$rootScope.$broadcast("alert","success","Activation link sent successfully.")}),$scope.$on("resend-activate-error",function(){$rootScope.$broadcast("alert","error","Activation link failed to send.")})}]),AppServices.Controllers.controller("LogoutCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){ug.logout(),$scope.use_sso?window.location=$rootScope.urls().LOGOUT_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]):($location.path("/login"),$scope.applyScope())}]),AppServices.Controllers.controller("RegisterCtrl",["ug","$scope","$roo
 tScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){$rootScope.activeUI&&$location.path("/");var init=function(){$scope.registeredUser={}};init(),$scope.cancel=function(){$location.path("/")},$scope.register=function(){var user=$scope.registeredUser.clone();user.password===user.confirmPassword?ug.signUpUser(user.orgName,user.userName,user.name,user.email,user.password):$rootScope.$broadcast("alert","error","Passwords do not match."+name)},$scope.$on("register-error",function(event,data){$scope.signUpSuccess=!1,$rootScope.$broadcast("alert","error","Error registering: "+(data&&data.error_description?data.error_description:name))}),$scope.$on("register-success",function(){$scope.registeredUser={},$scope.signUpSuccess=!0,init(),$scope.$apply()})}]),AppServices.Directives.directive("menu",["$location","$rootScope","$log",function($location,$rootScope,$log){return{link:function(scope,lElement,attrs){function setActiveElement(ele,locationPath
 ,$rootScope,isParentClick){ele.removeClass("active");var menuItem,parentMenuItem,newActiveElement=ele.parent().find('a[href*="#!'+locationPath+'"]');if(0===newActiveElement.length)parentMenuItem=ele;else{menuItem=newActiveElement.parent(),menuItem.hasClass("option")?parentMenuItem=menuItem[0]:1===menuItem.size()?(parentMenuItem=newActiveElement.parent().parent().parent(),parentMenuItem.addClass("active")):(parentMenuItem=menuItem[0],menuItem=menuItem[1]);try{var menuItemCompare=parentMenuItem[0]||parentMenuItem;ele[0]!==menuItemCompare&&isParentClick&&ele.find("ul")[0]&&(ele.find("ul")[0].style.height=0);var subMenuSizer=angular.element(parentMenuItem).find(".nav-list")[0];if(subMenuSizer){var heightChecker,clientHeight=subMenuSizer.getAttribute("data-height"),heightCounter=1;clientHeight||heightChecker?(menuItem.addClass("active"),subMenuSizer.style.height=clientHeight+"px"):he

<TRUNCATED>

[06/24] merging upstream

Posted by sn...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0818271c/portal/js/usergrid-dev.min.js
----------------------------------------------------------------------
diff --git a/portal/js/usergrid-dev.min.js b/portal/js/usergrid-dev.min.js
index af849c2..805a4dc 100644
--- a/portal/js/usergrid-dev.min.js
+++ b/portal/js/usergrid-dev.min.js
@@ -1,4 +1,4 @@
-/*! usergrid@2.0.2 2014-03-31 */
+/*! usergrid@2.0.2 2014-04-01 */
 (function(exports, global) {
     global["true"] = exports;
     "use strict";
@@ -1237,7 +1237,7 @@
             introjs_step++;
         };
         var getHelpJson = function(path) {
-            return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
+            return $http.jsonp("https://sdk.apigee.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
         };
         var getHelpStatus = function(helpType) {
             var status;


[20/24] git commit: merging upstream

Posted by sn...@apache.org.
merging upstream


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/9011d58a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/9011d58a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/9011d58a

Branch: refs/pull/96/merge
Commit: 9011d58a8e57098606814a84af2ad1ce4c0dc1ea
Parents: 6710809
Author: amuramoto <am...@apigee.com>
Authored: Wed Apr 2 09:28:33 2014 -0700
Committer: amuramoto <am...@apigee.com>
Committed: Wed Apr 2 09:28:33 2014 -0700

----------------------------------------------------------------------
 .../js/libs/usergrid-libs.min.js.orig           | 26 ++++++++++++++++++++
 .../js/usergrid-coverage.min.js.BACKUP.31213.js |  6 +++++
 .../js/usergrid-coverage.min.js.BASE.31213.js   |  6 +++++
 .../js/usergrid-coverage.min.js.LOCAL.31213.js  |  6 +++++
 .../js/usergrid-coverage.min.js.REMOTE.31213.js |  0
 5 files changed, 44 insertions(+)
----------------------------------------------------------------------