Merge branch 'master' of github.com:open-cloud/xos
diff --git a/views/ngXosViews/truckroll/bower.json b/views/ngXosViews/truckroll/bower.json
index 4eddd1e..c0f3265 100644
--- a/views/ngXosViews/truckroll/bower.json
+++ b/views/ngXosViews/truckroll/bower.json
@@ -15,6 +15,7 @@
     "tests"
   ],
   "dependencies": {
+    "angular-animate": "~1.5.0"
   },
   "devDependencies": {
     "jquery": "~2.1.4",
@@ -25,5 +26,8 @@
     "angular-resource": "~1.4.7",
     "ng-lodash": "~0.3.0",
     "bootstrap-css": "~3.3.6"
+  },
+  "resolutions": {
+    "angular": "~1.4.7"
   }
 }
diff --git a/views/ngXosViews/truckroll/env/default.js b/views/ngXosViews/truckroll/env/default.js
index d1e41fd..2236839 100644
--- a/views/ngXosViews/truckroll/env/default.js
+++ b/views/ngXosViews/truckroll/env/default.js
@@ -8,6 +8,6 @@
 
 module.exports = {
   host: 'http://apt088.apt.emulab.net:9999/',
-  xoscsrftoken: 'AcDUMSMLenXesxkAmRRfuDrrcm0nfK2R',
-  xossessionid: 'vpfim02rcpr3fcp4uf37l4ffilavr6x7'
+  xoscsrftoken: 'sBLEU3jBpCFVUSBrxZ3pFeGFV50LR1GE',
+  xossessionid: 'n73jta6yf81hrgzmmut04vuens090kfc'
 };
diff --git a/views/ngXosViews/truckroll/src/css/truckroll.css b/views/ngXosViews/truckroll/src/css/truckroll.css
index 4ff5ccf..8ac0369 100644
--- a/views/ngXosViews/truckroll/src/css/truckroll.css
+++ b/views/ngXosViews/truckroll/src/css/truckroll.css
@@ -2,6 +2,39 @@
   margin-top: 20px;
 }
 
