http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/12342668/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.js
----------------------------------------------------------------------
diff --git 
a/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.js
 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.js
new file mode 100644
index 0000000..dbf3feb
--- /dev/null
+++ 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.js
@@ -0,0 +1,883 @@
+/*!
+ * angular-translate - v2.2.0 - 2014-06-03
+ * http://github.com/PascalPrecht/angular-translate
+ * Copyright (c) 2014 ; Licensed MIT
+ */
+angular.module('pascalprecht.translate', ['ng']).run([
+  '$translate',
+  function ($translate) {
+    var key = $translate.storageKey(), storage = $translate.storage();
+    if (storage) {
+      if (!storage.get(key)) {
+        if (angular.isString($translate.preferredLanguage())) {
+          $translate.use($translate.preferredLanguage());
+        } else {
+          storage.set(key, $translate.use());
+        }
+      } else {
+        $translate.use(storage.get(key));
+      }
+    } else if (angular.isString($translate.preferredLanguage())) {
+      $translate.use($translate.preferredLanguage());
+    }
+  }
+]);
+angular.module('pascalprecht.translate').provider('$translate', [
+  '$STORAGE_KEY',
+  function ($STORAGE_KEY) {
+    var $translationTable = {}, $preferredLanguage, $availableLanguageKeys = 
[], $languageKeyAliases, $fallbackLanguage, $fallbackWasString, $uses, 
$nextLang, $storageFactory, $storageKey = $STORAGE_KEY, $storagePrefix, 
$missingTranslationHandlerFactory, $interpolationFactory, 
$interpolatorFactories = [], $interpolationSanitizationStrategy = false, 
$loaderFactory, $cloakClassName = 'translate-cloak', $loaderOptions, 
$notFoundIndicatorLeft, $notFoundIndicatorRight, $postCompilingEnabled = false, 
NESTED_OBJECT_DELIMITER = '.';
+    var getLocale = function () {
+      var nav = window.navigator;
+      return (nav.language || nav.browserLanguage || nav.systemLanguage || 
nav.userLanguage || '').split('-').join('_');
+    };
+    var negotiateLocale = function (preferred) {
+      var avail = [], locale = angular.lowercase(preferred), i = 0, n = 
$availableLanguageKeys.length;
+      for (; i < n; i++) {
+        avail.push(angular.lowercase($availableLanguageKeys[i]));
+      }
+      if (avail.indexOf(locale) > -1) {
+        return preferred;
+      }
+      if ($languageKeyAliases) {
+        var alias;
+        for (var langKeyAlias in $languageKeyAliases) {
+          var hasWildcardKey = false;
+          var hasExactKey = $languageKeyAliases.hasOwnProperty(langKeyAlias) 
&& angular.lowercase(langKeyAlias) === angular.lowercase(preferred);
+          if (langKeyAlias.slice(-1) === '*') {
+            hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, 
langKeyAlias.length - 1);
+          }
+          if (hasExactKey || hasWildcardKey) {
+            alias = $languageKeyAliases[langKeyAlias];
+            if (avail.indexOf(angular.lowercase(alias)) > -1) {
+              return alias;
+            }
+          }
+        }
+      }
+      var parts = preferred.split('_');
+      if (parts.length > 1 && avail.indexOf(angular.lowercase(parts[0])) > -1) 
{
+        return parts[0];
+      }
+      return preferred;
+    };
+    var translations = function (langKey, translationTable) {
+      if (!langKey && !translationTable) {
+        return $translationTable;
+      }
+      if (langKey && !translationTable) {
+        if (angular.isString(langKey)) {
+          return $translationTable[langKey];
+        }
+      } else {
+        if (!angular.isObject($translationTable[langKey])) {
+          $translationTable[langKey] = {};
+        }
+        angular.extend($translationTable[langKey], 
flatObject(translationTable));
+      }
+      return this;
+    };
+    this.translations = translations;
+    this.cloakClassName = function (name) {
+      if (!name) {
+        return $cloakClassName;
+      }
+      $cloakClassName = name;
+      return this;
+    };
+    var flatObject = function (data, path, result, prevKey) {
+      var key, keyWithPath, keyWithShortPath, val;
+      if (!path) {
+        path = [];
+      }
+      if (!result) {
+        result = {};
+      }
+      for (key in data) {
+        if (!data.hasOwnProperty(key)) {
+          continue;
+        }
+        val = data[key];
+        if (angular.isObject(val)) {
+          flatObject(val, path.concat(key), result, key);
+        } else {
+          keyWithPath = path.length ? '' + path.join(NESTED_OBJECT_DELIMITER) 
+ NESTED_OBJECT_DELIMITER + key : key;
+          if (path.length && key === prevKey) {
+            keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER);
+            result[keyWithShortPath] = '@:' + keyWithPath;
+          }
+          result[keyWithPath] = val;
+        }
+      }
+      return result;
+    };
+    this.addInterpolation = function (factory) {
+      $interpolatorFactories.push(factory);
+      return this;
+    };
+    this.useMessageFormatInterpolation = function () {
+      return this.useInterpolation('$translateMessageFormatInterpolation');
+    };
+    this.useInterpolation = function (factory) {
+      $interpolationFactory = factory;
+      return this;
+    };
+    this.useSanitizeValueStrategy = function (value) {
+      $interpolationSanitizationStrategy = value;
+      return this;
+    };
+    this.preferredLanguage = function (langKey) {
+      if (langKey) {
+        $preferredLanguage = langKey;
+        return this;
+      }
+      return $preferredLanguage;
+    };
+    this.translationNotFoundIndicator = function (indicator) {
+      this.translationNotFoundIndicatorLeft(indicator);
+      this.translationNotFoundIndicatorRight(indicator);
+      return this;
+    };
+    this.translationNotFoundIndicatorLeft = function (indicator) {
+      if (!indicator) {
+        return $notFoundIndicatorLeft;
+      }
+      $notFoundIndicatorLeft = indicator;
+      return this;
+    };
+    this.translationNotFoundIndicatorRight = function (indicator) {
+      if (!indicator) {
+        return $notFoundIndicatorRight;
+      }
+      $notFoundIndicatorRight = indicator;
+      return this;
+    };
+    this.fallbackLanguage = function (langKey) {
+      fallbackStack(langKey);
+      return this;
+    };
+    var fallbackStack = function (langKey) {
+      if (langKey) {
+        if (angular.isString(langKey)) {
+          $fallbackWasString = true;
+          $fallbackLanguage = [langKey];
+        } else if (angular.isArray(langKey)) {
+          $fallbackWasString = false;
+          $fallbackLanguage = langKey;
+        }
+        if (angular.isString($preferredLanguage)) {
+          $fallbackLanguage.push($preferredLanguage);
+        }
+        return this;
+      } else {
+        if ($fallbackWasString) {
+          return $fallbackLanguage[0];
+        } else {
+          return $fallbackLanguage;
+        }
+      }
+    };
+    this.use = function (langKey) {
+      if (langKey) {
+        if (!$translationTable[langKey] && !$loaderFactory) {
+          throw new Error('$translateProvider couldn\'t find translationTable 
for langKey: \'' + langKey + '\'');
+        }
+        $uses = langKey;
+        return this;
+      }
+      return $uses;
+    };
+    var storageKey = function (key) {
+      if (!key) {
+        if ($storagePrefix) {
+          return $storagePrefix + $storageKey;
+        }
+        return $storageKey;
+      }
+      $storageKey = key;
+    };
+    this.storageKey = storageKey;
+    this.useUrlLoader = function (url) {
+      return this.useLoader('$translateUrlLoader', { url: url });
+    };
+    this.useStaticFilesLoader = function (options) {
+      return this.useLoader('$translateStaticFilesLoader', options);
+    };
+    this.useLoader = function (loaderFactory, options) {
+      $loaderFactory = loaderFactory;
+      $loaderOptions = options || {};
+      return this;
+    };
+    this.useLocalStorage = function () {
+      return this.useStorage('$translateLocalStorage');
+    };
+    this.useCookieStorage = function () {
+      return this.useStorage('$translateCookieStorage');
+    };
+    this.useStorage = function (storageFactory) {
+      $storageFactory = storageFactory;
+      return this;
+    };
+    this.storagePrefix = function (prefix) {
+      if (!prefix) {
+        return prefix;
+      }
+      $storagePrefix = prefix;
+      return this;
+    };
+    this.useMissingTranslationHandlerLog = function () {
+      return 
this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog');
+    };
+    this.useMissingTranslationHandler = function (factory) {
+      $missingTranslationHandlerFactory = factory;
+      return this;
+    };
+    this.usePostCompiling = function (value) {
+      $postCompilingEnabled = !!value;
+      return this;
+    };
+    this.determinePreferredLanguage = function (fn) {
+      var locale = fn && angular.isFunction(fn) ? fn() : getLocale();
+      if (!$availableLanguageKeys.length) {
+        $preferredLanguage = locale;
+      } else {
+        $preferredLanguage = negotiateLocale(locale);
+      }
+      return this;
+    };
+    this.registerAvailableLanguageKeys = function (languageKeys, aliases) {
+      if (languageKeys) {
+        $availableLanguageKeys = languageKeys;
+        if (aliases) {
+          $languageKeyAliases = aliases;
+        }
+        return this;
+      }
+      return $availableLanguageKeys;
+    };
+    this.$get = [
+      '$log',
+      '$injector',
+      '$rootScope',
+      '$q',
+      function ($log, $injector, $rootScope, $q) {
+        var Storage, defaultInterpolator = $injector.get($interpolationFactory 
|| '$translateDefaultInterpolation'), pendingLoader = false, 
interpolatorHashMap = {}, langPromises = {}, fallbackIndex, 
startFallbackIteration;
+        var $translate = function (translationId, interpolateParams, 
interpolationId) {
+          if (angular.isArray(translationId)) {
+            var translateAll = function (translationIds) {
+              var results = {};
+              var promises = [];
+              var translate = function (translationId) {
+                var deferred = $q.defer();
+                var regardless = function (value) {
+                  results[translationId] = value;
+                  deferred.resolve([
+                    translationId,
+                    value
+                  ]);
+                };
+                $translate(translationId, interpolateParams, 
interpolationId).then(regardless, regardless);
+                return deferred.promise;
+              };
+              for (var i = 0, c = translationIds.length; i < c; i++) {
+                promises.push(translate(translationIds[i]));
+              }
+              return $q.all(promises).then(function () {
+                return results;
+              });
+            };
+            return translateAll(translationId);
+          }
+          var deferred = $q.defer();
+          if (translationId) {
+            translationId = translationId.trim();
+          }
+          var promiseToWaitFor = function () {
+              var promise = $preferredLanguage ? 
langPromises[$preferredLanguage] : langPromises[$uses];
+              fallbackIndex = 0;
+              if ($storageFactory && !promise) {
+                var langKey = Storage.get($storageKey);
+                promise = langPromises[langKey];
+                if ($fallbackLanguage && $fallbackLanguage.length) {
+                  var index = indexOf($fallbackLanguage, langKey);
+                  fallbackIndex = index > -1 ? index += 1 : 0;
+                  $fallbackLanguage.push($preferredLanguage);
+                }
+              }
+              return promise;
+            }();
+          if (!promiseToWaitFor) {
+            determineTranslation(translationId, interpolateParams, 
interpolationId).then(deferred.resolve, deferred.reject);
+          } else {
+            promiseToWaitFor.then(function () {
+              determineTranslation(translationId, interpolateParams, 
interpolationId).then(deferred.resolve, deferred.reject);
+            }, deferred.reject);
+          }
+          return deferred.promise;
+        };
+        var indexOf = function (array, searchElement) {
+          for (var i = 0, len = array.length; i < len; i++) {
+            if (array[i] === searchElement) {
+              return i;
+            }
+          }
+          return -1;
+        };
+        var applyNotFoundIndicators = function (translationId) {
+          if ($notFoundIndicatorLeft) {
+            translationId = [
+              $notFoundIndicatorLeft,
+              translationId
+            ].join(' ');
+          }
+          if ($notFoundIndicatorRight) {
+            translationId = [
+              translationId,
+              $notFoundIndicatorRight
+            ].join(' ');
+          }
+          return translationId;
+        };
+        var useLanguage = function (key) {
+          $uses = key;
+          $rootScope.$emit('$translateChangeSuccess');
+          if ($storageFactory) {
+            Storage.set($translate.storageKey(), $uses);
+          }
+          defaultInterpolator.setLocale($uses);
+          angular.forEach(interpolatorHashMap, function (interpolator, id) {
+            interpolatorHashMap[id].setLocale($uses);
+          });
+          $rootScope.$emit('$translateChangeEnd');
+        };
+        var loadAsync = function (key) {
+          if (!key) {
+            throw 'No language key specified for loading.';
+          }
+          var deferred = $q.defer();
+          $rootScope.$emit('$translateLoadingStart');
+          pendingLoader = true;
+          $injector.get($loaderFactory)(angular.extend($loaderOptions, { key: 
key })).then(function (data) {
+            var translationTable = {};
+            $rootScope.$emit('$translateLoadingSuccess');
+            if (angular.isArray(data)) {
+              angular.forEach(data, function (table) {
+                angular.extend(translationTable, flatObject(table));
+              });
+            } else {
+              angular.extend(translationTable, flatObject(data));
+            }
+            pendingLoader = false;
+            deferred.resolve({
+              key: key,
+              table: translationTable
+            });
+            $rootScope.$emit('$translateLoadingEnd');
+          }, function (key) {
+            $rootScope.$emit('$translateLoadingError');
+            deferred.reject(key);
+            $rootScope.$emit('$translateLoadingEnd');
+          });
+          return deferred.promise;
+        };
+        if ($storageFactory) {
+          Storage = $injector.get($storageFactory);
+          if (!Storage.get || !Storage.set) {
+            throw new Error('Couldn\'t use storage \'' + $storageFactory + 
'\', missing get() or set() method!');
+          }
+        }
+        if (angular.isFunction(defaultInterpolator.useSanitizeValueStrategy)) {
+          
defaultInterpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy);
+        }
+        if ($interpolatorFactories.length) {
+          angular.forEach($interpolatorFactories, function 
(interpolatorFactory) {
+            var interpolator = $injector.get(interpolatorFactory);
+            interpolator.setLocale($preferredLanguage || $uses);
+            if (angular.isFunction(interpolator.useSanitizeValueStrategy)) {
+              
interpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy);
+            }
+            interpolatorHashMap[interpolator.getInterpolationIdentifier()] = 
interpolator;
+          });
+        }
+        var getTranslationTable = function (langKey) {
+          var deferred = $q.defer();
+          if ($translationTable.hasOwnProperty(langKey)) {
+            deferred.resolve($translationTable[langKey]);
+            return deferred.promise;
+          } else {
+            langPromises[langKey].then(function (data) {
+              translations(data.key, data.table);
+              deferred.resolve(data.table);
+            }, deferred.reject);
+          }
+          return deferred.promise;
+        };
+        var getFallbackTranslation = function (langKey, translationId, 
interpolateParams, Interpolator) {
+          var deferred = $q.defer();
+          getTranslationTable(langKey).then(function (translationTable) {
+            if (translationTable.hasOwnProperty(translationId)) {
+              Interpolator.setLocale(langKey);
+              
deferred.resolve(Interpolator.interpolate(translationTable[translationId], 
interpolateParams));
+              Interpolator.setLocale($uses);
+            } else {
+              deferred.reject();
+            }
+          }, deferred.reject);
+          return deferred.promise;
+        };
+        var getFallbackTranslationInstant = function (langKey, translationId, 
interpolateParams, Interpolator) {
+          var result, translationTable = $translationTable[langKey];
+          if (translationTable.hasOwnProperty(translationId)) {
+            Interpolator.setLocale(langKey);
+            result = Interpolator.interpolate(translationTable[translationId], 
interpolateParams);
+            Interpolator.setLocale($uses);
+          }
+          return result;
+        };
+        var resolveForFallbackLanguage = function (fallbackLanguageIndex, 
translationId, interpolateParams, Interpolator) {
+          var deferred = $q.defer();
+          if (fallbackLanguageIndex < $fallbackLanguage.length) {
+            var langKey = $fallbackLanguage[fallbackLanguageIndex];
+            getFallbackTranslation(langKey, translationId, interpolateParams, 
Interpolator).then(function (translation) {
+              deferred.resolve(translation);
+            }, function () {
+              var nextFallbackLanguagePromise = 
resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, 
interpolateParams, Interpolator);
+              deferred.resolve(nextFallbackLanguagePromise);
+            });
+          } else {
+            if ($missingTranslationHandlerFactory) {
+              var resultString = 
$injector.get($missingTranslationHandlerFactory)(translationId, $uses);
+              if (resultString !== undefined) {
+                deferred.resolve(resultString);
+              } else {
+                deferred.resolve(translationId);
+              }
+            } else {
+              deferred.resolve(translationId);
+            }
+          }
+          return deferred.promise;
+        };
+        var resolveForFallbackLanguageInstant = function 
(fallbackLanguageIndex, translationId, interpolateParams, Interpolator) {
+          var result;
+          if (fallbackLanguageIndex < $fallbackLanguage.length) {
+            var langKey = $fallbackLanguage[fallbackLanguageIndex];
+            result = getFallbackTranslationInstant(langKey, translationId, 
interpolateParams, Interpolator);
+            if (!result) {
+              result = resolveForFallbackLanguageInstant(fallbackLanguageIndex 
+ 1, translationId, interpolateParams, Interpolator);
+            }
+          }
+          return result;
+        };
+        var fallbackTranslation = function (translationId, interpolateParams, 
Interpolator) {
+          return resolveForFallbackLanguage(startFallbackIteration > 0 ? 
startFallbackIteration : fallbackIndex, translationId, interpolateParams, 
Interpolator);
+        };
+        var fallbackTranslationInstant = function (translationId, 
interpolateParams, Interpolator) {
+          return resolveForFallbackLanguageInstant(startFallbackIteration > 0 
? startFallbackIteration : fallbackIndex, translationId, interpolateParams, 
Interpolator);
+        };
+        var determineTranslation = function (translationId, interpolateParams, 
interpolationId) {
+          var deferred = $q.defer();
+          var table = $uses ? $translationTable[$uses] : $translationTable, 
Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : 
defaultInterpolator;
+          if (table && table.hasOwnProperty(translationId)) {
+            var translation = table[translationId];
+            if (translation.substr(0, 2) === '@:') {
+              $translate(translation.substr(2), interpolateParams, 
interpolationId).then(deferred.resolve, deferred.reject);
+            } else {
+              deferred.resolve(Interpolator.interpolate(translation, 
interpolateParams));
+            }
+          } else {
+            if ($missingTranslationHandlerFactory && !pendingLoader) {
+              $injector.get($missingTranslationHandlerFactory)(translationId, 
$uses);
+            }
+            if ($uses && $fallbackLanguage && $fallbackLanguage.length) {
+              fallbackTranslation(translationId, interpolateParams, 
Interpolator).then(function (translation) {
+                deferred.resolve(translation);
+              }, function (_translationId) {
+                deferred.reject(applyNotFoundIndicators(_translationId));
+              });
+            } else {
+              deferred.reject(applyNotFoundIndicators(translationId));
+            }
+          }
+          return deferred.promise;
+        };
+        var determineTranslationInstant = function (translationId, 
interpolateParams, interpolationId) {
+          var result, table = $uses ? $translationTable[$uses] : 
$translationTable, Interpolator = interpolationId ? 
interpolatorHashMap[interpolationId] : defaultInterpolator;
+          if (table && table.hasOwnProperty(translationId)) {
+            var translation = table[translationId];
+            if (translation.substr(0, 2) === '@:') {
+              result = determineTranslationInstant(translation.substr(2), 
interpolateParams, interpolationId);
+            } else {
+              result = Interpolator.interpolate(translation, 
interpolateParams);
+            }
+          } else {
+            if ($missingTranslationHandlerFactory && !pendingLoader) {
+              $injector.get($missingTranslationHandlerFactory)(translationId, 
$uses);
+            }
+            if ($uses && $fallbackLanguage && $fallbackLanguage.length) {
+              fallbackIndex = 0;
+              result = fallbackTranslationInstant(translationId, 
interpolateParams, Interpolator);
+            } else {
+              result = applyNotFoundIndicators(translationId);
+            }
+          }
+          return result;
+        };
+        $translate.preferredLanguage = function () {
+          return $preferredLanguage;
+        };
+        $translate.cloakClassName = function () {
+          return $cloakClassName;
+        };
+        $translate.fallbackLanguage = function (langKey) {
+          if (langKey !== undefined && langKey !== null) {
+            fallbackStack(langKey);
+            if ($loaderFactory) {
+              if ($fallbackLanguage && $fallbackLanguage.length) {
+                for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {
+                  if (!langPromises[$fallbackLanguage[i]]) {
+                    langPromises[$fallbackLanguage[i]] = 
loadAsync($fallbackLanguage[i]);
+                  }
+                }
+              }
+            }
+            $translate.use($translate.use());
+          }
+          if ($fallbackWasString) {
+            return $fallbackLanguage[0];
+          } else {
+            return $fallbackLanguage;
+          }
+        };
+        $translate.useFallbackLanguage = function (langKey) {
+          if (langKey !== undefined && langKey !== null) {
+            if (!langKey) {
+              startFallbackIteration = 0;
+            } else {
+              var langKeyPosition = indexOf($fallbackLanguage, langKey);
+              if (langKeyPosition > -1) {
+                startFallbackIteration = langKeyPosition;
+              }
+            }
+          }
+        };
+        $translate.proposedLanguage = function () {
+          return $nextLang;
+        };
+        $translate.storage = function () {
+          return Storage;
+        };
+        $translate.use = function (key) {
+          if (!key) {
+            return $uses;
+          }
+          var deferred = $q.defer();
+          $rootScope.$emit('$translateChangeStart');
+          var aliasedKey = negotiateLocale(key);
+          if (aliasedKey) {
+            key = aliasedKey;
+          }
+          if (!$translationTable[key] && $loaderFactory) {
+            $nextLang = key;
+            langPromises[key] = loadAsync(key).then(function (translation) {
+              translations(translation.key, translation.table);
+              deferred.resolve(translation.key);
+              if ($nextLang === key) {
+                useLanguage(translation.key);
+                $nextLang = undefined;
+              }
+            }, function (key) {
+              $nextLang = undefined;
+              $rootScope.$emit('$translateChangeError');
+              deferred.reject(key);
+              $rootScope.$emit('$translateChangeEnd');
+            });
+          } else {
+            deferred.resolve(key);
+            useLanguage(key);
+          }
+          return deferred.promise;
+        };
+        $translate.storageKey = function () {
+          return storageKey();
+        };
+        $translate.isPostCompilingEnabled = function () {
+          return $postCompilingEnabled;
+        };
+        $translate.refresh = function (langKey) {
+          if (!$loaderFactory) {
+            throw new Error('Couldn\'t refresh translation table, no loader 
registered!');
+          }
+          var deferred = $q.defer();
+          function resolve() {
+            deferred.resolve();
+            $rootScope.$emit('$translateRefreshEnd');
+          }
+          function reject() {
+            deferred.reject();
+            $rootScope.$emit('$translateRefreshEnd');
+          }
+          $rootScope.$emit('$translateRefreshStart');
+          if (!langKey) {
+            var tables = [];
+            if ($fallbackLanguage && $fallbackLanguage.length) {
+              for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {
+                tables.push(loadAsync($fallbackLanguage[i]));
+              }
+            }
+            if ($uses) {
+              tables.push(loadAsync($uses));
+            }
+            $q.all(tables).then(function (tableData) {
+              angular.forEach(tableData, function (data) {
+                if ($translationTable[data.key]) {
+                  delete $translationTable[data.key];
+                }
+                translations(data.key, data.table);
+              });
+              if ($uses) {
+                useLanguage($uses);
+              }
+              resolve();
+            });
+          } else if ($translationTable[langKey]) {
+            loadAsync(langKey).then(function (data) {
+              translations(data.key, data.table);
+              if (langKey === $uses) {
+                useLanguage($uses);
+              }
+              resolve();
+            }, reject);
+          } else {
+            reject();
+          }
+          return deferred.promise;
+        };
+        $translate.instant = function (translationId, interpolateParams, 
interpolationId) {
+          if (translationId === null || angular.isUndefined(translationId)) {
+            return translationId;
+          }
+          if (angular.isArray(translationId)) {
+            var results = {};
+            for (var i = 0, c = translationId.length; i < c; i++) {
+              results[translationId[i]] = $translate.instant(translationId[i], 
interpolateParams, interpolationId);
+            }
+            return results;
+          }
+          if (angular.isString(translationId) && translationId.length < 1) {
+            return translationId;
+          }
+          if (translationId) {
+            translationId = translationId.trim();
+          }
+          var result, possibleLangKeys = [];
+          if ($preferredLanguage) {
+            possibleLangKeys.push($preferredLanguage);
+          }
+          if ($uses) {
+            possibleLangKeys.push($uses);
+          }
+          if ($fallbackLanguage && $fallbackLanguage.length) {
+            possibleLangKeys = possibleLangKeys.concat($fallbackLanguage);
+          }
+          for (var j = 0, d = possibleLangKeys.length; j < d; j++) {
+            var possibleLangKey = possibleLangKeys[j];
+            if ($translationTable[possibleLangKey]) {
+              if (typeof $translationTable[possibleLangKey][translationId] !== 
'undefined') {
+                result = determineTranslationInstant(translationId, 
interpolateParams, interpolationId);
+              }
+            }
+            if (typeof result !== 'undefined') {
+              break;
+            }
+          }
+          if (!result && result !== '') {
+            result = translationId;
+            if ($missingTranslationHandlerFactory && !pendingLoader) {
+              $injector.get($missingTranslationHandlerFactory)(translationId, 
$uses);
+            }
+          }
+          return result;
+        };
+        if ($loaderFactory) {
+          if (angular.equals($translationTable, {})) {
+            $translate.use($translate.use());
+          }
+          if ($fallbackLanguage && $fallbackLanguage.length) {
+            for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {
+              langPromises[$fallbackLanguage[i]] = 
loadAsync($fallbackLanguage[i]);
+            }
+          }
+        }
+        return $translate;
+      }
+    ];
+  }
+]);
+angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation',
 [
+  '$interpolate',
+  function ($interpolate) {
+    var $translateInterpolator = {}, $locale, $identifier = 'default', 
$sanitizeValueStrategy = null, sanitizeValueStrategies = {
+        escaped: function (params) {
+          var result = {};
+          for (var key in params) {
+            if (params.hasOwnProperty(key)) {
+              result[key] = 
angular.element('<div></div>').text(params[key]).html();
+            }
+          }
+          return result;
+        }
+      };
+    var sanitizeParams = function (params) {
+      var result;
+      if (angular.isFunction(sanitizeValueStrategies[$sanitizeValueStrategy])) 
{
+        result = sanitizeValueStrategies[$sanitizeValueStrategy](params);
+      } else {
+        result = params;
+      }
+      return result;
+    };
+    $translateInterpolator.setLocale = function (locale) {
+      $locale = locale;
+    };
+    $translateInterpolator.getInterpolationIdentifier = function () {
+      return $identifier;
+    };
+    $translateInterpolator.useSanitizeValueStrategy = function (value) {
+      $sanitizeValueStrategy = value;
+      return this;
+    };
+    $translateInterpolator.interpolate = function (string, interpolateParams) {
+      if ($sanitizeValueStrategy) {
+        interpolateParams = sanitizeParams(interpolateParams);
+      }
+      return $interpolate(string)(interpolateParams || {});
+    };
+    return $translateInterpolator;
+  }
+]);
+angular.module('pascalprecht.translate').constant('$STORAGE_KEY', 
'NG_TRANSLATE_LANG_KEY');
+angular.module('pascalprecht.translate').directive('translate', [
+  '$translate',
+  '$q',
+  '$interpolate',
+  '$compile',
+  '$parse',
+  '$rootScope',
+  function ($translate, $q, $interpolate, $compile, $parse, $rootScope) {
+    return {
+      restrict: 'AE',
+      scope: true,
+      compile: function (tElement, tAttr) {
+        var translateValuesExist = tAttr.translateValues ? 
tAttr.translateValues : undefined;
+        var translateInterpolation = tAttr.translateInterpolation ? 
tAttr.translateInterpolation : undefined;
+        var translateValueExist = 
tElement[0].outerHTML.match(/translate-value-+/i);
+        return function linkFn(scope, iElement, iAttr) {
+          scope.interpolateParams = {};
+          iAttr.$observe('translate', function (translationId) {
+            if (angular.equals(translationId, '') || 
!angular.isDefined(translationId)) {
+              scope.translationId = 
$interpolate(iElement.text().replace(/^\s+|\s+$/g, ''))(scope.$parent);
+            } else {
+              scope.translationId = translationId;
+            }
+          });
+          iAttr.$observe('translateDefault', function (value) {
+            scope.defaultText = value;
+          });
+          if (translateValuesExist) {
+            iAttr.$observe('translateValues', function (interpolateParams) {
+              if (interpolateParams) {
+                scope.$parent.$watch(function () {
+                  angular.extend(scope.interpolateParams, 
$parse(interpolateParams)(scope.$parent));
+                });
+              }
+            });
+          }
+          if (translateValueExist) {
+            var fn = function (attrName) {
+              iAttr.$observe(attrName, function (value) {
+                scope.interpolateParams[angular.lowercase(attrName.substr(14, 
1)) + attrName.substr(15)] = value;
+              });
+            };
+            for (var attr in iAttr) {
+              if (iAttr.hasOwnProperty(attr) && attr.substr(0, 14) === 
'translateValue' && attr !== 'translateValues') {
+                fn(attr);
+              }
+            }
+          }
+          var applyElementContent = function (value, scope, successful) {
+            if (!successful && typeof scope.defaultText !== 'undefined') {
+              value = scope.defaultText;
+            }
+            iElement.html(value);
+            var globallyEnabled = $translate.isPostCompilingEnabled();
+            var locallyDefined = typeof tAttr.translateCompile !== 'undefined';
+            var locallyEnabled = locallyDefined && tAttr.translateCompile !== 
'false';
+            if (globallyEnabled && !locallyDefined || locallyEnabled) {
+              $compile(iElement.contents())(scope);
+            }
+          };
+          var updateTranslationFn = function () {
+              if (!translateValuesExist && !translateValueExist) {
+                return function () {
+                  var unwatch = scope.$watch('translationId', function (value) 
{
+                      if (scope.translationId && value) {
+                        $translate(value, {}, 
translateInterpolation).then(function (translation) {
+                          applyElementContent(translation, scope, true);
+                          unwatch();
+                        }, function (translationId) {
+                          applyElementContent(translationId, scope, false);
+                          unwatch();
+                        });
+                      }
+                    }, true);
+                };
+              } else {
+                return function () {
+                  var updateTranslations = function () {
+                    if (scope.translationId && scope.interpolateParams) {
+                      $translate(scope.translationId, scope.interpolateParams, 
translateInterpolation).then(function (translation) {
+                        applyElementContent(translation, scope, true);
+                      }, function (translationId) {
+                        applyElementContent(translationId, scope, false);
+                      });
+                    }
+                  };
+                  scope.$watch('interpolateParams', updateTranslations, true);
+                  scope.$watch('translationId', updateTranslations);
+                };
+              }
+            }();
+          var unbind = $rootScope.$on('$translateChangeSuccess', 
updateTranslationFn);
+          updateTranslationFn();
+          scope.$on('$destroy', unbind);
+        };
+      }
+    };
+  }
+]);
+angular.module('pascalprecht.translate').directive('translateCloak', [
+  '$rootScope',
+  '$translate',
+  function ($rootScope, $translate) {
+    return {
+      compile: function (tElement) {
+        $rootScope.$on('$translateLoadingSuccess', function () {
+          tElement.removeClass($translate.cloakClassName());
+        });
+        tElement.addClass($translate.cloakClassName());
+      }
+    };
+  }
+]);
+angular.module('pascalprecht.translate').filter('translate', [
+  '$parse',
+  '$translate',
+  function ($parse, $translate) {
+    return function (translationId, interpolateParams, interpolation) {
+      if (!angular.isObject(interpolateParams)) {
+        interpolateParams = $parse(interpolateParams)(this);
+      }
+      return $translate.instant(translationId, interpolateParams, 
interpolation);
+    };
+  }
+]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/12342668/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.min.js
----------------------------------------------------------------------
diff --git 
a/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.min.js
 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.min.js
new file mode 100644
index 0000000..b160cb2
--- /dev/null
+++ 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/angular-translate.min.js
@@ -0,0 +1,6 @@
+/*!
+ * angular-translate - v2.2.0 - 2014-06-03
+ * http://github.com/PascalPrecht/angular-translate
+ * Copyright (c) 2014 ; Licensed MIT
+ */
+angular.module("pascalprecht.translate",["ng"]).run(["$translate",function(a){var
 
b=a.storageKey(),c=a.storage();c?c.get(b)?a.use(c.get(b)):angular.isString(a.preferredLanguage())?a.use(a.preferredLanguage()):c.set(b,a.use()):angular.isString(a.preferredLanguage())&&a.use(a.preferredLanguage())}]),angular.module("pascalprecht.translate").provider("$translate",["$STORAGE_KEY",function(a){var
 
b,c,d,e,f,g,h,i,j,k,l,m,n,o,p={},q=[],r=a,s=[],t=!1,u="translate-cloak",v=!1,w=".",x=function(){var
 
a=window.navigator;return(a.language||a.browserLanguage||a.systemLanguage||a.userLanguage||"").split("-").join("_")},y=function(a){for(var
 
b=[],d=angular.lowercase(a),e=0,f=q.length;f>e;e++)b.push(angular.lowercase(q[e]));if(b.indexOf(d)>-1)return
 a;if(c){var g;for(var h in c){var 
i=!1,j=c.hasOwnProperty(h)&&angular.lowercase(h)===angular.lowercase(a);if("*"===h.slice(-1)&&(i=h.slice(0,-1)===a.slice(0,h.length-1)),(j||i)&&(g=c[h],b.indexOf(angular.lowercase(g))>-1))return
 g}}var k=a.split("_");retu
 rn 
k.length>1&&b.indexOf(angular.lowercase(k[0]))>-1?k[0]:a},z=function(a,b){if(!a&&!b)return
 p;if(a&&!b){if(angular.isString(a))return p[a]}else 
angular.isObject(p[a])||(p[a]={}),angular.extend(p[a],A(b));return 
this};this.translations=z,this.cloakClassName=function(a){return 
a?(u=a,this):u};var A=function(a,b,c,d){var e,f,g,h;b||(b=[]),c||(c={});for(e 
in 
a)a.hasOwnProperty(e)&&(h=a[e],angular.isObject(h)?A(h,b.concat(e),c,e):(f=b.length?""+b.join(w)+w+e:e,b.length&&e===d&&(g=""+b.join(w),c[g]="@:"+f),c[f]=h));return
 c};this.addInterpolation=function(a){return 
s.push(a),this},this.useMessageFormatInterpolation=function(){return 
this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return
 k=a,this},this.useSanitizeValueStrategy=function(a){return 
t=a,this},this.preferredLanguage=function(a){return 
a?(b=a,this):b},this.translationNotFoundIndicator=function(a){return 
this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRi
 ght(a),this},this.translationNotFoundIndicatorLeft=function(a){return 
a?(n=a,this):n},this.translationNotFoundIndicatorRight=function(a){return 
a?(o=a,this):o},this.fallbackLanguage=function(a){return B(a),this};var 
B=function(a){return 
a?(angular.isString(a)?(e=!0,d=[a]):angular.isArray(a)&&(e=!1,d=a),angular.isString(b)&&d.push(b),this):e?d[0]:d};this.use=function(a){if(a){if(!p[a]&&!l)throw
 new Error("$translateProvider couldn't find translationTable for langKey: 
'"+a+"'");return f=a,this}return f};var C=function(a){return a?(r=a,void 
0):i?i+r:r};this.storageKey=C,this.useUrlLoader=function(a){return 
this.useLoader("$translateUrlLoader",{url:a})},this.useStaticFilesLoader=function(a){return
 
this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return
 l=a,m=b||{},this},this.useLocalStorage=function(){return 
this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return
 this.useStorage("$translateCookieStorage")},this.useStorage=function(
 a){return h=a,this},this.storagePrefix=function(a){return 
a?(i=a,this):a},this.useMissingTranslationHandlerLog=function(){return 
this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return
 j=a,this},this.usePostCompiling=function(a){return 
v=!!a,this},this.determinePreferredLanguage=function(a){var 
c=a&&angular.isFunction(a)?a():x();return 
b=q.length?y(c):c,this},this.registerAvailableLanguageKeys=function(a,b){return 
a?(q=a,b&&(c=b),this):q},this.$get=["$log","$injector","$rootScope","$q",function(a,c,i,q){var
 
w,x,D,E=c.get(k||"$translateDefaultInterpolation"),F=!1,G={},H={},I=function(a,c,e){if(angular.isArray(a)){var
 g=function(a){for(var b={},d=[],f=function(a){var 
d=q.defer(),f=function(c){b[a]=c,d.resolve([a,c])};return 
I(a,c,e).then(f,f),d.promise},g=0,h=a.length;h>g;g++)d.push(f(a[g]));return 
q.all(d).then(function(){return b})};return g(a)}var 
i=q.defer();a&&(a=a.trim());var j=function(){var a=b?H[b]:H[f]
 ;if(x=0,h&&!a){var c=w.get(r);if(a=H[c],d&&d.length){var 
e=J(d,c);x=e>-1?e+=1:0,d.push(b)}}return a}();return 
j?j.then(function(){U(a,c,e).then(i.resolve,i.reject)},i.reject):U(a,c,e).then(i.resolve,i.reject),i.promise},J=function(a,b){for(var
 c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K=function(a){return 
n&&(a=[n,a].join(" ")),o&&(a=[a,o].join(" 
")),a},L=function(a){f=a,i.$emit("$translateChangeSuccess"),h&&w.set(I.storageKey(),f),E.setLocale(f),angular.forEach(G,function(a,b){G[b].setLocale(f)}),i.$emit("$translateChangeEnd")},M=function(a){if(!a)throw"No
 language key specified for loading.";var b=q.defer();return 
i.$emit("$translateLoadingStart"),F=!0,c.get(l)(angular.extend(m,{key:a})).then(function(c){var
 
d={};i.$emit("$translateLoadingSuccess"),angular.isArray(c)?angular.forEach(c,function(a){angular.extend(d,A(a))}):angular.extend(d,A(c)),F=!1,b.resolve({key:a,table:d}),i.$emit("$translateLoadingEnd")},function(a){i.$emit("$translateLoadingError"),b.reject(a),i.$e
 
mit("$translateLoadingEnd")}),b.promise};if(h&&(w=c.get(h),!w.get||!w.set))throw
 new Error("Couldn't use storage '"+h+"', missing get() or set() 
method!");angular.isFunction(E.useSanitizeValueStrategy)&&E.useSanitizeValueStrategy(t),s.length&&angular.forEach(s,function(a){var
 
d=c.get(a);d.setLocale(b||f),angular.isFunction(d.useSanitizeValueStrategy)&&d.useSanitizeValueStrategy(t),G[d.getInterpolationIdentifier()]=d});var
 N=function(a){var b=q.defer();return 
p.hasOwnProperty(a)?(b.resolve(p[a]),b.promise):(H[a].then(function(a){z(a.key,a.table),b.resolve(a.table)},b.reject),b.promise)},O=function(a,b,c,d){var
 e=q.defer();return 
N(a).then(function(g){g.hasOwnProperty(b)?(d.setLocale(a),e.resolve(d.interpolate(g[b],c)),d.setLocale(f)):e.reject()},e.reject),e.promise},P=function(a,b,c,d){var
 e,g=p[a];return 
g.hasOwnProperty(b)&&(d.setLocale(a),e=d.interpolate(g[b],c),d.setLocale(f)),e},Q=function(a,b,e,g){var
 h=q.defer();if(a<d.length){var i=d[a];O(i,b,e,g).then(function(a){h.resolve(a
 )},function(){var c=Q(a+1,b,e,g);h.resolve(c)})}else if(j){var 
k=c.get(j)(b,f);void 0!==k?h.resolve(k):h.resolve(b)}else h.resolve(b);return 
h.promise},R=function(a,b,c,e){var f;if(a<d.length){var 
g=d[a];f=P(g,b,c,e),f||(f=R(a+1,b,c,e))}return f},S=function(a,b,c){return 
Q(D>0?D:x,a,b,c)},T=function(a,b,c){return 
R(D>0?D:x,a,b,c)},U=function(a,b,e){var 
g=q.defer(),h=f?p[f]:p,i=e?G[e]:E;if(h&&h.hasOwnProperty(a)){var 
k=h[a];"@:"===k.substr(0,2)?I(k.substr(2),b,e).then(g.resolve,g.reject):g.resolve(i.interpolate(k,b))}else
 
j&&!F&&c.get(j)(a,f),f&&d&&d.length?S(a,b,i).then(function(a){g.resolve(a)},function(a){g.reject(K(a))}):g.reject(K(a));return
 g.promise},V=function(a,b,e){var 
g,h=f?p[f]:p,i=e?G[e]:E;if(h&&h.hasOwnProperty(a)){var 
k=h[a];g="@:"===k.substr(0,2)?V(k.substr(2),b,e):i.interpolate(k,b)}else 
j&&!F&&c.get(j)(a,f),f&&d&&d.length?(x=0,g=T(a,b,i)):g=K(a);return 
g};if(I.preferredLanguage=function(){return 
b},I.cloakClassName=function(){return u},I.fallbackLanguage=function(a)
 {if(void 0!==a&&null!==a){if(B(a),l&&d&&d.length)for(var 
b=0,c=d.length;c>b;b++)H[d[b]]||(H[d[b]]=M(d[b]));I.use(I.use())}return 
e?d[0]:d},I.useFallbackLanguage=function(a){if(void 0!==a&&null!==a)if(a){var 
b=J(d,a);b>-1&&(D=b)}else D=0},I.proposedLanguage=function(){return 
g},I.storage=function(){return w},I.use=function(a){if(!a)return f;var 
b=q.defer();i.$emit("$translateChangeStart");var c=y(a);return 
c&&(a=c),!p[a]&&l?(g=a,H[a]=M(a).then(function(c){z(c.key,c.table),b.resolve(c.key),g===a&&(L(c.key),g=void
 0)},function(a){g=void 
0,i.$emit("$translateChangeError"),b.reject(a),i.$emit("$translateChangeEnd")})):(b.resolve(a),L(a)),b.promise},I.storageKey=function(){return
 C()},I.isPostCompilingEnabled=function(){return 
v},I.refresh=function(a){function 
b(){e.resolve(),i.$emit("$translateRefreshEnd")}function 
c(){e.reject(),i.$emit("$translateRefreshEnd")}if(!l)throw new Error("Couldn't 
refresh translation table, no loader registered!");var 
e=q.defer();if(i.$emit("$translateRefresh
 
Start"),a)p[a]?M(a).then(function(c){z(c.key,c.table),a===f&&L(f),b()},c):c();else{var
 g=[];if(d&&d.length)for(var 
h=0,j=d.length;j>h;h++)g.push(M(d[h]));f&&g.push(M(f)),q.all(g).then(function(a){angular.forEach(a,function(a){p[a.key]&&delete
 p[a.key],z(a.key,a.table)}),f&&L(f),b()})}return 
e.promise},I.instant=function(a,e,g){if(null===a||angular.isUndefined(a))return 
a;if(angular.isArray(a)){for(var 
h={},i=0,k=a.length;k>i;i++)h[a[i]]=I.instant(a[i],e,g);return 
h}if(angular.isString(a)&&a.length<1)return a;a&&(a=a.trim());var 
l,m=[];b&&m.push(b),f&&m.push(f),d&&d.length&&(m=m.concat(d));for(var 
n=0,o=m.length;o>n;n++){var q=m[n];if(p[q]&&"undefined"!=typeof 
p[q][a]&&(l=V(a,e,g)),"undefined"!=typeof l)break}return 
l||""===l||(l=a,j&&!F&&c.get(j)(a,f)),l},l&&(angular.equals(p,{})&&I.use(I.use()),d&&d.length))for(var
 W=0,X=d.length;X>W;W++)H[d[W]]=M(d[W]);return 
I}]}]),angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",["$interpolate",function(a){var
 b,
 c={},d="default",e=null,f={escaped:function(a){var b={};for(var c in 
a)a.hasOwnProperty(c)&&(b[c]=angular.element("<div></div>").text(a[c]).html());return
 b}},g=function(a){var b;return b=angular.isFunction(f[e])?f[e](a):a};return 
c.setLocale=function(a){b=a},c.getInterpolationIdentifier=function(){return 
d},c.useSanitizeValueStrategy=function(a){return 
e=a,this},c.interpolate=function(b,c){return 
e&&(c=g(c)),a(b)(c||{})},c}]),angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",["$translate","$q","$interpolate","$compile","$parse","$rootScope",function(a,b,c,d,e,f){return{restrict:"AE",scope:!0,compile:function(b,g){var
 h=g.translateValues?g.translateValues:void 
0,i=g.translateInterpolation?g.translateInterpolation:void 
0,j=b[0].outerHTML.match(/translate-value-+/i);return 
function(b,k,l){if(b.interpolateParams={},l.$observe("translate",function(a){b.translationId=angular.equals(a,""
 
)||!angular.isDefined(a)?c(k.text().replace(/^\s+|\s+$/g,""))(b.$parent):a}),l.$observe("translateDefault",function(a){b.defaultText=a}),h&&l.$observe("translateValues",function(a){a&&b.$parent.$watch(function(){angular.extend(b.interpolateParams,e(a)(b.$parent))})}),j){var
 
m=function(a){l.$observe(a,function(c){b.interpolateParams[angular.lowercase(a.substr(14,1))+a.substr(15)]=c})};for(var
 n in 
l)l.hasOwnProperty(n)&&"translateValue"===n.substr(0,14)&&"translateValues"!==n&&m(n)}var
 o=function(b,c,e){e||"undefined"==typeof 
c.defaultText||(b=c.defaultText),k.html(b);var 
f=a.isPostCompilingEnabled(),h="undefined"!=typeof 
g.translateCompile,i=h&&"false"!==g.translateCompile;(f&&!h||i)&&d(k.contents())(c)},p=function(){return
 h||j?function(){var 
c=function(){b.translationId&&b.interpolateParams&&a(b.translationId,b.interpolateParams,i).then(function(a){o(a,b,!0)},function(a){o(a,b,!1)})};b.$watch("interpolateParams",c,!0),b.$watch("translationId",c)}:function(){var
 c=b.$watch("transla
 
tionId",function(d){b.translationId&&d&&a(d,{},i).then(function(a){o(a,b,!0),c()},function(a){o(a,b,!1),c()})},!0)}}(),q=f.$on("$translateChangeSuccess",p);p(),b.$on("$destroy",q)}}}}]),angular.module("pascalprecht.translate").directive("translateCloak",["$rootScope","$translate",function(a,b){return{compile:function(c){a.$on("$translateLoadingSuccess",function(){c.removeClass(b.cloakClassName())}),c.addClass(b.cloakClassName())}}}]),angular.module("pascalprecht.translate").filter("translate",["$parse","$translate",function(a,b){return
 function(c,d,e){return 
angular.isObject(d)||(d=a(d)(this)),b.instant(c,d,e)}}]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/12342668/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/bower.json
----------------------------------------------------------------------
diff --git 
a/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/bower.json
 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/bower.json
new file mode 100644
index 0000000..3dc3dab
--- /dev/null
+++ 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/angular-translate/bower.json
@@ -0,0 +1,5 @@
+{
+  "name": "angular-translate",
+  "version": "2.2.0",
+  "main": "./angular-translate.js"
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/12342668/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/mcasimir-mobile-angular-ui-be39011/.gitignore
----------------------------------------------------------------------
diff --git 
a/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/mcasimir-mobile-angular-ui-be39011/.gitignore
 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/mcasimir-mobile-angular-ui-be39011/.gitignore
new file mode 100644
index 0000000..a6d9724
--- /dev/null
+++ 
b/sandbox/mobile-app/src/main/webapp/assets/mobile/libs/mcasimir-mobile-angular-ui-be39011/.gitignore
@@ -0,0 +1,102 @@
+# Created by http://gitignore.io
+
+tmp
+
+### OSX ###
+.DS_Store
+.AppleDouble
+.LSOverride
+Icon
+
+logo.ai
+
+gh-pages
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+### Windows ###
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+### Linux ###
+.*
+!.gitignore
+!.git*
+*~
+
+
+### Eclipse ###
+*.pydevproject
+.project
+.metadata
+bin/**
+tmp/**
+tmp/**/*
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+### TextMate ###
+*.tmproj
+*.tmproject
+tmtags
+
+### SublimeText ###
+# SublimeText project files
+*.sublime-workspace
+
+### Node ###
+lib-cov
+*.seed
+*.log
+*.csv
+*.dat
+*.out
+*.pid
+*.gz
+
+pids
+logs
+results
+
+npm-debug.log
+node_modules
+
+### Bower ###
+bower_components
+
+experiments
+site/output
+site/tmp
+
+site/crash.log
+site/Gemfile.lock
\ No newline at end of file

Reply via email to