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">📱</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="📱"></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. 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 an Android project, you can integrate the Apigee 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-<version>.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 Eclipse <strong>Package Explorer</strong>, select your application\'s project folder.</li>\n <li>Click the <strong>File > Properties</strong> 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-<version>.jar</code>, then click <strong>Open</strong>.</li>\n <li>Order the <code>apigee-android-<version>.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 <strong>File > Properties</strong> menu.</li>\n <li>In the properties dialog, in the&n
bsp;<strong>Java Build Path</strong> section, click the <strong>Order and Export</strong> tab.</li>\n <li>\n <p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-<version>.jar</code>, then click the <strong>Top</strong> 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-<version>.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 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><sdk_root>/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<uses-permission android:name="android.permission.INTERNET" />\n<uses-permission android:name="android.permission.READ_PHONE_STATE" />\n<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\n<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />\n<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />\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<application>\n android:allowBackup="true"\n android:icon="@drawable/ic_launcher"\n android:label="@string/app_name"\n android:name=".YourApplication"\n …\n</app
lication> \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 & 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 features. You\'ll find the samples in the following location in your SDK download:</p>\n <pre>\napigee-android-sdk-<version>\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 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<sdk_root>/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 <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 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<sdk_root>/new-project-template</pre>\n </li>\n <li>In the project template directory, open the project file: 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 </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 <ApigeeiOSSDK/Apigee.h></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 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-<version>\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> </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 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<script type="text/javascript" src="path/to/js/sdk/apigee.js"></script>\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 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="🚀" 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">📕</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 \n </dt>\n <dd> </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="📾"></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">◀ 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 \n <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ \n <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE \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"> </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"> </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"> #"><img src=x onerror=prompt(1);> </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": "#"><img src=x onerror=prompt(1);>",\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": "#"><img src=x onerror=prompt(1);>"\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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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>
#&quot;&gt;&lt;img src=x onerror=prompt(1);&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> >> </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">⚠</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">👥</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 & 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="👥"></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">⊟</i></a>\n <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">☕</i></button>\n <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram"></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"></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">👥</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"></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">🌎</i>Roles & 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">⚙</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">⊞</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">📁</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="🕪"></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=""></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"></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">👥</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"></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">📱</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="📱"></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. 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 an Android project, you can integrate the Apigee 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-<version>.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 Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+" <li>Click the <strong>File > Properties</strong> 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-<version>.jar</code>, then click <strong>Open</strong>.</li>\n"+" <li>Order the <code>apigee-android-<version>.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 <strong>File > Properties</strong> menu.</li>\n"+" <li>In the properties dialog, in the <strong>Java Build Path</strong> section, click the <strong>Order and Export</strong> tab.</li>\n"+" <li>\n"+" <p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-<version>.jar</code>, then click the <strong>Top</strong> 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-<version>.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 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><sdk_root>/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"+'<uses-permission android:name="android.permission.INTERNET" />\n'+'<uses-permission android:name="android.permission.READ_PHONE_STATE" />\n'+'<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\n'+'<uses-permission andro
id:name="android.permission.ACCESS_FINE_LOCATION" />\n'+'<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />\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"+"<application>\n"+' android:allowBackup="true"\n'+' android:icon="@drawable/ic_launcher"\n'+' android:label="@string/app_name"\n'+' android:name=".YourApplication"\n'+" …\n"+"</application> \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 & 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 features. You'll find the samples in the following location in your SDK download:</p>\n"+" <pre>\n"+"apigee-android-sdk-<version>\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 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"+"<sdk_root>/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 <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 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"+"<sdk_root>/new-project-template</pre>\n"+" </li>\n"+" <li>In the project template directory, open the project file: 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 </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 <ApigeeiOSSDK/Apigee.h></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 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-<version>\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> </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 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"+'<script type="text/javascript" src="path/to/js/sdk/apigee.js"></script>\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 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="🚀" 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">📕</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"+" \n"+" </dt>\n"+" <dd> </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="📾"></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">◀ 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 \n'+' <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ \n'+' <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE \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"> </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"> </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"> #"><img src=x onerror=prompt(1);> </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": "#"><img src=x onerror=prompt(1);>",\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": "#"><img src=x onerror=prompt(1);>"\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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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> >> </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">⚠</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">👥</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 & 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="👥"></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">⊟</i></a>\n'+' <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">☕</i></button>\n'+' <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram"></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"></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">👥</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"></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">🌎</i>Roles & 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">⚙</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">⊞</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
">📁</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="🕪"></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)">×</button> <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i> <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i> <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i> <i ng-if="type === \'success\'" class="pictogram pull-left">👍</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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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)">×</button> <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i> <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i> <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i> <i ng-if="type === \'success\'" class="pictogram pull-left">👍</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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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)">×</button>' + ' <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i>' + ' <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i>' + ' <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i>' + ' <i ng-if="type === \'success\'" class="pictogram pull-left">👍</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)">×</button>' + ' <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i>' + ' <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i>' + ' <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i>' + ' <i ng-if="type === \'success\'" class="pictogram pull-left">👍</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">📱</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="📱"></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. 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 an Android project, you can integrate the Apigee 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-<version>.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 Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+" <li>Click the <strong>File > Properties</strong> 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-<version>.jar</code>, then click <strong>Open</strong>.</li>\n"+" <li>Order the <code>apigee-android-<version>.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 <strong>File > Properties</strong> menu.</li>\n"+" <li>In the properties dialog, in the <strong>Java Build Path</strong> section, click the <strong>Order and Export</strong> tab.</li>\n"+" <li>\n"+" <p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-<version>.jar</code>, then click the <strong>Top</strong> 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-<version>.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 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><sdk_root>/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"+'<uses-permission android:name="android.permission.INTERNET" />\n'+'<uses-permission android:name="android.permission.READ_PHONE_STATE" />\n'+'<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\n'+'<uses-permission andro
id:name="android.permission.ACCESS_FINE_LOCATION" />\n'+'<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />\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"+"<application>\n"+' android:allowBackup="true"\n'+' android:icon="@drawable/ic_launcher"\n'+' android:label="@string/app_name"\n'+' android:name=".YourApplication"\n'+" …\n"+"</application> \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 & 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 features. You'll find the samples in the following location in your SDK download:</p>\n"+" <pre>\n"+"apigee-android-sdk-<version>\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 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"+"<sdk_root>/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 <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 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"+"<sdk_root>/new-project-template</pre>\n"+" </li>\n"+" <li>In the project template directory, open the project file: 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 </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 <ApigeeiOSSDK/Apigee.h></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 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-<version>\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> </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 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"+'<script type="text/javascript" src="path/to/js/sdk/apigee.js"></script>\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 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="🚀" 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">📕</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"+" \n"+" </dt>\n"+" <dd> </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="📾"></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">◀ 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 \n'+' <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ \n'+' <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE \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"> </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"> </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"> #"><img src=x onerror=prompt(1);> </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": "#"><img src=x onerror=prompt(1);>",\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": "#"><img src=x onerror=prompt(1);>"\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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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> >> </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">⚠</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">👥</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 & 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="👥"></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">⊟</i></a>\n'+' <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">☕</i></button>\n'+' <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram"></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"></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">👥</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"></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">🌎</i>Roles & 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">⚙</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">⊞</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
">📁</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="🕪"></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&>(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&>(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">📱</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="📱"></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. 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 an Android project, you can integrate the Apigee 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-<version>.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 Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+" <li>Click the <strong>File > Properties</strong> 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-<version>.jar</code>, then click <strong>Open</strong>.</li>\n"+" <li>Order the <code>apigee-android-<version>.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 <strong>File > Properties</strong> menu.</li>\n"+" <li>In the properties dialog, in the <strong>Java Build Path</strong> section, click the <strong>Order and Export</strong> tab.</li>\n"+" <li>\n"+" <p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-<version>.jar</code>, then click the <strong>Top</strong> 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-<version>.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 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><sdk_root>/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"+'<uses-permission android:name="android.permission.INTERNET" />\n'+'<uses-permission android:name="android.permission.READ_PHONE_STATE" />\n'+'<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\n'+'<uses-permission andro
id:name="android.permission.ACCESS_FINE_LOCATION" />\n'+'<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />\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"+"<application>\n"+' android:allowBackup="true"\n'+' android:icon="@drawable/ic_launcher"\n'+' android:label="@string/app_name"\n'+' android:name=".YourApplication"\n'+" …\n"+"</application> \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 & 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 features. You'll find the samples in the following location in your SDK download:</p>\n"+" <pre>\n"+"apigee-android-sdk-<version>\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 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"+"<sdk_root>/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 <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 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"+"<sdk_root>/new-project-template</pre>\n"+" </li>\n"+" <li>In the project template directory, open the project file: 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 </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 <ApigeeiOSSDK/Apigee.h></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 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-<version>\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> </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 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"+'<script type="text/javascript" src="path/to/js/sdk/apigee.js"></script>\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 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="🚀" 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">📕</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"+" \n"+" </dt>\n"+" <dd> </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="📾"></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">◀ 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 \n'+' <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ \n'+' <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE \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"> </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"> </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"> #"><img src=x onerror=prompt(1);> </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": "#"><img src=x onerror=prompt(1);>",\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": "#"><img src=x onerror=prompt(1);>"\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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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> >> </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">⚠</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">👥</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 & 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="👥"></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">⊟</i></a>\n'+' <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">☕</i></button>\n'+' <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram"></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"></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">👥</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"></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">🌎</i>Roles & 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">⚙</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">⊞</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
">📁</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="🕪"></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">📱</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="📱"></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. 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 an Android project, you can integrate the Apigee 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-<version>.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 Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n"+" <li>Click the <strong>File > Properties</strong> 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-<version>.jar</code>, then click <strong>Open</strong>.</li>\n"+" <li>Order the <code>apigee-android-<version>.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 <strong>File > Properties</strong> menu.</li>\n"+" <li>In the properties dialog, in the <strong>Java Build Path</strong> section, click the <strong>Order and Export</strong> tab.</li>\n"+" <li>\n"+" <p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-<version>.jar</code>, then click the <strong>Top</strong> 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-<version>.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 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><sdk_root>/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"+'<uses-permission android:name="android.permission.INTERNET" />\n'+'<uses-permission android:name="android.permission.READ_PHONE_STATE" />\n'+'<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\n'+'<uses-permission andro
id:name="android.permission.ACCESS_FINE_LOCATION" />\n'+'<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />\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"+"<application>\n"+' android:allowBackup="true"\n'+' android:icon="@drawable/ic_launcher"\n'+' android:label="@string/app_name"\n'+' android:name=".YourApplication"\n'+" …\n"+"</application> \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 & 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 features. You'll find the samples in the following location in your SDK download:</p>\n"+" <pre>\n"+"apigee-android-sdk-<version>\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 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"+"<sdk_root>/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 <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 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"+"<sdk_root>/new-project-template</pre>\n"+" </li>\n"+" <li>In the project template directory, open the project file: 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 </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 <ApigeeiOSSDK/Apigee.h></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 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-<version>\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> </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 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"+'<script type="text/javascript" src="path/to/js/sdk/apigee.js"></script>\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 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="🚀" 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">📕</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"+" \n"+" </dt>\n"+" <dd> </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="📾"></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">◀ 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 \n'+' <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ \n'+' <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE \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"> </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"> </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"> #"><img src=x onerror=prompt(1);> </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": "#"><img src=x onerror=prompt(1);>",\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": "#"><img src=x onerror=prompt(1);>"\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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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>#&quot;&gt;&lt;img src=x onerror=prompt(1);&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> >> </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">⚠</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">👥</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 & 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="👥"></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">⊟</i></a>\n'+' <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">☕</i></button>\n'+' <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram"></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"></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">👥</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"></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">🌎</i>Roles & 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">⚙</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">⊞</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
">📁</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="🕪"></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)">×</button> <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i> <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i> <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i> <i ng-if="type === \'success\'" class="pictogram pull-left">👍</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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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)">×</button> <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i> <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i> <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i> <i ng-if="type === \'success\'" class="pictogram pull-left">👍</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&¬Registration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&¬Registration()){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(+)
----------------------------------------------------------------------