 /**
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information 
  regarding copyright ownership.  The ASF licenses this file 
 to you under the Apache License, Version 2.0 (the 
  "License"); you may not use this file except in compliance 
  with the License.  You may obtain a copy of the License at 
   
  http://www.apache.org/licenses/LICENSE-2.0 
   
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  */

 /*! usergrid@2.0.14  */
(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", "$httpProvider", function($routeProvider, $locationProvider, $sceDelegateProvider, $analyticsProvider, $httpProvider) {
        $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("/organizations", {
            templateUrl: "profile/organizations.html",
            controller: "OrgCtrl"
        }).when("/profile", {
            templateUrl: "profile/profile.html",
            controller: "ProfileCtrl"
        }).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);
        $httpProvider.defaults.useXDomain = true;
    } ]);
    "use strict";
    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("query-error", function(event) {
            $scope.loading = false;
            $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.removeFromPath = function() {
            $scope.data.queryPath = "/" + $rootScope.queryCollection._type;
        };
        $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, addToPath) {
            $rootScope.selectedEntity = $rootScope.queryCollection.getEntityByUUID(uuid);
            if (addToPath) {
                $scope.addToPath(uuid);
            } else {
                $scope.removeFromPath();
            }
        };
        $scope.getJSONView = function(entity) {
            var tempjson = entity.get();
            var queryBody = JSON.stringify(tempjson, null, 2);
            queryBody = JSON.parse(queryBody);
            delete queryBody.metadata;
            delete queryBody.uuid;
            delete queryBody.created;
            delete queryBody.modified;
            delete queryBody.type;
            $scope.queryBody = JSON.stringify(queryBody, null, 2);
        };
        $scope.getPrevious = function() {
            $rootScope.queryCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of data");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $rootScope.queryCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of data");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        init();
        $rootScope.queryCollection = $rootScope.queryCollection || {};
        $rootScope.selectedEntity = {};
        if ($rootScope.queryCollection && $rootScope.queryCollection._type) {
            $scope.loadCollection($rootScope.queryCollection._type);
            $scope.setDisplayType();
        }
        ug.getTopCollections();
        $scope.resetNextPrev();
    } ]);
    "use strict";
    AppServices.Controllers.controller("EntityCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        if (!$rootScope.selectedEntity) {
            $location.path("/data");
            return;
        }
        $scope.entityUUID = $rootScope.selectedEntity.get("uuid");
        $scope.entityType = $rootScope.selectedEntity.get("type");
        var tempjson = $rootScope.selectedEntity.get();
        var queryBody = JSON.stringify(tempjson, null, 2);
        queryBody = JSON.parse(queryBody);
        delete queryBody.metadata;
        delete queryBody.uuid;
        delete queryBody.created;
        delete queryBody.modified;
        delete queryBody.type;
        $scope.queryBody = JSON.stringify(queryBody, null, 2);
        $scope.validateJson = function() {
            var queryBody = $scope.queryBody;
            try {
                queryBody = JSON.parse(queryBody);
            } catch (e) {
                $rootScope.$broadcast("alert", "error", "JSON is not valid");
                return false;
            }
            queryBody = JSON.stringify(queryBody, null, 2);
            $rootScope.$broadcast("alert", "success", "JSON is valid");
            $scope.queryBody = queryBody;
            return true;
        };
        $scope.saveEntity = function() {
            if (!$scope.validateJson()) {
                return false;
            }
            var queryBody = $scope.queryBody;
            queryBody = JSON.parse(queryBody);
            $rootScope.selectedEntity.set();
            $rootScope.selectedEntity.set(queryBody);
            $rootScope.selectedEntity.set("type", $scope.entityType);
            $rootScope.selectedEntity.set("uuid", $scope.entityUUID);
            $rootScope.selectedEntity.save(function(err, data) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
                } else {
                    $rootScope.$broadcast("alert", "success", "entity saved");
                }
            });
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("balloon", [ "$window", "$timeout", function($window, $timeout) {
        return {
            restrict: "ECA",
            scope: "=",
            template: "" + '<div class="baloon {{direction}}" ng-transclude>' + "</div>",
            replace: true,
            transclude: true,
            link: function linkFn(scope, lElement, attrs) {
                scope.direction = attrs.direction;
                var runScroll = true;
                var windowEl = angular.element($window);
                windowEl.on("scroll", function() {
                    if (runScroll) {
                        lElement.addClass("fade-out");
                        $timeout(function() {
                            lElement.addClass("hide");
                        }, 1e3);
                        runScroll = false;
                    }
                });
            }
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("bsmodal", [ "$rootScope", function($rootScope) {
        return {
            restrict: "ECA",
            scope: {
                title: "@title",
                buttonid: "=buttonid",
                footertext: "=footertext",
                closelabel: "=closelabel"
            },
            transclude: true,
            templateUrl: "dialogs/modal.html",
            replace: true,
            link: function linkFn(scope, lElement, attrs, parentCtrl) {
                scope.title = attrs.title;
                scope.footertext = attrs.footertext;
                scope.closelabel = attrs.closelabel;
                scope.close = attrs.close;
                scope.extrabutton = attrs.extrabutton;
                scope.extrabuttonlabel = attrs.extrabuttonlabel;
                scope.buttonId = attrs.buttonid;
                scope.closeDelegate = function(attr) {
                    scope.$parent[attr](attrs.id, scope);
                };
                scope.extraDelegate = function(attr) {
                    if (scope.dialogForm.$valid) {
                        console.log(parentCtrl);
                        scope.$parent[attr](attrs.id);
                    } else {
                        $rootScope.$broadcast("alert", "error", "Please check your form input and resubmit.");
                    }
                };
            }
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("AlertCtrl", [ "$scope", "$rootScope", "$timeout", function($scope, $rootScope, $timeout) {
        $scope.alertDisplay = "none";
        $scope.alerts = [];
        $scope.$on("alert", function(event, type, message, permanent) {
            $scope.addAlert(type, message, permanent);
        });
        $scope.$on("clear-alerts", function(event, message) {
            $scope.alerts = [];
        });
        $scope.addAlert = function(type, message, permanent) {
            $scope.alertDisplay = "block";
            $scope.alerts.push({
                type: type,
                msg: message
            });
            $scope.applyScope();
            if (!permanent) {
                $timeout(function() {
                    $scope.alerts.shift();
                }, 5e3);
            }
        };
        $scope.closeAlert = function(index) {
            $scope.alerts.splice(index, 1);
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("alerti", [ "$rootScope", "$timeout", function($rootScope, $timeout) {
        return {
            restrict: "ECA",
            scope: {
                type: "=type",
                closeable: "@closeable",
                index: "&index"
            },
            template: '<div class="alert" ng-class="type && \'alert-\' + type">' + '    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>' + '    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>' + '    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>' + '    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>' + '    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i>' + "<div ng-transclude></div>" + "</div>",
            replace: true,
            transclude: true,
            link: function linkFn(scope, lElement, attrs) {
                $timeout(function() {
                    lElement.addClass("fade-out");
                }, 4e3);
                lElement.click(function() {
                    if (attrs.index) {
                        scope.$parent.closeAlert(attrs.index);
                    }
                });
                setTimeout(function() {
                    lElement.addClass("alert-animate");
                }, 10);
            }
        };
    } ]);
    "use strict";
    AppServices.Directives.directive("appswitcher", [ "$rootScope", function($rootScope) {
        return {
            restrict: "ECA",
            scope: "=",
            templateUrl: "global/appswitcher-template.html",
            replace: true,
            transclude: true,
            link: function linkFn(scope, lElement, attrs) {
                var classNameOpen = "open";
                $("ul.nav li.dropdownContainingSubmenu").hover(function() {
                    $(this).addClass(classNameOpen);
                }, function() {
                    $(this).removeClass(classNameOpen);
                });
                $("#globalNav > a").mouseover(globalNavDetail);
                $("#globalNavDetail").mouseover(globalNavDetail);
                $("#globalNavSubmenuContainer ul li").mouseover(function() {
                    $("#globalNavDetail > div").removeClass(classNameOpen);
                    $("#" + this.getAttribute("data-globalNavDetail")).addClass(classNameOpen);
                });
                function globalNavDetail() {
                    $("#globalNavDetail > div").removeClass(classNameOpen);
                    $("#globalNavDetailApiPlatform").addClass(classNameOpen);
                }
            }
        };
    } ]);
    "use strict";
    AppServices.Services.factory("help", function($rootScope, $http, $location, $analytics) {
        $rootScope.help = {};
        $rootScope.help.helpButtonStatus = "Enable Help";
        $rootScope.help.helpTooltipsEnabled = false;
        $rootScope.help.clicked = false;
        $rootScope.help.showHelpButtons = false;
        $rootScope.help.introjs_shouldLaunch = false;
        $rootScope.help.showTabsId = "invisible";
        $rootScope.help.showJsonId = "invisible";
        var tooltipStartTime;
        var helpStartTime;
        var introjs_step;
        var getHelpJson = function(path) {
            return $http.get("https://s3.amazonaws.com/sdk.apigee.com/portal_help" + path + "/helpJson.json");
        };
        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;
        };
        $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;
                $rootScope.$broadcast("tooltips-enabled");
                showHelpModal("tooltips");
            } else {
                $rootScope.help.helpButtonStatus = "Enable Help";
                $rootScope.help.helpTooltipsEnabled = false;
                $rootScope.$broadcast("tooltips-disabled");
            }
        };
        $rootScope.$on("users-received", function(event, users) {
            if (users._list.length > 0) {
                $rootScope.help.showTabsId = "intro-information-tabs";
                $rootScope.help.showJsonId = "intro-json-object";
            } else {
                $rootScope.help.showTabsId = "invisible";
                $rootScope.help.showJsonId = "invisible";
            }
        });
        $rootScope.$on("groups-received", function(event, groups) {
            if (groups._list.length > 0) {
                $rootScope.help.showTabsId = "intro-information-tabs";
                $rootScope.help.showJsonId = "intro-json-object";
            } else {
                $rootScope.help.showTabsId = "invisible";
                $rootScope.help.showJsonId = "invisible";
            }
        });
        $rootScope.$on("$routeChangeSuccess", function(event, current) {
            var path = current.$$route ? current.$$route.originalPath : null;
            if (path === "/org-overview" || path && path.indexOf("/performance") >= 0 || path === "/users" || path === "/groups" || path === "/roles" || path === "/data") {
                $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.tooltip = helpJson.tooltip;
            $rootScope.$broadcast("helpJsonLoaded");
        };
        $rootScope.help.IntroOptions = {
            steps: [],
            showStepNumbers: false,
            exitOnOverlayClick: true,
            exitOnEsc: true,
            nextLabel: "Next",
            prevLabel: "Back",
            skipLabel: "Exit",
            doneLabel: "Done"
        };
        $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_CompleteEvent = function() {
            switch ($rootScope.currentPath) {
              case "/performance/app-usage":
                introjs_PageTransitionEvent("/performance/errors-crashes");
                break;

              case "/performance/errors-crashes":
                introjs_PageTransitionEvent("/performance/api-perf");
                break;

              case "/users":
                introjs_PageTransitionEvent("/groups");
                break;

              case "/groups":
                introjs_PageTransitionEvent("/roles");
                break;
            }
        };
        var introjs_PageTransitionEvent = function(url) {
            $location.url(url);
            $rootScope.help.introjs_shouldLaunch = true;
            $rootScope.$apply();
        };
        $rootScope.help.introjs_ChangeEvent = function() {
            introjs_step++;
        };
    });
    "use strict";
    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", "$sce", function(ug, help, utility, $scope, $rootScope, $location, $routeParams, $q, $route, $log, $analytics, $sce) {
        var initScopeVariables = function() {
            var menuItems = Usergrid.options.menuItems;
            for (var i = 0; i < menuItems.length; i++) {
                menuItems[i].pic = $sce.trustAsHtml(menuItems[i].pic);
                if (menuItems[i].items) {
                    for (var j = 0; j < menuItems[i].items.length; j++) {
                        menuItems[i].items[j].pic = $sce.trustAsHtml(menuItems[i].items[j].pic);
                    }
                }
            }
            $scope.menuItems = Usergrid.options.menuItems;
            $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();
        };
        $scope.$on("helpJsonLoaded", function() {
            if ($rootScope.help.introjs_shouldLaunch == true) {
                $rootScope.help.introjs_StartEvent();
                $scope.startHelp();
                $rootScope.help.introjs_shouldLaunch = false;
            }
        });
    } ]);
    "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 = "https://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 = "https://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);
                    }
                });
            },
            createGroup: function(path, title) {
                var options = {
                    path: path,
                    title: title
                };
                var self = this;
                this.groupsCollection.addEntity(options, function(err) {
                    if (err) {
                        $rootScope.$broadcast("groups-create-error", err);
                    } else {
                        $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) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error creating role");
                    } else {
                        $rootScope.$broadcast("roles-received", self.rolesCollection);
                    }
                });
            },
            createUser: function(username, name, email, password) {
                var options = {
                    username: username,
                    name: name,
                    email: email,
                    password: password
                };
                var self = this;
                this.usersCollection.addEntity(options, function(err, data) {
                    if (err) {
                        if (typeof data === "string") {
                            $rootScope.$broadcast("alert", "error", "error: " + data);
                        } else {
                            $rootScope.$broadcast("alert", "error", "error creating user. the email address might already exist.");
                        }
                    } else {
                        $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: {}
                };
                if (query) {
                    options.qs["ql"] = query;
                }
                if (options.qs.ql) {
                    options.qs["ql"] = options.qs.ql + " order by " + (orderBy || "created desc");
                } else {
                    options.qs["ql"] = " order by " + (orderBy || "created desc");
                }
                if (limit) {
                    options.qs["limit"] = limit;
                }
                this.client().createCollection(options, function(err, collection, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting " + collection._type + ": " + data.error_description);
                        $rootScope.$broadcast(type + "-error", collection);
                    } else {
                        $rootScope.$broadcast(type + "-received", collection);
                    }
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                });
            },
            runDataQuery: function(queryPath, searchString, queryLimit) {
                this.getCollection("query", queryPath, null, searchString, queryLimit);
            },
            runDataPOSTQuery: function(queryPath, body) {
                var self = this;
                var 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;
                var options = {
                    method: "PUT",
                    endpoint: queryPath,
                    body: body
                };
                if (searchString) {
                    options.qs["ql"] = searchString;
                }
                if (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;
                var options = {
                    method: "DELETE",
                    endpoint: queryPath
                };
                if (searchString) {
                    options.qs["ql"] = searchString;
                }
                if (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;
                if (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) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "Problem getting indexes: " + data.error);
                    } else {
                        $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) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "Problem creating notification: " + data.error);
                    } else {
                        $rootScope.$broadcast("send-notification-complete");
                    }
                });
            },
            getRolesUsers: function(username) {
                var self = this;
                var options = {
                    type: "roles/users/" + username,
                    qs: {
                        ql: "order by username"
                    }
                };
                this.client().createCollection(options, function(err, users) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting users");
                    } else {
                        $rootScope.$broadcast("users-received", users);
                    }
                });
            },
            getTypeAheadData: function(type, searchString, searchBy, orderBy) {
                var self = this;
                var search = "";
                var qs = {
                    limit: 100
                };
                if (searchString) {
                    search = "select * where " + searchBy + " = '" + searchString + "'";
                }
                if (orderBy) {
                    search = search + " order by " + orderBy;
                }
                if (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 self = this;
                var options = {
                    type: "users/" + user + "/groups"
                };
                this.client().createCollection(options, function(err, groups) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error getting groups");
                    } else {
                        $rootScope.$broadcast("user-groups-received", groups);
                    }
                });
            },
            addUserToGroup: function(user, group) {
                var self = this;
                var options = {
                    type: "users/" + user + "/groups/" + group
                };
                this.client().createEntity(options, function(err, entity) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding user to group");
                    } else {
                        $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, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding user to role");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            addGroupToRole: function(group, role) {
                var options = {
                    method: "POST",
                    endpoint: "roles/" + role + "/groups/" + group
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding group to role");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            followUser: function(user) {
                var self = this;
                var username = $rootScope.selectedUser.get("uuid");
                var options = {
                    method: "POST",
                    endpoint: "users/" + username + "/following/users/" + user
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error following user");
                    } else {
                        $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, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error adding permission");
                    } else {
                        $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, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error deleting permission");
                    } else {
                        $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, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error removing user from role");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            removeUserFromGroup: function(group, role) {
                var options = {
                    method: "DELETE",
                    endpoint: "roles/" + role + "/groups/" + group
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error removing role from the group");
                    } else {
                        $rootScope.$broadcast("role-update-received");
                    }
                });
            },
            createAndroidNotifier: function(name, APIkey) {
                var options = {
                    method: "POST",
                    endpoint: "notifiers",
                    body: {
                        apiKey: APIkey,
                        name: name,
                        provider: "google"
                    }
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        console.error(data);
                        $rootScope.$broadcast("alert", "error", "error creating notifier ");
                    } else {
                        $rootScope.$broadcast("alert", "success", "New notifier created successfully.");
                        $rootScope.$broadcast("notifier-update");
                    }
                });
            },
            createAppleNotifier: function(file, name, environment, certificatePassword) {
                var provider = "apple";
                var 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) {
                    if (err) {
                        console.error(data);
                        $rootScope.$broadcast("alert", "error", data.error_description || "error creating notifier");
                    } else {
                        $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, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "error deleting notifier");
                    } else {
                        $rootScope.$broadcast("notifier-update");
                    }
                });
            },
            initializeCurrentUser: function(callback) {
                callback = callback || function() {};
                if ($rootScope.currentUser && !$rootScope.currentUser.reset) {
                    callback($rootScope.currentUser);
                    return $rootScope.$broadcast("current-user-initialized", "");
                }
                var options = {
                    method: "GET",
                    endpoint: "management/users/" + this.client().get("email"),
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("alert", "error", "Error getting user info");
                    } else {
                        $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 = {};
                body.username = user.username;
                body.name = user.name;
                body.email = user.email;
                var options = {
                    method: "PUT",
                    endpoint: "management/users/" + user.uuid + "/",
                    mQuery: true,
                    body: body
                };
                var self = this;
                this.client().request(options, function(err, data) {
                    self.client().set("email", user.email);
                    self.client().set("username", user.username);
                    if (err) {
                        return $rootScope.$broadcast("user-update-error", data);
                    }
                    $rootScope.currentUser.reset = true;
                    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, data) {
                    if (err) {
                        return $rootScope.$broadcast("alert", "error", "Error resetting password");
                    }
                    $rootScope.currentUser.oldPassword = "";
                    $rootScope.currentUser.newPassword = "";
                    $rootScope.$broadcast("user-reset-password-success", $rootScope.currentUser);
                });
            },
            getOrgCredentials: function() {
                var options = {
                    method: "GET",
                    endpoint: "management/organizations/" + this.client().get("orgName") + "/credentials",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error getting credentials");
                    } else {
                        $rootScope.$broadcast("org-creds-updated", data.credentials);
                    }
                });
            },
            regenerateOrgCredentials: function() {
                var self = this;
                var options = {
                    method: "POST",
                    endpoint: "management/organizations/" + this.client().get("orgName") + "/credentials",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error regenerating credentials");
                    } else {
                        $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) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error getting credentials");
                    } else {
                        $rootScope.$broadcast("app-creds-updated", data.credentials);
                    }
                });
            },
            regenerateAppCredentials: function() {
                var self = this;
                var options = {
                    method: "POST",
                    endpoint: "credentials"
                };
                this.client().request(options, function(err, data) {
                    if (err && data.credentials) {
                        $rootScope.$broadcast("alert", "error", "Error regenerating credentials");
                    } else {
                        $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
                };
                var options = {
                    method: "POST",
                    endpoint: "management/organizations",
                    body: formData,
                    mQuery: true
                };
                var client = this.client();
                client.request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("register-error", data);
                    } else {
                        $rootScope.$broadcast("register-success", data);
                    }
                });
            },
            resendActivationLink: function(id) {
                var options = {
                    method: "GET",
                    endpoint: "management/users/" + id + "/reactivate",
                    mQuery: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("resend-activate-error", data);
                    } else {
                        $rootScope.$broadcast("resend-activate-success", data);
                    }
                });
            },
            getAppSettings: function() {
                $rootScope.$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) {
                        if (!entity.actor.picture) {
                            entity.actor.picture = window.location.protocol + "//" + window.location.host + window.location.pathname + "img/user_profile.png";
                        } else {
                            entity.actor.picture = entity.actor.picture.replace(/^http:\/\/www.gravatar/i, "https://secure.gravatar");
                            if (~entity.actor.picture.indexOf("http")) {
                                entity.actor.picture = entity.actor.picture;
                            } else {
                                entity.actor.picture = "https://apigee.com/usergrid/img/user_profile.png";
                            }
                        }
                    });
                    $rootScope.$broadcast("app-activities-received", data.entities);
                });
            },
            getEntityActivities: function(entity, isFeed) {
                var route = isFeed ? "feed" : "activities";
                var endpoint = entity.get("type") + "/" + entity.get("uuid") + "/" + route;
                var options = {
                    method: "GET",
                    endpoint: endpoint,
                    qs: {
                        limit: 200
                    }
                };
                this.client().request(options, function(err, data) {
                    if (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) {
                    if (err) {
                        $rootScope.$broadcast("user-activity-add-error", err);
                    } else {
                        $rootScope.$broadcast("user-activity-add-success", activity);
                    }
                });
            },
            runShellQuery: function(method, path, payload) {
                var path = path.replace(/^\//, "");
                var options = {
                    method: method,
                    endpoint: path
                };
                if (payload) {
                    options["body"] = payload;
                }
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("shell-error", data);
                    } else {
                        $rootScope.$broadcast("shell-success", data);
                    }
                });
            },
            addOrganization: function(user, orgName) {
                var options = {
                    method: "POST",
                    endpoint: "management/users/" + user.uuid + "/organizations",
                    body: {
                        organization: orgName
                    },
                    mQuery: true
                }, client = this.client(), self = this;
                client.request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("user-add-org-error", data);
                    } else {
                        $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: true
                };
                this.client().request(options, function(err, data) {
                    if (err) {
                        $rootScope.$broadcast("user-leave-org-error", data);
                    } else {
                        delete $rootScope.organizations[org.name];
                        $rootScope.$broadcast("user-leave-org-success", $rootScope.organizations);
                    }
                });
            },
            httpGet: function(id, url) {
                var items, deferred;
                deferred = $q.defer();
                $http.get(url || configuration.ITEMS_URL).success(function(data, status, headers, config) {
                    var result;
                    if (id) {
                        angular.forEach(data, function(obj, index) {
                            if (obj.id === id) {
                                result = obj;
                            }
                        });
                    } else {
                        result = data;
                    }
                    deferred.resolve(result);
                }).error(function(data, status, headers, config) {
                    $log.error(data, status, headers, config);
                    reportError(data, config);
                    deferred.reject(data);
                });
                return deferred.promise;
            },
            jsonp: function(objectType, criteriaId, params, successCallback) {
                if (!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 = true;
                    setTimeout(function() {
                        running = false;
                        var length = requestTimes.length < 10 ? requestTimes.length : 10;
                        var sum = requestTimes.slice(0, length).reduce(function(a, b) {
                            return a + b;
                        });
                        var avg = sum / length;
                        self.averageRequestTimes = avg / 1e3;
                        if (self.averageRequestTimes > 5) {
                            $rootScope.$broadcast("request-times-slow", self.averageRequestTimes);
                        }
                    }, 3e3);
                }
            },
            jsonpRaw: function(objectType, appId, params, uri, successCallback) {
                if (typeof successCallback !== "function") {
                    successCallback = null;
                }
                uri = uri || $rootScope.urls().DATA_URL + "/" + $rootScope.currentOrg + "/" + $rootScope.currentApp + "/" + objectType;
                if (!params) {
                    params = {};
                }
                var start = new Date().getTime(), self = this;
                params.access_token = getAccessToken();
                params.callback = "JSON_CALLBACK";
                var deferred = $q.defer();
                var 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;
                if (self.averageRequestTimes > 5 && reqCount > 1) {
                    setTimeout(function() {
                        deferred.reject(new Error("query in progress"));
                    }, 50);
                    return deferred;
                }
                currentRequests[uri] = (currentRequests[uri] || 0) + 1;
                $http.jsonp(uri, {
                    params: params
                }).success(function(data, status, headers, config) {
                    diff();
                    if (successCallback) {
                        successCallback(data, status, headers, config);
                        $rootScope.$broadcast("ajax_finished", 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);
                });
                return 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: false,
                        params: params
                    },
                    save: {
                        url: $rootScope.urls().DATA_URL + "/" + params.orgname + "/" + params.appname,
                        method: "PUT",
                        isArray: false,
                        params: params
                    }
                });
            },
            httpPost: function(url, callback, payload, headers) {
                var accessToken = getAccessToken();
                if (payload) {
                    payload.access_token = accessToken;
                } else {
                    payload = {
                        access_token: accessToken
                    };
                }
                if (!headers) {
                    headers = {
                        Bearer: accessToken
                    };
                }
                $http({
                    method: "POST",
                    url: url,
                    data: payload,
                    headers: headers
                }).success(function(data, status, headers, config) {
                    callback(data);
                }).error(function(data, status, headers, config) {
                    reportError(data, config);
                    callback(data);
                });
            }
        };
    });
    "use strict";
    AppServices.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
                    });
                });
            });
        };
    } ]);
    "use strict";
    AppServices.Services.factory("utility", function(configuration, $q, $http, $resource) {
        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;
                    if (email.length) {
                        return "https://secure.gravatar.com/avatar/" + MD5(email) + "?s=" + size;
                    } else {
                        return "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) {
                    var params = window.location.search.slice(1).split("&");
                    for (var i = 0; i < params.length; i++) {
                        var tmp = params[i].split("=");
                        queryParams[tmp[0]] = unescape(tmp[1]);
                    }
                }
                return queryParams;
            },
            safeApply: function(fn) {
                var phase = this.$root.$$phase;
                if (phase == "$apply" || phase == "$digest") {
                    if (fn && typeof fn === "function") {
                        fn();
                    }
                } else {
                    this.$apply(fn);
                }
            }
        };
    });
    "use strict";
    AppServices.Directives.directive("ugValidate", [ "$rootScope", function($rootScope) {
        return {
            scope: true,
            restrict: "A",
            require: "ng-model",
            replace: true,
            link: function linkFn(scope, element, attrs, ctrl) {
                var validate = function() {
                    var id = element.attr("id");
                    var validator = id + "-validator";
                    var title = element.attr("title");
                    title = title && title.length ? title : "Please enter data";
                    $("#" + validator).remove();
                    if (!ctrl.$valid) {
                        var validatorElem = '<div id="' + validator + '"><span  class="validator-error-message">' + title + "</span></div>";
                        $("#" + id).after(validatorElem);
                        element.addClass("has-error");
                    } else {
                        element.removeClass("has-error");
                        $("#" + validator).remove();
                    }
                };
                var firing = false;
                element.bind("blur", function(evt) {
                    validate(scope, element, attrs, ctrl);
                }).bind("input", function(evt) {
                    if (firing) {
                        return;
                    }
                    firing = true;
                    setTimeout(function() {
                        validate(scope, element, attrs, ctrl);
                        firing = false;
                    }, 500);
                });
            }
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.activitiesSelected = "active";
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        } else {
            $rootScope.selectedGroup.activities = [];
            $rootScope.selectedGroup.getActivities(function(err, data) {
                if (err) {} else {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                }
            });
        }
    } ]);
    "use strict";
    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 = false;
        $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, form) {
            if ($scope.newGroup.path && $scope.newGroup.title) {
                ug.createGroup($scope.removeFirstSlash($scope.newGroup.path), $scope.newGroup.title);
                $scope.hideModal(modalId);
                $scope.newGroup = {
                    path: "",
                    title: ""
                };
            } else {
                $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 = false;
            $scope.groupsCollection = groups;
            $scope.newGroup.path = "";
            $scope.newGroup.title = "";
            if (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 = true;
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.groupsCollection.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($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) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.groupsCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("group-deleted", function(event) {
            $route.reload();
            $scope.master = "";
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsDetailsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        var selectedGroup = $rootScope.selectedGroup.clone();
        $scope.detailsSelected = "active";
        $scope.json = selectedGroup._json || selectedGroup._data.stringifyJSON();
        $scope.group = selectedGroup._data;
        $scope.group.path = $scope.group.path.indexOf("/") != 0 ? "/" + $scope.group.path : $scope.group.path;
        $scope.group.title = $scope.group.title;
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        }
        $scope.$on("group-selection-changed", function(evt, selectedGroup) {
            $scope.group.path = selectedGroup._data.path.indexOf("/") != 0 ? "/" + selectedGroup._data.path : selectedGroup._data.path;
            $scope.group.title = selectedGroup._data.title;
            $scope.detailsSelected = "active";
            $scope.json = selectedGroup._json || selectedGroup._data.stringifyJSON();
        });
        $rootScope.saveSelectedGroup = function() {
            $rootScope.selectedGroup._data.title = $scope.group.title;
            $rootScope.selectedGroup._data.path = $scope.removeFirstSlash($scope.group.path);
            $rootScope.selectedGroup.save(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error saving group");
                } else {
                    $rootScope.$broadcast("alert", "success", "group saved");
                }
            });
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsMembersCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.membersSelected = "active";
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.user = "";
        $scope.master = "";
        $scope.hasMembers = false;
        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) {
                return;
            }
            var options = {
                type: "groups/" + $rootScope.selectedGroup.get("path") + "/users"
            };
            $scope.groupsCollection.addCollection("users", options, function(err) {
                $scope.groupMembersSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting users for group");
                } else {
                    $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();
            if ($scope.groupsCollection.users.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.groupsCollection.users.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        } else {
            $scope.get();
        }
        $scope.getPrevious = function() {
            $scope.groupsCollection.users.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of users");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $scope.getNext = function() {
            $scope.groupsCollection.users.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of users");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $scope.$on("group-update-received", function(event) {
            $scope.get();
        });
        $scope.$on("user-added-to-group-received", function(event) {
            $scope.get();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("GroupsRolesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.rolesSelected = "active";
        $scope.roles_previous_display = "none";
        $scope.roles_next_display = "none";
        $scope.name = "";
        $scope.master = "";
        $scope.hasRoles = false;
        $scope.hasPermissions = false;
        $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) {
            var path = $rootScope.selectedGroup.get("path");
            var roles = $scope.groupsCollection.roles._list;
            for (var i = 0; i < roles.length; i++) {
                if (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);
                var path = $rootScope.selectedGroup.get("path");
                ug.newGroupPermission(permission, path);
                $scope.hideModal(modalId);
                if ($scope.permissions) {
                    $scope.permissions = {};
                }
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a name for the permission.");
            }
        };
        $scope.deleteGroupPermissionDialog = function(modalId) {
            var path = $rootScope.selectedGroup.get("path");
            var permissions = $rootScope.selectedGroup.permissions;
            for (var i = 0; i < permissions.length; i++) {
                if (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();
            if ($scope.groupsCollection.roles.hasPreviousPage()) {
                $scope.roles_previous_display = "block";
            }
            if ($scope.groupsCollection.roles.hasNextPage()) {
                $scope.roles_next_display = "block";
            }
        };
        $scope.checkNextPrevPermissions = function() {
            if ($scope.groupsCollection.permissions.hasPreviousPage()) {
                $scope.permissions_previous_display = "block";
            }
            if ($scope.groupsCollection.permissions.hasNextPage()) {
                $scope.permissions_next_display = "block";
            }
        };
        $scope.getRoles = function() {
            var path = $rootScope.selectedGroup.get("path");
            var options = {
                type: "groups/" + path + "/roles"
            };
            $scope.groupsCollection.addCollection("roles", options, function(err) {
                $scope.groupRoleSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting roles for group");
                } else {
                    $scope.hasRoles = $scope.groupsCollection.roles._list.length > 0;
                    $scope.checkNextPrevRoles();
                    $scope.applyScope();
                }
            });
        };
        $scope.getPermissions = function() {
            $rootScope.selectedGroup.permissions = [];
            $rootScope.selectedGroup.getPermissions(function(err, data) {
                $scope.groupPermissionsSelected = false;
                $scope.hasPermissions = $scope.selectedGroup.permissions.length;
                if (err) {} else {
                    $scope.applyScope();
                }
            });
        };
        $scope.getPreviousRoles = function() {
            $scope.groupsCollection.roles.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of roles");
                }
                $scope.checkNextPrevRoles();
                $scope.applyScope();
            });
        };
        $scope.getNextRoles = function() {
            $scope.groupsCollection.roles.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of roles");
                }
                $scope.checkNextPrevRoles();
                $scope.applyScope();
            });
        };
        $scope.getPreviousPermissions = function() {
            $scope.groupsCollection.permissions.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of permissions");
                }
                $scope.checkNextPrevPermissions();
                $scope.applyScope();
            });
        };
        $scope.getNextPermissions = function() {
            $scope.groupsCollection.permissions.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of permissions");
                }
                $scope.checkNextPrevPermissions();
                $scope.applyScope();
            });
        };
        $scope.$on("role-update-received", function(event) {
            $scope.getRoles();
        });
        $scope.$on("permission-update-received", function(event) {
            $scope.getPermissions();
        });
        $scope.$on("groups-received", function(evt, data) {
            $scope.groupsCollection = data;
            $scope.getRoles();
            $scope.getPermissions();
        });
        if (!$rootScope.selectedGroup) {
            $location.path("/groups");
            return;
        } else {
            ug.getRolesTypeAhead();
            ug.getGroups();
        }
    } ]);
    "use strict";
    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");
    } ]);
    "use strict";
    AppServices.Controllers.controller("LoginCtrl", [ "ug", "$scope", "$rootScope", "$routeParams", "$location", "utility", function(ug, $scope, $rootScope, $routeParams, $location, utility) {
        $scope.loading = false;
        $scope.login = {};
        $scope.activation = {};
        $scope.requiresDeveloperKey = $scope.options.client.requiresDeveloperKey || false;
        if (!$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;
            var password = $scope.login.password;
            $scope.loginMessage = "";
            $scope.loading = true;
            if ($scope.requiresDeveloperKey) {
                ug.setClientProperty("developerkey", $scope.login.developerkey);
            }
            ug.orgLogin(username, password);
        };
        $scope.$on("loginFailed", function() {
            $scope.loading = false;
            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);
            if ($scope.use_sso) {
                window.location = $rootScope.urls().LOGOUT_URL + "?redirect=no&callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
            } else {
                $location.path("/login");
                $scope.applyScope();
            }
        };
        $rootScope.$on("userNotAuthenticated", function(event) {
            if ("/forgot-password" !== $location.path()) {
                $location.path("/login");
                $scope.logout();
            }
            $scope.applyScope();
        });
        $scope.$on("loginSuccesful", function(event, user, organizations, applications) {
            $scope.loading = false;
            $scope.login = {};
            if ($rootScope.currentPath === "/login" || $rootScope.currentPath === "/login/loading" || typeof $rootScope.currentPath === "undefined") {
                $location.path("/org-overview");
            } else {
                $location.path($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(evt, data) {
            $scope.activationId = "";
            $scope.$apply();
            $rootScope.$broadcast("alert", "success", "Activation link sent successfully.");
        });
        $scope.$on("resend-activate-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "Activation link failed to send.");
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("LogoutCtrl", [ "ug", "$scope", "$rootScope", "$routeParams", "$location", "utility", function(ug, $scope, $rootScope, $routeParams, $location, utility) {
        ug.logout();
        if ($scope.use_sso) {
            window.location = $rootScope.urls().LOGOUT_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
        } else {
            $location.path("/login");
            $scope.applyScope();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("RegisterCtrl", [ "ug", "$scope", "$rootScope", "$routeParams", "$location", "utility", function(ug, $scope, $rootScope, $routeParams, $location, utility) {
        $rootScope.activeUI && $location.path("/");
        var init = function() {
            $scope.registeredUser = {};
        };
        init();
        $scope.cancel = function() {
            $location.path("/");
        };
        $scope.register = function() {
            var user = $scope.registeredUser.clone();
            if (user.password === user.confirmPassword) {
                ug.signUpUser(user.orgName, user.userName, user.name, user.email, user.password);
            } else {
                $rootScope.$broadcast("alert", "error", "Passwords do not match." + name);
            }
        };
        $scope.$on("register-error", function(event, data) {
            $scope.signUpSuccess = false;
            $rootScope.$broadcast("alert", "error", "Error registering: " + (data && data.error_description ? data.error_description : name));
        });
        $scope.$on("register-success", function(event, data) {
            $scope.registeredUser = {};
            $scope.signUpSuccess = true;
            init();
            $scope.$apply();
        });
    } ]);
    "use strict";
    AppServices.Directives.directive("menu", [ "$location", "$rootScope", "$log", function($location, $rootScope, $log) {
        return {
            link: function linkFn(scope, lElement, attrs) {
                var menuContext, parentMenuItems, activeParentElement, menuItems, activeMenuElement, locationPath, subMenuContext;
                function setActiveElement(ele, locationPath, $rootScope, isParentClick) {
                    if (!ele) {
                        return;
                    }
                    ele.removeClass("active");
                    var newActiveElement = ele.parent().find('a[href*="#!' + locationPath + '"]'), menuItem, parentMenuItem;
                    if (newActiveElement.length === 0) {
                        parentMenuItem = ele;
                    } else {
                        menuItem = newActiveElement.parent();
                        if (menuItem.hasClass("option")) {
                            parentMenuItem = menuItem[0];
                        } else {
                            if (menuItem.size() === 1) {
                                parentMenuItem = newActiveElement.parent().parent().parent();
                                parentMenuItem.addClass("active");
                            } else {
                                parentMenuItem = menuItem[0];
                                menuItem = menuItem[1];
                            }
                        }
                        try {
                            var menuItemCompare = parentMenuItem[0] || parentMenuItem;
                            if (ele[0] !== menuItemCompare && isParentClick) {
                                if (ele.find("ul")[0]) {
                                    ele.find("ul")[0].style.height = 0;
                                }
                            }
                            var subMenuSizer = angular.element(parentMenuItem).find(".nav-list")[0];
                            if (subMenuSizer) {
                                var clientHeight = subMenuSizer.getAttribute("data-height"), heightCounter = 1, heightChecker;
                                if (!clientHeight && !heightChecker) {
                                    heightChecker = setInterval(function() {
                                        var tempHeight = subMenuSizer.getAttribute("data-height") || subMenuSizer.clientHeight;
                                        heightCounter = subMenuSizer.clientHeight;
                                        if (heightCounter === 0) {
                                            heightCounter = 1;
                                        }
                                        if (typeof tempHeight === "string") {
                                            tempHeight = parseInt(tempHeight, 10);
                                        }
                                        if (tempHeight > 0 && heightCounter === tempHeight) {
                                            subMenuSizer.setAttribute("data-height", tempHeight);
                                            menuItem.addClass("active");
                                            subMenuSizer.style.height = tempHeight + "px";
                                            clearInterval(heightChecker);
                                        }
                                        heightCounter = tempHeight;
                                    }, 20);
                                } else {
                                    menuItem.addClass("active");
                                    subMenuSizer.style.height = clientHeight + "px";
                                }
                                $rootScope.menuExecute = true;
                            } else {
                                menuItem.addClass("active");
                            }
                        } catch (e) {
                            $log.error("Problem calculating size of menu", e);
                        }
                    }
                    return {
                        menuitem: menuItem,
                        parentMenuItem: parentMenuItem
                    };
                }
                function setupMenuState() {
                    menuContext = attrs.menu;
                    parentMenuItems = lElement.find("li.option");
                    activeParentElement;
                    if (lElement.find("li.option.active").length !== 0) {
                        $rootScope[menuContext + "Parent"] = lElement.find("li.option.active");
                    }
                    activeParentElement = $rootScope[menuContext + "Parent"] || null;
                    if (activeParentElement) {
                        activeParentElement = angular.element(activeParentElement);
                    }
                    menuItems = lElement.find("li.option li");
                    locationPath = $location.path();
                    if (activeParentElement) {
                        activeMenuElement = angular.element(activeParentElement);
                        activeMenuElement = activeMenuElement.find("li.active");
                        activeMenuElement.removeClass("active");
                        if (activeParentElement.find("a")[0]) {
                            subMenuContext = activeParentElement.find("a")[0].href.split("#!")[1];
                            var tempMenuContext = subMenuContext.split("/");
                            subMenuContext = "/" + tempMenuContext[1];
                            if (tempMenuContext.length > 2) {
                                subMenuContext += "/" + tempMenuContext[2];
                            }
                        }
                    }
                    var activeElements;
                    if (locationPath !== "" && locationPath.indexOf(subMenuContext) === -1) {
                        activeElements = setActiveElement(activeParentElement, locationPath, scope);
                        if (activeElements) {
                            $rootScope[menuContext + "Parent"] = activeElements.parentMenuItem;
                            $rootScope[menuContext + "Menu"] = activeElements.menuitem;
                        }
                    } else {
                        setActiveElement(activeParentElement, subMenuContext, scope);
                    }
                }
                var bound = false;
                setTimeout(setupMenuState, 500);
                scope.$on("$routeChangeSuccess", function() {
                    setTimeout(function() {
                        setupMenuState();
                        if (!bound) {
                            bound = true;
                            parentMenuItems.bind("click", function(cevent) {
                                var previousParentSelection = angular.element($rootScope[menuContext + "Parent"]), targetPath = angular.element(cevent.currentTarget).find("> a")[0].href.split("#!")[1];
                                previousParentSelection.find(".nav > li").removeClass("active");
                                var activeElements = setActiveElement(previousParentSelection, targetPath, scope, true);
                                $rootScope[menuContext + "Parent"] = activeElements.parentMenuItem;
                                $rootScope[menuContext + "Menu"] = activeElements.menuitem;
                                scope.$broadcast("menu-selection");
                            });
                            menuItems.bind("click", function(cevent) {
                                var previousMenuSelection = $rootScope[menuContext + "Menu"], targetElement = cevent.currentTarget;
                                if (previousMenuSelection !== targetElement) {
                                    if (previousMenuSelection) {
                                        angular.element(previousMenuSelection).removeClass("active");
                                    } else {
                                        activeMenuElement.removeClass("active");
                                    }
                                    scope.$apply(function() {
                                        angular.element($rootScope[menuContext]).addClass("active");
                                    });
                                    $rootScope[menuContext + "Menu"] = targetElement;
                                    angular.element($rootScope[menuContext + "Parent"]).find("a")[0].setAttribute("href", angular.element(cevent.currentTarget).find("a")[0].href);
                                }
                            });
                        }
                    }, 500);
                });
            }
        };
    } ]);
    AppServices.Directives.directive("timeFilter", [ "$location", "$routeParams", "$rootScope", function($location, $routeParams, $rootScope) {
        return {
            restrict: "A",
            transclude: true,
            template: '<li ng-repeat="time in timeFilters" class="filterItem"><a ng-click="changeTimeFilter(time)">{{time.label}}</a></li>',
            link: function linkFn(scope, lElement, attrs) {
                var menuContext = attrs.filter;
                scope.changeTimeFilter = function(newTime) {
                    $rootScope.selectedtimefilter = newTime;
                    $routeParams.timeFilter = newTime.value;
                };
                lElement.bind("click", function(cevent) {
                    menuBindClick(scope, lElement, cevent, menuContext);
                });
            }
        };
    } ]);
    AppServices.Directives.directive("chartFilter", [ "$location", "$routeParams", "$rootScope", function($location, $routeParams, $rootScope) {
        return {
            restrict: "ACE",
            scope: "=",
            template: '<li ng-repeat="chart in chartCriteriaOptions" class="filterItem"><a ng-click="changeChart(chart)">{{chart.chartName}}</a></li>',
            link: function linkFn(scope, lElement, attrs) {
                var menuContext = attrs.filter;
                scope.changeChart = function(newChart) {
                    $rootScope.selectedChartCriteria = newChart;
                    $routeParams.currentCompare = "NOW";
                    $routeParams[newChart.type + "ChartFilter"] = newChart.chartCriteriaId;
                };
                lElement.bind("click", function(cevent) {
                    menuBindClick(scope, lElement, cevent, menuContext);
                });
            }
        };
    } ]);
    function menuBindClick(scope, lElement, cevent, menuContext) {
        var currentSelection = angular.element(cevent.srcElement).parent();
        var previousSelection = scope[menuContext];
        if (previousSelection !== currentSelection) {
            if (previousSelection) {
                angular.element(previousSelection).removeClass("active");
            }
            scope[menuContext] = currentSelection;
            scope.$apply(function() {
                currentSelection.addClass("active");
            });
        }
    }
    AppServices.Directives.directive("orgMenu", [ "$location", "$routeParams", "$rootScope", "ug", function($location, $routeParams, $rootScope, ug) {
        return {
            restrict: "ACE",
            scope: "=",
            replace: true,
            templateUrl: "menus/orgMenu.html",
            link: function linkFn(scope, lElement, attrs) {
                scope.orgChange = function(orgName) {
                    var oldOrg = ug.get("orgName");
                    ug.set("orgName", orgName);
                    $rootScope.currentOrg = orgName;
                    $location.path("/org-overview");
                    $rootScope.$broadcast("org-changed", oldOrg, orgName);
                };
                scope.$on("change-org", function(args, org) {
                    scope.orgChange(org);
                });
            }
        };
    } ]);
    AppServices.Directives.directive("appMenu", [ "$location", "$routeParams", "$rootScope", "ug", function($location, $routeParams, $rootScope, ug) {
        return {
            restrict: "ACE",
            scope: "=",
            replace: true,
            templateUrl: "menus/appMenu.html",
            link: function linkFn(scope, lElement, attrs) {
                scope.myApp = {};
                var bindApplications = function(applications) {
                    scope.applications = applications;
                    var size = 0, key;
                    for (key in applications) {
                        if (applications.hasOwnProperty(key)) size++;
                    }
                    scope.hasApplications = Object.keys(applications).length > 0;
                    if (!scope.myApp.currentApp) {
                        $rootScope.currentApp = scope.myApp.currentApp = ug.get("appName");
                    }
                    var hasApplications = Object.keys(applications).length > 0;
                    if (!applications[scope.myApp.currentApp]) {
                        if (hasApplications) {
                            $rootScope.currentApp = scope.myApp.currentApp = applications[Object.keys(applications)[0]].name;
                        } else {
                            $rootScope.currentApp = scope.myApp.currentApp = "";
                        }
                    }
                    setTimeout(function() {
                        if (!scope.hasApplications) {
                            scope.showModal("newApplication");
                        } else {
                            scope.hideModal("newApplication");
                        }
                    }, 1e3);
                };
                scope.appChange = function(newApp) {
                    var oldApp = scope.myApp.currentApp;
                    ug.set("appName", newApp);
                    $rootScope.currentApp = scope.myApp.currentApp = newApp;
                    $rootScope.$broadcast("app-changed", oldApp, newApp);
                };
                scope.$on("app-initialized", function() {
                    bindApplications(scope.applications);
                    scope.applyScope();
                });
                scope.$on("applications-received", function(event, applications) {
                    bindApplications(applications);
                    scope.applyScope();
                });
                scope.$on("applications-created", function(evt, applications, name) {
                    $rootScope.$broadcast("alert", "info", 'New application "' + scope.newApp.name + '" created!');
                    scope.appChange(name);
                    $location.path("/getting-started/setup");
                    scope.newApp.name = "";
                });
                scope.newApplicationDialog = function(modalId) {
                    var createNewApp = function() {
                        var found = false;
                        if (scope.applications) {
                            for (var app in scope.applications) {
                                if (app === scope.newApp.name.toLowerCase()) {
                                    found = true;
                                    break;
                                }
                            }
                        }
                        if (scope.newApp.name && !found) {
                            ug.createApplication(scope.newApp.name);
                        } else {
                            $rootScope.$broadcast("alert", "error", !found ? "You must specify a name." : "Application already exists.");
                        }
                        return found;
                    };
                    scope.hasCreateApplicationError = createNewApp();
                    if (!scope.hasCreateApplicationError) {
                        scope.applyScope();
                    }
                    scope.hideModal(modalId);
                };
                if (scope.applications) {
                    bindApplications(scope.applications);
                }
            }
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("OrgOverviewCtrl", [ "ug", "help", "$scope", "$rootScope", "$routeParams", "$location", function(ug, help, $scope, $rootScope, $routeParams, $location) {
        var init = function(oldOrg) {
            var orgName = $scope.currentOrg;
            var orgUUID = "";
            if (orgName && $scope.organizations[orgName]) {
                orgUUID = $scope.organizations[orgName].uuid;
            } else {
                console.error("Your current user is not authenticated for this organization.");
                setTimeout(function() {
                    $rootScope.$broadcast("change-org", oldOrg || $scope.organizations[Object.keys($scope.organizations)[0]].name);
                }, 1e3);
                return;
            }
            $scope.currentOrganization = {
                name: orgName,
                uuid: orgUUID
            };
            $scope.applications = [ {
                name: "...",
                uuid: "..."
            } ];
            $scope.orgAdministrators = [];
            $scope.activities = [];
            $scope.orgAPICredentials = {
                client_id: "...",
                client_secret: "..."
            };
            $scope.admin = {};
            $scope.newApp = {};
            ug.getApplications();
            ug.getOrgCredentials();
            ug.getAdministrators();
            ug.getFeed();
        };
        $scope.$on("org-changed", function(args, oldOrg, newOrg) {
            init(oldOrg);
        });
        $scope.$on("app-initialized", function() {
            init();
        });
        $scope.regenerateCredentialsDialog = function(modalId) {
            $scope.orgAPICredentials = {
                client_id: "regenerating...",
                client_secret: "regenerating..."
            };
            ug.regenerateOrgCredentials();
            $scope.hideModal(modalId);
        };
        $scope.newAdministratorDialog = function(modalId) {
            if ($scope.admin.email) {
                ug.createAdministrator($scope.admin.email);
                $scope.hideModal(modalId);
                $rootScope.$broadcast("alert", "success", "Administrator created successfully.");
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify an email address.");
            }
        };
        $scope.$on("applications-received", function(event, applications) {
            $scope.applications = applications;
            $scope.applyScope();
        });
        $scope.$on("administrators-received", function(event, administrators) {
            $scope.orgAdministrators = administrators;
            $scope.applyScope();
        });
        $scope.$on("org-creds-updated", function(event, credentials) {
            $scope.orgAPICredentials = credentials;
            $scope.applyScope();
        });
        $scope.$on("feed-received", function(event, feed) {
            $scope.activities = feed;
            $scope.applyScope();
        });
        if ($scope.activeUI) {
            init();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("AccountCtrl", [ "$scope", "$rootScope", "ug", "utility", "$route", function($scope, $rootScope, ug, utility, $route) {
        $scope.currentAccountPage = {};
        var route = $scope.use_sso ? "/profile/organizations" : "/profile/profile";
        $scope.currentAccountPage.template = $route.routes[route].templateUrl;
        $scope.currentAccountPage.route = route;
        $scope.applyScope();
        $scope.selectAccountPage = function(route) {
            $scope.currentAccountPage.template = $route.routes[route].templateUrl;
            $scope.currentAccountPage.route = route;
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("OrgCtrl", [ "$scope", "$rootScope", "ug", "utility", function($scope, $rootScope, ug, utility) {
        $scope.org = {};
        $scope.currentOrgPage = {};
        var createOrgsArray = function() {
            var orgs = [];
            for (var org in $scope.organizations) {
                orgs.push($scope.organizations[org]);
            }
            $scope.orgs = orgs;
            $scope.selectOrganization(orgs[0]);
        };
        $scope.selectOrganization = function(org) {
            org.usersArray = [];
            for (var user in org.users) {
                org.usersArray.push(org.users[user]);
            }
            org.applicationsArray = [];
            for (var app in org.applications) {
                org.applicationsArray.push({
                    name: app.replace(org.name + "/", ""),
                    uuid: org.applications[app]
                });
            }
            $scope.selectedOrg = org;
            $scope.applyScope();
            return false;
        };
        $scope.addOrganization = function(modalId) {
            $scope.hideModal(modalId);
            ug.addOrganization($rootScope.currentUser, $scope.org.name);
        };
        $scope.$on("user-add-org-success", function(evt, orgs) {
            $scope.org = {};
            $scope.applyScope();
            ug.reAuthenticate($rootScope.userEmail, "org-reauthenticate");
            $rootScope.$broadcast("alert", "success", "successfully added the new organization.");
        });
        $scope.$on("user-add-org-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "An error occurred attempting to add the organization.");
        });
        $scope.$on("org-reauthenticate-success", function() {
            createOrgsArray();
            $scope.applyScope();
        });
        $scope.doesOrgHaveUsers = function(org) {
            var test = org.usersArray.length > 1;
            return test;
        };
        $scope.leaveOrganization = function(org) {
            ug.leaveOrganization($rootScope.currentUser, org);
        };
        $scope.$on("user-leave-org-success", function(evt, orgs) {
            ug.reAuthenticate($rootScope.userEmail, "org-reauthenticate");
            $rootScope.$broadcast("alert", "success", "User has left the selected organization(s).");
        });
        $scope.$on("user-leave-org-error", function(evt, data) {
            $rootScope.$broadcast("alert", "error", "An error occurred attempting to leave the selected organization(s).");
        });
        createOrgsArray();
    } ]);
    "use strict";
    AppServices.Controllers.controller("ProfileCtrl", [ "$scope", "$rootScope", "ug", "utility", function($scope, $rootScope, ug, utility) {
        $scope.loading = false;
        $scope.saveUserInfo = function() {
            $scope.loading = true;
            ug.updateUser($scope.user);
        };
        $scope.$on("user-update-error", function() {
            $scope.loading = false;
            $rootScope.$broadcast("alert", "error", "Error updating user info");
        });
        $scope.$on("user-update-success", function() {
            $scope.loading = false;
            $rootScope.$broadcast("alert", "success", "Profile information updated successfully!");
            if ($scope.user.oldPassword && $scope.user.newPassword != "undefined") {
                ug.resetUserPassword($scope.user);
            }
        });
        $scope.$on("user-reset-password-success", function() {
            $rootScope.$broadcast("alert", "success", "Password updated successfully!");
            $scope.user = $rootScope.currentUser.clone();
        });
        $scope.$on("app-initialized", function() {
            $scope.user = $rootScope.currentUser.clone();
        });
        if ($rootScope.activeUI) {
            $scope.user = $rootScope.currentUser.clone();
            $scope.applyScope();
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
        $scope.rolesCollection = {};
        $rootScope.selectedRole = {};
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.roles_check_all = "";
        $scope.rolename = "";
        $scope.hasRoles = false;
        $scope.newrole = {};
        $scope.currentRolesPage = {};
        $scope.selectRolePage = function(route) {
            $scope.currentRolesPage.template = $route.routes[route].templateUrl;
            $scope.currentRolesPage.route = route;
        };
        ug.getRoles();
        $scope.newRoleDialog = function(modalId) {
            if ($scope.newRole.name) {
                ug.createRole($scope.newRole.name, $scope.newRole.title);
                $rootScope.$broadcast("alert", "success", "Role created successfully.");
                $scope.hideModal(modalId);
                $scope.newRole = {};
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a role name.");
            }
        };
        $scope.deleteRoleDialog = function(modalId) {
            $scope.deleteEntities($scope.rolesCollection, "role-deleted", "error deleting role");
            $scope.hideModal(modalId);
        };
        $scope.$on("role-deleted", function() {
            $rootScope.$broadcast("alert", "success", "Role deleted successfully.");
            $scope.master = "";
            $scope.newRole = {};
        });
        $scope.$on("role-deleted-error", function() {
            ug.getRoles();
        });
        $scope.$on("roles-received", function(event, roles) {
            $scope.rolesSelected = false;
            $scope.rolesCollection = roles;
            $scope.newRole = {};
            if (roles._list.length > 0) {
                $scope.hasRoles = true;
                $scope.selectRole(roles._list[0]._data.uuid);
            }
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.rolesCollection.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.rolesCollection.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        $scope.selectRole = function(uuid) {
            $rootScope.selectedRole = $scope.rolesCollection.getEntityByUUID(uuid);
            $scope.currentRolesPage.template = "roles/roles-settings.html";
            $scope.currentRolesPage.route = "/roles/settings";
            $rootScope.$broadcast("role-selection-changed", $rootScope.selectedRole);
        };
        $scope.getPrevious = function() {
            $scope.rolesCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of roles");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.rolesCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of roles");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesGroupsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.groupsSelected = "active";
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.path = "";
        $scope.hasGroups = false;
        ug.getGroupsTypeAhead();
        $scope.groupsTypeaheadValues = [];
        $scope.$on("groups-typeahead-received", function(event, groups) {
            $scope.groupsTypeaheadValues = groups;
            $scope.applyScope();
        });
        $scope.addRoleToGroupDialog = function(modalId) {
            if ($scope.path) {
                var name = $rootScope.selectedRole._data.uuid;
                ug.addGroupToRole($scope.path, name);
                $scope.hideModal(modalId);
                $scope.path = "";
                $scope.title = "";
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a group.");
            }
        };
        $scope.setRoleModal = function(group) {
            $scope.path = group.path;
            $scope.title = group.title;
        };
        $scope.removeGroupFromRoleDialog = function(modalId) {
            var roleName = $rootScope.selectedRole._data.uuid;
            var groups = $scope.rolesCollection.groups._list;
            for (var i = 0; i < groups.length; i++) {
                if (groups[i].checked) {
                    ug.removeUserFromGroup(groups[i]._data.path, roleName);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.get = function() {
            var options = {
                type: "roles/" + $rootScope.selectedRole._data.name + "/groups",
                qs: {
                    ql: "order by title"
                }
            };
            $scope.rolesCollection.addCollection("groups", options, function(err) {
                $scope.roleGroupsSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting groups for role");
                } else {
                    $scope.hasGroups = $scope.rolesCollection.groups._list.length;
                    $scope.checkNextPrev();
                    $scope.applyScope();
                }
            });
        };
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.rolesCollection.groups.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.rolesCollection.groups.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        if (!$rootScope.selectedRole) {
            $location.path("/roles");
            return;
        } else {
            $scope.get();
        }
        $scope.getPrevious = function() {
            $scope.rolesCollection.groups.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.rolesCollection.groups.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of groups");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("role-update-received", function(event) {
            $scope.get();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesSettingsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.settingsSelected = "active";
        $scope.hasSettings = false;
        var init = function() {
            if (!$rootScope.selectedRole) {
                $location.path("/roles");
                return;
            } else {
                $scope.permissions = {};
                $scope.permissions.path = "";
                if ($scope.permissions) {
                    $scope.permissions.getPerm = false;
                    $scope.permissions.postPerm = false;
                    $scope.permissions.putPerm = false;
                    $scope.permissions.deletePerm = false;
                }
                $scope.role = $rootScope.selectedRole.clone();
                $scope.getPermissions();
                $scope.applyScope();
            }
        };
        $scope.$on("role-selection-changed", function() {
            init();
        });
        $scope.$on("permission-update-received", function(event) {
            $scope.getPermissions();
        });
        $scope.$on("role-selection-changed", function() {
            $scope.getPermissions();
        });
        $scope.addRolePermissionDialog = function(modalId) {
            if ($scope.permissions.path) {
                var permission = $scope.createPermission(null, null, $scope.permissions.path, $scope.permissions);
                var name = $scope.role._data.name;
                ug.newRolePermission(permission, name);
                $scope.hideModal(modalId);
                init();
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a name for the permission.");
            }
        };
        $scope.deleteRolePermissionDialog = function(modalId) {
            var name = $scope.role._data.name;
            var permissions = $scope.role.permissions;
            for (var i = 0; i < permissions.length; i++) {
                if (permissions[i].checked) {
                    ug.deleteRolePermission(permissions[i].perm, name);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.getPermissions = function() {
            $rootScope.selectedRole.getPermissions(function(err, data) {
                $scope.role.permissions = $rootScope.selectedRole.permissions.clone();
                $scope.permissionsSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting permissions");
                } else {
                    $scope.hasSettings = data.data.length;
                    $scope.applyScope();
                }
            });
        };
        $scope.updateInactivity = function() {
            $rootScope.selectedRole._data.inactivity = $scope.role._data.inactivity;
            $rootScope.selectedRole.save(function(err, data) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error saving inactivity value");
                } else {
                    $rootScope.$broadcast("alert", "success", "inactivity value was updated");
                    init();
                }
            });
        };
        init();
    } ]);
    "use strict";
    AppServices.Controllers.controller("RolesUsersCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.usersSelected = "active";
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.user = {};
        $scope.master = "";
        $scope.hasUsers = false;
        ug.getUsersTypeAhead();
        $scope.usersTypeaheadValues = [];
        $scope.$on("users-typeahead-received", function(event, users) {
            $scope.usersTypeaheadValues = users;
            $scope.applyScope();
        });
        $scope.addRoleToUserDialog = function(modalId) {
            if ($scope.user.uuid) {
                var roleName = $rootScope.selectedRole._data.uuid;
                ug.addUserToRole($scope.user.uuid, roleName);
                $scope.hideModal(modalId);
                $scope.user = null;
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a user.");
            }
        };
        $scope.removeUsersFromGroupDialog = function(modalId) {
            var roleName = $rootScope.selectedRole._data.uuid;
            var users = $scope.rolesCollection.users._list;
            for (var i = 0; i < users.length; i++) {
                if (users[i].checked) {
                    ug.removeUserFromRole(users[i]._data.uuid, roleName);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.get = function() {
            var options = {
                type: "roles/" + $rootScope.selectedRole._data.name + "/users"
            };
            $scope.rolesCollection.addCollection("users", options, function(err) {
                $scope.roleUsersSelected = false;
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting users for role");
                } else {
                    $scope.hasUsers = $scope.rolesCollection.users._list.length;
                    $scope.checkNextPrev();
                    $scope.applyScope();
                }
            });
        };
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.rolesCollection.users.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.rolesCollection.users.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        if (!$rootScope.selectedRole) {
            $location.path("/roles");
            return;
        } else {
            $scope.get();
        }
        $scope.getPrevious = function() {
            $scope.rolesCollection.users.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.rolesCollection.users.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("role-update-received", function(event) {
            $scope.get();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("ShellCtrl", [ "ug", "$scope", "$log", "$sce", function(ug, $scope, $log, $sce) {
        $scope.shell = {
            input: "",
            output: ""
        };
        $scope.submitCommand = function() {
            if (!$scope.shell.input || !$scope.shell.input.length) {
                return;
            }
            handleShellCommand($scope.shell.input);
        };
        var handleShellCommand = function(s) {
            var path = "";
            var params = "";
            var shouldScroll = false;
            var hasMatchLength = function(expression) {
                var res = s.match(expression);
                return res && res.length > 0;
            };
            try {
                switch (true) {
                  case hasMatchLength(/^\s*\//):
                    path = encodePathString(s);
                    printLnToShell(path);
                    ug.runShellQuery("GET", path, null);
                    break;

                  case hasMatchLength(/^\s*get\s*\//i):
                    path = encodePathString(s.substring(4));
                    printLnToShell(path);
                    ug.runShellQuery("GET", path, null);
                    break;

                  case hasMatchLength(/^\s*put\s*\//i):
                    params = encodePathString(s.substring(4), true);
                    printLnToShell(params.path);
                    ug.runShellQuery("PUT", params.path, params.payload);
                    break;

                  case hasMatchLength(/^\s*post\s*\//i):
                    params = encodePathString(s.substring(5), true);
                    printLnToShell(params.path);
                    ug.runShellQuery("POST", params.path, params.payload);
                    break;

                  case hasMatchLength(/^\s*delete\s*\//i):
                    path = encodePathString(s.substring(7));
                    printLnToShell(path);
                    ug.runShellQuery("DELETE", path, null);
                    break;

                  case hasMatchLength(/^\s*clear|cls\s*/i):
                    $scope.shell.output = "";
                    shouldScroll = true;
                    break;

                  case hasMatchLength(/(^\s*help\s*|\?{1,2})/i):
                    shouldScroll = true;
                    printLnToShell("/&lt;path&gt; - API get request");
                    printLnToShell("get /&lt;path&gt; - API get request");
                    printLnToShell("put /&lt;path&gt; {&lt;json&gt;} - API put request");
                    printLnToShell("post /&lt;path&gt; {&lt;json&gt;} - API post request");
                    printLnToShell("delete /&lt;path&gt; - API delete request");
                    printLnToShell("cls, clear - clear the screen");
                    printLnToShell("help - show this help");
                    break;

                  case s === "":
                    shouldScroll = true;
                    printLnToShell("ok");
                    break;

                  default:
                    shouldScroll = true;
                    printLnToShell("<strong>syntax error!</strong>");
                    break;
                }
            } catch (e) {
                $log.error(e);
                printLnToShell("<strong>syntax error!</strong>");
            }
            shouldScroll && scroll();
        };
        var printLnToShell = function(s) {
            if (!s) s = "&nbsp;";
            $scope.shell.outputhidden = s;
            var html = '<div class="shell-output-line"><div class="shell-output-line-content">' + s + "</div></div>";
            html += " ";
            var trustedHtml = $sce.trustAsHtml(html);
            $scope.shell.output += trustedHtml.toString();
        };
        $scope.$on("shell-success", function(evt, data) {
            printLnToShell(JSON.stringify(data, null, "  "));
            scroll();
        });
        $scope.$on("shell-error", function(evt, data) {
            printLnToShell(JSON.stringify(data, null, "  "));
            scroll();
        });
        var scroll = function() {
            $scope.shell.output += "<hr />";
            $scope.applyScope();
            setTimeout(function() {
                var myshell = $("#shell-output");
                myshell.animate({
                    scrollTop: myshell[0].scrollHeight
                }, 800);
            }, 200);
        };
        function encodePathString(path, returnParams) {
            var i = 0;
            var segments = new Array();
            var payload = null;
            while (i < path.length) {
                var c = path.charAt(i);
                if (c == "{") {
                    var bracket_start = i;
                    i++;
                    var bracket_count = 1;
                    while (i < path.length && bracket_count > 0) {
                        c = path.charAt(i);
                        if (c == "{") {
                            bracket_count++;
                        } else if (c == "}") {
                            bracket_count--;
                        }
                        i++;
                    }
                    if (i > bracket_start) {
                        var segment = path.substring(bracket_start, i);
                        segments.push(JSON.parse(segment));
                    }
                    continue;
                } else if (c == "/") {
                    i++;
                    var segment_start = i;
                    while (i < path.length) {
                        c = path.charAt(i);
                        if (c == " " || c == "/" || c == "{") {
                            break;
                        }
                        i++;
                    }
                    if (i > segment_start) {
                        var segment = path.substring(segment_start, i);
                        segments.push(segment);
                    }
                    continue;
                } else if (c == " ") {
                    i++;
                    var payload_start = i;
                    while (i < path.length) {
                        c = path.charAt(i);
                        i++;
                    }
                    if (i > payload_start) {
                        var json = path.substring(payload_start, i).trim();
                        payload = JSON.parse(json);
                    }
                    break;
                }
                i++;
            }
            var newPath = "";
            for (i = 0; i < segments.length; i++) {
                var segment = segments[i];
                if (typeof segment === "string") {
                    newPath += "/" + segment;
                } else {
                    if (i == segments.length - 1) {
                        if (returnParams) {
                            return {
                                path: newPath,
                                params: segment,
                                payload: payload
                            };
                        }
                        newPath += "?";
                    } else {
                        newPath += ";";
                    }
                    newPath += encodeParams(segment);
                }
            }
            if (returnParams) {
                return {
                    path: newPath,
                    params: null,
                    payload: payload
                };
            }
            return newPath;
        }
        function encodeParams(params) {
            var tail = [];
            if (params instanceof Array) {
                for (i in params) {
                    var item = params[i];
                    if (item instanceof Array && item.length > 1) {
                        tail.push(item[0] + "=" + encodeURIComponent(item[1]));
                    }
                }
            } else {
                for (var key in params) {
                    if (params.hasOwnProperty(key)) {
                        var value = params[key];
                        if (value instanceof Array) {
                            for (i in value) {
                                var item = value[i];
                                tail.push(key + "=" + encodeURIComponent(item));
                            }
                        } else {
                            tail.push(key + "=" + encodeURIComponent(value));
                        }
                    }
                }
            }
            return tail.join("&");
        }
    } ]);
    angular.module("appservices").run([ "$templateCache", function($templateCache) {
        "use strict";
        $templateCache.put("activities/activities.html", '<section class="row-fluid">\n' + '  <div class="span12">\n' + '    <div class="page-filters">\n' + '      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n' + "    </div>\n" + "  </div>\n" + "\n" + "</section>\n" + '<section class="row-fluid">\n' + '  <div class="span12 tab-content">\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Date</td>\n" + "        <td></td>\n" + "        <td>User</td>\n" + "        <td>Content</td>\n" + "        <td>Verb</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="activity in activities">\n' + "        <td>{{formatDate(activity.created)}}</td>\n" + '        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n' + "        </td>\n" + "        <td>{{activity.actor.displayName}}</td>\n" + "        <td>{{activity.content}}</td>\n" + "        <td>{{activity.verb}}</td>\n" + "        <td>{{activity.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + "</section>");
        $templateCache.put("app-overview/app-overview.html", '<div class="app-overview-content" >\n' + '  <section class="row-fluid">\n' + "\n" + '      <page-title title=" Summary" icon="&#128241;"></page-title>\n' + '  <section class="row-fluid">\n' + '      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n' + "  </section>\n" + '  <section class="row-fluid">\n' + "\n" + '    <div class="span6">\n' + '      <chart id="appOverview"\n' + '             chartdata="appOverview.chart"\n' + '             type="column"></chart>\n' + "    </div>\n" + "\n" + '    <div class="span6">\n' + '      <table class="table table-striped">\n' + '        <tr class="table-header">\n' + "          <td>Path</td>\n" + "          <td>Title</td>\n" + "        </tr>\n" + '        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n' + "          <td>{{v.title}}</td>\n" + "          <td>{{v.count}}</td>\n" + "        </tr>\n" + "      </table>\n" + "    </div>\n" + "\n" + "  </section>\n" + "</div>");
        $templateCache.put("app-overview/doc-includes/android.html", "<h2>1. Integrate the SDK into your project</h2>\n" + "<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n" + "\n" + '<ul class="nav nav-tabs" id="myTab">\n' + '	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n' + '	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n' + "</ul>\n" + "\n" + '<div class="tab-content">\n' + '	<div class="tab-pane active" id="existing_project">\n' + '		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n' + "		<p>If you've already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n" + '		<div id="collapse">\n' + '			<a href="#jar_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n' + "		</div>\n" + '		<div id="jar_collapse" class="collapse">\n' + "			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n" + "	\n" + "			<h3>Android 4.0 (or later) projects</h3>\n" + "			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n" + "			\n" + "			<h3>Android 3.0 (or earlier) projects</h3>\n" + "			<ol>\n" + "				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n" + "				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n" + "				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n" + "				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n" + "				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the top of the class path:\n" + "					<ol>\n" + "						<li>In the Eclipse <strong>Package Explorer</strong>, select your application's project folder.</li>\n" + "						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n" + "						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n" + "						<li>\n" + "							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n" + "						</li>\n" + "					</ol>\n" + "				</li>\n" + "			</ol>\n" + '			<div class="warning">\n' + "				<h3>Applications using Ant</h3>\n" + "				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n" + "			</div>\n" + "		</div>\n" + "	</div>\n" + '	<div class="tab-pane" id="new_project">\n' + '		<a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n' + "		<p>If you don't have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n" + "		<ul>\n" + "			<li>Locate the project template in the expanded SDK. It should be at the following location:\n" + "				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n" + "			</li>\n" + "		</ul>\n" + "	</div>\n" + "</div>\n" + "<h2>2. Update permissions in AndroidManifest.xml</h2>\n" + "<p>Add the following Internet permissions to your application's <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n" + "<pre>\n" + '&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n' + '&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n' + '&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n' + '&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n' + '&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n' + "</pre>\n" + "<h2>3. Initialize the SDK</h2>\n" + "<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the 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 setApigeeClient(ApigeeClient apigeeClient)\n" + "        {\n" + "                this.apigeeClient = apigeeClient;\n" + "        }\n" + "}			\n" + "		</pre>\n" + "	</li>\n" + "	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n" + "		<pre>\n" + "&lt;application&gt;\n" + '    android:allowBackup="true"\n' + '    android:icon="@drawable/ic_launcher"\n' + '    android:label="@string/app_name"\n' + '    android:name=".YourApplication"\n' + "	…\n" + "&lt;/application&gt;			\n" + "		</pre>\n" + "	</li>\n" + "	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n" + "		<pre>\n" + "import com.apigee.sdk.ApigeeClient;\n" + "\n" + "@Override\n" + "protected void onCreate(Bundle savedInstanceState) {\n" + "    super.onCreate(savedInstanceState);		\n" + "	\n" + '	String ORGNAME = "{{currentOrg}}";\n' + '	String APPNAME = "{{currentApp}}";\n' + "	\n" + "	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseContext());\n" + "\n" + "	// hold onto the ApigeeClient instance in our application object.\n" + "	YourApplication 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 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 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, including those for push notifications, data store, and geolocation.</p>\n" + "			</li>\n" + "			<li>\n" + "				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n" + "				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n" + "			</li>\n" + "		</ul>\n" + "	</li>	\n" + "	<li>	\n" + "		<h3><strong>Add App Services features to your app</strong></h3>\n" + "		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n" + "		<ul>\n" + '			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n' + '			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n' + "				<ul>\n" + '					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n' + '					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n' + '					<li><strong><a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n' + "				</ul>		\n" + "			</li>\n" + '			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n' + "		</ul>\n" + "	</li>\n" + "	<li>	\n" + "		<h3><strong>Check out the sample apps</strong></h3>\n" + "		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You'll find the samples in the following location in your SDK download:</p>\n" + "		<pre>\n" + "apigee-android-sdk-&lt;version&gt;\n" + "	...\n" + "	/samples\n" + "		</pre>\n" + '		<div id="collapse">\n' + '			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n' + "		</div>\n" + '		<div id="samples_collapse" class="collapse">\n' + "			<p>The samples include the following:</p>\n" + '			<table class="table">\n' + "				<thead>\n" + "					<tr>\n" + '						<th scope="col">Sample</th>\n' + '						<th scope="col">Description</th>\n' + "					</tr>\n" + "				</thead>\n" + "				<tbody>\n" + "					<tr>\n" + "						<td>books</td>\n" + "						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>messagee</td>\n" + "						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>push</td>\n" + "						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n" + "					</tr>\n" + "				</tbody>\n" + "			</table>\n" + "		</div>\n" + "	</li>\n" + "</ul>\n");
        $templateCache.put("app-overview/doc-includes/ios.html", "<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n" + '<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n' + '<ul class="nav nav-tabs" id="myTab">\n' + '	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n' + '	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n' + "</ul>\n" + '<div class="tab-content">\n' + '	<div class="tab-pane active" id="existing_project">\n' + "		<p>If you've already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n" + '		<div id="collapse"><a class="btn" data-toggle="collapse" href="#framework_collapse">Details</a></div>\n' + '		<div class="collapse" id="framework_collapse">\n' + "			<ol>\n" + "				<li>\n" + "					<p>Locate the SDK framework file so you can add it to your project. For example, you'll find the file at the following path:</p>\n" + "					<pre>\n" + "&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n" + "				</li>\n" + "				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n" + "				<li>Link the Apigee iOS SDK into your project.\n" + "					<ul>\n" + "						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n" + "					</ul>\n" + "					<p>OR</p>\n" + "					<ol>\n" + "						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n" + "						<li>Navigate to the directory that contains ApigeeiOSSDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n" + "					</ol>\n" + "				</li>\n" + "			</ol>\n" + "		</div>\n" + "	</div>\n" + '	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n' + "		<p>If you're starting with a clean slate (you don't have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n" + "		<ol>\n" + "			<li>\n" + "				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n" + "				<pre>\n" + "&lt;sdk_root&gt;/new-project-template</pre>\n" + "			</li>\n" + "			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n" + "			<li>Get acquainted with the template by looking at its readme file.</li>\n" + "		</ol>\n" + "	</div>\n" + "</div>\n" + "<h2>2. Add required iOS frameworks</h2>\n" + "<p>Ensure that the following iOS frameworks are part of your project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n" + "<ul>\n" + "	<li>QuartzCore.framework</li>\n" + "	<li>CoreLocation.framework</li>\n" + "	<li>CoreTelephony.framework&nbsp;</li>\n" + "	<li>Security.framework</li>\n" + "	<li>SystemConfiguration.framework</li>\n" + "	<li>UIKit.framework</li>\n" + "</ul>\n" + "<h2>3. Update 'Other Linker Flags'</h2>\n" + "<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n" + "<pre>\n" + "-ObjC -all_load</pre>\n" + "<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n" + "<h2>4. Initialize the SDK</h2>\n" + '<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Getting Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n' + "<ol>\n" + "	<li>Import the SDK\n" + "		<p>Add the following to your source code to import the SDK:</p>\n" + "		<pre>\n" + "#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n" + "	</li>\n" + "	<li>\n" + "		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n" + "		<pre>\n" + "@property (strong, nonatomic) ApigeeClient *apigeeClient; \n" + "@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n" + "@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n" + "		</pre>\n" + "	</li>\n" + "	<li>\n" + "		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n" + "		<pre>\n" + "//Replace 'AppDelegate' with the name of your app delegate class to instantiate it\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 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>\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 illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n' + "		<p>You'll find the samples in the following location in your SDK download:</p>\n" + "		<pre>\n" + "apigee-ios-sdk-&lt;version&gt;\n" + "    ...\n" + "    /samples\n" + "		</pre>\n" + '		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n' + '		<div class="collapse" id="samples_collapse">\n' + "			<p>The samples include the following:</p>\n" + '			<table class="table">\n' + "				<thead>\n" + "					<tr>\n" + '						<th scope="col">Sample</th>\n' + '						<th scope="col">Description</th>\n' + "					</tr>\n" + "				</thead>\n" + "				<tbody>\n" + "					<tr>\n" + "						<td>books</td>\n" + "						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>messagee</td>\n" + "						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>push</td>\n" + "						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n" + "					</tr>\n" + "				</tbody>\n" + "			</table>\n" + "		</div>\n" + "		<p>&nbsp;</p>\n" + "	</li>\n" + "</ul>\n");
        $templateCache.put("app-overview/doc-includes/javascript.html", "<h2>1. Import the SDK into your HTML</h2>\n" + "<p>To enable support for Apigee-related functions in your HTML, you'll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n" + "<pre>\n" + '&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n' + "</pre>\n" + "<h2>2. Instantiate Apigee.Client</h2>\n" + "<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n" + "<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n" + "<pre>\n" + "//Apigee account credentials, available in the App Services admin portal \n" + "var client_creds = {\n" + "        orgName:'{{currentOrg}}',\n" + "        appName:'{{currentApp}}'\n" + "    }\n" + "\n" + "//Initializes the SDK. Also instantiates Apigee.MonitoringClient\n" + "var dataClient = new Apigee.Client(client_creds);  \n" + "</pre>\n" + "\n" + "<h2>3. Verify SDK installation</h2>\n" + "\n" + "<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n" + "\n" + "<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>'Monitoring' > 'App Usage'</strong> in the <a href=\"https://www.apigee.com/usergrid\">App Services admin portal</a> to verify that data is being sent.</p>\n" + '<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n' + '<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n' + "\n" + "<h2>Installation complete! Try these next steps</h2>\n" + "<ul>\n" + "	<li>	\n" + "		<h3><strong>Call additional SDK methods in your code</strong></h3>\n" + "		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n" + '		<div id="collapse">\n' + '			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n' + "		</div>\n" + '		<div id="client_collapse" class="collapse">\n' + "			<ul>\n" + "				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n" + "				<li><code>dataClient.monitor</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n" + "			</ul>\n" + "		</div>\n" + "	</li>	\n" + "	<li>\n" + "		<h3><strong>Add App Services features to your app</strong></h3>\n" + "		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n" + "		<ul>\n" + '			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n' + '			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n' + "		</ul>\n" + "	</li>\n" + "	<li>\n" + "		<h3><strong>Check out the sample apps</strong></h3>\n" + "		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You'll find the samples in the following location in your SDK download:</p>\n" + "		<pre>\n" + "apigee-javascript-sdk-master\n" + "    ...\n" + "    /samples		\n" + "		</pre>\n" + '		<div id="collapse">\n' + '			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n' + "		</div>\n" + '		<div id="samples_collapse" class="collapse">\n' + "			<p>The samples include the following:</p>\n" + '			<table class="table">\n' + "				<thead>\n" + "					<tr>\n" + '						<th scope="col">Sample</th>\n' + '						<th scope="col">Description</th>\n' + "					</tr>\n" + "				</thead>\n" + "				<tbody>\n" + "					<tr>\n" + "						<td>booksSample.html</td>\n" + "						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>messagee</td>\n" + "						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>monitoringSample.html</td>\n" + "						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n" + "					</tr>\n" + "					<tr>\n" + "						<td>readmeSample.html</td>\n" + "						<td>A simple app for reading data from an Apigee database.</td>\n" + "					</tr>\n" + "				</tbody>\n" + "			</table>\n" + "		</div>	\n" + "	</li>				\n" + "</ul>\n");
        $templateCache.put("app-overview/doc-includes/net.html", "");
        $templateCache.put("app-overview/doc-includes/node.html", "");
        $templateCache.put("app-overview/doc-includes/ruby.html", "");
        $templateCache.put("app-overview/getting-started.html", '<div class="setup-sdk-content" >\n' + "\n" + '  <bsmodal id="regenerateCredentials"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="regenerateCredentialsDialog"\n' + '           extrabuttonlabel="Yes"\n' + "           ng-cloak>\n" + "    Are you sure you want to regenerate the credentials?\n" + "  </bsmodal>\n" + "\n" + '    <page-title icon="&#128640;" title="Getting Started"></page-title>\n' + "\n" + '  <section class="row-fluid">\n' + "\n" + "\n" + "\n" + "\n" + '    <div class="span8">\n' + "\n" + '      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n' + "      <p>Click on a platform icon below to view SDK installation instructions for that platform.</p>\n" + '      <ul class="inline unstyled">\n' + '        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n' + '        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n' + '        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n' + "\n" + "\n" + "        <li ng-click=\"showSDKDetail('ios')\"\n" + '            analytics-on="click"\n' + '            analytics-label="App Services"\n' + '            analytics-category="Getting Started"\n' + '            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n' + "        <li ng-click=\"showSDKDetail('android')\"\n" + '            analytics-on="click"\n' + '            analytics-label="App Services"\n' + '            analytics-category="Getting Started"\n' + '            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n' + "        <li ng-click=\"showSDKDetail('javascript')\"\n" + '            analytics-on="click"\n' + '            analytics-label="App Services"\n' + '            analytics-category="Getting Started"\n' + '            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n' + '        <li><a target="_blank"\n' + "               ng-click=\"showSDKDetail('nocontent')\"\n" + '               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n' + '               analytics-on="click"\n' + '               analytics-label="App Services"\n' + '               analytics-category="Getting Started"\n' + '               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n' + '        <li><a target="_blank"\n' + "               ng-click=\"showSDKDetail('nocontent')\"\n" + '               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ruby"\n' + '               analytics-on="click"\n' + '               analytics-label="App Services"\n' + '               analytics-category="Getting Started"\n' + '               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n' + '        <li><a target="_blank"\n' + "               ng-click=\"showSDKDetail('nocontent')\"\n" + '               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n' + '               analytics-on="click"\n' + '               analytics-label="App Services"\n' + '               analytics-category="Getting Started"\n' + '               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n' + "       </ul>\n" + "\n" + '      <section id="intro-container" class="row-fluid intro-container">\n' + "\n" + '        <div class="sdk-intro">\n' + "        </div>\n" + "\n" + '        <div class="sdk-intro-content">\n' + "\n" + '          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" target="_blank">\n' + "            Download SDK\n" + "          </a>\n" + '          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n' + "            More Docs\n" + "          </a>\n" + '          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n' + "\n" + '          <div ng-include="getIncludeURL()"></div>\n' + "        </div>\n" + "\n" + "      </section>\n" + "    </div>\n" + "\n" + '    <div class="span4 keys-creds">\n' + '      <h2 class="title">Mobile sdk keys</h2>\n' + "      <p>For mobile SDK initialization.</p>\n" + '      <dl class="app-creds">\n' + "        <dt>Org Name</dt>\n" + "        <dd>{{currentOrg}}</dd>\n" + "        <dt>App Name</dt>\n" + "        <dd>{{currentApp}}</dd>\n" + "      </dl>\n" + '      <h2 class="title">Server app credentials</h2>\n' + "      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n" + '      <dl class="app-creds">\n' + "        <dt>Client ID</dt>\n" + "        <dd>{{clientID}}</dd>\n" + "        <dt>Client Secret</dt>\n" + "        <dd>{{clientSecret}}</dd>\n" + "        <dt>\n" + "           &nbsp;\n" + "        </dt>\n" + "        <dd>&nbsp;</dd>\n" + "\n" + "        <dt>\n" + '          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n' + "        </dt>\n" + "        <dd></dd>\n" + "      </dl>\n" + "\n" + "    </div>\n" + "\n" + "  </section>\n" + "</div>");
        $templateCache.put("data/data.html", '<div class="content-page">\n' + "\n" + '  <bsmodal id="newCollection"\n' + '           title="Create new collection"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="newCollectionDialog"\n' + '           extrabuttonlabel="Create"\n' + '           buttonid="collection"\n' + "           ng-cloak>\n" + "    <fieldset>\n" + '      <div class="control-group">\n' + '        <label for="new-collection-name">Collection Name:</label>\n' + '        <div class="controls">\n' + '          <input type="text" ug-validate required ng-pattern="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" + '  <div id="intro-page">    \n' + '    <page-title title=" Collections" icon="&#128254;"></page-title>\n' + "  </div>\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" class="span3 user-col">\n' + '      <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')" title="new collection"><i class="pictogram">&#57347;</i></a>\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data new collection\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_new_collection}}" tooltip-placement="right">(?)</a>\n' + '        <ul  class="user-list" style="margin-top:5px;">\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 id="intro-collection-query" name="dataForm" ng-submit="run();">\n' + "        <fieldset>\n" + '          <div class="control-group">\n' + '            <div class="" data-toggle="buttons-radio">\n' + '              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n' + "              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n" + '              <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n' + '              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n' + '              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n' + '              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n' + '                <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query verbs\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_verb_buttons}}" tooltip-placement="right">(?)</a>\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' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query path\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_path_box}}" tooltip-placement="right">(?)</a>\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' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query string\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_query_box}}" tooltip-placement="right">(?)</a>\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>\n' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data limit\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_limit}}" tooltip-placement="right">(?)</a><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>\n' + '              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data json body\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_json_body}}" tooltip-placement="right">(?)</a> <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' + '                <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data validate json\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_json_validate}}" tooltip-placement="right">(?)</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' + '            <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data run query\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_run_query}}" tooltip-placement="right">(?)</a>\n' + "          </div>\n" + "        </fieldset>\n" + "       </form>\n" + '        <div id="intro-entity-list">\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" + "        </div>\n" + "\n" + "      </div>\n" + "\n" + "      </div>\n" + "    </section>\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' + '  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data entities list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_entities_list}}" tooltip-placement="left">(?)</a>\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.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]);\">{{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 <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data edit entity\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_edit_entity}}" tooltip-placement="right">(?)</a></h4>\n' + '      <div class="controls">\n' + '        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n' + "        <br>\n" + '        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n' + "      </div>\n" + "    </div>\n" + "  </td>\n" + "  </tr>\n" + "\n" + '  <tr ng-show="queryCollection._list.length == 0">\n' + '    <td colspan="4">No data found</td>\n' + "  </tr>\n" + "  </tbody>\n" + "</table>\n" + '<div style="padding: 10px 5px 10px 5px">\n' + '  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n' + '  <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n' + "</div>\n" + "\n");
        $templateCache.put("data/display-groups.html", "");
        $templateCache.put("data/display-roles.html", "roles---------------------------------");
        $templateCache.put("data/display-users.html", "\n" + '<table id="query-response-table" class="table">\n' + "  <tbody>\n" + '  <tr class="zebraRows users-row">\n' + '    <td class="checkboxo">\n' + '      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n' + '    <td class="gravatar50-td">&nbsp;</td>\n' + '    <td class="user-details bold-header">Username</td>\n' + '    <td class="user-details bold-header">Display Name</td>\n' + '    <td class="user-details bold-header">UUID</td>\n' + '    <td class="view-details">&nbsp;</td>\n' + "  </tr>\n" + '  <tr class="zebraRows users-row">\n' + '    <td class="checkboxo">\n' + '      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n' + "    </td>\n" + '    <td class="gravatar50-td">\n' + '      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n' + "    </td>\n" + '    <td class="details">\n' + "      <a onclick=\"Usergrid.console.getCollection('GET', '/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/'+'bf9a95da-d508-11e2-bf44-236d2eee13a7'); $('#data-explorer').show(); return false;\" class=\"view-details\">10</a>\n" + "    </td>\n" + '    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n' + '    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n' + '    <td class="view-details">\n' + '      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n' + "    </td>\n" + "  </tr>\n" + '  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n' + '    <td colspan="5">\n' + "      <div>\n" + '        <div style="padding-bottom: 10px;">\n' + '          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-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-bf44-236d2eee13a7",\n' + '  "type": "user",\n' + '  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n' + '  "created": 1371224432557,\n' + '  "modified": 1371851347024,\n' + '  "username": "10",\n' + '  "email": "fdsafdsa@ookfd.com",\n' + '  "activated": "true",\n' + '  "adr": {\n' + '    "addr1": "",\n' + '    "addr2": "",\n' + '    "city": "",\n' + '    "state": "",\n' + '    "zip": "",\n' + '    "country": ""\n' + "  },\n" + '  "metadata": {\n' + '    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n' + '    "sets": {\n' + '      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n' + '      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n' + "    },\n" + '    "collections": {\n' + '      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n' + '      "devices": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n' + '      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n' + '      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n' + '      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n' + '      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n' + '      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n' + "    }\n" + "  },\n" + '  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n' + "}</pre>\n" + "        </div>\n" + '        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n' + "          <table>\n" + "            <tbody>\n" + "            <tr>\n" + "              <td>picture</td>\n" + '              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n' + "            </tr>\n" + "            </tbody>\n" + "          </table>\n" + "        </div>\n" + "      </div>\n" + "    </td>\n" + "  </tr>\n" + "  </tbody>\n" + "</table>");
        $templateCache.put("data/entity.html", '<div class="content-page">\n' + "\n" + "  <h4>Entity Detail</h4>\n" + '  <div class="well">\n' + '    <a href="#!/data" class="outside-link"><< Back to collection</a>\n' + "  </div>\n" + "  <fieldset>\n" + '    <div class="control-group">\n' + "      <strong>Path </strong>\n" + '      <div class="controls">\n' + "        {{entityType}}/{{entityUUID}}\n" + "      </div>\n" + "    </div>\n" + "\n" + '    <div class="control-group">\n' + '      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n' + '      <div class="controls">\n' + '        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n' + "        <br>\n" + '        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n' + "      </div>\n" + "    </div>\n" + '    <div style="clear: both; height: 10px;"></div>\n' + '    <div class="control-group">\n' + '      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n' + '      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n' + "    </div>\n" + "  </fieldset>\n" + "\n" + "</div>\n" + "\n");
        $templateCache.put("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="globalNavDetailTitle">API Consoles</div>\n' + '        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n' + "      </div>\n" + "    </li>\n" + "  </ul>\n" + "</li>");
        $templateCache.put("global/insecure-banner.html", '<div ng-if="securityWarning" ng-cloak class="demo-holder">\n' + '    <div class="alert alert-demo alert-animate">\n' + '        <div class="alert-text">\n' + '            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n' + "        </div>\n" + "    </div>\n" + "</div>");
        $templateCache.put("global/page-title.html", '<section class="row-fluid">\n' + '    <div class="span12">\n' + '        <div class="page-filters">\n' + '            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n' + "        </div>\n" + "    </div>\n" + '    <bsmodal id="need-help"\n' + '             title="Need Help?"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="sendHelp"\n' + '             extrabuttonlabel="Get Help"\n' + "             ng-cloak>\n" + "        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n" + "    </bsmodal>\n" + "</section>\n" + "\n");
        $templateCache.put("groups/groups-activities.html", '<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n' + "\n" + "  <br>\n" + "  <div>\n" + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Date</td>\n" + "        <td>Content</td>\n" + "        <td>Verb</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n' + "        <td>{{activity.createdDate}}</td>\n" + "        <td>{{activity.content}}</td>\n" + "        <td>{{activity.verb}}</td>\n" + "        <td>{{activity.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\n" + "\n" + "\n" + "</div>");
        $templateCache.put("groups/groups-details.html", '<div class="content-page" ng-controller="GroupsDetailsCtrl">\n' + "\n" + "  <div>\n" + '      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n' + '          <div style="float: left; padding-right: 30px;">\n' + '              <h4 class="ui-dform-legend">Group Information</h4>\n' + '              <label for="group-title" class="ui-dform-label">Group Title</label>\n' + '              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n' + '                  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group title box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_title}}" tooltip-placement="right">(?)</a>\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' + '                <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_path}}" tooltip-placement="right">(?)</a>\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 <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group json object\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_json_object}}" tooltip-placement="right">(?)</a></h4>\n' + '              <pre id="{{help.showJsonId}}">{{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' + '    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_users_add_user}}" tooltip-placement="left">(?)</a>\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' + '    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles add role button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_add_leave_role}}" tooltip-placement="left">(?)</a>\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 <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles roles list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_roles}}" tooltip-placement="top">(?)</a></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  /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n' + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\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-strip">\n' + '    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\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 <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_permissions}}" tooltip-placement="top">(?)</a>\n' + "  </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>{{permission.path}}</td>\n" + "      <td>{{permission.operations.get}}</td>\n" + "      <td>{{permission.operations.post}}</td>\n" + "      <td>{{permission.operations.put}}</td>\n" + "      <td>{{permission.operations.delete}}</td>\n" + "    </tr>\n" + "    </tbody>\n" + "  </table>\n" + "\n" + "</div>");
        $templateCache.put("groups/groups-tabs.html", '<div class="content-page">\n' + "\n" + '  <section class="row-fluid">\n' + "\n" + '    <div class="span12">\n' + '      <div class="page-filters">\n' + '        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n' + "      </div>\n" + "    </div>\n" + "\n" + "  </section>\n" + "\n" + '  <div id="user-panel" class="panel-buffer">\n' + '    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n' + '      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n' + '      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n' + '      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n' + '      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n' + '      <li ng-class="rolesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n' + "    </ul>\n" + "  </div>\n" + "\n" + '  <div style="float: left; margin-right: 10px;">\n' + '    <div style="float: left;">\n' + "      <div class=\"user-header-title\"><strong>Group Path: </strong>{{selectedGroup.get('path')}}</div>\n" + "      <div class=\"user-header-title\"><strong>Group Title: </strong>{{selectedGroup.get('title')}}</div>\n" + "    </div>\n" + "  </div>\n" + "</div>\n" + "<br>\n" + "<br>\n");
        $templateCache.put("groups/groups.html", '<div class="content-page">\n' + "\n" + '  <div id="intro-page" >\n' + '  <page-title title=" Groups" icon="&#128101;"></page-title>\n' + "    \n" + "  </div>\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' + '          <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group title box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_title}}" tooltip-placement="right">(?)</a>\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' + '          <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_path}}" tooltip-placement="right">(?)</a>\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 id="intro-list" class="span3 user-col">\n' + '      <div class="button-toolbar span12">\n' + '        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n' + '        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n' + '        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#57347;</i></button>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_add_remove_buttons}}" tooltip-placement="right">(?)</a>\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" + "    </div>\n" + "\n" + '    <div id="{{help.showTabsId}}" 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\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups details tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_details_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups users tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_users_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups activities tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_activities_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </li>\n" + '          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a>\n' + '             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups role tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_tab}}" tooltip-placement="right">(?)</a></div>\n' + "          </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-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="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="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">GoogleGroup</a>.</p>\n' + "\n" + '      <p> <a href="#!/login">Back to login</a></p>\n' + "    </div>\n" + "  </div>\n" + "\n" + "</div>\n");
        $templateCache.put("menu.html", '<ul class="nav nav-list" menu="sideMenu">\n' + '    <li class="option {{item.active ? \'active\' : \'\'}}" ng-cloak="" ng-repeat="item in menuItems"><a data-ng-href="{{item.path}}"><i class="pictogram" ng-bind-html="item.pic"></i>{{item.title}}</a>\n' + '        <ul class="nav nav-list" ng-if="item.items">\n' + '            <li ng-repeat="subItem in item.items"><a data-ng-href="{{subItem.path}}"><i class="pictogram sub" ng-bind-html="subItem.pic"></i>{{subItem.title}}</a>\n' + "            </li>\n" + "        </ul>\n" + "    </li>\n" + "</ul>");
        $templateCache.put("menus/appMenu.html", '<ul id="app-menu" class="nav top-nav span12">\n' + '    <li class="span7">\n' + '      <bsmodal id="newApplication"\n' + '               title="Create New Application"\n' + '               close="hideModal"\n' + '               closelabel="Cancel"\n' + '               extrabutton="newApplicationDialog"\n' + '               extrabuttonlabel="Create"\n' + '               buttonid="app"\n' + "               ng-cloak>\n" + '        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n' + '        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n' + '        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n' + "      </bsmodal>\n" + '        <div class="btn-group">\n' + '            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n' + '                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n' + '                <span class="caret"></span>\n' + "            </a>\n" + '            <ul class="dropdown-menu app-nav">\n' + '                <li name="app-selector" ng-repeat="app in applications">\n' + '                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n' + "                </li>\n" + "            </ul>\n" + "        </div>\n" + "    </li>\n" + '    <li class="span5">\n' + '      <a ng-if="activeUI"\n' + '         class="btn btn-create zero-out pull-right"\n' + "         ng-click=\"showModal('newApplication')\"\n" + '         analytics-on="click"\n' + '         analytics-category="App Services"\n' + '         analytics-label="Button"\n' + '         analytics-event="Add New App"\n' + "        >\n" + '        <i class="pictogram">&#8862;</i>\n' + "        Add New App\n" + "      </a>\n" + "    </li>\n" + "</ul>");
        $templateCache.put("menus/orgMenu.html", '<ul class="nav top-nav org-nav">\n' + "  <li>\n" + '<div class="btn-group ">\n' + '    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n' + '        <i class="pictogram">&#128193</i> {{currentOrg}}<span class="caret"></span>\n' + "        </a>\n" + '    <ul class="dropdown-menu org-nav">\n' + '          <li name="org-selector" ng-repeat="(k,v) in organizations">\n' + '              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n' + "            </li>\n" + "         </ul>\n" + "    </div>\n" + "  </li></ul>");
        $templateCache.put("org-overview/org-overview.html", '<div class="org-overview-content" ng-show="activeUI">\n' + "\n" + '  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n' + "\n" + '  <section class="row-fluid">\n' + "\n" + '  <div class="span6">\n' + '  	<bsmodal id="introjs"\n' + '             title="Welcome to the API BaaS Admin Portal"\n' + '             close="hideModal"\n' + '             closelabel="Skip"\n' + '             extrabutton="startFirstTimeUser"\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 activities">\n' + "	        <td>{{activity.title}}</td>\n" + '	        <td style="text-align: right">{{activity.date}}</td>\n' + "	      </tr>\n" + "	    </table>\n" + "	</div>\n" + "  </div>\n" + "\n" + "\n" + "  </section>\n" + "</div>");
        $templateCache.put("profile/account.html", '<page-title title=" Account Settings" icon="&#59170"></page-title>\n' + "\n" + '<section class="row-fluid">\n' + '  <div class="span12 tab-content">\n' + '    <div class="menu-toolbar">\n' + '      <ul class="inline">\n' + '        <li class="tab" ng-show="!use_sso" ng-class="currentAccountPage.route === \'/profile/profile\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="profile-link" ng-click="selectAccountPage(\'/profile/profile\')"><i class="pictogram">&#59170;</i>Profile</a></li>\n' + '        <li class="tab" ng-class="currentAccountPage.route === \'/profile/organizations\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="account-link" ng-click="selectAccountPage(\'/profile/organizations\')"><i class="pictogram">&#128101;</i>Organizations</a></li>\n' + "      </ul>\n" + "    </div>\n" + '    <span ng-include="currentAccountPage.template"></span>\n' + "  </div>\n" + "</section>");
        $templateCache.put("profile/organizations.html", '<div class="content-page"   ng-controller="OrgCtrl">\n' + "\n" + '<page-title title=" Organizations" icon="&#128362;"></page-title>\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\')" title="add organization" ng-show="true"><i class="pictogram">&#57347;</i>\n' + "          </button>\n" + "        </div>\n" + '        <ul class="user-list">\n' + "          <li ng-class=\"selectedOrg.uuid === org.uuid ? 'selected' : ''\"\n" + '              ng-repeat="org in orgs" ng-click=" selectOrganization(org)">\n' + "\n" + '            <a href="javaScript:void(0)">{{org.name}}</a>\n' + "          </li>\n" + "        </ul>\n" + "      </div>\n" + '      <div class="span9">\n' + '        <div class="row-fluid" >\n' + "          <h4>Organization Information</h4>\n" + '          <div class="span11" ng-show="selectedOrg">\n' + '            <label  class="ui-dform-label">Applications</label>\n' + '            <table class="table table-striped">\n' + '              <tr ng-repeat="app in selectedOrg.applicationsArray">\n' + "                <td> {{app.name}}</td>\n" + '                <td style="text-align: right">{{app.uuid}}</td>\n' + "              </tr>\n" + "            </table>\n" + "            <br/>\n" + '            <label  class="ui-dform-label">Users</label>\n' + '            <table class="table table-striped">\n' + '              <tr ng-repeat="user in selectedOrg.usersArray">\n' + "                <td> {{user.name}}</td>\n" + '                <td style="text-align: right">{{user.email}}</td>\n' + "              </tr>\n" + "            </table>\n" + '            <form ng-submit="leaveOrganization(selectedOrg)">\n' + '              <input type="submit" name="button-leave-org" id="button-leave-org" title="Can only leave if organization has more than 1 user." ng-disabled="!doesOrgHaveUsers(selectedOrg)" value="Leave Organization" class="btn btn-primary pull-right">\n' + "            </form>\n" + "          </div>\n" + "        </div>\n" + "\n" + "      </div>\n" + "        </div>\n" + "</div>");
        $templateCache.put("profile/profile.html", "\n" + '<div class="content-page" ng-controller="ProfileCtrl">\n' + '<page-title title=" Profile" icon="&#59170"></page-title>\n' + "\n" + '  <div id="account-panels">\n' + '    <div class="panel-content">\n' + '      <div class="console-section">\n' + '        <div class="console-section-contents">\n' + '          <form name="updateAccountForm" id="update-account-form" ng-submit="saveUserInfo()" class="form-horizontal">\n' + "            <fieldset>\n" + '              <div class="control-group">\n' + '                <label id="update-account-id-label" class="control-label" for="update-account-id">UUID</label>\n' + '                <div class="controls">\n' + '                  <span id="update-account-id" class="monospace">{{user.uuid}}</span>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-username">Username </label>\n' + '                <div class="controls">\n' + '                  <input type="text" ug-validate name="update-account-username" required ng-pattern="usernameRegex" id="update-account-username" ng-attr-title="{{usernameRegexDescription}}"  class="span4" ng-model="user.username" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-name">Name </label>\n' + '                <div class="controls">\n' + '                  <input type="text" ug-validate name="update-account-name" id="update-account-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" class="span4" ng-model="user.name" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-email"> Email</label>\n' + '                <div class="controls">\n' + '                  <input type="email" ug-validate required name="update-account-email" ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  id="update-account-email" class="span4" ng-model="user.email" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-picture-img">Picture <br />(from <a href="http://gravatar.com">gravatar.com</a>) </label>\n' + '                <div class="controls">\n' + '                  <img id="update-account-picture-img" ng-src="{{user.profileImg}}" width="50" />\n' + "                </div>\n" + "              </div>\n" + '              <span class="help-block">Leave blank any of the following to keep the current password unchanged</span>\n' + "              <br />\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="old-account-password">Old Password</label>\n' + '                <div class="controls">\n' + '                  <input type="password" ug-validate name="old-account-password"  id="old-account-password" class="span4" ng-model="user.oldPassword" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group">\n' + '                <label class="control-label" for="update-account-password">New Password</label>\n' + '                <div class="controls">\n' + '                  <input type="password"  ug-validate name="update-account-password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" id="update-account-password" class="span4" ng-model="user.newPassword" size="20"/>\n' + "                </div>\n" + "              </div>\n" + '              <div class="control-group" style="display:none">\n' + '                <label class="control-label" for="update-account-password-repeat">Confirm New Password</label>\n' + '                <div class="controls">\n' + '                  <input type="password" ug-validate name="update-account-password-repeat" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" id="update-account-password-repeat" class="span4" ng-model="user.newPasswordConfirm" size="20"/>\n' + "                </div>\n" + "              </div>\n" + "            </fieldset>\n" + '            <div class="form-actions">\n' + '              <input type="submit"  class="btn btn-primary"  name="button-update-account" ng-disabled="!updateAccountForm.$valid || loading" id="button-update-account" value="{{loading ? loadingText : \'Update\'}}"  class="btn btn-usergrid"/>\n' + "            </div>\n" + "          </form>\n" + "        </div>\n" + "      </div>\n" + "    </div>\n" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles-groups.html", '<div class="content-page" ng-controller="RolesGroupsCtrl">\n' + "\n" + "\n" + '  <bsmodal id="addRoleToGroup"\n' + '           title="Add group to role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addRoleToGroupDialog"\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.path !== '' ? $parent.title : 'Select a group...'}}</span>\n" + '        <span class="caret"></span>\n' + "      </a>\n" + '      <ul class="dropdown-menu">\n' + '        <li ng-repeat="group in $parent.groupsTypeaheadValues" class="filterItem"><a ng-click="setRoleModal(group)">{{group.title}}</a></li>\n' + "      </ul>\n" + "    </div>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="removeGroupFromRole"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="removeGroupFromRoleDialog"\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="users-section">\n' + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_groups_add_group}}" tooltip-placement="left">(?)</a>\n' + '        <button class="btn btn-primary" ng-click="showModal(\'addRoleToGroup\')">Add Group to Role</button>\n' + '        <button class="btn btn-primary"  ng-disabled="!hasGroups || !valueSelected(rolesCollection.groups._list)" ng-click="showModal(\'removeGroupFromRole\')">Remove Group(s) from Role</button>\n' + "    </div>\n" + '    <table class="table table-striped">\n' + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasGroups" id="selectAllCheckBox" ng-model="roleGroupsSelected" ng-click="selectAllEntities(rolesCollection.groups._list,this,\'roleGroupsSelected\')"></td>\n' + "        <td>Title</td>\n" + "        <td>Path</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="group in rolesCollection.groups._list">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="group.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{group._data.title}}</td>\n" + "        <td>{{group._data.path}}</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}}" style="float:right;">Next ></button>\n' + "    </div>\n" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles-settings.html", '<div class="content-page" ng-controller="RolesSettingsCtrl">\n' + '  <bsmodal id="deletePermission"\n' + '           title="Confirmation"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="deleteRolePermissionDialog"\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="addRolePermissionDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" required ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" ug-validate id="rolePermissionsPath"/> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n' + '    <div class="control-group">\n' + '      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission verbs\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\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" + "  <div>\n" + '    <h4>Inactivity <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles inactivity\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_inactivity}}" tooltip-placement="right">(?)</a></h4>\n' + '    <div id="role-permissions">\n' + "        <p>Integer only. 0 (zero) means no expiration.</p>\n" + "\n" + '        <form name="updateActivity" ng-submit="updateInactivity()" novalidate>\n' + '            Seconds: <input style="margin: 0" type="number" required name="role-inactivity"\n' + '                            id="role-inactivity-input" min="0" ng-model="role._data.inactivity" title="Please input a positive integer >= 0."  step = "any" ug-validate >\n' + '            <input type="submit" class="btn btn-primary" ng-disabled="!updateActivity.$valid" value="Set"/>\n' + "        </form>\n" + "    </div>\n" + "\n" + "    <br/>\n" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles details add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n' + '      <button class="btn btn-primary"  ng-disabled="!hasSettings || !valueSelected(role.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n' + "    </div>\n" + "\n" + '    <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles settings permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_permissions}}" tooltip-placement="top">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasSettings" id="selectAllCheckBox" ng-model="permissionsSelected" ng-click="selectAllEntities(role.permissions,this,\'permissionsSelected\')" ></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 role.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" + "  </div>\n" + "</div>");
        $templateCache.put("roles/roles-tabs.html", '<div class="content-page">\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">&#59170;</i> Roles </h1>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles page title\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_page_title}}" tooltip-placement="right">(?)</a>\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(\'roles\')">Roles List</a></li>\n' + '      <li ng-class="settingsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/settings\')">Settings</a></li>\n' + '      <li ng-class="usersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/users\')">Users</a></li>\n' + '      <li ng-class="groupsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/groups\')">Groups</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>Role Name: </strong>{{selectedRole.name}}</div>\n' + '      <div class="user-header-title"><strong>Role Title: </strong>{{selectedRole.title}}</div>\n' + "    </div>\n" + "  </div>\n" + "\n" + "</div>\n" + "<br>\n" + "<br>");
        $templateCache.put("roles/roles-users.html", '<div class="content-page" ng-controller="RolesUsersCtrl">\n' + '  <bsmodal id="removeFromRole"\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 role(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="addRoleToUser"\n' + '           title="Add user to role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addRoleToUserDialog"\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.username ? $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" + '  <div class="users-section">\n' + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_users_add_user}}" tooltip-placement="left">(?)</a>\n' + '        <button class="btn btn-primary" ng-click="showModal(\'addRoleToUser\')">Add User to Role</button>\n' + '        <button class="btn btn-primary"  ng-disabled="!hasUsers || !valueSelected(rolesCollection.users._list)" ng-click="showModal(\'removeFromRole\')">Remove User(s) from Role</button>\n' + "    </div>\n" + '    <table class="table table-striped">\n' + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasUsers" id="selectAllCheckBox" ng-model="roleUsersSelected" ng-click="selectAllEntities(rolesCollection.users._list,this,\'roleUsersSelected\')" ng-model="master"></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 rolesCollection.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._data.username}}</td>\n" + "        <td>{{user._data.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>\n" + "</div>");
        $templateCache.put("roles/roles.html", '<div class="content-page">\n' + '  <div id="intro-page" >\n' + '    <page-title title=" Roles" icon="&#59170;"></page-title>\n' + "  </div>\n" + "\n" + '  <bsmodal id="newRole"\n' + '           title="New Role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="newRoleDialog"\n' + '           extrabuttonlabel="Create"\n' + '           buttonid="roles"\n' + "           ng-cloak>\n" + "          <fieldset>\n" + '            <div class="control-group">\n' + '              <label for="new-role-roletitle">Title</label>\n' + '              <div class="controls">\n' + '                <input type="text" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="$parent.newRole.title" name="roletitle" id="new-role-roletitle" class="input-xlarge" ug-validate/>\n' + '                <p class="help-block hide"></p>\n' + "              </div>\n" + "            </div>\n" + '            <div class="control-group">\n' + '              <label for="new-role-rolename">Role Name</label>\n' + '              <div class="controls">\n' + '                <input type="text" required ng-pattern="roleNameRegex" ng-attr-title="{{roleNameRegexDescription}}" ng-model="$parent.newRole.name" name="rolename" id="new-role-rolename" class="input-xlarge" ug-validate/>\n' + '                <p class="help-block hide"></p>\n' + "              </div>\n" + "            </div>\n" + "          </fieldset>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="deleteRole"\n' + '           title="Delete Role"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           buttonid="deleteroles"\n' + '           extrabutton="deleteRoleDialog"\n' + '           extrabuttonlabel="Delete"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the role(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" 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="hasRoles" ng-click="selectAllEntities(rolesCollection._list,this,\'rolesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n' + '        <button id="delete-role-btn" title="Delete" class="btn btn-primary toolbar"  ng-disabled="!hasRoles || !valueSelected(rolesCollection._list)" ng-click="showModal(\'deleteRole\')"><i class="pictogram">&#9749;</i></button>\n' + '        <button id="add-role-btn" title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newRole\')"><i class="pictogram">&#57347;</i></button>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add remove buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_remove_buttons}}" tooltip-placement="right">(?)</a>      </div>\n' + "\n" + '      <ul class="user-list">\n' + '        <li ng-class="selectedRole._data.uuid === role._data.uuid ? \'selected\' : \'\'" ng-repeat="role in rolesCollection._list" ng-click="selectRole(role._data.uuid)">\n' + "          <input\n" + '              type="checkbox"\n' + "              ng-value=\"role.get('uuid')\"\n" + '              ng-checked="master"\n' + '              ng-model="role.checked"\n' + "              id=\"role-{{role.get('title')}}-cb\"\n" + "              >\n" + "          <a id=\"role-{{role.get('title')}}-link\">{{role.get('title')}}</a>\n" + "          <br/>\n" + "          <span ng-if=\"role.get('name')\" class=\"label\">Role Name:</span>{{role.get('name')}}\n" + "        </li>\n" + "      </ul>\n" + "\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 id="intro-information-tabs" class="span9 tab-content" ng-show="hasRoles">\n' + '      <div class="menu-toolbar">\n' + '        <ul class="inline">\n' + '          <li class="tab" ng-class="currentRolesPage.route === \'/roles/settings\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/settings\')"><i class="pictogram">&#59170;</i>Settings</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles settings tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_settings_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentRolesPage.route === \'/roles/users\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/users\')"><i class="pictogram">&#128101;</i>Users</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles users tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_users_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentRolesPage.route === \'/roles/groups\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/groups\')"><i class="pictogram">&#59194;</i>Groups</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles groups tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_groups_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + "        </ul>\n" + "      </div>\n" + '      <span ng-include="currentRolesPage.template"></span>\n' + "    </div>\n" + "  </section>\n" + "</div>");
        $templateCache.put("shell/shell.html", '<page-title title=" Shell" icon="&#128241;"></page-title>\n' + "\n" + '<section class="row-fluid">\n' + '  <div class="console-section-contents" id="shell-panel">\n' + '    <div id="shell-input-div">\n' + '      <p> Type "help" to view a list of the available commands.</p>\n' + "      <hr>\n" + "\n" + '      <form name="shellForm" ng-submit="submitCommand()" >\n' + "        <span>&nbsp;&gt;&gt; </span>\n" + '        <input  type="text" id="shell-input"  ng-model="shell.input" autofocus="autofocus" required\n' + '                  ng-form="shellForm">\n' + '        <input style="display: none" type="submit" ng-form="shellForm" value="submit" ng-disabled="!shell.input"/>\n' + "      </form>\n" + "    </div>\n" + '    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;" ng-bind-html="shell.output">\n' + "\n" + "    </pre>\n" + '    <div id="lastshelloutput" ng-bind-html="shell.outputhidden" style="visibility:hidden"></div>\n' + "  </div>\n" + "</section>\n");
        $templateCache.put("users/users-activities.html", '<div class="content-page" ng-controller="UsersActivitiesCtrl" >\n' + "\n" + '  <bsmodal id="addActivityToUser"\n' + '           title="Add activity to user"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="addActivityToUserDialog"\n' + '           extrabuttonlabel="Add"\n' + "           ng-cloak>\n" + '    <p>Content: <input id="activityMessage" ng-model="$parent.newActivity.activityToAdd" required name="activityMessage" ug-validate /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add activity content\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_add_activity_content}}" tooltip-placement="right">(?)</a></p>\n' + "  </bsmodal>\n" + "\n" + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "  <br>\n" + '    <div class="button-strip"><a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add activity button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_add_activity}}" tooltip-placement="left">(?)</a> \n' + '    <button class="btn btn-primary" ng-click="showModal(\'addActivityToUser\')">Add activity to user</button>\n' + "  </div>\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 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>\n");
        $templateCache.put("users/users-feed.html", '<div class="content-page" ng-controller="UsersFeedCtrl" >\n' + "\n" + "    <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "    <br>\n" + "    <div>\n" + '        <table class="table table-striped">\n' + "            <tbody>\n" + '            <tr class="table-header">\n' + "                <td>Date</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>{{activity.createdDate}}</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" + "\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-graph.html", '<div class="content-page" ng-controller="UsersGraphCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + "  <div>\n" + "\n" + '    <bsmodal id="followUser"\n' + '             title="Follow User"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="followUserDialog"\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' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users follow user\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_follow_user}}" tooltip-placement="left">(?)</a> \n' + '      <button class="btn btn-primary" ng-click="showModal(\'followUser\')">Follow User</button>\n' + "    </div>\n" + "    <br>\n" + '      <h4>Following <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users following list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_following}}" tooltip-placement="right">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Image</td>\n" + "        <td>Username</td>\n" + "        <td>Email</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="user in selectedUser.following">\n' + '        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n' + "        <td>{{user.username}}</td>\n" + "        <td>{{user.email}}</td>\n" + "        <td>{{user.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "\n" + '      <h4>Followers <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users followers list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_followers}}" tooltip-placement="right">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>Image</td>\n" + "        <td>Username</td>\n" + "        <td>Email</td>\n" + "        <td>UUID</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="user in selectedUser.followers">\n' + '        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n' + "        <td>{{user.username}}</td>\n" + "        <td>{{user.email}}</td>\n" + "        <td>{{user.uuid}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "\n" + "  </div>\n" + "</div>");
        $templateCache.put("users/users-groups.html", '<div class="content-page" ng-controller="UsersGroupsCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + "  <div>\n" + "\n" + '    <bsmodal id="addUserToGroup"\n' + '             title="Add user to group"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="addUserToGroupDialog"\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.title && $parent.title !== '' ? $parent.title : 'Select a group...'}}</span>\n" + '          <span class="caret"></span>\n' + "        </a>\n" + '        <ul class="dropdown-menu">\n' + '          <li ng-repeat="group in $parent.groupsTypeaheadValues" class="filterItem"><a ng-click="selectGroup(group)">{{group.title}}</a></li>\n' + "        </ul>\n" + "      </div>\n" + "    </bsmodal>\n" + "\n" + '    <bsmodal id="leaveGroup"\n' + '             title="Confirmation"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="leaveGroupDialog"\n' + '             extrabuttonlabel="Leave"\n' + "             ng-cloak>\n" + "      <p>Are you sure you want to remove the user from the seleted group(s)?</p>\n" + "    </bsmodal>\n" + "\n" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add leave group buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_add_leave_buttons}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addUserToGroup\')">Add to group</button>\n' + '      <button class="btn btn-primary" ng-disabled="!hasGroups || !valueSelected(userGroupsCollection._list)" ng-click="showModal(\'leaveGroup\')">Leave group(s)</button>\n' + "    </div>\n" + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + "        <td>\n" + '          <input type="checkbox" ng-show="hasGroups" id="selectAllCheckBox" ng-model="userGroupsSelected" ng-click="selectAllEntities(userGroupsCollection._list,this,\'userGroupsSelected\')" >\n' + "        </td>\n" + '        <td>Group Name <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'add user group list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_group_name}}" tooltip-placement="top">(?)</a></td>\n' + "        <td>Path</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="group in userGroupsCollection._list">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + "            ng-value=\"group.get('uuid')\"\n" + '            ng-model="group.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{group.get('title')}}</td>\n" + "        <td>{{group.get('path')}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "  </div>\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");
        $templateCache.put("users/users-profile.html", '<div class="content-page" ng-controller="UsersProfileCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + '  <div class="row-fluid">\n' + "\n" + '  <form ng-submit="saveSelectedUser()" name="profileForm" novalidate>\n' + '    <div class="span6">\n' + '      <h4>User Information <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile information\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_information}}" tooltip-placement="top">(?)</a></h4>\n' + '      <label for="ui-form-username" class="ui-dform-label">Username</label>\n' + '      <input type="text" ug-validate required  name="ui-form-username" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" id="ui-form-username" class="ui-dform-text" ng-model="user.username">\n' + "      <br/>\n" + '      <label for="ui-form-name" class="ui-dform-label">Full Name</label>\n' + '      <input type="text" ug-validate ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" required name="ui-form-name" id="ui-form-name" class="ui-dform-text" ng-model="user.name">\n' + "      <br/>\n" + '      <label for="ui-form-title" class="ui-dform-label">Title</label>\n' + '      <input type="text" ug-validate name="ui-form-title" id="ui-form-title" class="ui-dform-text" ng-model="user.title">\n' + "      <br/>\n" + '      <label for="ui-form-url" class="ui-dform-label">Home Page</label>\n' + '      <input type="url" ug-validate name="ui-form-url" id="ui-form-url" title="Please enter a valid url." class="ui-dform-text" ng-model="user.url">\n' + "      <br/>\n" + '      <label for="ui-form-email" class="ui-dform-label">Email</label>\n' + '      <input type="email" ug-validate required name="ui-form-email" id="ui-form-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" class="ui-dform-text" ng-model="user.email">\n' + "      <br/>\n" + '      <label for="ui-form-tel" class="ui-dform-label">Telephone</label>\n' + '      <input type="tel" ug-validate name="ui-form-tel" id="ui-form-tel" class="ui-dform-text" ng-model="user.tel">\n' + "      <br/>\n" + '      <label for="ui-form-picture" class="ui-dform-label">Picture URL</label>\n' + '      <input type="url" ug-validate name="ui-form-picture" id="ui-form-picture" title="Please enter a valid url." ng class="ui-dform-text" ng-model="user.picture">\n' + "      <br/>\n" + '      <label for="ui-form-bday" class="ui-dform-label">Birthday</label>\n' + '      <input type="date" ug-validate name="ui-form-bday" id="ui-form-bday" class="ui-dform-text" ng-model="user.bday">\n' + "      <br/>\n" + "    </div>\n" + '    <div class="span6">\n' + "      <h4>Address</h4>\n" + '      <label for="ui-form-addr1" class="ui-dform-label">Street 1</label>\n' + '      <input type="text" ug-validate name="ui-form-addr1" id="ui-form-addr1" class="ui-dform-text" ng-model="user.adr.addr1">\n' + "      <br/>\n" + '      <label for="ui-form-addr2" class="ui-dform-label">Street 2</label>\n' + '      <input type="text" ug-validate name="ui-form-addr2" id="ui-form-addr2" class="ui-dform-text" ng-model="user.adr.addr2">\n' + "      <br/>\n" + '      <label for="ui-form-city" class="ui-dform-label">City</label>\n' + '      <input type="text" ug-validate name="ui-form-city" id="ui-form-city" class="ui-dform-text" ng-model="user.adr.city">\n' + "      <br/>\n" + '      <label for="ui-form-state" class="ui-dform-label">State</label>\n' + '      <input type="text" ug-validate name="ui-form-state" id="ui-form-state"  ng-attr-title="{{stateRegexDescription}}" ng-pattern="stateRegex" class="ui-dform-text" ng-model="user.adr.state">\n' + "      <br/>\n" + '      <label for="ui-form-zip" class="ui-dform-label">Zip</label>\n' + '      <input type="text" ug-validate name="ui-form-zip" ng-pattern="zipRegex" ng-attr-title="{{zipRegexDescription}}" id="ui-form-zip" class="ui-dform-text" ng-model="user.adr.zip">\n' + "      <br/>\n" + '      <label for="ui-form-country" class="ui-dform-label">Country</label>\n' + '      <input type="text" ug-validate name="ui-form-country" ng-attr-title="{{countryRegexDescription}}" ng-pattern="countryRegex" id="ui-form-country" class="ui-dform-text" ng-model="user.adr.country">\n' + "      <br/>\n" + "    </div>\n" + "\n" + '      <div class="span6">\n' + '        <input type="submit" class="btn btn-primary margin-35" ng-disabled="!profileForm.$valid"  value="Save User"/>\n' + "      </div>\n" + "\n" + "\n" + '    <div class="content-container">\n' + '      <legend>JSON User Object <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile json\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_json}}" tooltip-placement="top">(?)</a></legend>\n' + '      <pre id="{{help.showJsonId}}">{{user.json}}</pre>\n' + "    </div>\n" + "    </form>\n" + "  </div>\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-roles.html", '<div class="content-page" ng-controller="UsersRolesCtrl">\n' + "\n" + "  <div ng:include=\"'users/users-tabs.html'\"></div>\n" + "\n" + "  <div>\n" + "\n" + '    <bsmodal id="addRole"\n' + '             title="Add user to role"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="addUserToRoleDialog"\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 : 'Select a Role...'}}</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="leaveRole"\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 user from the role(s)?</p>\n" + "    </bsmodal>\n" + "\n" + '<div ng-controller="UsersRolesCtrl">\n' + "\n" + '<div class="button-strip">\n' + '  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add role button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_leave_role}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addRole\')">Add Role</button>\n' + '      <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(selectedUser.roles)" ng-click="showModal(\'leaveRole\')">Leave role(s)</button>\n' + "    </div>\n" + "    <br>\n" + '      <h4>Roles <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles roles list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_roles}}" tooltip-placement="top">(?)</a></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="rolesSelectAllCheckBox" ng-model="usersRolesSelected" ng-click="selectAllEntities(selectedUser.roles,this,\'usersRolesSelected\',true)" ></td>\n' + "        <td>Role Name</td>\n" + "        <td>Role title</td>\n" + "      </tr>\n" + '      <tr class="zebraRows" ng-repeat="role in selectedUser.roles">\n' + "        <td>\n" + "          <input\n" + '            type="checkbox"\n' + '            ng-model="role.checked"\n' + "            >\n" + "        </td>\n" + "        <td>{{role.name}}</td>\n" + "        <td>{{role.title}}</td>\n" + "      </tr>\n" + "      </tbody>\n" + "    </table>\n" + "\n" + '    <bsmodal id="deletePermission"\n' + '             title="Confirmation"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="deletePermissionDialog"\n' + '             extrabuttonlabel="Delete"\n' + "             ng-cloak>\n" + "      <p>Are you sure you want to delete the permission(s)?</p>\n" + "    </bsmodal>\n" + "\n" + '    <bsmodal id="addPermission"\n' + '             title="New Permission"\n' + '             close="hideModal"\n' + '             closelabel="Cancel"\n' + '             extrabutton="addUserPermissionDialog"\n' + '             extrabuttonlabel="Add"\n' + "             ng-cloak>\n" + '      <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="usersRolePermissions" type="text" ng-pattern="pathRegex" required ug-validate ng-attr-title="{{pathRegexDescription}}" /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n' + '      <div class="control-group">\n' + '        <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission verbs check boxes\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\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" + '    <div class="button-strip">\n' + '      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n' + '      <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n' + '      <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedUser.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n' + "    </div>\n" + "    <br>\n" + '      <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_permissions}}" tooltip-placement="top">(?)</a></h4>\n' + '    <table class="table table-striped">\n' + "      <tbody>\n" + '      <tr class="table-header">\n' + '        <td style="width: 30px;"><input type="checkbox" ng-show="hasPermissions"  id="permissionsSelectAllCheckBox" ng-model="usersPermissionsSelected" ng-click="selectAllEntities(selectedUser.permissions,this,\'usersPermissionsSelected\',true)"  ></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 selectedUser.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" + "  </div>\n" + " </div>\n" + "\n" + "</div>\n");
        $templateCache.put("users/users-tabs.html", "\n" + "\n" + "\n");
        $templateCache.put("users/users.html", '<div class="content-page">\n' + "\n" + '  <div id="intro-page">    \n' + '    <page-title title=" Users" icon="&#128100;"></page-title>\n' + "  </div>\n" + '  <bsmodal id="newUser"\n' + '           title="Create New User"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           buttonid="users"\n' + '           extrabutton="newUserDialog"\n' + '           extrabuttonlabel="Create"\n' + "           ng-cloak>\n" + "    <fieldset>\n" + '      <div class="control-group">\n' + '        <label for="new-user-username">Username</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" required ng-model="$parent.newUser.newusername" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}"  name="username" id="new-user-username" class="input-xlarge" ug-validate/>\n' + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-fullname">Full name</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="text" required  ng-attr-title="{{nameRegexDescription}}" ng-pattern="nameRegex" ng-model="$parent.newUser.name" name="name" id="new-user-fullname" class="input-xlarge" ug-validate/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-email">Email</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="email" required  ng-model="$parent.newUser.email" pattern="emailRegex"   ng-attr-title="{{emailRegexDescription}}"  name="email" id="new-user-email" class="input-xlarge" ug-validate/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-password">Password</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="password" required ng-pattern="passwordRegex"  ng-attr-title="{{passwordRegexDescription}}" ng-model="$parent.newUser.newpassword" name="password" id="new-user-password" ug-validate\n' + '                 class="input-xlarge"/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + '      <div class="control-group">\n' + '        <label for="new-user-re-password">Confirm password</label>\n' + "\n" + '        <div class="controls">\n' + '          <input type="password" required ng-pattern="passwordRegex"  ng-attr-title="{{passwordRegexDescription}}" ng-model="$parent.newUser.repassword" name="re-password" id="new-user-re-password" ug-validate\n' + '                 class="input-xlarge"/>\n' + "\n" + '          <p class="help-block hide"></p>\n' + "        </div>\n" + "      </div>\n" + "    </fieldset>\n" + "  </bsmodal>\n" + "\n" + '  <bsmodal id="deleteUser"\n' + '           title="Delete User"\n' + '           close="hideModal"\n' + '           closelabel="Cancel"\n' + '           extrabutton="deleteUsersDialog"\n' + '           extrabuttonlabel="Delete"\n' + '           buttonid="deleteusers"\n' + "           ng-cloak>\n" + "    <p>Are you sure you want to delete the user(s)?</p>\n" + "  </bsmodal>\n" + "\n" + '  <section class="row-fluid">\n' + '    <div id="intro-list" class="span3 user-col">\n' + "      \n" + '      <div class="button-toolbar span12">\n' + '          <a title="Select All" class="btn btn-primary toolbar select-all" ng-show="hasUsers" ng-click="selectAllEntities(usersCollection._list,this,\'usersSelected\',true)" ng-model="usersSelected"> <i class="pictogram">&#8863;</i></a>\n' + '          <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasUsers || !valueSelected(usersCollection._list)" ng-click="showModal(\'deleteUser\')" id="delete-user-button"><i class="pictogram">&#9749;</i></button>\n' + '        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newUser\')" id="new-user-button" ng-attr-id="new-user-button"><i class="pictogram">&#57347;</i></button>\n' + '        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add remove buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_users_add_remove_buttons}}" tooltip-placement="right">(?)</a>\n' + "      </div>\n" + '      <ul class="user-list">\n' + '          <li ng-class="selectedUser._data.uuid === user._data.uuid ? \'selected\' : \'\'" ng-repeat="user in usersCollection._list" ng-click="selectUser(user._data.uuid)">\n' + "            <input\n" + '                type="checkbox"\n' + "                id=\"user-{{user.get('username')}}-checkbox\"\n" + "                ng-value=\"user.get('uuid')\"\n" + '                ng-checked="master"\n' + '                ng-model="user.checked"\n' + "                >\n" + "              <a href=\"javaScript:void(0)\"  id=\"user-{{user.get('username')}}-link\" >{{user.get('username')}}</a>\n" + '              <span ng-if="user.name" class="label">Display Name:</span>{{user.name}}\n' + "            </li>\n" + "        </ul>\n" + '        <div style="padding: 10px 5px 10px 5px">\n' + '          <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous\n' + "          </button>\n" + '          <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next >\n' + "          </button>\n" + "        </div>\n" + "      \n" + "    </div>\n" + "\n" + '    <div id="{{help.showTabsId}}" class="span9 tab-content" ng-show="hasUsers">\n' + '      <div class="menu-toolbar">\n' + '        <ul class="inline">\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/profile\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/profile\')"><i class="pictogram">&#59170;</i>Profile</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/groups\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/groups\')"><i class="pictogram">&#128101;</i>Groups</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users groups tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/activities\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/activities\')"><i class="pictogram">&#59194;</i>Activities</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users activities tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/feed\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/feed\')"><i class="pictogram">&#128196;</i>Feed</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users feed tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_feed_tab}}" tooltip-placement="right">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/graph\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/graph\')"><i class="pictogram">&#9729;</i>Graph</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users graph tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_tab}}" tooltip-placement="top">(?)</a></div></li>\n' + '          <li class="tab" ng-class="currentUsersPage.route === \'/users/roles\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_tab}}" tooltip-placement="top">(?)</a></div></li>\n' + "        </ul>\n" + "      </div>\n" + '      <span ng-include="currentUsersPage.template"></span>\n' + "    </div>\n" + "  </section>\n" + "</div>");
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.activitiesSelected = "active";
        $scope.activityToAdd = "";
        $scope.activities = [];
        $scope.newActivity = {};
        var getActivities = function() {
            ug.getEntityActivities($rootScope.selectedUser);
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            getActivities();
        }
        $scope.addActivityToUserDialog = function(modalId) {
            ug.addUserActivity($rootScope.selectedUser, $scope.newActivity.activityToAdd);
            $scope.hideModal(modalId);
            $scope.newActivity = {};
        };
        $scope.$on("user-activity-add-error", function() {
            $rootScope.$broadcast("alert", "error", "could not create activity");
        });
        $scope.$on("user-activity-add-success", function() {
            $scope.newActivity.activityToAdd = "";
            getActivities();
        });
        $scope.$on("users-activities-error", function() {
            $rootScope.$broadcast("alert", "error", "could not create activity");
        });
        $scope.$on("users-activities-received", function(evt, entities) {
            $scope.activities = entities;
            $scope.applyScope();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
        $scope.newUser = {};
        $scope.usersCollection = {};
        $rootScope.selectedUser = {};
        $scope.previous_display = "none";
        $scope.next_display = "none";
        $scope.hasUsers = false;
        $scope.currentUsersPage = {};
        $scope.selectUserPage = function(route) {
            $scope.currentUsersPage.template = $route.routes[route].templateUrl;
            $scope.currentUsersPage.route = route;
            clearNewUserForm();
        };
        $scope.deleteUsersDialog = function(modalId) {
            $scope.deleteEntities($scope.usersCollection, "user-deleted", "error deleting user");
            $scope.hideModal(modalId);
            clearNewUserForm();
        };
        $scope.$on("user-deleted-error", function() {
            ug.getUsers();
        });
        var clearNewUserForm = function() {
            $scope.newUser = {};
        };
        $scope.newUserDialog = function(modalId) {
            switch (true) {
              case $scope.newUser.newpassword !== $scope.newUser.repassword:
                $rootScope.$broadcast("alert", "error", "Passwords do not match.");
                break;

              default:
                ug.createUser($scope.newUser.newusername, $scope.newUser.name, $scope.newUser.email, $scope.newUser.newpassword);
                $scope.hideModal(modalId);
                clearNewUserForm();
                break;
            }
        };
        ug.getUsers();
        $scope.$on("users-received", function(event, users) {
            $scope.usersCollection = users;
            $scope.usersSelected = false;
            $scope.hasUsers = users._list.length;
            if (users._list.length > 0) {
                $scope.selectUser(users._list[0]._data.uuid);
            }
            $scope.checkNextPrev();
            $scope.applyScope();
        });
        $scope.$on("users-create-success", function() {
            $rootScope.$broadcast("alert", "success", "User successfully created.");
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.usersCollection.hasPreviousPage()) {
                $scope.previous_display = "";
            }
            if ($scope.usersCollection.hasNextPage()) {
                $scope.next_display = "";
            }
        };
        $scope.selectUser = function(uuid) {
            $rootScope.selectedUser = $scope.usersCollection.getEntityByUUID(uuid);
            $scope.currentUsersPage.template = "users/users-profile.html";
            $scope.currentUsersPage.route = "/users/profile";
            $rootScope.$broadcast("user-selection-changed", $rootScope.selectedUser);
        };
        $scope.getPrevious = function() {
            $scope.usersCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.getNext = function() {
            $scope.usersCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of users");
                }
                $scope.checkNextPrev();
                $scope.applyScope();
            });
        };
        $scope.$on("user-deleted", function(event) {
            $rootScope.$broadcast("alert", "success", "User deleted successfully.");
            ug.getUsers();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersFeedCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.activitiesSelected = "active";
        $scope.activityToAdd = "";
        $scope.activities = [];
        $scope.newActivity = {};
        var getFeed = function() {
            ug.getEntityActivities($rootScope.selectedUser, true);
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            getFeed();
        }
        $scope.$on("users-feed-error", function() {
            $rootScope.$broadcast("alert", "error", "could not create activity");
        });
        $scope.$on("users-feed-received", function(evt, entities) {
            $scope.activities = entities;
            $scope.applyScope();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersGraphCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.graphSelected = "active";
        $scope.user = "";
        ug.getUsersTypeAhead();
        $scope.followUserDialog = function(modalId) {
            if ($scope.user) {
                ug.followUser($scope.user.uuid);
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a user to follow.");
            }
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            $rootScope.selectedUser.activities = [];
            $rootScope.selectedUser.getFollowing(function(err, data) {
                if (err) {} else {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                }
            });
            $rootScope.selectedUser.getFollowers(function(err, data) {
                if (err) {} else {
                    if (!$rootScope.$$phase) {
                        $rootScope.$apply();
                    }
                }
            });
            $scope.$on("follow-user-received", function(event) {
                $rootScope.selectedUser.getFollowing(function(err, data) {
                    if (err) {} else {
                        if (!$rootScope.$$phase) {
                            $rootScope.$apply();
                        }
                    }
                });
            });
        }
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersGroupsCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.userGroupsCollection = {};
        $scope.groups_previous_display = "none";
        $scope.groups_next_display = "none";
        $scope.groups_check_all = "";
        $scope.groupsSelected = "active";
        $scope.title = "";
        $scope.master = "";
        $scope.hasGroups = false;
        var init = function() {
            $scope.name = "";
            if (!$rootScope.selectedUser) {
                $location.path("/users");
                return;
            } else {
                ug.getGroupsForUser($rootScope.selectedUser.get("uuid"));
            }
            ug.getGroupsTypeAhead();
        };
        init();
        $scope.addUserToGroupDialog = function(modalId) {
            if ($scope.path) {
                var username = $rootScope.selectedUser.get("uuid");
                ug.addUserToGroup(username, $scope.path);
                $scope.hideModal(modalId);
                $scope.path = "";
                $scope.title = "";
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a group.");
            }
        };
        $scope.selectGroup = function(group) {
            $scope.path = group.path;
            $scope.title = group.title;
        };
        $scope.leaveGroupDialog = function(modalId) {
            $scope.deleteEntities($scope.userGroupsCollection, "user-left-group", "error removing user from group");
            $scope.hideModal(modalId);
        };
        $scope.$on("user-groups-received", function(event, groups) {
            $scope.userGroupsCollection = groups;
            $scope.userGroupsSelected = false;
            $scope.hasGroups = groups._list.length;
            $scope.checkNextPrev();
            if (!$rootScope.$$phase) {
                $rootScope.$apply();
            }
        });
        $scope.resetNextPrev = function() {
            $scope.previous_display = "none";
            $scope.next_display = "none";
        };
        $scope.checkNextPrev = function() {
            $scope.resetNextPrev();
            if ($scope.userGroupsCollection.hasPreviousPage()) {
                $scope.previous_display = "block";
            }
            if ($scope.userGroupsCollection.hasNextPage()) {
                $scope.next_display = "block";
            }
        };
        $rootScope.getPrevious = function() {
            $scope.userGroupsCollection.getPreviousPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting previous page of groups");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $rootScope.getNext = function() {
            $scope.userGroupsCollection.getNextPage(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error getting next page of groups");
                }
                $scope.checkNextPrev();
                if (!$rootScope.$$phase) {
                    $rootScope.$apply();
                }
            });
        };
        $scope.$on("user-left-group", function(event) {
            $scope.checkNextPrev();
            $scope.userGroupsSelected = false;
            if (!$rootScope.$$phase) {
                $rootScope.$apply();
            }
            init();
        });
        $scope.$on("user-added-to-group-received", function(event) {
            $scope.checkNextPrev();
            if (!$rootScope.$$phase) {
                $rootScope.$apply();
            }
            init();
        });
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersProfileCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.user = $rootScope.selectedUser._data.clone();
        $scope.user.json = $scope.user.json || $scope.user.stringifyJSON();
        $scope.profileSelected = "active";
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        }
        $scope.$on("user-selection-changed", function(evt, selectedUser) {
            $scope.user = selectedUser._data.clone();
            $scope.user.json = $scope.user.json || selectedUser._data.stringifyJSON();
        });
        $scope.saveSelectedUser = function() {
            $rootScope.selectedUser.set($scope.user.clone());
            $rootScope.selectedUser.save(function(err) {
                if (err) {
                    $rootScope.$broadcast("alert", "error", "error saving user");
                } else {
                    $rootScope.$broadcast("alert", "success", "user saved");
                }
            });
        };
    } ]);
    "use strict";
    AppServices.Controllers.controller("UsersRolesCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
        $scope.rolesSelected = "active";
        $scope.usersRolesSelected = false;
        $scope.usersPermissionsSelected = false;
        $scope.name = "";
        $scope.master = "";
        $scope.hasRoles = $scope.hasPermissions = false;
        $scope.permissions = {};
        var clearPermissions = function() {
            if ($scope.permissions) {
                $scope.permissions.path = "";
                $scope.permissions.getPerm = false;
                $scope.permissions.postPerm = false;
                $scope.permissions.putPerm = false;
                $scope.permissions.deletePerm = false;
            }
            $scope.applyScope();
        };
        var clearRole = function() {
            $scope.name = "";
            $scope.applyScope();
        };
        ug.getRolesTypeAhead();
        $scope.addUserToRoleDialog = function(modalId) {
            if ($scope.name) {
                var username = $rootScope.selectedUser.get("uuid");
                ug.addUserToRole(username, $scope.name);
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a role.");
            }
        };
        $scope.leaveRoleDialog = function(modalId) {
            var username = $rootScope.selectedUser.get("uuid");
            var roles = $rootScope.selectedUser.roles;
            for (var i = 0; i < roles.length; i++) {
                if (roles[i].checked) {
                    ug.removeUserFromRole(username, roles[i].name);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.deletePermissionDialog = function(modalId) {
            var username = $rootScope.selectedUser.get("uuid");
            var permissions = $rootScope.selectedUser.permissions;
            for (var i = 0; i < permissions.length; i++) {
                if (permissions[i].checked) {
                    ug.deleteUserPermission(permissions[i].perm, username);
                }
            }
            $scope.hideModal(modalId);
        };
        $scope.addUserPermissionDialog = function(modalId) {
            if ($scope.permissions.path) {
                var permission = $scope.createPermission(null, null, $scope.removeFirstSlash($scope.permissions.path), $scope.permissions);
                var username = $rootScope.selectedUser.get("uuid");
                ug.newUserPermission(permission, username);
                $scope.hideModal(modalId);
            } else {
                $rootScope.$broadcast("alert", "error", "You must specify a name for the permission.");
            }
        };
        if (!$rootScope.selectedUser) {
            $location.path("/users");
            return;
        } else {
            $rootScope.selectedUser.permissions = [];
            $rootScope.selectedUser.roles = [];
            $rootScope.selectedUser.getPermissions(function(err, data) {
                $scope.clearCheckbox("permissionsSelectAllCheckBox");
                if (err) {} else {
                    $scope.hasPermissions = data.data.length > 0;
                    $scope.applyScope();
                }
            });
            $rootScope.selectedUser.getRoles(function(err, data) {
                if (err) {} else {
                    $scope.hasRoles = data.entities.length > 0;
                    $scope.applyScope();
                }
            });
            $scope.$on("role-update-received", function(event) {
                $rootScope.selectedUser.getRoles(function(err, data) {
                    $scope.usersRolesSelected = false;
                    if (err) {} else {
                        $scope.hasRoles = data.entities.length > 0;
                        clearRole();
                        $scope.applyScope();
                    }
                });
            });
            $scope.$on("permission-update-received", function(event) {
                $rootScope.selectedUser.getPermissions(function(err, data) {
                    $scope.usersPermissionsSelected = false;
                    if (err) {} else {
                        clearPermissions();
                        $scope.hasPermissions = data.data.length > 0;
                        $scope.applyScope();
                    }
                });
            });
        }
    } ]);
})({}, function() {
    return this;
}());