+/* ANIMATIONS */
+.animate-vertical.ng-hide-add {
+  animation:0.5s slideOutDown ease-in-out;
+}
+.animate-vertical.ng-hide-remove {
+  animation:0.5s slideInUp ease-in-out;
+}
+
+@keyframes slideInUp {
+  from {
+    transform: translate3d(0, 100%, 0);
+    opacity: 0;
+  }
+
+  to {
+    transform: translate3d(0, 0, 0);
+    opacity: 1;
+  }
+}
+
+
+@keyframes slideOutDown {
+  from {
+    transform: translate3d(0, 0, 0);
+    opacity: 1;
+  }
+
+  to {
+    opacity: 0;
+    transform: translate3d(0, 100%, 0);
+  }
+}
+
 /* LOADER */
 .loader {
   font-size: 10px;
diff --git a/views/ngXosViews/truckroll/src/index.html b/views/ngXosViews/truckroll/src/index.html
index 0b6606e..048c112 100644
--- a/views/ngXosViews/truckroll/src/index.html
+++ b/views/ngXosViews/truckroll/src/index.html
@@ -20,6 +20,7 @@
 <script src="vendor/angular-resource/angular-resource.js"></script>
 <script src="vendor/ng-lodash/build/ng-lodash.js"></script>
 <script src="vendor/bootstrap-css/js/bootstrap.min.js"></script>
+<script src="vendor/angular-animate/angular-animate.js"></script>
 <!-- endbower --><!-- endjs -->
 <!-- inject:js -->
 <script src="/xosHelpers/src/xosHelpers.module.js"></script>
diff --git a/views/ngXosViews/truckroll/src/js/main.js b/views/ngXosViews/truckroll/src/js/main.js
index 514126e..8f43c35 100644
--- a/views/ngXosViews/truckroll/src/js/main.js
+++ b/views/ngXosViews/truckroll/src/js/main.js
@@ -3,6 +3,7 @@
 angular.module('xos.truckroll', [
   'ngResource',
   'ngCookies',
+  'ngAnimate',
   'ngLodash',
   'ui.router',
   'xos.helpers'
@@ -58,16 +59,16 @@
         Truckroll.get({id: id}).$promise
         .then((testResult) => {
           // if error
-          if(testResult.backend_status.indexOf('2') >= 0 || (testResult.result_code && testResult.result_code.indexOf('2') >= 0)){
-            this.truckroll = angular.copy(testResult);
-            this.loader = false;
-            // not deleting failed test for debugging
-          }
+          // or
           // if is synced
-          else if(testResult.is_synced){
+          if(
+              testResult.backend_status.indexOf('2') >= 0 ||
+              (testResult.result_code && testResult.result_code.indexOf('2') >= 0) ||
+              testResult.is_synced
+            ){
             this.truckroll = angular.copy(testResult);
-            Truckroll.delete({id: id});
             this.loader = false;
+            Truckroll.delete({id: id});
           }
           // else keep polling
           else{
diff --git a/views/ngXosViews/truckroll/src/templates/truckroll.tpl.html b/views/ngXosViews/truckroll/src/templates/truckroll.tpl.html
index 424cf26..f0c2dbe 100644
--- a/views/ngXosViews/truckroll/src/templates/truckroll.tpl.html
+++ b/views/ngXosViews/truckroll/src/templates/truckroll.tpl.html
@@ -1,6 +1,8 @@
 <div class="row">
-  <h2>Virtual Truck Roll</h2>
-  <p>Use this page to run test against your subscriber</p>
+  <div class="col-xs-12">
+    <h2>Virtual Truck Roll</h2>
+    <p>Use this page to run test against your subscriber</p>
+  </div>
 </div>
 <form ng-submit="vm.runTest()">
   <div class="row">
@@ -69,7 +71,10 @@
     <div class="col-xs-12" ng-show="!vm.loader">
       <button class="btn btn-success btn-block">Run test</button>
     </div>
-    <div class="col-xs-12" ng-show="vm.loader">
+  </div>
+</form>
+<div class="row">
+    <div class="col-xs-12 animate-vertical" ng-show="vm.loader">
       <div class="loader"></div>
     </div>
   </div>
@@ -93,10 +98,9 @@
   </div>
   <div class="row" ng-hide="!vm.truckroll.backend_status">
     <div class="col-xs-12">
-      <label>Result Code</label>
+      <label>Backend Status</label>
     </div>
     <div class="col-xs-12">
       <pre>{{vm.truckroll.backend_status}}</pre>
     </div>
-  </div>
-</form>
\ No newline at end of file
+  </div>
\ No newline at end of file
diff --git a/xos/core/xoslib/dashboards/xosTruckroll.html b/xos/core/xoslib/dashboards/xosTruckroll.html
index e8bb216..ab289f2 100644
--- a/xos/core/xoslib/dashboards/xosTruckroll.html
+++ b/xos/core/xoslib/dashboards/xosTruckroll.html
@@ -10,5 +10,6 @@
 
 
 <!-- inject:js -->
+<script src="/static/js/vendor/xosTruckrollVendor.js"></script>
 <script src="/static/js/xosTruckroll.js"></script>
 <!-- endinject -->
diff --git a/xos/core/xoslib/static/css/xosTruckroll.css b/xos/core/xoslib/static/css/xosTruckroll.css
index 553215e..66136da 100644
--- a/xos/core/xoslib/static/css/xosTruckroll.css
+++ b/xos/core/xoslib/static/css/xosTruckroll.css
@@ -1 +1 @@
-.row+.row{margin-top:20px}.loader{font-size:10px;margin:0 auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:linear-gradient(to right,#fff 10%,rgba(255,255,255,0) 42%);position:relative;animation:load3 1.4s infinite linear;transform:translateZ(0)}.loader:before{width:50%;height:50%;background:#105e9e;border-radius:100% 0 0;position:absolute;top:0;left:0;content:''}.loader:after{background:#fff;width:75%;height:75%;border-radius:50%;content:'';margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}@keyframes load3{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
\ No newline at end of file
+.row+.row{margin-top:20px}.animate-vertical.ng-hide-add{animation:.5s slideOutDown ease-in-out}.animate-vertical.ng-hide-remove{animation:.5s slideInUp ease-in-out}@keyframes slideInUp{from{transform:translate3d(0,100%,0);opacity:0}to{transform:translate3d(0,0,0);opacity:1}}@keyframes slideOutDown{from{transform:translate3d(0,0,0);opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.loader{font-size:10px;margin:0 auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:linear-gradient(to right,#fff 10%,rgba(255,255,255,0) 42%);position:relative;animation:load3 1.4s infinite linear;transform:translateZ(0)}.loader:before{width:50%;height:50%;background:#105e9e;border-radius:100% 0 0;position:absolute;top:0;left:0;content:''}.loader:after{background:#fff;width:75%;height:75%;border-radius:50%;content:'';margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}@keyframes load3{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
\ No newline at end of file
diff --git a/xos/core/xoslib/static/js/vendor/xosTruckrollVendor.js b/xos/core/xoslib/static/js/vendor/xosTruckrollVendor.js
new file mode 100644
index 0000000..81b0d27
--- /dev/null
+++ b/xos/core/xoslib/static/js/vendor/xosTruckrollVendor.js
@@ -0,0 +1 @@
+!function(n,t,e){"use strict";function a(n,t,e){if(!n)throw gn("areq","Argument '{0}' is {1}",t||"?",e||"required");return n}function r(n,t){return n||t?n?t?(K(n)&&(n=n.join(" ")),K(t)&&(t=t.join(" ")),n+" "+t):n:t:""}function i(n){var t={};return n&&(n.to||n.from)&&(t.to=n.to,t.from=n.from),t}function o(n,t,e){var a="";return n=K(n)?n:n&&Q(n)&&n.length?n.split(/\s+/):[],J(n,function(n,r){n&&n.length>0&&(a+=r>0?" ":"",a+=e?t+n:n+t)}),a}function s(n,t){var e=n.indexOf(t);t>=0&&n.splice(e,1)}function u(n){if(n instanceof B)switch(n.length){case 0:return[];case 1:if(n[0].nodeType===X)return n;break;default:return B(l(n))}return n.nodeType===X?B(n):void 0}function l(n){if(!n[0])return n;for(var t=0;t<n.length;t++){var e=n[t];if(e.nodeType==X)return e}}function c(n,t,e){J(t,function(t){n.addClass(t,e)})}function f(n,t,e){J(t,function(t){n.removeClass(t,e)})}function m(n){return function(t,e){e.addClass&&(c(n,t,e.addClass),e.addClass=null),e.removeClass&&(f(n,t,e.removeClass),e.removeClass=null)}}function v(n){if(n=n||{},!n.$$prepared){var t=n.domOperation||q;n.domOperation=function(){n.$$domOperationFired=!0,t(),t=q},n.$$prepared=!0}return n}function d(n,t){p(n,t),h(n,t)}function p(n,t){t.from&&(n.css(t.from),t.from=null)}function h(n,t){t.to&&(n.css(t.to),t.to=null)}function g(n,t,e){var a=t.options||{},r=e.options||{},i=(a.addClass||"")+" "+(r.addClass||""),o=(a.removeClass||"")+" "+(r.removeClass||""),s=$(n.attr("class"),i,o);r.preparationClasses&&(a.preparationClasses=w(r.preparationClasses,a.preparationClasses),delete r.preparationClasses);var u=a.domOperation!==q?a.domOperation:null;return H(a,r),u&&(a.domOperation=u),s.addClass?a.addClass=s.addClass:a.addClass=null,s.removeClass?a.removeClass=s.removeClass:a.removeClass=null,t.addClass=a.addClass,t.removeClass=a.removeClass,a}function $(n,t,e){function a(n){Q(n)&&(n=n.split(" "));var t={};return J(n,function(n){n.length&&(t[n]=!0)}),t}var r=1,i=-1,o={};n=a(n),t=a(t),J(t,function(n,t){o[t]=r}),e=a(e),J(e,function(n,t){o[t]=o[t]===r?null:i});var s={addClass:"",removeClass:""};return J(o,function(t,e){var a,o;t===r?(a="addClass",o=!n[e]):t===i&&(a="removeClass",o=n[e]),o&&(s[a].length&&(s[a]+=" "),s[a]+=e)}),s}function C(n){return n instanceof t.element?n[0]:n}function y(n,t,e){var a="";t&&(a=o(t,_,!0)),e.addClass&&(a=w(a,o(e.addClass,Y))),e.removeClass&&(a=w(a,o(e.removeClass,Z))),a.length&&(e.preparationClasses=a,n.addClass(a))}function D(n,t){t.preparationClasses&&(n.removeClass(t.preparationClasses),t.preparationClasses=null),t.activeClasses&&(n.removeClass(t.activeClasses),t.activeClasses=null)}function b(n,t){var e=t?"-"+t+"s":"";return k(n,[pn,e]),[pn,e]}function A(n,t){var e=t?"paused":"",a=I+fn;return k(n,[a,e]),[a,e]}function k(n,t){var e=t[0],a=t[1];n.style[e]=a}function w(n,t){return n?t?n+" "+t:n:t}function T(n){return[dn,n+"s"]}function S(n,t){var e=t?vn:pn;return[e,n+"s"]}function j(n,t,e){var a=Object.create(null),r=n.getComputedStyle(t)||{};return J(e,function(n,t){var e=r[n];if(e){var i=e.charAt(0);("-"===i||"+"===i||i>=0)&&(e=x(e)),0===e&&(e=null),a[t]=e}}),a}function x(n){var t=0,e=n.split(/\s*,\s*/);return J(e,function(n){"s"==n.charAt(n.length-1)&&(n=n.substring(0,n.length-1)),n=parseFloat(n)||0,t=t?Math.max(n,t):n}),t}function O(n){return 0===n||null!=n}function P(n,t){var e=M,a=n+"s";return t?e+=on:a+=" linear all",[e,a]}function N(){var n=Object.create(null);return{flush:function(){n=Object.create(null)},count:function(t){var e=n[t];return e?e.total:0},get:function(t){var e=n[t];return e&&e.value},put:function(t,e){n[t]?n[t].total++:n[t]={total:1,value:e}}}}function F(n,t,e){J(e,function(e){n[e]=V(n[e])?n[e]:t.style.getPropertyValue(e)})}var M,E,I,R,q=t.noop,L=t.copy,H=t.extend,B=t.element,J=t.forEach,K=t.isArray,Q=t.isString,U=t.isObject,W=t.isUndefined,V=t.isDefined,z=t.isFunction,G=t.isElement,X=1,Y="-add",Z="-remove",_="ng-",nn="-active",tn="-prepare",en="ng-animate",an="$$ngAnimateChildren",rn="";W(n.ontransitionend)&&V(n.onwebkittransitionend)?(rn="-webkit-",M="WebkitTransition",E="webkitTransitionEnd transitionend"):(M="transition",E="transitionend"),W(n.onanimationend)&&V(n.onwebkitanimationend)?(rn="-webkit-",I="WebkitAnimation",R="webkitAnimationEnd animationend"):(I="animation",R="animationend");var on="Duration",sn="Property",un="Delay",ln="TimingFunction",cn="IterationCount",fn="PlayState",mn=9999,vn=I+un,dn=I+on,pn=M+un,hn=M+on,gn=t.$$minErr("ng"),$n=["$$rAF",function(n){function t(n){a=a.concat(n),e()}function e(){if(a.length){for(var t=a.shift(),i=0;i<t.length;i++)t[i]();r||n(function(){r||e()})}}var a,r;return a=t.queue=[],t.waitUntilQuiet=function(t){r&&r(),r=n(function(){r=null,t(),e()})},t}],Cn=["$interpolate",function(n){return{link:function(e,a,r){function i(n){n="on"===n||"true"===n,a.data(an,n)}var o=r.ngAnimateChildren;t.isString(o)&&0===o.length?a.data(an,!0):(i(n(o)(e)),r.$observe("ngAnimateChildren",i))}}}],yn="$$animateCss",Dn=1e3,bn=3,An=1.5,kn={transitionDuration:hn,transitionDelay:pn,transitionProperty:M+sn,animationDuration:dn,animationDelay:vn,animationIterationCount:I+cn},wn={transitionDuration:hn,transitionDelay:pn,animationDuration:dn,animationDelay:vn},Tn=["$animateProvider",function(n){var t=N(),e=N();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function(n,a,r,u,l,c,f,g){function $(n,t){var e="$$ngAnimateParentKey",a=n.parentNode,r=a[e]||(a[e]=++H);return r+"-"+n.getAttribute("class")+"-"+t}function y(e,a,r,i){var o=t.get(r);return o||(o=j(n,e,i),"infinite"===o.animationIterationCount&&(o.animationIterationCount=1)),t.put(r,o),o}function D(r,i,s,u){var l;if(t.count(s)>0&&(l=e.get(s),!l)){var c=o(i,"-stagger");a.addClass(r,c),l=j(n,r,u),l.animationDuration=Math.max(l.animationDuration,0),l.transitionDuration=Math.max(l.transitionDuration,0),a.removeClass(r,c),e.put(s,l)}return l||{}}function w(n){B.push(n),f.waitUntilQuiet(function(){t.flush(),e.flush();for(var n=l(),a=0;a<B.length;a++)B[a](n);B.length=0})}function x(n,t,e){var a=y(n,t,e,kn),r=a.animationDelay,i=a.transitionDelay;return a.maxDelay=r&&i?Math.max(r,i):r||i,a.maxDuration=Math.max(a.animationDuration*a.animationIterationCount,a.transitionDuration),a}var N=m(a),H=0,B=[];return function(n,e){function l(){m()}function f(){m(!0)}function m(t){if(!(V||G&&z)){V=!0,z=!1,Q.$$skipPreparationClasses||a.removeClass(n,Cn),a.removeClass(n,Tn),A(W,!1),b(W,!1),J(cn,function(n){W.style[n[0]]=""}),N(n,Q),d(n,Q),Object.keys(U).length&&J(U,function(n,t){n?W.style.setProperty(t,n):W.style.removeProperty(t)}),Q.onDone&&Q.onDone(),dn&&dn.length&&n.off(dn.join(" "),H);var e=n.data(yn);e&&(u.cancel(e[0].timer),n.removeData(yn)),X&&X.complete(!t)}}function y(n){Hn.blockTransition&&b(W,n),Hn.blockKeyframeAnimation&&A(W,!!n)}function j(){return X=new r({end:l,cancel:f}),w(q),m(),{$$willAnimate:!1,start:function(){return X},end:l}}function H(n){n.stopPropagation();var t=n.originalEvent||n,e=t.$manualTimeStamp||Date.now(),a=parseFloat(t.elapsedTime.toFixed(bn));Math.max(e-un,0)>=an&&a>=rn&&(G=!0,m())}function B(){function t(){if(!V){if(y(!1),J(cn,function(n){var t=n[0],e=n[1];W.style[t]=e}),N(n,Q),a.addClass(n,Tn),Hn.recalculateTimingStyles){if(kn=W.className+" "+Cn,xn=$(W,kn),qn=x(W,kn,xn),Ln=qn.maxDelay,en=Math.max(Ln,0),rn=qn.maxDuration,0===rn)return void m();Hn.hasTransitions=qn.transitionDuration>0,Hn.hasAnimations=qn.animationDuration>0}if(Hn.applyAnimationDelay&&(Ln="boolean"!=typeof Q.delay&&O(Q.delay)?parseFloat(Q.delay):Ln,en=Math.max(Ln,0),qn.animationDelay=Ln,Bn=S(Ln,!0),cn.push(Bn),W.style[Bn[0]]=Bn[1]),an=en*Dn,on=rn*Dn,Q.easing){var t,r=Q.easing;Hn.hasTransitions&&(t=M+ln,cn.push([t,r]),W.style[t]=r),Hn.hasAnimations&&(t=I+ln,cn.push([t,r]),W.style[t]=r)}qn.transitionDuration&&dn.push(E),qn.animationDuration&&dn.push(R),un=Date.now();var i=an+An*on,o=un+i,s=n.data(yn)||[],l=!0;if(s.length){var c=s[0];l=o>c.expectedEndTime,l?u.cancel(c.timer):s.push(m)}if(l){var f=u(e,i,!1);s[0]={timer:f,expectedEndTime:o},s.push(m),n.data(yn,s)}dn.length&&n.on(dn.join(" "),H),Q.to&&(Q.cleanupStyles&&F(U,W,Object.keys(Q.to)),h(n,Q))}}function e(){var t=n.data(yn);if(t){for(var e=1;e<t.length;e++)t[e]();n.removeData(yn)}}if(!V){if(!W.parentNode)return void m();var r=function(n){if(G)z&&n&&(z=!1,m());else if(z=!n,qn.animationDuration){var t=A(W,z);z?cn.push(t):s(cn,t)}},i=In>0&&(qn.transitionDuration&&0===On.transitionDuration||qn.animationDuration&&0===On.animationDuration)&&Math.max(On.animationDelay,On.transitionDelay);i?u(t,Math.floor(i*In*Dn),!1):t(),tn.resume=function(){r(!0)},tn.pause=function(){r(!1)}}}var Q=e||{};Q.$$prepared||(Q=v(L(Q)));var U={},W=C(n);if(!W||!W.parentNode||!g.enabled())return j();var V,z,G,X,tn,en,an,rn,on,un,cn=[],fn=n.attr("class"),vn=i(Q),dn=[];if(0===Q.duration||!c.animations&&!c.transitions)return j();var pn=Q.event&&K(Q.event)?Q.event.join(" "):Q.event,hn=pn&&Q.structural,gn="",$n="";hn?gn=o(pn,_,!0):pn&&(gn=pn),Q.addClass&&($n+=o(Q.addClass,Y)),Q.removeClass&&($n.length&&($n+=" "),$n+=o(Q.removeClass,Z)),Q.applyClassesEarly&&$n.length&&N(n,Q);var Cn=[gn,$n].join(" ").trim(),kn=fn+" "+Cn,Tn=o(Cn,nn),Sn=vn.to&&Object.keys(vn.to).length>0,jn=(Q.keyframeStyle||"").length>0;if(!jn&&!Sn&&!Cn)return j();var xn,On;if(Q.stagger>0){var Pn=parseFloat(Q.stagger);On={transitionDelay:Pn,animationDelay:Pn,transitionDuration:0,animationDuration:0}}else xn=$(W,kn),On=D(W,Cn,xn,wn);Q.$$skipPreparationClasses||a.addClass(n,Cn);var Nn;if(Q.transitionStyle){var Fn=[M,Q.transitionStyle];k(W,Fn),cn.push(Fn)}if(Q.duration>=0){Nn=W.style[M].length>0;var Mn=P(Q.duration,Nn);k(W,Mn),cn.push(Mn)}if(Q.keyframeStyle){var En=[I,Q.keyframeStyle];k(W,En),cn.push(En)}var In=On?Q.staggerIndex>=0?Q.staggerIndex:t.count(xn):0,Rn=0===In;Rn&&!Q.skipBlocking&&b(W,mn);var qn=x(W,kn,xn),Ln=qn.maxDelay;en=Math.max(Ln,0),rn=qn.maxDuration;var Hn={};if(Hn.hasTransitions=qn.transitionDuration>0,Hn.hasAnimations=qn.animationDuration>0,Hn.hasTransitionAll=Hn.hasTransitions&&"all"==qn.transitionProperty,Hn.applyTransitionDuration=Sn&&(Hn.hasTransitions&&!Hn.hasTransitionAll||Hn.hasAnimations&&!Hn.hasTransitions),Hn.applyAnimationDuration=Q.duration&&Hn.hasAnimations,Hn.applyTransitionDelay=O(Q.delay)&&(Hn.applyTransitionDuration||Hn.hasTransitions),Hn.applyAnimationDelay=O(Q.delay)&&Hn.hasAnimations,Hn.recalculateTimingStyles=$n.length>0,(Hn.applyTransitionDuration||Hn.applyAnimationDuration)&&(rn=Q.duration?parseFloat(Q.duration):rn,Hn.applyTransitionDuration&&(Hn.hasTransitions=!0,qn.transitionDuration=rn,Nn=W.style[M+sn].length>0,cn.push(P(rn,Nn))),Hn.applyAnimationDuration&&(Hn.hasAnimations=!0,qn.animationDuration=rn,cn.push(T(rn)))),0===rn&&!Hn.recalculateTimingStyles)return j();if(null!=Q.delay){var Bn;"boolean"!=typeof Q.delay&&(Bn=parseFloat(Q.delay),en=Math.max(Bn,0)),Hn.applyTransitionDelay&&cn.push(S(Bn)),Hn.applyAnimationDelay&&cn.push(S(Bn,!0))}return null==Q.duration&&qn.transitionDuration>0&&(Hn.recalculateTimingStyles=Hn.recalculateTimingStyles||Rn),an=en*Dn,on=rn*Dn,Q.skipBlocking||(Hn.blockTransition=qn.transitionDuration>0,Hn.blockKeyframeAnimation=qn.animationDuration>0&&On.animationDelay>0&&0===On.animationDuration),Q.from&&(Q.cleanupStyles&&F(U,W,Object.keys(Q.from)),p(n,Q)),Hn.blockTransition||Hn.blockKeyframeAnimation?y(rn):Q.skipBlocking||b(W,!1),{$$willAnimate:!0,end:l,start:function(){return V?void 0:(tn={end:l,cancel:f,resume:null,pause:null},X=new r(tn),w(B),X)}}}}]}],Sn=["$$animationProvider",function(n){function t(n){return n.parentNode&&11===n.parentNode.nodeType}n.drivers.push("$$animateCssDriver");var e="ng-animate-shim",a="ng-anchor",r="ng-anchor-out",i="ng-anchor-in";this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(n,o,s,u,l,c,f){function v(n){return n.replace(/\bng-\S+\b/g,"")}function d(n,t){return Q(n)&&(n=n.split(" ")),Q(t)&&(t=t.split(" ")),n.filter(function(n){return-1===t.indexOf(n)}).join(" ")}function p(t,o,u){function l(n){var t={},e=C(n).getBoundingClientRect();return J(["width","height","top","left"],function(n){var a=e[n];switch(n){case"top":a+=$.scrollTop;break;case"left":a+=$.scrollLeft}t[n]=Math.floor(a)+"px"}),t}function c(){var t=n(h,{addClass:r,delay:!0,from:l(o)});return t.$$willAnimate?t:null}function f(n){return n.attr("class")||""}function m(){var t=v(f(u)),e=d(t,g),a=d(g,t),o=n(h,{to:l(u),addClass:i+" "+e,removeClass:r+" "+a,delay:!0});return o.$$willAnimate?o:null}function p(){h.remove(),o.removeClass(e),u.removeClass(e)}var h=B(C(o).cloneNode(!0)),g=v(f(h));o.addClass(e),u.addClass(e),h.addClass(a),D.append(h);var y,b=c();if(!b&&(y=m(),!y))return p();var A=b||y;return{start:function(){function n(){e&&e.end()}var t,e=A.start();return e.done(function(){return e=null,!y&&(y=m())?(e=y.start(),e.done(function(){e=null,p(),t.complete()}),e):(p(),void t.complete())}),t=new s({end:n,cancel:n})}}}function h(n,t,e,a){var r=g(n,q),i=g(t,q),o=[];return J(a,function(n){var t=n.out,a=n["in"],r=p(e,t,a);r&&o.push(r)}),r||i||0!==o.length?{start:function(){function n(){J(t,function(n){n.end()})}var t=[];r&&t.push(r.start()),i&&t.push(i.start()),J(o,function(n){t.push(n.start())});var e=new s({end:n,cancel:n});return s.all(t,function(n){e.complete(n)}),e}}:void 0}function g(t){var e=t.element,a=t.options||{};t.structural&&(a.event=t.event,a.structural=!0,a.applyClassesEarly=!0,"leave"===t.event&&(a.onDone=a.domOperation)),a.preparationClasses&&(a.event=w(a.event,a.preparationClasses));var r=n(e,a);return r.$$willAnimate?r:null}if(!l.animations&&!l.transitions)return q;var $=f[0].body,y=C(u),D=B(t(y)||$.contains(y)?y:$);m(c);return function(n){return n.from&&n.to?h(n.from,n.to,n.classes,n.anchors):g(n)}}]}],jn=["$animateProvider",function(n){this.$get=["$injector","$$AnimateRunner","$$jqLite",function(t,e,a){function r(e){e=K(e)?e:e.split(" ");for(var a=[],r={},i=0;i<e.length;i++){var o=e[i],s=n.$$registeredAnimations[o];s&&!r[o]&&(a.push(t.get(s)),r[o]=!0)}return a}var i=m(a);return function(n,t,a,o){function s(){o.domOperation(),i(n,o)}function u(){m=!0,s(),d(n,o)}function l(n,t,a,r,i){var o;switch(a){case"animate":o=[t,r.from,r.to,i];break;case"setClass":o=[t,g,$,i];break;case"addClass":o=[t,g,i];break;case"removeClass":o=[t,$,i];break;default:o=[t,i]}o.push(r);var s=n.apply(n,o);if(s)if(z(s.start)&&(s=s.start()),s instanceof e)s.done(i);else if(z(s))return s;return q}function c(n,t,a,r,i){var o=[];return J(r,function(r){var s=r[i];s&&o.push(function(){var r,i,o=!1,u=function(n){o||(o=!0,(i||q)(n),r.complete(!n))};return r=new e({end:function(){u()},cancel:function(){u(!0)}}),i=l(s,n,t,a,function(n){var t=n===!1;u(t)}),r})}),o}function f(n,t,a,r,i){var o=c(n,t,a,r,i);if(0===o.length){var s,u;"beforeSetClass"===i?(s=c(n,"removeClass",a,r,"beforeRemoveClass"),u=c(n,"addClass",a,r,"beforeAddClass")):"setClass"===i&&(s=c(n,"removeClass",a,r,"removeClass"),u=c(n,"addClass",a,r,"addClass")),s&&(o=o.concat(s)),u&&(o=o.concat(u))}if(0!==o.length)return function(n){var t=[];return o.length&&J(o,function(n){t.push(n())}),t.length?e.all(t,n):n(),function(n){J(t,function(t){n?t.cancel():t.end()})}}}var m=!1;3===arguments.length&&U(a)&&(o=a,a=null),o=v(o),a||(a=n.attr("class")||"",o.addClass&&(a+=" "+o.addClass),o.removeClass&&(a+=" "+o.removeClass));var p,h,g=o.addClass,$=o.removeClass,C=r(a);if(C.length){var y,D;"leave"==t?(D="leave",y="afterLeave"):(D="before"+t.charAt(0).toUpperCase()+t.substr(1),y=t),"enter"!==t&&"move"!==t&&(p=f(n,t,o,C,D)),h=f(n,t,o,C,y)}if(p||h){var b;return{$$willAnimate:!0,end:function(){return b?b.end():(u(),b=new e,b.complete(!0)),b},start:function(){function n(n){u(n),b.complete(n)}function t(t){m||((a||q)(t),n(t))}if(b)return b;b=new e;var a,r=[];return p&&r.push(function(n){a=p(n)}),r.length?r.push(function(n){s(),n(!0)}):s(),h&&r.push(function(n){a=h(n)}),b.setHost({end:function(){t()},cancel:function(){t(!0)}}),e.chain(r,n),b}}}}}]}],xn=["$$animationProvider",function(n){n.drivers.push("$$animateJsDriver"),this.$get=["$$animateJs","$$AnimateRunner",function(n,t){function e(t){var e=t.element,a=t.event,r=t.options,i=t.classes;return n(e,a,i,r)}return function(n){if(n.from&&n.to){var a=e(n.from),r=e(n.to);if(!a&&!r)return;return{start:function(){function n(){return function(){J(i,function(n){n.end()})}}function e(n){o.complete(n)}var i=[];a&&i.push(a.start()),r&&i.push(r.start()),t.all(i,e);var o=new t({end:n(),cancel:n()});return o}}}return e(n)}}]}],On="data-ng-animate",Pn="$ngAnimatePin",Nn=["$animateProvider",function(n){function t(n){if(!n)return null;var t=n.split(c),e=Object.create(null);return J(t,function(n){e[n]=!0}),e}function e(n,e){if(n&&e){var a=t(e);return n.split(c).some(function(n){return a[n]})}}function r(n,t,e,a){return f[n].some(function(n){return n(t,e,a)})}function i(n,t){var e=(n.addClass||"").length>0,a=(n.removeClass||"").length>0;return t?e&&a:e||a}var o=1,s=2,c=" ",f=this.rules={skip:[],cancel:[],join:[]};f.join.push(function(n,t,e){return!t.structural&&i(t)}),f.skip.push(function(n,t,e){return!t.structural&&!i(t)}),f.skip.push(function(n,t,e){return"leave"==e.event&&t.structural}),f.skip.push(function(n,t,e){return e.structural&&e.state===s&&!t.structural}),f.cancel.push(function(n,t,e){return e.structural&&t.structural}),f.cancel.push(function(n,t,e){return e.state===s&&t.structural}),f.cancel.push(function(n,t,a){var r=t.addClass,i=t.removeClass,o=a.addClass,s=a.removeClass;return W(r)&&W(i)||W(o)&&W(s)?!1:e(r,s)||e(i,o)}),this.$get=["$$rAF","$rootScope","$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow",function(t,e,c,f,p,h,$,b,A,k){function w(){var n=!1;return function(t){n?t():e.$$postDigest(function(){n=!0,t()})}}function T(n,t){return g(n,t,{})}function S(n,t,e){var a=C(t),r=C(n),i=[],o=q[e];return o&&J(o,function(n){_.call(n.node,a)?i.push(n.callback):"leave"===e&&_.call(n.node,r)&&i.push(n.callback)}),i}function j(n,a,l){function c(e,a,r,i){j(function(){var e=S(b,n,a);e.length&&t(function(){J(e,function(t){t(n,r,i)})})}),e.progress(a,r,i)}function m(t){D(n,A),Z(n,A),d(n,A),A.domOperation(),k.complete(!t)}var p,b,A=L(l);n=u(n),n&&(p=C(n),b=n.parent()),A=v(A);var k=new $,j=w();if(K(A.addClass)&&(A.addClass=A.addClass.join(" ")),A.addClass&&!Q(A.addClass)&&(A.addClass=null),K(A.removeClass)&&(A.removeClass=A.removeClass.join(" ")),A.removeClass&&!Q(A.removeClass)&&(A.removeClass=null),A.from&&!U(A.from)&&(A.from=null),A.to&&!U(A.to)&&(A.to=null),!p)return m(),k;var P=[p.className,A.addClass,A.removeClass].join(" ");if(!Y(P))return m(),k;var R=["enter","move","leave"].indexOf(a)>=0,q=!I||f[0].hidden||E.get(p),H=!q&&M.get(p)||{},B=!!H.state;if(q||B&&H.state==o||(q=!N(n,b,a)),q)return m(),k;R&&x(n);var W={structural:R,element:n,event:a,addClass:A.addClass,removeClass:A.removeClass,close:m,options:A,runner:k};if(B){var V=r("skip",n,W,H);if(V)return H.state===s?(m(),k):(g(n,H,W),H.runner);var z=r("cancel",n,W,H);if(z)if(H.state===s)H.runner.end();else{if(!H.structural)return g(n,H,W),H.runner;H.close()}else{var G=r("join",n,W,H);if(G){if(H.state!==s)return y(n,R?a:null,A),a=W.event=H.event,A=g(n,H,W),H.runner;T(n,W)}}}else T(n,W);var X=W.structural;if(X||(X="animate"===W.event&&Object.keys(W.options.to||{}).length>0||i(W)),!X)return m(),O(n),k;var _=(H.counter||0)+1;return W.counter=_,F(n,o,W),e.$$postDigest(function(){var t=M.get(p),e=!t;t=t||{};var r=n.parent()||[],o=r.length>0&&("animate"===t.event||t.structural||i(t));if(e||t.counter!==_||!o)return e&&(Z(n,A),d(n,A)),(e||R&&t.event!==a)&&(A.domOperation(),k.end()),void(o||O(n));a=!t.structural&&i(t,!0)?"setClass":t.event,F(n,s);var u=h(n,a,t.options);u.done(function(t){m(!t);var e=M.get(p);e&&e.counter===_&&O(C(n)),c(k,a,"close",{})}),k.setHost(u),c(k,a,"start",{})}),k}function x(n){var t=C(n),e=t.querySelectorAll("["+On+"]");J(e,function(n){var t=parseInt(n.getAttribute(On)),e=M.get(n);if(e)switch(t){case s:e.runner.end();case o:M.remove(n)}})}function O(n){var t=C(n);t.removeAttribute(On),M.remove(t)}function P(n,t){return C(n)===C(t)}function N(n,t,e){var a,r=B(f[0].body),i=P(n,r)||"HTML"===n[0].nodeName,o=P(n,c),s=!1,u=E.get(C(n)),l=n.data(Pn);for(l&&(t=l);t&&t.length;){o||(o=P(t,c));var m=t[0];if(m.nodeType!==X)break;var v=M.get(m)||{};if(!s){var d=E.get(m);if(d===!0&&u!==!1){u=!0;break}d===!1&&(u=!1),s=v.structural}if(W(a)||a===!0){var p=t.data(an);V(p)&&(a=p)}if(s&&a===!1)break;if(i||(i=P(t,r)),i&&o)break;t=o||!(l=t.data(Pn))?t.parent():l}var h=(!s||a)&&u!==!0;return h&&o&&i}function F(n,t,e){e=e||{},e.state=t;var a=C(n);a.setAttribute(On,t);var r=M.get(a),i=r?H(r,e):e;M.put(a,i)}var M=new p,E=new p,I=null,R=e.$watch(function(){return 0===b.totalPendingRequests},function(n){n&&(R(),e.$$postDigest(function(){e.$$postDigest(function(){null===I&&(I=!0)})}))}),q={},z=n.classNameFilter(),Y=z?function(n){return z.test(n)}:function(){return!0},Z=m(A),_=Node.prototype.contains||function(n){return this===n||!!(16&this.compareDocumentPosition(n))};return{on:function(n,t,e){var a=l(t);q[n]=q[n]||[],q[n].push({node:a,callback:e})},off:function(n,t,e){function a(n,t,e){var a=l(t);return n.filter(function(n){var t=n.node===a&&(!e||n.callback===e);return!t})}var r=q[n];r&&(q[n]=1===arguments.length?null:a(r,t,e))},pin:function(n,t){a(G(n),"element","not an element"),a(G(t),"parentElement","not an element"),n.data(Pn,t)},push:function(n,t,e,a){return e=e||{},e.domOperation=a,j(n,t,e)},enabled:function(n,t){var e=arguments.length;if(0===e)t=!!I;else{var a=G(n);if(a){var r=C(n),i=E.get(r);1===e?t=!i:E.put(r,!t)}else t=I=!!n}return t}}}]}],Fn=["$animateProvider",function(n){function t(n,t){n.data(s,t)}function e(n){n.removeData(s)}function a(n){return n.data(s)}var i="ng-animate-ref",o=this.drivers=[],s="$$animationRunner";this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(n,s,u,l,c,f){function p(n){function t(n){if(n.processed)return n;n.processed=!0;var e=n.domNode,a=e.parentNode;i.put(e,n);for(var o;a;){if(o=i.get(a)){o.processed||(o=t(o));break}a=a.parentNode}return(o||r).children.push(n),n}function e(n){var t,e=[],a=[];for(t=0;t<n.children.length;t++)a.push(n.children[t]);var r=a.length,i=0,o=[];for(t=0;t<a.length;t++){var s=a[t];0>=r&&(r=i,i=0,e.push(o),o=[]),o.push(s.fn),s.children.forEach(function(n){i++,a.push(n)}),r--}return o.length&&e.push(o),e}var a,r={children:[]},i=new c;for(a=0;a<n.length;a++){var o=n[a];i.put(o.domNode,n[a]={domNode:o.domNode,fn:o.fn,children:[]})}for(a=0;a<n.length;a++)t(n[a]);return e(r)}var h=[],g=m(n);return function(c,m,$){function y(n){var t="["+i+"]",e=n.hasAttribute(i)?[n]:n.querySelectorAll(t),a=[];return J(e,function(n){var t=n.getAttribute(i);t&&t.length&&a.push(n)}),a}function D(n){var t=[],e={};J(n,function(n,a){var r=n.element,o=C(r),s=n.event,u=["enter","move"].indexOf(s)>=0,l=n.structural?y(o):[];if(l.length){var c=u?"to":"from";J(l,function(n){var t=n.getAttribute(i);e[t]=e[t]||{},e[t][c]={animationID:a,element:B(n)}})}else t.push(n)});var a={},r={};return J(e,function(e,i){var o=e.from,s=e.to;if(!o||!s){var u=o?o.animationID:s.animationID,l=u.toString();return void(a[l]||(a[l]=!0,t.push(n[u])))}var c=n[o.animationID],f=n[s.animationID],m=o.animationID.toString();if(!r[m]){var v=r[m]={structural:!0,beforeStart:function(){c.beforeStart(),f.beforeStart()},close:function(){c.close(),f.close()},classes:b(c.classes,f.classes),from:c,to:f,anchors:[]};v.classes.length?t.push(v):(t.push(c),t.push(f))}r[m].anchors.push({out:o.element,"in":s.element})}),t}function b(n,t){n=n.split(" "),t=t.split(" ");for(var e=[],a=0;a<n.length;a++){var r=n[a];if("ng-"!==r.substring(0,3))for(var i=0;i<t.length;i++)if(r===t[i]){e.push(r);break}}return e.join(" ")}function A(n){for(var t=o.length-1;t>=0;t--){var e=o[t];if(u.has(e)){var a=u.get(e),r=a(n);if(r)return r}}}function k(){c.addClass(en),P&&n.addClass(c,P),N&&(n.removeClass(c,N),N=null)}function w(n,t){function e(n){a(n).setHost(t)}n.from&&n.to?(e(n.from.element),e(n.to.element)):e(n.element)}function T(){var n=a(c);!n||"leave"===m&&$.$$domOperationFired||n.end()}function S(t){c.off("$destroy",T),e(c),g(c,$),d(c,$),$.domOperation(),P&&n.removeClass(c,P),c.removeClass(en),x.complete(!t)}$=v($);var j=["enter","move","leave"].indexOf(m)>=0,x=new l({end:function(){S()},cancel:function(){S(!0)}});if(!o.length)return S(),x;t(c,x);var O=r(c.attr("class"),r($.addClass,$.removeClass)),P=$.tempClasses;P&&(O+=" "+P,$.tempClasses=null);var N;return j&&(N="ng-"+m+tn,n.addClass(c,N)),h.push({element:c,classes:O,event:m,structural:j,options:$,beforeStart:k,close:S}),c.on("$destroy",T),h.length>1?x:(s.$$postDigest(function(){var n=[];J(h,function(t){a(t.element)?n.push(t):t.close()}),h.length=0;var t=D(n),e=[];J(t,function(n){e.push({domNode:C(n.from?n.from.element:n.element),fn:function(){n.beforeStart();var t,e=n.close,r=n.anchors?n.from.element||n.to.element:n.element;if(a(r)){var i=A(n);i&&(t=i.start)}if(t){var o=t();o.done(function(n){e(!n)}),w(n,o)}else e()}})}),f(p(e))}),x)}}]}],Mn=["$animate","$rootScope",function(n,t){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(t,e,a,r,i){var o,s;t.$watchCollection(a.ngAnimateSwap||a["for"],function(a){o&&n.leave(o),s&&(s.$destroy(),s=null),(a||0===a)&&(s=t.$new(),i(s,function(t){o=t,n.enter(t,null,e)}))})}}}];t.module("ngAnimate",[]).directive("ngAnimateSwap",Mn).directive("ngAnimateChildren",Cn).factory("$$rAFScheduler",$n).provider("$$animateQueue",Nn).provider("$$animation",Fn).provider("$animateCss",Tn).provider("$$animateCssDriver",Sn).provider("$$animateJs",jn).provider("$$animateJsDriver",xn)}(window,window.angular);
\ No newline at end of file
diff --git a/xos/core/xoslib/static/js/xosTruckroll.js b/xos/core/xoslib/static/js/xosTruckroll.js
index 7c5a450..f3017d9 100644
--- a/xos/core/xoslib/static/js/xosTruckroll.js
+++ b/xos/core/xoslib/static/js/xosTruckroll.js
@@ -1 +1 @@
-"use strict";angular.module("xos.truckroll",["ngResource","ngCookies","ngLodash","ui.router","xos.helpers"]).config(["$stateProvider",function(l){l.state("user-list",{url:"/",template:"<truckroll></truckroll>"})}]).config(["$httpProvider",function(l){l.interceptors.push("NoHyperlinks")}]).service("Subscribers",["$resource",function(l){return l("/xos/subscribers/:id")}]).service("Truckroll",["$resource",function(l){return l("/xoslib/truckroll/:id")}]).directive("truckroll",function(){return{restrict:"E",scope:{},bindToController:!0,controllerAs:"vm",templateUrl:"templates/truckroll.tpl.html",controller:["$timeout","Subscribers","Truckroll",function(l,n,t){var r=this;n.query().$promise.then(function(l){r.subscribers=l}),this.loader=!1,this.runTest=function(){delete r.truckroll.result,delete r.truckroll.is_synced,delete r.truckroll.result_code,delete r.truckroll.backend_status;var l=new t(r.truckroll);r.loader=!0,l.$save().then(function(l){r.waitForTest(l.id)})},this.waitForTest=function(n){t.get({id:n}).$promise.then(function(s){s.backend_status.indexOf("2")>=0||s.result_code&&s.result_code.indexOf("2")>=0?(r.truckroll=angular.copy(s),r.loader=!1):s.is_synced?(r.truckroll=angular.copy(s),t["delete"]({id:n}),r.loader=!1):l(function(){r.waitForTest(n)},2e3)})}}]}}),angular.module("xos.truckroll").run(["$templateCache",function(l){l.put("templates/truckroll.tpl.html",'<div class="row">\n  <h2>Virtual Truck Roll</h2>\n  <p>Use this page to run test against your subscriber</p>\n</div>\n<form ng-submit="vm.runTest()">\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Target:</label>\n    </div>\n    <div class="col-xs-12">\n      <select class="form-control" ng-model="vm.truckroll.target_id" ng-options="s.id as s.humanReadableName for s in vm.subscribers"></select>\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Scope:</label>\n    </div>\n    <div class="col-xs-6">\n      <a \n      ng-click="vm.truckroll.scope = \'container\'"\n      ng-class="{\'btn-default\': vm.truckroll.scope !== \'container\', \'btn-primary\': vm.truckroll.scope === \'container\'}"\n      class="btn btn-block"\n      >\n        Container\n      </a>\n    </div>\n    <div class="col-xs-6">\n      <a \n      ng-click="vm.truckroll.scope = \'vm\'"\n      ng-class="{\'btn-default\': vm.truckroll.scope !== \'vm\', \'btn-primary\': vm.truckroll.scope === \'vm\'}"\n      class="btn btn-block"\n      >\n        VM\n      </a>\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Test:</label>\n    </div>\n    <div class="col-xs-4">\n      <a \n      ng-click="vm.truckroll.test = \'ping\'"\n      ng-class="{\'btn-default\': vm.truckroll.test !== \'ping\', \'btn-primary\': vm.truckroll.test === \'ping\'}"\n      class="btn btn-block">Ping</a>\n    </div>\n    <div class="col-xs-4">\n      <a \n      ng-click="vm.truckroll.test = \'traceroute\'"\n      ng-class="{\'btn-default\': vm.truckroll.test !== \'traceroute\', \'btn-primary\': vm.truckroll.test === \'traceroute\'}"\n      class="btn btn-block">Traceroute</a>\n    </div>\n    <div class="col-xs-4">\n      <a \n      ng-click="vm.truckroll.test = \'tcpdump\'"\n      ng-class="{\'btn-default\': vm.truckroll.test !== \'tcpdump\', \'btn-primary\': vm.truckroll.test === \'tcpdump\'}"\n      class="btn btn-block">Tcp Dump</a>\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Argument:</label>\n    </div>\n    <div class="col-xs-12">\n      <input type="text" class="form-control" ng-model="vm.truckroll.argument" required />\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12" ng-show="!vm.loader">\n      <button class="btn btn-success btn-block">Run test</button>\n    </div>\n    <div class="col-xs-12" ng-show="vm.loader">\n      <div class="loader"></div>\n    </div>\n  </div>\n  <div class="row" ng-hide="!vm.truckroll.result_code">\n    <div class="col-xs-12">\n      <label>Result Code</label>\n    </div>\n    <div class="col-xs-12">\n      <pre>{{vm.truckroll.result_code}}</pre>\n    </div>\n  </div>\n  <div class="row" ng-hide="!vm.truckroll.result">\n    <div class="col-xs-12">\n      <label>\n        Result:\n      </label>\n    </div>\n    <div class="col-xs-12">\n      <pre>{{vm.truckroll.result}}</pre>\n    </div>\n  </div>\n  <div class="row" ng-hide="!vm.truckroll.backend_status">\n    <div class="col-xs-12">\n      <label>Result Code</label>\n    </div>\n    <div class="col-xs-12">\n      <pre>{{vm.truckroll.backend_status}}</pre>\n    </div>\n  </div>\n</form>')}]),angular.module("xos.truckroll").run(["$location",function(l){l.path("/")}]),angular.bootstrap(angular.element("#xosTruckroll"),["xos.truckroll"]);
\ No newline at end of file
+"use strict";angular.module("xos.truckroll",["ngResource","ngCookies","ngAnimate","ngLodash","ui.router","xos.helpers"]).config(["$stateProvider",function(l){l.state("user-list",{url:"/",template:"<truckroll></truckroll>"})}]).config(["$httpProvider",function(l){l.interceptors.push("NoHyperlinks")}]).service("Subscribers",["$resource",function(l){return l("/xos/subscribers/:id")}]).service("Truckroll",["$resource",function(l){return l("/xoslib/truckroll/:id")}]).directive("truckroll",function(){return{restrict:"E",scope:{},bindToController:!0,controllerAs:"vm",templateUrl:"templates/truckroll.tpl.html",controller:["$timeout","Subscribers","Truckroll",function(l,n,t){var s=this;n.query().$promise.then(function(l){s.subscribers=l}),this.loader=!1,this.runTest=function(){delete s.truckroll.result,delete s.truckroll.is_synced,delete s.truckroll.result_code,delete s.truckroll.backend_status;var l=new t(s.truckroll);s.loader=!0,l.$save().then(function(l){s.waitForTest(l.id)})},this.waitForTest=function(n){t.get({id:n}).$promise.then(function(r){r.backend_status.indexOf("2")>=0||r.result_code&&r.result_code.indexOf("2")>=0||r.is_synced?(s.truckroll=angular.copy(r),s.loader=!1,t["delete"]({id:n})):l(function(){s.waitForTest(n)},2e3)})}}]}}),angular.module("xos.truckroll").run(["$templateCache",function(l){l.put("templates/truckroll.tpl.html",'<div class="row">\n  <div class="col-xs-12">\n    <h2>Virtual Truck Roll</h2>\n    <p>Use this page to run test against your subscriber</p>\n  </div>\n</div>\n<form ng-submit="vm.runTest()">\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Target:</label>\n    </div>\n    <div class="col-xs-12">\n      <select class="form-control" ng-model="vm.truckroll.target_id" ng-options="s.id as s.humanReadableName for s in vm.subscribers"></select>\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Scope:</label>\n    </div>\n    <div class="col-xs-6">\n      <a \n      ng-click="vm.truckroll.scope = \'container\'"\n      ng-class="{\'btn-default\': vm.truckroll.scope !== \'container\', \'btn-primary\': vm.truckroll.scope === \'container\'}"\n      class="btn btn-block"\n      >\n        Container\n      </a>\n    </div>\n    <div class="col-xs-6">\n      <a \n      ng-click="vm.truckroll.scope = \'vm\'"\n      ng-class="{\'btn-default\': vm.truckroll.scope !== \'vm\', \'btn-primary\': vm.truckroll.scope === \'vm\'}"\n      class="btn btn-block"\n      >\n        VM\n      </a>\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Test:</label>\n    </div>\n    <div class="col-xs-4">\n      <a \n      ng-click="vm.truckroll.test = \'ping\'"\n      ng-class="{\'btn-default\': vm.truckroll.test !== \'ping\', \'btn-primary\': vm.truckroll.test === \'ping\'}"\n      class="btn btn-block">Ping</a>\n    </div>\n    <div class="col-xs-4">\n      <a \n      ng-click="vm.truckroll.test = \'traceroute\'"\n      ng-class="{\'btn-default\': vm.truckroll.test !== \'traceroute\', \'btn-primary\': vm.truckroll.test === \'traceroute\'}"\n      class="btn btn-block">Traceroute</a>\n    </div>\n    <div class="col-xs-4">\n      <a \n      ng-click="vm.truckroll.test = \'tcpdump\'"\n      ng-class="{\'btn-default\': vm.truckroll.test !== \'tcpdump\', \'btn-primary\': vm.truckroll.test === \'tcpdump\'}"\n      class="btn btn-block">Tcp Dump</a>\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12">\n      <label>Argument:</label>\n    </div>\n    <div class="col-xs-12">\n      <input type="text" class="form-control" ng-model="vm.truckroll.argument" required />\n    </div>\n  </div>\n  <div class="row">\n    <div class="col-xs-12" ng-show="!vm.loader">\n      <button class="btn btn-success btn-block">Run test</button>\n    </div>\n  </div>\n</form>\n<div class="row">\n    <div class="col-xs-12 animate-vertical" ng-show="vm.loader">\n      <div class="loader"></div>\n    </div>\n  </div>\n  <div class="row" ng-hide="!vm.truckroll.result_code">\n    <div class="col-xs-12">\n      <label>Result Code</label>\n    </div>\n    <div class="col-xs-12">\n      <pre>{{vm.truckroll.result_code}}</pre>\n    </div>\n  </div>\n  <div class="row" ng-hide="!vm.truckroll.result">\n    <div class="col-xs-12">\n      <label>\n        Result:\n      </label>\n    </div>\n    <div class="col-xs-12">\n      <pre>{{vm.truckroll.result}}</pre>\n    </div>\n  </div>\n  <div class="row" ng-hide="!vm.truckroll.backend_status">\n    <div class="col-xs-12">\n      <label>Backend Status</label>\n    </div>\n    <div class="col-xs-12">\n      <pre>{{vm.truckroll.backend_status}}</pre>\n    </div>\n  </div>')}]),angular.module("xos.truckroll").run(["$location",function(l){l.path("/")}]),angular.bootstrap(angular.element("#xosTruckroll"),["xos.truckroll"]);
\ No newline at end of file