/* Minification failed. Returning unminified contents.
(167,385-392): run-time error JS1019: Can't have 'break' outside of loop: break a
(167,345-352): run-time error JS1019: Can't have 'break' outside of loop: break a
(45,421-428): run-time error JS1019: Can't have 'break' outside of loop: break a
 */
/*
 AngularJS v1.5.0
 (c) 2010-2016 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(O,W,v){'use strict';function H(a){return function(){var b=arguments[0],d;d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.0/"+(a?a+"/":"")+b;for(b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var c=encodeURIComponent,e;e=arguments[b];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;d+=c(e)}return Error(d)}}function Ca(a){if(null==a||Za(a))return!1;if(L(a)||F(a)||C&&a instanceof C)return!0;
var b="length"in Object(a)&&a.length;return N(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function n(a,b,d){var c,e;if(a)if(D(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(L(a)||Ca(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==n)a.forEach(b,d,a);else if(qc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&
b.call(d,a[c],c,a);else for(c in a)sa.call(a,c)&&b.call(d,a[c],c,a);return a}function rc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function sc(a){return function(b,d){a(d,b)}}function Yd(){return++pb}function Qb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(E(g)||D(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],r=g[m];d&&E(r)?V(r)?a[m]=new Date(r.valueOf()):$a(r)?a[m]=new RegExp(r):r.nodeName?a[m]=r.cloneNode(!0):
Rb(r)?a[m]=r.clone():(E(a[m])||(a[m]=L(r)?[]:{}),Qb(a[m],[r],!0)):a[m]=r}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function T(a){return Qb(a,wa.call(arguments,1),!1)}function Zd(a){return Qb(a,wa.call(arguments,1),!0)}function ca(a){return parseInt(a,10)}function Sb(a,b){return T(Object.create(a),b)}function B(){}function ab(a){return a}function ba(a){return function(){return a}}function tc(a){return D(a.toString)&&a.toString!==ga}function x(a){return"undefined"===typeof a}function y(a){return"undefined"!==
typeof a}function E(a){return null!==a&&"object"===typeof a}function qc(a){return null!==a&&"object"===typeof a&&!uc(a)}function F(a){return"string"===typeof a}function N(a){return"number"===typeof a}function V(a){return"[object Date]"===ga.call(a)}function D(a){return"function"===typeof a}function $a(a){return"[object RegExp]"===ga.call(a)}function Za(a){return a&&a.window===a}function bb(a){return a&&a.$evalAsync&&a.$watch}function Na(a){return"boolean"===typeof a}function $d(a){return a&&N(a.length)&&
ae.test(ga.call(a))}function Rb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function be(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function ra(a){return G(a.nodeName||a[0]&&a[0].nodeName)}function cb(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function Oa(a,b){function d(a,b){var d=b.$$hashKey,e;if(L(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(qc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&
(b[e]=c(a[e]));else for(e in a)sa.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!E(a))return a;var b=f.indexOf(a);if(-1!==b)return g[b];if(Za(a)||bb(a))throw Da("cpws");var b=!1,c=e(a);c===v&&(c=L(a)?[]:Object.create(uc(a)),b=!0);f.push(a);g.push(c);return b?d(a,c):c}function e(a){switch(ga.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(c(a.buffer));
case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),b.lastIndex=a.lastIndex,b}if(D(a.cloneNode))return a.cloneNode(!0)}var f=[],g=[];if(b){if($d(b)||"[object ArrayBuffer]"===ga.call(b))throw Da("cpta");
if(a===b)throw Da("cpi");L(b)?b.length=0:n(b,function(a,c){"$$hashKey"!==c&&delete b[c]});f.push(a);g.push(b);return d(a,b)}return c(a)}function na(a,b){if(L(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(E(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function oa(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d==typeof b&&"object"==d)if(L(a)){if(!L(b))return!1;if((d=a.length)==b.length){for(c=
0;c<d;c++)if(!oa(a[c],b[c]))return!1;return!0}}else{if(V(a))return V(b)?oa(a.getTime(),b.getTime()):!1;if($a(a))return $a(b)?a.toString()==b.toString():!1;if(bb(a)||bb(b)||Za(a)||Za(b)||L(b)||V(b)||$a(b))return!1;d=Z();for(c in a)if("$"!==c.charAt(0)&&!D(a[c])){if(!oa(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&y(b[c])&&!D(b[c]))return!1;return!0}return!1}function db(a,b,d){return a.concat(wa.call(b,d))}function vc(a,b){var d=2<arguments.length?wa.call(arguments,2):[];
return!D(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,db(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function ce(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=v:Za(b)?d="$WINDOW":b&&W===b?d="$DOCUMENT":bb(b)&&(d="$SCOPE");return d}function eb(a,b){if(x(a))return v;N(b)||(b=b?2:null);return JSON.stringify(a,ce,b)}function wc(a){return F(a)?JSON.parse(a):a}function xc(a,b){a=a.replace(de,
"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return isNaN(d)?b:d}function Tb(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=xc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function ta(a){a=C(a).clone();try{a.empty()}catch(b){}var d=C("<div>").append(a).html();try{return a[0].nodeType===Pa?G(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+G(b)})}catch(c){return G(d)}}function yc(a){try{return decodeURIComponent(a)}catch(b){}}function zc(a){var b=
{};n((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=yc(e),y(e)&&(f=y(f)?yc(f):!0,sa.call(b,e)?L(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Ub(a){var b=[];n(a,function(a,c){L(a)?n(a,function(a){b.push(ha(c,!0)+(!0===a?"":"="+ha(a,!0)))}):b.push(ha(c,!0)+(!0===a?"":"="+ha(a,!0)))});return b.length?b.join("&"):""}function qb(a){return ha(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,
"+")}function ha(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ee(a,b){var d,c,e=Qa.length;for(c=0;c<e;++c)if(d=Qa[c]+b,F(d=a.getAttribute(d)))return d;return null}function fe(a,b){var d,c,e={};n(Qa,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});n(Qa,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&
(d=e,c=e.getAttribute(b))});d&&(e.strictDi=null!==ee(d,"strict-di"),b(d,c?[c]:[],e))}function Ac(a,b,d){E(d)||(d={});d=T({strictDi:!1},d);var c=function(){a=C(a);if(a.injector()){var c=a[0]===W?"document":ta(a);throw Da("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement",
"$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;O&&e.test(O.name)&&(d.debugInfoEnabled=!0,O.name=O.name.replace(e,""));if(O&&!f.test(O.name))return c();O.name=O.name.replace(f,"");ia.resumeBootstrap=function(a){n(a,function(a){b.push(a)});return c()};D(ia.resumeDeferredBootstrap)&&ia.resumeDeferredBootstrap()}function ge(){O.name="NG_ENABLE_DEBUG_INFO!"+O.name;O.location.reload()}function he(a){a=
ia.element(a).injector();if(!a)throw Da("test");return a.get("$$testability")}function Bc(a,b){b=b||"_";return a.replace(ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function je(){var a;if(!Cc){var b=rb();(ua=x(b)?O.jQuery:b?O[b]:v)&&ua.fn.on?(C=ua,T(ua.fn,{scope:Ra.scope,isolateScope:Ra.isolateScope,controller:Ra.controller,injector:Ra.injector,inheritedData:Ra.inheritedData}),a=ua.cleanData,ua.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=ua._data(f,"events"))&&c.$destroy&&ua(f).triggerHandler("$destroy");
a(b)}):C=U;ia.element=C;Cc=!0}}function sb(a,b,d){if(!a)throw Da("areq",b||"?",d||"required");return a}function Sa(a,b,d){d&&L(a)&&(a=a[a.length-1]);sb(D(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ta(a,b){if("hasOwnProperty"===a)throw Da("badname",b);}function Dc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=b[g],a&&(a=(e=a)[c]);return!d&&D(a)?vc(e,a):a}function tb(a){for(var b=a[0],d=a[a.length-1],c,
e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=C(wa.call(a,0,e))),c.push(b);return c||a}function Z(){return Object.create(null)}function ke(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=H("$injector"),c=H("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||H;return b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&&(a[f]=null);return b(a,f,function(){function a(b,d,e,f){f||(f=c);return function(){f[e||"push"]([b,
d,arguments]);return K}}function b(a,d){return function(b,e){e&&D(e)&&(e.$$moduleName=f);c.push([a,d,arguments]);return K}}if(!g)throw d("nomod",f);var c=[],e=[],s=[],I=a("$injector","invoke","push",e),K={_invokeQueue:c,_configBlocks:e,_runBlocks:s,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider",
"register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:I,run:function(a){s.push(a);return this}};h&&I(h);return K})}})}function le(a){T(a,{bootstrap:Ac,copy:Oa,extend:T,merge:Zd,equals:oa,element:C,forEach:n,injector:fb,noop:B,bind:vc,toJson:eb,fromJson:wc,identity:ab,isUndefined:x,isDefined:y,isString:F,isFunction:D,isObject:E,isNumber:N,isElement:Rb,isArray:L,
version:me,isDate:V,lowercase:G,uppercase:ub,callbacks:{counter:0},getTestability:he,$$minErr:H,$$csp:Ea,reloadWithDebugInfo:ge});Vb=ke(O);Vb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:ne});a.provider("$compile",Ec).directive({a:oe,input:Fc,textarea:Fc,form:pe,script:qe,select:re,style:se,option:te,ngBind:ue,ngBindHtml:ve,ngBindTemplate:we,ngClass:xe,ngClassEven:ye,ngClassOdd:ze,ngCloak:Ae,ngController:Be,ngForm:Ce,ngHide:De,ngIf:Ee,ngInclude:Fe,ngInit:Ge,ngNonBindable:He,
ngPluralize:Ie,ngRepeat:Je,ngShow:Ke,ngStyle:Le,ngSwitch:Me,ngSwitchWhen:Ne,ngSwitchDefault:Oe,ngOptions:Pe,ngTransclude:Qe,ngModel:Re,ngList:Se,ngChange:Te,pattern:Gc,ngPattern:Gc,required:Hc,ngRequired:Hc,minlength:Ic,ngMinlength:Ic,maxlength:Jc,ngMaxlength:Jc,ngValue:Ue,ngModelOptions:Ve}).directive({ngInclude:We}).directive(vb).directive(Kc);a.provider({$anchorScroll:Xe,$animate:Ye,$animateCss:Ze,$$animateJs:$e,$$animateQueue:af,$$AnimateRunner:bf,$$animateAsyncRun:cf,$browser:df,$cacheFactory:ef,
$controller:ff,$document:gf,$exceptionHandler:hf,$filter:Lc,$$forceReflow:jf,$interpolate:kf,$interval:lf,$http:mf,$httpParamSerializer:nf,$httpParamSerializerJQLike:of,$httpBackend:pf,$xhrFactory:qf,$location:rf,$log:sf,$parse:tf,$rootScope:uf,$q:vf,$$q:wf,$sce:xf,$sceDelegate:yf,$sniffer:zf,$templateCache:Af,$templateRequest:Bf,$$testability:Cf,$timeout:Df,$window:Ef,$$rAF:Ff,$$jqLite:Gf,$$HashMap:Hf,$$cookieReader:If})}])}function gb(a){return a.replace(Jf,function(a,d,c,e){return e?c.toUpperCase():
c}).replace(Kf,"Moz$1")}function Mc(a){a=a.nodeType;return 1===a||!a||9===a}function Nc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Wb.test(a)){d=d||e.appendChild(b.createElement("div"));c=(Lf.exec(a)||["",""])[1].toLowerCase();c=da[c]||da._default;d.innerHTML=c[1]+a.replace(Mf,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=db(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";n(f,function(a){e.appendChild(a)});return e}function Oc(a,
b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function U(a){if(a instanceof U)return a;var b;F(a)&&(a=X(a),b=!0);if(!(this instanceof U)){if(b&&"<"!=a.charAt(0))throw Xb("nosel");return new U(a)}if(b){b=W;var d;a=(d=Nf.exec(a))?[b.createElement(d[1])]:(d=Nc(a,b))?d.childNodes:[]}Pc(this,a)}function Yb(a){return a.cloneNode(!0)}function wb(a,b){b||hb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)hb(d[c])}function Qc(a,b,d,c){if(y(c))throw Xb("offargs");
var e=(c=xb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];y(d)&&cb(c||[],d);y(d)&&c&&0<c.length||(a.removeEventListener(b,f,!1),delete e[b])};n(b.split(" "),function(a){g(a);yb[a]&&g(yb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function hb(a,b){var d=a.ng339,c=d&&ib[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Qc(a)),delete ib[d],a.ng339=v))}function xb(a,b){var d=a.ng339,d=d&&ib[d];b&&!d&&(a.ng339=d=++Of,
d=ib[d]={events:{},data:{},handle:v});return d}function Zb(a,b,d){if(Mc(a)){var c=y(d),e=!c&&b&&!E(b),f=!b;a=(a=xb(a,!e))&&a.data;if(c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];T(a,b)}}}function zb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function Ab(a,b){b&&a.setAttribute&&n(b.split(" "),function(b){a.setAttribute("class",X((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+X(b)+" "," ")))})}function Bb(a,
b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");n(b.split(" "),function(a){a=X(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",X(d))}}function Pc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Rc(a,b){return Cb(a,"$"+(b||"ngController")+"Controller")}function Cb(a,b,d){9==a.nodeType&&(a=a.documentElement);for(b=
L(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(y(d=C.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Sc(a){for(wb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function $b(a,b){b||wb(a);var d=a.parentNode;d&&d.removeChild(a)}function Pf(a,b){b=b||O;if("complete"===b.document.readyState)b.setTimeout(a);else C(b).on("load",a)}function Tc(a,b){var d=Db[b.toLowerCase()];return d&&Uc[ra(a)]&&d}function Qf(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};
var f=b[d||c.type],g=f?f.length:0;if(g){if(x(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||Rf;1<g&&(f=na(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};d.elem=a;return d}function Rf(a,b,d){d.call(a,b)}function Sf(a,b,
d){var c=b.relatedTarget;c&&(c===a||Tf.call(a,c))||d.call(a,b)}function Gf(){this.$get=function(){return T(U,{hasClass:function(a,b){a.attr&&(a=a[0]);return zb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Bb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return Ab(a,b)}})}}function Fa(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"==d||"object"==d&&null!==a?a.$$hashKey=d+":"+(b||Yd)():d+":"+a}function Ua(a,b){if(b){var d=0;this.nextUid=
function(){return++d}}n(a,this.put,this)}function Vc(a){a=a.toString().replace(Uf,"");return a.match(Vf)||a.match(Wf)}function Xf(a){return(a=Vc(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function fb(a,b){function d(a){return function(b,c){if(E(b))n(b,sc(a));else return a(b,c)}}function c(a,b){Ta(a,"service");if(D(b)||L(b))b=s.instantiate(b);if(!b.$get)throw Ga("pget",a);return r[a+"Provider"]=b}function e(a,b){return function(){var c=t.invoke(b,this);if(x(c))throw Ga("undef",a);
return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){sb(x(a)||L(a),"modulesToLoad","not an array");var b=[],c;n(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=s.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{F(a)?(c=Vb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):D(a)?b.push(s.invoke(a)):L(a)?b.push(s.invoke(a)):Sa(a,"module")}catch(e){throw L(a)&&(a=a[a.length-1]),e.message&&e.stack&&
-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ga("modulerr",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ga("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=fb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!==typeof l)throw Ga("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:
d(l,f))}return g}return{invoke:function(a,b,c,d){"string"===typeof c&&(d=c,c=null);c=e(a,c,d);L(a)&&(a=a[a.length-1]);d=11>=xa?!1:"function"===typeof a&&/^(?:class\s|constructor\()/.test(Function.prototype.toString.call(a));return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=L(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,a))},get:d,annotate:fb.$$annotate,has:function(b){return r.hasOwnProperty(b+
"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Ua([],!0),r={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,ba(b),!1)}),constant:d(function(a,b){Ta(a,"constant");r[a]=b;I[a]=b}),decorator:function(a,b){var c=s.get(a+"Provider"),d=c.$get;c.$get=function(){var a=t.invoke(d,c);return t.invoke(b,null,{$delegate:a})}}}},s=r.$injector=h(r,function(a,b){ia.isString(b)&&l.push(b);
throw Ga("unpr",l.join(" <- "));}),I={},K=h(I,function(a,b){var c=s.get(a+"Provider",b);return t.invoke(c.$get,c,v,a)}),t=K;r.$injectorProvider={$get:ba(K)};var p=g(a),t=K.get("$injector");t.strictDi=b;n(p,function(a){a&&t.invoke(a)});return t}function Xe(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===ra(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();
var c;c=g.yOffset;D(c)?c=c():Rb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):N(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=F(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||Pf(function(){c.$evalAsync(g)})});return g}]}function jb(a,b){if(!a&&!b)return"";
if(!a)return b;if(!b)return a;L(a)&&(a=a.join(" "));L(b)&&(b=b.join(" "));return a+" "+b}function Yf(a){F(a)&&(a=a.split(" "));var b=Z();n(a,function(a){a.length&&(b[a]=!0)});return b}function Ha(a){return E(a)?a:{}}function Zf(a,b,d,c){function e(a){try{a.apply(null,wa.call(arguments,1))}finally{if(K--,0===K)for(;t.length;)try{t.pop()()}catch(b){d.error(b)}}}function f(){z=null;g();h()}function g(){a:{try{p=m.state;break a}catch(a){}p=void 0}p=x(p)?null:p;oa(p,$)&&(p=$);$=p}function h(){if(u!==k.url()||
w!==p)u=k.url(),w=p,n(A,function(a){a(k.url(),p)})}var k=this,l=a.location,m=a.history,r=a.setTimeout,s=a.clearTimeout,I={};k.isMock=!1;var K=0,t=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){K++};k.notifyWhenNoOutstandingRequests=function(a){0===K?a():t.push(a)};var p,w,u=l.href,la=b.find("base"),z=null;g();w=p;k.url=function(b,d,e){x(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=w===e;if(u===b&&(!c.history||f))return k;var h=
u&&Ia(u)===Ia(b);u=b;w=e;if(!c.history||h&&f){if(!h||z)z=b;d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(z=b)}else m[d?"replaceState":"pushState"](e,"",b),g(),w=p;return k}return z||l.href.replace(/%27/g,"'")};k.state=function(){return p};var A=[],Q=!1,$=null;k.onUrlChange=function(b){if(!Q){if(c.history)C(a).on("popstate",f);C(a).on("hashchange",f);Q=!0}A.push(b);return b};k.$$applicationDestroyed=function(){C(a).off("hashchange popstate",f)};k.$$checkUrlChange=
h;k.baseHref=function(){var a=la.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;K++;c=r(function(){delete I[c];e(a)},b||0);I[c]=!0;return c};k.defer.cancel=function(a){return I[a]?(delete I[a],s(a),e(B),!0):!1}}function df(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new Zf(a,c,b,d)}]}function ef(){this.$get=function(){function a(a,c){function e(a){a!=r&&(s?s==a&&(s=a.n):s=a,f(a.n,a.p),f(a,r),r=a,r.n=null)}function f(a,
b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw H("$cacheFactory")("iid",a);var g=0,h=T({},c,{id:a}),k=Z(),l=c&&c.capacity||Number.MAX_VALUE,m=Z(),r=null,s=null;return b[a]={put:function(a,b){if(!x(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}a in k||g++;k[a]=b;g>l&&this.remove(s.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==r&&(r=b.p);b==s&&(s=b.n);f(b.n,b.p);delete m[a]}a in
k&&(delete k[a],g--)},removeAll:function(){k=Z();g=0;m=Z();r=s=null},destroy:function(){m=h=k=null;delete b[a]},info:function(){return T({},h,{size:g})}}}var b={};a.info=function(){var a={};n(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function Af(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Ec(a,b){function d(a,b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,e={};n(a,function(a,f){var g=a.match(d);if(!g)throw ja("iscp",b,f,a,c?
"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f}});return e}function c(a){var b=a.charAt(0);if(!b||b!==G(b))throw ja("baddir",a);if(a!==a.trim())throw ja("baddir",a);}var e={},f=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,g=/(([\w\-]+)(?:\:([^;]+))?;?)/,h=be("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,l=/^(on[a-z]+|formaction)$/;this.directive=function s(b,f){Ta(b,"directive");F(b)?(c(b),sb(f,"directiveFactory"),
e.hasOwnProperty(b)||(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var f=[];n(e[b],function(e,g){try{var h=a.invoke(e);D(h)?h={compile:ba(h)}:!h.compile&&h.link&&(h.compile=ba(h.link));h.priority=h.priority||0;h.index=g;h.name=h.name||b;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";var k=h,l=h,m=h.name,s={isolateScope:null,bindToController:null};E(l.scope)&&(!0===l.bindToController?(s.bindToController=d(l.scope,m,!0),s.isolateScope={}):s.isolateScope=
d(l.scope,m,!1));E(l.bindToController)&&(s.bindToController=d(l.bindToController,m,!0));if(E(s.bindToController)){var P=l.controller,S=l.controllerAs;if(!P)throw ja("noctrl",m);if(!Wc(P,S))throw ja("noident",m);}var ma=k.$$bindings=s;E(ma.isolateScope)&&(h.$$isolateBindings=ma.isolateScope);h.$$moduleName=e.$$moduleName;f.push(h)}catch(K){c(K)}});return f}])),e[b].push(f)):n(b,sc(s));return this};this.component=function(a,b){function c(a){function e(b){return D(b)||L(b)?function(c,d){return a.invoke(b,
this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"";return{controller:d,controllerAs:Wc(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require}}var d=b.controller||function(){};n(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a)});c.$inject=["$injector"];return this.directive(a,c)};this.aHrefSanitizationWhitelist=function(a){return y(a)?(b.aHrefSanitizationWhitelist(a),
this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return y(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var m=!0;this.debugInfoEnabled=function(a){return y(a)?(m=a,this):m};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,d,p,w,u,la,z,A){function Q(a,b,c){ba.innerHTML="<span "+b+">";b=ba.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);
d.value=c;a.attributes.setNamedItem(d)}function $(a,b){try{a.addClass(b)}catch(c){}}function M(a,b,c,d,e){a instanceof C||(a=C(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Pa&&k.nodeValue.match(f)&&Oc(k,a[g]=W.createElement("span"))}var l=P(a,b,a,c,d,e);M.$$addScopeClass(a);var m=null;return function(b,c,d){sb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;d=d.futureParentElement;f&&f.$$boundTransclude&&
(f=f.$$boundTransclude);m||(m=(d=d&&d[0])?"foreignobject"!==ra(d)&&ga.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==m?C(U(m,C("<div>").append(a).html())):c?Ra.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);M.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function P(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,s,u;if(A)for(u=Array(c.length),m=0;m<h.length;m+=3)f=h[m],u[f]=c[f];else u=c;m=0;for(p=h.length;m<p;)k=u[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=
a.$new(),M.$$addScopeInfo(C(k),l)):l=a,s=c.transcludeOnThisElement?S(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?S(a,b):null,c(f,l,k,d,s)):f&&f(a,k.childNodes,v,e)}for(var h=[],k,l,m,p,A,s=0;s<a.length;s++){k=new na;l=ma(a[s],[],k,0===s?d:v,e);(f=l.length?y(l,a[s],k,b,c,null,[],[],f):null)&&f.scope&&M.$$addScopeClass(k.$$element);k=f&&f.terminal||!(m=a[s].childNodes)||!m.length?null:P(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(s,f,k),p=!0,A=
A||f;f=null}return p?g:null}function S(a,b,c){var d=function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,{parentBoundTranscludeFn:c,transcludeControllers:f,futureParentElement:g})},e=d.$$slots=Z(),f;for(f in b.$$slots)e[f]=b.$$slots[f]?S(a,b.$$slots[f],c):null;return d}function ma(a,b,c,d,e){var h=c.$attr,k;switch(a.nodeType){case 1:H(b,va(ra(a)),"E",d,e);for(var l,m,p,s=a.attributes,A=0,u=s&&s.length;A<u;A++){var t=!1,w=!1;l=s[A];k=l.name;m=X(l.value);l=va(k);if(p=pa.test(l))k=
k.replace(Xc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});(l=l.match(ua))&&O(l[1])&&(t=k,w=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6));l=va(k.toLowerCase());h[l]=k;if(p||!c.hasOwnProperty(l))c[l]=m,Tc(a,l)&&(c[l]=!0);Y(a,b,m,l,p);H(b,l,"A",d,e,t,w)}a=a.className;E(a)&&(a=a.animVal);if(F(a)&&""!==a)for(;k=g.exec(a);)l=va(k[2]),H(b,l,"C",d,e)&&(c[l]=X(k[3])),a=a.substr(k.index+k[0].length);break;case Pa:if(11===xa)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===
Pa;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);N(b,a.nodeValue);break;case 8:try{if(k=f.exec(a.nodeValue))l=va(k[1]),H(b,l,"M",d,e)&&(c[l]=X(k[2]))}catch(M){}}b.sort(ya);return b}function q(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ja("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return C(d)}function Yc(a,b,c){return function(d,e,f,g,h){e=q(e[0],b,
c);return a(d,e,f,g,h)}}function ac(a,b,c,d,e,f){if(a)return M(b,c,d,e,f);var g;return function(){g||(g=M(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function y(a,b,d,e,f,g,h,l,m){function p(a,b,c,d){if(a){c&&(a=Yc(a,c,d));a.require=J.require;a.directiveName=H;if(P===J||J.$$isolateScope)a=ca(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=Yc(b,c,d));b.require=J.require;b.directiveName=H;if(P===J||J.$$isolateScope)b=ca(b,{isolateScope:!0});l.push(b)}}function s(a,b,c,d){var e;if(F(b)){var f=
b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ja("ctreq",b,a);}else if(L(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=s(a,b[g],c,d);else E(b)&&(e={},n(b,function(b,f){e[f]=s(a,b,c,d)}));return e||null}function A(a,b,c,d,e,f){var g=Z(),h;for(h in d){var k=d[h],l={$scope:k===P||k.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},m=k.controller;"@"==m&&
(m=b[k.name]);l=w(m,l,!0,k.controllerAs);g[k.name]=l;B||a.data("$"+k.name+"Controller",l.instance)}return g}function u(a,c,e,f,g){function k(a,b,c,d){var e;bb(a)||(d=c,c=b,b=a,a=v);B&&(e=ma);c||(c=B?z.parent():z);if(d){var f=g.$$slots[d];if(f)return f(a,b,e,c,Eb);if(x(f))throw ja("noslot",d,ta(z));}else return g(a,b,e,c,Eb)}var m,p,t,w,ma,S,z,Ja;b===e?(f=d,z=d.$$element):(z=C(e),f=new na(z,d));t=c;P?w=c.$new(!0):Q&&(t=c.$parent);g&&(S=k,S.$$boundTransclude=g,S.isSlotFilled=function(a){return!!g.$$slots[a]});
I&&(ma=A(z,f,S,I,w,c));P&&(M.$$addScopeInfo(z,w,!0,!($&&($===P||$===P.$$originalDirective))),M.$$addScopeClass(z,!0),w.$$isolateBindings=P.$$isolateBindings,(Ja=ia(c,f,w,w.$$isolateBindings,P))&&w.$on("$destroy",Ja));for(p in ma){Ja=I[p];var K=ma[p],la=Ja.$$bindings.bindToController;K.identifier&&la&&(m=ia(t,f,K.instance,la,Ja));var q=K();q!==K.instance&&(K.instance=q,z.data("$"+Ja.name+"Controller",q),m&&m(),m=ia(t,f,K.instance,la,Ja))}n(I,function(a,b){var c=a.require;a.bindToController&&!L(c)&&
E(c)&&T(ma[b].instance,s(b,c,z,ma))});n(ma,function(a){D(a.instance.$onInit)&&a.instance.$onInit()});m=0;for(p=h.length;m<p;m++)t=h[m],ka(t,t.isolateScope?w:c,z,f,t.require&&s(t.directiveName,t.require,z,ma),S);var Eb=c;P&&(P.template||null===P.templateUrl)&&(Eb=w);a&&a(Eb,e.childNodes,v,g);for(m=l.length-1;0<=m;m--)t=l[m],ka(t,t.isolateScope?w:c,z,f,t.require&&s(t.directiveName,t.require,z,ma),S)}m=m||{};for(var t=-Number.MAX_VALUE,Q=m.newScopeDirective,I=m.controllerDirectives,P=m.newIsolateScopeDirective,
$=m.templateDirective,S=m.nonTlbTranscludeDirective,z=!1,la=!1,B=m.hasElementTranscludeDirective,ea=d.$$element=C(b),J,H,G,ya=e,O,N=!1,Fb=!1,fa,R=0,Va=a.length;R<Va;R++){J=a[R];var Y=J.$$start,ba=J.$$end;Y&&(ea=q(b,Y,ba));G=v;if(t>J.priority)break;if(fa=J.scope)J.templateUrl||(E(fa)?(Wa("new/isolated scope",P||Q,J,ea),P=J):Wa("new/isolated scope",P,J,ea)),Q=Q||J;H=J.name;if(!N&&(J.replace&&(J.templateUrl||J.template)||J.transclude&&!J.$$tlb)){for(fa=R+1;N=a[fa++];)if(N.transclude&&!N.$$tlb||N.replace&&
(N.templateUrl||N.template)){Fb=!0;break}N=!0}!J.templateUrl&&J.controller&&(fa=J.controller,I=I||Z(),Wa("'"+H+"' controller",I[H],J,ea),I[H]=J);if(fa=J.transclude)if(z=!0,J.$$tlb||(Wa("transclusion",S,J,ea),S=J),"element"==fa)B=!0,t=J.priority,G=ea,ea=d.$$element=C(W.createComment(" "+H+": "+d[H]+" ")),b=ea[0],aa(f,wa.call(G,0),b),ya=ac(Fb,G,e,t,g&&g.name,{nonTlbTranscludeDirective:S});else{var V=Z();G=C(Yb(b)).contents();if(E(fa)){G=[];var ha=Z(),da=Z();n(fa,function(a,b){var c="?"===a.charAt(0);
a=c?a.substring(1):a;ha[a]=b;V[b]=null;da[b]=c});n(ea.contents(),function(a){var b=ha[va(ra(a))];b?(da[b]=!0,V[b]=V[b]||[],V[b].push(a)):G.push(a)});n(da,function(a,b){if(!a)throw ja("reqslot",b);});for(var ga in V)V[ga]&&(V[ga]=ac(Fb,V[ga],e))}ea.empty();ya=ac(Fb,G,e,v,v,{needsNewScope:J.$$isolateScope||J.$$newScope});ya.$$slots=V}if(J.template)if(la=!0,Wa("template",$,J,ea),$=J,fa=D(J.template)?J.template(ea,d):J.template,fa=qa(fa),J.replace){g=J;G=Wb.test(fa)?Zc(U(J.templateNamespace,X(fa))):[];
b=G[0];if(1!=G.length||1!==b.nodeType)throw ja("tplrt",H,"");aa(f,ea,b);Va={$attr:{}};fa=ma(b,[],Va);var oa=a.splice(R+1,a.length-(R+1));(P||Q)&&$c(fa,P,Q);a=a.concat(fa).concat(oa);ad(d,Va);Va=a.length}else ea.html(fa);if(J.templateUrl)la=!0,Wa("template",$,J,ea),$=J,J.replace&&(g=J),u=$f(a.splice(R,a.length-R),ea,d,f,z&&ya,h,l,{controllerDirectives:I,newScopeDirective:Q!==J&&Q,newIsolateScopeDirective:P,templateDirective:$,nonTlbTranscludeDirective:S}),Va=a.length;else if(J.compile)try{O=J.compile(ea,
d,ya),D(O)?p(null,O,Y,ba):O&&p(O.pre,O.post,Y,ba)}catch(pa){c(pa,ta(ea))}J.terminal&&(u.terminal=!0,t=Math.max(t,J.priority))}u.scope=Q&&!0===Q.scope;u.transcludeOnThisElement=z;u.templateOnThisElement=la;u.transclude=ya;m.hasElementTranscludeDirective=B;return u}function $c(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Sb(a[d],{$$isolateScope:b,$$newScope:c})}function H(b,d,f,g,h,k,l){if(d===h)return null;h=null;if(e.hasOwnProperty(d)){var m;d=a.get(d+"Directive");for(var p=0,A=d.length;p<A;p++)try{m=
d[p],(x(g)||g>m.priority)&&-1!=m.restrict.indexOf(f)&&(k&&(m=Sb(m,{$$start:k,$$end:l})),b.push(m),h=m)}catch(t){c(t)}}return h}function O(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d<f;d++)if(b=c[d],b.multiElement)return!0;return!1}function ad(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;n(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});n(b,function(b,f){"class"==f?($(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+
b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function $f(a,b,c,e,f,g,h,k){var l=[],m,p,s=b[0],A=a.shift(),u=Sb(A,{templateUrl:null,transclude:null,replace:null,$$originalDirective:A}),w=D(A.templateUrl)?A.templateUrl(b,c):A.templateUrl,Q=A.templateNamespace;b.empty();d(w).then(function(d){var t,I;d=qa(d);if(A.replace){d=Wb.test(d)?Zc(U(Q,X(d))):[];t=d[0];if(1!=d.length||1!==t.nodeType)throw ja("tplrt",
A.name,w);d={$attr:{}};aa(e,b,t);var M=ma(t,[],d);E(A.scope)&&$c(M,!0);a=M.concat(a);ad(c,d)}else t=s,b.html(d);a.unshift(u);m=y(a,t,c,f,b,A,g,h,k);n(e,function(a,c){a==t&&(e[c]=b[0])});for(p=P(b[0].childNodes,f);l.length;){d=l.shift();I=l.shift();var z=l.shift(),K=l.shift(),M=b[0];if(!d.$$destroyed){if(I!==s){var la=I.className;k.hasElementTranscludeDirective&&A.replace||(M=Yb(t));aa(z,C(I),M);$(C(M),la)}I=m.transcludeOnThisElement?S(d,m.transclude,K):K;m(p,d,M,e,I)}}l=null});return function(a,b,
c,d,e){a=e;b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=S(b,m.transclude,e)),m(p,b,c,d,a)))}}function ya(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function Wa(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ja("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,ta(d));}function N(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&M.$$addBindingClass(a);
return function(a,c){var e=c.parent();b||M.$$addBindingClass(e);M.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function U(a,b){a=G(a||"html");switch(a){case "svg":case "math":var c=W.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function R(a,b){if("srcdoc"==b)return la.HTML;var c=ra(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return la.RESOURCE_URL}function Y(a,c,d,e,
f){var g=R(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===ra(a))throw ja("selmulti",ta(a));c.push({priority:100,compile:function(){return{pre:function(a,c,h){c=h.$$observers||(h.$$observers=Z());if(l.test(e))throw ja("nodomevents");var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function aa(a,b,c){var d=b[0],e=b.length,
f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=c);break}f&&f.replaceChild(c,d);a=W.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);C.hasData(d)&&(C.data(c,C.data(d)),C(d).off("$destroy"));C.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function ca(a,b){return T(function(){return a.apply(null,arguments)},a,b)}function ka(a,
b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ta(d))}}function ia(a,c,d,e,f){var g=[];n(e,function(e,h){var k=e.attrName,l=e.optional,m,A,s,t;switch(e.mode){case "@":l||sa.call(c,k)||(d[h]=c[k]=void 0);c.$observe(k,function(a){F(a)&&(d[h]=a)});c.$$observers[k].$$scope=a;m=c[k];F(m)?d[h]=b(m)(a):Na(m)&&(d[h]=m);break;case "=":if(!sa.call(c,k)){if(l)break;c[k]=void 0}if(l&&!c[k])break;A=p(c[k]);t=A.literal?oa:function(a,b){return a===b||a!==a&&b!==b};s=A.assign||function(){m=d[h]=A(a);throw ja("nonassign",
c[k],k,f.name);};m=d[h]=A(a);l=function(b){t(b,d[h])||(t(b,m)?s(a,b=d[h]):d[h]=b);return m=b};l.$stateful=!0;l=e.collection?a.$watchCollection(c[k],l):a.$watch(p(c[k],l),null,A.literal);g.push(l);break;case "<":if(!sa.call(c,k)){if(l)break;c[k]=void 0}if(l&&!c[k])break;A=p(c[k]);d[h]=A(a);l=a.$watch(A,function(a){d[h]=a},A.literal);g.push(l);break;case "&":A=c.hasOwnProperty(k)?p(c[k]):B;if(A===B&&l)break;d[h]=function(b){return A(a,b)}}});return g.length&&function(){for(var a=0,b=g.length;a<b;++a)g[a]()}}
var V=/^\w/,ba=W.createElement("div"),na=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a};na.prototype={$normalize:va,$addClass:function(a){a&&0<a.length&&z.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&z.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=bd(a,b);c&&c.length&&z.addClass(this.$$element,c);(c=bd(b,a))&&c.length&&z.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=
Tc(this.$$element[0],a),g=cd[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Bc(a,"-"));f=ra(this.$$element);if("a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=A(b,"src"===a);else if("img"===f&&"srcset"===a){for(var f="",g=X(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+A(X(g[m]),!0),f=f+(" "+X(g[m+1]));g=X(g[2*l]).split(/\s/);
f+=A(X(g[0]),!0);2===g.length&&(f+=" "+X(g[1]));this[a]=b=f}!1!==d&&(null===b||x(b)?this.$$element.removeAttr(e):V.test(e)?this.$$element.attr(e,b):Q(this.$$element[0],e,b));(a=this.$$observers)&&n(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=Z()),e=d[a]||(d[a]=[]);e.push(b);u.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||x(c[a])||b(c[a])});return function(){cb(e,b)}}};var ha=b.startSymbol(),da=b.endSymbol(),qa="{{"==ha&&"}}"==
da?ab:function(a){return a.replace(/\{\{/g,ha).replace(/}}/g,da)},pa=/^ngAttr[A-Z]/,ua=/^(.+)Start$/;M.$$addBindingInfo=m?function(a,b){var c=a.data("$binding")||[];L(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:B;M.$$addBindingClass=m?function(a){$(a,"ng-binding")}:B;M.$$addScopeInfo=m?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:B;M.$$addScopeClass=m?function(a,b){$(a,b?"ng-isolate-scope":"ng-scope")}:B;return M}]}function va(a){return gb(a.replace(Xc,
""))}function bd(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function Zc(a){a=C(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&ag.call(a,b,1);return a}function Wc(a,b){if(b&&F(b))return b;if(F(a)){var d=dd.exec(a);if(d)return d[3]}}function ff(){var a={},b=!1;this.register=function(b,c){Ta(b,"controller");E(b)?T(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=
["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!E(a.$scope))throw H("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,r;h=!0===h;k&&F(k)&&(r=k);if(F(f)){k=f.match(dd);if(!k)throw bg("ctrlfmt",f);m=k[1];r=r||k[3];f=a.hasOwnProperty(m)?a[m]:Dc(g.$scope,m,!0)||(b?Dc(c,m,!0):v);Sa(f,m,!0)}if(h)return h=(L(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),r&&e(g,r,l,m||f.name),T(function(){var a=d.invoke(f,l,g,m);a!==l&&(E(a)||D(a))&&(l=a,r&&e(g,r,l,m||f.name));
return l},{instance:l,identifier:r});l=d.instantiate(f,g,m);r&&e(g,r,l,m||f.name);return l}}]}function gf(){this.$get=["$window",function(a){return C(a.document)}]}function hf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function bc(a){return E(a)?V(a)?a.toISOString():eb(a):a}function nf(){this.$get=function(){return function(a){if(!a)return"";var b=[];rc(a,function(a,c){null===a||x(a)||(L(a)?n(a,function(a,d){b.push(ha(c)+"="+ha(bc(a)))}):b.push(ha(c)+"="+ha(bc(a))))});
return b.join("&")}}}function of(){this.$get=function(){return function(a){function b(a,e,f){null===a||x(a)||(L(a)?n(a,function(a,c){b(a,e+"["+(E(a)?c:"")+"]")}):E(a)&&!V(a)?rc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ha(e)+"="+ha(bc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function cc(a,b){if(F(a)){var d=a.replace(cg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(ed))||(c=(c=d.match(dg))&&eg[c[0]].test(d));c&&(a=wc(d))}}return a}function fd(a){var b=
Z(),d;F(a)?n(a.split("\n"),function(a){d=a.indexOf(":");var e=G(X(a.substr(0,d)));a=X(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):E(a)&&n(a,function(a,d){var f=G(d),g=X(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function gd(a){var b;return function(d){b||(b=fd(a));return d?(d=b[G(d)],void 0===d&&(d=null),d):b}}function hd(a,b,d,c){if(D(c))return c(a,b,d);n(c,function(c){a=c(a,b,d)});return a}function mf(){var a=this.defaults={transformResponse:[cc],transformRequest:[function(a){return E(a)&&"[object File]"!==
ga.call(a)&&"[object Blob]"!==ga.call(a)&&"[object FormData]"!==ga.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:na(dc),put:na(dc),patch:na(dc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return y(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return y(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory",
"$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a){var b=T({},a);b.data=hd(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};n(a,function(a,e){D(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!E(b))throw H("$http")("badreq",b);if(!F(b.url))throw H("$http")("badreq",b.url);var f=T({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},
b);f.headers=function(b){var c=a.headers,d=T({},b.headers),f,g,h,c=T({},c.common,c[G(b.method)]);a:for(f in c){g=G(f);for(h in d)if(G(h)===g)continue a;d[f]=c[f]}return e(d,na(b))}(b);f.method=ub(f.method);f.paramSerializer=F(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=hd(b.data,gd(d),v,b.transformRequest);x(e)&&n(d,function(a,b){"content-type"===G(b)&&delete d[b]});x(b.withCredentials)&&!x(a.withCredentials)&&(b.withCredentials=a.withCredentials);
return r(b,e).then(c,c)},v],h=k.when(f);for(n(K,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=g.shift();var m=g.shift(),h=h.then(b,m)}d?(h.success=function(a){Sa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Sa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=id("success"),h.error=id("error"));return h}function r(c,
d){function g(a,c,d,e){function f(){l(c,a,d,e)}K&&(200<=a&&300>a?K.put(S,[a,c,fd(d),e]):K.remove(S));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function l(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?A.resolve:A.reject)({data:a,status:b,headers:gd(d),config:c,statusText:e})}function r(a){l(a.data,a.status,na(a.headers()),a.statusText)}function z(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var A=k.defer(),Q=A.promise,K,M,P=c.headers,S=s(c.url,c.paramSerializer(c.params));
m.pendingRequests.push(c);Q.then(z,z);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(K=E(c.cache)?c.cache:E(a.cache)?a.cache:I);K&&(M=K.get(S),y(M)?M&&D(M.then)?M.then(r,r):L(M)?l(M[1],M[0],na(M[2]),M[3]):l(M,200,{},"OK"):K.put(S,Q));x(M)&&((M=jd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:v)&&(P[c.xsrfHeaderName||a.xsrfHeaderName]=M),e(c.method,S,d,g,P,c.timeout,c.withCredentials,c.responseType));return Q}function s(a,b){0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b);
return a}var I=g("$http");a.paramSerializer=F(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var K=[];n(c,function(a){K.unshift(F(a)?l.get(a):l.invoke(a))});m.pendingRequests=[];(function(a){n(arguments,function(a){m[a]=function(b,c){return m(T({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){n(arguments,function(a){m[a]=function(b,c,d){return m(T({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");m.defaults=a;return m}]}function qf(){this.$get=
function(){return function(){return new O.XMLHttpRequest}}}function pf(){this.$get=["$browser","$window","$document","$xhrFactory",function(a,b,d,c){return fg(a,c,a.defer,b.angular.callbacks,d[0])}]}function fg(a,b,d,c,e){function f(a,b,d){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f);f=null;var g=-1,I="unknown";a&&("load"!==a.type||c[b].called||(a={type:"error"}),
I=a.type,g="error"===a.type?404:200);d&&d(g,I)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,h,k,l,m,r,s,I){function K(){w&&w();u&&u.abort()}function t(b,c,e,f,g){y(z)&&d.cancel(z);w=u=null;b(c,e,f,g);a.$$completeOutstandingRequest(B)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"==G(e)){var p="_"+(c.counter++).toString(36);c[p]=function(a){c[p].data=a;c[p].called=!0};var w=f(h.replace("JSON_CALLBACK","angular.callbacks."+
p),p,function(a,b){t(l,a,c[p].data,"",b);c[p]=B})}else{var u=b(e,h);u.open(e,h,!0);n(m,function(a,b){y(a)&&u.setRequestHeader(b,a)});u.onload=function(){var a=u.statusText||"",b="response"in u?u.response:u.responseText,c=1223===u.status?204:u.status;0===c&&(c=b?200:"file"==za(h).protocol?404:0);t(l,c,b,u.getAllResponseHeaders(),a)};e=function(){t(l,-1,null,null,"")};u.onerror=e;u.onabort=e;s&&(u.withCredentials=!0);if(I)try{u.responseType=I}catch(la){if("json"!==I)throw la;}u.send(x(k)?null:k)}if(0<
r)var z=d(K,r);else r&&D(r.then)&&r.then(K)}}function kf(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(r,a).replace(s,b)}function h(a,b,c,d){var e;return e=a.$watch(function(a){e();return d(a)},b,c)}function k(f,k,r,p){function s(a){try{var b=a;a=r?e.getTrusted(r,b):e.valueOf(b);var d;if(p&&!y(a))d=
a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=eb(a)}d=a}return d}catch(g){c(Ka.interr(f,g))}}if(!f.length||-1===f.indexOf(a)){var u;k||(k=g(f),u=ba(k),u.exp=f,u.expressions=[],u.$$watchDelegate=h);return u}p=!!p;var n,z,A=0,Q=[],$=[];u=f.length;for(var M=[],P=[];A<u;)if(-1!=(n=f.indexOf(a,A))&&-1!=(z=f.indexOf(b,n+l)))A!==n&&M.push(g(f.substring(A,n))),A=f.substring(n+l,z),Q.push(A),$.push(d(A,s)),A=z+m,P.push(M.length),M.push("");else{A!==u&&
M.push(g(f.substring(A)));break}r&&1<M.length&&Ka.throwNoconcat(f);if(!k||Q.length){var S=function(a){for(var b=0,c=Q.length;b<c;b++){if(p&&x(a[b]))return;M[P[b]]=a[b]}return M.join("")};return T(function(a){var b=0,d=Q.length,e=Array(d);try{for(;b<d;b++)e[b]=$[b](a);return S(e)}catch(g){c(Ka.interr(f,g))}},{exp:f,expressions:Q,$$watchDelegate:function(a,b){var c;return a.$watchGroup($,function(d,e){var f=S(d);D(b)&&b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,m=b.length,r=new RegExp(a.replace(/./g,
f),"g"),s=new RegExp(b.replace(/./g,f),"g");k.startSymbol=function(){return a};k.endSymbol=function(){return b};return k}]}function lf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,k,l,m){function r(){s?f.apply(null,I):f(p)}var s=4<arguments.length,I=s?wa.call(arguments,4):[],K=b.setInterval,t=b.clearInterval,p=0,w=y(m)&&!m,u=(w?c:d).defer(),n=u.promise;l=y(l)?l:0;n.$$intervalId=K(function(){w?e.defer(r):a.$evalAsync(r);u.notify(p++);0<l&&p>=l&&(u.resolve(p),
t(n.$$intervalId),delete g[n.$$intervalId]);w||a.$apply()},k);g[n.$$intervalId]=u;return n}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function ec(a){a=a.split("/");for(var b=a.length;b--;)a[b]=qb(a[b]);return a.join("/")}function kd(a,b){var d=za(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=ca(d.port)||gg[d.protocol]||null}function ld(a,b){var d="/"!==a.charAt(0);
d&&(a="/"+a);var c=za(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=zc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function pa(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Ia(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function kb(a){return a.replace(/(#.+)|#$/,"$1")}function fc(a,b,d){this.$$html5=!0;d=d||"";kd(a,this);this.$$parse=function(a){var d=pa(b,
a);if(!F(d))throw Gb("ipthprfx",a,b);ld(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Ub(this.$$search),d=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=ec(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;y(f=pa(a,c))?(g=f,g=y(f=pa(d,f))?b+(pa("/",f)||f):a+g):y(f=pa(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function gc(a,b,d){kd(a,this);
this.$$parse=function(c){var e=pa(a,c)||pa(b,c),f;x(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",x(e)&&(a=c,this.replace())):(f=pa(d,e),x(f)&&(f=e));ld(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Ub(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=ec(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=
function(b,d){return Ia(a)==Ia(b)?(this.$$parse(b),!0):!1}}function md(a,b,d){this.$$html5=!0;gc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Ia(c)?f=c:(g=pa(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Ub(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=ec(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Hb(a){return function(){return this[a]}}function nd(a,
b){return function(d){if(x(d))return this[a];this[a]=b(d);this.$$compose();return this}}function rf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return y(b)?(a=b,this):a};this.html5Mode=function(a){return Na(a)?(b.enabled=a,this):E(a)?(Na(a.enabled)&&(b.enabled=a.enabled),Na(a.requireBase)&&(b.requireBase=a.requireBase),Na(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,
c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var r=c.url(),s;if(b.enabled){if(!m&&b.requireBase)throw Gb("nobase");s=r.substring(0,r.indexOf("/",r.indexOf("//")+2))+(m||"/");m=e.history?fc:md}else s=Ia(r),m=gc;var I=s.substr(0,Ia(s).lastIndexOf("/")+1);l=new m(s,I,"#"+a);l.$$parseLinkUrl(r,r);l.$$state=c.state();
var n=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=C(a.target);"a"!==ra(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");E(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=za(h.animVal).href);n.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=
!0))}});kb(l.absUrl())!=kb(r)&&c.url(l.absUrl(),!0);var t=!0;c.onUrlChange(function(a,b){x(pa(I,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=kb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(t=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=kb(c.url()),b=kb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(t||
m)t=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function sf(){var a=!0,b=this;this.debugEnabled=function(b){return y(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&
(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];n(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Xa(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===
a||"__proto__"===a)throw ka("isecfld",b);return a}function hg(a){return a+""}function Aa(a,b){if(a){if(a.constructor===a)throw ka("isecfn",b);if(a.window===a)throw ka("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ka("isecdom",b);if(a===Object)throw ka("isecobj",b);}return a}function od(a,b){if(a){if(a.constructor===a)throw ka("isecfn",b);if(a===ig||a===jg||a===kg)throw ka("isecff",b);}}function Ib(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||
a==={}.constructor||a===[].constructor||a===Function.constructor))throw ka("isecaf",b);}function lg(a,b){return"undefined"!==typeof a?a:b}function pd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function R(a,b){var d,c;switch(a.type){case q.Program:d=!0;n(a.body,function(a){R(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case q.Literal:a.constant=!0;a.toWatch=[];break;case q.UnaryExpression:R(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;
break;case q.BinaryExpression:R(a.left,b);R(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case q.LogicalExpression:R(a.left,b);R(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case q.ConditionalExpression:R(a.test,b);R(a.alternate,b);R(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case q.Identifier:a.constant=!1;a.toWatch=
[a];break;case q.MemberExpression:R(a.object,b);a.computed&&R(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case q.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];n(a.arguments,function(a){R(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case q.AssignmentExpression:R(a.left,b);R(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];
break;case q.ArrayExpression:d=!0;c=[];n(a.elements,function(a){R(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case q.ObjectExpression:d=!0;c=[];n(a.properties,function(a){R(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case q.ThisExpression:a.constant=!1;a.toWatch=[];break;case q.LocalsExpression:a.constant=!1,a.toWatch=[]}}function qd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;
return 1!==b.length?b:b[0]!==a?b:v}}function rd(a){return a.type===q.Identifier||a.type===q.MemberExpression}function sd(a){if(1===a.body.length&&rd(a.body[0].expression))return{type:q.AssignmentExpression,left:a.body[0].expression,right:{type:q.NGValueParameter},operator:"="}}function td(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===q.Literal||a.body[0].expression.type===q.ArrayExpression||a.body[0].expression.type===q.ObjectExpression)}function ud(a,b){this.astBuilder=
a;this.$filter=b}function vd(a,b){this.astBuilder=a;this.$filter=b}function Jb(a){return"constructor"==a}function hc(a){return D(a.valueOf)?a.valueOf():mg.call(a)}function tf(){var a=Z(),b=Z();this.$get=["$filter",function(d){function c(c,f,r){var u,n,z;r=r||K;switch(typeof c){case "string":z=c=c.trim();var A=r?b:a;u=A[z];if(!u){":"===c.charAt(0)&&":"===c.charAt(1)&&(n=!0,c=c.substring(2));u=r?I:s;var Q=new ic(u);u=(new jc(Q,d,u)).parse(c);u.constant?u.$$watchDelegate=l:n?u.$$watchDelegate=u.literal?
k:h:u.inputs&&(u.$$watchDelegate=g);r&&(u=e(u));A[z]=u}return m(u,f);case "function":return m(c,f);default:return m(B,f)}}function e(a){function b(c,d,e,f){var g=K;K=!0;try{return a(c,d,e,f)}finally{K=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate;b.assign=e(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&c<a.inputs.length;++c)a.inputs[c]=e(a.inputs[c]);b.inputs=a.inputs;return b}function f(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=hc(a),"object"===
typeof a)?!1:a===b||a!==a&&b!==b}function g(a,b,c,d,e){var g=d.inputs,h;if(1===g.length){var k=f,g=g[0];return a.$watch(function(a){var b=g(a);f(b,k)||(h=d(a,v,v,[b]),k=b&&hc(b));return h},b,c,e)}for(var l=[],m=[],r=0,s=g.length;r<s;r++)l[r]=f,m[r]=null;return a.$watch(function(a){for(var b=!1,c=0,e=g.length;c<e;c++){var k=g[c](a);if(b||(b=!f(k,l[c])))m[c]=k,l[c]=k&&hc(k)}b&&(h=d(a,v,v,m));return h},b,c,e)}function h(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;
D(b)&&b.apply(this,arguments);y(a)&&d.$$postDigest(function(){y(f)&&e()})},c)}function k(a,b,c,d){function e(a){var b=!0;n(a,function(a){y(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;D(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function l(a,b,c,d){var e;return e=a.$watch(function(a){e();return d(a)},b,c)}function m(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==k&&c!==h?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,
c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return y(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==g?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=g,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]);return c}var r=Ea().noUnsafeEval,s={csp:r,expensiveChecks:!1},I={csp:r,expensiveChecks:!0},K=!1;c.$$runningExpensiveChecks=function(){return K};return c}]}function vf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return wd(function(b){a.$evalAsync(b)},b)}]}function wf(){this.$get=
["$browser","$exceptionHandler",function(a,b){return wd(function(b){a.defer(b)},b)}]}function wd(a,b){function d(){this.$$state={status:0}}function c(a,b){return function(c){b.call(a,c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending;c.processScheduled=!1;c.pending=v;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{D(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function f(){this.promise=
new d}var g=H("$q",TypeError);T(d.prototype,{then:function(a,b,c){if(x(a)&&x(b)&&x(c))return this;var d=new f;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&e(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return k(b,!0,a)},function(b){return k(b,!1,a)},b)}});T(f.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(g("qcycle",
a)):this.$$resolve(a))},$$resolve:function(a){function d(a){k||(k=!0,h.$$resolve(a))}function f(a){k||(k=!0,h.$$reject(a))}var g,h=this,k=!1;try{if(E(a)||D(a))g=a&&a.then;D(g)?(this.promise.$$state.status=-1,g.call(a,d,f,c(this,this.notify))):(this.promise.$$state.value=a,this.promise.$$state.status=1,e(this.promise.$$state))}catch(l){f(l),b(l)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;e(this.promise.$$state)},
notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0];a=d[f][3];try{e.notify(D(a)?a(c):c)}catch(h){b(h)}}})}});var h=function(a,b){var c=new f;b?c.resolve(a):c.reject(a);return c.promise},k=function(a,b,c){var d=null;try{D(c)&&(d=c())}catch(e){return h(e,!1)}return d&&D(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},l=function(a,b,c,d){var e=new f;e.resolve(a);return e.promise.then(b,
c,d)},m=function(a){if(!D(a))throw g("norslvr",a);var b=new f;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};m.prototype=d.prototype;m.defer=function(){var a=new f;a.resolve=c(a,a.resolve);a.reject=c(a,a.reject);a.notify=c(a,a.notify);return a};m.reject=function(a){var b=new f;b.reject(a);return b.promise};m.when=l;m.resolve=l;m.all=function(a){var b=new f,c=0,d=L(a)?[]:{};n(a,function(a,e){c++;l(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||
b.reject(a)})});0===c&&b.resolve(d);return b.promise};return m}function Ff(){this.$get=["$window","$timeout",function(a,b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function uf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=
this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++pb;this.$$ChildScope=null}b.prototype=a;return b}var b=10,d=H("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(f,g,h){function k(a){a.currentScope.$$destroyed=!0}function l(a){9===xa&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=
a.$$childTail=a.$root=a.$$watchers=null}function m(){this.$id=++pb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function r(a){if(w.$$phase)throw d("inprog",w.$$phase);w.$$phase=a}function s(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function I(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&
delete a.$$listenerCount[c];while(a=a.$parent)}function q(){}function t(){for(;z.length;)try{z.shift()()}catch(a){f(a)}e=null}function p(){null===e&&(e=h.defer(function(){w.$apply(t)}))}m.prototype={constructor:m,$new:function(b,c){var d;c=c||this;b?(d=new m,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!=this)&&d.$on("$destroy",
k);return d},$watch:function(a,b,d,e){var f=g(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f,a);var h=this,k=h.$$watchers,l={fn:b,last:q,get:f,exp:e||a,eq:!!d};c=null;D(b)||(l.fn=B);k||(k=h.$$watchers=[]);k.unshift(l);s(this,1);return function(){0<=cb(k,l)&&s(h,-1);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=
!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});n(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!x(e)){if(E(e))if(Ca(e))for(f!==r&&(f=r,u=f.length=0,l++),a=e.length,u!==a&&(l++,f.length=u=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==s&&(f=s={},u=0,l++);a=0;for(b in e)sa.call(e,
b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(u++,f[b]=g,l++));if(u>a)for(b in l++,f)sa.call(e,b)||(u--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),r=[],s={},p=!0,u=0;return this.$watch(m,function(){p?(p=!1,b(e,e,d)):b(e,h,d);if(k)if(E(e))if(Ca(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)sa.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,k,l,m,s,p,n,I=b,z,y=[],x,C;
r("$digest");h.$$checkUrlChange();this===w&&null!==e&&(h.defer.cancel(e),t());c=null;do{n=!1;for(z=this;u.length;){try{C=u.shift(),C.scope.$eval(C.expression,C.locals)}catch(B){f(B)}c=null}a:do{if(s=z.$$watchers)for(p=s.length;p--;)try{if(a=s[p])if(m=a.get,(g=m(z))!==(k=a.last)&&!(a.eq?oa(g,k):"number"===typeof g&&"number"===typeof k&&isNaN(g)&&isNaN(k)))n=!0,c=a,a.last=a.eq?Oa(g,null):g,l=a.fn,l(g,k===q?g:k,z),5>I&&(x=4-I,y[x]||(y[x]=[]),y[x].push({msg:D(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):
a.exp,newVal:g,oldVal:k}));else if(a===c){n=!1;break a}}catch(E){f(E)}if(!(s=z.$$watchersCount&&z.$$childHead||z!==this&&z.$$nextSibling))for(;z!==this&&!(s=z.$$nextSibling);)z=z.$parent}while(z=s);if((n||u.length)&&!I--)throw w.$$phase=null,d("infdig",b,y);}while(n||u.length);for(w.$$phase=null;v.length;)try{v.shift()()}catch(H){f(H)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===w&&h.$$applicationDestroyed();s(this,-this.$$watchersCount);
for(var b in this.$$listenerCount)I(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=B;this.$on=this.$watch=this.$watchGroup=function(){return B};this.$$listeners={};this.$$nextSibling=
null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){w.$$phase||u.length||h.defer(function(){u.length&&w.$digest()});u.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){v.push(a)},$apply:function(a){try{r("$apply");try{return this.$eval(a)}finally{w.$$phase=null}}catch(b){f(b)}finally{try{w.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&z.push(b);a=g(a);p()},$on:function(a,b){var c=this.$$listeners[a];
c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,I(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=db([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,
k)}catch(r){f(r)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=db([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&
c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var w=new m,u=w.$$asyncQueue=[],v=w.$$postDigestQueue=[],z=w.$$applyAsyncQueue=[];return w}]}function ne(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return y(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return y(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=
c?b:a,f;f=za(d).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function ng(a){if("self"===a)return a;if(F(a)){if(-1<a.indexOf("***"))throw Ba("iwcard",a);a=xd(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+a+"$")}if($a(a))return new RegExp("^"+a.source+"$");throw Ba("imatcher");}function yd(a){var b=[];y(a)&&n(a,function(a){b.push(ng(a))});return b}function yf(){this.SCE_CONTEXTS=qa;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=yd(b));return a};
this.resourceUrlBlacklist=function(a){arguments.length&&(b=yd(a));return b};this.$get=["$injector",function(d){function c(a,b){return"self"===a?jd(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw Ba("unsafe");};d.has("$sanitize")&&(f=d.get("$sanitize"));
var g=e(),h={};h[qa.HTML]=e(g);h[qa.CSS]=e(g);h[qa.URL]=e(g);h[qa.JS]=e(g);h[qa.RESOURCE_URL]=e(h[qa.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw Ba("icontext",a,b);if(null===b||x(b)||""===b)return b;if("string"!==typeof b)throw Ba("itype",a);return new c(b)},getTrusted:function(d,e){if(null===e||x(e)||""===e)return e;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===qa.RESOURCE_URL){var g=za(e.toString()),r,s,n=!1;
r=0;for(s=a.length;r<s;r++)if(c(a[r],g)){n=!0;break}if(n)for(r=0,s=b.length;r<s;r++)if(c(b[r],g)){n=!1;break}if(n)return e;throw Ba("insecurl",e.toString());}if(d===qa.HTML)return f(e);throw Ba("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function xf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>xa)throw Ba("iequirks");var c=na(qa);c.isEnabled=function(){return a};c.trustAs=d.trustAs;
c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=ab);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;n(qa,function(a,b){var d=G(b);c[gb("parse_as_"+d)]=function(b){return e(a,b)};c[gb("get_trusted_"+d)]=function(b){return f(a,b)};c[gb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function zf(){this.$get=["$window","$document",
function(a,b){var d={},c=ca((/android (\d+)/.exec(G((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),f=b[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,k=f.body&&f.body.style,l=!1,m=!1;if(k){for(var r in k)if(l=h.exec(r)){g=l[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in k&&"webkit");l=!!("transition"in k||g+"Transition"in k);m=!!("animation"in k||g+"Animation"in k);!c||l&&m||(l=F(k.webkitTransition),m=F(k.webkitAnimation))}return{history:!(!a.history||
!a.history.pushState||4>c||e),hasEvent:function(a){if("input"===a&&11>=xa)return!1;if(x(d[a])){var b=f.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ea(),vendorPrefix:g,transitions:l,animations:m,android:c}}]}function Bf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,e){function f(g,h){f.totalPendingRequests++;F(g)&&b.get(g)||(g=e.getTrustedResourceUrl(g));var k=d.defaults&&d.defaults.transformResponse;L(k)?k=k.filter(function(a){return a!==
cc}):k===cc&&(k=null);return d.get(g,T({cache:b,transformResponse:k},a))["finally"](function(){f.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw ja("tpload",g,a.status,a.statusText);return c.reject(a)})}f.totalPendingRequests=0;return f}]}function Cf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];n(a,function(a){var c=ia.element(a).data("$binding");
c&&n(c,function(c){d?(new RegExp("(^|\\s)"+xd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(d?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function Df(){this.$get=["$rootScope",
"$browser","$q","$$q","$exceptionHandler",function(a,b,d,c,e){function f(f,k,l){D(f)||(l=k,k=f,f=B);var m=wa.call(arguments,3),r=y(l)&&!l,s=(r?c:d).defer(),n=s.promise,q;q=b.defer(function(){try{s.resolve(f.apply(null,m))}catch(b){s.reject(b),e(b)}finally{delete g[n.$$timeoutId]}r||a.$apply()},k);n.$$timeoutId=q;g[q]=s;return n}var g={};f.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject("canceled"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return f}]}function za(a){xa&&
(Y.setAttribute("href",a),a=Y.href);Y.setAttribute("href",a);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function jd(a){a=F(a)?za(a):a;return a.protocol===zd.protocol&&a.host===zd.host}function Ef(){this.$get=ba(O)}function Ad(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}
var d=a[0]||{},c={},e="";return function(){var a,g,h,k,l;a=d.cookie||"";if(a!==e)for(e=a,a=e.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),x(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function If(){this.$get=Ad}function Lc(a){function b(d,c){if(E(d)){var e={};n(d,function(a,c){e[c]=b(c,a)});return e}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",Bd);b("date",Cd);
b("filter",og);b("json",pg);b("limitTo",qg);b("lowercase",rg);b("number",Dd);b("orderBy",Ed);b("uppercase",sg)}function og(){return function(a,b,d){if(!Ca(a)){if(null==a)return a;throw H("filter")("notarray",a);}var c;switch(kc(b)){case "function":break;case "boolean":case "null":case "number":case "string":c=!0;case "object":b=tg(b,d,c);break;default:return a}return Array.prototype.filter.call(a,b)}}function tg(a,b,d){var c=E(a)&&"$"in a;!0===b?b=oa:D(b)||(b=function(a,b){if(x(a))return!1;if(null===
a||null===b)return a===b;if(E(b)||E(a)&&!tc(a))return!1;a=G(""+a);b=G(""+b);return-1!==a.indexOf(b)});return function(e){return c&&!E(e)?La(e,a.$,b,!1):La(e,a,b,d)}}function La(a,b,d,c,e){var f=kc(a),g=kc(b);if("string"===g&&"!"===b.charAt(0))return!La(a,b.substring(1),d,c);if(L(a))return a.some(function(a){return La(a,b,d,c)});switch(f){case "object":var h;if(c){for(h in a)if("$"!==h.charAt(0)&&La(a[h],b,d,!0))return!0;return e?!1:La(a,b,d,!1)}if("object"===g){for(h in b)if(e=b[h],!D(e)&&!x(e)&&
(f="$"===h,!La(f?a:a[h],e,d,f,f)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function kc(a){return null===a?"null":typeof a}function Bd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){x(c)&&(c=b.CURRENCY_SYM);x(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Fd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,e).replace(/\u00A4/g,c)}}function Dd(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Fd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function ug(a){var b=
0,d,c,e,f,g;-1<(c=a.indexOf(Gd))&&(a=a.replace(Gd,""));0<(e=a.search(/e/i))?(0>c&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)==lc;e++);if(e==(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)==lc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Hd&&(d=d.splice(0,Hd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function vg(a,b,d,c){var e=a.d,f=e.length-a.i;b=x(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0<d)e.splice(d);else{a.i=1;e.length=d=b+1;for(var g=0;g<d;g++)e[g]=
0}for(5<=c&&e[d-1]++;f<b;f++)e.push(0);if(b=e.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))e.unshift(b),a.i++}function Fd(a,b,d,c,e){if(!F(a)&&!N(a)||isNaN(a))return"";var f=!isFinite(a),g=!1,h=Math.abs(a)+"",k="";if(f)k="\u221e";else{g=ug(h);vg(g,e,b.minFrac,b.maxFrac);k=g.d;h=g.i;e=g.e;f=[];for(g=k.reduce(function(a,b){return a&&!b},!0);0>h;)k.unshift(0),h++;0<h?f=k.splice(h):(f=k,k=[0]);h=[];for(k.length>b.lgSize&&h.unshift(k.splice(-b.lgSize).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize).join(""));
k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Kb(a,b,d){var c="";0>a&&(c="-",a=-a);for(a=""+a;a.length<b;)a=lc+a;d&&(a=a.substr(a.length-b));return c+a}function aa(a,b,d,c){d=d||0;return function(e){e=e["get"+a]();if(0<d||e>-d)e+=d;0===e&&-12==d&&(e=12);return Kb(e,b,c)}}function Lb(a,b){return function(d,c){var e=d["get"+a](),f=ub(b?"SHORT"+a:a);return c[f][e]}}function Id(a){var b=(new Date(a,
0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Jd(a){return function(b){var d=Id(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Kb(b,a)}}function mc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Cd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ca(b[9]+b[10]),g=ca(b[9]+b[11]));h.call(a,ca(b[1]),ca(b[2])-
1,ca(b[3]));f=ca(b[4]||0)-f;g=ca(b[5]||0)-g;h=ca(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;F(c)&&(c=wg.test(c)?ca(c):b(c));N(c)&&(c=new Date(c));if(!V(c)||!isFinite(c.getTime()))return c;for(;d;)(l=xg.exec(d))?(h=db(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();
f&&(m=xc(f,m),c=Tb(c,f,!0));n(h,function(b){k=yg[b];g+=k?k(c,a.DATETIME_FORMATS,m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function pg(){return function(a,b){x(b)&&(b=2);return eb(a,b)}}function qg(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):ca(b);if(isNaN(b))return a;N(a)&&(a=a.toString());if(!L(a)&&!F(a))return a;d=!d||isNaN(d)?0:ca(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),
d)}}function Ed(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=ab;if(D(b))h=b;else if(F(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h,descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(null==a)return a;if(!Ca(a))throw H("orderBy")("notarray",a);L(e)||(e=[e]);0===e.length&&
(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"===c)a:{if("function"===typeof e.valueOf&&(e=e.valueOf(),d(e)))break a;if(tc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;d<e;++d){var c=a.predicateValues[d],
f=b.predicateValues[d],n=0;c.type===f.type?c.value!==f.value&&(n=c.value<f.value?-1:1):n=c.type<f.type?-1:1;if(c=n*g[d].descending)break}return c});return a=a.map(function(a){return a.value})}}function Ma(a){D(a)&&(a={link:a});a.restrict=a.restrict||"AC";return ba(a)}function Kd(a,b,d,c,e){var f=this,g=[];f.$error={};f.$$success={};f.$pending=v;f.$name=e(b.name||b.ngForm||"")(d);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;f.$$parentForm=Mb;f.$rollbackViewValue=function(){n(g,
function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){n(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ta(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a);a.$$parentForm=f};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];n(f.$pending,function(b,c){f.$setValidity(c,null,a)});n(f.$error,function(b,c){f.$setValidity(c,null,a)});n(f.$$success,function(b,c){f.$setValidity(c,
null,a)});cb(g,a);a.$$parentForm=Mb};Ld({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(cb(d,c),0===d.length&&delete a[b])},$animate:c});f.$setDirty=function(){c.removeClass(a,Ya);c.addClass(a,Nb);f.$dirty=!0;f.$pristine=!1;f.$$parentForm.$setDirty()};f.$setPristine=function(){c.setClass(a,Ya,Nb+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;n(g,function(a){a.$setPristine()})};f.$setUntouched=function(){n(g,
function(a){a.$setUntouched()})};f.$setSubmitted=function(){c.addClass(a,"ng-submitted");f.$submitted=!0;f.$$parentForm.$setSubmitted()}}function nc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function lb(a,b,d,c,e,f){var g=G(b[0].type);if(!e.android){var h=!1;b.on("compositionstart",function(a){h=!0});b.on("compositionend",function(){h=!1;k()})}var k=function(a){l&&(f.defer.cancel(l),l=null);if(!h){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||
(e=X(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",k);else{var l,m=function(a,b,c){l||(l=f.defer(function(){l=null;b&&b.value===c||k(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",m)}b.on("change",k);c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Ob(a,b){return function(d,c){var e,
f;if(V(d))return d;if(F(d)){'"'==d.charAt(0)&&'"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(zg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},n(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function mb(a,b,d,c){return function(e,
f,g,h,k,l,m){function r(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function s(a){return y(a)&&!V(a)?d(a)||v:a}Md(e,f,g,h);lb(e,f,g,h,k,l);var n=h&&h.$options&&h.$options.timezone,q;h.$$parserName=a;h.$parsers.push(function(a){return h.$isEmpty(a)?null:b.test(a)?(a=d(a,q),n&&(a=Tb(a,n)),a):v});h.$formatters.push(function(a){if(a&&!V(a))throw nb("datefmt",a);if(r(a))return(q=a)&&n&&(q=Tb(q,n,!0)),m("date")(a,c,n);q=null;return""});if(y(g.min)||g.ngMin){var t;h.$validators.min=function(a){return!r(a)||
x(t)||d(a)>=t};g.$observe("min",function(a){t=s(a);h.$validate()})}if(y(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!r(a)||x(p)||d(a)<=p};g.$observe("max",function(a){p=s(a);h.$validate()})}}}function Md(a,b,d,c){(c.$$hasNativeValidators=E(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?v:a})}function Nd(a,b,d,c,e){if(y(c)){a=a(c);if(!a.constant)throw nb("constexpr",d,c);return a(b)}return e}function oc(a,b){a="ngClass"+a;
return["$animate",function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){var b=[];return L(a)?(n(a,function(a){b=b.concat(e(a))}),b):F(a)?a.split(" "):E(a)?(n(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",link:function(f,g,h){function k(a,b){var c=g.data("$classCounts")||Z(),d=[];n(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",
c);return d.join(" ")}function l(a){if(!0===b||f.$index%2===b){var l=e(a||[]);if(!m){var n=k(l,1);h.$addClass(n)}else if(!oa(a,m)){var q=e(m),n=c(l,q),l=c(q,l),n=k(n,1),l=k(l,-1);n&&n.length&&d.addClass(g,n);l&&l.length&&d.removeClass(g,l)}}m=na(a)}var m;f.$watch(h[a],l,!0);h.$observe("class",function(b){l(f.$eval(h[a]))});"ngClass"!==a&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l=e(f.$eval(h[a]));g===b?(g=k(l,1),h.$addClass(g)):(g=k(l,-1),h.$removeClass(g))}})}}}]}function Ld(a){function b(a,
b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function d(a,c){a=a?"-"+Bc(a,"-"):"";b(ob+a,!0===c);b(Od+a,!1===c)}var c=a.ctrl,e=a.$element,f={},g=a.set,h=a.unset,k=a.$animate;f[Od]=!(f[ob]=e.hasClass(ob));c.$setValidity=function(a,e,f){x(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&h(c.$pending,a,f),Pd(c.$pending)&&(c.$pending=v));Na(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error,a,f),h(c.$$success,a,f));
c.$pending?(b(Qd,!0),c.$valid=c.$invalid=v,d("",null)):(b(Qd,!1),c.$valid=Pd(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?v:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function Pd(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var Ag=/^\/(.+)\/([a-z]*)$/,sa=Object.prototype.hasOwnProperty,G=function(a){return F(a)?a.toLowerCase():a},ub=function(a){return F(a)?a.toUpperCase():a},xa,C,ua,wa=[].slice,ag=[].splice,Bg=
[].push,ga=Object.prototype.toString,uc=Object.getPrototypeOf,Da=H("ng"),ia=O.angular||(O.angular={}),Vb,pb=0;xa=W.documentMode;B.$inject=[];ab.$inject=[];var L=Array.isArray,ae=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,X=function(a){return F(a)?a.trim():a},xd=function(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Ea=function(){if(!y(Ea.rules)){var a=W.querySelector("[ng-csp]")||W.querySelector("[data-ng-csp]");
if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");Ea.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ea;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ea.rules},rb=function(){if(y(rb.name_))return rb.name_;var a,b,d=Qa.length,c,e;for(b=0;b<d;++b)if(c=Qa[b],a=W.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+"jq");break}return rb.name_=e},de=/:/g,Qa=["ng-",
"data-ng-","ng:","x-ng-"],ie=/[A-Z]/g,Cc=!1,Pa=3,me={full:"1.5.0",major:1,minor:5,dot:0,codeName:"ennoblement-facilitation"};U.expando="ng339";var ib=U.cache={},Of=1;U._data=function(a){return this.cache[a[this.expando]]||{}};var Jf=/([\:\-\_]+(.))/g,Kf=/^moz([A-Z])/,yb={mouseleave:"mouseout",mouseenter:"mouseover"},Xb=H("jqLite"),Nf=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Wb=/<|&#?\w+;/,Lf=/<([\w:-]+)/,Mf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,da={option:[1,'<select multiple="multiple">',
"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};da.optgroup=da.option;da.tbody=da.tfoot=da.colgroup=da.caption=da.thead;da.th=da.td;var Tf=Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Ra=U.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===W.readyState?setTimeout(b):(this.on("DOMContentLoaded",
b),U(O).on("load",b))},toString:function(){var a=[];n(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?C(this[a]):C(this[this.length+a])},length:0,push:Bg,sort:[].sort,splice:[].splice},Db={};n("multiple selected checked disabled readOnly required open".split(" "),function(a){Db[G(a)]=a});var Uc={};n("input select option textarea button form details".split(" "),function(a){Uc[a]=!0});var cd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",
ngPattern:"pattern"};n({data:Zb,removeData:hb,hasData:function(a){for(var b in ib[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b<d;b++)hb(a[b])}},function(a,b){U[b]=a});n({data:Zb,inheritedData:Cb,scope:function(a){return C.data(a,"$scope")||Cb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return C.data(a,"$isolateScope")||C.data(a,"$isolateScopeNoTemplate")},controller:Rc,injector:function(a){return Cb(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},
hasClass:zb,css:function(a,b,d){b=gb(b);if(y(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Pa&&2!==c&&8!==c)if(c=G(b),Db[c])if(y(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||B).specified?c:v;else if(y(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?v:a},prop:function(a,b,d){if(y(d))a[b]=d;else return a[b]},text:function(){function a(a,d){if(x(d)){var c=a.nodeType;
return 1===c||c===Pa?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(x(b)){if(a.multiple&&"select"===ra(a)){var d=[];n(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(x(b))return a.innerHTML;wb(a,!0);a.innerHTML=b},empty:Sc},function(a,b){U.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Sc&&x(2==a.length&&a!==zb&&a!==Rc?b:c)){if(E(b)){for(e=0;e<g;e++)if(a===Zb)a(this[e],b);else for(f in b)a(this[e],
f,b[f]);return this}e=a.$dv;g=x(e)?Math.min(g,1):g;for(f=0;f<g;f++){var h=a(this[f],b,c);e=e?e+h:h}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});n({removeData:hb,on:function(a,b,d,c){if(y(c))throw Xb("onargs");if(Mc(a)){c=xb(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=Qf(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=e[b];h||(h=e[b]=[],h.specialHandlerWrapper=c,"$destroy"===b||g||a.addEventListener(b,f,!1));h.push(d)};g--;)b=c[g],yb[b]?(h(yb[b],Sf),
h(b,v,!0)):h(b)}},off:Qc,one:function(a,b,d){a=C(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;wb(a);n(new U(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];n(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var d=a.nodeType;if(1===d||11===d){b=new U(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},
prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;n(new U(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){Oc(a,C(b).eq(0).clone()[0])},remove:$b,detach:function(a){$b(a,!0)},after:function(a,b){var d=a,c=a.parentNode;b=new U(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}},addClass:Bb,removeClass:Ab,toggleClass:function(a,b,d){b&&n(b.split(" "),function(b){var e=d;x(e)&&(e=!zb(a,b));(e?Bb:Ab)(a,b)})},parent:function(a){return(a=a.parentNode)&&
11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Yb,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=xb(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},
stopPropagation:B,type:f,target:a},b.type&&(c=T(c,b)),b=na(g),e=d?[c].concat(d):[c],n(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){U.prototype[b]=function(b,c,e){for(var f,g=0,h=this.length;g<h;g++)x(f)?(f=a(this[g],b,c,e),y(f)&&(f=C(f))):Pc(f,a(this[g],b,c,e));return y(f)?f:this};U.prototype.bind=U.prototype.on;U.prototype.unbind=U.prototype.off});Ua.prototype={put:function(a,b){this[Fa(a,this.nextUid)]=b},get:function(a){return this[Fa(a,this.nextUid)]},remove:function(a){var b=
this[a=Fa(a,this.nextUid)];delete this[a];return b}};var Hf=[function(){this.$get=[function(){return Ua}]}],Vf=/^([^\(]+?)=>/,Wf=/^[^\(]*\(\s*([^\)]*)\)/m,Cg=/,/,Dg=/^\s*(_?)(\S+?)\1\s*$/,Uf=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ga=H("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw F(d)&&d||(d=a.name||Xf(a)),Ga("strictdi",d);b=Vc(a);n(b[1].split(Cg),function(a){a.replace(Dg,function(a,b,d){c.push(d)})})}a.$inject=c}}else L(a)?
(b=a.length-1,Sa(a[b],"fn"),c=a.slice(0,b)):Sa(a,"fn",!0);return c};var Rd=H("$animate"),$e=function(){this.$get=function(){}},af=function(){var a=new Ua,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=F(b)?b.split(" "):L(b)?b:[],n(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){n(b,function(b){var c=a.get(b);if(c){var d=Yf(b.attr("class")),e="",f="";n(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});n(b,function(a){e&&
Bb(a,e);f&&Ab(a,f)});a.remove(b)}});b.length=0}return{enabled:B,on:B,off:B,pin:B,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Ye=["$provide",function(a){var b=this;this.$$registeredAnimations=Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Rd("notcsel",
d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Rd("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k=d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||
(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(e,f,g,h){f=f&&C(f);g=g&&C(g);f=f||g.parent();b(e,f,g);return a.push(e,"enter",Ha(h))},move:function(e,f,g,h){f=f&&C(f);g=g&&C(g);f=f||g.parent();b(e,f,g);return a.push(e,"move",Ha(h))},leave:function(b,c){return a.push(b,"leave",Ha(c),function(){b.remove()})},addClass:function(b,c,g){g=Ha(g);g.addClass=jb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,
c,g){g=Ha(g);g.removeClass=jb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Ha(h);h.addClass=jb(h.addClass,c);h.removeClass=jb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Ha(k);k.from=k.from?T(k.from,c):c;k.to=k.to?T(k.to,g):g;k.tempClasses=jb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],cf=function(){this.$get=["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();
d=[]})}var d=[];return function(){var a=!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},bf=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(a,b,d,c,e){function f(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){var d=c[0];d&&d.hidden?e(a,0,!1):b(a)};this._state=0}f.chain=function(a,b){function c(){if(d===a.length)b(!0);else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};f.all=function(a,b){function c(f){e=e&&f;++d===
a.length&&b(e)}var d=0,e=!0;n(a,function(a){a.done(c)})};f.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:B,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},"finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&
this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(n(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=0,this._state=2)}};return f}]},Ze=function(){this.$get=["$$rAF","$q","$$AnimateRunner",
function(a,b,d){return function(b,e){function f(){a(function(){g.addClass&&(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=null);g.to&&(b.css(g.to),g.to=null);h||k.complete();h=!0});return k}var g=e||{};g.$$prepared||(g=Oa(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var h,k=new d;return{start:f,end:f}}}]},ja=H("$compile");Ec.$inject=["$provide","$$sanitizeUriProvider"];var Xc=/^((?:x|data)[\:\-_])/i,bg=H("$controller"),
dd=/^(\S+)(\s+as\s+([\w$]+))?$/,jf=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof C&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},ed="application/json",dc={"Content-Type":ed+";charset=utf-8"},dg=/^\[|^\{(?!\{)/,eg={"[":/]$/,"{":/}$/},cg=/^\)\]\}',?\n/,Eg=H("$http"),id=function(a){return function(){throw Eg("legacy",a);}},Ka=ia.$interpolateMinErr=H("$interpolate");Ka.throwNoconcat=function(a){throw Ka("noconcat",a);};Ka.interr=function(a,b){return Ka("interr",
a,b.toString())};var Fg=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,gg={http:80,https:443,ftp:21},Gb=H("$location"),Gg={$$html5:!1,$$replace:!1,absUrl:Hb("$$absUrl"),url:function(a){if(x(a))return this.$$url;var b=Fg.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Hb("$$protocol"),host:Hb("$$host"),port:Hb("$$port"),path:nd("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,
b){switch(arguments.length){case 0:return this.$$search;case 1:if(F(a)||N(a))a=a.toString(),this.$$search=zc(a);else if(E(a))a=Oa(a,{}),n(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw Gb("isrcharg");break;default:x(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:nd("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};n([md,gc,fc],function(a){a.prototype=Object.create(Gg);a.prototype.state=
function(b){if(!arguments.length)return this.$$state;if(a!==fc||!this.$$html5)throw Gb("nostate");this.$$state=x(b)?null:b;return this}});var ka=H("$parse"),ig=Function.prototype.call,jg=Function.prototype.apply,kg=Function.prototype.bind,Pb=Z();n("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Pb[a]=!0});var Hg={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},ic=function(a){this.options=a};ic.prototype={constructor:ic,lex:function(a){this.text=a;this.index=0;for(this.tokens=
[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(a))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;else{var b=a+this.peek(),d=b+this.peek(2),c=Pb[b],e=Pb[d];Pb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=
a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===
a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=y(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ka("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=G(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"==d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||
c&&this.isNumber(c)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})},readIdent:function(){for(var a=this.index;this.index<this.text.length;){var b=this.text.charAt(this.index);if(!this.isIdent(b)&&!this.isNumber(b))break;this.index++}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<this.text.length;){var f=
this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=Hg[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var q=function(a,b){this.lexer=a;this.options=b};q.Program="Program";q.ExpressionStatement=
"ExpressionStatement";q.AssignmentExpression="AssignmentExpression";q.ConditionalExpression="ConditionalExpression";q.LogicalExpression="LogicalExpression";q.BinaryExpression="BinaryExpression";q.UnaryExpression="UnaryExpression";q.CallExpression="CallExpression";q.MemberExpression="MemberExpression";q.Identifier="Identifier";q.Literal="Literal";q.ArrayExpression="ArrayExpression";q.Property="Property";q.ObjectExpression="ObjectExpression";q.ThisExpression="ThisExpression";q.LocalsExpression="LocalsExpression";
q.NGValueParameter="NGValueParameter";q.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:q.Program,body:a}},expressionStatement:function(){return{type:q.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=
this.expression();this.expect("|");)a=this.filter(a);return a},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();this.expect("=")&&(a={type:q.AssignmentExpression,left:a,right:this.assignment(),operator:"="});return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:q.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a=
{type:q.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:q.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:q.BinaryExpression,
operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:q.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:
this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=Oa(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:q.CallExpression,callee:a,arguments:this.parseArguments()},
this.consume(")")):"["===b.text?(a={type:q.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:q.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:q.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.expression());
while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:q.Identifier,name:a.text}},constant:function(){return{type:q.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:q.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;
b={type:q.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:q.ObjectExpression,properties:a}},throwError:function(a,b){throw ka("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ka("ueoe",this.text);var b=this.expect(a);
b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ka("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},constants:{"true":{type:q.Literal,value:!0},
"false":{type:q.Literal,value:!1},"null":{type:q.Literal,value:null},undefined:{type:q.Literal,value:v},"this":{type:q.ThisExpression},$locals:{type:q.LocalsExpression}}};ud.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};R(c,d.$filter);var e="",f;this.stage="assign";if(f=sd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),
e="fn.assign="+this.generateFunction("assign","s,v,l");f=qd(c.body);d.stage="inputs";n(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject",
"ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",e))(this.$filter,Xa,Aa,od,hg,Ib,lg,pd,a);this.state=this.stage=v;e.literal=td(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;n(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+
"};"},filterPrefix:function(){var a=[],b=this;n(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,m;c=c||B;if(!f&&y(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,
c,e,!0));else switch(a.type){case q.Program:n(a.body,function(b,c){k.recurse(b.expression,v,v,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case q.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;case q.UnaryExpression:this.recurse(a.argument,v,v,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case q.BinaryExpression:this.recurse(a.left,v,v,function(a){g=a});this.recurse(a.right,v,v,function(a){h=a});m="+"===
a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case q.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case q.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case q.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?
"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Xa(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Jb(a.name))&&k.addEnsureSafeObject(b);c(b);
break;case q.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,v,function(){k.if_(k.notNull(g),function(){e&&1!==e&&k.addEnsureSafeAssignContext(g);if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Xa(a.property.name);e&&
1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Jb(a.property.name))m=k.ensureSafeObject(m);k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case q.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],n(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+
l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);n(a.arguments,function(a){k.recurse(a,k.nextId(),v,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)},function(){k.assign(b,"undefined")});c(b)}));break;case q.AssignmentExpression:h=
this.nextId();g={};if(!rd(a.left))throw ka("lval");this.recurse(a.left,v,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case q.ArrayExpression:l=[];n(a.elements,function(a){k.recurse(a,k.nextId(),v,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case q.ObjectExpression:l=
[];n(a.properties,function(a){k.recurse(a.value,k.nextId(),v,function(b){l.push(k.escape(a.key.type===q.Identifier?a.key.name:""+a.key.value)+":"+b)})});m="{"+l.join(",")+"}";this.assign(b,m);c(m);break;case q.ThisExpression:this.assign(b,"s");c("s");break;case q.LocalsExpression:this.assign(b,"l");c("l");break;case q.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+
a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");
d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){return a+"."+b},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),
";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=
this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(F(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(N(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ka("esc");},nextId:function(a,
b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};vd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;R(c,d.$filter);var e,f;if(e=sd(c))f=this.recurse(e);e=qd(c.body);var g;e&&(g=[],n(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];n(c.body,function(a){h.push(d.recurse(a.expression))});e=0===c.body.length?function(){}:
1===c.body.length?h[0]:function(a,b){var c;n(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=td(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case q.Literal:return this.value(a.value,b);case q.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case q.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),
this["binary"+a.operator](c,e,b);case q.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case q.Identifier:return Xa(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Jb(a.name),b,d,f.expression);case q.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Xa(a.property.name,f.expression),
e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case q.CallExpression:return g=[],n(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var r=[],n=0;n<g.length;++n)r.push(g[n](a,c,d,f));a=e.apply(v,r,f);return b?{context:v,name:v,value:a}:a}:function(a,c,d,m){var r=
e(a,c,d,m),n;if(null!=r.value){Aa(r.context,f.expression);od(r.value,f.expression);n=[];for(var q=0;q<g.length;++q)n.push(Aa(g[q](a,c,d,m),f.expression));n=Aa(r.value.apply(r.context,n),f.expression)}return b?{value:n}:n};case q.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,g,m){var r=c(a,d,g,m);a=e(a,d,g,m);Aa(r.value,f.expression);Ib(r.context);r.context[r.name]=a;return b?{value:a}:a};case q.ArrayExpression:return g=[],n(a.elements,function(a){g.push(f.recurse(a))}),
function(a,c,d,e){for(var f=[],n=0;n<g.length;++n)f.push(g[n](a,c,d,e));return b?{value:f}:f};case q.ObjectExpression:return g=[],n(a.properties,function(a){g.push({key:a.key.type===q.Identifier?a.key.name:""+a.key.value,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},n=0;n<g.length;++n)f[g[n].key]=g[n].value(a,c,d,e);return b?{value:f}:f};case q.ThisExpression:return function(a){return b?{value:a}:a};case q.LocalsExpression:return function(a,c){return b?{value:c}:c};case q.NGValueParameter:return function(a,
c,d,e){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=y(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=y(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=pd(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);
h=(y(h)?h:0)-(y(c)?c:0);return d?{value:h}:h}},"binary*":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c,
e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,
g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:v,
name:v,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:v;b&&Aa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),m,n;null!=l&&(m=b(f,g,h,k),m+="",Xa(m,e),c&&1!==c&&(Ib(l),l&&!l[m]&&(l[m]={})),n=l[m],Aa(n,e));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&(Ib(g),g&&!g[b]&&
(g[b]={}));h=null!=g?g[b]:v;(d||Jb(b))&&Aa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var jc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new q(this.lexer);this.astCompiler=d.csp?new vd(this.ast,b):new ud(this.ast,b)};jc.prototype={constructor:jc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var mg=Object.prototype.valueOf,Ba=H("$sce"),qa={HTML:"html",CSS:"css",URL:"url",
RESOURCE_URL:"resourceUrl",JS:"js"},ja=H("$compile"),Y=W.createElement("a"),zd=za(O.location.href);Ad.$inject=["$document"];Lc.$inject=["$provide"];var Hd=22,Gd=".",lc="0";Bd.$inject=["$locale"];Dd.$inject=["$locale"];var yg={yyyy:aa("FullYear",4),yy:aa("FullYear",2,0,!0),y:aa("FullYear",1),MMMM:Lb("Month"),MMM:Lb("Month",!0),MM:aa("Month",2,1),M:aa("Month",1,1),dd:aa("Date",2),d:aa("Date",1),HH:aa("Hours",2),H:aa("Hours",1),hh:aa("Hours",2,-12),h:aa("Hours",1,-12),mm:aa("Minutes",2),m:aa("Minutes",
1),ss:aa("Seconds",2),s:aa("Seconds",1),sss:aa("Milliseconds",3),EEEE:Lb("Day"),EEE:Lb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Kb(Math[0<a?"floor":"ceil"](a/60),2)+Kb(Math.abs(a%60),2))},ww:Jd(2),w:Jd(1),G:mc,GG:mc,GGG:mc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},xg=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,wg=/^\-?\d+$/;Cd.$inject=["$locale"];
var rg=ba(G),sg=ba(ub);Ed.$inject=["$parse"];var oe=ba({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ga.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),vb={};n(Db,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=va("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,
e)});vb[c]=function(){return{restrict:"A",priority:100,link:e}}}});n(cd,function(a,b){vb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(Ag))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});n(["src","srcset","href"],function(a){var b=va("ng-"+a);vb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===ga.call(c.prop("href"))&&
(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),xa&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Mb={$addControl:B,$$renameControl:function(a,b){a.$name=b},$removeControl:B,$setValidity:B,$setDirty:B,$setPristine:B,$setSubmitted:B};Kd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Sd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||B}return{name:"form",restrict:a?
"EAC":"E",require:["form","^^?form"],controller:Kd,compile:function(d,f){d.addClass(Ya).addClass(ob);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in e)){var s=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",s,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",s,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var q=g?c(n.$name):B;g&&(q(a,n),e.$observe(g,
function(b){n.$name!==b&&(q(a,v),n.$$parentForm.$$renameControl(n,b),q=c(n.$name),q(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);q(a,v);T(n,Mb)})}}}}}]},pe=Sd(),Ce=Sd(!0),zg=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,Ig=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Jg=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Kg=
/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Td=/^(\d{4})-(\d{2})-(\d{2})$/,Ud=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,pc=/^(\d{4})-W(\d\d)$/,Vd=/^(\d{4})-(\d\d)$/,Wd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Xd={text:function(a,b,d,c,e,f){lb(a,b,d,c,e,f);nc(c)},date:mb("date",Td,Ob(Td,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":mb("datetimelocal",Ud,Ob(Ud,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:mb("time",Wd,Ob(Wd,["HH","mm","ss",
"sss"]),"HH:mm:ss.sss"),week:mb("week",pc,function(a,b){if(V(a))return a;if(F(a)){pc.lastIndex=0;var d=pc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Id(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:mb("month",Vd,Ob(Vd,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Md(a,b,d,c);lb(a,b,d,c,e,f);c.$$parserName="number";c.$parsers.push(function(a){return c.$isEmpty(a)?null:
Kg.test(a)?parseFloat(a):v});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!N(a))throw nb("numfmt",a);a=a.toString()}return a});if(y(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||x(g)||a>=g};d.$observe("min",function(a){y(a)&&!N(a)&&(a=parseFloat(a,10));g=N(a)&&!isNaN(a)?a:v;c.$validate()})}if(y(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||x(h)||a<=h};d.$observe("max",function(a){y(a)&&!N(a)&&(a=parseFloat(a,10));h=N(a)&&!isNaN(a)?
a:v;c.$validate()})}},url:function(a,b,d,c,e,f){lb(a,b,d,c,e,f);nc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||Ig.test(d)}},email:function(a,b,d,c,e,f){lb(a,b,d,c,e,f);nc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||Jg.test(d)}},radio:function(a,b,d,c){x(d.name)&&b.attr("name",++pb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};
d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Nd(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Nd(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return oa(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:B,button:B,submit:B,reset:B,file:B},Fc=["$browser","$sniffer","$filter","$parse",function(a,b,d,
c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Xd[G(g.type)]||Xd.text)(e,f,g,h[0],b,a,d,c)}}}}],Lg=/^(true|false|\d+)$/,Ue=function(){return{restrict:"A",priority:100,compile:function(a,b){return Lg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},ue=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,
e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=x(a)?"":a})}}}}],we=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=x(a)?"":a})}}}}],ve=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(a){return(a||"").toString()});
d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Te=ba({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),xe=oc("",!0),ze=oc("Odd",0),ye=oc("Even",1),Ae=Ma({compile:function(a,b){b.$set("ngCloak",v);a.removeClass("ng-cloak")}}),Be=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Kc={},Mg={blur:!0,focus:!0};n("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),
function(a){var b=va("ng-"+a);Kc[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};Mg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var Ee=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(b,d,c,e,f){var g,h,k;b.$watch(c.ngIf,function(b){b?h||f(function(b,e){h=e;b[b.length++]=W.createComment(" end ngIf: "+
c.ngIf+" ");g={clone:b};a.enter(b,d.parent(),d)}):(k&&(k.remove(),k=null),h&&(h.$destroy(),h=null),g&&(k=tb(g.clone),a.leave(k).then(function(){k=null}),g=null))})}}}],Fe=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:ia.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,m,n,s){var q=0,v,t,p,w=function(){t&&(t.remove(),t=null);v&&(v.$destroy(),v=null);p&&
(d.leave(p).then(function(){t=null}),t=p,p=null)};c.$watch(f,function(f){var m=function(){!y(h)||h&&!c.$eval(h)||b()},z=++q;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&z===q){var b=c.$new();n.template=a;a=s(b,function(a){w();d.enter(a,null,e).then(m)});v=b;p=a;v.$emit("$includeContentLoaded",f);c.$eval(g)}},function(){c.$$destroyed||z!==q||(w(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(w(),n.template=null)})}}}}],We=["$compile",function(a){return{restrict:"ECA",
priority:-400,require:"ngInclude",link:function(b,d,c,e){ga.call(d[0]).match(/SVG/)?(d.empty(),a(Nc(e.template,W).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Ge=Ma({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),Se=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?X(e):e;c.$parsers.push(function(a){if(!x(a)){var b=
[];a&&n(a.split(g),function(a){a&&b.push(f?X(a):a)});return b}});c.$formatters.push(function(a){return L(a)?a.join(e):v});c.$isEmpty=function(a){return!a||!a.length}}}},ob="ng-valid",Od="ng-invalid",Ya="ng-pristine",Nb="ng-dirty",Qd="ng-pending",nb=H("ngModel"),Ng=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=v;this.$validators={};this.$asyncValidators=
{};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=v;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Mb;var m=e(d.ngModel),r=m.assign,q=m,I=r,K=null,t,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");q=function(a){var c=m(a);D(c)&&(c=b(a));return c};I=function(a,
b){D(m(a))?f(a,{$$$p:p.$modelValue}):r(a,p.$modelValue)}}else if(!m.assign)throw nb("nonassign",d.ngModel,ta(c));};this.$render=B;this.$isEmpty=function(a){return x(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(f.removeClass(c,"ng-not-empty"),f.addClass(c,"ng-empty")):(f.removeClass(c,"ng-empty"),f.addClass(c,"ng-not-empty"))};var w=0;Ld({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=
!1;p.$pristine=!0;f.removeClass(c,Nb);f.addClass(c,Ya)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Ya);f.addClass(c,Nb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(K);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!N(p.$modelValue)||
!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:v,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=!0;n(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(n(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;n(p.$asyncValidators,function(e,g){var h=e(a,
b);if(!h||!D(h.then))throw nb("nopromise",h);f(g,v);c.push(h.then(function(){f(g,!0)},function(a){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},B):g(!0)}function f(a,b){h===w&&p.$setValidity(a,b)}function g(a){h===w&&c(a)}w++;var h=w;(function(){var a=p.$$parserName||"parse";if(x(t))f(a,null);else return t||(n(p.$validators,function(a,b){f(b,null)}),n(p.$asyncValidators,function(a,b){f(b,null)})),f(a,t),t;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;
g.cancel(K);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$updateEmptyClasses(a),p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;if(t=x(b)?v:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),x(b)){t=!1;break}N(p.$modelValue)&&isNaN(p.$modelValue)&&(p.$modelValue=q(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=
b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:v,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){I(a,p.$modelValue);n(p.$viewChangeListeners,function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=a;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&y(d.debounce)&&(d=d.debounce,
N(d)?c=d:N(d[b])?c=d[b]:N(d["default"])&&(c=d["default"]));g.cancel(K);c?K=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=q(a);if(b!==p.$modelValue&&(p.$modelValue===p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;t=v;for(var c=p.$formatters,d=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$$updateEmptyClasses(e),p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(b,e,B))}return b})}],
Re=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Ng,priority:1,compile:function(b){b.addClass(Ya).addClass("ng-untouched").addClass(ob);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||g.$$parentForm;g.$$setOptions(f[2]&&f[2].$options);b.$addControl(g);e.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){var g=f[0];if(g.$options&&
g.$options.updateOn)c.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(c){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],Og=/(\s+|^)default(\s+|$)/,Ve=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,b){var d=this;this.$options=Oa(a.$eval(b.ngModelOptions));y(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=X(this.$options.updateOn.replace(Og,function(){d.$options.updateOnDefault=
!0;return" "}))):this.$options.updateOnDefault=!0}]}},He=Ma({terminal:!0,priority:1E3}),Pg=H("ngOptions"),Qg=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,Pe=["$compile","$parse",function(a,b){function d(a,c,d){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}
function l(a){var b;if(!q&&Ca(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var m=a.match(Qg);if(!m)throw Pg("iexp",a,ta(c));var n=m[5]||m[7],q=m[6];a=/ as /.test(m[0])&&m[1];var v=m[9];c=b(m[2]?m[1]:n);var y=a&&b(a)||c,t=v&&b(v),p=v?function(a,b){return t(d,b)}:function(a){return Fa(a)},w=function(a,b){return p(a,B(a,b))},u=b(m[2]||m[1]),x=b(m[3]||""),z=b(m[4]||""),A=b(m[8]),C={},B=q?function(a,b){C[q]=b;C[n]=a;return C}:function(a){C[n]=a;return C};return{trackBy:v,
getTrackByValue:w,getWatchables:b(A,function(a){var b=[];a=a||[];for(var c=l(a),e=c.length,f=0;f<e;f++){var g=a===c?f:c[f],k=B(a[g],g),g=p(a[g],k);b.push(g);if(m[2]||m[1])g=u(d,k),b.push(g);m[4]&&(k=z(d,k),b.push(k))}return b}),getOptions:function(){for(var a=[],b={},c=A(d)||[],f=l(c),g=f.length,m=0;m<g;m++){var n=c===f?m:f[m],r=B(c[n],n),q=y(d,r),n=p(q,r),s=u(d,r),t=x(d,r),r=z(d,r),q=new e(n,q,s,t,r);a.push(q);b[n]=q}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[w(a)]},
getViewValueFromOption:function(a){return v?ia.copy(a.viewValue):a.viewValue}}}}}var c=W.createElement("option"),e=W.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=B},post:function(b,g,h,k){function l(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);a.value!==b.value&&(b.value=a.selectValue)}function m(a,b,c,d){b&&G(b.nodeName)===c?c=b:(c=d.cloneNode(!1),b?a.insertBefore(c,
b):a.appendChild(c));return c}function r(a){for(var b;a;)b=a.nextSibling,$b(a),a=b}function q(a){var b=w&&w[0],c=A&&A[0];if(b||c)for(;a&&(a===b||a===c||8===a.nodeType||"option"===ra(a)&&""===a.value);)a=a.nextSibling;return a}function v(){var a=D&&x.readValue();D=E.getOptions();var b={},d=g[0].firstChild;z&&g.prepend(w);d=q(d);D.items.forEach(function(a){var f,h;y(a.group)?(f=b[a.group],f||(f=m(g[0],d,"optgroup",e),d=f.nextSibling,f.label=a.group,f=b[a.group]={groupElement:f,currentOptionElement:f.firstChild}),
h=m(f.groupElement,f.currentOptionElement,"option",c),l(a,h),f.currentOptionElement=h.nextSibling):(h=m(g[0],d,"option",c),l(a,h),d=h.nextSibling)});Object.keys(b).forEach(function(a){r(b[a].currentOptionElement)});r(d);t.$render();if(!t.$isEmpty(a)){var f=x.readValue();(E.trackBy||p?oa(a,f):a===f)||(t.$setViewValue(f),t.$render())}}var x=k[0],t=k[1],p=h.multiple,w;k=0;for(var u=g.children(),B=u.length;k<B;k++)if(""===u[k].value){w=u.eq(k);break}var z=!!w,A=C(c.cloneNode(!1));A.val("?");var D,E=d(h.ngOptions,
g,b);p?(t.$isEmpty=function(a){return!a||0===a.length},x.writeValue=function(a){D.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){(a=D.getOptionFromViewValue(a))&&!a.disabled&&(a.element.selected=!0)})},x.readValue=function(){var a=g.val()||[],b=[];n(a,function(a){(a=D.selectValueMap[a])&&!a.disabled&&b.push(D.getViewValueFromOption(a))});return b},E.trackBy&&b.$watchCollection(function(){if(L(t.$viewValue))return t.$viewValue.map(function(a){return E.getTrackByValue(a)})},
function(){t.$render()})):(x.writeValue=function(a){var b=D.getOptionFromViewValue(a);b&&!b.disabled?g[0].value!==b.selectValue&&(A.remove(),z||w.remove(),g[0].value=b.selectValue,b.element.selected=!0,b.element.setAttribute("selected","selected")):null===a||z?(A.remove(),z||g.prepend(w),g.val(""),w.prop("selected",!0),w.attr("selected",!0)):(z||w.remove(),g.prepend(A),g.val("?"),A.prop("selected",!0),A.attr("selected",!0))},x.readValue=function(){var a=D.selectValueMap[g.val()];return a&&!a.disabled?
(z||w.remove(),A.remove(),D.getViewValueFromOption(a)):null},E.trackBy&&b.$watch(function(){return E.getTrackByValue(t.$viewValue)},function(){t.$render()}));z?(w.remove(),a(w)(b),w.removeClass("ng-scope")):w=C(c.cloneNode(!1));v();b.$watchCollection(E.getWatchables,v)}}}}],Ie=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,g,h){function k(a){g.text(a||"")}var l=h.count,m=h.$attr.when&&g.attr(h.$attr.when),r=h.offset||0,q=f.$eval(m)||{},v=
{},y=b.startSymbol(),t=b.endSymbol(),p=y+l+"-"+r+t,w=ia.noop,u;n(h,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+G(c[2]),q[c]=g.attr(h.$attr[b]))});n(q,function(a,d){v[d]=b(a.replace(c,p))});f.$watch(l,function(b){var c=parseFloat(b),e=isNaN(c);e||c in q||(c=a.pluralCat(c-r));c===u||e&&N(u)&&isNaN(u)||(w(),e=v[c],x(e)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+m),w=B,k()):w=f.$watch(e,k),u=c)})}}}],Je=["$parse","$animate",function(a,b){var d=H("ngRepeat"),c=function(a,b,
c,d,k,l,m){a[c]=d;k&&(a[k]=l);a.$index=b;a.$first=0===b;a.$last=b===m-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(e,f){var g=f.ngRepeat,h=W.createComment(" end ngRepeat: "+g+" "),k=g.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!k)throw d("iexp",g);var l=k[1],m=k[2],r=k[3],q=k[4],k=l.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);
if(!k)throw d("iidexp",l);var x=k[3]||k[1],y=k[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(r)))throw d("badident",r);var t,p,w,u,B={$id:Fa};q?t=a(q):(w=function(a,b){return Fa(b)},u=function(a){return a});return function(a,e,f,k,l){t&&(p=function(b,c,d){y&&(B[y]=b);B[x]=c;B.$index=d;return t(a,B)});var q=Z();a.$watchCollection(m,function(f){var k,m,s=e[0],t,B=Z(),D,E,H,F,L,G,N;r&&(a[r]=f);if(Ca(f))L=
f,m=p||w;else for(N in m=p||u,L=[],f)sa.call(f,N)&&"$"!==N.charAt(0)&&L.push(N);D=L.length;N=Array(D);for(k=0;k<D;k++)if(E=f===L?k:L[k],H=f[E],F=m(E,H,k),q[F])G=q[F],delete q[F],B[F]=G,N[k]=G;else{if(B[F])throw n(N,function(a){a&&a.scope&&(q[a.id]=a)}),d("dupes",g,F,H);N[k]={id:F,scope:v,clone:v};B[F]=!0}for(t in q){G=q[t];F=tb(G.clone);b.leave(F);if(F[0].parentNode)for(k=0,m=F.length;k<m;k++)F[k].$$NG_REMOVED=!0;G.scope.$destroy()}for(k=0;k<D;k++)if(E=f===L?k:L[k],H=f[E],G=N[k],G.scope){t=s;do t=
t.nextSibling;while(t&&t.$$NG_REMOVED);G.clone[0]!=t&&b.move(tb(G.clone),null,C(s));s=G.clone[G.clone.length-1];c(G.scope,k,x,H,y,E,D)}else l(function(a,d){G.scope=d;var e=h.cloneNode(!1);a[a.length++]=e;b.enter(a,null,C(s));s=e;G.clone=a;B[G.id]=G;c(G.scope,k,x,H,y,E,D)});q=B})}}}}],Ke=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],De=["$animate",function(a){return{restrict:"A",
multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Le=Ma(function(a,b,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&n(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),Me=["$animate",function(a){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(b,d,c,e){var f=[],g=[],h=[],k=[],l=function(a,b){return function(){a.splice(b,1)}};b.$watch(c.ngSwitch||c.on,function(b){var c,
d;c=0;for(d=h.length;c<d;++c)a.cancel(h[c]);c=h.length=0;for(d=k.length;c<d;++c){var q=tb(g[c].clone);k[c].$destroy();(h[c]=a.leave(q)).then(l(h,c))}g.length=0;k.length=0;(f=e.cases["!"+b]||e.cases["?"])&&n(f,function(b){b.transclude(function(c,d){k.push(d);var e=b.element;c[c.length++]=W.createComment(" end ngSwitchWhen: ");g.push({clone:c});a.enter(c,e.parent(),e)})})})}}}],Ne=Ma({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["!"+d.ngSwitchWhen]=
c.cases["!"+d.ngSwitchWhen]||[];c.cases["!"+d.ngSwitchWhen].push({transclude:e,element:b})}}),Oe=Ma({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,element:b})}}),Rg=H("ngTransclude"),Qe=Ma({restrict:"EAC",link:function(a,b,d,c,e){d.ngTransclude===d.$attr.ngTransclude&&(d.ngTransclude="");if(!e)throw Rg("orphan",ta(b));e(function(a){a.length&&(b.empty(),b.append(a))},null,d.ngTransclude||
d.ngTranscludeSlot)}}),qe=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"==d.type&&a.put(d.id,b[0].text)}}}],Sg={$setViewValue:B,$render:B},Tg=["$element","$scope","$attrs",function(a,b,d){var c=this,e=new Ua;c.ngModelCtrl=Sg;c.unknownOption=C(W.createElement("option"));c.renderUnknownOption=function(b){b="? "+Fa(b)+" ?";c.unknownOption.val(b);a.prepend(c.unknownOption);a.val(b)};b.$on("$destroy",function(){c.renderUnknownOption=B});c.removeUnknownOption=
function(){c.unknownOption.parent()&&c.unknownOption.remove()};c.readValue=function(){c.removeUnknownOption();return a.val()};c.writeValue=function(b){c.hasOption(b)?(c.removeUnknownOption(),a.val(b),""===b&&c.emptyOption.prop("selected",!0)):null==b&&c.emptyOption?(c.removeUnknownOption(),a.val("")):c.renderUnknownOption(b)};c.addOption=function(a,b){if(8!==b[0].nodeType){Ta(a,'"option value"');""===a&&(c.emptyOption=b);var d=e.get(a)||0;e.put(a,d+1);c.ngModelCtrl.$render();b[0].hasAttribute("selected")&&
(b[0].selected=!0)}};c.removeOption=function(a){var b=e.get(a);b&&(1===b?(e.remove(a),""===a&&(c.emptyOption=v)):e.put(a,b-1))};c.hasOption=function(a){return!!e.get(a)};c.registerOption=function(a,b,d,e,l){if(e){var m;d.$observe("value",function(a){y(m)&&c.removeOption(m);m=a;c.addOption(a,b)})}else l?a.$watch(l,function(a,e){d.$set("value",a);e!==a&&c.removeOption(e);c.addOption(a,b)}):c.addOption(d.value,b);b.on("$destroy",function(){c.removeOption(d.value);c.ngModelCtrl.$render()})}}],re=function(){return{restrict:"E",
require:["select","?ngModel"],controller:Tg,priority:1,link:{pre:function(a,b,d,c){var e=c[1];if(e){var f=c[0];f.ngModelCtrl=e;b.on("change",function(){a.$apply(function(){e.$setViewValue(f.readValue())})});if(d.multiple){f.readValue=function(){var a=[];n(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};f.writeValue=function(a){var c=new Ua(a);n(b.find("option"),function(a){a.selected=y(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==e.$viewValue||oa(g,e.$viewValue)||(g=
na(e.$viewValue),e.$render());h=e.$viewValue});e.$isEmpty=function(a){return!a||0===a.length}}}},post:function(a,b,d,c){var e=c[1];if(e){var f=c[0];e.$render=function(){f.writeValue(e.$viewValue)}}}}}},te=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,d){if(y(d.value))var c=a(d.value,!0);else{var e=a(b.text(),!0);e||d.$set("value",b.text())}return function(a,b,d){var k=b.parent();(k=k.data("$selectController")||k.parent().data("$selectController"))&&k.registerOption(a,
b,d,c,e)}}}}],se=ba({restrict:"E",terminal:!1}),Hc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required",function(){c.$validate()}))}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe("pattern",function(a){F(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw H("ngPattern")("noregexp",
f,a,ta(b));e=a||v;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||x(e)||e.test(b)}}}}},Jc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=-1;d.$observe("maxlength",function(a){a=ca(a);e=isNaN(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},Ic=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=ca(a)||0;c.$validate()});
c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};O.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(je(),le(ia),ia.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),
SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",
PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,c){var e=a|0,f=c;v===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),C(W).ready(function(){fe(W,Ac)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
//# sourceMappingURL=angular.min.js.map
;
/*
 AngularJS v1.5.0
 (c) 2010-2016 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(D,r,Va){'use strict';function ya(a,b,c){if(!a)throw Ka("areq",b||"?",c||"required");return a}function za(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;ba(a)&&(a=a.join(" "));ba(b)&&(b=b.join(" "));return a+" "+b}function La(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function X(a,b,c){var d="";a=ba(a)?a:a&&R(a)&&a.length?a.split(/\s+/):[];s(a,function(a,g){a&&0<a.length&&(d+=0<g?" ":"",d+=c?b+a:a+b)});return d}function Ma(a){if(a instanceof I)switch(a.length){case 0:return[];
case 1:if(1===a[0].nodeType)return a;break;default:return I(oa(a))}if(1===a.nodeType)return I(a)}function oa(a){if(!a[0])return a;for(var b=0;b<a.length;b++){var c=a[b];if(1==c.nodeType)return c}}function Na(a,b,c){s(b,function(b){a.addClass(b,c)})}function Oa(a,b,c){s(b,function(b){a.removeClass(b,c)})}function U(a){return function(b,c){c.addClass&&(Na(a,b,c.addClass),c.addClass=null);c.removeClass&&(Oa(a,b,c.removeClass),c.removeClass=null)}}function ka(a){a=a||{};if(!a.$$prepared){var b=a.domOperation||
Q;a.domOperation=function(){a.$$domOperationFired=!0;b();b=Q};a.$$prepared=!0}return a}function fa(a,b){Aa(a,b);Ba(a,b)}function Aa(a,b){b.from&&(a.css(b.from),b.from=null)}function Ba(a,b){b.to&&(a.css(b.to),b.to=null)}function V(a,b,c){var d=b.options||{};c=c.options||{};var e=(d.addClass||"")+" "+(c.addClass||""),g=(d.removeClass||"")+" "+(c.removeClass||"");a=Pa(a.attr("class"),e,g);c.preparationClasses&&(d.preparationClasses=ca(c.preparationClasses,d.preparationClasses),delete c.preparationClasses);
e=d.domOperation!==Q?d.domOperation:null;Ca(d,c);e&&(d.domOperation=e);d.addClass=a.addClass?a.addClass:null;d.removeClass=a.removeClass?a.removeClass:null;b.addClass=d.addClass;b.removeClass=d.removeClass;return d}function Pa(a,b,c){function d(a){R(a)&&(a=a.split(" "));var b={};s(a,function(a){a.length&&(b[a]=!0)});return b}var e={};a=d(a);b=d(b);s(b,function(a,b){e[b]=1});c=d(c);s(c,function(a,b){e[b]=1===e[b]?null:-1});var g={addClass:"",removeClass:""};s(e,function(b,c){var d,e;1===b?(d="addClass",
e=!a[c]):-1===b&&(d="removeClass",e=a[c]);e&&(g[d].length&&(g[d]+=" "),g[d]+=c)});return g}function G(a){return a instanceof r.element?a[0]:a}function Qa(a,b,c){var d="";b&&(d=X(b,"ng-",!0));c.addClass&&(d=ca(d,X(c.addClass,"-add")));c.removeClass&&(d=ca(d,X(c.removeClass,"-remove")));d.length&&(c.preparationClasses=d,a.addClass(d))}function la(a,b){var c=b?"-"+b+"s":"";ha(a,[ia,c]);return[ia,c]}function pa(a,b){var c=b?"paused":"",d=Y+"PlayState";ha(a,[d,c]);return[d,c]}function ha(a,b){a.style[b[0]]=
b[1]}function ca(a,b){return a?b?a+" "+b:a:b}function Da(a,b,c){var d=Object.create(null),e=a.getComputedStyle(b)||{};s(c,function(a,b){var c=e[a];if(c){var C=c.charAt(0);if("-"===C||"+"===C||0<=C)c=Ra(c);0===c&&(c=null);d[b]=c}});return d}function Ra(a){var b=0;a=a.split(/\s*,\s*/);s(a,function(a){"s"==a.charAt(a.length-1)&&(a=a.substring(0,a.length-1));a=parseFloat(a)||0;b=b?Math.max(a,b):a});return b}function qa(a){return 0===a||null!=a}function Ea(a,b){var c=S,d=a+"s";b?c+="Duration":d+=" linear all";
return[c,d]}function Fa(){var a=Object.create(null);return{flush:function(){a=Object.create(null)},count:function(b){return(b=a[b])?b.total:0},get:function(b){return(b=a[b])&&b.value},put:function(b,c){a[b]?a[b].total++:a[b]={total:1,value:c}}}}function Ga(a,b,c){s(c,function(c){a[c]=Z(a[c])?a[c]:b.style.getPropertyValue(c)})}var Q=r.noop,Ha=r.copy,Ca=r.extend,I=r.element,s=r.forEach,ba=r.isArray,R=r.isString,ra=r.isObject,P=r.isUndefined,Z=r.isDefined,Ia=r.isFunction,sa=r.isElement,S,ta,Y,ua;P(D.ontransitionend)&&
Z(D.onwebkittransitionend)?(S="WebkitTransition",ta="webkitTransitionEnd transitionend"):(S="transition",ta="transitionend");P(D.onanimationend)&&Z(D.onwebkitanimationend)?(Y="WebkitAnimation",ua="webkitAnimationEnd animationend"):(Y="animation",ua="animationend");var ma=Y+"Delay",va=Y+"Duration",ia=S+"Delay";D=S+"Duration";var Ka=r.$$minErr("ng"),Sa={transitionDuration:D,transitionDelay:ia,transitionProperty:S+"Property",animationDuration:va,animationDelay:ma,animationIterationCount:Y+"IterationCount"},
Ta={transitionDuration:D,transitionDelay:ia,animationDuration:va,animationDelay:ma};r.module("ngAnimate",[]).directive("ngAnimateSwap",["$animate","$rootScope",function(a,b){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(b,d,e,g,H){var A,C;b.$watchCollection(e.ngAnimateSwap||e["for"],function(e){A&&a.leave(A);C&&(C.$destroy(),C=null);if(e||0===e)C=b.$new(),H(C,function(b){A=b;a.enter(b,null,d)})})}}}]).directive("ngAnimateChildren",["$interpolate",function(a){return{link:function(b,
c,d){function e(a){c.data("$$ngAnimateChildren","on"===a||"true"===a)}var g=d.ngAnimateChildren;r.isString(g)&&0===g.length?c.data("$$ngAnimateChildren",!0):(e(a(g)(b)),d.$observe("ngAnimateChildren",e))}}}]).factory("$$rAFScheduler",["$$rAF",function(a){function b(a){d=d.concat(a);c()}function c(){if(d.length){for(var b=d.shift(),H=0;H<b.length;H++)b[H]();e||a(function(){e||c()})}}var d,e;d=b.queue=[];b.waitUntilQuiet=function(b){e&&e();e=a(function(){e=null;b();c()})};return b}]).provider("$$animateQueue",
["$animateProvider",function(a){function b(a){if(!a)return null;a=a.split(" ");var b=Object.create(null);s(a,function(a){b[a]=!0});return b}function c(a,c){if(a&&c){var d=b(c);return a.split(" ").some(function(a){return d[a]})}}function d(a,b,c,d){return g[a].some(function(a){return a(b,c,d)})}function e(a,b){var c=0<(a.addClass||"").length,d=0<(a.removeClass||"").length;return b?c&&d:c||d}var g=this.rules={skip:[],cancel:[],join:[]};g.join.push(function(a,b,c){return!b.structural&&e(b)});g.skip.push(function(a,
b,c){return!b.structural&&!e(b)});g.skip.push(function(a,b,c){return"leave"==c.event&&b.structural});g.skip.push(function(a,b,c){return c.structural&&2===c.state&&!b.structural});g.cancel.push(function(a,b,c){return c.structural&&b.structural});g.cancel.push(function(a,b,c){return 2===c.state&&b.structural});g.cancel.push(function(a,b,d){a=b.addClass;b=b.removeClass;var e=d.addClass;d=d.removeClass;return P(a)&&P(b)||P(e)&&P(d)?!1:c(a,d)||c(b,e)});this.$get=["$$rAF","$rootScope","$rootElement","$document",
"$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow",function(b,c,g,m,M,r,u,na,v,z){function K(){var a=!1;return function(b){a?b():c.$$postDigest(function(){a=!0;b()})}}function J(a,b,c){var f=G(b),d=G(a),h=[];(a=x[c])&&s(a,function(a){y.call(a.node,f)?h.push(a.callback):"leave"===c&&y.call(a.node,d)&&h.push(a.callback)});return h}function h(a,f,h){function l(c,f,d,h){g(function(){var c=J(y,a,f);c.length&&b(function(){s(c,function(b){b(a,d,h)})})});c.progress(f,
d,h)}function x(b){var c=a,f=n;f.preparationClasses&&(c.removeClass(f.preparationClasses),f.preparationClasses=null);f.activeClasses&&(c.removeClass(f.activeClasses),f.activeClasses=null);Ja(a,n);fa(a,n);n.domOperation();k.complete(!b)}var n=Ha(h),z,y;if(a=Ma(a))z=G(a),y=a.parent();var n=ka(n),k=new u,g=K();ba(n.addClass)&&(n.addClass=n.addClass.join(" "));n.addClass&&!R(n.addClass)&&(n.addClass=null);ba(n.removeClass)&&(n.removeClass=n.removeClass.join(" "));n.removeClass&&!R(n.removeClass)&&(n.removeClass=
null);n.from&&!ra(n.from)&&(n.from=null);n.to&&!ra(n.to)&&(n.to=null);if(!z)return x(),k;h=[z.className,n.addClass,n.removeClass].join(" ");if(!Ua(h))return x(),k;var C=0<=["enter","move","leave"].indexOf(f),w=!L||m[0].hidden||E.get(z);h=!w&&B.get(z)||{};var v=!!h.state;w||v&&1==h.state||(w=!q(a,y,f));if(w)return x(),k;C&&xa(a);w={structural:C,element:a,event:f,addClass:n.addClass,removeClass:n.removeClass,close:x,options:n,runner:k};if(v){if(d("skip",a,w,h)){if(2===h.state)return x(),k;V(a,h,w);
return h.runner}if(d("cancel",a,w,h))if(2===h.state)h.runner.end();else if(h.structural)h.close();else return V(a,h,w),h.runner;else if(d("join",a,w,h))if(2===h.state)V(a,w,{});else return Qa(a,C?f:null,n),f=w.event=h.event,n=V(a,h,w),h.runner}else V(a,w,{});(v=w.structural)||(v="animate"===w.event&&0<Object.keys(w.options.to||{}).length||e(w));if(!v)return x(),N(a),k;var M=(h.counter||0)+1;w.counter=M;t(a,1,w);c.$$postDigest(function(){var b=B.get(z),c=!b,b=b||{},d=0<(a.parent()||[]).length&&("animate"===
b.event||b.structural||e(b));if(c||b.counter!==M||!d){c&&(Ja(a,n),fa(a,n));if(c||C&&b.event!==f)n.domOperation(),k.end();d||N(a)}else f=!b.structural&&e(b,!0)?"setClass":b.event,t(a,2),b=r(a,f,b.options),b.done(function(b){x(!b);(b=B.get(z))&&b.counter===M&&N(G(a));l(k,f,"close",{})}),k.setHost(b),l(k,f,"start",{})});return k}function xa(a){a=G(a).querySelectorAll("[data-ng-animate]");s(a,function(a){var b=parseInt(a.getAttribute("data-ng-animate")),c=B.get(a);if(c)switch(b){case 2:c.runner.end();
case 1:B.remove(a)}})}function N(a){a=G(a);a.removeAttribute("data-ng-animate");B.remove(a)}function k(a,b){return G(a)===G(b)}function q(a,b,c){c=I(m[0].body);var f=k(a,c)||"HTML"===a[0].nodeName,d=k(a,g),h=!1,l,e=E.get(G(a));for((a=a.data("$ngAnimatePin"))&&(b=a);b&&b.length;){d||(d=k(b,g));var x=b[0];if(1!==x.nodeType)break;a=B.get(x)||{};if(!h){x=E.get(x);if(!0===x&&!1!==e){e=!0;break}else!1===x&&(e=!1);h=a.structural}if(P(l)||!0===l)a=b.data("$$ngAnimateChildren"),Z(a)&&(l=a);if(h&&!1===l)break;
f||(f=k(b,c));if(f&&d)break;if(!d&&(a=b.data("$ngAnimatePin"))){b=a;continue}b=b.parent()}return(!h||l)&&!0!==e&&d&&f}function t(a,b,c){c=c||{};c.state=b;a=G(a);a.setAttribute("data-ng-animate",b);c=(b=B.get(a))?Ca(b,c):c;B.put(a,c)}var B=new M,E=new M,L=null,f=c.$watch(function(){return 0===na.totalPendingRequests},function(a){a&&(f(),c.$$postDigest(function(){c.$$postDigest(function(){null===L&&(L=!0)})}))}),x={},l=a.classNameFilter(),Ua=l?function(a){return l.test(a)}:function(){return!0},Ja=U(v),
y=Node.prototype.contains||function(a){return this===a||!!(this.compareDocumentPosition(a)&16)};return{on:function(a,b,c){b=oa(b);x[a]=x[a]||[];x[a].push({node:b,callback:c})},off:function(a,b,c){function f(a,b,c){var d=oa(b);return a.filter(function(a){return!(a.node===d&&(!c||a.callback===c))})}var d=x[a];d&&(x[a]=1===arguments.length?null:f(d,b,c))},pin:function(a,b){ya(sa(a),"element","not an element");ya(sa(b),"parentElement","not an element");a.data("$ngAnimatePin",b)},push:function(a,b,c,f){c=
c||{};c.domOperation=f;return h(a,b,c)},enabled:function(a,b){var c=arguments.length;if(0===c)b=!!L;else if(sa(a)){var f=G(a),d=E.get(f);1===c?b=!d:E.put(f,!b)}else b=L=!!a;return b}}}]}]).provider("$$animation",["$animateProvider",function(a){function b(a){return a.data("$$animationRunner")}var c=this.drivers=[];this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(a,e,g,H,A,C){function m(a){function b(a){if(a.processed)return a;a.processed=!0;var d=
a.domNode,N=d.parentNode;e.put(d,a);for(var k;N;){if(k=e.get(N)){k.processed||(k=b(k));break}N=N.parentNode}(k||c).children.push(a);return a}var c={children:[]},d,e=new A;for(d=0;d<a.length;d++){var g=a[d];e.put(g.domNode,a[d]={domNode:g.domNode,fn:g.fn,children:[]})}for(d=0;d<a.length;d++)b(a[d]);return function(a){var b=[],c=[],d;for(d=0;d<a.children.length;d++)c.push(a.children[d]);a=c.length;var e=0,t=[];for(d=0;d<c.length;d++){var g=c[d];0>=a&&(a=e,e=0,b.push(t),t=[]);t.push(g.fn);g.children.forEach(function(a){e++;
c.push(a)});a--}t.length&&b.push(t);return b}(c)}var M=[],r=U(a);return function(u,A,v){function z(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];s(a,function(a){var c=a.getAttribute("ng-animate-ref");c&&c.length&&b.push(a)});return b}function K(a){var b=[],c={};s(a,function(a,f){var d=G(a.element),h=0<=["enter","move"].indexOf(a.event),d=a.structural?z(d):[];if(d.length){var e=h?"to":"from";s(d,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]||
{};c[b][e]={animationID:f,element:I(a)}})}else b.push(a)});var d={},h={};s(c,function(c,e){var l=c.from,t=c.to;if(l&&t){var g=a[l.animationID],E=a[t.animationID],k=l.animationID.toString();if(!h[k]){var z=h[k]={structural:!0,beforeStart:function(){g.beforeStart();E.beforeStart()},close:function(){g.close();E.close()},classes:J(g.classes,E.classes),from:g,to:E,anchors:[]};z.classes.length?b.push(z):(b.push(g),b.push(E))}h[k].anchors.push({out:l.element,"in":t.element})}else l=l?l.animationID:t.animationID,
t=l.toString(),d[t]||(d[t]=!0,b.push(a[l]))});return b}function J(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],d=0;d<a.length;d++){var h=a[d];if("ng-"!==h.substring(0,3))for(var e=0;e<b.length;e++)if(h===b[e]){c.push(h);break}}return c.join(" ")}function h(a){for(var b=c.length-1;0<=b;b--){var d=c[b];if(g.has(d)&&(d=g.get(d)(a)))return d}}function xa(a,c){a.from&&a.to?(b(a.from.element).setHost(c),b(a.to.element).setHost(c)):b(a.element).setHost(c)}function N(){var a=b(u);!a||"leave"===A&&v.$$domOperationFired||
a.end()}function k(b){u.off("$destroy",N);u.removeData("$$animationRunner");r(u,v);fa(u,v);v.domOperation();E&&a.removeClass(u,E);u.removeClass("ng-animate");t.complete(!b)}v=ka(v);var q=0<=["enter","move","leave"].indexOf(A),t=new H({end:function(){k()},cancel:function(){k(!0)}});if(!c.length)return k(),t;u.data("$$animationRunner",t);var B=za(u.attr("class"),za(v.addClass,v.removeClass)),E=v.tempClasses;E&&(B+=" "+E,v.tempClasses=null);var L;q&&(L="ng-"+A+"-prepare",a.addClass(u,L));M.push({element:u,
classes:B,event:A,structural:q,options:v,beforeStart:function(){u.addClass("ng-animate");E&&a.addClass(u,E);L&&(a.removeClass(u,L),L=null)},close:k});u.on("$destroy",N);if(1<M.length)return t;e.$$postDigest(function(){var a=[];s(M,function(c){b(c.element)?a.push(c):c.close()});M.length=0;var c=K(a),d=[];s(c,function(a){d.push({domNode:G(a.from?a.from.element:a.element),fn:function(){a.beforeStart();var c,d=a.close;if(b(a.anchors?a.from.element||a.to.element:a.element)){var f=h(a);f&&(c=f.start)}c?
(c=c(),c.done(function(a){d(!a)}),xa(a,c)):d()}})});C(m(d))});return t}}]}]).provider("$animateCss",["$animateProvider",function(a){var b=Fa(),c=Fa();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function(a,e,g,H,A,C,m,M){function r(a,b){var c=a.parentNode;return(c.$$ngAnimateParentKey||(c.$$ngAnimateParentKey=++K))+"-"+a.getAttribute("class")+"-"+b}function u(h,g,z,k){var q;0<b.count(z)&&(q=c.get(z),q||(g=X(g,"-stagger"),
e.addClass(h,g),q=Da(a,h,k),q.animationDuration=Math.max(q.animationDuration,0),q.transitionDuration=Math.max(q.transitionDuration,0),e.removeClass(h,g),c.put(z,q)));return q||{}}function na(a){J.push(a);m.waitUntilQuiet(function(){b.flush();c.flush();for(var a=A(),d=0;d<J.length;d++)J[d](a);J.length=0})}function v(c,e,g){e=b.get(g);e||(e=Da(a,c,Sa),"infinite"===e.animationIterationCount&&(e.animationIterationCount=1));b.put(g,e);c=e;g=c.animationDelay;e=c.transitionDelay;c.maxDelay=g&&e?Math.max(g,
e):g||e;c.maxDuration=Math.max(c.animationDuration*c.animationIterationCount,c.transitionDuration);return c}var z=U(e),K=0,J=[];return function(a,c){function d(){q()}function k(){q(!0)}function q(b){if(!(A||wa&&K)){A=!0;K=!1;f.$$skipPreparationClasses||e.removeClass(a,da);e.removeClass(a,ca);pa(l,!1);la(l,!1);s(m,function(a){l.style[a[0]]=""});z(a,f);fa(a,f);Object.keys(x).length&&s(x,function(a,b){a?l.style.setProperty(b,a):l.style.removeProperty(b)});if(f.onDone)f.onDone();ea&&ea.length&&a.off(ea.join(" "),
E);var c=a.data("$$animateCss");c&&(H.cancel(c[0].timer),a.removeData("$$animateCss"));D&&D.complete(!b)}}function t(a){p.blockTransition&&la(l,a);p.blockKeyframeAnimation&&pa(l,!!a)}function B(){D=new g({end:d,cancel:k});na(Q);q();return{$$willAnimate:!1,start:function(){return D},end:d}}function E(a){a.stopPropagation();var b=a.originalEvent||a;a=b.$manualTimeStamp||Date.now();b=parseFloat(b.elapsedTime.toFixed(3));Math.max(a-U,0)>=P&&b>=O&&(wa=!0,q())}function L(){function b(){if(!A){t(!1);s(m,
function(a){l.style[a[0]]=a[1]});z(a,f);e.addClass(a,ca);if(p.recalculateTimingStyles){ja=l.className+" "+da;ga=r(l,ja);F=v(l,ja,ga);$=F.maxDelay;n=Math.max($,0);O=F.maxDuration;if(0===O){q();return}p.hasTransitions=0<F.transitionDuration;p.hasAnimations=0<F.animationDuration}p.applyAnimationDelay&&($="boolean"!==typeof f.delay&&qa(f.delay)?parseFloat(f.delay):$,n=Math.max($,0),F.animationDelay=$,aa=[ma,$+"s"],m.push(aa),l.style[aa[0]]=aa[1]);P=1E3*n;R=1E3*O;if(f.easing){var d,g=f.easing;p.hasTransitions&&
(d=S+"TimingFunction",m.push([d,g]),l.style[d]=g);p.hasAnimations&&(d=Y+"TimingFunction",m.push([d,g]),l.style[d]=g)}F.transitionDuration&&ea.push(ta);F.animationDuration&&ea.push(ua);U=Date.now();var k=P+1.5*R;d=U+k;var g=a.data("$$animateCss")||[],L=!0;if(g.length){var B=g[0];(L=d>B.expectedEndTime)?H.cancel(B.timer):g.push(q)}L&&(k=H(c,k,!1),g[0]={timer:k,expectedEndTime:d},g.push(q),a.data("$$animateCss",g));if(ea.length)a.on(ea.join(" "),E);f.to&&(f.cleanupStyles&&Ga(x,l,Object.keys(f.to)),Ba(a,
f))}}function c(){var b=a.data("$$animateCss");if(b){for(var d=1;d<b.length;d++)b[d]();a.removeData("$$animateCss")}}if(!A)if(l.parentNode){var d=function(a){if(wa)K&&a&&(K=!1,q());else if(K=!a,F.animationDuration)if(a=pa(l,K),K)m.push(a);else{var b=m,c=b.indexOf(a);0<=a&&b.splice(c,1)}},g=0<Z&&(F.transitionDuration&&0===W.transitionDuration||F.animationDuration&&0===W.animationDuration)&&Math.max(W.animationDelay,W.transitionDelay);g?H(b,Math.floor(g*Z*1E3),!1):b();I.resume=function(){d(!0)};I.pause=
function(){d(!1)}}else q()}var f=c||{};f.$$prepared||(f=ka(Ha(f)));var x={},l=G(a);if(!l||!l.parentNode||!M.enabled())return B();var m=[],J=a.attr("class"),y=La(f),A,K,wa,D,I,n,P,O,R,U,ea=[];if(0===f.duration||!C.animations&&!C.transitions)return B();var w=f.event&&ba(f.event)?f.event.join(" "):f.event,V="",T="";w&&f.structural?V=X(w,"ng-",!0):w&&(V=w);f.addClass&&(T+=X(f.addClass,"-add"));f.removeClass&&(T.length&&(T+=" "),T+=X(f.removeClass,"-remove"));f.applyClassesEarly&&T.length&&z(a,f);var da=
[V,T].join(" ").trim(),ja=J+" "+da,ca=X(da,"-active"),J=y.to&&0<Object.keys(y.to).length;if(!(0<(f.keyframeStyle||"").length||J||da))return B();var ga,W;0<f.stagger?(y=parseFloat(f.stagger),W={transitionDelay:y,animationDelay:y,transitionDuration:0,animationDuration:0}):(ga=r(l,ja),W=u(l,da,ga,Ta));f.$$skipPreparationClasses||e.addClass(a,da);f.transitionStyle&&(y=[S,f.transitionStyle],ha(l,y),m.push(y));0<=f.duration&&(y=0<l.style[S].length,y=Ea(f.duration,y),ha(l,y),m.push(y));f.keyframeStyle&&
(y=[Y,f.keyframeStyle],ha(l,y),m.push(y));var Z=W?0<=f.staggerIndex?f.staggerIndex:b.count(ga):0;(w=0===Z)&&!f.skipBlocking&&la(l,9999);var F=v(l,ja,ga),$=F.maxDelay;n=Math.max($,0);O=F.maxDuration;var p={};p.hasTransitions=0<F.transitionDuration;p.hasAnimations=0<F.animationDuration;p.hasTransitionAll=p.hasTransitions&&"all"==F.transitionProperty;p.applyTransitionDuration=J&&(p.hasTransitions&&!p.hasTransitionAll||p.hasAnimations&&!p.hasTransitions);p.applyAnimationDuration=f.duration&&p.hasAnimations;
p.applyTransitionDelay=qa(f.delay)&&(p.applyTransitionDuration||p.hasTransitions);p.applyAnimationDelay=qa(f.delay)&&p.hasAnimations;p.recalculateTimingStyles=0<T.length;if(p.applyTransitionDuration||p.applyAnimationDuration)O=f.duration?parseFloat(f.duration):O,p.applyTransitionDuration&&(p.hasTransitions=!0,F.transitionDuration=O,y=0<l.style[S+"Property"].length,m.push(Ea(O,y))),p.applyAnimationDuration&&(p.hasAnimations=!0,F.animationDuration=O,m.push([va,O+"s"]));if(0===O&&!p.recalculateTimingStyles)return B();
if(null!=f.delay){var aa;"boolean"!==typeof f.delay&&(aa=parseFloat(f.delay),n=Math.max(aa,0));p.applyTransitionDelay&&m.push([ia,aa+"s"]);p.applyAnimationDelay&&m.push([ma,aa+"s"])}null==f.duration&&0<F.transitionDuration&&(p.recalculateTimingStyles=p.recalculateTimingStyles||w);P=1E3*n;R=1E3*O;f.skipBlocking||(p.blockTransition=0<F.transitionDuration,p.blockKeyframeAnimation=0<F.animationDuration&&0<W.animationDelay&&0===W.animationDuration);f.from&&(f.cleanupStyles&&Ga(x,l,Object.keys(f.from)),
Aa(a,f));p.blockTransition||p.blockKeyframeAnimation?t(O):f.skipBlocking||la(l,!1);return{$$willAnimate:!0,end:d,start:function(){if(!A)return I={end:d,cancel:k,resume:null,pause:null},D=new g(I),na(L),D}}}}]}]).provider("$$animateCssDriver",["$$animationProvider",function(a){a.drivers.push("$$animateCssDriver");this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(a,c,d,e,g,H,A){function C(a){return a.replace(/\bng-\S+\b/g,"")}function m(a,
b){R(a)&&(a=a.split(" "));R(b)&&(b=b.split(" "));return a.filter(function(a){return-1===b.indexOf(a)}).join(" ")}function M(c,e,g){function h(a){var b={},c=G(a).getBoundingClientRect();s(["width","height","top","left"],function(a){var d=c[a];switch(a){case "top":d+=D.scrollTop;break;case "left":d+=D.scrollLeft}b[a]=Math.floor(d)+"px"});return b}function A(){var c=C(g.attr("class")||""),d=m(c,q),c=m(q,c),d=a(k,{to:h(g),addClass:"ng-anchor-in "+d,removeClass:"ng-anchor-out "+c,delay:!0});return d.$$willAnimate?
d:null}function H(){k.remove();e.removeClass("ng-animate-shim");g.removeClass("ng-animate-shim")}var k=I(G(e).cloneNode(!0)),q=C(k.attr("class")||"");e.addClass("ng-animate-shim");g.addClass("ng-animate-shim");k.addClass("ng-anchor");v.append(k);var t;c=function(){var c=a(k,{addClass:"ng-anchor-out",delay:!0,from:h(e)});return c.$$willAnimate?c:null}();if(!c&&(t=A(),!t))return H();var B=c||t;return{start:function(){function a(){c&&c.end()}var b,c=B.start();c.done(function(){c=null;if(!t&&(t=A()))return c=
t.start(),c.done(function(){c=null;H();b.complete()}),c;H();b.complete()});return b=new d({end:a,cancel:a})}}}function r(a,b,c,e){var g=u(a,Q),m=u(b,Q),k=[];s(e,function(a){(a=M(c,a.out,a["in"]))&&k.push(a)});if(g||m||0!==k.length)return{start:function(){function a(){s(b,function(a){a.end()})}var b=[];g&&b.push(g.start());m&&b.push(m.start());s(k,function(a){b.push(a.start())});var c=new d({end:a,cancel:a});d.all(b,function(a){c.complete(a)});return c}}}function u(c){var d=c.element,e=c.options||
{};c.structural&&(e.event=c.event,e.structural=!0,e.applyClassesEarly=!0,"leave"===c.event&&(e.onDone=e.domOperation));e.preparationClasses&&(e.event=ca(e.event,e.preparationClasses));c=a(d,e);return c.$$willAnimate?c:null}if(!g.animations&&!g.transitions)return Q;var D=A[0].body;c=G(e);var v=I(c.parentNode&&11===c.parentNode.nodeType||D.contains(c)?c:D);U(H);return function(a){return a.from&&a.to?r(a.from,a.to,a.classes,a.anchors):u(a)}}]}]).provider("$$animateJs",["$animateProvider",function(a){this.$get=
["$injector","$$AnimateRunner","$$jqLite",function(b,c,d){function e(c){c=ba(c)?c:c.split(" ");for(var d=[],e={},g=0;g<c.length;g++){var s=c[g],r=a.$$registeredAnimations[s];r&&!e[s]&&(d.push(b.get(r)),e[s]=!0)}return d}var g=U(d);return function(a,b,d,m){function r(){m.domOperation();g(a,m)}function D(a,b,d,e,f){switch(d){case "animate":b=[b,e.from,e.to,f];break;case "setClass":b=[b,z,K,f];break;case "addClass":b=[b,z,f];break;case "removeClass":b=[b,K,f];break;default:b=[b,f]}b.push(e);if(a=a.apply(a,
b))if(Ia(a.start)&&(a=a.start()),a instanceof c)a.done(f);else if(Ia(a))return a;return Q}function u(a,b,d,e,f){var g=[];s(e,function(e){var h=e[f];h&&g.push(function(){var e,f,g=!1,k=function(a){g||(g=!0,(f||Q)(a),e.complete(!a))};e=new c({end:function(){k()},cancel:function(){k(!0)}});f=D(h,a,b,d,function(a){k(!1===a)});return e})});return g}function G(a,b,d,e,f){var g=u(a,b,d,e,f);if(0===g.length){var h,k;"beforeSetClass"===f?(h=u(a,"removeClass",d,e,"beforeRemoveClass"),k=u(a,"addClass",d,e,"beforeAddClass")):
"setClass"===f&&(h=u(a,"removeClass",d,e,"removeClass"),k=u(a,"addClass",d,e,"addClass"));h&&(g=g.concat(h));k&&(g=g.concat(k))}if(0!==g.length)return function(a){var b=[];g.length&&s(g,function(a){b.push(a())});b.length?c.all(b,a):a();return function(a){s(b,function(b){a?b.cancel():b.end()})}}}var v=!1;3===arguments.length&&ra(d)&&(m=d,d=null);m=ka(m);d||(d=a.attr("class")||"",m.addClass&&(d+=" "+m.addClass),m.removeClass&&(d+=" "+m.removeClass));var z=m.addClass,K=m.removeClass,J=e(d),h,I;if(J.length){var N,
k;"leave"==b?(k="leave",N="afterLeave"):(k="before"+b.charAt(0).toUpperCase()+b.substr(1),N=b);"enter"!==b&&"move"!==b&&(h=G(a,b,m,J,k));I=G(a,b,m,J,N)}if(h||I){var q;return{$$willAnimate:!0,end:function(){q?q.end():(v=!0,r(),fa(a,m),q=new c,q.complete(!0));return q},start:function(){function b(c){v=!0;r();fa(a,m);q.complete(c)}if(q)return q;q=new c;var d,e=[];h&&e.push(function(a){d=h(a)});e.length?e.push(function(a){r();a(!0)}):r();I&&e.push(function(a){d=I(a)});q.setHost({end:function(){v||((d||
Q)(void 0),b(void 0))},cancel:function(){v||((d||Q)(!0),b(!0))}});c.chain(e,b);return q}}}}}]}]).provider("$$animateJsDriver",["$$animationProvider",function(a){a.drivers.push("$$animateJsDriver");this.$get=["$$animateJs","$$AnimateRunner",function(a,c){function d(c){return a(c.element,c.event,c.classes,c.options)}return function(a){if(a.from&&a.to){var b=d(a.from),r=d(a.to);if(b||r)return{start:function(){function a(){return function(){s(d,function(a){a.end()})}}var d=[];b&&d.push(b.start());r&&
d.push(r.start());c.all(d,function(a){e.complete(a)});var e=new c({end:a(),cancel:a()});return e}}}else return d(a)}}]}])})(window,window.angular);
//# sourceMappingURL=angular-animate.min.js.map
;
/**
 * State-based routing for AngularJS
 * @version v0.2.18
 * @link http://angular-ui.github.com/
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */
"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return R(new(R(function(){},{prototype:a})),b)}function e(a){return Q(arguments,function(b){b!==a&&Q(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var b=[];return Q(a,function(a,c){b.push(c)}),b}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l]&&i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return R({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e<c.length;e++){var f=c[e];if(a[f]!=b[f])return!1}return!0}function k(a,b){var c={};return Q(a,function(a){c[a]=b[a]}),c}function l(a){var b={},c=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));return Q(c,function(c){c in a&&(b[c]=a[c])}),b}function m(a){var b={},c=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));for(var d in a)-1==h(c,d)&&(b[d]=a[d]);return b}function n(a,b){var c=P(a),d=c?[]:{};return Q(a,function(a,e){b(a,e)&&(d[c?d.length:e]=a)}),d}function o(a,b){var c=P(a)?[]:{};return Q(a,function(a,d){c[d]=b(a,d)}),c}function p(a,b){var d=1,f=2,i={},j=[],k=i,l=R(a.when(i),{$$promises:i,$$values:i});this.study=function(i){function n(a,c){if(s[c]!==f){if(r.push(c),s[c]===d)throw r.splice(0,h(r,c)),new Error("Cyclic dependency: "+r.join(" -> "));if(s[c]=d,N(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);Q(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return O(a)&&a.then&&a.$$promises}if(!O(i))throw new Error("'invocables' must be an object");var p=g(i||{}),q=[],r=[],s={};return Q(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!L(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;Q(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!O(d))throw new Error("'locals' must be an object")}else d=k;if(f){if(!o(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=l;var n=a.defer(),r=n.promise,s=r.$$promises={},t=R({},d),u=1+q.length/3,v=!1;if(L(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,m(f.$$inheritedValues,p)),R(s,f.$$promises),f.$$values?(v=e(t,m(f.$$values,p)),r.$$inheritedValues=m(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=m(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function q(a,b,c){this.fromConfig=function(a,b,c){return L(a.template)?this.fromString(a.template,b):L(a.templateUrl)?this.fromUrl(a.templateUrl,b):L(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return M(a)?a(b):a},this.fromUrl=function(c,d){return M(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:"text/html"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function r(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\w+([-.]+\w+)*(?:\[\])?$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(p[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");return p[b]=new U.Param(b,c,d,e),p[b]}function g(a,b,c,d){var e=["",""],f=a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!b)return f;switch(c){case!1:e=["(",")"+(d?"?":"")];break;case!0:f=f.replace(/\/$/,""),e=["(?:/(",")|/)?"];break;default:e=["("+c+"|",")?"]}return f+e[0]+b+e[1]}function h(e,f){var g,h,i,j,k;return g=e[2]||e[3],k=b.params[g],i=a.substring(m,e.index),h=f?e[4]:e[4]||("*"==e[1]?".*":null),h&&(j=U.type(h)||d(U.type("string"),{pattern:new RegExp(h,b.caseInsensitive?"i":c)})),{id:g,regexp:h,segment:i,type:j,cfg:k}}b=R({params:{}},O(b)?b:{});var i,j=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,k=/([:]?)([\w\[\].-]+)|\{([\w\[\].-]+)(?:\:\s*((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l="^",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new U.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf("?")>=0));)s=f(r.id,r.type,r.cfg,"path"),l+=g(r.segment,s.type.pattern.source,s.squash,s.isOptional),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf("?");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,"search"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch="";l+=g(t)+(b.strict===!1?"/?":"")+"$",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?"i":c),this.prefix=n[0],this.$$paramNames=q}function s(a){R(this,a)}function t(){function a(a){return null!=a?a.toString().replace(/~/g,"~~").replace(/\//g,"~2F"):a}function e(a){return null!=a?a.toString().replace(/~2F/g,"/").replace(/~~/g,"~"):a}function f(){return{strict:p,caseInsensitive:m}}function i(a){return M(a)||P(a)&&M(a[a.length-1])}function j(){for(;w.length;){var a=w.shift();if(a.pattern)throw new Error("You cannot override a type's .pattern at runtime.");b.extend(u[a.name],l.invoke(a.def))}}function k(a){R(this,a||{})}U=this;var l,m=!1,p=!0,q=!1,u={},v=!0,w=[],x={string:{encode:a,decode:e,is:function(a){return null==a||!L(a)||"string"==typeof a},pattern:/[^\/]*/},"int":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return L(a)&&this.decode(a.toString())===a},pattern:/\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),("0"+(a.getMonth()+1)).slice(-2),("0"+a.getDate()).slice(-2)].join("-"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^\/]*/},any:{encode:b.identity,decode:b.identity,equals:b.equals,pattern:/.*/}};t.$$getDefaultValue=function(a){if(!i(a.value))return a.value;if(!l)throw new Error("Injectable functions cannot be called at configuration time");return l.invoke(a.value)},this.caseInsensitive=function(a){return L(a)&&(m=a),m},this.strictMode=function(a){return L(a)&&(p=a),p},this.defaultSquashPolicy=function(a){if(!L(a))return q;if(a!==!0&&a!==!1&&!N(a))throw new Error("Invalid squash policy: "+a+". Valid policies: false, true, arbitrary-string");return q=a,a},this.compile=function(a,b){return new r(a,R(f(),b))},this.isMatcher=function(a){if(!O(a))return!1;var b=!0;return Q(r.prototype,function(c,d){M(c)&&(b=b&&L(a[d])&&M(a[d]))}),b},this.type=function(a,b,c){if(!L(b))return u[a];if(u.hasOwnProperty(a))throw new Error("A type named '"+a+"' has already been defined.");return u[a]=new s(R({name:a},b)),c&&(w.push({name:a,def:c}),v||j()),this},Q(x,function(a,b){u[b]=new s(R({name:b},a))}),u=d(u,{}),this.$get=["$injector",function(a){return l=a,v=!1,j(),Q(x,function(a,b){u[b]||(u[b]=new s(a))}),this}],this.Param=function(a,d,e,f){function j(a){var b=O(a)?g(a):[],c=-1===h(b,"value")&&-1===h(b,"type")&&-1===h(b,"squash")&&-1===h(b,"array");return c&&(a={value:a}),a.$$fn=i(a.value)?a.value:function(){return a.value},a}function k(c,d,e){if(c.type&&d)throw new Error("Param '"+a+"' has two type configurations.");return d?d:c.type?b.isString(c.type)?u[c.type]:c.type instanceof s?c.type:new s(c.type):"config"===e?u.any:u.string}function m(){var b={array:"search"===f?"auto":!1},c=a.match(/\[\]$/)?{array:!0}:{};return R(b,c,e).array}function p(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!L(c)||null==c)return q;if(c===!0||N(c))return c;throw new Error("Invalid squash policy: '"+c+"'. Valid policies: false, true, or arbitrary string")}function r(a,b,d,e){var f,g,i=[{from:"",to:d||b?c:""},{from:null,to:d||b?c:""}];return f=P(a.replace)?a.replace:[],N(e)&&f.push({from:e,to:c}),g=o(f,function(a){return a.from}),n(i,function(a){return-1===h(g,a.from)}).concat(f)}function t(){if(!l)throw new Error("Injectable functions cannot be called at configuration time");var a=l.invoke(e.$$fn);if(null!==a&&a!==c&&!x.type.is(a))throw new Error("Default value ("+a+") for parameter '"+x.id+"' is not an instance of Type ("+x.type.name+")");return a}function v(a){function b(a){return function(b){return b.from===a}}function c(a){var c=o(n(x.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),L(a)?x.type.$normalize(a):t()}function w(){return"{Param:"+a+" "+d+" squash: '"+A+"' optional: "+z+"}"}var x=this;e=j(e),d=k(e,d,f);var y=m();d=y?d.$asArray(y,"search"===f):d,"string"!==d.name||y||"path"!==f||e.value!==c||(e.value="");var z=e.value!==c,A=p(e,z),B=r(e,y,z,A);R(this,{id:a,type:d,location:f,array:y,squash:A,replace:B,isOptional:z,value:v,dynamic:c,config:e,toString:w})},k.prototype={$$new:function(){return d(this,R(new k,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(k.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),Q(b,function(b){Q(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return Q(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return Q(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var d,e,f,g,h,i=this.$$keys();for(d=0;d<i.length&&(e=this[i[d]],f=a[i[d]],f!==c&&null!==f||!e.isOptional);d++){if(g=e.type.$normalize(f),!e.type.is(g))return!1;if(h=e.type.encode(g),b.isString(h)&&!e.type.pattern.exec(h))return!1}return!0},$$parent:c},this.ParamSet=k}function u(a,d){function e(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function f(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return L(d)?d:!0}function h(d,e,f,g,h){function m(a,b,c){return"/"===q?a:b?q.slice(0,-1)+a:c?q.slice(1)+a:a}function n(a){function b(a){var b=a(f,d);return b?(N(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){p&&d.url()===p;p=c;var e,g=j.length;for(e=0;g>e;e++)if(b(j[e]))return;k&&b(k)}}function o(){return i=i||e.$on("$locationChangeSuccess",n)}var p,q=g.baseHref(),r=d.url();return l||o(),{sync:function(){n()},listen:function(){return o()},update:function(a){return a?void(r=d.url()):void(d.url()!==r&&(d.url(r),d.replace()))},push:function(a,b,e){var f=a.format(b||{});null!==f&&b&&b["#"]&&(f+="#"+b["#"]),d.url(f),p=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled),g=g&&h.history;var i=c.format(e);if(f=f||{},g||null===i||(i="#"+a.hashPrefix()+i),null!==i&&e&&e["#"]&&(i+="#"+e["#"]),i=m(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?"/":"",k=d.port();return k=80===k||443===k?"":":"+k,[d.protocol(),"://",d.host(),k,j,i].join("")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!M(a))throw new Error("'rule' must be a function");return j.push(a),this},this.otherwise=function(a){if(N(a)){var b=a;a=function(){return b}}else if(!M(a))throw new Error("'rule' must be a function");return k=a,this},this.when=function(a,b){var c,h=N(b);if(N(a)&&(a=d.compile(a)),!h&&!M(b)&&!P(b))throw new Error("invalid 'handler' in when()");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=["$match",function(a){return c.format(a)}]),R(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:N(a.prefix)?a.prefix:""})},regex:function(a,b){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(c=b,b=["$match",function(a){return f(c,a)}]),R(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=["$location","$rootScope","$injector","$browser","$sniffer"]}function v(a,e){function f(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function m(a,b){if(!a)return c;var d=N(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error("No reference point given for path '"+e+"'");b=m(b);for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var l=z[e];return!l||!d&&(d||l!==a&&l.self!==a)?c:l}function n(a,b){A[a]||(A[a]=[]),A[a].push(b)}function p(a){for(var b=A[a]||[];b.length;)q(b.shift())}function q(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!N(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(z.hasOwnProperty(c))throw new Error("State '"+c+"' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):N(b.parent)?b.parent:O(b.parent)&&N(b.parent.name)?b.parent.name:"";if(e&&!z[e])return n(e,b.self);for(var f in C)M(C[f])&&(b[f]=C[f](b,C.$delegates[f]));return z[c]=b,!b[B]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){y.$current.navigable==b&&j(a,c)||y.transitionTo(b,a,{inherit:!0,location:!1})}]),p(c),b}function r(a){return a.indexOf("*")>-1}function s(a){for(var b=a.split("."),c=y.$current.name.split("."),d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return"**"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length?!1:c.join("")===b.join("")}function t(a,b){return N(a)&&!L(b)?C[a]:M(b)&&N(a)?(C[a]&&!C.$delegates[a]&&(C.$delegates[a]=C[a]),C[a]=b,this):this}function u(a,b){return O(a)?b=a:b.name=a,q(b),this}function v(a,e,f,h,l,n,p,q,t){function u(b,c,d,f){var g=a.$broadcast("$stateNotFound",b,c,d);if(g.defaultPrevented)return p.update(),D;if(!g.retry)return null;if(f.$retry)return p.update(),E;var h=y.transition=e.when(g.retry);return h.then(function(){return h!==y.transition?A:(b.options.$retry=!0,y.transitionTo(b.to,b.toParams,b.options))},function(){return D}),p.update(),h}function v(a,c,d,g,i,j){function m(){var c=[];return Q(a.views,function(d,e){var g=d.resolve&&d.resolve!==a.resolve?d.resolve:{};g.$template=[function(){return f.load(e,{view:d,locals:i.globals,params:n,notify:j.notify})||""}],c.push(l.resolve(g,i.globals,i.resolve,a).then(function(c){if(M(d.controllerProvider)||P(d.controllerProvider)){var f=b.extend({},g,i.globals);c.$$controller=h.invoke(d.controllerProvider,null,f)}else c.$$controller=d.controller;c.$$state=a,c.$$controllerAs=d.controllerAs,i[e]=c}))}),e.all(c).then(function(){return i.globals})}var n=d?c:k(a.params.$$keys(),c),o={$stateParams:n};i.resolve=l.resolve(a.resolve,o,i.resolve,a);var p=[i.resolve.then(function(a){i.globals=a})];return g&&p.push(g),e.all(p).then(m).then(function(a){return i})}var A=e.reject(new Error("transition superseded")),C=e.reject(new Error("transition prevented")),D=e.reject(new Error("transition aborted")),E=e.reject(new Error("transition failed"));return x.locals={resolve:null,globals:{$stateParams:{}}},y={params:{},current:x.self,$current:x,transition:null},y.reload=function(a){return y.transitionTo(y.current,n,{reload:a||!0,inherit:!1,notify:!0})},y.go=function(a,b,c){return y.transitionTo(a,b,R({inherit:!0,relative:y.$current},c))},y.transitionTo=function(b,c,f){c=c||{},f=R({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=y.$current,l=y.params,o=j.path,q=m(b,f.relative),r=c["#"];if(!L(q)){var s={to:b,toParams:c,options:f},t=u(s,j.self,l,f);if(t)return t;if(b=s.to,c=s.toParams,f=s.options,q=m(b,f.relative),!L(q)){if(!f.relative)throw new Error("No such state '"+b+"'");throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'")}}if(q[B])throw new Error("Cannot transition to abstract state '"+b+"'");if(f.inherit&&(c=i(n,c||{},y.$current,q)),!q.params.$$validates(c))return E;c=q.params.$$values(c),b=q;var z=b.path,D=0,F=z[D],G=x.locals,H=[];if(f.reload){if(N(f.reload)||O(f.reload)){if(O(f.reload)&&!f.reload.name)throw new Error("Invalid reload state object");var I=f.reload===!0?o[0]:m(f.reload);if(f.reload&&!I)throw new Error("No such reload state '"+(N(f.reload)?f.reload:f.reload.name)+"'");for(;F&&F===o[D]&&F!==I;)G=H[D]=F.locals,D++,F=z[D]}}else for(;F&&F===o[D]&&F.ownParams.$$equals(c,l);)G=H[D]=F.locals,D++,F=z[D];if(w(b,c,j,l,G,f))return r&&(c["#"]=r),y.params=c,S(y.params,n),S(k(b.params.$$keys(),n),b.locals.globals.$stateParams),f.location&&b.navigable&&b.navigable.url&&(p.push(b.navigable.url,c,{$$avoidResync:!0,replace:"replace"===f.location}),p.update(!0)),y.transition=null,e.when(y.current);if(c=k(b.params.$$keys(),c||{}),r&&(c["#"]=r),f.notify&&a.$broadcast("$stateChangeStart",b.self,c,j.self,l,f).defaultPrevented)return a.$broadcast("$stateChangeCancel",b.self,c,j.self,l),null==y.transition&&p.update(),C;for(var J=e.when(G),K=D;K<z.length;K++,F=z[K])G=H[K]=d(G),J=v(F,c,F===b,J,G,f);var M=y.transition=J.then(function(){var d,e,g;if(y.transition!==M)return A;for(d=o.length-1;d>=D;d--)g=o[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d<z.length;d++)e=z[d],e.locals=H[d],e.self.onEnter&&h.invoke(e.self.onEnter,e.self,e.locals.globals);return y.transition!==M?A:(y.$current=b,y.current=b.self,y.params=c,S(y.params,n),y.transition=null,f.location&&b.navigable&&p.push(b.navigable.url,b.navigable.locals.globals.$stateParams,{$$avoidResync:!0,replace:"replace"===f.location}),f.notify&&a.$broadcast("$stateChangeSuccess",b.self,c,j.self,l),p.update(!0),y.current)},function(d){return y.transition!==M?A:(y.transition=null,g=a.$broadcast("$stateChangeError",b.self,c,j.self,l,d),g.defaultPrevented||p.update(),e.reject(d))});return M},y.is=function(a,b,d){d=R({relative:y.$current},d||{});var e=m(a,d.relative);return L(e)?y.$current!==e?!1:b?j(e.params.$$values(b),n):!0:c},y.includes=function(a,b,d){if(d=R({relative:y.$current},d||{}),N(a)&&r(a)){if(!s(a))return!1;a=y.$current.name}var e=m(a,d.relative);return L(e)?L(y.$current.includes[e.name])?b?j(e.params.$$values(b),n,g(b)):!0:!1:c},y.href=function(a,b,d){d=R({lossy:!0,inherit:!0,absolute:!1,relative:y.$current},d||{});var e=m(a,d.relative);if(!L(e))return null;d.inherit&&(b=i(n,b||{},y.$current,e));var f=e&&d.lossy?e.navigable:e;return f&&f.url!==c&&null!==f.url?p.href(f.url,k(e.params.$$keys().concat("#"),b||{}),{absolute:d.absolute}):null},y.get=function(a,b){if(0===arguments.length)return o(g(z),function(a){return z[a].self});var c=m(a,b||y.$current);return c&&c.self?c.self:null},y}function w(a,b,c,d,e,f){function g(a,b,c){function d(b){return"search"!=a.params[b].location}var e=a.params.$$keys().filter(d),f=l.apply({},[a.params].concat(e)),g=new U.ParamSet(f);return g.$$equals(b,c)}return!f.reload&&a===c&&(e===c.locals||a.self.reloadOnSearch===!1&&g(c,d,b))?!0:void 0}var x,y,z={},A={},B="abstract",C={parent:function(a){if(L(a.parent)&&a.parent)return m(a.parent);var b=/^(.+)\.[^.]+$/.exec(a.name);return b?m(b[1]):x},data:function(a){return a.parent&&a.parent.data&&(a.data=a.self.data=d(a.parent.data,a.data)),a.data},url:function(a){var b=a.url,c={params:a.params||{}};if(N(b))return"^"==b.charAt(0)?e.compile(b.substring(1),c):(a.parent.navigable||x).url.concat(b,c);if(!b||e.isMatcher(b))return b;throw new Error("Invalid url '"+b+"' in state '"+a+"'")},navigable:function(a){return a.url?a:a.parent?a.parent.navigable:null},ownParams:function(a){var b=a.url&&a.url.params||new U.ParamSet;return Q(a.params||{},function(a,c){b[c]||(b[c]=new U.Param(c,null,a,"config"))}),b},params:function(a){var b=l(a.ownParams,a.ownParams.$$keys());return a.parent&&a.parent.params?R(a.parent.params.$$new(),b):new U.ParamSet},views:function(a){var b={};return Q(L(a.views)?a.views:{"":a},function(c,d){d.indexOf("@")<0&&(d+="@"+a.parent.name),b[d]=c}),b},path:function(a){return a.parent?a.parent.path.concat(a):[]},includes:function(a){var b=a.parent?R({},a.parent.includes):{};return b[a.name]=!0,b},$delegates:{}};x=q({name:"",url:"^",views:null,"abstract":!0}),x.navigable=null,this.decorator=t,this.state=u,this.$get=v,v.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$urlRouter","$location","$urlMatcherFactory"]}function w(){function a(a,b){return{load:function(a,c){var d,e={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return c=R(e,c),c.view&&(d=b.fromConfig(c.view,c.params,c.locals)),d}}}this.$get=a,a.$inject=["$rootScope","$templateFactory"]}function x(){var a=!1;this.useAnchorScroll=function(){a=!0},this.$get=["$anchorScroll","$timeout",function(b,c){return a?b:function(a){return c(function(){a[0].scrollIntoView()},0,!1)}}]}function y(a,c,d,e){function f(){return c.has?function(a){return c.has(a)?c.get(a):null}:function(a){try{return c.get(a)}catch(b){return null}}}function g(a,c){function d(a){return 1===V&&W>=4?!!j.enabled(a):1===V&&W>=2?!!j.enabled():!!i}var e={enter:function(a,b,c){b.after(a),c()},leave:function(a,b){a.remove(),b()}};if(a.noanimation)return e;if(j)return{enter:function(a,c,f){d(a)?b.version.minor>2?j.enter(a,null,c).then(f):j.enter(a,null,c,f):e.enter(a,c,f)},leave:function(a,c){d(a)?b.version.minor>2?j.leave(a).then(c):j.leave(a,c):e.leave(a,c)}};if(i){var f=i&&i(c,a);return{enter:function(a,b,c){f.enter(a,null,b),c()},leave:function(a,b){f.leave(a),b()}}}return e}var h=f(),i=h("$animator"),j=h("$animate"),k={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(c,f,h){return function(c,f,i){function j(){function a(){b&&b.remove(),c&&c.$destroy()}var b=l,c=n;c&&(c._willBeDestroyed=!0),m?(r.leave(m,function(){a(),l=null}),l=m):(a(),l=null),m=null,n=null}function k(g){var k,l=A(c,i,f,e),s=l&&a.$current&&a.$current.locals[l];if((g||s!==o)&&!c._willBeDestroyed){k=c.$new(),o=a.$current.locals[l],k.$emit("$viewContentLoading",l);var t=h(k,function(a){r.enter(a,f,function(){n&&n.$emit("$viewContentAnimationEnded"),(b.isDefined(q)&&!q||c.$eval(q))&&d(a)}),j()});m=t,n=k,n.$emit("$viewContentLoaded",l),n.$eval(p)}}var l,m,n,o,p=i.onload||"",q=i.autoscroll,r=g(i,c);c.$on("$stateChangeSuccess",function(){k(!1)}),k(!0)}}};return k}function z(a,b,c,d){return{restrict:"ECA",priority:-400,compile:function(e){var f=e.html();return function(e,g,h){var i=c.$current,j=A(e,h,g,d),k=i&&i.locals[j];if(k){g.data("$uiView",{name:j,state:k.$$state}),g.html(k.$template?k.$template:f);var l=a(g.contents());if(k.$$controller){k.$scope=e,k.$element=g;var m=b(k.$$controller,k);k.$$controllerAs&&(e[k.$$controllerAs]=m),g.data("$ngControllerController",m),g.children().data("$ngControllerController",m)}l(e)}}}}}function A(a,b,c,d){var e=d(b.uiView||b.name||"")(a),f=c.inheritedData("$uiView");return e.indexOf("@")>=0?e:e+"@"+(f?f.state.name:"")}function B(a,b){var c,d=a.match(/^\s*({[^}]*})\s*$/);if(d&&(a=b+"("+d[1]+")"),c=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!c||4!==c.length)throw new Error("Invalid state ref '"+a+"'");return{state:c[1],paramExpr:c[3]||null}}function C(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function D(a){var b="[object SVGAnimatedString]"===Object.prototype.toString.call(a.prop("href")),c="FORM"===a[0].nodeName;return{attr:c?"action":b?"xlink:href":"href",isAnchor:"A"===a.prop("tagName").toUpperCase(),clickable:!c}}function E(a,b,c,d,e){return function(f){var g=f.which||f.button,h=e();if(!(g>1||f.ctrlKey||f.metaKey||f.shiftKey||a.attr("target"))){var i=c(function(){b.go(h.state,h.params,h.options)});f.preventDefault();var j=d.isAnchor&&!h.href?1:0;f.preventDefault=function(){j--<=0&&c.cancel(i)}}}}function F(a,b){return{relative:C(a)||b.$current,inherit:!0}}function G(a,c){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(d,e,f,g){var h=B(f.uiSref,a.current.name),i={state:h.state,href:null,params:null},j=D(e),k=g[1]||g[0];i.options=R(F(e,a),f.uiSrefOpts?d.$eval(f.uiSrefOpts):{});var l=function(c){c&&(i.params=b.copy(c)),i.href=a.href(h.state,i.params,i.options),k&&k.$$addStateInfo(h.state,i.params),null!==i.href&&f.$set(j.attr,i.href)};h.paramExpr&&(d.$watch(h.paramExpr,function(a){a!==i.params&&l(a)},!0),i.params=b.copy(d.$eval(h.paramExpr))),l(),j.clickable&&e.bind("click",E(e,a,c,j,function(){return i}))}}}function H(a,b){return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(c,d,e,f){function g(b){l.state=b[0],l.params=b[1],l.options=b[2],l.href=a.href(l.state,l.params,l.options),i&&i.$$addStateInfo(l.state,l.params),l.href&&e.$set(h.attr,l.href)}var h=D(d),i=f[1]||f[0],j=[e.uiState,e.uiStateParams||null,e.uiStateOpts||null],k="["+j.map(function(a){return a||"null"}).join(", ")+"]",l={state:null,params:null,options:null,href:null};c.$watch(k,g,!0),g(c.$eval(k)),h.clickable&&d.bind("click",E(d,a,b,h,function(){return l}))}}}function I(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs","$timeout",function(b,d,e,f){function g(b,c,e){var f=a.get(b,C(d)),g=h(b,c);p.push({state:f||{name:b},params:c,hash:g}),q[g]=e}function h(a,c){if(!N(a))throw new Error("state should be a string");return O(c)?a+T(c):(c=b.$eval(c),O(c)?a+T(c):a)}function i(){for(var a=0;a<p.length;a++)l(p[a].state,p[a].params)?j(d,q[p[a].hash]):k(d,q[p[a].hash]),m(p[a].state,p[a].params)?j(d,n):k(d,n)}function j(a,b){f(function(){a.addClass(b)})}function k(a,b){a.removeClass(b)}function l(b,c){return a.includes(b.name,c)}function m(b,c){return a.is(b.name,c)}var n,o,p=[],q={};n=c(e.uiSrefActiveEq||"",!1)(b);try{o=b.$eval(e.uiSrefActive)}catch(r){}o=o||c(e.uiSrefActive||"",!1)(b),O(o)&&Q(o,function(c,d){if(N(c)){var e=B(c,a.current.name);g(e.state,b.$eval(e.paramExpr),d)}}),this.$$addStateInfo=function(a,b){O(o)&&p.length>0||(g(a,b,o),i())},b.$on("$stateChangeSuccess",i),i()}]}}function J(a){var b=function(b,c){return a.is(b,c)};return b.$stateful=!0,b}function K(a){var b=function(b,c,d){return a.includes(b,c,d)};return b.$stateful=!0,b}var L=b.isDefined,M=b.isFunction,N=b.isString,O=b.isObject,P=b.isArray,Q=b.forEach,R=b.extend,S=b.copy,T=b.toJson;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),p.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",p),q.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",q);var U;r.prototype.concat=function(a,b){var c={caseInsensitive:U.caseInsensitive(),strict:U.strictMode(),squash:U.defaultSquashPolicy()};return new r(this.sourcePath+a+this.sourceSearch,R(c,b),this)},r.prototype.toString=function(){return this.source},r.prototype.exec=function(a,b){function c(a){function b(a){return a.split("").reverse().join("")}function c(a){return a.replace(/\\-/g,"-")}var d=b(a).split(/-(?!\\)/),e=o(d,b);return o(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");var l,m;for(e=0;j>e;e++){for(g=h[e],l=this.params[g],m=d[e+1],f=0;f<l.replace.length;f++)l.replace[f].from===m&&(m=l.replace[f].to);m&&l.array===!0&&(m=c(m)),L(m)&&(m=l.type.decode(m)),k[g]=l.value(m)}for(;i>e;e++){for(g=h[e],k[g]=this.params[g].value(b[g]),l=this.params[g],m=b[g],f=0;f<l.replace.length;f++)l.replace[f].from===m&&(m=l.replace[f].to);L(m)&&(m=l.type.decode(m)),k[g]=l.value(m)}return k},r.prototype.parameters=function(a){return L(a)?this.params[a]||null:this.$$paramNames},r.prototype.validates=function(a){return this.params.$$validates(a)},r.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return"%5C%"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],n=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),n),q=p?m.squash:!1,r=m.type.encode(n);if(k){var s=c[f+1],t=f+1===h;if(q===!1)null!=r&&(j+=P(r)?o(r,b).join("-"):encodeURIComponent(r)),j+=s;else if(q===!0){var u=j.match(/\/$/)?/\/?(.*)/:/(.*)/;j+=s.match(u)[1]}else N(q)&&(j+=q+s);t&&m.squash===!0&&"/"===j.slice(-1)&&(j=j.slice(0,-1))}else{if(null==r||p&&q!==!1)continue;if(P(r)||(r=[r]),0===r.length)continue;r=o(r,encodeURIComponent).join("&"+l+"="),j+=(g?"&":"?")+(l+"="+r),g=!0}}return j},s.prototype.is=function(a,b){return!0},s.prototype.encode=function(a,b){return a},s.prototype.decode=function(a,b){return a},s.prototype.equals=function(a,b){return a==b},s.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},s.prototype.pattern=/.*/,s.prototype.toString=function(){return"{Type:"+this.name+"}"},s.prototype.$normalize=function(a){return this.is(a)?a:this.decode(a)},s.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return P(a)?a:L(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return"auto"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){if(P(c)&&0===c.length)return c;c=e(c);var d=o(c,a);return b===!0?0===n(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g<d.length;g++)if(!a(d[g],f[g]))return!1;return!0}}this.encode=h(d(a,"encode")),this.decode=h(d(a,"decode")),this.is=h(d(a,"is"),!0),this.equals=i(d(a,"equals")),this.pattern=a.pattern,this.$normalize=h(d(a,"$normalize")),this.name=a.name,this.$arrayMode=b}if(!a)return this;if("auto"===a&&!b)throw new Error("'auto' array mode is for query parameters only");return new d(this,a)},b.module("ui.router.util").provider("$urlMatcherFactory",t),b.module("ui.router.util").run(["$urlMatcherFactory",function(a){}]),u.$inject=["$locationProvider","$urlMatcherFactoryProvider"],b.module("ui.router.router").provider("$urlRouter",u),v.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider"],b.module("ui.router.state").factory("$stateParams",function(){return{}}).provider("$state",v),w.$inject=[],b.module("ui.router.state").provider("$view",w),b.module("ui.router.state").provider("$uiViewScroll",x);var V=b.version.major,W=b.version.minor;y.$inject=["$state","$injector","$uiViewScroll","$interpolate"],z.$inject=["$compile","$controller","$state","$interpolate"],b.module("ui.router.state").directive("uiView",y),b.module("ui.router.state").directive("uiView",z),G.$inject=["$state","$timeout"],H.$inject=["$state","$timeout"],I.$inject=["$state","$stateParams","$interpolate"],b.module("ui.router.state").directive("uiSref",G).directive("uiSrefActive",I).directive("uiSrefActiveEq",I).directive("uiState",H),
J.$inject=["$state"],K.$inject=["$state"],b.module("ui.router.state").filter("isState",J).filter("includedByState",K)}(window,window.angular);;
"use strict";angular.module("oitozero.ngSweetAlert",[]).factory("SweetAlert",["$rootScope",function($rootScope){var swal=window.swal,self={swal:function(arg1,arg2,arg3){$rootScope.$evalAsync(function(){"function"==typeof arg2?swal(arg1,function(isConfirm){$rootScope.$evalAsync(function(){arg2(isConfirm)})},arg3):swal(arg1,arg2,arg3)})},success:function(title,message){$rootScope.$evalAsync(function(){swal(title,message,"success")})},error:function(title,message){$rootScope.$evalAsync(function(){swal(title,message,"error")})},warning:function(title,message){$rootScope.$evalAsync(function(){swal(title,message,"warning")})},info:function(title,message){$rootScope.$evalAsync(function(){swal(title,message,"info")})}};return self}]);;
/*
 * angular-ui-bootstrap
 * http://angular-ui.github.io/bootstrap/

 * Version: 1.2.1 - 2016-02-27
 * License: MIT
 */angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.isClass","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.debounce","ui.bootstrap.dropdown","ui.bootstrap.stackedMap","ui.bootstrap.modal","ui.bootstrap.paging","ui.bootstrap.pager","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["uib/template/accordion/accordion-group.html","uib/template/accordion/accordion.html","uib/template/alert/alert.html","uib/template/carousel/carousel.html","uib/template/carousel/slide.html","uib/template/datepicker/datepicker.html","uib/template/datepicker/day.html","uib/template/datepicker/month.html","uib/template/datepicker/popup.html","uib/template/datepicker/year.html","uib/template/modal/backdrop.html","uib/template/modal/window.html","uib/template/pager/pager.html","uib/template/pagination/pagination.html","uib/template/tooltip/tooltip-html-popup.html","uib/template/tooltip/tooltip-popup.html","uib/template/tooltip/tooltip-template-popup.html","uib/template/popover/popover-html.html","uib/template/popover/popover-template.html","uib/template/popover/popover.html","uib/template/progressbar/bar.html","uib/template/progressbar/progress.html","uib/template/progressbar/progressbar.html","uib/template/rating/rating.html","uib/template/tabs/tab.html","uib/template/tabs/tabset.html","uib/template/timepicker/timepicker.html","uib/template/typeahead/typeahead-match.html","uib/template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("uibCollapse",["$animate","$q","$parse","$injector",function(a,b,c,d){var e=d.has("$animateCss")?d.get("$animateCss"):null;return{link:function(d,f,g){function h(){f.hasClass("collapse")&&f.hasClass("in")||b.resolve(l(d)).then(function(){f.removeClass("collapse").addClass("collapsing").attr("aria-expanded",!0).attr("aria-hidden",!1),e?e(f,{addClass:"in",easing:"ease",to:{height:f[0].scrollHeight+"px"}}).start()["finally"](i):a.addClass(f,"in",{to:{height:f[0].scrollHeight+"px"}}).then(i)})}function i(){f.removeClass("collapsing").addClass("collapse").css({height:"auto"}),m(d)}function j(){return f.hasClass("collapse")||f.hasClass("in")?void b.resolve(n(d)).then(function(){f.css({height:f[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing").attr("aria-expanded",!1).attr("aria-hidden",!0),e?e(f,{removeClass:"in",to:{height:"0"}}).start()["finally"](k):a.removeClass(f,"in",{to:{height:"0"}}).then(k)}):k()}function k(){f.css({height:"0"}),f.removeClass("collapsing").addClass("collapse"),o(d)}var l=c(g.expanding),m=c(g.expanded),n=c(g.collapsing),o=c(g.collapsed);d.$eval(g.uibCollapse)||f.addClass("in").addClass("collapse").attr("aria-expanded",!0).attr("aria-hidden",!1).css({height:"auto"}),d.$watch(g.uibCollapse,function(a){a?j():h()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("uibAccordionConfig",{closeOthers:!0}).controller("UibAccordionController",["$scope","$attrs","uibAccordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("uibAccordion",function(){return{controller:"UibAccordionController",controllerAs:"accordion",transclude:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/accordion/accordion.html"}}}).directive("uibAccordionGroup",function(){return{require:"^uibAccordion",transclude:!0,replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/accordion/accordion-group.html"},scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.openClass=c.openClass||"panel-open",a.panelClass=c.panelClass||"panel-default",a.$watch("isOpen",function(c){b.toggleClass(a.openClass,!!c),c&&d.closeOthers(a)}),a.toggleOpen=function(b){a.isDisabled||b&&32!==b.which||(a.isOpen=!a.isOpen)};var e="accordiongroup-"+a.$id+"-"+Math.floor(1e4*Math.random());a.headingId=e+"-tab",a.panelId=e+"-panel"}}}).directive("uibAccordionHeading",function(){return{transclude:!0,template:"",replace:!0,require:"^uibAccordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("uibAccordionTransclude",function(){return{require:"^uibAccordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.uibAccordionTransclude]},function(a){if(a){var c=angular.element(b[0].querySelector("[uib-accordion-header]"));c.html(""),c.append(a)}})}}}),angular.module("ui.bootstrap.alert",[]).controller("UibAlertController",["$scope","$attrs","$interpolate","$timeout",function(a,b,c,d){a.closeable=!!b.close;var e=angular.isDefined(b.dismissOnTimeout)?c(b.dismissOnTimeout)(a.$parent):null;e&&d(function(){a.close()},parseInt(e,10))}]).directive("uibAlert",function(){return{controller:"UibAlertController",controllerAs:"alert",templateUrl:function(a,b){return b.templateUrl||"uib/template/alert/alert.html"},transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}),angular.module("ui.bootstrap.buttons",[]).constant("uibButtonConfig",{activeClass:"active",toggleEvent:"click"}).controller("UibButtonsController",["uibButtonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("uibBtnRadio",["$parse",function(a){return{require:["uibBtnRadio","ngModel"],controller:"UibButtonsController",controllerAs:"buttons",link:function(b,c,d,e){var f=e[0],g=e[1],h=a(d.uibUncheckable);c.find("input").css({display:"none"}),g.$render=function(){c.toggleClass(f.activeClass,angular.equals(g.$modelValue,b.$eval(d.uibBtnRadio)))},c.on(f.toggleEvent,function(){if(!d.disabled){var a=c.hasClass(f.activeClass);(!a||angular.isDefined(d.uncheckable))&&b.$apply(function(){g.$setViewValue(a?null:b.$eval(d.uibBtnRadio)),g.$render()})}}),d.uibUncheckable&&b.$watch(h,function(a){d.$set("uncheckable",a?"":void 0)})}}}]).directive("uibBtnCheckbox",function(){return{require:["uibBtnCheckbox","ngModel"],controller:"UibButtonsController",controllerAs:"button",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){return angular.isDefined(b)?a.$eval(b):c}var h=d[0],i=d[1];b.find("input").css({display:"none"}),i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.on(h.toggleEvent,function(){c.disabled||a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("UibCarouselController",["$scope","$element","$interval","$timeout","$animate",function(a,b,c,d,e){function f(){for(;t.length;)t.shift()}function g(a){for(var b=0;b<q.length;b++)q[b].slide.active=b===a}function h(c,d,i){if(!u){if(angular.extend(c,{direction:i}),angular.extend(q[s].slide||{},{direction:i}),e.enabled(b)&&!a.$currentTransition&&q[d].element&&p.slides.length>1){q[d].element.data(r,c.direction);var j=p.getCurrentIndex();angular.isNumber(j)&&q[j].element&&q[j].element.data(r,c.direction),a.$currentTransition=!0,e.on("addClass",q[d].element,function(b,c){if("close"===c&&(a.$currentTransition=null,e.off("addClass",b),t.length)){var d=t.pop().slide,g=d.index,i=g>p.getCurrentIndex()?"next":"prev";f(),h(d,g,i)}})}a.active=c.index,s=c.index,g(d),l()}}function i(a){for(var b=0;b<q.length;b++)if(q[b].slide===a)return b}function j(){n&&(c.cancel(n),n=null)}function k(b){b.length||(a.$currentTransition=null,f())}function l(){j();var b=+a.interval;!isNaN(b)&&b>0&&(n=c(m,b))}function m(){var b=+a.interval;o&&!isNaN(b)&&b>0&&q.length?a.next():a.pause()}var n,o,p=this,q=p.slides=a.slides=[],r="uib-slideDirection",s=a.active,t=[],u=!1;p.addSlide=function(b,c){q.push({slide:b,element:c}),q.sort(function(a,b){return+a.slide.index>+b.slide.index}),(b.index===a.active||1===q.length&&!angular.isNumber(a.active))&&(a.$currentTransition&&(a.$currentTransition=null),s=b.index,a.active=b.index,g(s),p.select(q[i(b)]),1===q.length&&a.play())},p.getCurrentIndex=function(){for(var a=0;a<q.length;a++)if(q[a].slide.index===s)return a},p.next=a.next=function(){var b=(p.getCurrentIndex()+1)%q.length;return 0===b&&a.noWrap()?void a.pause():p.select(q[b],"next")},p.prev=a.prev=function(){var b=p.getCurrentIndex()-1<0?q.length-1:p.getCurrentIndex()-1;return a.noWrap()&&b===q.length-1?void a.pause():p.select(q[b],"prev")},p.removeSlide=function(b){var c=i(b),d=t.indexOf(q[c]);-1!==d&&t.splice(d,1),q.splice(c,1),q.length>0&&s===c?c>=q.length?(s=q.length-1,a.active=s,g(s),p.select(q[q.length-1])):(s=c,a.active=s,g(s),p.select(q[c])):s>c&&(s--,a.active=s),0===q.length&&(s=null,a.active=null,f())},p.select=a.select=function(b,c){var d=i(b.slide);void 0===c&&(c=d>p.getCurrentIndex()?"next":"prev"),b.slide.index===s||a.$currentTransition?b&&b.slide.index!==s&&a.$currentTransition&&t.push(q[d]):h(b.slide,d,c)},a.indexOfSlide=function(a){return+a.slide.index},a.isActive=function(b){return a.active===b.slide.index},a.pause=function(){a.noPause||(o=!1,j())},a.play=function(){o||(o=!0,l())},a.$on("$destroy",function(){u=!0,j()}),a.$watch("noTransition",function(a){e.enabled(b,!a)}),a.$watch("interval",l),a.$watchCollection("slides",k),a.$watch("active",function(a){if(angular.isNumber(a)&&s!==a){for(var b=0;b<q.length;b++)if(q[b].slide.index===a){a=b;break}var c=q[a];c&&(s=a,g(a),p.select(q[a]))}})}]).directive("uibCarousel",function(){return{transclude:!0,replace:!0,controller:"UibCarouselController",controllerAs:"carousel",templateUrl:function(a,b){return b.templateUrl||"uib/template/carousel/carousel.html"},scope:{active:"=",interval:"=",noTransition:"=",noPause:"=",noWrap:"&"}}}).directive("uibSlide",function(){return{require:"^uibCarousel",transclude:!0,replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/carousel/slide.html"},scope:{actual:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)})}}}).animation(".item",["$animateCss",function(a){function b(a,b,c){a.removeClass(b),c&&c()}var c="uib-slideDirection";return{beforeAddClass:function(d,e,f){if("active"===e){var g=!1,h=d.data(c),i="next"===h?"left":"right",j=b.bind(this,d,i+" "+h,f);return d.addClass(h),a(d,{addClass:i}).start().done(j),function(){g=!0}}f()},beforeRemoveClass:function(d,e,f){if("active"===e){var g=!1,h=d.data(c),i="next"===h?"left":"right",j=b.bind(this,d,i,f);return a(d,{addClass:i}).start().done(j),function(){g=!0}}f()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("uibDateParser",["$log","$locale","dateFilter","orderByFilter",function(a,b,c,d){function e(a,b){var c=[],e=a.split(""),f=a.indexOf("'");if(f>-1){var g=!1;a=a.split("");for(var h=f;h<a.length;h++)g?("'"===a[h]&&(h+1<a.length&&"'"===a[h+1]?(a[h+1]="$",e[h+1]=""):(e[h]="",g=!1)),a[h]="$"):"'"===a[h]&&(a[h]="$",e[h]="",g=!0);a=a.join("")}return angular.forEach(n,function(d){var f=a.indexOf(d.key);if(f>-1){a=a.split(""),e[f]="("+d.regex+")",a[f]="$";for(var g=f+1,h=f+d.key.length;h>g;g++)e[g]="",a[g]="$";a=a.join(""),c.push({index:f,key:d.key,apply:d[b],matcher:d.regex})}}),{regex:new RegExp("^"+e.join("")+"$"),map:d(c,"index")}}function f(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}function g(a){return parseInt(a,10)}function h(a,b){return a&&b?l(a,b):a}function i(a,b){return a&&b?l(a,b,!0):a}function j(a,b){var c=Date.parse("Jan 01, 1970 00:00:00 "+a)/6e4;return isNaN(c)?b:c}function k(a,b){return a=new Date(a.getTime()),a.setMinutes(a.getMinutes()+b),a}function l(a,b,c){c=c?-1:1;var d=j(b,a.getTimezoneOffset());return k(a,c*(d-a.getTimezoneOffset()))}var m,n,o=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.init=function(){m=b.id,this.parsers={},this.formatters={},n=[{key:"yyyy",regex:"\\d{4}",apply:function(a){this.year=+a},formatter:function(a){var b=new Date;return b.setFullYear(Math.abs(a.getFullYear())),c(b,"yyyy")}},{key:"yy",regex:"\\d{2}",apply:function(a){this.year=+a+2e3},formatter:function(a){var b=new Date;return b.setFullYear(Math.abs(a.getFullYear())),c(b,"yy")}},{key:"y",regex:"\\d{1,4}",apply:function(a){this.year=+a},formatter:function(a){var b=new Date;return b.setFullYear(Math.abs(a.getFullYear())),c(b,"y")}},{key:"M!",regex:"0?[1-9]|1[0-2]",apply:function(a){this.month=a-1},formatter:function(a){var b=a.getMonth();return/^[0-9]$/.test(b)?c(a,"MM"):c(a,"M")}},{key:"MMMM",regex:b.DATETIME_FORMATS.MONTH.join("|"),apply:function(a){this.month=b.DATETIME_FORMATS.MONTH.indexOf(a)},formatter:function(a){return c(a,"MMMM")}},{key:"MMM",regex:b.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(a){this.month=b.DATETIME_FORMATS.SHORTMONTH.indexOf(a)},formatter:function(a){return c(a,"MMM")}},{key:"MM",regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1},formatter:function(a){return c(a,"MM")}},{key:"M",regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1},formatter:function(a){return c(a,"M")}},{key:"d!",regex:"[0-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a},formatter:function(a){var b=a.getDate();return/^[1-9]$/.test(b)?c(a,"dd"):c(a,"d")}},{key:"dd",regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a},formatter:function(a){return c(a,"dd")}},{key:"d",regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a},formatter:function(a){return c(a,"d")}},{key:"EEEE",regex:b.DATETIME_FORMATS.DAY.join("|"),formatter:function(a){return c(a,"EEEE")}},{key:"EEE",regex:b.DATETIME_FORMATS.SHORTDAY.join("|"),formatter:function(a){return c(a,"EEE")}},{key:"HH",regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"HH")}},{key:"hh",regex:"0[0-9]|1[0-2]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"hh")}},{key:"H",regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"H")}},{key:"h",regex:"[0-9]|1[0-2]",apply:function(a){this.hours=+a},formatter:function(a){return c(a,"h")}},{key:"mm",regex:"[0-5][0-9]",apply:function(a){this.minutes=+a},formatter:function(a){return c(a,"mm")}},{key:"m",regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a},formatter:function(a){return c(a,"m")}},{key:"sss",regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a},formatter:function(a){return c(a,"sss")}},{key:"ss",regex:"[0-5][0-9]",apply:function(a){this.seconds=+a},formatter:function(a){return c(a,"ss")}},{key:"s",regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a},formatter:function(a){return c(a,"s")}},{key:"a",regex:b.DATETIME_FORMATS.AMPMS.join("|"),apply:function(a){12===this.hours&&(this.hours=0),"PM"===a&&(this.hours+=12)},formatter:function(a){return c(a,"a")}},{key:"Z",regex:"[+-]\\d{4}",apply:function(a){var b=a.match(/([+-])(\d{2})(\d{2})/),c=b[1],d=b[2],e=b[3];this.hours+=g(c+d),this.minutes+=g(c+e)},formatter:function(a){return c(a,"Z")}},{key:"ww",regex:"[0-4][0-9]|5[0-3]",formatter:function(a){return c(a,"ww")}},{key:"w",regex:"[0-9]|[1-4][0-9]|5[0-3]",formatter:function(a){return c(a,"w")}},{key:"GGGG",regex:b.DATETIME_FORMATS.ERANAMES.join("|").replace(/\s/g,"\\s"),formatter:function(a){return c(a,"GGGG")}},{key:"GGG",regex:b.DATETIME_FORMATS.ERAS.join("|"),formatter:function(a){return c(a,"GGG")}},{key:"GG",regex:b.DATETIME_FORMATS.ERAS.join("|"),formatter:function(a){return c(a,"GG")}},{key:"G",regex:b.DATETIME_FORMATS.ERAS.join("|"),formatter:function(a){return c(a,"G")}}]},this.init(),this.filter=function(a,c){if(!angular.isDate(a)||isNaN(a)||!c)return"";c=b.DATETIME_FORMATS[c]||c,b.id!==m&&this.init(),this.formatters[c]||(this.formatters[c]=e(c,"formatter"));var d=this.formatters[c],f=d.map,g=c;return f.reduce(function(b,c,d){var e=g.match(new RegExp("(.*)"+c.key));e&&angular.isString(e[1])&&(b+=e[1],g=g.replace(e[1]+c.key,""));var h=d===f.length-1?g:"";return c.apply?b+c.apply.call(null,a)+h:b+h},"")},this.parse=function(c,d,g){if(!angular.isString(c)||!d)return c;d=b.DATETIME_FORMATS[d]||d,d=d.replace(o,"\\$&"),b.id!==m&&this.init(),this.parsers[d]||(this.parsers[d]=e(d,"apply"));var h=this.parsers[d],i=h.regex,j=h.map,k=c.match(i),l=!1;if(k&&k.length){var n,p;angular.isDate(g)&&!isNaN(g.getTime())?n={year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(),milliseconds:g.getMilliseconds()}:(g&&a.warn("dateparser:","baseDate is not a valid date"),n={year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0});for(var q=1,r=k.length;r>q;q++){var s=j[q-1];"Z"===s.matcher&&(l=!0),s.apply&&s.apply.call(n,k[q])}var t=l?Date.prototype.setUTCFullYear:Date.prototype.setFullYear,u=l?Date.prototype.setUTCHours:Date.prototype.setHours;return f(n.year,n.month,n.date)&&(!angular.isDate(g)||isNaN(g.getTime())||l?(p=new Date(0),t.call(p,n.year,n.month,n.date),u.call(p,n.hours||0,n.minutes||0,n.seconds||0,n.milliseconds||0)):(p=new Date(g),t.call(p,n.year,n.month,n.date),u.call(p,n.hours,n.minutes,n.seconds,n.milliseconds))),p}},this.toTimezone=h,this.fromTimezone=i,this.timezoneToOffset=j,this.addDateMinutes=k,this.convertTimezoneToLocal=l}]),angular.module("ui.bootstrap.isClass",[]).directive("uibIsClass",["$animate",function(a){var b=/^\s*([\s\S]+?)\s+on\s+([\s\S]+?)\s*$/,c=/^\s*([\s\S]+?)\s+for\s+([\s\S]+?)\s*$/;return{restrict:"A",compile:function(d,e){function f(a,b,c){i.push(a),j.push({scope:a,element:b}),o.forEach(function(b,c){g(b,a)}),a.$on("$destroy",h)}function g(b,d){var e=b.match(c),f=d.$eval(e[1]),g=e[2],h=k[b];if(!h){var i=function(b){var c=null;j.some(function(a){var d=a.scope.$eval(m);return d===b?(c=a,!0):void 0}),h.lastActivated!==c&&(h.lastActivated&&a.removeClass(h.lastActivated.element,f),c&&a.addClass(c.element,f),h.lastActivated=c)};k[b]=h={lastActivated:null,scope:d,watchFn:i,compareWithExp:g,watcher:d.$watch(g,i)}}h.watchFn(d.$eval(g))}function h(a){var b=a.targetScope,c=i.indexOf(b);if(i.splice(c,1),j.splice(c,1),i.length){var d=i[0];angular.forEach(k,function(a){a.scope===b&&(a.watcher=d.$watch(a.compareWithExp,a.watchFn),a.scope=d)})}else k={}}var i=[],j=[],k={},l=e.uibIsClass.match(b),m=l[2],n=l[1],o=n.split(",");return f}}}]),angular.module("ui.bootstrap.position",[]).factory("$uibPosition",["$document","$window",function(a,b){var c,d={normal:/(auto|scroll)/,hidden:/(auto|scroll|hidden)/},e={auto:/\s?auto?\s?/i,primary:/^(top|bottom|left|right)$/,secondary:/^(top|bottom|left|right|center)$/,vertical:/^(top|bottom)$/};return{getRawNode:function(a){return a.nodeName?a:a[0]||a},parseStyle:function(a){return a=parseFloat(a),isFinite(a)?a:0},offsetParent:function(c){function d(a){return"static"===(b.getComputedStyle(a).position||"static")}c=this.getRawNode(c);for(var e=c.offsetParent||a[0].documentElement;e&&e!==a[0].documentElement&&d(e);)e=e.offsetParent;return e||a[0].documentElement},scrollbarWidth:function(){if(angular.isUndefined(c)){var b=angular.element('<div class="uib-position-scrollbar-measure"></div>');a.find("body").append(b),c=b[0].offsetWidth-b[0].clientWidth,c=isFinite(c)?c:0,b.remove()}return c},isScrollable:function(a,c){a=this.getRawNode(a);var e=c?d.hidden:d.normal,f=b.getComputedStyle(a);return e.test(f.overflow+f.overflowY+f.overflowX)},scrollParent:function(c,e){c=this.getRawNode(c);var f=e?d.hidden:d.normal,g=a[0].documentElement,h=b.getComputedStyle(c),i="absolute"===h.position,j=c.parentElement||g;if(j===g||"fixed"===h.position)return g;for(;j.parentElement&&j!==g;){var k=b.getComputedStyle(j);if(i&&"static"!==k.position&&(i=!1),!i&&f.test(k.overflow+k.overflowY+k.overflowX))break;j=j.parentElement}return j},position:function(c,d){c=this.getRawNode(c);var e=this.offset(c);if(d){var f=b.getComputedStyle(c);e.top-=this.parseStyle(f.marginTop),e.left-=this.parseStyle(f.marginLeft)}var g=this.offsetParent(c),h={top:0,left:0};return g!==a[0].documentElement&&(h=this.offset(g),h.top+=g.clientTop-g.scrollTop,h.left+=g.clientLeft-g.scrollLeft),{width:Math.round(angular.isNumber(e.width)?e.width:c.offsetWidth),height:Math.round(angular.isNumber(e.height)?e.height:c.offsetHeight),top:Math.round(e.top-h.top),left:Math.round(e.left-h.left)}},offset:function(c){c=this.getRawNode(c);var d=c.getBoundingClientRect();return{width:Math.round(angular.isNumber(d.width)?d.width:c.offsetWidth),height:Math.round(angular.isNumber(d.height)?d.height:c.offsetHeight),top:Math.round(d.top+(b.pageYOffset||a[0].documentElement.scrollTop)),left:Math.round(d.left+(b.pageXOffset||a[0].documentElement.scrollLeft))}},viewportOffset:function(c,d,e){c=this.getRawNode(c),e=e!==!1?!0:!1;var f=c.getBoundingClientRect(),g={top:0,left:0,bottom:0,right:0},h=d?a[0].documentElement:this.scrollParent(c),i=h.getBoundingClientRect();if(g.top=i.top+h.clientTop,g.left=i.left+h.clientLeft,h===a[0].documentElement&&(g.top+=b.pageYOffset,g.left+=b.pageXOffset),g.bottom=g.top+h.clientHeight,g.right=g.left+h.clientWidth,e){var j=b.getComputedStyle(h);g.top+=this.parseStyle(j.paddingTop),g.bottom-=this.parseStyle(j.paddingBottom),g.left+=this.parseStyle(j.paddingLeft),g.right-=this.parseStyle(j.paddingRight)}return{top:Math.round(f.top-g.top),bottom:Math.round(g.bottom-f.bottom),left:Math.round(f.left-g.left),right:Math.round(g.right-f.right)}},parsePlacement:function(a){var b=e.auto.test(a);return b&&(a=a.replace(e.auto,"")),a=a.split("-"),a[0]=a[0]||"top",e.primary.test(a[0])||(a[0]="top"),a[1]=a[1]||"center",e.secondary.test(a[1])||(a[1]="center"),b?a[2]=!0:a[2]=!1,a},positionElements:function(a,c,d,f){a=this.getRawNode(a),c=this.getRawNode(c);var g=angular.isDefined(c.offsetWidth)?c.offsetWidth:c.prop("offsetWidth"),h=angular.isDefined(c.offsetHeight)?c.offsetHeight:c.prop("offsetHeight");d=this.parsePlacement(d);var i=f?this.offset(a):this.position(a),j={top:0,left:0,placement:""};if(d[2]){var k=this.viewportOffset(a),l=b.getComputedStyle(c),m={width:g+Math.round(Math.abs(this.parseStyle(l.marginLeft)+this.parseStyle(l.marginRight))),height:h+Math.round(Math.abs(this.parseStyle(l.marginTop)+this.parseStyle(l.marginBottom)))};if(d[0]="top"===d[0]&&m.height>k.top&&m.height<=k.bottom?"bottom":"bottom"===d[0]&&m.height>k.bottom&&m.height<=k.top?"top":"left"===d[0]&&m.width>k.left&&m.width<=k.right?"right":"right"===d[0]&&m.width>k.right&&m.width<=k.left?"left":d[0],d[1]="top"===d[1]&&m.height-i.height>k.bottom&&m.height-i.height<=k.top?"bottom":"bottom"===d[1]&&m.height-i.height>k.top&&m.height-i.height<=k.bottom?"top":"left"===d[1]&&m.width-i.width>k.right&&m.width-i.width<=k.left?"right":"right"===d[1]&&m.width-i.width>k.left&&m.width-i.width<=k.right?"left":d[1],"center"===d[1])if(e.vertical.test(d[0])){var n=i.width/2-g/2;k.left+n<0&&m.width-i.width<=k.right?d[1]="left":k.right+n<0&&m.width-i.width<=k.left&&(d[1]="right")}else{var o=i.height/2-m.height/2;k.top+o<0&&m.height-i.height<=k.bottom?d[1]="top":k.bottom+o<0&&m.height-i.height<=k.top&&(d[1]="bottom")}}switch(d[0]){case"top":j.top=i.top-h;break;case"bottom":j.top=i.top+i.height;break;case"left":j.left=i.left-g;break;case"right":j.left=i.left+i.width}switch(d[1]){case"top":j.top=i.top;break;case"bottom":j.top=i.top+i.height-h;break;case"left":j.left=i.left;break;case"right":j.left=i.left+i.width-g;break;case"center":e.vertical.test(d[0])?j.left=i.left+i.width/2-g/2:j.top=i.top+i.height/2-h/2}return j.top=Math.round(j.top),j.left=Math.round(j.left),j.placement="center"===d[1]?d[0]:d[0]+"-"+d[1],j},positionArrow:function(a,c){a=this.getRawNode(a);var d=a.querySelector(".tooltip-inner, .popover-inner");if(d){var f=angular.element(d).hasClass("tooltip-inner"),g=f?a.querySelector(".tooltip-arrow"):a.querySelector(".arrow");if(g){var h={top:"",bottom:"",left:"",right:""};if(c=this.parsePlacement(c),"center"===c[1])return void angular.element(g).css(h);var i="border-"+c[0]+"-width",j=b.getComputedStyle(g)[i],k="border-";k+=e.vertical.test(c[0])?c[0]+"-"+c[1]:c[1]+"-"+c[0],k+="-radius";var l=b.getComputedStyle(f?d:a)[k];switch(c[0]){case"top":h.bottom=f?"0":"-"+j;break;case"bottom":h.top=f?"0":"-"+j;break;case"left":h.right=f?"0":"-"+j;break;case"right":h.left=f?"0":"-"+j}h[c[1]]=l,angular.element(g).css(h)}}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.isClass","ui.bootstrap.position"]).value("$datepickerSuppressError",!1).value("uibDatepickerAttributeWarning",!0).constant("uibDatepickerConfig",{datepickerMode:"day",formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",maxDate:null,maxMode:"year",minDate:null,minMode:"day",ngModelOptions:{},shortcutPropagation:!1,showWeeks:!0,yearColumns:5,yearRows:4}).controller("UibDatepickerController",["$scope","$attrs","$parse","$interpolate","$locale","$log","dateFilter","uibDatepickerConfig","$datepickerSuppressError","uibDatepickerAttributeWarning","uibDateParser",function(a,b,c,d,e,f,g,h,i,j,k){function l(b){a.datepickerMode=b,q&&(a.datepickerOptions.datepickerMode=b)}var m=this,n={$setViewValue:angular.noop},o={},p=[],q=!!b.datepickerOptions;if(this.modes=["day","month","year"],q)["customClass","dateDisabled","datepickerMode","formatDay","formatDayHeader","formatDayTitle","formatMonth","formatMonthTitle","formatYear","initDate","maxDate","maxMode","minDate","minMode","showWeeks","shortcutPropagation","startingDay","yearColumns","yearRows"].forEach(function(b){switch(b){case"customClass":case"dateDisabled":a[b]=a.datepickerOptions[b]||angular.noop;break;case"datepickerMode":a.datepickerMode=angular.isDefined(a.datepickerOptions.datepickerMode)?a.datepickerOptions.datepickerMode:h.datepickerMode;break;case"formatDay":case"formatDayHeader":case"formatDayTitle":case"formatMonth":case"formatMonthTitle":case"formatYear":m[b]=angular.isDefined(a.datepickerOptions[b])?d(a.datepickerOptions[b])(a.$parent):h[b];break;case"showWeeks":case"shortcutPropagation":case"yearColumns":case"yearRows":m[b]=angular.isDefined(a.datepickerOptions[b])?a.datepickerOptions[b]:h[b];break;case"startingDay":angular.isDefined(a.datepickerOptions.startingDay)?m.startingDay=a.datepickerOptions.startingDay:angular.isNumber(h.startingDay)?m.startingDay=h.startingDay:m.startingDay=(e.DATETIME_FORMATS.FIRSTDAYOFWEEK+8)%7;break;case"maxDate":case"minDate":a.datepickerOptions[b]?a.$watch(function(){return a.datepickerOptions[b]},function(a){a?angular.isDate(a)?m[b]=k.fromTimezone(new Date(a),o.timezone):m[b]=new Date(g(a,"medium")):m[b]=null,m.refreshView()}):m[b]=h[b]?k.fromTimezone(new Date(h[b]),o.timezone):null;break;case"maxMode":case"minMode":a.datepickerOptions[b]?a.$watch(function(){return a.datepickerOptions[b]},function(c){m[b]=a[b]=angular.isDefined(c)?c:datepickerOptions[b],("minMode"===b&&m.modes.indexOf(a.datepickerOptions.datepickerMode)<m.modes.indexOf(m[b])||"maxMode"===b&&m.modes.indexOf(a.datepickerOptions.datepickerMode)>m.modes.indexOf(m[b]))&&(a.datepickerMode=m[b],a.datepickerOptions.datepickerMode=m[b])}):m[b]=a[b]=h[b]||null;break;case"initDate":a.datepickerOptions.initDate?(m.activeDate=k.fromTimezone(a.datepickerOptions.initDate,o.timezone)||new Date,a.$watch(function(){return a.datepickerOptions.initDate},function(a){a&&(n.$isEmpty(n.$modelValue)||n.$invalid)&&(m.activeDate=k.fromTimezone(a,o.timezone),m.refreshView())})):m.activeDate=new Date}});else{if(angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle"],function(c){m[c]=angular.isDefined(b[c])?d(b[c])(a.$parent):h[c],angular.isDefined(b[c])&&j&&f.warn("uib-datepicker "+c+" attribute usage is deprecated, use datepicker-options attribute instead")}),angular.forEach(["showWeeks","yearRows","yearColumns","shortcutPropagation"],function(c){m[c]=angular.isDefined(b[c])?a.$parent.$eval(b[c]):h[c],angular.isDefined(b[c])&&j&&f.warn("uib-datepicker "+c+" attribute usage is deprecated, use datepicker-options attribute instead")}),angular.forEach(["dateDisabled","customClass"],function(a){angular.isDefined(b[a])&&j&&f.warn("uib-datepicker "+a+" attribute usage is deprecated, use datepicker-options attribute instead")}),angular.isDefined(b.startingDay)?(j&&f.warn("uib-datepicker startingDay attribute usage is deprecated, use datepicker-options attribute instead"),m.startingDay=a.$parent.$eval(b.startingDay)):angular.isNumber(h.startingDay)?m.startingDay=h.startingDay:m.startingDay=(e.DATETIME_FORMATS.FIRSTDAYOFWEEK+8)%7,angular.forEach(["minDate","maxDate"],function(c){b[c]?(j&&f.warn("uib-datepicker "+c+" attribute usage is deprecated, use datepicker-options attribute instead"),p.push(a.$parent.$watch(b[c],function(a){a?angular.isDate(a)?m[c]=k.fromTimezone(new Date(a),o.timezone):m[c]=new Date(g(a,"medium")):m[c]=null,m.refreshView()}))):m[c]=h[c]?k.fromTimezone(new Date(h[c]),o.timezone):null}),angular.forEach(["minMode","maxMode"],function(c){b[c]?(j&&f.warn("uib-datepicker "+c+" attribute usage is deprecated, use datepicker-options attribute instead"),p.push(a.$parent.$watch(b[c],function(d){m[c]=a[c]=angular.isDefined(d)?d:b[c],("minMode"===c&&m.modes.indexOf(a.datepickerMode)<m.modes.indexOf(m[c])||"maxMode"===c&&m.modes.indexOf(a.datepickerMode)>m.modes.indexOf(m[c]))&&(a.datepickerMode=m[c])}))):m[c]=a[c]=h[c]||null}),angular.isDefined(b.initDate)){j&&f.warn("uib-datepicker initDate attribute usage is deprecated, use datepicker-options attribute instead");var r=k.fromTimezone(a.$parent.$eval(b.initDate),o.timezone);this.activeDate=isNaN(r)?new Date:r,p.push(a.$parent.$watch(b.initDate,function(a){a&&(n.$isEmpty(n.$modelValue)||n.$invalid)&&(a=k.fromTimezone(a,o.timezone),m.activeDate=isNaN(a)?new Date:a,m.refreshView())}))}else this.activeDate=new Date;b.datepickerMode&&j&&f.warn("uib-datepicker datepickerMode attribute usage is deprecated, use datepicker-options attribute instead"),a.datepickerMode=a.datepickerMode||h.datepickerMode}a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),a.disabled=angular.isDefined(b.disabled)||!1,angular.isDefined(b.ngDisabled)&&p.push(a.$parent.$watch(b.ngDisabled,function(b){a.disabled=b,m.refreshView()})),a.isActive=function(b){return 0===m.compare(b.date,m.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){n=a,o=a.$options||h.ngModelOptions,this.activeDate=n.$modelValue||new Date,n.$render=function(){m.render()}},this.render=function(){if(n.$viewValue){var a=new Date(n.$viewValue),b=!isNaN(a);b?this.activeDate=k.fromTimezone(a,o.timezone):i||f.error('Datepicker directive: "ng-model" value must be a Date object')}this.refreshView()},this.refreshView=function(){if(this.element){a.selectedDt=null,this._refreshView(),a.activeDt&&(a.activeDateId=a.activeDt.uid);var b=n.$viewValue?new Date(n.$viewValue):null;b=k.fromTimezone(b,o.timezone),n.$setValidity("dateDisabled",!b||this.element&&!this.isDisabled(b))}},this.createDateObject=function(b,c){var d=n.$viewValue?new Date(n.$viewValue):null;d=k.fromTimezone(d,o.timezone);var e={date:b,label:k.filter(b,c),selected:d&&0===this.compare(b,d),disabled:this.isDisabled(b),current:0===this.compare(b,new Date),customClass:this.customClass(b)||null};return d&&0===this.compare(b,d)&&(a.selectedDt=e),m.activeDate&&0===this.compare(e.date,m.activeDate)&&(a.activeDt=e),e},this.isDisabled=function(b){return a.disabled||this.minDate&&this.compare(b,this.minDate)<0||this.maxDate&&this.compare(b,this.maxDate)>0||a.dateDisabled&&a.dateDisabled({date:b,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===m.minMode){var c=n.$viewValue?k.fromTimezone(new Date(n.$viewValue),o.timezone):new Date(0,0,0,0,0,0,0);
c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),c=k.toTimezone(c,o.timezone),n.$setViewValue(c),n.$render()}else m.activeDate=b,l(m.modes[m.modes.indexOf(a.datepickerMode)-1]),a.$emit("uib:datepicker.mode")},a.move=function(a){var b=m.activeDate.getFullYear()+a*(m.step.years||0),c=m.activeDate.getMonth()+a*(m.step.months||0);m.activeDate.setFullYear(b,c,1),m.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===m.maxMode&&1===b||a.datepickerMode===m.minMode&&-1===b||(l(m.modes[m.modes.indexOf(a.datepickerMode)+b]),a.$emit("uib:datepicker.mode"))},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var s=function(){m.element[0].focus()};a.$on("uib:datepicker.focus",s),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey&&!a.disabled)if(b.preventDefault(),m.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(m.isDisabled(m.activeDate))return;a.select(m.activeDate)}else!b.ctrlKey||"up"!==c&&"down"!==c?(m.handleKeyDown(c,b),m.refreshView()):a.toggleMode("up"===c?1:-1)},a.$on("$destroy",function(){for(;p.length;)p.shift()()})}]).controller("UibDaypickerController",["$scope","$element","dateFilter",function(a,b,c){function d(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?f[b]:29}function e(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}var f=[31,28,31,30,31,30,31,31,30,31,30,31];this.step={months:1},this.element=b,this.init=function(b){angular.extend(b,this),a.showWeeks=b.showWeeks,b.refreshView()},this.getDates=function(a,b){for(var c,d=new Array(b),e=new Date(a),f=0;b>f;)c=new Date(e),d[f++]=c,e.setDate(e.getDate()+1);return d},this._refreshView=function(){var b=this.activeDate.getFullYear(),d=this.activeDate.getMonth(),f=new Date(this.activeDate);f.setFullYear(b,d,1);var g=this.startingDay-f.getDay(),h=g>0?7-g:-g,i=new Date(f);h>0&&i.setDate(-h+1);for(var j=this.getDates(i,42),k=0;42>k;k++)j[k]=angular.extend(this.createDateObject(j[k],this.formatDay),{secondary:j[k].getMonth()!==d,uid:a.uniqueId+"-"+k});a.labels=new Array(7);for(var l=0;7>l;l++)a.labels[l]={abbr:c(j[l].date,this.formatDayHeader),full:c(j[l].date,"EEEE")};if(a.title=c(this.activeDate,this.formatDayTitle),a.rows=this.split(j,7),a.showWeeks){a.weekNumbers=[];for(var m=(11-this.startingDay)%7,n=a.rows.length,o=0;n>o;o++)a.weekNumbers.push(e(a.rows[o][m].date))}},this.compare=function(a,b){var c=new Date(a.getFullYear(),a.getMonth(),a.getDate()),d=new Date(b.getFullYear(),b.getMonth(),b.getDate());return c.setFullYear(a.getFullYear()),d.setFullYear(b.getFullYear()),c-d},this.handleKeyDown=function(a,b){var c=this.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var e=this.activeDate.getMonth()+("pageup"===a?-1:1);this.activeDate.setMonth(e,1),c=Math.min(d(this.activeDate.getFullYear(),this.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=d(this.activeDate.getFullYear(),this.activeDate.getMonth()));this.activeDate.setDate(c)}}]).controller("UibMonthpickerController",["$scope","$element","dateFilter",function(a,b,c){this.step={years:1},this.element=b,this.init=function(a){angular.extend(a,this),a.refreshView()},this._refreshView=function(){for(var b,d=new Array(12),e=this.activeDate.getFullYear(),f=0;12>f;f++)b=new Date(this.activeDate),b.setFullYear(e,f,1),d[f]=angular.extend(this.createDateObject(b,this.formatMonth),{uid:a.uniqueId+"-"+f});a.title=c(this.activeDate,this.formatMonthTitle),a.rows=this.split(d,3)},this.compare=function(a,b){var c=new Date(a.getFullYear(),a.getMonth()),d=new Date(b.getFullYear(),b.getMonth());return c.setFullYear(a.getFullYear()),d.setFullYear(b.getFullYear()),c-d},this.handleKeyDown=function(a,b){var c=this.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=this.activeDate.getFullYear()+("pageup"===a?-1:1);this.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);this.activeDate.setMonth(c)}}]).controller("UibYearpickerController",["$scope","$element","dateFilter",function(a,b,c){function d(a){return parseInt((a-1)/f,10)*f+1}var e,f;this.element=b,this.yearpickerInit=function(){e=this.yearColumns,f=this.yearRows*e,this.step={years:f}},this._refreshView=function(){for(var b,c=new Array(f),g=0,h=d(this.activeDate.getFullYear());f>g;g++)b=new Date(this.activeDate),b.setFullYear(h+g,0,1),c[g]=angular.extend(this.createDateObject(b,this.formatYear),{uid:a.uniqueId+"-"+g});a.title=[c[0].label,c[f-1].label].join(" - "),a.rows=this.split(c,e),a.columns=e},this.compare=function(a,b){return a.getFullYear()-b.getFullYear()},this.handleKeyDown=function(a,b){var c=this.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=e:"right"===a?c+=1:"down"===a?c+=e:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*f:"home"===a?c=d(this.activeDate.getFullYear()):"end"===a&&(c=d(this.activeDate.getFullYear())+f-1),this.activeDate.setFullYear(c)}}]).directive("uibDatepicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/datepicker.html"},scope:{datepickerMode:"=?",datepickerOptions:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["uibDatepicker","^ngModel"],controller:"UibDatepickerController",controllerAs:"datepicker",link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}).directive("uibDaypicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/day.html"},require:["^uibDatepicker","uibDaypicker"],controller:"UibDaypickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibMonthpicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/month.html"},require:["^uibDatepicker","uibMonthpicker"],controller:"UibMonthpickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibYearpicker",function(){return{replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/year.html"},require:["^uibDatepicker","uibYearpicker"],controller:"UibYearpickerController",link:function(a,b,c,d){var e=d[0];angular.extend(e,d[1]),e.yearpickerInit(),e.refreshView()}}}).value("uibDatepickerPopupAttributeWarning",!0).constant("uibDatepickerPopupConfig",{altInputFormats:[],appendToBody:!1,clearText:"Clear",closeOnDateSelection:!0,closeText:"Done",currentText:"Today",datepickerPopup:"yyyy-MM-dd",datepickerPopupTemplateUrl:"uib/template/datepicker/popup.html",datepickerTemplateUrl:"uib/template/datepicker/datepicker.html",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},onOpenFocus:!0,showButtonBar:!0,placement:"auto bottom-left"}).controller("UibDatepickerPopupController",["$scope","$element","$attrs","$compile","$log","$parse","$window","$document","$rootScope","$uibPosition","dateFilter","uibDateParser","uibDatepickerPopupConfig","$timeout","uibDatepickerConfig","uibDatepickerPopupAttributeWarning",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){function q(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function r(b){var c=l.parse(b,x,a.date);if(isNaN(c))for(var d=0;d<J.length;d++)if(c=l.parse(b,J[d],a.date),!isNaN(c))return c;return c}function s(a){if(angular.isNumber(a)&&(a=new Date(a)),!a)return null;if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=r(a);if(!isNaN(b))return l.toTimezone(b,H.timezone)}return G.$options&&G.$options.allowInvalid?a:void 0}function t(a,b){var d=a||b;return c.ngRequired||d?(angular.isNumber(d)&&(d=new Date(d)),d?angular.isDate(d)&&!isNaN(d)?!0:angular.isString(d)?!isNaN(r(b)):!1:!0):!0}function u(c){if(a.isOpen||!a.disabled){var d=I[0],e=b[0].contains(c.target),f=void 0!==d.contains&&d.contains(c.target);!a.isOpen||e||f||a.$apply(function(){a.isOpen=!1})}}function v(c){27===c.which&&a.isOpen?(c.preventDefault(),c.stopPropagation(),a.$apply(function(){a.isOpen=!1}),b[0].focus()):40!==c.which||a.isOpen||(c.preventDefault(),c.stopPropagation(),a.$apply(function(){a.isOpen=!0}))}function w(){if(a.isOpen){var d=angular.element(I[0].querySelector(".uib-datepicker-popup")),e=c.popupPlacement?c.popupPlacement:m.placement,f=j.positionElements(b,d,e,z);d.css({top:f.top+"px",left:f.left+"px"}),d.hasClass("uib-position-measure")&&d.removeClass("uib-position-measure")}}var x,y,z,A,B,C,D,E,F,G,H,I,J,K={},L=!1,M=[];a.watchData={},this.init=function(j){if(G=j,H=j.$options||o.ngModelOptions,y=angular.isDefined(c.closeOnDateSelection)?a.$parent.$eval(c.closeOnDateSelection):m.closeOnDateSelection,z=angular.isDefined(c.datepickerAppendToBody)?a.$parent.$eval(c.datepickerAppendToBody):m.appendToBody,A=angular.isDefined(c.onOpenFocus)?a.$parent.$eval(c.onOpenFocus):m.onOpenFocus,B=angular.isDefined(c.datepickerPopupTemplateUrl)?c.datepickerPopupTemplateUrl:m.datepickerPopupTemplateUrl,C=angular.isDefined(c.datepickerTemplateUrl)?c.datepickerTemplateUrl:m.datepickerTemplateUrl,J=angular.isDefined(c.altInputFormats)?a.$parent.$eval(c.altInputFormats):m.altInputFormats,a.showButtonBar=angular.isDefined(c.showButtonBar)?a.$parent.$eval(c.showButtonBar):m.showButtonBar,m.html5Types[c.type]?(x=m.html5Types[c.type],L=!0):(x=c.uibDatepickerPopup||m.datepickerPopup,c.$observe("uibDatepickerPopup",function(a,b){var c=a||m.datepickerPopup;if(c!==x&&(x=c,G.$modelValue=null,!x))throw new Error("uibDatepickerPopup must have a date format specified.")})),!x)throw new Error("uibDatepickerPopup must have a date format specified.");if(L&&c.uibDatepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");D=angular.element("<div uib-datepicker-popup-wrap><div uib-datepicker></div></div>"),a.ngModelOptions=angular.copy(H),a.ngModelOptions.timezone=null,a.ngModelOptions.updateOnDefault===!0&&(a.ngModelOptions.updateOn=a.ngModelOptions.updateOn?a.ngModelOptions.updateOn+" default":"default"),D.attr({"ng-model":"date","ng-model-options":"ngModelOptions","ng-change":"dateSelection(date)","template-url":B}),E=angular.element(D.children()[0]),E.attr("template-url",C),L&&"month"===c.type&&(E.attr("datepicker-mode",'"month"'),E.attr("min-mode","month")),a.datepickerOptions&&E.attr("datepicker-options","datepickerOptions"),angular.forEach(["minMode","maxMode","datepickerMode","shortcutPropagation"],function(b){if(c[b]){p&&e.warn("uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead");var d=f(c[b]),g={get:function(){return d(a.$parent)}};if(E.attr(q(b),"watchData."+b),"datepickerMode"===b){var h=d.assign;g.set=function(b){h(a.$parent,b)}}Object.defineProperty(a.watchData,b,g)}}),angular.forEach(["minDate","maxDate","initDate"],function(b){if(c[b]){p&&e.warn("uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead");var d=f(c[b]);M.push(a.$parent.$watch(d,function(c){if("minDate"===b||"maxDate"===b)null===c?K[b]=null:angular.isDate(c)?K[b]=l.fromTimezone(new Date(c),H.timezone):K[b]=new Date(k(c,"medium")),a.watchData[b]=null===c?null:K[b];else{var d=c?new Date(c):new Date;a.watchData[b]=l.fromTimezone(d,H.timezone)}})),E.attr(q(b),"watchData."+b)}}),c.dateDisabled&&(p&&e.warn("uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead"),E.attr("date-disabled","dateDisabled({ date: date, mode: mode })")),angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","showWeeks","startingDay","yearRows","yearColumns"],function(a){angular.isDefined(c[a])&&(p&&e.warn("uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead"),E.attr(q(a),c[a]))}),c.customClass&&(p&&e.warn("uib-datepicker settings via uib-datepicker-popup attributes are deprecated and will be removed in UI Bootstrap 1.3, use datepicker-options attribute instead"),E.attr("custom-class","customClass({ date: date, mode: mode })")),L?G.$formatters.push(function(b){return a.date=l.fromTimezone(b,H.timezone),b}):(G.$$parserName="date",G.$validators.date=t,G.$parsers.unshift(s),G.$formatters.push(function(b){return G.$isEmpty(b)?(a.date=b,b):(a.date=l.fromTimezone(b,H.timezone),angular.isNumber(a.date)&&(a.date=new Date(a.date)),l.filter(a.date,x))})),G.$viewChangeListeners.push(function(){a.date=r(G.$viewValue)}),b.on("keydown",v),I=d(D)(a),D.remove(),z?h.find("body").append(I):b.after(I),a.$on("$destroy",function(){for(a.isOpen===!0&&(i.$$phase||a.$apply(function(){a.isOpen=!1})),I.remove(),b.off("keydown",v),h.off("click",u),F&&F.off("scroll",w),angular.element(g).off("resize",w);M.length;)M.shift()()})},a.getText=function(b){return a[b+"Text"]||m[b+"Text"]},a.isDisabled=function(b){return"today"===b&&(b=new Date),a.watchData.minDate&&a.compare(b,K.minDate)<0||a.watchData.maxDate&&a.compare(b,K.maxDate)>0},a.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},a.dateSelection=function(c){angular.isDefined(c)&&(a.date=c);var d=a.date?l.filter(a.date,x):null;b.val(d),G.$setViewValue(d),y&&(a.isOpen=!1,b[0].focus())},a.keydown=function(c){27===c.which&&(c.stopPropagation(),a.isOpen=!1,b[0].focus())},a.select=function(b,c){if(c.stopPropagation(),"today"===b){var d=new Date;angular.isDate(a.date)?(b=new Date(a.date),b.setFullYear(d.getFullYear(),d.getMonth(),d.getDate())):b=new Date(d.setHours(0,0,0,0))}a.dateSelection(b)},a.close=function(c){c.stopPropagation(),a.isOpen=!1,b[0].focus()},a.disabled=angular.isDefined(c.disabled)||!1,c.ngDisabled&&M.push(a.$parent.$watch(f(c.ngDisabled),function(b){a.disabled=b})),a.$watch("isOpen",function(d){d?a.disabled?a.isOpen=!1:n(function(){w(),A&&a.$broadcast("uib:datepicker.focus"),h.on("click",u);var d=c.popupPlacement?c.popupPlacement:m.placement;z||j.parsePlacement(d)[2]?(F=F||angular.element(j.scrollParent(b)),F&&F.on("scroll",w)):F=null,angular.element(g).on("resize",w)},0,!1):(h.off("click",u),F&&F.off("scroll",w),angular.element(g).off("resize",w))}),a.$on("uib:datepicker.mode",function(){n(w,0,!1)})}]).directive("uibDatepickerPopup",function(){return{require:["ngModel","uibDatepickerPopup"],controller:"UibDatepickerPopupController",scope:{datepickerOptions:"=?",isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(a,b,c,d){var e=d[0],f=d[1];f.init(e)}}}).directive("uibDatepickerPopupWrap",function(){return{replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/datepicker/popup.html"}}}),angular.module("ui.bootstrap.debounce",[]).factory("$$debounce",["$timeout",function(a){return function(b,c){var d;return function(){var e=this,f=Array.prototype.slice.call(arguments);d&&a.cancel(d),d=a(function(){b.apply(e,f)},c)}}}]),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("uibDropdownConfig",{appendToOpenClass:"uib-dropdown-open",openClass:"open"}).service("uibDropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.on("click",d),a.on("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.off("click",d),a.off("keydown",e))};var d=function(a){if(c&&!(a&&"disabled"===c.getAutoClose()||a&&3===a.which)){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getDropdownElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which?(c.focusToggleElement(),d()):c.isKeynavEnabled()&&-1!==[38,40].indexOf(a.which)&&c.isOpen&&(a.preventDefault(),a.stopPropagation(),c.focusDropdownEntry(a.which))}}]).controller("UibDropdownController",["$scope","$element","$attrs","$parse","uibDropdownConfig","uibDropdownService","$animate","$uibPosition","$document","$compile","$templateRequest",function(a,b,c,d,e,f,g,h,i,j,k){var l,m,n=this,o=a.$new(),p=e.appendToOpenClass,q=e.openClass,r=angular.noop,s=c.onToggle?d(c.onToggle):angular.noop,t=!1,u=null,v=!1,w=i.find("body");b.addClass("dropdown"),this.init=function(){if(c.isOpen&&(m=d(c.isOpen),r=m.assign,a.$watch(m,function(a){o.isOpen=!!a})),angular.isDefined(c.dropdownAppendTo)){var e=d(c.dropdownAppendTo)(o);e&&(u=angular.element(e))}t=angular.isDefined(c.dropdownAppendToBody),v=angular.isDefined(c.keyboardNav),t&&!u&&(u=w),u&&n.dropdownMenu&&(u.append(n.dropdownMenu),b.on("$destroy",function(){n.dropdownMenu.remove()}))},this.toggle=function(a){return o.isOpen=arguments.length?!!a:!o.isOpen},this.isOpen=function(){return o.isOpen},o.getToggleElement=function(){return n.toggleElement},o.getAutoClose=function(){return c.autoClose||"always"},o.getElement=function(){return b},o.isKeynavEnabled=function(){return v},o.focusDropdownEntry=function(a){var c=n.dropdownMenu?angular.element(n.dropdownMenu).find("a"):b.find("ul").eq(0).find("a");switch(a){case 40:angular.isNumber(n.selectedOption)?n.selectedOption=n.selectedOption===c.length-1?n.selectedOption:n.selectedOption+1:n.selectedOption=0;break;case 38:angular.isNumber(n.selectedOption)?n.selectedOption=0===n.selectedOption?0:n.selectedOption-1:n.selectedOption=c.length-1}c[n.selectedOption].focus()},o.getDropdownElement=function(){return n.dropdownMenu},o.focusToggleElement=function(){n.toggleElement&&n.toggleElement[0].focus()},o.$watch("isOpen",function(c,d){if(u&&n.dropdownMenu){var e,i,m=h.positionElements(b,n.dropdownMenu,"bottom-left",!0);if(e={top:m.top+"px",display:c?"block":"none"},i=n.dropdownMenu.hasClass("dropdown-menu-right"),i?(e.left="auto",e.right=window.innerWidth-(m.left+b.prop("offsetWidth"))+"px"):(e.left=m.left+"px",e.right="auto"),!t){var v=h.offset(u);e.top=m.top-v.top+"px",i?e.right=window.innerWidth-(m.left-v.left+b.prop("offsetWidth"))+"px":e.left=m.left-v.left+"px"}n.dropdownMenu.css(e)}var w=u?u:b,x=w.hasClass(u?p:q);if(x===!c&&g[c?"addClass":"removeClass"](w,u?p:q).then(function(){angular.isDefined(c)&&c!==d&&s(a,{open:!!c})}),c)n.dropdownMenuTemplateUrl&&k(n.dropdownMenuTemplateUrl).then(function(a){l=o.$new(),j(a.trim())(l,function(a){var b=a;n.dropdownMenu.replaceWith(b),n.dropdownMenu=b})}),o.focusToggleElement(),f.open(o);else{if(n.dropdownMenuTemplateUrl){l&&l.$destroy();var y=angular.element('<ul class="dropdown-menu"></ul>');n.dropdownMenu.replaceWith(y),n.dropdownMenu=y}f.close(o),n.selectedOption=null}angular.isFunction(r)&&r(a,c)}),a.$on("$locationChangeSuccess",function(){"disabled"!==o.getAutoClose()&&(o.isOpen=!1)})}]).directive("uibDropdown",function(){return{controller:"UibDropdownController",link:function(a,b,c,d){d.init()}}}).directive("uibDropdownMenu",function(){return{restrict:"A",require:"?^uibDropdown",link:function(a,b,c,d){if(d&&!angular.isDefined(c.dropdownNested)){b.addClass("dropdown-menu");var e=c.templateUrl;e&&(d.dropdownMenuTemplateUrl=e),d.dropdownMenu||(d.dropdownMenu=b)}}}}).directive("uibDropdownToggle",function(){return{require:"?^uibDropdown",link:function(a,b,c,d){if(d){b.addClass("dropdown-toggle"),d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.stackedMap",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b===a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b===a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.stackedMap"]).factory("$$multiMap",function(){return{createNew:function(){var a={};return{entries:function(){return Object.keys(a).map(function(b){return{key:b,value:a[b]}})},get:function(b){return a[b]},hasKey:function(b){return!!a[b]},keys:function(){return Object.keys(a)},put:function(b,c){a[b]||(a[b]=[]),a[b].push(c)},remove:function(b,c){var d=a[b];if(d){var e=d.indexOf(c);-1!==e&&d.splice(e,1),d.length||delete a[b]}}}}}}).provider("$uibResolve",function(){var a=this;this.resolver=null,this.setResolver=function(a){this.resolver=a},this.$get=["$injector","$q",function(b,c){var d=a.resolver?b.get(a.resolver):null;return{resolve:function(a,e,f,g){if(d)return d.resolve(a,e,f,g);var h=[];return angular.forEach(a,function(a){angular.isFunction(a)||angular.isArray(a)?h.push(c.resolve(b.invoke(a))):angular.isString(a)?h.push(c.resolve(b.get(a))):h.push(c.resolve(a))}),c.all(h).then(function(b){var c={},d=0;return angular.forEach(a,function(a,e){c[e]=b[d++]}),c})}}}]}).directive("uibModalBackdrop",["$animateCss","$injector","$uibModalStack",function(a,b,c){function d(b,d,e){e.modalInClass&&(a(d,{addClass:e.modalInClass}).start(),b.$on(c.NOW_CLOSING_EVENT,function(c,f){var g=f();b.modalOptions.animation?a(d,{removeClass:e.modalInClass}).start().then(g):g()}))}return{replace:!0,templateUrl:"uib/template/modal/backdrop.html",compile:function(a,b){return a.addClass(b.backdropClass),d}}}]).directive("uibModalWindow",["$uibModalStack","$q","$animate","$animateCss","$document",function(a,b,c,d,e){return{scope:{index:"@"},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/modal/window.html"},link:function(f,g,h){g.addClass(h.windowClass||""),g.addClass(h.windowTopClass||""),f.size=h.size,f.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!==c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))},g.on("click",f.close),f.$isRendered=!0;var i=b.defer();h.$observe("modalRender",function(a){"true"===a&&i.resolve()}),i.promise.then(function(){var i=null;h.modalInClass&&(i=d(g,{addClass:h.modalInClass}).start(),f.$on(a.NOW_CLOSING_EVENT,function(a,b){var e=b();d?d(g,{removeClass:h.modalInClass}).start().then(e):c.removeClass(g,h.modalInClass).then(e)})),b.when(i).then(function(){var b=a.getTop();if(b&&a.modalRendered(b.key),!e[0].activeElement||!g[0].contains(e[0].activeElement)){var c=g[0].querySelector("[autofocus]");c?c.focus():g[0].focus()}})})}}}]).directive("uibModalAnimationClass",function(){return{compile:function(a,b){b.modalAnimation&&a.addClass(b.uibModalAnimationClass)}}}).directive("uibModalTransclude",function(){return{link:function(a,b,c,d,e){e(a.$parent,function(a){b.empty(),b.append(a)})}}}).factory("$uibModalStack",["$animate","$animateCss","$document","$compile","$rootScope","$q","$$multiMap","$$stackedMap",function(a,b,c,d,e,f,g,h){function i(){for(var a=-1,b=t.keys(),c=0;c<b.length;c++)t.get(b[c]).value.backdrop&&(a=c);return a}function j(a,b){var c=t.get(a).value,d=c.appendTo;t.remove(a),m(c.modalDomEl,c.modalScope,function(){var b=c.openedClass||s;u.remove(b,a),d.toggleClass(b,u.hasKey(b)),k(!0)},c.closedDeferred),l(),b&&b.focus?b.focus():d.focus&&d.focus()}function k(a){var b;t.length()>0&&(b=t.top().value,b.modalDomEl.toggleClass(b.windowTopClass||"",a))}function l(){if(p&&-1===i()){var a=q;m(p,q,function(){a=null}),p=void 0,q=void 0}}function m(a,c,d,e){function g(){g.done||(g.done=!0,b(a,{event:"leave"}).start().then(function(){a.remove(),e&&e.resolve()}),c.$destroy(),d&&d())}var h,i=null,j=function(){return h||(h=f.defer(),i=h.promise),function(){h.resolve()}};return c.$broadcast(v.NOW_CLOSING_EVENT,j),f.when(i).then(g)}function n(a){if(a.isDefaultPrevented())return a;var b=t.top();if(b)switch(a.which){case 27:b.value.keyboard&&(a.preventDefault(),e.$apply(function(){v.dismiss(b.key,"escape key press")}));break;case 9:v.loadFocusElementList(b);var c=!1;a.shiftKey?(v.isFocusInFirstItem(a)||v.isModalFocused(a,b))&&(c=v.focusLastFocusableElement()):v.isFocusInLastItem(a)&&(c=v.focusFirstFocusableElement()),c&&(a.preventDefault(),a.stopPropagation())}}function o(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var p,q,r,s="modal-open",t=h.createNew(),u=g.createNew(),v={NOW_CLOSING_EVENT:"modal.stack.now-closing"},w=0,x="a[href], area[href], input:not([disabled]), button:not([disabled]),select:not([disabled]), textarea:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable=true]";return e.$watch(i,function(a){q&&(q.index=a)}),c.on("keydown",n),e.$on("$destroy",function(){c.off("keydown",n)}),v.open=function(b,f){var g=c[0].activeElement,h=f.openedClass||s;k(!1),t.add(b,{deferred:f.deferred,renderDeferred:f.renderDeferred,closedDeferred:f.closedDeferred,modalScope:f.scope,backdrop:f.backdrop,keyboard:f.keyboard,openedClass:f.openedClass,windowTopClass:f.windowTopClass,animation:f.animation,appendTo:f.appendTo}),u.put(h,b);var j=f.appendTo,l=i();if(!j.length)throw new Error("appendTo element not found. Make sure that the element passed is in DOM.");l>=0&&!p&&(q=e.$new(!0),q.modalOptions=f,q.index=l,p=angular.element('<div uib-modal-backdrop="modal-backdrop"></div>'),p.attr("backdrop-class",f.backdropClass),f.animation&&p.attr("modal-animation","true"),d(p)(q),a.enter(p,j));var m=angular.element('<div uib-modal-window="modal-window"></div>');m.attr({"template-url":f.windowTemplateUrl,"window-class":f.windowClass,"window-top-class":f.windowTopClass,size:f.size,index:t.length()-1,animate:"animate"}).html(f.content),f.animation&&m.attr("modal-animation","true"),a.enter(d(m)(f.scope),j).then(function(){f.scope.$$uibDestructionScheduled||a.addClass(j,h)}),t.top().value.modalDomEl=m,t.top().value.modalOpener=g,v.clearFocusListCache()},v.close=function(a,b){var c=t.get(a);return c&&o(c,b,!0)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.resolve(b),j(a,c.value.modalOpener),!0):!c},v.dismiss=function(a,b){var c=t.get(a);return c&&o(c,b,!1)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.reject(b),j(a,c.value.modalOpener),!0):!c},v.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},v.getTop=function(){return t.top()},v.modalRendered=function(a){var b=t.get(a);b&&b.value.renderDeferred.resolve()},v.focusFirstFocusableElement=function(){return r.length>0?(r[0].focus(),!0):!1},v.focusLastFocusableElement=function(){return r.length>0?(r[r.length-1].focus(),!0):!1},v.isModalFocused=function(a,b){if(a&&b){var c=b.value.modalDomEl;if(c&&c.length)return(a.target||a.srcElement)===c[0]}return!1},v.isFocusInFirstItem=function(a){return r.length>0?(a.target||a.srcElement)===r[0]:!1},v.isFocusInLastItem=function(a){return r.length>0?(a.target||a.srcElement)===r[r.length-1]:!1},v.clearFocusListCache=function(){r=[],w=0},v.loadFocusElementList=function(a){if((void 0===r||!r.length)&&a){var b=a.value.modalDomEl;b&&b.length&&(r=b[0].querySelectorAll(x))}},v}]).provider("$uibModal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$rootScope","$q","$document","$templateRequest","$controller","$uibResolve","$uibModalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?c.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}var j={},k=null;return j.getPromiseChain=function(){return k},j.open=function(e){function j(){return r}var l=c.defer(),m=c.defer(),n=c.defer(),o=c.defer(),p={result:l.promise,opened:m.promise,closed:n.promise,rendered:o.promise,close:function(a){return h.close(p,a)},dismiss:function(a){return h.dismiss(p,a)}};if(e=angular.extend({},a.options,e),e.resolve=e.resolve||{},e.appendTo=e.appendTo||d.find("body").eq(0),!e.template&&!e.templateUrl)throw new Error("One of template or templateUrl options is required.");var q,r=c.all([i(e),g.resolve(e.resolve,{},null,null)]);return q=k=c.all([k]).then(j,j).then(function(a){var c=e.scope||b,d=c.$new();d.$close=p.close,d.$dismiss=p.dismiss,d.$on("$destroy",function(){d.$$uibDestructionScheduled||d.$dismiss("$uibUnscheduledDestruction")});var g,i={};e.controller&&(i.$scope=d,i.$uibModalInstance=p,angular.forEach(a[1],function(a,b){i[b]=a}),g=f(e.controller,i),e.controllerAs&&(e.bindToController&&(g.$close=d.$close,g.$dismiss=d.$dismiss,angular.extend(g,c),angular.isFunction(g.$onInit)&&g.$onInit()),d[e.controllerAs]=g)),h.open(p,{scope:d,deferred:l,renderDeferred:o,closedDeferred:n,content:a[0],animation:e.animation,backdrop:e.backdrop,keyboard:e.keyboard,backdropClass:e.backdropClass,windowTopClass:e.windowTopClass,windowClass:e.windowClass,windowTemplateUrl:e.windowTemplateUrl,size:e.size,openedClass:e.openedClass,appendTo:e.appendTo}),m.resolve(!0)},function(a){m.reject(a),l.reject(a)})["finally"](function(){k===q&&(k=null)}),p},j}]};return a}),angular.module("ui.bootstrap.paging",[]).factory("uibPaging",["$parse",function(a){return{create:function(b,c,d){b.setNumPages=d.numPages?a(d.numPages).assign:angular.noop,b.ngModelCtrl={$setViewValue:angular.noop},b._watchers=[],b.init=function(a,e){b.ngModelCtrl=a,b.config=e,a.$render=function(){b.render()},d.itemsPerPage?b._watchers.push(c.$parent.$watch(d.itemsPerPage,function(a){b.itemsPerPage=parseInt(a,10),c.totalPages=b.calculateTotalPages(),b.updatePage()})):b.itemsPerPage=e.itemsPerPage,c.$watch("totalItems",function(a,d){(angular.isDefined(a)||a!==d)&&(c.totalPages=b.calculateTotalPages(),b.updatePage())})},b.calculateTotalPages=function(){var a=b.itemsPerPage<1?1:Math.ceil(c.totalItems/b.itemsPerPage);return Math.max(a||0,1)},b.render=function(){c.page=parseInt(b.ngModelCtrl.$viewValue,10)||1},c.selectPage=function(a,d){d&&d.preventDefault();var e=!c.ngDisabled||!d;e&&c.page!==a&&a>0&&a<=c.totalPages&&(d&&d.target&&d.target.blur(),b.ngModelCtrl.$setViewValue(a),b.ngModelCtrl.$render())},c.getText=function(a){return c[a+"Text"]||b.config[a+"Text"]},c.noPrevious=function(){return 1===c.page},c.noNext=function(){return c.page===c.totalPages},b.updatePage=function(){b.setNumPages(c.$parent,c.totalPages),c.page>c.totalPages?c.selectPage(c.totalPages):b.ngModelCtrl.$render()},c.$on("$destroy",function(){for(;b._watchers.length;)b._watchers.shift()()})}}}]),angular.module("ui.bootstrap.pager",["ui.bootstrap.paging"]).controller("UibPagerController",["$scope","$attrs","uibPaging","uibPagerConfig",function(a,b,c,d){a.align=angular.isDefined(b.align)?a.$parent.$eval(b.align):d.align,c.create(this,a,b)}]).constant("uibPagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("uibPager",["uibPagerConfig",function(a){return{scope:{totalItems:"=",previousText:"@",nextText:"@",ngDisabled:"="},require:["uibPager","?ngModel"],controller:"UibPagerController",controllerAs:"pager",templateUrl:function(a,b){return b.templateUrl||"uib/template/pager/pager.html"},replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&f.init(g,a)}}}]),angular.module("ui.bootstrap.pagination",["ui.bootstrap.paging"]).controller("UibPaginationController",["$scope","$attrs","$parse","uibPaging","uibPaginationConfig",function(a,b,c,d,e){function f(a,b,c){return{number:a,text:b,active:c}}function g(a,b){var c=[],d=1,e=b,g=angular.isDefined(i)&&b>i;g&&(j?(d=Math.max(a-Math.floor(i/2),1),e=d+i-1,e>b&&(e=b,d=e-i+1)):(d=(Math.ceil(a/i)-1)*i+1,e=Math.min(d+i-1,b)));for(var h=d;e>=h;h++){var n=f(h,m(h),h===a);c.push(n)}if(g&&i>0&&(!j||k||l)){if(d>1){if(!l||d>3){var o=f(d-1,"...",!1);c.unshift(o)}if(l){if(3===d){var p=f(2,"2",!1);c.unshift(p)}var q=f(1,"1",!1);c.unshift(q)}}if(b>e){if(!l||b-2>e){var r=f(e+1,"...",!1);c.push(r)}if(l){if(e===b-2){var s=f(b-1,b-1,!1);c.push(s)}var t=f(b,b,!1);
c.push(t)}}}return c}var h=this,i=angular.isDefined(b.maxSize)?a.$parent.$eval(b.maxSize):e.maxSize,j=angular.isDefined(b.rotate)?a.$parent.$eval(b.rotate):e.rotate,k=angular.isDefined(b.forceEllipses)?a.$parent.$eval(b.forceEllipses):e.forceEllipses,l=angular.isDefined(b.boundaryLinkNumbers)?a.$parent.$eval(b.boundaryLinkNumbers):e.boundaryLinkNumbers,m=angular.isDefined(b.pageLabel)?function(c){return a.$parent.$eval(b.pageLabel,{$page:c})}:angular.identity;a.boundaryLinks=angular.isDefined(b.boundaryLinks)?a.$parent.$eval(b.boundaryLinks):e.boundaryLinks,a.directionLinks=angular.isDefined(b.directionLinks)?a.$parent.$eval(b.directionLinks):e.directionLinks,d.create(this,a,b),b.maxSize&&h._watchers.push(a.$parent.$watch(c(b.maxSize),function(a){i=parseInt(a,10),h.render()}));var n=this.render;this.render=function(){n(),a.page>0&&a.page<=a.totalPages&&(a.pages=g(a.page,a.totalPages))}}]).constant("uibPaginationConfig",{itemsPerPage:10,boundaryLinks:!1,boundaryLinkNumbers:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0,forceEllipses:!1}).directive("uibPagination",["$parse","uibPaginationConfig",function(a,b){return{scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@",ngDisabled:"="},require:["uibPagination","?ngModel"],controller:"UibPaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"uib/template/pagination/pagination.html"},replace:!0,link:function(a,c,d,e){var f=e[0],g=e[1];g&&f.init(g,b)}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.stackedMap"]).provider("$uibTooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",placementClassPrefix:"",animation:!0,popupDelay:0,popupCloseDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",outsideClick:"outsideClick",focus:"blur",none:""},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$uibPosition","$interpolate","$rootScope","$parse","$$stackedMap",function(e,f,g,h,i,j,k,l,m){function n(a){if(27===a.which){var b=o.top();b&&(b.value.close(),o.removeTop(),b=null)}}var o=m.createNew();return h.on("keypress",n),k.$on("$destroy",function(){h.off("keypress",n)}),function(e,k,m,n){function p(a){var b=(a||n.trigger||m).split(" "),d=b.map(function(a){return c[a]||a});return{show:b,hide:d}}n=angular.extend({},b,d,n);var q=a(e),r=j.startSymbol(),s=j.endSymbol(),t="<div "+q+'-popup title="'+r+"title"+s+'" '+(n.useContentExp?'content-exp="contentExp()" ':'content="'+r+"content"+s+'" ')+'placement="'+r+"placement"+s+'" popup-class="'+r+"popupClass"+s+'" animation="animation" is-open="isOpen"origin-scope="origScope" class="uib-position-measure"></div>';return{compile:function(a,b){var c=f(t);return function(a,b,d,f){function j(){N.isOpen?q():m()}function m(){(!M||a.$eval(d[k+"Enable"]))&&(u(),x(),N.popupDelay?G||(G=g(r,N.popupDelay,!1)):r())}function q(){s(),N.popupCloseDelay?H||(H=g(t,N.popupCloseDelay,!1)):t()}function r(){return s(),u(),N.content?(v(),void N.$evalAsync(function(){N.isOpen=!0,y(!0),S()})):angular.noop}function s(){G&&(g.cancel(G),G=null),I&&(g.cancel(I),I=null)}function t(){N&&N.$evalAsync(function(){N&&(N.isOpen=!1,y(!1),N.animation?F||(F=g(w,150,!1)):w())})}function u(){H&&(g.cancel(H),H=null),F&&(g.cancel(F),F=null)}function v(){D||(E=N.$new(),D=c(E,function(a){K?h.find("body").append(a):b.after(a)}),z())}function w(){s(),u(),A(),D&&(D.remove(),D=null),E&&(E.$destroy(),E=null)}function x(){N.title=d[k+"Title"],Q?N.content=Q(a):N.content=d[e],N.popupClass=d[k+"Class"],N.placement=angular.isDefined(d[k+"Placement"])?d[k+"Placement"]:n.placement;var b=i.parsePlacement(N.placement);J=b[1]?b[0]+"-"+b[1]:b[0];var c=parseInt(d[k+"PopupDelay"],10),f=parseInt(d[k+"PopupCloseDelay"],10);N.popupDelay=isNaN(c)?n.popupDelay:c,N.popupCloseDelay=isNaN(f)?n.popupCloseDelay:f}function y(b){P&&angular.isFunction(P.assign)&&P.assign(a,b)}function z(){R.length=0,Q?(R.push(a.$watch(Q,function(a){N.content=a,!a&&N.isOpen&&t()})),R.push(E.$watch(function(){O||(O=!0,E.$$postDigest(function(){O=!1,N&&N.isOpen&&S()}))}))):R.push(d.$observe(e,function(a){N.content=a,!a&&N.isOpen?t():S()})),R.push(d.$observe(k+"Title",function(a){N.title=a,N.isOpen&&S()})),R.push(d.$observe(k+"Placement",function(a){N.placement=a?a:n.placement;var b=i.parsePlacement(N.placement);J=b[1]?b[0]+"-"+b[1]:b[0],N.isOpen&&S()}))}function A(){R.length&&(angular.forEach(R,function(a){a()}),R.length=0)}function B(a){N&&N.isOpen&&D&&(b[0].contains(a.target)||D[0].contains(a.target)||q())}function C(){var a=d[k+"Trigger"];T(),L=p(a),"none"!==L.show&&L.show.forEach(function(a,c){"outsideClick"===a?(b.on("click",j),h.on("click",B)):a===L.hide[c]?b.on(a,j):a&&(b.on(a,m),b.on(L.hide[c],q)),b.on("keypress",function(a){27===a.which&&q()})})}var D,E,F,G,H,I,J,K=angular.isDefined(n.appendToBody)?n.appendToBody:!1,L=p(void 0),M=angular.isDefined(d[k+"Enable"]),N=a.$new(!0),O=!1,P=angular.isDefined(d[k+"IsOpen"])?l(d[k+"IsOpen"]):!1,Q=n.useContentExp?l(d[e]):!1,R=[],S=function(){D&&D.html()&&(I||(I=g(function(){var a=i.positionElements(b,D,N.placement,K);D.css({top:a.top+"px",left:a.left+"px"}),D.hasClass(a.placement.split("-")[0])||(D.removeClass(J.split("-")[0]),D.addClass(a.placement.split("-")[0])),D.hasClass(n.placementClassPrefix+a.placement)||(D.removeClass(n.placementClassPrefix+J),D.addClass(n.placementClassPrefix+a.placement)),D.hasClass("uib-position-measure")?(i.positionArrow(D,a.placement),D.removeClass("uib-position-measure")):J!==a.placement&&i.positionArrow(D,a.placement),J=a.placement,I=null},0,!1)))};N.origScope=a,N.isOpen=!1,o.add(N,{close:t}),N.contentExp=function(){return N.content},d.$observe("disabled",function(a){a&&s(),a&&N.isOpen&&t()}),P&&a.$watch(P,function(a){N&&!a===N.isOpen&&j()});var T=function(){L.show.forEach(function(a){"outsideClick"===a?b.off("click",j):(b.off(a,m),b.off(a,j))}),L.hide.forEach(function(a){"outsideClick"===a?h.off("click",B):b.off(a,q)})};C();var U=a.$eval(d[k+"Animation"]);N.animation=angular.isDefined(U)?!!U:n.animation;var V,W=k+"AppendToBody";V=W in d&&void 0===d[W]?!0:a.$eval(d[W]),K=angular.isDefined(V)?V:K,a.$on("$destroy",function(){T(),w(),o.remove(N),N=null})}}}}}]}).directive("uibTooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.uibTooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("uibTooltipClasses",["$uibPosition",function(a){return{restrict:"A",link:function(b,c,d){if(b.placement){var e=a.parsePlacement(b.placement);c.addClass(e[0])}b.popupClass&&c.addClass(b.popupClass),b.animation()&&c.addClass(d.tooltipAnimationClass)}}}]).directive("uibTooltipPopup",function(){return{replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/tooltip/tooltip-popup.html"}}).directive("uibTooltip",["$uibTooltip",function(a){return a("uibTooltip","tooltip","mouseenter")}]).directive("uibTooltipTemplatePopup",function(){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"uib/template/tooltip/tooltip-template-popup.html"}}).directive("uibTooltipTemplate",["$uibTooltip",function(a){return a("uibTooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("uibTooltipHtmlPopup",function(){return{replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/tooltip/tooltip-html-popup.html"}}).directive("uibTooltipHtml",["$uibTooltip",function(a){return a("uibTooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("uibPopoverTemplatePopup",function(){return{replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"uib/template/popover/popover-template.html"}}).directive("uibPopoverTemplate",["$uibTooltip",function(a){return a("uibPopoverTemplate","popover","click",{useContentExp:!0})}]).directive("uibPopoverHtmlPopup",function(){return{replace:!0,scope:{contentExp:"&",title:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/popover/popover-html.html"}}).directive("uibPopoverHtml",["$uibTooltip",function(a){return a("uibPopoverHtml","popover","click",{useContentExp:!0})}]).directive("uibPopoverPopup",function(){return{replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"uib/template/popover/popover.html"}}).directive("uibPopover",["$uibTooltip",function(a){return a("uibPopover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("uibProgressConfig",{animate:!0,max:100}).controller("UibProgressController",["$scope","$attrs","uibProgressConfig",function(a,b,c){function d(){return angular.isDefined(a.maxParam)?a.maxParam:c.max}var e=this,f=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=d(),this.addBar=function(a,b,c){f||b.css({transition:"none"}),this.bars.push(a),a.max=d(),a.title=c&&angular.isDefined(c.title)?c.title:"progressbar",a.$watch("value",function(b){a.recalculatePercentage()}),a.recalculatePercentage=function(){var b=e.bars.reduce(function(a,b){return b.percent=+(100*b.value/b.max).toFixed(2),a+b.percent},0);b>100&&(a.percent-=b-100)},a.$on("$destroy",function(){b=null,e.removeBar(a)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1),this.bars.forEach(function(a){a.recalculatePercentage()})},a.$watch("maxParam",function(a){e.bars.forEach(function(a){a.max=d(),a.recalculatePercentage()})})}]).directive("uibProgress",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",require:"uibProgress",scope:{maxParam:"=?max"},templateUrl:"uib/template/progressbar/progress.html"}}).directive("uibBar",function(){return{replace:!0,transclude:!0,require:"^uibProgress",scope:{value:"=",type:"@"},templateUrl:"uib/template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b,c)}}}).directive("uibProgressbar",function(){return{replace:!0,transclude:!0,controller:"UibProgressController",scope:{value:"=",maxParam:"=?max",type:"@"},templateUrl:"uib/template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]),{title:c.title})}}}),angular.module("ui.bootstrap.rating",[]).constant("uibRatingConfig",{max:5,stateOn:null,stateOff:null,titles:["one","two","three","four","five"]}).controller("UibRatingController",["$scope","$attrs","uibRatingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.titles)?a.$parent.$eval(b.titles):c.titles;this.titles=angular.isArray(f)&&f.length>0?f:c.titles;var g=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(g)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff,title:this.getTitle(b)},a[b]);return a},this.getTitle=function(a){return a>=this.titles.length?a+1:this.titles[a]},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(d.$viewValue===b?0:b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("uibRating",function(){return{require:["uibRating","ngModel"],scope:{readonly:"=?readOnly",onHover:"&",onLeave:"&"},controller:"UibRatingController",templateUrl:"uib/template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("UibTabsetController",["$scope",function(a){function b(a){for(var b=0;b<d.tabs.length;b++)if(d.tabs[b].index===a)return b}var c,d=this;d.tabs=[],d.select=function(a){if(!e){var f=b(c),g=d.tabs[f];g&&(g.tab.onDeselect(),g.tab.active=!1);var h=d.tabs[a];h?(h.tab.onSelect(),h.tab.active=!0,d.active=h.index,c=h.index):!h&&angular.isNumber(c)&&(d.active=null,c=null)}},d.addTab=function(a){if(d.tabs.push({tab:a,index:a.index}),d.tabs.sort(function(a,b){return a.index>b.index?1:a.index<b.index?-1:0}),a.index===d.active||!angular.isNumber(d.active)&&1===d.tabs.length){var c=b(a.index);d.select(c)}},d.removeTab=function(a){var c=b(a.index);if(a.index===d.active){var e=c===d.tabs.length-1?c-1:c+1%d.tabs.length;d.select(e)}d.tabs.splice(c,1)},a.$watch("tabset.active",function(a){angular.isNumber(a)&&a!==c&&d.select(b(a))});var e;a.$on("$destroy",function(){e=!0})}]).directive("uibTabset",function(){return{transclude:!0,replace:!0,scope:{},bindToController:{active:"=?",type:"@"},controller:"UibTabsetController",controllerAs:"tabset",templateUrl:function(a,b){return b.templateUrl||"uib/template/tabs/tabset.html"},link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1,angular.isUndefined(c.active)&&(a.active=0)}}}).directive("uibTab",["$parse",function(a){return{require:"^uibTabset",replace:!0,templateUrl:function(a,b){return b.templateUrl||"uib/template/tabs/tab.html"},transclude:!0,scope:{heading:"@",index:"=?",classes:"@?",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},controllerAs:"tab",link:function(b,c,d,e,f){b.disabled=!1,d.disable&&b.$parent.$watch(a(d.disable),function(a){b.disabled=!!a}),angular.isUndefined(d.index)&&(e.tabs&&e.tabs.length?b.index=Math.max.apply(null,e.tabs.map(function(a){return a.index}))+1:b.index=0),angular.isUndefined(d.classes)&&(b.classes=""),b.select=function(){if(!b.disabled){for(var a,c=0;c<e.tabs.length;c++)if(e.tabs[c].tab===b){a=c;break}e.select(a)}},e.addTab(b),b.$on("$destroy",function(){e.removeTab(b)}),b.$transcludeFn=f}}}]).directive("uibTabHeadingTransclude",function(){return{restrict:"A",require:"^uibTab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}).directive("uibTabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("uib-tab-heading")||a.hasAttribute("data-uib-tab-heading")||a.hasAttribute("x-uib-tab-heading")||"uib-tab-heading"===a.tagName.toLowerCase()||"data-uib-tab-heading"===a.tagName.toLowerCase()||"x-uib-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^uibTabset",link:function(b,c,d){var e=b.$eval(d.uibTabContentTransclude).tab;e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("uibTimepickerConfig",{hourStep:1,minuteStep:1,secondStep:1,showMeridian:!0,showSeconds:!1,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0,showSpinners:!0,templateUrl:"uib/template/timepicker/timepicker.html"}).controller("UibTimepickerController",["$scope","$element","$attrs","$parse","$log","$locale","uibTimepickerConfig",function(a,b,c,d,e,f,g){function h(){var b=+a.hours,c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===u[1]&&(b+=12)),b):void 0}function i(){var b=+a.minutes;return b>=0&&60>b?b:void 0}function j(){var b=+a.seconds;return b>=0&&60>b?b:void 0}function k(a){return null===a?"":angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function l(a){m(),t.$setViewValue(new Date(r)),n(a)}function m(){t.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1,a.invalidSeconds=!1}function n(b){if(t.$modelValue){var c=r.getHours(),d=r.getMinutes(),e=r.getSeconds();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:k(c),"m"!==b&&(a.minutes=k(d)),a.meridian=r.getHours()<12?u[0]:u[1],"s"!==b&&(a.seconds=k(e)),a.meridian=r.getHours()<12?u[0]:u[1]}else a.hours=null,a.minutes=null,a.seconds=null,a.meridian=u[0]}function o(a){r=q(r,a),l()}function p(a,b){return q(a,60*b)}function q(a,b){var c=new Date(a.getTime()+1e3*b),d=new Date(a);return d.setHours(c.getHours(),c.getMinutes(),c.getSeconds()),d}var r=new Date,s=[],t={$setViewValue:angular.noop},u=angular.isDefined(c.meridians)?a.$parent.$eval(c.meridians):g.meridians||f.DATETIME_FORMATS.AMPMS;a.tabindex=angular.isDefined(c.tabindex)?c.tabindex:0,b.removeAttr("tabindex"),this.init=function(b,d){t=b,t.$render=this.render,t.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),f=d.eq(1),h=d.eq(2),i=angular.isDefined(c.mousewheel)?a.$parent.$eval(c.mousewheel):g.mousewheel;i&&this.setupMousewheelEvents(e,f,h);var j=angular.isDefined(c.arrowkeys)?a.$parent.$eval(c.arrowkeys):g.arrowkeys;j&&this.setupArrowkeyEvents(e,f,h),a.readonlyInput=angular.isDefined(c.readonlyInput)?a.$parent.$eval(c.readonlyInput):g.readonlyInput,this.setupInputEvents(e,f,h)};var v=g.hourStep;c.hourStep&&s.push(a.$parent.$watch(d(c.hourStep),function(a){v=+a}));var w=g.minuteStep;c.minuteStep&&s.push(a.$parent.$watch(d(c.minuteStep),function(a){w=+a}));var x;s.push(a.$parent.$watch(d(c.min),function(a){var b=new Date(a);x=isNaN(b)?void 0:b}));var y;s.push(a.$parent.$watch(d(c.max),function(a){var b=new Date(a);y=isNaN(b)?void 0:b}));var z=!1;c.ngDisabled&&s.push(a.$parent.$watch(d(c.ngDisabled),function(a){z=a})),a.noIncrementHours=function(){var a=p(r,60*v);return z||a>y||r>a&&x>a},a.noDecrementHours=function(){var a=p(r,60*-v);return z||x>a||a>r&&a>y},a.noIncrementMinutes=function(){var a=p(r,w);return z||a>y||r>a&&x>a},a.noDecrementMinutes=function(){var a=p(r,-w);return z||x>a||a>r&&a>y},a.noIncrementSeconds=function(){var a=q(r,A);return z||a>y||r>a&&x>a},a.noDecrementSeconds=function(){var a=q(r,-A);return z||x>a||a>r&&a>y},a.noToggleMeridian=function(){return r.getHours()<12?z||p(r,720)>y:z||p(r,-720)<x};var A=g.secondStep;c.secondStep&&s.push(a.$parent.$watch(d(c.secondStep),function(a){A=+a})),a.showSeconds=g.showSeconds,c.showSeconds&&s.push(a.$parent.$watch(d(c.showSeconds),function(b){a.showSeconds=!!b})),a.showMeridian=g.showMeridian,c.showMeridian&&s.push(a.$parent.$watch(d(c.showMeridian),function(b){if(a.showMeridian=!!b,t.$error.time){var c=h(),d=i();angular.isDefined(c)&&angular.isDefined(d)&&(r.setHours(c),l())}else n()})),this.setupMousewheelEvents=function(b,c,d){var e=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){z||a.$apply(e(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){z||a.$apply(e(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()}),d.bind("mousewheel wheel",function(b){z||a.$apply(e(b)?a.incrementSeconds():a.decrementSeconds()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c,d){b.bind("keydown",function(b){z||(38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply()))}),c.bind("keydown",function(b){z||(38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply()))}),d.bind("keydown",function(b){z||(38===b.which?(b.preventDefault(),a.incrementSeconds(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementSeconds(),a.$apply()))})},this.setupInputEvents=function(b,c,d){if(a.readonlyInput)return a.updateHours=angular.noop,a.updateMinutes=angular.noop,void(a.updateSeconds=angular.noop);var e=function(b,c,d){t.$setViewValue(null),t.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c),angular.isDefined(d)&&(a.invalidSeconds=d)};a.updateHours=function(){var a=h(),b=i();t.$setDirty(),angular.isDefined(a)&&angular.isDefined(b)?(r.setHours(a),r.setMinutes(b),x>r||r>y?e(!0):l("h")):e(!0)},b.bind("blur",function(b){t.$setTouched(),null===a.hours||""===a.hours?e(!0):!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=k(a.hours)})}),a.updateMinutes=function(){var a=i(),b=h();t.$setDirty(),angular.isDefined(a)&&angular.isDefined(b)?(r.setHours(b),r.setMinutes(a),x>r||r>y?e(void 0,!0):l("m")):e(void 0,!0)},c.bind("blur",function(b){t.$setTouched(),null===a.minutes?e(void 0,!0):!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=k(a.minutes)})}),a.updateSeconds=function(){var a=j();t.$setDirty(),angular.isDefined(a)?(r.setSeconds(a),l("s")):e(void 0,void 0,!0)},d.bind("blur",function(b){!a.invalidSeconds&&a.seconds<10&&a.$apply(function(){a.seconds=k(a.seconds)})})},this.render=function(){var b=t.$viewValue;isNaN(b)?(t.$setValidity("time",!1),e.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(b&&(r=b),x>r||r>y?(t.$setValidity("time",!1),a.invalidHours=!0,a.invalidMinutes=!0):m(),n())},a.showSpinners=angular.isDefined(c.showSpinners)?a.$parent.$eval(c.showSpinners):g.showSpinners,a.incrementHours=function(){a.noIncrementHours()||o(60*v*60)},a.decrementHours=function(){a.noDecrementHours()||o(60*-v*60)},a.incrementMinutes=function(){a.noIncrementMinutes()||o(60*w)},a.decrementMinutes=function(){a.noDecrementMinutes()||o(60*-w)},a.incrementSeconds=function(){a.noIncrementSeconds()||o(A)},a.decrementSeconds=function(){a.noDecrementSeconds()||o(-A)},a.toggleMeridian=function(){var b=i(),c=h();a.noToggleMeridian()||(angular.isDefined(b)&&angular.isDefined(c)?o(720*(r.getHours()<12?60:-60)):a.meridian=a.meridian===u[0]?u[1]:u[0])},a.blur=function(){t.$setTouched()},a.$on("$destroy",function(){for(;s.length;)s.shift()()})}]).directive("uibTimepicker",["uibTimepickerConfig",function(a){return{require:["uibTimepicker","?^ngModel"],controller:"UibTimepickerController",controllerAs:"timepicker",replace:!0,scope:{},templateUrl:function(b,c){return c.templateUrl||a.templateUrl},link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.debounce","ui.bootstrap.position"]).factory("uibTypeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).controller("UibTypeaheadController",["$scope","$element","$attrs","$compile","$parse","$q","$timeout","$document","$window","$rootScope","$$debounce","$uibPosition","uibTypeaheadParser",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){N.moveInProgress||(N.moveInProgress=!0,N.$digest()),Y()}function o(){N.position=D?l.offset(b):l.position(b),N.position.top+=b.prop("offsetHeight")}var p,q,r=[9,13,27,38,40],s=200,t=a.$eval(c.typeaheadMinLength);t||0===t||(t=1),a.$watch(c.typeaheadMinLength,function(a){t=a||0===a?a:1});var u=a.$eval(c.typeaheadWaitMs)||0,v=a.$eval(c.typeaheadEditable)!==!1;a.$watch(c.typeaheadEditable,function(a){v=a!==!1});var w,x,y=e(c.typeaheadLoading).assign||angular.noop,z=e(c.typeaheadOnSelect),A=angular.isDefined(c.typeaheadSelectOnBlur)?a.$eval(c.typeaheadSelectOnBlur):!1,B=e(c.typeaheadNoResults).assign||angular.noop,C=c.typeaheadInputFormatter?e(c.typeaheadInputFormatter):void 0,D=c.typeaheadAppendToBody?a.$eval(c.typeaheadAppendToBody):!1,E=c.typeaheadAppendTo?a.$eval(c.typeaheadAppendTo):null,F=a.$eval(c.typeaheadFocusFirst)!==!1,G=c.typeaheadSelectOnExact?a.$eval(c.typeaheadSelectOnExact):!1,H=e(c.typeaheadIsOpen).assign||angular.noop,I=a.$eval(c.typeaheadShowHint)||!1,J=e(c.ngModel),K=e(c.ngModel+"($$$p)"),L=function(b,c){return angular.isFunction(J(a))&&q&&q.$options&&q.$options.getterSetter?K(b,{$$$p:c}):J.assign(b,c)},M=m.parse(c.uibTypeahead),N=a.$new(),O=a.$on("$destroy",function(){N.$destroy()});N.$on("$destroy",O);var P="typeahead-"+N.$id+"-"+Math.floor(1e4*Math.random());b.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":P});var Q,R;I&&(Q=angular.element("<div></div>"),Q.css("position","relative"),b.after(Q),R=b.clone(),R.attr("placeholder",""),R.attr("tabindex","-1"),R.val(""),R.css({position:"absolute",top:"0px",left:"0px","border-color":"transparent","box-shadow":"none",opacity:1,background:"none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)",color:"#999"}),b.css({position:"relative","vertical-align":"top","background-color":"transparent"}),Q.append(R),R.after(b));var S=angular.element("<div uib-typeahead-popup></div>");S.attr({id:P,matches:"matches",active:"activeIdx",select:"select(activeIdx, evt)","move-in-progress":"moveInProgress",query:"query",position:"position","assign-is-open":"assignIsOpen(isOpen)",debounce:"debounceUpdate"}),angular.isDefined(c.typeaheadTemplateUrl)&&S.attr("template-url",c.typeaheadTemplateUrl),angular.isDefined(c.typeaheadPopupTemplateUrl)&&S.attr("popup-template-url",c.typeaheadPopupTemplateUrl);var T=function(){I&&R.val("")},U=function(){N.matches=[],N.activeIdx=-1,b.attr("aria-expanded",!1),T()},V=function(a){return P+"-option-"+a};N.$watch("activeIdx",function(a){0>a?b.removeAttr("aria-activedescendant"):b.attr("aria-activedescendant",V(a))});var W=function(a,b){return N.matches.length>b&&a?a.toUpperCase()===N.matches[b].label.toUpperCase():!1},X=function(c,d){var e={$viewValue:c};y(a,!0),B(a,!1),f.when(M.source(a,e)).then(function(f){var g=c===p.$viewValue;if(g&&w)if(f&&f.length>0){N.activeIdx=F?0:-1,B(a,!1),N.matches.length=0;for(var h=0;h<f.length;h++)e[M.itemName]=f[h],N.matches.push({id:V(h),label:M.viewMapper(N,e),model:f[h]});if(N.query=c,o(),b.attr("aria-expanded",!0),G&&1===N.matches.length&&W(c,0)&&(angular.isNumber(N.debounceUpdate)||angular.isObject(N.debounceUpdate)?k(function(){N.select(0,d)},angular.isNumber(N.debounceUpdate)?N.debounceUpdate:N.debounceUpdate["default"]):N.select(0,d)),I){var i=N.matches[0].label;angular.isString(c)&&c.length>0&&i.slice(0,c.length).toUpperCase()===c.toUpperCase()?R.val(c+i.slice(c.length)):R.val("")}}else U(),B(a,!0);g&&y(a,!1)},function(){U(),y(a,!1),B(a,!0)})};D&&(angular.element(i).on("resize",n),h.find("body").on("scroll",n));var Y=k(function(){N.matches.length&&o(),N.moveInProgress=!1},s);N.moveInProgress=!1,N.query=void 0;var Z,$=function(a){Z=g(function(){X(a)},u)},_=function(){Z&&g.cancel(Z)};U(),N.assignIsOpen=function(b){H(a,b)},N.select=function(d,e){var f,h,i={};x=!0,i[M.itemName]=h=N.matches[d].model,f=M.modelMapper(a,i),L(a,f),p.$setValidity("editable",!0),p.$setValidity("parse",!0),z(a,{$item:h,$model:f,$label:M.viewMapper(a,i),$event:e}),U(),N.$eval(c.typeaheadFocusOnSelect)!==!1&&g(function(){b[0].focus()},0,!1)},b.on("keydown",function(a){if(0!==N.matches.length&&-1!==r.indexOf(a.which)){if(-1===N.activeIdx&&(9===a.which||13===a.which)||9===a.which&&a.shiftKey)return U(),void N.$digest();a.preventDefault();var b;switch(a.which){case 9:case 13:N.$apply(function(){angular.isNumber(N.debounceUpdate)||angular.isObject(N.debounceUpdate)?k(function(){N.select(N.activeIdx,a)},angular.isNumber(N.debounceUpdate)?N.debounceUpdate:N.debounceUpdate["default"]):N.select(N.activeIdx,a)});break;case 27:a.stopPropagation(),U(),N.$digest();break;case 38:N.activeIdx=(N.activeIdx>0?N.activeIdx:N.matches.length)-1,N.$digest(),b=S.find("li")[N.activeIdx],b.parentNode.scrollTop=b.offsetTop;break;case 40:N.activeIdx=(N.activeIdx+1)%N.matches.length,N.$digest(),b=S.find("li")[N.activeIdx],b.parentNode.scrollTop=b.offsetTop}}}),b.bind("focus",function(a){w=!0,0!==t||p.$viewValue||g(function(){X(p.$viewValue,a)},0)}),b.bind("blur",function(a){A&&N.matches.length&&-1!==N.activeIdx&&!x&&(x=!0,N.$apply(function(){angular.isObject(N.debounceUpdate)&&angular.isNumber(N.debounceUpdate.blur)?k(function(){N.select(N.activeIdx,a)},N.debounceUpdate.blur):N.select(N.activeIdx,a)})),!v&&p.$error.editable&&(p.$viewValue="",b.val("")),w=!1,x=!1});var aa=function(a){b[0]!==a.target&&3!==a.which&&0!==N.matches.length&&(U(),j.$$phase||N.$digest())};h.on("click",aa),a.$on("$destroy",function(){h.off("click",aa),(D||E)&&ba.remove(),D&&(angular.element(i).off("resize",n),h.find("body").off("scroll",n)),S.remove(),I&&Q.remove()});var ba=d(S)(N);D?h.find("body").append(ba):E?angular.element(E).eq(0).append(ba):b.after(ba),this.init=function(b,c){p=b,q=c,N.debounceUpdate=p.$options&&e(p.$options.debounce)(a),p.$parsers.unshift(function(b){return w=!0,0===t||b&&b.length>=t?u>0?(_(),$(b)):X(b):(y(a,!1),_(),U()),v?b:b?void p.$setValidity("editable",!1):(p.$setValidity("editable",!0),null)}),p.$formatters.push(function(b){var c,d,e={};return v||p.$setValidity("editable",!0),C?(e.$model=b,C(a,e)):(e[M.itemName]=b,c=M.viewMapper(a,e),e[M.itemName]=void 0,d=M.viewMapper(a,e),c!==d?c:b)})}}]).directive("uibTypeahead",function(){return{controller:"UibTypeaheadController",require:["ngModel","^?ngModelOptions","uibTypeahead"],link:function(a,b,c,d){d[2].init(d[0],d[1])}}}).directive("uibTypeaheadPopup",["$$debounce",function(a){return{scope:{matches:"=",query:"=",active:"=",position:"&",moveInProgress:"=",select:"&",assignIsOpen:"&",debounce:"&"},replace:!0,templateUrl:function(a,b){return b.popupTemplateUrl||"uib/template/typeahead/typeahead-popup.html"},link:function(b,c,d){b.templateUrl=d.templateUrl,b.isOpen=function(){var a=b.matches.length>0;return b.assignIsOpen({isOpen:a}),a},b.isActive=function(a){return b.active===a},b.selectActive=function(a){b.active=a},b.selectMatch=function(c,d){var e=b.debounce();angular.isNumber(e)||angular.isObject(e)?a(function(){b.select({activeIdx:c,evt:d})},angular.isNumber(e)?e:e["default"]):b.select({activeIdx:c,evt:d})}}}}]).directive("uibTypeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"uib/template/typeahead/typeahead-match.html";a(g).then(function(a){var c=angular.element(a.trim());e.replaceWith(c),b(c)(d)})}}}]).filter("uibTypeaheadHighlight",["$sce","$injector","$log",function(a,b,c){function d(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function e(a){return/<.*>/g.test(a)}var f;return f=b.has("$sanitize"),function(b,g){return!f&&e(b)&&c.warn("Unsafe use of typeahead please use ngSanitize"),b=g?(""+b).replace(new RegExp(d(g),"gi"),"<strong>$&</strong>"):b,f||(b=a.trustAsHtml(b)),b}}]),angular.module("uib/template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("uib/template/accordion/accordion-group.html",'<div class="panel" ng-class="panelClass || \'panel-default\'">\n  <div role="tab" id="{{::headingId}}" aria-selected="{{isOpen}}" class="panel-heading" ng-keypress="toggleOpen($event)">\n    <h4 class="panel-title">\n      <a role="button" data-toggle="collapse" href aria-expanded="{{isOpen}}" aria-controls="{{::panelId}}" tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span uib-accordion-header ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n    </h4>\n  </div>\n  <div id="{{::panelId}}" aria-labelledby="{{::headingId}}" aria-hidden="{{!isOpen}}" role="tabpanel" class="panel-collapse collapse" uib-collapse="!isOpen">\n    <div class="panel-body" ng-transclude></div>\n  </div>\n</div>\n');
}]),angular.module("uib/template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("uib/template/accordion/accordion.html",'<div role="tablist" class="panel-group" ng-transclude></div>')}]),angular.module("uib/template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("uib/template/alert/alert.html",'<div class="alert" ng-class="[\'alert-\' + (type || \'warning\'), closeable ? \'alert-dismissible\' : null]" role="alert">\n    <button ng-show="closeable" type="button" class="close" ng-click="close({$event: $event})">\n        <span aria-hidden="true">&times;</span>\n        <span class="sr-only">Close</span>\n    </button>\n    <div ng-transclude></div>\n</div>\n')}]),angular.module("uib/template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("uib/template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n  <div class="carousel-inner" ng-transclude></div>\n  <a role="button" href class="left carousel-control" ng-click="prev()" ng-show="slides.length > 1">\n    <span aria-hidden="true" class="glyphicon glyphicon-chevron-left"></span>\n    <span class="sr-only">previous</span>\n  </a>\n  <a role="button" href class="right carousel-control" ng-click="next()" ng-show="slides.length > 1">\n    <span aria-hidden="true" class="glyphicon glyphicon-chevron-right"></span>\n    <span class="sr-only">next</span>\n  </a>\n  <ol class="carousel-indicators" ng-show="slides.length > 1">\n    <li ng-repeat="slide in slides | orderBy:indexOfSlide track by $index" ng-class="{ active: isActive(slide) }" ng-click="select(slide)">\n      <span class="sr-only">slide {{ $index + 1 }} of {{ slides.length }}<span ng-if="isActive(slide)">, currently active</span></span>\n    </li>\n  </ol>\n</div>\n')}]),angular.module("uib/template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("uib/template/carousel/slide.html",'<div ng-class="{\n    \'active\': active\n  }" class="item text-center" ng-transclude></div>\n')}]),angular.module("uib/template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/datepicker.html",'<div class="uib-datepicker" ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n  <uib-daypicker ng-switch-when="day" tabindex="0"></uib-daypicker>\n  <uib-monthpicker ng-switch-when="month" tabindex="0"></uib-monthpicker>\n  <uib-yearpicker ng-switch-when="year" tabindex="0"></uib-yearpicker>\n</div>\n')}]),angular.module("uib/template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/day.html",'<table class="uib-daypicker" role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="{{::5 + showWeeks}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n    <tr>\n      <th ng-if="showWeeks" class="text-center"></th>\n      <th ng-repeat="label in ::labels track by $index" class="text-center"><small aria-label="{{::label.full}}">{{::label.abbr}}</small></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class="uib-weeks" ng-repeat="row in rows track by $index">\n      <td ng-if="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n      <td ng-repeat="dt in row" class="uib-day text-center" role="gridcell"\n        id="{{::dt.uid}}"\n        ng-class="::dt.customClass">\n        <button type="button" class="btn btn-default btn-sm"\n          uib-is-class="\n            \'btn-info\' for selectedDt,\n            \'active\' for activeDt\n            on dt"\n          ng-click="select(dt.date)"\n          ng-disabled="::dt.disabled"\n          tabindex="-1"><span ng-class="::{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{::dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/month.html",'<table class="uib-monthpicker" role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class="uib-months" ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row" class="uib-month text-center" role="gridcell"\n        id="{{::dt.uid}}"\n        ng-class="::dt.customClass">\n        <button type="button" class="btn btn-default"\n          uib-is-class="\n            \'btn-info\' for selectedDt,\n            \'active\' for activeDt\n            on dt"\n          ng-click="select(dt.date)"\n          ng-disabled="::dt.disabled"\n          tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/popup.html",'<div>\n  <ul class="uib-datepicker-popup dropdown-menu uib-position-measure" dropdown-nested ng-if="isOpen" ng-keydown="keydown($event)" ng-click="$event.stopPropagation()">\n    <li ng-transclude></li>\n    <li ng-if="showButtonBar" class="uib-button-bar">\n      <span class="btn-group pull-left">\n        <button type="button" class="btn btn-sm btn-info uib-datepicker-current" ng-click="select(\'today\', $event)" ng-disabled="isDisabled(\'today\')">{{ getText(\'current\') }}</button>\n        <button type="button" class="btn btn-sm btn-danger uib-clear" ng-click="select(null, $event)">{{ getText(\'clear\') }}</button>\n      </span>\n      <button type="button" class="btn btn-sm btn-success pull-right uib-close" ng-click="close($event)">{{ getText(\'close\') }}</button>\n    </li>\n  </ul>\n</div>\n')}]),angular.module("uib/template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("uib/template/datepicker/year.html",'<table class="uib-yearpicker" role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left uib-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="{{::columns - 2}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm uib-title" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right uib-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class="uib-years" ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row" class="uib-year text-center" role="gridcell"\n        id="{{::dt.uid}}"\n        ng-class="::dt.customClass">\n        <button type="button" class="btn btn-default"\n          uib-is-class="\n            \'btn-info\' for selectedDt,\n            \'active\' for activeDt\n            on dt"\n          ng-click="select(dt.date)"\n          ng-disabled="::dt.disabled"\n          tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("uib/template/modal/backdrop.html",'<div class="modal-backdrop"\n     uib-modal-animation-class="fade"\n     modal-in-class="in"\n     ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("uib/template/modal/window.html",[]).run(["$templateCache",function(a){a.put("uib/template/modal/window.html",'<div modal-render="{{$isRendered}}" tabindex="-1" role="dialog" class="modal"\n    uib-modal-animation-class="fade"\n    modal-in-class="in"\n    ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}">\n    <div class="modal-dialog {{size ? \'modal-\' + size : \'\'}}"><div class="modal-content" uib-modal-transclude></div></div>\n</div>\n')}]),angular.module("uib/template/pager/pager.html",[]).run(["$templateCache",function(a){a.put("uib/template/pager/pager.html",'<ul class="pager">\n  <li ng-class="{disabled: noPrevious()||ngDisabled, previous: align}"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n  <li ng-class="{disabled: noNext()||ngDisabled, next: align}"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n</ul>\n')}]),angular.module("uib/template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("uib/template/pagination/pager.html",'<ul class="pager">\n  <li ng-class="{disabled: noPrevious()||ngDisabled, previous: align}"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n  <li ng-class="{disabled: noNext()||ngDisabled, next: align}"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n</ul>\n')}]),angular.module("uib/template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("uib/template/pagination/pagination.html",'<ul class="pagination">\n  <li ng-if="::boundaryLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-first"><a href ng-click="selectPage(1, $event)">{{::getText(\'first\')}}</a></li>\n  <li ng-if="::directionLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-prev"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n  <li ng-repeat="page in pages track by $index" ng-class="{active: page.active,disabled: ngDisabled&&!page.active}" class="pagination-page"><a href ng-click="selectPage(page.number, $event)">{{page.text}}</a></li>\n  <li ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n  <li ng-if="::boundaryLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-last"><a href ng-click="selectPage(totalPages, $event)">{{::getText(\'last\')}}</a></li>\n</ul>\n')}]),angular.module("uib/template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/tooltip/tooltip-html-popup.html",'<div class="tooltip"\n  tooltip-animation-class="fade"\n  uib-tooltip-classes\n  ng-class="{ in: isOpen() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" ng-bind-html="contentExp()"></div>\n</div>\n')}]),angular.module("uib/template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/tooltip/tooltip-popup.html",'<div class="tooltip"\n  tooltip-animation-class="fade"\n  uib-tooltip-classes\n  ng-class="{ in: isOpen() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("uib/template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/tooltip/tooltip-template-popup.html",'<div class="tooltip"\n  tooltip-animation-class="fade"\n  uib-tooltip-classes\n  ng-class="{ in: isOpen() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner"\n    uib-tooltip-template-transclude="contentExp()"\n    tooltip-template-transclude-scope="originScope()"></div>\n</div>\n')}]),angular.module("uib/template/popover/popover-html.html",[]).run(["$templateCache",function(a){a.put("uib/template/popover/popover-html.html",'<div class="popover"\n  tooltip-animation-class="fade"\n  uib-tooltip-classes\n  ng-class="{ in: isOpen() }">\n  <div class="arrow"></div>\n\n  <div class="popover-inner">\n      <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n      <div class="popover-content" ng-bind-html="contentExp()"></div>\n  </div>\n</div>\n')}]),angular.module("uib/template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("uib/template/popover/popover-template.html",'<div class="popover"\n  tooltip-animation-class="fade"\n  uib-tooltip-classes\n  ng-class="{ in: isOpen() }">\n  <div class="arrow"></div>\n\n  <div class="popover-inner">\n      <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n      <div class="popover-content"\n        uib-tooltip-template-transclude="contentExp()"\n        tooltip-template-transclude-scope="originScope()"></div>\n  </div>\n</div>\n')}]),angular.module("uib/template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("uib/template/popover/popover.html",'<div class="popover"\n  tooltip-animation-class="fade"\n  uib-tooltip-classes\n  ng-class="{ in: isOpen() }">\n  <div class="arrow"></div>\n\n  <div class="popover-inner">\n      <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n      <div class="popover-content" ng-bind="content"></div>\n  </div>\n</div>\n')}]),angular.module("uib/template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("uib/template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" ng-transclude></div>\n')}]),angular.module("uib/template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("uib/template/progressbar/progress.html",'<div class="progress" ng-transclude aria-labelledby="{{::title}}"></div>')}]),angular.module("uib/template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("uib/template/progressbar/progressbar.html",'<div class="progress">\n  <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" aria-labelledby="{{::title}}" ng-transclude></div>\n</div>\n')}]),angular.module("uib/template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("uib/template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n    <span ng-repeat-start="r in range track by $index" class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n    <i ng-repeat-end ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')" ng-attr-title="{{r.title}}" aria-valuetext="{{r.title}}"></i>\n</span>\n')}]),angular.module("uib/template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("uib/template/tabs/tab.html",'<li ng-class="[{active: active, disabled: disabled}, classes]" class="uib-tab nav-item">\n  <a href ng-click="select()" class="nav-link" uib-tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("uib/template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("uib/template/tabs/tabset.html",'<div>\n  <ul class="nav nav-{{tabset.type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n  <div class="tab-content">\n    <div class="tab-pane"\n         ng-repeat="tab in tabset.tabs"\n         ng-class="{active: tabset.active === tab.index}"\n         uib-tab-content-transclude="tab">\n    </div>\n  </div>\n</div>\n')}]),angular.module("uib/template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("uib/template/timepicker/timepicker.html",'<table class="uib-timepicker">\n  <tbody>\n    <tr class="text-center" ng-show="::showSpinners">\n      <td class="uib-increment hours"><a ng-click="incrementHours()" ng-class="{disabled: noIncrementHours()}" class="btn btn-link" ng-disabled="noIncrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n      <td>&nbsp;</td>\n      <td class="uib-increment minutes"><a ng-click="incrementMinutes()" ng-class="{disabled: noIncrementMinutes()}" class="btn btn-link" ng-disabled="noIncrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n      <td ng-show="showSeconds">&nbsp;</td>\n      <td ng-show="showSeconds" class="uib-increment seconds"><a ng-click="incrementSeconds()" ng-class="{disabled: noIncrementSeconds()}" class="btn btn-link" ng-disabled="noIncrementSeconds()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n      <td ng-show="showMeridian"></td>\n    </tr>\n    <tr>\n      <td class="form-group uib-time hours" ng-class="{\'has-error\': invalidHours}">\n        <input style="width:50px;" type="text" placeholder="HH" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementHours()" ng-blur="blur()">\n      </td>\n      <td class="uib-separator">:</td>\n      <td class="form-group uib-time minutes" ng-class="{\'has-error\': invalidMinutes}">\n        <input style="width:50px;" type="text" placeholder="MM" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementMinutes()" ng-blur="blur()">\n      </td>\n      <td ng-show="showSeconds" class="uib-separator">:</td>\n      <td class="form-group uib-time seconds" ng-class="{\'has-error\': invalidSeconds}" ng-show="showSeconds">\n        <input style="width:50px;" type="text" placeholder="SS" ng-model="seconds" ng-change="updateSeconds()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2" tabindex="{{::tabindex}}" ng-disabled="noIncrementSeconds()" ng-blur="blur()">\n      </td>\n      <td ng-show="showMeridian" class="uib-time am-pm"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()" ng-disabled="noToggleMeridian()" tabindex="{{::tabindex}}">{{meridian}}</button></td>\n    </tr>\n    <tr class="text-center" ng-show="::showSpinners">\n      <td class="uib-decrement hours"><a ng-click="decrementHours()" ng-class="{disabled: noDecrementHours()}" class="btn btn-link" ng-disabled="noDecrementHours()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n      <td>&nbsp;</td>\n      <td class="uib-decrement minutes"><a ng-click="decrementMinutes()" ng-class="{disabled: noDecrementMinutes()}" class="btn btn-link" ng-disabled="noDecrementMinutes()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n      <td ng-show="showSeconds">&nbsp;</td>\n      <td ng-show="showSeconds" class="uib-decrement seconds"><a ng-click="decrementSeconds()" ng-class="{disabled: noDecrementSeconds()}" class="btn btn-link" ng-disabled="noDecrementSeconds()" tabindex="{{::tabindex}}"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n      <td ng-show="showMeridian"></td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("uib/template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("uib/template/typeahead/typeahead-match.html",'<a href\n   tabindex="-1"\n   ng-bind-html="match.label | uibTypeaheadHighlight:query"\n   ng-attr-title="{{match.label}}"></a>\n')}]),angular.module("uib/template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("uib/template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen() && !moveInProgress" ng-style="{top: position().top+\'px\', left: position().left+\'px\'}" role="listbox" aria-hidden="{{!isOpen()}}">\n    <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index, $event)" role="option" id="{{::match.id}}">\n        <div uib-typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n    </li>\n</ul>\n')}]),angular.module("ui.bootstrap.carousel").run(function(){!angular.$$csp().noInlineStyle&&angular.element(document).find("head").prepend('<style type="text/css">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>')}),angular.module("ui.bootstrap.position").run(function(){!angular.$$csp().noInlineStyle&&angular.element(document).find("head").prepend('<style type="text/css">.uib-position-measure{display:block !important;visibility:hidden !important;position:absolute !important;top:-9999px !important;left:-9999px !important;}.uib-position-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll;}</style>')}),angular.module("ui.bootstrap.datepicker").run(function(){!angular.$$csp().noInlineStyle&&angular.element(document).find("head").prepend('<style type="text/css">.uib-datepicker .uib-title{width:100%;}.uib-day button,.uib-month button,.uib-year button{min-width:100%;}.uib-datepicker-popup.dropdown-menu{display:block;float:none;margin:0;}.uib-button-bar{padding:10px 9px 2px;}.uib-left,.uib-right{width:100%}</style>')}),angular.module("ui.bootstrap.tooltip").run(function(){!angular.$$csp().noInlineStyle&&angular.element(document).find("head").prepend('<style type="text/css">[uib-tooltip-popup].tooltip.top-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.top-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-left > .tooltip-arrow,[uib-tooltip-popup].tooltip.bottom-right > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.left-bottom > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-top > .tooltip-arrow,[uib-tooltip-popup].tooltip.right-bottom > .tooltip-arrow,[uib-popover-popup].popover.top-left > .arrow,[uib-popover-popup].popover.top-right > .arrow,[uib-popover-popup].popover.bottom-left > .arrow,[uib-popover-popup].popover.bottom-right > .arrow,[uib-popover-popup].popover.left-top > .arrow,[uib-popover-popup].popover.left-bottom > .arrow,[uib-popover-popup].popover.right-top > .arrow,[uib-popover-popup].popover.right-bottom > .arrow{top:auto;bottom:auto;left:auto;right:auto;margin:0;}[uib-popover-popup].popover,[uib-popover-template-popup].popover{display:block !important;}</style>')}),angular.module("ui.bootstrap.timepicker").run(function(){!angular.$$csp().noInlineStyle&&angular.element(document).find("head").prepend('<style type="text/css">.uib-time input{width:50px;}</style>')}),angular.module("ui.bootstrap.typeahead").run(function(){!angular.$$csp().noInlineStyle&&angular.element(document).find("head").prepend('<style type="text/css">[uib-typeahead-popup].dropdown-menu{display:block;}</style>')});;
/*
 AngularJS v1.5.0
 (c) 2010-2016 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(A,d,B){'use strict';function l(){return["$animate",function(v){return{restrict:"AE",transclude:"element",priority:1,terminal:!0,require:"^^ngMessages",link:function(n,r,a,b,m){var k=r[0],f,p=a.ngMessage||a.when;a=a.ngMessageExp||a.whenExp;var d=function(a){f=a?w(a)?a:a.split(/[\s,]+/):null;b.reRender()};a?(d(n.$eval(a)),n.$watchCollection(a,d)):d(p);var e,q;b.register(k,q={test:function(a){var g=f;a=g?w(g)?0<=g.indexOf(a):g.hasOwnProperty(a):void 0;return a},attach:function(){e||m(n,function(a){v.enter(a,
null,r);e=a;var g=e.$$attachId=b.getAttachId();e.on("$destroy",function(){e&&e.$$attachId===g&&(b.deregister(k),q.detach())})})},detach:function(){if(e){var a=e;e=null;v.leave(a)}}})}}}]}var w=d.isArray,x=d.forEach,y=d.isString,z=d.element;d.module("ngMessages",[]).directive("ngMessages",["$animate",function(d){function n(a,b){return y(b)&&0===b.length||r(a.$eval(b))}function r(a){return y(a)?a.length:!!a}return{require:"ngMessages",restrict:"AE",controller:["$element","$scope","$attrs",function(a,
b,m){function k(a,b){for(var c=b,f=[];c&&c!==a;){var h=c.$$ngMessageNode;if(h&&h.length)return e[h];c.childNodes.length&&-1==f.indexOf(c)?(f.push(c),c=c.childNodes[c.childNodes.length-1]):c=c.previousSibling||c.parentNode}}var f=this,p=0,l=0;this.getAttachId=function(){return l++};var e=this.messages={},q,s;this.render=function(g){g=g||{};q=!1;s=g;for(var e=n(b,m.ngMessagesMultiple)||n(b,m.multiple),c=[],k={},h=f.head,p=!1,l=0;null!=h;){l++;var t=h.message,u=!1;p||x(g,function(a,c){!u&&r(a)&&t.test(c)&&
!k[c]&&(u=k[c]=!0,t.attach())});u?p=!e:c.push(t);h=h.next}x(c,function(a){a.detach()});c.length!==l?d.setClass(a,"ng-active","ng-inactive"):d.setClass(a,"ng-inactive","ng-active")};b.$watchCollection(m.ngMessages||m["for"],f.render);this.reRender=function(){q||(q=!0,b.$evalAsync(function(){q&&s&&f.render(s)}))};this.register=function(g,b){var c=p.toString();e[c]={message:b};var d=a[0],h=e[c];f.head?(d=k(d,g))?(h.next=d.next,d.next=h):(h.next=f.head,f.head=h):f.head=h;g.$$ngMessageNode=c;p++;f.reRender()};
this.deregister=function(b){var d=b.$$ngMessageNode;delete b.$$ngMessageNode;var c=e[d];(b=k(a[0],b))?b.next=c.next:f.head=c.next;delete e[d];f.reRender()}}]}}]).directive("ngMessagesInclude",["$templateRequest","$document","$compile",function(d,n,l){return{restrict:"AE",require:"^^ngMessages",link:function(a,b,m){var k=m.ngMessagesInclude||m.src;d(k).then(function(d){l(d)(a,function(a){b.after(a);a=z(n[0].createComment(" ngMessagesInclude: "+k+" "));b.after(a);b.remove()})})}}}]).directive("ngMessage",
l()).directive("ngMessageExp",l())})(window,window.angular);
//# sourceMappingURL=angular-messages.min.js.map
;
/**
 * Autofill event polyfill ##version:1.0.0##
 * (c) 2014 Google, Inc.
 * License: MIT
 */
(function(window) {
  var $ = window.jQuery || window.angular.element;
  var rootElement = window.document.documentElement,
    $rootElement = $(rootElement);

  addGlobalEventListener('change', markValue);
  addValueChangeByJsListener(markValue);

  $.prototype.checkAndTriggerAutoFillEvent = jqCheckAndTriggerAutoFillEvent;

  // Need to use blur and not change event
  // as Chrome does not fire change events in all cases an input is changed
  // (e.g. when starting to type and then finish the input by auto filling a username)
  addGlobalEventListener('blur', function(target) {
    // setTimeout needed for Chrome as it fills other
    // form fields a little later...
    window.setTimeout(function() {
      findParentForm(target).find('input').checkAndTriggerAutoFillEvent();
    }, 20);
  });

  function DOMContentLoadedListener() {
    // mark all values that are present when the DOM is ready.
    // We don't need to trigger a change event here,
    // as js libs start with those values already being set!
    forEach(document.getElementsByTagName('input'), markValue);

    // The timeout is needed for Chrome as it auto fills
    // login forms some time after DOMContentLoaded!
    window.setTimeout(function() {
      $rootElement.find('input').checkAndTriggerAutoFillEvent();
    }, 200);
  }

  // IE8 compatibility issue
  if(!window.document.addEventListener){
    window.document.attachEvent('DOMContentLoaded', DOMContentLoadedListener);    
  }else{
    window.document.addEventListener('DOMContentLoaded', DOMContentLoadedListener, false);
  }

  return;

  // ----------

  function jqCheckAndTriggerAutoFillEvent() {
    var i, el;
    for (i=0; i<this.length; i++) {
      el = this[i];
      if (!valueMarked(el)) {
        markValue(el);
        triggerChangeEvent(el);
      }
    }
  }

  function valueMarked(el) {
    if (! ("$$currentValue" in el) ) {
      // First time we see an element we take it's value attribute
      // as real value. This might have been filled in the backend,
      // ...
      // Note: it's important to not use the value property here!
      el.$$currentValue = el.getAttribute('value');
    }

    var val = el.value,
         $$currentValue = el.$$currentValue;
    if (!val && !$$currentValue) {
      return true;
    }
    return val === $$currentValue;
  }

  function markValue(el) {
    el.$$currentValue = el.value;
  }

  function addValueChangeByJsListener(listener) {
    var jq = window.jQuery || window.angular.element,
        jqProto = jq.prototype;
    var _val = jqProto.val;
    jqProto.val = function(newValue) {
      var res = _val.apply(this, arguments);
      if (arguments.length > 0) {
        forEach(this, function(el) {
          listener(el, newValue);
        });
      }
      return res;
    };
  }

  function addGlobalEventListener(eventName, listener) {
    // Use a capturing event listener so that
    // we also get the event when it's stopped!
    // Also, the blur event does not bubble.
    if(!rootElement.addEventListener){
      rootElement.attachEvent(eventName, onEvent);      
    }else{
      rootElement.addEventListener(eventName, onEvent, true);
    }

    function onEvent(event) {
      var target = event.target;
      listener(target);
    }
  }

  function findParentForm(el) {
    while (el) {
      if (el.nodeName === 'FORM') {
        return $(el);
      }
      el = el.parentNode;
    }
    return $();
  }

  function forEach(arr, listener) {
    if (arr.forEach) {
      return arr.forEach(listener);
    }
    var i;
    for (i=0; i<arr.length; i++) {
      listener(arr[i]);
    }
  }

  function triggerChangeEvent(element) {
    var doc = window.document;
    var event = doc.createEvent("HTMLEvents");
    event.initEvent("change", true, true);
    element.dispatchEvent(event);
  }



})(window);
;
!function (a, b) { "use strict"; "function" == typeof define && define.amd ? define(["angular"], b) : "object" == typeof exports ? (b(require("angular")), module.exports = "ngStorage") : b(a.angular) }(this, function (a) { "use strict"; function b(a, b) { var c; try { c = a[b] } catch (a) { c = !1 } if (c) { var d = "__" + Math.round(1e7 * Math.random()); try { a[b].setItem(d, d), a[b].removeItem(d, d) } catch (a) { c = !1 } } return c } function c(c) { var d = b(window, c); return function () { var e = "ngStorage-"; this.setKeyPrefix = function (a) { if ("string" != typeof a) throw new TypeError("[ngStorage] - " + c + "Provider.setKeyPrefix() expects a String."); e = a }; var f = a.toJson, g = a.fromJson; this.setSerializer = function (a) { if ("function" != typeof a) throw new TypeError("[ngStorage] - " + c + "Provider.setSerializer expects a function."); f = a }, this.setDeserializer = function (a) { if ("function" != typeof a) throw new TypeError("[ngStorage] - " + c + "Provider.setDeserializer expects a function."); g = a }, this.supported = function () { return !!d }, this.get = function (a) { return d && g(d.getItem(e + a)) }, this.set = function (a, b) { return d && d.setItem(e + a, f(b)) }, this.remove = function (a) { d && d.removeItem(e + a) }, this.$get = ["$rootScope", "$window", "$log", "$timeout", "$document", function (d, h, i, j, k) { var p, q, l = e.length, m = b(h, c), n = m || (i.warn("This browser does not support Web Storage!"), { setItem: a.noop, getItem: a.noop, removeItem: a.noop }), o = { $default: function (b) { for (var c in b) a.isDefined(o[c]) || (o[c] = a.copy(b[c])); return o.$sync(), o }, $reset: function (a, b) { for (var c in o) "$" === c[0] || delete o[c] && n.removeItem(e + c); return b && b(), o.$default(a) }, $sync: function () { for (var c, a = 0, b = n.length; a < b; a++) (c = n.key(a)) && e === c.slice(0, l) && (o[c.slice(l)] = g(n.getItem(c))) }, $apply: function () { var b; if (q = null, !a.equals(o, p)) { b = a.copy(p), a.forEach(o, function (c, d) { a.isDefined(c) && "$" !== d[0] && (n.setItem(e + d, f(c)), delete b[d]) }); for (var c in b) n.removeItem(e + c); p = a.copy(o) } }, $supported: function () { return !!m } }; return o.$sync(), p = a.copy(o), d.$watch(function () { q || (q = j(o.$apply, 100, !1)) }), h.addEventListener && h.addEventListener("storage", function (b) { if (b.key) { var c = k[0]; c.hasFocus && c.hasFocus() || e !== b.key.slice(0, l) || (b.newValue ? o[b.key.slice(l)] = g(b.newValue) : delete o[b.key.slice(l)], p = a.copy(o), d.$apply()) } }), h.addEventListener && h.addEventListener("beforeunload", function () { o.$apply() }), o }] } } return a = a && a.module ? a : window.angular, a.module("ngStorage", []).provider("$localStorage", c("localStorage")).provider("$sessionStorage", c("sessionStorage")) });;
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.angularCreditCards = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
exports = module.exports = ap;
function ap (args, fn) {
    return function () {
        var rest = [].slice.call(arguments)
            , first = args.slice()
        first.push.apply(first, rest)
        return fn.apply(this, first);
    };
}

exports.pa = pa;
function pa (args, fn) {
    return function () {
        var rest = [].slice.call(arguments)
        rest.push.apply(rest, args)
        return fn.apply(this, rest);
    };
}

exports.apa = apa;
function apa (left, right, fn) {
    return function () {
        return fn.apply(this,
            left.concat.apply(left, arguments).concat(right)
        );
    };
}

exports.partial = partial;
function partial (fn) {
    var args = [].slice.call(arguments, 1);
    return ap(args, fn);
}

exports.partialRight = partialRight;
function partialRight (fn) {
    var args = [].slice.call(arguments, 1);
    return pa(args, fn);
}

exports.curry = curry;
function curry (fn) {
    return partial(partial, fn);
}

exports.curryRight = function curryRight (fn) {
    return partial(partialRight, fn);
}

},{}],2:[function(_dereq_,module,exports){
var upperCase = _dereq_('upper-case')
var sentenceCase = _dereq_('sentence-case')

/**
 * Camel case a string.
 *
 * @param  {String} string
 * @param  {String} [locale]
 * @return {String}
 */
module.exports = function (string, locale) {
  return sentenceCase(string, locale)
    // Replace periods between numeric entities with an underscore.
    .replace(/(\d) (?=\d)/g, '$1_')
    // Replace spaces between words with an upper cased character.
    .replace(/ (.)/g, function (m, $1) {
      return upperCase($1, locale)
    })
}

},{"sentence-case":23,"upper-case":27}],3:[function(_dereq_,module,exports){
'use strict'

var isArray = _dereq_('isarray')

module.exports = function castArray (value) {
  return isArray(value) ? value : [value]
}

},{"isarray":18}],4:[function(_dereq_,module,exports){
'use strict'

var types = exports.types = _dereq_('./src/types')
exports.Type = _dereq_('./src/type')

exports.find = function findCardType (callback) {
  for (var typeName in types) {
    var type = types[typeName]
    var result = callback(type)
    if (result) return type
  }
}

},{"./src/type":5,"./src/types":6}],5:[function(_dereq_,module,exports){
'use strict'

var extend = _dereq_('xtend/mutable')

module.exports = CardType

function CardType (name, config) {
  extend(this, {name: name}, config)
}

CardType.prototype.cvcLength = 3
CardType.prototype.luhn = true
CardType.prototype.groupPattern = /(\d{1,4})(\d{1,4})?(\d{1,4})?(\d{1,4})?/

CardType.prototype.group = function (number) {
  return (number.match(this.groupPattern) || [])
    .slice(1)
    .filter(Boolean)
}

CardType.prototype.test = function (number, eager) {
  return this[eager ? 'eagerPattern' : 'pattern'].test(number)
}

},{"xtend/mutable":29}],6:[function(_dereq_,module,exports){
'use strict'

var Type = _dereq_('./type')

var group19 = /(\d{1,4})(\d{1,4})?(\d{1,4})?(\d{1,4})?(\d{1,3})?/

exports.visa = new Type('Visa', {
  pattern: /^4\d{12}(\d{3}|\d{6})?$/,
  eagerPattern: /^4/,
  groupPattern: group19
})

exports.maestro = new Type('Maestro', {
  pattern: /^(?:5[06789]\d\d|(?!6011[0234])(?!60117[4789])(?!60118[6789])(?!60119)(?!64[456789])(?!65)6\d{3})\d{8,15}$/,
  eagerPattern: /^(5(018|0[23]|[68])|6[37]|60111|60115|60117([56]|7[56])|60118[0-5]|64[0-3]|66)/,
  groupPattern: group19
})

exports.forbrugsforeningen = new Type('Forbrugsforeningen', {
  pattern: /^600722\d{10}$/,
  eagerPattern: /^600/
})

exports.dankort = new Type('Dankort', {
  pattern: /^5019\d{12}$/,
  eagerPattern: /^5019/
})

exports.masterCard = new Type('MasterCard', {
  pattern: /^(5[1-5]|2[2-7])\d{14}$/,
  eagerPattern: /^(2|5[1-5])/
})

exports.americanExpress = new Type('American Express', {
  pattern: /^3[47]\d{13}$/,
  eagerPattern: /^3[47]/,
  groupPattern: /(\d{1,4})(\d{1,6})?(\d{1,5})?/,
  cvcLength: 4
})

exports.dinersClub = new Type('Diners Club', {
  pattern: /^3(0[0-5]|[68]\d)\d{11}$/,
  eagerPattern: /^3(0|[68])/,
  groupPattern: /(\d{1,4})?(\d{1,6})?(\d{1,4})?/
})

exports.discover = new Type('Discover', {
  pattern: /^6(011(0[0-9]|[2-4]\d|74|7[7-9]|8[6-9]|9[0-9])|4[4-9]\d{3}|5\d{4})\d{10}$/,
  eagerPattern: /^6(011(0[0-9]|[2-4]|74|7[7-9]|8[6-9]|9[0-9])|4[4-9]|5)/
})

exports.jcb = new Type('JCB', {
  pattern: /^35\d{14}$/,
  eagerPattern: /^35/
})

exports.unionPay = new Type('UnionPay', {
  pattern: /^62[0-5]\d{13,16}$/,
  eagerPattern: /^62/,
  groupPattern: group19,
  luhn: false
})

},{"./type":5}],7:[function(_dereq_,module,exports){
'use strict'

exports.card = _dereq_('./src/card')
exports.cvc = _dereq_('./src/cvc')
exports.expiration = _dereq_('./src/expiration')

},{"./src/card":8,"./src/cvc":9,"./src/expiration":10}],8:[function(_dereq_,module,exports){
'use strict'

var luhn = _dereq_('fast-luhn')
var types = _dereq_('./types')

module.exports = {
  types: types,
  parse: parseCard,
  format: formatCard,
  type: cardType,
  luhn: luhn,
  isValid: isCardValid
}

function parseCard (number) {
  if (typeof number !== 'string') return ''
  return number.replace(/[^\d]/g, '')
}

function formatCard (number, separator) {
  var type = getType(number, true)
  if (!type) return number
  return type.group(number).join(separator || ' ')
}

function cardType (number, eager) {
  var type = getType(number, eager)
  return type ? type.name : undefined
}

function isCardValid (number, type) {
  if (type) {
    type = types.get(type)
  } else {
    type = getType(number)
  }
  if (!type) return false
  return (!type.luhn || luhn(number)) && type.test(number)
}

function getType (number, eager) {
  return types.find(function (type) {
    return type.test(number, eager)
  })
}

},{"./types":11,"fast-luhn":13}],9:[function(_dereq_,module,exports){
'use strict'

var types = _dereq_('./types')
var cvcRegex = /^\d{3,4}$/

module.exports = {
  isValid: cvcIsValid
}

function cvcIsValid (cvc, type) {
  if (typeof cvc !== 'string') return false
  if (!cvcRegex.test(cvc)) return false
  if (!type) return true
  return types.get(type).cvcLength === cvc.length
}

},{"./types":11}],10:[function(_dereq_,module,exports){
'use strict'

var isValidMonth = _dereq_('is-valid-month')
var parseIntStrict = _dereq_('parse-int')
var parseYear = _dereq_('parse-year')

module.exports = {
  isPast: isPast,
  month: {
    parse: parseMonth,
    isValid: isValidMonth
  },
  year: {
    parse: parseYear,
    format: formatExpYear,
    isValid: isExpYearValid,
    isPast: isExpYearPast
  }
}

function isPast (month, year) {
  return Date.now() >= new Date(year, month)
}

function parseMonth (month) {
  return parseIntStrict(month)
}

function formatExpYear (year, strip) {
  year = year.toString()
  return strip ? year.substr(2, 4) : year
}

function isExpYearValid (year) {
  if (typeof year !== 'number') return false
  year = parseIntStrict(year)
  return year > 0
}

function isExpYearPast (year) {
  return new Date().getFullYear() > year
}

},{"is-valid-month":17,"parse-int":21,"parse-year":22}],11:[function(_dereq_,module,exports){
'use strict'

var ccTypes = _dereq_('creditcards-types')
var camel = _dereq_('camel-case')
var extend = _dereq_('xtend')

module.exports = extend(ccTypes, {
  get: function getTypeByName (name) {
    return ccTypes.types[camel(name)]
  }
})

},{"camel-case":2,"creditcards-types":4,"xtend":28}],12:[function(_dereq_,module,exports){
'use strict'

var zeroFill = _dereq_('zero-fill')
var parseIntStrict = _dereq_('parse-int')

var pad = zeroFill(2)

module.exports = function expandYear (year, now) {
  now = now || new Date()
  var base = now.getFullYear().toString().substr(0, 2)
  year = parseIntStrict(year)
  return parseIntStrict(base + pad(year))
}

},{"parse-int":21,"zero-fill":30}],13:[function(_dereq_,module,exports){
'use strict'

module.exports = (function (array) {
  return function luhn (number) {
    if (!number) return false
    var length = number.length
    var bit = 1
    var sum = 0
    var value

    while (length) {
      value = parseInt(number.charAt(--length), 10)
      sum += (bit ^= 1) ? array[value] : value
    }

    return !!sum && sum % 10 === 0
  }
}([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]))

},{}],14:[function(_dereq_,module,exports){
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    var bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};


},{}],15:[function(_dereq_,module,exports){
'use strict';
var numberIsNan = _dereq_('number-is-nan');

module.exports = Number.isFinite || function (val) {
	return !(typeof val !== 'number' || numberIsNan(val) || val === Infinity || val === -Infinity);
};

},{"number-is-nan":20}],16:[function(_dereq_,module,exports){
// https://github.com/paulmillr/es6-shim
// http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isinteger
var isFinite = _dereq_("is-finite");
module.exports = Number.isInteger || function(val) {
  return typeof val === "number" &&
    isFinite(val) &&
    Math.floor(val) === val;
};

},{"is-finite":15}],17:[function(_dereq_,module,exports){
'use strict'

var isInteger = _dereq_('is-integer')

module.exports = function isValidMonth (month) {
  if (typeof month !== 'number' || !isInteger(month)) return false
  return month >= 1 && month <= 12
}

},{"is-integer":16}],18:[function(_dereq_,module,exports){
module.exports = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) == '[object Array]';
};

},{}],19:[function(_dereq_,module,exports){
/**
 * Special language-specific overrides.
 *
 * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt
 *
 * @type {Object}
 */
var LANGUAGES = {
  tr: {
    regexp: /\u0130|\u0049|\u0049\u0307/g,
    map: {
      '\u0130': '\u0069',
      '\u0049': '\u0131',
      '\u0049\u0307': '\u0069'
    }
  },
  az: {
    regexp: /[\u0130]/g,
    map: {
      '\u0130': '\u0069',
      '\u0049': '\u0131',
      '\u0049\u0307': '\u0069'
    }
  },
  lt: {
    regexp: /[\u0049\u004A\u012E\u00CC\u00CD\u0128]/g,
    map: {
      '\u0049': '\u0069\u0307',
      '\u004A': '\u006A\u0307',
      '\u012E': '\u012F\u0307',
      '\u00CC': '\u0069\u0307\u0300',
      '\u00CD': '\u0069\u0307\u0301',
      '\u0128': '\u0069\u0307\u0303'
    }
  }
}

/**
 * Lowercase a string.
 *
 * @param  {String} str
 * @return {String}
 */
module.exports = function (str, locale) {
  var lang = LANGUAGES[locale]

  str = str == null ? '' : String(str)

  if (lang) {
    str = str.replace(lang.regexp, function (m) { return lang.map[m] })
  }

  return str.toLowerCase()
}

},{}],20:[function(_dereq_,module,exports){
'use strict';
module.exports = Number.isNaN || function (x) {
	return x !== x;
};

},{}],21:[function(_dereq_,module,exports){
'use strict'

var isInteger = _dereq_('is-integer')

module.exports = function parseIntStrict (int) {
  if (typeof int === 'number') {
    return isInteger(int) ? int : undefined
  }
  if (typeof int === 'string') {
    return /^\d+$/.test(int) ? parseInt(int, 10) : undefined
  }
}

},{"is-integer":16}],22:[function(_dereq_,module,exports){
'use strict'

var parseIntStrict = _dereq_('parse-int')
var expandYear = _dereq_('expand-year')

module.exports = function parseYear (year, expand, now) {
  year = parseIntStrict(year)
  if (year == null) return
  if (!expand) return year
  return expandYear(year, now)
}

},{"expand-year":12,"parse-int":21}],23:[function(_dereq_,module,exports){
var lowerCase = _dereq_('lower-case')

var NON_WORD_REGEXP = _dereq_('./vendor/non-word-regexp')
var CAMEL_CASE_REGEXP = _dereq_('./vendor/camel-case-regexp')
var TRAILING_DIGIT_REGEXP = _dereq_('./vendor/trailing-digit-regexp')

/**
 * Sentence case a string.
 *
 * @param  {String} str
 * @param  {String} locale
 * @param  {String} replacement
 * @return {String}
 */
module.exports = function (str, locale, replacement) {
  if (str == null) {
    return ''
  }

  replacement = replacement || ' '

  function replace (match, index, string) {
    if (index === 0 || index === (string.length - match.length)) {
      return ''
    }

    return replacement
  }

  str = String(str)
    // Support camel case ("camelCase" -> "camel Case").
    .replace(CAMEL_CASE_REGEXP, '$1 $2')
    // Support digit groups ("test2012" -> "test 2012").
    .replace(TRAILING_DIGIT_REGEXP, '$1 $2')
    // Remove all non-word characters and replace with a single space.
    .replace(NON_WORD_REGEXP, replace)

  // Lower case the entire string.
  return lowerCase(str, locale)
}

},{"./vendor/camel-case-regexp":24,"./vendor/non-word-regexp":25,"./vendor/trailing-digit-regexp":26,"lower-case":19}],24:[function(_dereq_,module,exports){
module.exports = /([\u0061-\u007A\u00B5\u00DF-\u00F6\u00F8-\u00FF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0561-\u0587\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7FA\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A])([\u0041-\u005A\u00C0-\u00D6\u00D8-\u00DE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA\uFF21-\uFF3A\u0030-\u0039\u00B2\u00B3\u00B9\u00BC-\u00BE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D66-\u0D75\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19])/g

},{}],25:[function(_dereq_,module,exports){
module.exports = /[^\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC\u0030-\u0039\u00B2\u00B3\u00B9\u00BC-\u00BE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D66-\u0D75\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]+/g

},{}],26:[function(_dereq_,module,exports){
module.exports = /([\u0030-\u0039\u00B2\u00B3\u00B9\u00BC-\u00BE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D66-\u0D75\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19])([^\u0030-\u0039\u00B2\u00B3\u00B9\u00BC-\u00BE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D66-\u0D75\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19])/g

},{}],27:[function(_dereq_,module,exports){
/**
 * Special language-specific overrides.
 *
 * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt
 *
 * @type {Object}
 */
var LANGUAGES = {
  tr: {
    regexp: /[\u0069]/g,
    map: {
      '\u0069': '\u0130'
    }
  },
  az: {
    regexp: /[\u0069]/g,
    map: {
      '\u0069': '\u0130'
    }
  },
  lt: {
    regexp: /[\u0069\u006A\u012F]\u0307|\u0069\u0307[\u0300\u0301\u0303]/g,
    map: {
      '\u0069\u0307': '\u0049',
      '\u006A\u0307': '\u004A',
      '\u012F\u0307': '\u012E',
      '\u0069\u0307\u0300': '\u00CC',
      '\u0069\u0307\u0301': '\u00CD',
      '\u0069\u0307\u0303': '\u0128'
    }
  }
}

/**
 * Upper case a string.
 *
 * @param  {String} str
 * @return {String}
 */
module.exports = function (str, locale) {
  var lang = LANGUAGES[locale]

  str = str == null ? '' : String(str)

  if (lang) {
    str = str.replace(lang.regexp, function (m) { return lang.map[m] })
  }

  return str.toUpperCase()
}

},{}],28:[function(_dereq_,module,exports){
module.exports = extend

var hasOwnProperty = Object.prototype.hasOwnProperty;

function extend() {
    var target = {}

    for (var i = 0; i < arguments.length; i++) {
        var source = arguments[i]

        for (var key in source) {
            if (hasOwnProperty.call(source, key)) {
                target[key] = source[key]
            }
        }
    }

    return target
}

},{}],29:[function(_dereq_,module,exports){
module.exports = extend

var hasOwnProperty = Object.prototype.hasOwnProperty;

function extend(target) {
    for (var i = 1; i < arguments.length; i++) {
        var source = arguments[i]

        for (var key in source) {
            if (hasOwnProperty.call(source, key)) {
                target[key] = source[key]
            }
        }
    }

    return target
}

},{}],30:[function(_dereq_,module,exports){
/**
 * Given a number, return a zero-filled string.
 * From http://stackoverflow.com/questions/1267283/
 * @param  {number} width
 * @param  {number} number
 * @return {string}
 */
module.exports = function zeroFill (width, number, pad) {
  if (number === undefined) {
    return function (number, pad) {
      return zeroFill(width, number, pad)
    }
  }
  if (pad === undefined) pad = '0'
  width -= number.toString().length
  if (width > 0) return new Array(width + (/\./.test(number) ? 2 : 1)).join(pad) + number
  return number + ''
}

},{}],31:[function(_dereq_,module,exports){
'use strict'

var cvc = _dereq_('creditcards').cvc
var bind = _dereq_('function-bind')

module.exports = factory

factory.$inject = ['$parse']
function factory ($parse) {
  return {
    restrict: 'A',
    require: 'ngModel',
    compile: function (element, attributes) {
      attributes.$set('maxlength', 4)
      attributes.$set('pattern', '[0-9]*')
      attributes.$set('xAutocompletetype', 'cc-csc')

      return function (scope, element, attributes, ngModel) {
        ngModel.$validators.ccCvc = function (value) {
          return ngModel.$isEmpty(ngModel.$viewValue) || cvc.isValid(value, $parse(attributes.ccType)(scope))
        }

        if (attributes.ccType) {
          scope.$watch(attributes.ccType, bind.call(ngModel.$validate, ngModel))
        }
      }
    }
  }
}

},{"creditcards":7,"function-bind":14}],32:[function(_dereq_,module,exports){
'use strict'

var expiration = _dereq_('creditcards').expiration
var month = expiration.month
var year = expiration.year
var ap = _dereq_('ap')

exports = module.exports = function ccExp () {
  return {
    restrict: 'AE',
    require: 'ccExp',
    controller: CcExpController,
    link: function (scope, element, attributes, ccExp) {
      ccExp.$watch()
    }
  }
}

CcExpController.$inject = ['$scope', '$element']
function CcExpController ($scope, $element) {
  var nullFormCtrl = {
    $setValidity: noop
  }
  var parentForm = $element.inheritedData('$formController') || nullFormCtrl
  var ngModel = {
    year: {},
    month: {}
  }

  this.setMonth = function (monthCtrl) {
    ngModel.month = monthCtrl
  }
  this.setYear = function (yearCtrl) {
    ngModel.year = yearCtrl
  }

  function setValidity (exp) {
    var expMonth = exp.month
    var expYear = exp.year
    var valid = (expMonth == null && expYear == null) || !!expMonth && !!expYear && !expiration.isPast(expMonth, expYear)
    parentForm.$setValidity('ccExp', valid, $element)
  }

  this.$watch = function $watchExp () {
    $scope.$watch(function watchExp () {
      return {
        month: ngModel.month.$modelValue,
        year: ngModel.year.$modelValue
      }
    }, setValidity, true)
  }
}

var nullCcExp = {
  setMonth: noop,
  setYear: noop
}

exports.month = function ccExpMonth () {
  return {
    restrict: 'A',
    require: ['ngModel', '^?ccExp'],
    compile: function (element, attributes) {
      attributes.$set('maxlength', 2)
      attributes.$set('pattern', '[0-9]*')
      attributes.$set('xAutocompletetype', 'cc-exp-month')

      return function (scope, element, attributes, controllers) {
        var ngModel = controllers[0]
        var ccExp = controllers[1] || nullCcExp

        ccExp.setMonth(ngModel)
        ngModel.$parsers.unshift(month.parse)
        ngModel.$validators.ccExpMonth = function validateExpMonth (value) {
          return ngModel.$isEmpty(ngModel.$viewValue) || month.isValid(value)
        }
      }
    }
  }
}

exports.year = function ccExpYear () {
  return {
    restrict: 'A',
    require: ['ngModel', '^?ccExp'],
    compile: function (element, attributes) {
      var fullYear = attributes.fullYear !== undefined

      attributes.$set('maxlength', fullYear ? 4 : 2)
      attributes.$set('pattern', '[0-9]*')
      attributes.$set('xAutocompletetype', 'cc-exp-year')

      return function (scope, element, attributes, controllers) {
        var ngModel = controllers[0]
        var ccExp = controllers[1] || nullCcExp

        ccExp.setYear(ngModel)

        ngModel.$parsers.unshift(ap.partialRight(year.parse, !fullYear))

        ngModel.$formatters.unshift(function formatExpYear (value) {
          return value ? year.format(value, !fullYear) : ''
        })

        ngModel.$validators.ccExpYear = function validateExpYear (value) {
          return ngModel.$isEmpty(ngModel.$viewValue) || (year.isValid(value) && !year.isPast(value))
        }
      }
    }
  }
}

function noop () {}

},{"ap":1,"creditcards":7}],33:[function(_dereq_,module,exports){
'use strict'

var card = _dereq_('creditcards').card
var array = _dereq_('cast-array')
var partial = _dereq_('ap').partial

module.exports = factory

factory.$inject = ['$parse']
function factory ($parse) {
  return {
    restrict: 'A',
    require: ['ngModel', 'ccNumber'],
    controller: function () {
      this.type = null
      this.eagerType = null
    },
    compile: function ($element, $attributes) {
      $attributes.$set('pattern', '[0-9]*')
      $attributes.$set('xAutocompletetype', 'cc-number')

      return function ($scope, $element, $attributes, controllers) {
        var ngModel = controllers[0]
        var ccNumber = controllers[1]

        $scope.$watch($attributes.ngModel, function (number) {
          ngModel.$ccType = ccNumber.type = card.type(number)
        })

        function $viewValue () {
          return ngModel.$viewValue
        }

        function setCursorPostion (element, position) {
          if (element.setSelectionRange) {
            element.setSelectionRange(position, position)
          } else if (element.createTextRange) {
            var range = element.createTextRange()
            range.move('character', position)
            range.select()
          }
        }

        if ($attributes.ccEagerType != null) {
          $scope.$watch($viewValue, function eagerTypeCheck (number) {
            number = card.parse(number)
            ngModel.$ccEagerType = ccNumber.eagerType = card.type(number, true)
          })
        }

        if ($attributes.ccType) {
          $scope.$watch($attributes.ccType, function () {
            ngModel.$validate()
          })
        }

        if ($attributes.ccFormat != null) {
          ngModel.$formatters.unshift(card.format)
          $element.on('input', function formatInput () {
            var input = $element.val()
            var previous = $viewValue()
            if (!input) return
            var element = $element[0]
            var formatted = card.format(card.parse(input))

            var selectionEnd = element.selectionEnd
            ngModel.$setViewValue(formatted)
            ngModel.$render()

            if (previous && previous.length < formatted.length) {
              selectionEnd = formatted.length
            }
            setCursorPostion(element, selectionEnd)
          })
        }

        ngModel.$parsers.unshift(card.parse)

        ngModel.$validators.ccNumber = function validateCcNumber (number) {
          return ngModel.$isEmpty(ngModel.$viewValue) || card.isValid(number)
        }

        ngModel.$validators.ccNumberType = function validateCcNumberType (number) {
          if (ngModel.$isEmpty(ngModel.$viewValue)) return true
          var type = $parse($attributes.ccType)($scope)
          if (!type) card.isValid(number)
          return array(type).some(partial(card.isValid, number))
        }
      }
    }
  }
}

},{"ap":1,"cast-array":3,"creditcards":7}],34:[function(_dereq_,module,exports){
(function (global){
'use strict'

var angular = (typeof window !== "undefined" ? window['angular'] : typeof global !== "undefined" ? global['angular'] : null)
var creditcards = _dereq_('creditcards')
var number = _dereq_('./number')
var cvc = _dereq_('./cvc')
var expiration = _dereq_('./expiration')

module.exports = angular
  .module('credit-cards', [])
  .value('creditcards', creditcards)
  .directive('ccNumber', number)
  .directive('ccExp', expiration)
  .directive('ccExpMonth', expiration.month)
  .directive('ccExpYear', expiration.year)
  .directive('ccCvc', cvc)
  .name

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./cvc":31,"./expiration":32,"./number":33,"creditcards":7}]},{},[34])(34)
});;
angular.module('exceptionOverwrite', ['ngStorage']).
  factory('$exceptionHandler', ['$injector', '$window', function ($injector, $window) {
      var $localStorage;

      //Redefining it here since including sharedProperties causes EPIC FAIL
      var clearLocalStorage = function () {
          var tokenKey = "tokenKey";

          //get the token data
          var tkn = localStorage.getItem(tokenKey);
          var tknGuest = localStorage.getItem(tokenKey + "_guest");

          //clear storage
          localStorage.clear();

          //reset the token data
          if (tkn != null) { localStorage.setItem(tokenKey, tkn); }
          if (tknGuest != null) { localStorage.setItem(tokenKey + "_guest", tknGuest); }
      };

      return function (ex, cause) {
          try {
            $localStorage = $localStorage || $injector.get('$localStorage');
            $localStorage.$reset();
            clearLocalStorage();
            //console.error(ex);
          } catch (e) {
              clearLocalStorage();
          }
      }
  }]);;
/*
 AngularJS v1.5.0
 (c) 2010-2016 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(A,e,B){'use strict';function C(a){var c=[];v(c,e.noop).chars(a);return c.join("")}function h(a,c){var b={},d=a.split(","),l;for(l=0;l<d.length;l++)b[c?e.lowercase(d[l]):d[l]]=!0;return b}function D(a,c){null===a||a===B?a="":"string"!==typeof a&&(a=""+a);g.innerHTML=a;var b=5;do{if(0===b)throw w("uinput");b--;11>=document.documentMode&&n(g);a=g.innerHTML;g.innerHTML=a}while(a!==g.innerHTML);for(b=g.firstChild;b;){switch(b.nodeType){case 1:c.start(b.nodeName.toLowerCase(),E(b.attributes));
break;case 3:c.chars(b.textContent)}var d;if(!(d=b.firstChild)&&(1==b.nodeType&&c.end(b.nodeName.toLowerCase()),d=b.nextSibling,!d))for(;null==d;){b=b.parentNode;if(b===g)break;d=b.nextSibling;1==b.nodeType&&c.end(b.nodeName.toLowerCase())}b=d}for(;b=g.firstChild;)g.removeChild(b)}function E(a){for(var c={},b=0,d=a.length;b<d;b++){var l=a[b];c[l.name]=l.value}return c}function x(a){return a.replace(/&/g,"&amp;").replace(F,function(a){var b=a.charCodeAt(0);a=a.charCodeAt(1);return"&#"+(1024*(b-55296)+
(a-56320)+65536)+";"}).replace(G,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function v(a,c){var b=!1,d=e.bind(a,a.push);return{start:function(a,f){a=e.lowercase(a);!b&&H[a]&&(b=a);b||!0!==t[a]||(d("<"),d(a),e.forEach(f,function(b,f){var g=e.lowercase(f),h="img"===a&&"src"===g||"background"===g;!0!==I[g]||!0===y[g]&&!c(b,h)||(d(" "),d(f),d('="'),d(x(b)),d('"'))}),d(">"))},end:function(a){a=e.lowercase(a);b||!0!==t[a]||!0===z[a]||(d("</"),d(a),d(">"));a==
b&&(b=!1)},chars:function(a){b||d(x(a))}}}function n(a){if(a.nodeType===Node.ELEMENT_NODE)for(var c=a.attributes,b=0,d=c.length;b<d;b++){var e=c[b],f=e.name.toLowerCase();if("xmlns:ns1"===f||0===f.indexOf("ns1:"))a.removeAttributeNode(e),b--,d--}(c=a.firstChild)&&n(c);(c=a.nextSibling)&&n(c)}var w=e.$$minErr("$sanitize"),F=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,G=/([^\#-~ |!])/g,z=h("area,br,col,hr,img,wbr"),q=h("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),k=h("rp,rt"),u=e.extend({},k,q),q=e.extend({},
q,h("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul")),k=e.extend({},k,h("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),J=h("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan"),
H=h("script,style"),t=e.extend({},z,q,k,u),y=h("background,cite,href,longdesc,src,xlink:href"),u=h("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width"),k=h("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",
!0),I=e.extend({},y,k,u),g;(function(a){if(a.document&&a.document.implementation)a=a.document.implementation.createHTMLDocument("inert");else throw w("noinert");var c=(a.documentElement||a.getDocumentElement()).getElementsByTagName("body");1===c.length?g=c[0]:(c=a.createElement("html"),g=a.createElement("body"),c.appendChild(g),a.appendChild(c))})(A);e.module("ngSanitize",[]).provider("$sanitize",function(){var a=!1;this.$get=["$$sanitizeUri",function(c){a&&e.extend(t,J);return function(a){var d=
[];D(a,v(d,function(a,b){return!/^unsafe:/.test(c(a,b))}));return d.join("")}}];this.enableSvg=function(c){return e.isDefined(c)?(a=c,this):a}});e.module("ngSanitize").filter("linky",["$sanitize",function(a){var c=/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,b=/^mailto:/i,d=e.$$minErr("linky"),g=e.isString;return function(f,h,m){function k(a){a&&p.push(C(a))}function q(a,b){var c;p.push("<a ");e.isFunction(m)&&(m=m(a));if(e.isObject(m))for(c in m)p.push(c+
'="'+m[c]+'" ');else m={};!e.isDefined(h)||"target"in m||p.push('target="',h,'" ');p.push('href="',a.replace(/"/g,"&quot;"),'">');k(b);p.push("</a>")}if(null==f||""===f)return f;if(!g(f))throw d("notstring",f);for(var r=f,p=[],s,n;f=r.match(c);)s=f[0],f[2]||f[4]||(s=(f[3]?"http://":"mailto:")+s),n=f.index,k(r.substr(0,n)),q(s,f[0].replace(b,"")),r=r.substring(n+f[0].length);k(r);return a(p.join(""))}}])})(window,window.angular);
//# sourceMappingURL=angular-sanitize.min.js.map
;
"use strict";angular.module("com.2fdevs.videogular",["ngSanitize"]).run(["$templateCache",function(a){a.put("vg-templates/vg-media-video","<video></video>"),a.put("vg-templates/vg-media-audio","<audio></audio>"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e})}]),angular.module("com.2fdevs.videogular").constant("VG_STATES",{PLAY:"play",PAUSE:"pause",STOP:"stop"}).constant("VG_VOLUME_KEY","videogularVolume"),angular.module("com.2fdevs.videogular").controller("vgController",["$scope","$window","vgConfigLoader","vgFullscreen","VG_UTILS","VG_STATES","VG_VOLUME_KEY",function(a,b,c,d,e,f,g){var h=null,i=!1,j=!1;this.videogularElement=null,this.clearMedia=function(){this.mediaElement[0].src=""},this.onRouteChange=function(){(void 0===this.clearMediaOnNavigate||this.clearMediaOnNavigate===!0)&&this.clearMedia()},this.onCanPlay=function(b){this.isBuffering=!1,a.$apply(a.vgCanPlay({$event:b}))},this.onVideoReady=function(){this.isReady=!0,this.autoPlay=a.vgAutoPlay,this.playsInline=a.vgPlaysInline,this.nativeFullscreen=a.vgNativeFullscreen||!0,this.cuePoints=a.vgCuePoints,this.clearMediaOnNavigate=a.vgClearMediaOnNavigate||!0,this.currentState=f.STOP,j=!0,e.supportsLocalStorage()&&this.setVolume(parseFloat(b.localStorage.getItem(g)||"1")),a.vgConfig?c.loadConfig(a.vgConfig).then(this.onLoadConfig.bind(this)):a.vgPlayerReady({$API:this})},this.onLoadConfig=function(b){this.config=b,a.vgTheme=this.config.theme,a.vgAutoPlay=this.config.autoPlay,a.vgPlaysInline=this.config.playsInline,a.vgNativeFullscreen=this.config.nativeFullscreen,a.vgCuePoints=this.config.cuePoints,a.vgClearMediaOnNavigate=this.config.clearMediaOnNavigate,a.vgPlayerReady({$API:this})},this.onLoadMetaData=function(a){this.isBuffering=!1,this.onUpdateTime(a)},this.onUpdateTime=function(b){this.currentTime=1e3*b.target.currentTime,b.target.duration!=1/0?(this.totalTime=1e3*b.target.duration,this.timeLeft=1e3*(b.target.duration-b.target.currentTime),this.isLive=!1):this.isLive=!0,this.cuePoints&&this.checkCuePoints(b.target.currentTime),a.vgUpdateTime({$currentTime:b.target.currentTime,$duration:b.target.duration}),a.$apply()},this.checkCuePoints=function(a){for(var b in this.cuePoints)for(var c=0,d=this.cuePoints[b].length;d>c;c++){var e=this.cuePoints[b][c],f=parseInt(a,10),g=parseInt(e.timeLapse.start,10);e.timeLapse.end||(e.timeLapse.end=e.timeLapse.start+1),a<e.timeLapse.end&&(e.$$isCompleted=!1),e.$$isDirty||f!==g||"function"!=typeof e.onEnter||(e.onEnter(a,e.timeLapse,e.params),e.$$isDirty=!0),a>e.timeLapse.start?(a<e.timeLapse.end&&(e.onUpdate&&e.onUpdate(a,e.timeLapse,e.params),e.$$isDirty||"function"!=typeof e.onEnter||e.onEnter(a,e.timeLapse,e.params),e.$$isDirty=!0),a>=e.timeLapse.end&&(e.onComplete&&!e.$$isCompleted&&(e.$$isCompleted=!0,e.onComplete(a,e.timeLapse,e.params)),e.$$isDirty=!1)):(e.onLeave&&e.$$isDirty&&e.onLeave(a,e.timeLapse,e.params),e.$$isDirty=!1)}},this.onPlay=function(){this.setState(f.PLAY),a.$apply()},this.onPause=function(){0==this.mediaElement[0].currentTime?this.setState(f.STOP):this.setState(f.PAUSE),a.$apply()},this.onVolumeChange=function(){this.volume=this.mediaElement[0].volume,a.$apply()},this.onPlaybackChange=function(){this.playback=this.mediaElement[0].playbackRate,a.$apply()},this.onSeeking=function(b){a.vgSeeking({$currentTime:b.target.currentTime,$duration:b.target.duration})},this.onSeeked=function(b){a.vgSeeked({$currentTime:b.target.currentTime,$duration:b.target.duration})},this.seekTime=function(a,b){var c;b?(c=a*this.mediaElement[0].duration/100,this.mediaElement[0].currentTime=c):(c=a,this.mediaElement[0].currentTime=c),this.currentTime=1e3*c},this.playPause=function(){this.mediaElement[0].paused?this.play():this.pause()},this.setState=function(b){return b&&b!=this.currentState&&(a.vgUpdateState({$state:b}),this.currentState=b),this.currentState},this.play=function(){this.mediaElement[0].play(),this.setState(f.PLAY)},this.pause=function(){this.mediaElement[0].pause(),this.setState(f.PAUSE)},this.stop=function(){try{this.mediaElement[0].pause(),this.mediaElement[0].currentTime=0,this.currentTime=0,this.setState(f.STOP)}catch(a){return a}},this.toggleFullScreen=function(){d.isAvailable&&this.nativeFullscreen?this.isFullScreen?e.isMobileDevice()||d.exit():e.isMobileDevice()?e.isiOSDevice()?j?this.enterElementInFullScreen(this.mediaElement[0]):(i=!0,this.play()):this.enterElementInFullScreen(this.mediaElement[0]):this.enterElementInFullScreen(this.videogularElement[0]):(this.isFullScreen?(this.videogularElement.removeClass("fullscreen"),this.videogularElement.css("z-index","auto")):(this.videogularElement.addClass("fullscreen"),this.videogularElement.css("z-index",e.getZIndex())),this.isFullScreen=!this.isFullScreen)},this.enterElementInFullScreen=function(a){d.request(a)},this.changeSource=function(b){a.vgChangeSource({$source:b})},this.setVolume=function(c){c=Math.max(Math.min(c,1),0),a.vgUpdateVolume({$volume:c}),this.mediaElement[0].volume=c,this.volume=c,e.supportsLocalStorage()&&b.localStorage.setItem(g,c.toString())},this.setPlayback=function(b){a.vgUpdatePlayback({$playBack:b}),this.mediaElement[0].playbackRate=b,this.playback=b},this.updateTheme=function(a){var b,c,d=document.getElementsByTagName("link");if(h)for(b=0,c=d.length;c>b;b++)if(d[b].outerHTML.indexOf(h)>=0){d[b].parentNode.removeChild(d[b]);break}if(a){var e=angular.element(document).find("head"),f=!1;for(b=0,c=d.length;c>b&&!(f=d[b].outerHTML.indexOf(a)>=0);b++);f||e.append("<link rel='stylesheet' href='"+a+"'>"),h=a}},this.onStartBuffering=function(b){this.isBuffering=!0,a.$apply()},this.onStartPlaying=function(b){this.isBuffering=!1,a.$apply()},this.onComplete=function(b){a.vgComplete(),this.setState(f.STOP),this.isCompleted=!0,a.$apply()},this.onVideoError=function(b){a.vgError({$event:b})},this.addListeners=function(){this.mediaElement[0].addEventListener("canplay",this.onCanPlay.bind(this),!1),this.mediaElement[0].addEventListener("loadedmetadata",this.onLoadMetaData.bind(this),!1),this.mediaElement[0].addEventListener("waiting",this.onStartBuffering.bind(this),!1),this.mediaElement[0].addEventListener("ended",this.onComplete.bind(this),!1),this.mediaElement[0].addEventListener("playing",this.onStartPlaying.bind(this),!1),this.mediaElement[0].addEventListener("play",this.onPlay.bind(this),!1),this.mediaElement[0].addEventListener("pause",this.onPause.bind(this),!1),this.mediaElement[0].addEventListener("volumechange",this.onVolumeChange.bind(this),!1),this.mediaElement[0].addEventListener("playbackchange",this.onPlaybackChange.bind(this),!1),this.mediaElement[0].addEventListener("timeupdate",this.onUpdateTime.bind(this),!1),this.mediaElement[0].addEventListener("seeking",this.onSeeking.bind(this),!1),this.mediaElement[0].addEventListener("seeked",this.onSeeked.bind(this),!1),this.mediaElement[0].addEventListener("error",this.onVideoError.bind(this),!1)},this.init=function(){this.isReady=!1,this.isCompleted=!1,this.currentTime=0,this.totalTime=0,this.timeLeft=0,this.isLive=!1,this.isFullScreen=!1,this.playback=1,this.isConfig=void 0!=a.vgConfig,d.isAvailable&&(this.isFullScreen=d.isFullScreen()),this.updateTheme(a.vgTheme),this.addBindings(),d.isAvailable&&document.addEventListener(d.onchange,this.onFullScreenChange.bind(this))},this.onUpdateTheme=function(a){this.updateTheme(a)},this.onUpdateAutoPlay=function(a){a&&!this.autoPlay&&(this.autoPlay=a,this.play(this))},this.onUpdatePlaysInline=function(a){this.playsInline=a},this.onUpdateNativeFullscreen=function(a){void 0==a&&(a=!0),this.nativeFullscreen=a},this.onUpdateCuePoints=function(a){this.cuePoints=a,this.checkCuePoints(this.currentTime)},this.onUpdateClearMediaOnNavigate=function(a){this.clearMediaOnNavigate=a},this.addBindings=function(){a.$watch("vgTheme",this.onUpdateTheme.bind(this)),a.$watch("vgAutoPlay",this.onUpdateAutoPlay.bind(this)),a.$watch("vgPlaysInline",this.onUpdatePlaysInline.bind(this)),a.$watch("vgNativeFullscreen",this.onUpdateNativeFullscreen.bind(this)),a.$watch("vgCuePoints",this.onUpdateCuePoints.bind(this)),a.$watch("vgClearMediaOnNavigate",this.onUpdateClearMediaOnNavigate.bind(this))},this.onFullScreenChange=function(b){this.isFullScreen=d.isFullScreen(),a.$apply()},a.$on("$destroy",this.clearMedia.bind(this)),a.$on("$routeChangeStart",this.onRouteChange.bind(this)),this.init()}]),angular.module("com.2fdevs.videogular").directive("vgCrossorigin",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setCrossorigin=function(a){a?d.mediaElement.attr("crossorigin",a):d.mediaElement.removeAttr("crossorigin")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setCrossorigin(d.config.crossorigin)}):a.$watch(c.vgCrossorigin,function(b,c){e&&b==c||!b?a.setCrossorigin():(e=b,a.setCrossorigin(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgLoop",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setLoop=function(a){a?d.mediaElement.attr("loop",a):d.mediaElement.removeAttr("loop")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setLoop(d.config.loop)}):a.$watch(c.vgLoop,function(b,c){e&&b==c||!b?a.setLoop():(e=b,a.setLoop(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgMedia",["$timeout","VG_UTILS","VG_STATES",function(a,b,c){return{restrict:"E",require:"^videogular",templateUrl:function(a,b){var c=b.vgType||"video";return b.vgTemplate||"vg-templates/vg-media-"+c},scope:{vgSrc:"=?",vgType:"=?"},link:function(d,e,f,g){var h;f.vgType&&"video"!==f.vgType?f.vgType="audio":f.vgType="video",d.onChangeSource=function(a,b){h&&a==b||!a||(h=a,g.currentState!==c.PLAY&&(g.currentState=c.STOP),g.sources=h,d.changeSource())},d.changeSource=function(){var c="";if(g.mediaElement[0].canPlayType){for(var d=0,e=h.length;e>d;d++)if(c=g.mediaElement[0].canPlayType(h[d].type),"maybe"==c||"probably"==c){g.mediaElement.attr("src",h[d].src),g.mediaElement.attr("type",h[d].type),g.changeSource(h[d]);break}}else g.mediaElement.attr("src",h[0].src),g.mediaElement.attr("type",h[0].type),g.changeSource(h[0]);b.isMobileDevice()&&g.mediaElement[0].load(),a(function(){g.autoPlay&&!b.isMobileDevice()&&g.play()}),""==c&&g.onVideoError()},g.mediaElement=e.find(f.vgType),g.sources=d.vgSrc,g.addListeners(),g.onVideoReady(),d.$watch("vgSrc",d.onChangeSource),d.$watch(function(){return g.sources},d.onChangeSource),d.$watch(function(){return g.playsInline},function(a,b){a?g.mediaElement.attr("webkit-playsinline",""):g.mediaElement.removeAttr("webkit-playsinline")}),g.isConfig&&d.$watch(function(){return g.config},function(){g.config&&(d.vgSrc=g.config.sources)})}}}]),angular.module("com.2fdevs.videogular").directive("vgNativeControls",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setControls=function(a){a?d.mediaElement.attr("controls",a):d.mediaElement.removeAttr("controls")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setControls(d.config.controls)}):a.$watch(c.vgNativeControls,function(b,c){e&&b==c||!b?a.setControls():(e=b,a.setControls(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgPreload",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e;a.setPreload=function(a){a?d.mediaElement.attr("preload",a):d.mediaElement.removeAttr("preload")},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setPreload(d.config.preload)}):a.$watch(c.vgPreload,function(b,c){e&&b==c||!b?a.setPreload():(e=b,a.setPreload(e))})}}}}]),angular.module("com.2fdevs.videogular").directive("vgTracks",[function(){return{restrict:"A",require:"^videogular",link:{pre:function(a,b,c,d){var e,f,g,h=!1;a.onLoadMetaData=function(){h=!0,a.updateTracks()},a.updateTracks=function(){var b=d.mediaElement.children();for(f=0,g=b.length;g>f;f++)b[f].remove&&b[f].remove();if(e)for(f=0,g=e.length;g>f;f++){var c=document.createElement("track");for(var h in e[f])c[h]=e[f][h];c.addEventListener("load",a.onLoadTrack.bind(a,c)),d.mediaElement[0].appendChild(c)}},a.onLoadTrack=function(b){b["default"]?b.mode="showing":b.mode="hidden";for(var c=0,e=d.mediaElement[0].textTracks.length;e>c;c++)b.label==d.mediaElement[0].textTracks[c].label&&(b["default"]?d.mediaElement[0].textTracks[c].mode="showing":d.mediaElement[0].textTracks[c].mode="disabled");b.removeEventListener("load",a.onLoadTrack.bind(a,b))},a.setTracks=function(b){e=b,d.tracks=b,h?a.updateTracks():d.mediaElement[0].addEventListener("loadedmetadata",a.onLoadMetaData.bind(a),!1)},d.isConfig?a.$watch(function(){return d.config},function(){d.config&&a.setTracks(d.config.tracks)}):a.$watch(c.vgTracks,function(b,c){e&&b==c||a.setTracks(b)},!0)}}}}]),angular.module("com.2fdevs.videogular").directive("videogular",[function(){return{restrict:"EA",scope:{vgTheme:"=?",vgAutoPlay:"=?",vgPlaysInline:"=?",vgNativeFullscreen:"=?",vgClearMediaOnNavigate:"=?",vgCuePoints:"=?",vgConfig:"@",vgCanPlay:"&",vgComplete:"&",vgUpdateVolume:"&",vgUpdatePlayback:"&",vgUpdateTime:"&",vgUpdateState:"&",vgPlayerReady:"&",vgChangeSource:"&",vgSeeking:"&",vgSeeked:"&",vgError:"&"},controller:"vgController",controllerAs:"API",link:{pre:function(a,b,c,d){d.videogularElement=angular.element(b)}}}}]),angular.module("com.2fdevs.videogular").service("vgConfigLoader",["$http","$q","$sce",function(a,b,c){this.loadConfig=function(d){var e=b.defer();return a({method:"GET",url:d}).then(function(a){for(var b=a.data,d=0,f=b.sources.length;f>d;d++)b.sources[d].src=c.trustAsResourceUrl(b.sources[d].src);e.resolve(b)},function(){e.reject()}),e.promise}}]),angular.module("com.2fdevs.videogular").service("vgFullscreen",["VG_UTILS",function(a){function b(){var a=!1;return a=c?null!=document[d.element]||c.webkitDisplayingFullscreen:null!=document[d.element]}var c,d=null,e={w3:{enabled:"fullscreenEnabled",element:"fullscreenElement",request:"requestFullscreen",exit:"exitFullscreen",onchange:"fullscreenchange",onerror:"fullscreenerror"},newWebkit:{enabled:"webkitFullscreenEnabled",element:"webkitFullscreenElement",request:"webkitRequestFullscreen",exit:"webkitExitFullscreen",onchange:"webkitfullscreenchange",onerror:"webkitfullscreenerror"},oldWebkit:{enabled:"webkitIsFullScreen",element:"webkitCurrentFullScreenElement",request:"webkitRequestFullScreen",exit:"webkitCancelFullScreen",onchange:"webkitfullscreenchange",onerror:"webkitfullscreenerror"},moz:{enabled:"mozFullScreen",element:"mozFullScreenElement",request:"mozRequestFullScreen",exit:"mozCancelFullScreen",onchange:"mozfullscreenchange",onerror:"mozfullscreenerror"},ios:{enabled:"webkitFullscreenEnabled",element:"webkitFullscreenElement",request:"webkitEnterFullscreen",exit:"webkitExitFullscreen",onchange:"webkitfullscreenchange",onerror:"webkitfullscreenerror"},ms:{enabled:"msFullscreenEnabled",element:"msFullscreenElement",request:"msRequestFullscreen",exit:"msExitFullscreen",onchange:"MSFullscreenChange",onerror:"MSFullscreenError"}};for(var f in e)if(e[f].enabled in document){d=e[f];break}a.isiOSDevice()&&(d=e.ios),this.isAvailable=null!=d,d&&(this.onchange=d.onchange,this.onerror=d.onerror,this.isFullScreen=b,this.exit=function(){document[d.exit]()},this.request=function(a){c=a,c[d.request]()})}]),angular.module("com.2fdevs.videogular").service("VG_UTILS",["$window",function(a){this.fixEventOffset=function(a){var b=navigator.userAgent.match(/Firefox\/(\d+)/i);if(b&&Number.parseInt(b.pop())<39){var c=a.currentTarget.currentStyle||window.getComputedStyle(a.target,null),d=parseInt(c.borderLeftWidth,10),e=parseInt(c.borderTopWidth,10),f=a.currentTarget.getBoundingClientRect(),g=a.clientX-d-f.left,h=a.clientY-e-f.top;a.offsetX=g,a.offsetY=h}return a},this.getZIndex=function(){for(var a,b=1,c=document.getElementsByTagName("*"),d=0,e=c.length;e>d;d++)a=parseInt(window.getComputedStyle(c[d])["z-index"]),a>b&&(b=a+1);return b},this.isMobileDevice=function(){return"undefined"!=typeof window.orientation||-1!==navigator.userAgent.indexOf("IEMobile")},this.isiOSDevice=function(){return navigator.userAgent.match(/iPhone/i)||navigator.userAgent.match(/iPod/i)||navigator.userAgent.match(/iPad/i)},this.supportsLocalStorage=function(){var b="videogular-test-key",c=a.sessionStorage;try{return c.setItem(b,"1"),c.removeItem(b),"localStorage"in a&&null!==a.localStorage}catch(d){return!1}}}]);;
angular.module('rmModules', []);;
angular.module('rmModules')
    .factory('analyticsFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        dataFactory.track = function(data) {
            return $http.post(urlBase + '/Analytic/Track/', data, sharedProperties.AuthenticationHeader());
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
  .factory('clustersFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {
    var urlBase = appSettings.WebApiUrl;

    var clustersFactory = {};

    clustersFactory.getClustersForSeason = function(options, isActive) {
      if (typeof options === 'number') {
        options = {SeasonID: options, "IsActive": isActive};
        }
      return $http.post(urlBase + '/cluster/GetClustersForSeason', options, sharedProperties.AuthenticationHeader());
    };

    clustersFactory.createCluster = function (payload) {
        return $http.post(urlBase + '/cluster/CreateCluster', payload, sharedProperties.AuthenticationHeader());
    }

    clustersFactory.getClustersForJudgingProperty = function (propertyID, filterBy) {
        return $http.post(urlBase + '/cluster/GetClustersForJudgingProperty', { "PropertyID": propertyID, "FilterBy": filterBy }, sharedProperties.AuthenticationHeader());
    }

    clustersFactory.getForExecutiveJudgingDisplay = function (propertyID, seasonID) {
        return $http.post(urlBase + '/cluster/GetForExecutiveJudgingDisplay', { "PropertyID": propertyID, "SeasonID": seasonID }, sharedProperties.AuthenticationHeader());
    }

    clustersFactory.getExecutiveJudgeNextCategoryID = function (propertyID, seasonID) {
        return $http.post(urlBase + '/cluster/GetExecutiveJudgeNextCategoryID', { "PropertyID": propertyID, "SeasonID": seasonID }, sharedProperties.AuthenticationHeader());
    }

    clustersFactory.deleteCluster = function (options) {
        return $http.post(urlBase + '/cluster/DeleteCluster', options, sharedProperties.AuthenticationHeader());
    };

    return clustersFactory;

  }]);;
angular.module('rmModules')
    .factory('entriesFactory', ['$http', 'sharedProperties', '$q', function ($http, sharedProperties, $q) {
        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET
        dataFactory.getMediaTypes = function (propid) {
            return $http.get(urlBase + '/category/' + propid);
        };

        dataFactory.getFilterOptions = function (propid) {
            return $http.get(urlBase + '/entry/GetFilterOptionData/' + propid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getFilterCategoryOptions = function (data) {
            return $http.post(urlBase + '/entry/GetFilterCategoryOptionData/', { "data": data }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getAuditEntryListAdmin = function (payload) {
            return $http.post(urlBase + '/entry/GetAuditEntryListForAdmin/', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.saveAuditEntryListAdmin = function (payload) {
            return $http.post(urlBase + '/entry/SaveAuditEntryListForAdmin/', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getNoLoadReasons = function () {
            return $http.get(urlBase + '/entry/GetNoLoadReasons/', sharedProperties.AuthenticationHeader());
        };

        // GET Ranking Data
        dataFactory.getRankingData = function (payload) {
            return $http.post(urlBase + '/entry/GetRankingData/', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getExecutiveRankingData = function (payload) {
            return $http.post(urlBase + '/entry/GetExecutiveRankingData/', payload, sharedProperties.AuthenticationHeader());
        };
        dataFactory.getPVRankingData = function (payload) {
            return $http.post(urlBase + '/entry/GetPVRankingData/', payload, sharedProperties.AuthenticationHeader());
        };
        // Entries Home data
        dataFactory.getSubmissionsForHome = function (payload) {
            return $http.post(urlBase + '/entry/GetSubmissionsForHome/', payload, sharedProperties.AuthenticationHeader());
        }

        //
        dataFactory.getWelcomeData = function (propid) {
            return $http.get(urlBase + '/entry/GetWelcomeData/' + propid, sharedProperties.AuthenticationHeader());
        }

        // Entries Home data
        dataFactory.getSubmission = function (id) {
            return $http.get(urlBase + '/entry/GetSubmission/' + id, sharedProperties.AuthenticationHeader());
        }

        // POST
        dataFactory.updatePieceFromDashboard = function (data) {
            return $http.post(urlBase + '/entry/UpdateSubmissionFromHome', data, sharedProperties.AuthenticationHeader());
        };

        // POST
        dataFactory.updatePieceURLsFromDashboard = function (data) {
            return $http.post(urlBase + '/entry/UpdateSubmissionPodcastURLs', data, sharedProperties.AuthenticationHeader());
        };

        // POST
        dataFactory.insertSubmission = function (submission) {
            return $http.post(urlBase + '/entry', submission, sharedProperties.AuthenticationHeader());
        };

        // POST Ranking Data
        dataFactory.updateRankingData = function (payload) {
            return $http.post(urlBase + '/entry/UpdateRankingData/', payload, sharedProperties.AuthenticationHeader());
        };

        // POST Ranking Data
        dataFactory.updateExecutiveRankingData = function (payload) {
            return $http.post(urlBase + '/entry/UpdateExecutiveRankingData/', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.updatePVRankingData = function (payload) {
            return $http.post(urlBase + '/entry/UpdatePVRankingData/', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getEntryListAdmin = function (settings) {
            return $http.post(urlBase + '/entry/GetEntryListForAdmin', settings, sharedProperties.AuthenticationHeader());
        };

        // get "Piece" for Piece Detail Page
        dataFactory.getPiece = function (pieceID) {
            return $http.post(urlBase + '/entry/GetPiece', { "pieceID": pieceID }, sharedProperties.AuthenticationHeader());
        };

        // save changes to "Piece"
        dataFactory.savePiece = function (piece) {
            return $http.post(urlBase + '/entry/SavePiece', piece, sharedProperties.AuthenticationHeader());
        };

        // get Entry Detail for Admin Entry Detail page
        dataFactory.getAdminEntryDetail = function (entryID) {
            return $http.get(urlBase + '/entry/GetAdminEntryDetail/' + entryID, sharedProperties.AuthenticationHeader());
        };

        // save changes to EntryDetail
        dataFactory.saveAdminEntryDetail = function (entryDetail) {
            return $http.post(urlBase + '/entry/SaveAdminEntryDetail', entryDetail, sharedProperties.AuthenticationHeader());
        };

        // Post retrieve category recommendations
        dataFactory.getCategoryRecommendations = function (categoryRecommendationRequest) {
            return $http.post(urlBase + '/CategoryRecommendation/GetRecommendationsForEntryForm', categoryRecommendationRequest);
        };
        dataFactory.getSubmissionForOrder = function (id) {
            return $http.get(urlBase + '/entry/GetSubmissionForOrder/' + id, sharedProperties.AuthenticationHeader());
        };

        // DELETE
        dataFactory.deleteEntry = function (entryID) {
            return $http.delete(urlBase + '/entry/DeleteEntry/' + entryID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getOrdersForProperty = function (props) {
          return $http.post(urlBase + '/Order/GetOrdersForProperty', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getOrdersForPropertyExport = function (props) {
            return $http.post(urlBase + '/Order/GetOrdersForPropertyExport', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.bulkProcessPieces = function (props) {
            return $http.post(urlBase + '/entry/BulkProcessPieces/', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getEntriesOffList = function(props) {
          return $http.post(urlBase + '/entry/GetEntriesOffList/', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.clearEntryOff= function(props) {
          return $http.post(urlBase + '/entry/ClearEntryOff/', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.updateEntryOffStatus= function(props) {
          return $http.post(urlBase + '/entry/UpdateEntryOffStatus/', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.mergeSubmissions = function (props) {
            return $http.post(urlBase + '/entry/MergeSubmissions/', props, sharedProperties.AuthenticationHeader());
        };

        // update piecefile list for piece with upload later (or mailitem in the future)
        dataFactory.updatePieceFileList = function (props, isAdmin) {
            return $http.post(urlBase + '/entry/UpdateFileList' + (isAdmin ? 'Admin' : ''), props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.pieceIsForShortlistVideo = function (pieceID) {
            return $http.get(urlBase + '/entry/PieceIsForShortlistVideo/' + pieceID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.pieceIsForShortlistPodcast = function (pieceID) {
            return $http.get(urlBase + '/entry/PieceIsForShortlistPodcast/' + pieceID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.sendEntryOffEmail = function (paramtr) {
            return $http.post(urlBase + '/entry/SendEntryOffEmail', paramtr, sharedProperties.AuthenticationHeader());
        };
        dataFactory.saveSelectedFilters = function (paramtr) {
            return $http.post(urlBase + '/entry/SaveSelectedFilters', paramtr, sharedProperties.AuthenticationHeader());
        }
        dataFactory.getSavedFilters = function (propertyID) {
            return $http.get(urlBase + '/entry/GetSavedFilters/' + propertyID, sharedProperties.AuthenticationHeader());
        }
        dataFactory.deleteSavedFilters = function (paramtr) {
            return $http.post(urlBase + '/entry/DeleteSelectedFilters', paramtr, sharedProperties.AuthenticationHeader());
        }

        dataFactory.updateEventWinnerStatus = function (props) {
            return $http.post(urlBase + '/entry/UpdateEntryWinnerStatus', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getPieceLengths = function () {
            return $http.get(urlBase + '/entry/GetPieceLengths');
        };

        dataFactory.getPiecePartners = function () {
            return $http.get(urlBase + '/entry/GetPiecePartners', sharedProperties.AuthenticationHeader());
        };

        dataFactory.getPieceCompanySize = function () {
            return $http.get(urlBase + '/entry/GetPieceCompanySize');
        };

        dataFactory.getGalleryPiece = function (pieceID) {
            return $http.get(urlBase + '/entry/GetGalleryPiece/' + pieceID);
        };

        return dataFactory;
    }]);
;
angular.module('rmModules')
    .factory('ethnicityFactory', ['$http', function ($http) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};
        var config = {cache: true};

        // GET
        dataFactory.getEthnicities = function () {
            return $http.get(urlBase + '/Ethnicity/GetEthnicities/', config);
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('exportFactory', ['$http', 'sharedProperties', '$q', function ($http, sharedProperties, $q) {
        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        var downloadFile = function (specificFileName, data, status, headers) {
            var octetStreamMime = 'application/octet-stream';
            var success = false;
            var debug = false;
            headers = headers();

            // Get the filename from the x-filename header or default to "download.pdf"
            var filename = specificFileName || headers['x-filename'] || 'download.pdf';

            // Determine the content type from the header or default to "application/octet-stream"
            var contentType = headers['content-type'] || octetStreamMime;

            try {
                // Try using msSaveBlob if supported
                if (debug) console.log("Trying saveBlob method ...");
                var blob = new Blob([data], { type: contentType });
                if (navigator.msSaveBlob)
                    navigator.msSaveBlob(blob, filename);
                else {
                    // Try using other saveBlob implementations, if available
                    var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
                    if (saveBlob === undefined) throw "Not supported";
                    saveBlob(blob, filename);
                }
                if (debug) console.log("saveBlob succeeded");
                success = true;
            } catch (ex) {
                if (debug) console.log("saveBlob method failed with the following exception:");
                if (debug) console.log(ex);
            }

            if (!success) {
                // Get the blob url creator
                var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
                if (urlCreator) {
                    // Try to use a download link
                    var link = document.createElement('a');
                    if ('download' in link) {
                        // Try to simulate a click
                        try {
                            // Prepare a blob URL
                            if (debug) console.log("Trying download link method with simulated click ...");
                            var blob = new Blob([data], { type: contentType });
                            var url = urlCreator.createObjectURL(blob);
                            link.setAttribute('href', url);

                            // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
                            link.setAttribute("download", filename);

                            // Simulate clicking the download link
                            var event = document.createEvent('MouseEvents');
                            event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                            link.dispatchEvent(event);
                            if (debug) console.log("Download link method with simulated click succeeded");
                            success = true;

                        } catch (ex) {
                            if (debug) console.log("Download link method with simulated click failed with the following exception:");
                            if (debug) console.log(ex);
                        }
                    }

                    if (!success) {
                        // Fallback to window.location method
                        try {
                            // Prepare a blob URL
                            // Use application/octet-stream when using window.location to force download
                            if (debug) console.log("Trying download link method with window.location ...");
                            var blob = new Blob([data], { type: octetStreamMime });
                            var url = urlCreator.createObjectURL(blob);
                            window.location = url;
                            if (debug) console.log("Download link method with window.location succeeded");
                            success = true;
                        } catch (ex) {
                            if (debug) console.log("Download link method with window.location failed with the following exception:");
                            if (debug) console.log(ex);
                        }
                    }

                }
            }

            if (!success) {
                // Fallback to window.open method
                if (debug) console.log("No methods worked for saving the arraybuffer, using last resort window.open");
                window.open(httpPath, '_blank', '');
            }

        };

        var sanitizeCSVData = function (data) {
            if (data === 0) return data + ',';
            if (data === '0') return '"' + data + '",';

            if (data === true) return 'True,';
            else if (data === false) return 'False,';
            else if (!data) return ',';

            if (!isNaN(parseFloat(data)) && isFinite(data)) {
                if (data[0] == 0) {
                    return '="' + data + '",';
                }
                return data + ',';
            }

            //handle line feeds/carriage returns
            data = data.replace(/(?:\r\n|\r|\n)/g, ' ');

            return '"' + data.toString().replace(/"/g, '""') + '",';
        };

        dataFactory.getAllEntrantWinners = function (propId, seasonId) {
            $http.get(urlBase + '/export/GetAllEntrantWinners/' + propId + '/' + seasonId, sharedProperties.AuthenticationHeader())
            .success(function (data, status, headers) {
                if (data.length == 0) {
                    alert("No data to export");
                    return;
                }

                var array = typeof data != 'object' ? JSON.parse(data) : data;
                var str = '';
                var line = '';
                var maxEntryCount = array[0]["Entries"];

                for (var index in array[0]) {
                    if (index != "EntryString")
                        line += index + ',';
                }

                for (var x = 1; x <= maxEntryCount; x++) {
                    line += "EntryID" + x + ",PieceTitle" + x + ",MediaType" + x + ",categoryType" + x + ",Category" + x + ",Award Level" + x + ",Finalized Date" + x + ",";
                }

                line = line.slice(0, -1);
                str += line + '\r\n';

                for (var i = 0; i < array.length; i++) {
                    var line = '';

                    for (var index in array[i]) {
                        if (index == "EntryString") {
                            var tempString = array[i][index];
                            var tempArray = tempString.split('-||-&%'); //this is a 'super unique' identifier
                            //split up values to sanitize
                            for (var item in tempArray) {
                                line += sanitizeCSVData(tempArray[item]);
                            }
                        }
                        else
                            line += sanitizeCSVData(array[i][index]);
                    }

                    line = line.slice(0, -1);
                    str += line + '\r\n';
                }

                downloadFile("EntrantWinnersProperty" + propId + "Season" + seasonId + ".csv", str, status, headers);
            })
            .error(function (data, status) {
                console.log("Request failed with status: " + status);
            });
        };

        dataFactory.getFilteredEntries = function (props) {
            return $http.post(urlBase + '/export/ExportEntries/', props, sharedProperties.AuthenticationHeader())
        };

        dataFactory.exportMerchReport = function (propId) {
            return $http.get(urlBase + '/export/ExportMerchReport/' + propId, sharedProperties.AuthenticationHeader())
        }

        dataFactory.exportReviewers = function (props) {
            return $http.post(urlBase + '/export/ExportReviewers/', props, sharedProperties.AuthenticationHeader())
        };

        dataFactory.ExportEntrants = function (filters) {
            return $http.post(urlBase + "/export/entrant/list", filters, sharedProperties.AuthenticationHeader());
        }

        dataFactory.exportAwardPackage = function (propId) {
            return $http.get(urlBase + '/export/ExportAwardPackage/' + propId, sharedProperties.AuthenticationHeader())
        }

        dataFactory.exportOrders = function (props) {
            return $http.post(urlBase + '/export/ExportOrders/', props, sharedProperties.AuthenticationHeader())
        };

        dataFactory.exportEntriesOff = function (props) {
            return $http.post(urlBase + '/export/ExportEntriesOff/', props, sharedProperties.AuthenticationHeader());
        };

        dataFactory.exportBallotCounts = function (propertyId, seasonId) {
            return $http.get(urlBase + '/export/ExportBallotCounts/' + propertyId + '/' + seasonId, sharedProperties.AuthenticationHeader());
        };
        
        dataFactory.exportWinnersForAudit = function (propertyId, seasonId) {
            return $http.get(urlBase + '/export/ExportWinnersForAudit/' + propertyId + '/' + seasonId, sharedProperties.AuthenticationHeader());
        };
        
        dataFactory.ExportJudgingResults = function (propertyId, seasonId) {
            return $http.get(urlBase + '/export/ExportJudgingResults/' + propertyId + '/' + seasonId, sharedProperties.AuthenticationHeader());
        };
        
        dataFactory.ExportPVRankings = function (propertyId, seasonId) {
            return $http.get(urlBase + '/export/ExportPVRankings/' + propertyId + '/' + seasonId, sharedProperties.AuthenticationHeader());
        };
        dataFactory.getJudgesRecommendationsCSVForAdmin = function (data) {
            return $http.get(urlBase + '/Reviewer/GetJudgesRecommendationsCSVForAdmin/' + data, sharedProperties.AuthenticationHeader());
        };
        dataFactory.getSpecialAchievementRecommendationsCSVForAdmin = function (data) {
            return $http.get(urlBase + '/Reviewer/GetSpecialAchievementRecommendationsCSVForAdmin/' + data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getSeasonWinnerJson = function (propId, seasonId, year) {
            $http.get(urlBase + '/Winners/GetWinnerJson/' + propId + '/' + seasonId, sharedProperties.AuthenticationHeader())
            .success(function (data, status, headers) {
                if (data.length == 0) {
                    alert("No data to export");
                    return;
                }

                downloadFile(year + ".json", JSON.stringify(data), status, headers);
            })
            .error(function (data, status) {
                console.log("Request failed with status: " + status);
            });
        };
        

        dataFactory.getAttendeeReport = function (propId) {
            return $http.get(urlBase + '/export/ExportAttendeeList/' + propId, sharedProperties.AuthenticationHeader())
        }

        dataFactory.exportPieceCreditsCSV = function (propId, seasonNumber) {
            $http.get(urlBase + '/export/ExportPieceCreditList/' + propId + '/' + (seasonNumber ? seasonNumber : ''), sharedProperties.AuthenticationHeader())
                .success(function (data, status, headers) {
                    if (!data || !data.Success) {
                        alert("Error retrieving export data");
                        return;
                    }
                    else if (data.Data.length == 0) {
                        alert("No data to export");
                        return;
                    }

                    var array = typeof data.Data != 'object' ? JSON.parse(data.Data) : data.Data;
                    var str = 'PieceID, Title, Organization, CreditFirst, CreditLast, CreditTitle, CreditOrganization' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['PieceID']) + sanitizeCSVData(array[p]['Title']) + sanitizeCSVData(array[p]['FinalOrganization']);

                        for (var c = 0; c < array[p]['Credits'].length; c++) {
                            var credit = array[p]['Credits'][c];
                            var tempLine = line + sanitizeCSVData(credit['FirstName']) + sanitizeCSVData(credit['LastName']) + sanitizeCSVData(credit['Title']) + sanitizeCSVData(credit['Organization']);

                            tempLine = tempLine.slice(0, -1);
                            str += tempLine + '\r\n';
                        }
                    }
                    
                    sharedProperties.DownloadCSV({ data: { Data: str } }, "PieceCreditExport-" + propId + "-Season-" + (seasonNumber ? seasonNumber : '') + ".csv");
                })
                .error(function (data, status) {
                    console.log("Request failed with status: " + status);
                });
        };

        dataFactory.exportPVCategoryURLsCSV = function (propertyId, seasonId) {
            $http.post(urlBase + '/export/ExportCategoriesWithPVURL/', { "SeasonID": seasonId, "PropertyID": propertyId }, sharedProperties.AuthenticationHeader())
                .success(function (data, status, headers) {
                    if (!data || !data.Success) {
                        alert("Error retrieving export data");
                        return;
                    }
                    else if (data.Data.length == 0) {
                        alert("No data to export");
                        return;
                    }

                    var array = typeof data.Data != 'object' ? JSON.parse(data.Data) : data.Data;
                    var str = 'CategoryID, MediaType, CategoryType, Category, PVURL' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['CategoryID']) + sanitizeCSVData(array[p]['MediaType']) + sanitizeCSVData(array[p]['CategoryType'])
                            + sanitizeCSVData(array[p]['Category']) + sanitizeCSVData(array[p]['PVURL']);

                        str += line + '\r\n';
                    }

                    sharedProperties.DownloadCSV({ data: { Data: str } }, "PVCategoryURLExport-" + propertyId + "-Season-" + seasonId + ".csv");
                })
                .error(function (data, status) {
                    console.log("Request failed with status: " + status);
                });
        };

        dataFactory.exportPVVotersCSV = function (propertyId, seasonId) {
            $http.post(urlBase + '/export/ExportPVVoters/', { "SeasonID": seasonId, "PropertyID": propertyId }, sharedProperties.AuthenticationHeader())
                .success(function (data, status, headers) {
                    if (!data || !data.Success) {
                        alert("Error retrieving export data");
                        return;
                    }
                    else if (data.Data.length == 0) {
                        alert("No data to export");
                        return;
                    }

                    var array = typeof data.Data != 'object' ? JSON.parse(data.Data) : data.Data;
                    var str = 'Email, Validated, ConfirmationURL' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['Email']) + sanitizeCSVData(array[p]['Validated']) + sanitizeCSVData(array[p]['ConfirmationURL']);
                        str += line + '\r\n';
                    }

                    sharedProperties.DownloadCSV({ data: { Data: str } }, "PVVotersExport-" + propertyId + "-Season-" + seasonId + ".csv");
                })
                .error(function (data, status) {
                    console.log("Request failed with status: " + status);
                });
        };

        dataFactory.exportPVVotersByEntryIDCSV = function (propertyId, seasonId, entryId) {
            $http.post(urlBase + '/export/ExportPVVotersByEntryID/', { "SeasonID": seasonId, "PropertyID": propertyId, "EntryID": entryId }, sharedProperties.AuthenticationHeader())
                .success(function (data, status, headers) {
                    if (!data || !data.Success) {
                        alert("Error retrieving export data");
                        return;
                    }
                    else if (data.Data.length == 0) {
                        alert("No data to export");
                        return;
                    }

                    var array = typeof data.Data != 'object' ? JSON.parse(data.Data) : data.Data;
                    var str = 'Email, Validated, SignUp Date, IP Address, Vote Date' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['Email']) + sanitizeCSVData(array[p]['Validated']) + sanitizeCSVData(array[p]['DateCreated'])
                            + sanitizeCSVData(array[p]['UserIP']) + sanitizeCSVData(array[p]['VoteDate']);
                        str += line + '\r\n';
                    }

                    sharedProperties.DownloadCSV({ data: { Data: str } }, "PVVotersExportByEntryID-" + propertyId + "-Season-" + seasonId + "-Entry-" + entryId + ".csv");
                })
                .error(function (data, status) {
                    console.log("Request failed with status: " + status);
                });
        };

        dataFactory.exportPVCloseRaceCSV = function (seasonId) {
            $http.post(urlBase + '/export/ExportPVCloseRace/', { "SeasonID": seasonId }, sharedProperties.AuthenticationHeader())
                .success(function (data, status, headers) {
                    if (!data || !data.Success) {
                        alert("Error retrieving export data");
                        return;
                    }
                    else if (data.Data.length == 0) {
                        alert("No data to export");
                        return;
                    }

                    var array = typeof data.Data != 'object' ? JSON.parse(data.Data) : data.Data;
                    var str = 'FirstPlaceEntryID, FirstPlaceEntryName, SecondPlaceEntryID, SecondPlaceEntryName, CategoryID, MediaType, CatType, Category, Difference(%)' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['FirstPlaceEntryID']) + sanitizeCSVData(array[p]['FirstPlaceEntryName']) + sanitizeCSVData(array[p]['SecondPlaceEntryID'])
                            + sanitizeCSVData(array[p]['SecondPlaceEntryName']) + sanitizeCSVData(array[p]['CategoryID']) + sanitizeCSVData(array[p]['MediaType']) + sanitizeCSVData(array[p]['CatType'])
                            + sanitizeCSVData(array[p]['Category']) + sanitizeCSVData(array[p]['Difference']);
                        str += line + '\r\n';
                    }

                    sharedProperties.DownloadCSV({ data: { Data: str } }, "PVCloseRaceExport-Season-" + seasonId + ".csv");
                })
                .error(function (data, status) {
                    console.log("Request failed with status: " + status);
                });
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('fileUploadFactory', ['$http', function ($http) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET
        dataFactory.GetUploadSettings = function () {
            return $http.post(urlBase + '/file/GetUploadSettings', data);
        };


        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('geoFactory', ['$http', function ($http) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};
        var config = {cache: true};

        // GET
        dataFactory.getCountries = function (propertyid) {
            return $http.get(urlBase + '/Geo/GetCountries/' + (propertyid ? propertyid : ''), config);
        };

        // Get
        dataFactory.getStates = function (id) {
            return $http.get(urlBase + '/Geo/GetStates/'+ id, config);
        };

        dataFactory.getStatesByCountryAbbrev = function (id) {
            return $http.get(urlBase + '/Geo/GetStates/Abbrev/' + id, config);
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('judgesFactory', ['$http', 'sharedProperties', '$q', function ($http, sharedProperties, $q) {
        var urlBase = appSettings.WebApiUrl;

        return {
            getReviewers: function (payload) {
                return $http.post(urlBase + '/Reviewer/GetReviewersByProperty', payload, sharedProperties.AuthenticationHeader());
            },
            getReviewerFilterOptions: function(ids) {
                return $http.post(urlBase + '/Reviewer/GetReviewerFilterOptionsVMForJudgingProperty', ids, sharedProperties.AuthenticationHeader());
            },
            getReviewerFilterCategoryOptions: function(ids) {
                return $http.post(urlBase + '/Reviewer/GetReviewerCategoryFilterOptionsVMForJudgingProperty', ids, sharedProperties.AuthenticationHeader());
            },
            getReviewerData: function (reviewerId) {
                return $http.get(urlBase + '/Reviewer/GetReviewerDetails/' + reviewerId, sharedProperties.AuthenticationHeader());
            },
            saveReviewerDetail: function (reviewerDetail) {
                return $http.post(urlBase + '/Reviewer/SaveReviewer', {Data: reviewerDetail}, sharedProperties.AuthenticationHeader());
            },
            getPropertyOptionsById: function (propertyId) {
                var headers = sharedProperties.AuthenticationHeader() || {};
                headers.cache = true;
                return $http.get(urlBase + '/Reviewer/GetReviewerDetailOptions/' + propertyId, headers);
            },
            bulkUpdateReviewers: function (data) {
                return $http.post(urlBase + '/Reviewer/BulkUpdateReviewers', data, sharedProperties.AuthenticationHeader());
            },
            enableSeasonForReviewer: function (reviewerId, seasonId) {
                if (!reviewerId || !seasonId) {
                    return console.error('missing parameter');
                }
                var data = {
                    SeasonID: seasonId,
                    UserID: reviewerId
                };
                return $http.post(urlBase + '/Reviewer/EnableSeasonForReviewer/', data, sharedProperties.AuthenticationHeader());
            },
            deleteReviewer: function (reviewerId) {
                return $http.post(urlBase + '/Reviewer/DeleteReviewer/', { Id: reviewerId }, sharedProperties.AuthenticationHeader())
            }
            ,
            reactivateReviewer: function (reviewerId) {
                return $http.post(urlBase + '/Reviewer/ReactivateReviewer/', { Id: reviewerId }, sharedProperties.AuthenticationHeader())
            },
            getTieBreakerOptions: function (entryPropertyID, primaryClusterID, userID) {
                return $http.post(urlBase + '/Reviewer/GetTieBreakerOptions/', { ClusterID: primaryClusterID, EntryPropertyID: entryPropertyID, UserID: userID }, sharedProperties.AuthenticationHeader())

            },
            sendMidTermEmails: function (IsMidTerm) {
                return $http.get(urlBase + '/Reviewer/SendMidTermEmails/' + IsMidTerm, sharedProperties.AuthenticationHeader());
            },
            submitJudgesRecommendation: function (data) {
                return $http.post(urlBase + '/Reviewer/SubmitJudgesRecommendation/', data, sharedProperties.AuthenticationHeader());
            },
            submitSpecialAchievement: function (data) {
                return $http.post(urlBase + '/Reviewer/SubmitSpecialAchievement/', data, sharedProperties.AuthenticationHeader());
            },
            getJudgesRecommendationsForAdmin: function (data) {
                return $http.get(urlBase + '/Reviewer/GetJudgesRecommendationsForAdmin/' + data, sharedProperties.AuthenticationHeader());
            },
            updateReviewerHeadshot: function (data, isAdmin) {
                return $http.post(urlBase + '/Reviewer/UpdateHeadshotImage' + (isAdmin ? 'Admin' : ''), data, sharedProperties.AuthenticationHeader());
            },
            UpdateFeaturedStatus: function (data) {
                return $http.post(urlBase + '/Reviewer/UpdateFeaturedStatus', data, sharedProperties.AuthenticationHeader());
            },
            UpdateFeaturedReviewerOrder: function (data) {
                return $http.post(urlBase + '/Reviewer/UpdateFeaturedReviewerOrder', data, sharedProperties.AuthenticationHeader());
            }
        }

    }]);;
angular.module('rmModules')
  .factory('mediaTypesFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {
    var urlBase = appSettings.WebApiUrl;

    return {
        getMediaTypes: function (seasonId) {
            return $http.get(urlBase + '/category/GetMediaTypes/' + seasonId, sharedProperties.AuthenticationHeader());
        },

        getCategoryTypes: function (mediaTypeId) {
            return $http.get(urlBase + '/category/GetCategoryTypes/' + mediaTypeId, sharedProperties.AuthenticationHeader());
        },
        getPVCategoryTypes: function (mediaTypeID, propID) {
            return $http.post(urlBase + '/category/GetPVCategoryTypes/', '{ mediaTypeID:' + mediaTypeID + ',propID:' + propID + '}', sharedProperties.AuthenticationHeader());
        },
        getGalleryMediaTypesAndCategories: function () {
            return $http.post(urlBase + '/category/GetGalleryMediaTypesAndCategories/');
        },
        getGalleryCategory: function (categoryGalleryID) {
            return $http.get(urlBase + '/category/GetGalleryCategory/' + categoryGalleryID);
        }
        ,
        getCategoryGalleryYearsGrouping: function (data) {
            return $http.post(urlBase + '/category/GetCategoryGalleryYearsGrouping/', data);
        },
        getGalleryCategories: function (data) {
            return $http.post(urlBase + '/category/GetGalleryCategories/', data);
        }
    }

  }]);;
angular.module('rmModules')
    .factory('mobileDetectionFactory', ['$http','sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};
        var config = { cache: true };

    

        // POST
        dataFactory.urlChecker = function (url) {
            if (sharedProperties.getProperty("urlToCheck_" + url.url)) {
                return sharedProperties.getProperty("urlToCheck_" + url.url);
            } else {
                var result = $http.post(urlBase + '/Url/urlChecker', url);
                sharedProperties.setProperty("urlToCheck_" + url.url, result)
                return result;
            }
        };


        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('orderFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // POST
        dataFactory.submitCart = function (cart, transaction) {
            return $http.post(urlBase + '/order/submitcart', { cartInfo: cart, cardInfo: transaction}, sharedProperties.AuthenticationHeader());
        };

        dataFactory.GetOrder = function (confirmation) {
            return $http.get(urlBase + '/order/GetOrderByConfirmationNumber/' + confirmation, sharedProperties.AuthenticationHeader());
        };

        dataFactory.updateOrder = function (order, isPOEdit) {
            return $http.post(urlBase + '/order/' + (isPOEdit ? 'updateProductOrderEdit' : 'updateOrder'), order, sharedProperties.AuthenticationHeader());
        };
        
        dataFactory.submitCreditCardPayment = function (data) {
            return $http.post(urlBase + '/order/ProcessCreditCardForOrder', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getOrderForPaying = function (orderId) {
            return $http.get(urlBase + '/order/GetOrderForPaying/' + orderId, sharedProperties.AuthenticationHeader());
        };


        dataFactory.submitCreditCardPaymentDash = function (data) {
            return $http.post(urlBase + '/order/ProcessCreditCardForOrderDash', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.calcVat = function (data) {
            return $http.post(urlBase + '/order/CalcVat', { cartInfo: data }, sharedProperties.AuthenticationHeader());
        };
        dataFactory.resendOrderEmail = function (orderID) {
            return $http.get(urlBase + '/order/ResendOrderEmail/'+orderID, sharedProperties.AuthenticationHeader());
        };
        dataFactory.getProductsForOrderListing = function (propertyID) {
            return $http.get(urlBase + '/order/GetProductsForOrderListing/' + propertyID, sharedProperties.AuthenticationHeader());
        }

        dataFactory.getOrderTypesForOrderListing = function () {
            return $http.get(urlBase + '/order/GetOrderTypesForOrderListing', sharedProperties.AuthenticationHeader());
        }
        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('pdfFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        dataFactory.getInvoice = function (orderID) {
            var config = sharedProperties.AuthenticationHeader();
            config.responseType = 'arraybuffer';
            return $http.get(urlBase + '/temp/pdf/invoice/' + orderID, config);
        };

        dataFactory.getPackingLabel = function (orderID) {
            var config = sharedProperties.AuthenticationHeader();
            config.responseType = 'arraybuffer';
            return $http.get(urlBase + '/temp/pdf/packinglabel/' + orderID, config);
        };

        dataFactory.getShippingLabel = function (orderID) {
            var config = sharedProperties.AuthenticationHeader();
            config.responseType = 'arraybuffer';
            return $http.get(urlBase + '/temp/pdf/shippinglabel/' + orderID, config);
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('propertyFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET property details
        dataFactory.getPropertyDetails = function(propid) {
            return $http.get(urlBase + '/property/' + propid);
        };

        dataFactory.getNonJudgingProperties = function () {
            return $http.get(urlBase + '/property/GetNonJudgingProperties', sharedProperties.AuthenticationHeader());
        };

        dataFactory.getAllProperties = function () {
            return $http.get(urlBase + '/property/GetAllProperties', sharedProperties.AuthenticationHeader());
        };

        dataFactory.getPropertyGroups = function (payload) {
            return $http.post(urlBase + '/Property/GetPropertyGroups', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.updatePropertyGroups = function (payload) {
            return $http.post(urlBase + '/Property/UpdatePropertyGroups', payload, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getDashboardsForProperty = function (propertyID) {
            return $http.get(urlBase + '/property/getDashboardsForProperty/' + propertyID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getDashboardsForEntries = function ( pageSettings) {
            
            return $http.post(urlBase + '/property/GetDashboardsForEntries', pageSettings, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getTicketSalesForProperty = function (propertyID) {
            return $http.get(urlBase + '/ecommerce/GetPropertyTicketSales/' + propertyID, sharedProperties.AuthenticationHeader());
        };
        dataFactory.getActiveEntryPropertyForSpecialAchievements = function (includeRecommendations, judgingPropertyID) {
            return $http.get(urlBase + '/property/GetActiveEntryPropertyForSpecialAchievements/' + includeRecommendations + "/" + judgingPropertyID, sharedProperties.AuthenticationHeader());
        }

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('publicVoteFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // withCredentials will send cookies (credentials)
        dataFactory.logout = function () {
            return $http.post(urlBase + '/PV/Logout', null, { withCredentials: true });
        };

        dataFactory.login = function (data) {
            return $http.post(urlBase + '/PV/Login', data, { withCredentials: true });
        };

        dataFactory.externalLogin = function (data) {
            return $http.post(urlBase + '/PV/ExternalLogin', data, { withCredentials: true });
        }

        dataFactory.authorizeTwitter = function (data) {
            return $http.post(urlBase + '/PV/AuthorizeTwitter', data, { withCredentials: true });
        }

        dataFactory.getInfo = function (data) {
            return $http.post(urlBase + '/PV/GetInfo', data, { withCredentials: true });
        }

        dataFactory.testAuth = function () {
            return $http.post(urlBase + "/PV/TestAuth", null, { withCredentials: true });
        }

        dataFactory.register = function (data) {
            return $http.post(urlBase + "/PV/Register", data, { withCredentials: true });
        }

        dataFactory.GetTwitterToken = function (data) {
            return $http.post(urlBase + "/PV/GetTwitterToken", data);
        }

        dataFactory.authorizeFacebook = function (data) {
            return $http.post(urlBase + "/PV/AuthorizeFacebook", data, { withCredentials: true });
        }

        dataFactory.authorizeOAuth = function (data) {
            return $http.post(urlBase + "/PV/AuthorizeOAuth", data, { withCredentials: true });
        }

        dataFactory.getPVBallot = function (data) {
            return $http.post(urlBase + "/PV/GetPVBallot", data, { withCredentials: true });
        }
        
        dataFactory.getPVBallotData = function (data) {
            return $http.post(urlBase + "/PV/GetPVBallotData", data, { withCredentials: true });
        }

        dataFactory.GetWebbyPVBallotDataVotedCats = function (data) {
            return $http.post(urlBase + "/PV/GetWebbyPVBallotDataVotedCats", data);
        }

        dataFactory.pvConfirm = function (data) {
            return $http.post(urlBase + "/PV/Confirm/", data);
        }

        dataFactory.pvResendConfirm = function () {
            return $http.post(urlBase + "/PV/ResendConfirm/", null, { withCredentials: true });
        }

        dataFactory.pvForgotPassword = function (data) {
            return $http.post(urlBase + "/PV/ForgotPassword/", data);
        }

        dataFactory.pvUpdatePassword = function (data) {
            return $http.post(urlBase + "/PV/UpdatePassword/", data);
        }

        dataFactory.getEntriesStats = function (data) {
            return $http.get(urlBase + '/PV/GetEntrantStatistics/' + data);
        }

        dataFactory.subscribe = function (data) {
            return $http.post(urlBase + "/PV/Subscribe", data, { withCredentials: true });
        }

        /**
         * Places a vote for the current user
         * @param {Object} data - The expected voting object that expects:  PropertyID, EntryID, SeasonID, MediaTypeID, PropertyCategoryID, Score, and PVUserID
         * @returns {Object} Returns an HttpPromise for Success and Error
         */
        dataFactory.pvPlaceVote = function (data) {
            return $http.post(urlBase + "/PV/Vote/", data);
        }
        dataFactory.pvLogSocial = function (data) {
            return $http.post(urlBase + "/PV/LogSocial/", data);
        }

        dataFactory.getCategoryPVSummary = function (data) {
            return $http.post(urlBase + '/PV/GetPVSummaryData', data, sharedProperties.AuthenticationHeader());
        }

        dataFactory.getPVOverview = function (data) {
            return $http.post(urlBase + '/PV/GetPVOverviewData', data, sharedProperties.AuthenticationHeader());
        }

        dataFactory.finalizePVSummaryData = function (data) {
            return $http.post(urlBase + '/PV/FinalizePVSummaryData', data, sharedProperties.AuthenticationHeader());
        }
        dataFactory.finalizePVSummaryDataStatus = function (data) {
            return $http.post(urlBase + '/PV/FinalizePVSummaryDataGetStatus', data, sharedProperties.AuthenticationHeader());
        }
        dataFactory.oauthCallbackPath = function () {
            return $http.get('/PublicVoting/OAuthCallbackPath');
        }
        dataFactory.getCurrentSeason = function (data) {
            return $http.get(urlBase + '/PV/GetCurrentSeason/' + data);
        }
        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('reviewsFactory', ['$http', 'sharedProperties', '$q', function ($http, sharedProperties, $q) {
        var urlBase = appSettings.WebApiUrl;

        var reviewsFactory = {};

        reviewsFactory.getNoLoadReasons = function () {
            return $http.get(urlBase + '/Review/GetNoLoadReasons', sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.getReviewsForEntry = function (entryID) {
            return $http.get(urlBase + '/Review/GetReviewsForEntry/' + entryID, sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.getReviewbyReviewID = function (reviewID) {
            return $http.get(urlBase + '/Review/GetReviewByReviewID/' + reviewID, sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.getReviewsForReviewer = function (options) {
          return $http.post(urlBase + '/Review/GetReviewsForReviewer', options, sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.getReviewEntry = function (data) {
            return $http.post(urlBase + '/Review/GetReviewEntry', data, sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.saveReviewEntry = function (data) {
            return $http.post(urlBase + '/Review/SaveReview', data, sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.updateReview = function (data) {
            return $http.post(urlBase + '/Review/UpdateReview', data, sharedProperties.AuthenticationHeader());
            };

        reviewsFactory.getCategorySummary = function (data) {
            return $http.post(urlBase + '/Review/GetCategorySummary', data, sharedProperties.AuthenticationHeader());
        }

        reviewsFactory.getCategoryExecutiveSummary = function (data) {
            return $http.post(urlBase + '/Review/GetCategoryExecutiveSummary', data, sharedProperties.AuthenticationHeader());
        }

        reviewsFactory.getReviewBallot = function (data) {
            return $http.post(urlBase + '/Review/GetReviewBallot', data, sharedProperties.AuthenticationHeader());
        };

        reviewsFactory.saveReviewBallot = function (data) {
            return $http.post(urlBase + '/Review/SaveReviewBallot', data, sharedProperties.AuthenticationHeader());
        };
        reviewsFactory.sendBallotForMobile = function (data) {
            return $http.post(urlBase + '/Review/SendExecBallotForMobile', data, sharedProperties.AuthenticationHeader());
        }
        return reviewsFactory;
    }]);
;
angular.module('rmModules')
    .factory('searchFactory', ['$http', function ($http) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET search data
        dataFactory.search = function(data) {
            return $http.post(urlBase + '/search/search', data);
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('seasonFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET property details
        dataFactory.getCurrentDetailsByProperty = function (propid) {
            return $http.get(urlBase + '/season/GetCurrentSeasonsByPropertyID/' + propid);
        };

        dataFactory.getSeasonsByPropertyID = function (propid) {
            return $http.get(urlBase + '/season/GetSeasonsByPropertyID/' + propid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.saveSeason = function (season) {
            return $http.post(urlBase + '/season/Save', season, sharedProperties.AuthenticationHeader());
        }

        dataFactory.cloneCategories = function (data) {
            return $http.post(urlBase + '/season/CloneCategories', data, sharedProperties.AuthenticationHeader());
        }
        
        dataFactory.cloneReviewersCategories = function (data) {
            return $http.post(urlBase + '/season/CloneReviewersCategoriesFromPriorSeason', data, sharedProperties.AuthenticationHeader());
        }

        dataFactory.cloneReviewersExecCategories = function (data) {
            return $http.post(urlBase + '/season/CloneReviewersExecCategoriesFromPriorSeason', data, sharedProperties.AuthenticationHeader());
        }

        dataFactory.cloneGroups = function (data) {
            return $http.post(urlBase + '/season/CloneGroups', data, sharedProperties.AuthenticationHeader());
        }

        dataFactory.cloneReviewers = function (data) {
            return $http.post(urlBase + '/season/CloneReviewers', data, sharedProperties.AuthenticationHeader());
        }
        dataFactory.cloneRecommendations = function (data) {
            return $http.post(urlBase + '/season/CloneRecommendations', data, sharedProperties.AuthenticationHeader());
        }
        dataFactory.cloneProducts = function (data) {
            return $http.post(urlBase + '/season/CloneProducts', data, sharedProperties.AuthenticationHeader());
        }

        dataFactory.getSeason = function (seasonID) {
            return $http.get(urlBase + '/season/' + seasonID, sharedProperties.AuthenticationHeader());
        }

        dataFactory.getGalleryYears = function () {
            return $http.get(urlBase + '/season/GetForGalleryFilters');
        }

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('specialAchievementFactory', ['$http', function ($http) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        dataFactory.getGallerySpecialAchievement = function(data) {
            return $http.get(urlBase + '/SpecialAchievement/GetGallerySpecialAchievement/' + data);
        };

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('userFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET
        dataFactory.getUser = function (userid) {
            return $http.get(urlBase + '/user/' + userid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getUserAdmin = function (userid) {
            return $http.get(urlBase + '/user/administrative/' + userid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getUserEntrant = function (propertyId, userid) {
            return $http.get(urlBase + '/user/entrant/' + propertyId  + '/' + userid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getCurrentReviewer = function () {
            return $http.get(urlBase + '/Reviewer/GetCurrentReviewerDetails/', sharedProperties.AuthenticationHeader());
        }

        // POST
        dataFactory.insertUser = function (user) {
            return $http.post(urlBase + '/Account/Register', user, sharedProperties.AuthenticationHeader());
        };

        dataFactory.insertUserOauth = function (user) {
            return $http.post(urlBase + '/Account/RegisterOauth', user, sharedProperties.AuthenticationHeader());
        };

        dataFactory.verifyOAuth = function (data, provider) {
            return $http.post(urlBase + '/Account/Authorize', { Code: data, Provider: provider });
        };

        dataFactory.assignOAuth = function (data, provider) {
            return $http.post(urlBase + '/Account/AssignExternalLogin', { Code: data, Provider: provider }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.login = function (email, password, propertyID, appID) {
            var data = "grant_type=password&username=" + encodeURIComponent(email + (propertyID ? '_' + propertyID : '')) + "&password=" + encodeURIComponent(password) + (appID ? "&app_id=" + appID : "");
            var updatedUrl = urlBase.substring(0, urlBase.lastIndexOf("api")) + 'Token';
            return $http.post(updatedUrl, data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' } });
        };

        dataFactory.saveAdminUser = function (user) {
            return $http.post(urlBase + '/user/administrative', user, sharedProperties.AuthenticationHeader());
        };

        dataFactory.saveCurrentReviewer = function (user) {
            return $http.post(urlBase + '/Reviewer/SaveReviewer', user, sharedProperties.AuthenticationHeader());
        };

        dataFactory.saveNewReviewer = function (user) {
            return $http.post(urlBase + '/Reviewer/SaveNewReviewer', user, sharedProperties.AuthenticationHeader());
        };

        // for admins
        dataFactory.saveEntrantUser = function (user) {
            return $http.post(urlBase + '/user/entrant', user, sharedProperties.AuthenticationHeader());
        };

        // for entrants
        dataFactory.saveEntrantDetails = function (user) {
            return $http.post(urlBase + '/user/entrant/save', user, sharedProperties.AuthenticationHeader()); 
        };
        
        dataFactory.getContact = function () {
            return $http.post(urlBase + '/Account/ContactInfo', null, sharedProperties.AuthenticationHeader());
        };

        dataFactory.isJudge = function (entryPropertyID) {
            return $http.post(urlBase + '/Account/JudgeInfo', { 'entryPropertyID': entryPropertyID || -1 }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.logout = function () {
            return $http.post(urlBase + '/Account/Logout', null, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getUserStatus = function () {
            return $http.get(urlBase + "/Account/userstatus", sharedProperties.AuthenticationHeader());
        }

        dataFactory.getUserList = function () {
            return $http.get(urlBase + "/user/administrative/list", sharedProperties.AuthenticationHeader());
        }

        // DELETE 
        dataFactory.deleteUser = function (userid) {
            return $http.delete(urlBase + "/user/administrative/" + userid, sharedProperties.AuthenticationHeader());
        }

        dataFactory.getEntrantList = function (filters) {
            return $http.post(urlBase + "/user/entrant/list", filters, sharedProperties.AuthenticationHeader());
        }

        dataFactory.forgotPassword = function (email, propertyid, reminder, appTypeID) {
            var data = { Email: email, PropertyID: propertyid, AppTypeID: appTypeID };
            if (reminder == true) {
                data.IsReminder = true;
            }
            return $http.post(urlBase + "/Account/ForgotPassword", data);
        }

        dataFactory.resetPassword = function (email, propertyid, code, password, confirmPassword) {
            return $http.post(urlBase + "/Account/ResetPassword", { Email: email, PropertyID: propertyid, Code: code, Password: password, ConfirmPassword: confirmPassword }, sharedProperties.AuthenticationHeader());
        }

        return dataFactory;
    }]);;
angular.module('rmModules')
    .factory('analyticsService', ['sharedProperties', 'analyticsFactory', function (sharedProperties, analyticsFactory) {
        var dataFactory = {};

        dataFactory.enums = {
            actions: {
                view: 1
            },
            content: {
                galleryPiece: 1,
                galleryAch: 2
            }
        };

        dataFactory.trackContent = function (data) {
            if (sharedProperties.HasToken())
                return analyticsFactory.track(data);
            return;
        };

        return dataFactory;
    }]);;
angular.module('rmModules').factory('pageMetaFactory', function () {
    var pageObj = {};
    pageObj.title = "Webby Awards";
    pageObj.description = "Welcome to Webby Awards Gallery.";

    pageObj.clearTitle = function () {
        pageObj.title = "Webby Awards";
    };

    pageObj.clearDescription = function () {
        pageObj.description = "Welcome to Webby Awards Gallery.";
        setMetaInfo();
    };

    pageObj.setTitle = function (title) {
        pageObj.title = "Webby Awards: " + title;
    };

    pageObj.setDescription = function (description) {
        pageObj.description = description;
        setMetaInfo();
    };

    function setMetaInfo() {
        var metaNodes = document.getElementsByTagName("meta");
        var descNode = _.filter(metaNodes, function (item) { return item.name == "description"; });
        if (descNode && descNode[0]) {
            descNode[0].content = pageObj.description;
        }
    }

    return pageObj;
});;
angular.module('rmModules')
    .service('sharedProperties', ['$rootScope', '$location', 'appType', function ($rootScope, $location, appType) {
        var properties = [];
        var tokenKey = "tokenKey";
        var profile = "userprofile";
        var APlusAccess = "aplusOnly";
        var MagellanAccess = "MagellanOnly";
        var extendedFlag = "extended";

        var getStorageItem = function (key) {
            return localStorage.getItem(key) || sessionStorage.getItem(key);
        };

        var removeStorageItem = function (key) {
            sessionStorage.removeItem(key);
            localStorage.removeItem(key);
        };

        return {
            titleCase: function titleCase(str) {
                if (!str)
                    return '';
                str = str.toLowerCase().split(' ');
                for (var i = 0; i < str.length; i++) {
                    str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1);
                }
                return str.join(' ');
            },
            clearLocalStorage: function (type) {
                //Also defined in exceptionhandler.js - since including sharedProperties causes EPIC FAIL

                if (type === 'entries') {
                    //get the token data
                    var tkn = localStorage.getItem(tokenKey);
                    var tknGuest = localStorage.getItem(tokenKey + "_guest");

                    //clear storage
                    localStorage.clear();

                    //reset the token data
                    if (tkn != null) { localStorage.setItem(tokenKey, tkn); }
                    if (tknGuest != null) { localStorage.setItem(tokenKey + "_guest", tknGuest); }
                }
            },
            getProperty: function (key) {
                return properties[key];
            },
            setProperty: function (key, value) {
                properties[key] = value;
            },
            SetAccessLimited: function (site, data) {
                if (site == "APlus") {
                    sessionStorage.setItem(APlusAccess, data);
                } else if (site == "Magellan") {
                    sessionStorage.setItem(MagellanAccess, data);
                }
            },
            GetAccessLimited: function () {
                var access = ""
                if (sessionStorage.getItem(APlusAccess) === 'true')
                    access += "APlus,";
                if (sessionStorage.getItem(MagellanAccess) === 'true')
                    access += "Magellan,";

                return access;
            },
            loginPVUser: function (data) {
                $rootScope.$broadcast('loginPVUser', data);
            },
            logoutPVUser: function (data) {
                $rootScope.$broadcast('logoutPVUser', data);
            },
            updateUser: function (user) {
                $rootScope.$broadcast('updateUser', { data: user });
            },
            IsWebbyOrLovie: function () {
                if (appType == 'admin') return false;
                return ([1, 3].indexOf(properties["propertyDetails"].PropertyID)) > -1;
            },
            TokenKey: tokenKey,
            AuthenticationHeader: function () {
                var propID = appType != 'admin' ? properties["propertyDetails"].PropertyID : 0;
                var hasGuestAccounts = propID == 1 || propID == 3;
                return { headers: { 'Authorization': 'Bearer ' + (getStorageItem(tokenKey) || (hasGuestAccounts ? getStorageItem(tokenKey + "_guest") : null)) } };
            },
            HasToken: function () { return (getStorageItem(tokenKey) ? true : false); },
            HasGuestToken: function () {
                var propID = appType != 'admin' ? properties["propertyDetails"].PropertyID : 0;
                var hasGuestAccounts = propID == 1 || propID == 3;
                return (hasGuestAccounts && getStorageItem(tokenKey + "_guest") ? true : false);
            },
            RemoveToken: function () { removeStorageItem(tokenKey); removeStorageItem(tokenKey + "_guest"); removeStorageItem(profile); },
            SetToken: function (data, isGuest) { localStorage.setItem(tokenKey + (isGuest ? "_guest" : ""), data); },
            RemoveProfile: function () { removeStorageItem(profile); },
            SetProfile: function (data) { localStorage.setItem(profile, data); },
            GetProfile: function () { return getStorageItem(profile); },
            SetExtended: function (data) { localStorage.setItem(extendedFlag, data); },
            GetExtended: function () { return getStorageItem(extendedFlag); },
            RemoveExtended: function () { removeStorageItem(extendedFlag); },
            GetSessionStorage: function (key) { getStorageItem(key); },
            SetSessionStorage: function (key, data) { sessionStorage.setItem(key, data); },
            RemoveSessionStorage: function (key) { sessionStorage.removeItem(key); },
            ShowThenHideArea: function (identifier, scroll) {
                if (scroll) {
                    $('html, body').animate({
                        scrollTop: $("body").offset().top
                    }, 1000);
                }
                $(identifier).show('slow', function () {
                    timerForShowSuccessAlert = setTimeout(function () {
                        $(identifier).slideUp(500, function () {
                            $(this).hide();
                        });
                    }, 3000);
                })
            },
            DateFormats: {
                dateOnly: 'shortDate',
                dateTime: 'M/d/yyyy hh:mm a',
                timeOnly: 'h:mm a'
            },
            FormatForLoginCallback: function () {
                if (!arguments || arguments.length == 0) { return null; }
                var response = {
                    Broadcast: arguments[0]
                };
                if (arguments.length > 1) {
                    response['fn'] = arguments[1];
                }
                if (arguments.length > 2) {
                    var args = Array.prototype.slice.call(arguments);
                    //remove first 2 items
                    args.shift();
                    args.shift();
                    response['Params'] = args;
                }

                return response;
            },
            GetPaymentStatusName: function (paymentStatusID) {
                switch (paymentStatusID) {

                    case 2:
                        return "Authorization Pending";
                        break;
                    case 3:
                        return "Authorization Declined";
                        break;
                    case 4:
                        return "Authorized";
                        break;
                    case 5:
                        return "Paid"
                        break;
                    default:
                        return "Unpaid";
                        break;
                }
            },
            TwitterRankedDictionary: [
                "Proud citizens of the Internet, show us what democracy looks like and VOTE for [[TITLE]]! They’re currently in [[RANK]] place 🗳 DO IT: &&LINK&& #[[CALLOUT]]",
                "Big flex, [[TITLE]] is [[RANK]] place in #[[AWARD]]. RT + VOTE: &&LINK&&",
                "👏 [[TITLE]] 👏 is 👏 in 👏 [[RANK]]👏place👏 I voted and they need YOU to vote too: &&LINK&& #[[CALLOUT]]",
                "Can’t wait to hear [[TITLE]]’s #5WordSpeech 🤩! They’re in [[RANK]] place, VOTE: &&LINK&& #[[CALLOUT]]",
                "☕️ Here’s the mf tea: [[TITLE]] is in [[RANK]] place in #[[AWARD]] & they need your votes to WIN: &&LINK&&",
                "📣 [[TITLE]] is in [[RANK]] place and so close to joining the #[[CALLOUT]] Winners Circle. RT + VOTE: &&LINK&&",
                "👋 [[TITLE]] is in [[RANK]] place in #[[AWARD]], and they can’t win without your votes. Period. VOTE: &&LINK&&",
                "FACT: [[TITLE]] is in [[RANK]] place in #[[AWARD]]. FACT: They can’t win without your vote 👉 &&LINK&&",
                "You + [[TITLE]] = #[[AWARD]] VICTORY 🙌. They’re currently in [[RANK]] place. VOTE RN: &&LINK&&",
                "Look out, [[TITLE]] is going straight to the top ⬆️, now in [[RANK]] place! &&LINK&& 💯 #[[CALLOUT]]",
                "〈( ^.^)ノCheering for [[TITLE]] in [[RANK]] place in #[[AWARD]]! RT + VOTE: &&LINK&&ヽ(^。^)丿"
            ],
            TwitterNonRankedDictionary: [
                "☕️ Here’s the mf tea: #[[AWARD]] ends TODAY and [[TITLE]] needs your votes to win! RT & VOTE: &&LINK&&",
                "If [[TITLE]] doesn’t win a [[AWARD]] & you didn’t vote, that’s on YOU. Voting ends TODAY. Do your part 👉 &&LINK&& #[[CALLOUT]]",
                "My vote 🙋‍♀️ + yours 🙋‍♂️ = #[[AWARD]] glory for [[TITLE]]. VOTING ENDS TODAY: &&LINK&& #[[CALLOUT]]",
                "Proud citizens of the Internet, show us what democracy looks like and VOTE for [[TITLE]]! Today’s the last day. 🗳 DO IT: &&LINK&& #[[CALLOUT]]"
            ],
            TwitterLovieRankedDictionary: [
                "ATTENTION: [[TITLE]] in [[RANK]] place in @lovieawards People's Lovie! 👏 Rally the troops & VOTE: &&LINK&& #Lovies",
                "Look out, [[TITLE]] is going straight to the top ⬆️ Now in [[RANK]] place in People's @lovieawards! &&LINK&& #Lovies",
                "👏 [[TITLE]] 👏 is in [[RANK]] place in People's @lovieawards! I voted and they need YOU to vote too: &&LINK&& #Lovies",
                "Help [[TITLE]] get to People’s Lovie VICTORY. They're in [[RANK]] place. VOTE NOW: &&LINK&& #Lovies",
                "Help me push [[TITLE]] over the top! They’re in [[RANK]] place, VOTE: &&LINK&& #Lovies",
                "🚨 [[TITLE]] is now in [[RANK]] place in the People’s @lovieawards 🚨 VOTE VOTE VOTE: &&LINK&& #Lovies",
                "🆘 [[TITLE]] is in [[RANK]] place and so close to joining the #Lovies Winners Circle. RT + VOTE: &&LINK&&",
                "〈( .)ノCheering for [[TITLE]] in [[RANK]] place for People’s Lovie! RT + VOTE: &&LINK&&ヽ(。)丿#Lovies",
                ".[[TITLE]] is on 🔥! They're [[RANK]] place in People's Lovie voting. Give ‘em some ❤️ + VOTE: &&LINK&& #Lovies",
                "I just voted for [[TITLE]] in the People's @lovieawards and you should too. Vote now! &&LINK&& #Lovies"
            ],
            TwitterLovieNonRankedDictionary: [
                "Get your clicking fingers ready! Help [[TITLE]] win a People's Lovie Award. Voting ends TODAY &&LINK&& #Lovies",
                "My vote + yours = People's Lovie glory for [[TITLE]]. Vote now! &&LINK&& #Lovies",
                "My vote + yours = People's Lovie glory for [[TITLE]]. VOTING ENDS TODAY: &&LINK&& #Lovies",
                "Proud citizens of the Internet, do your civic duty and vote for [[TITLE]] Last day! DO IT: &&LINK&& #Lovies"
            ],
            GetPVTwitterMessage: function (entry, link, isLastDay) {
                var twitter_callout = "";
                var award_name = "";
                switch (properties["propertyDetails"].PropertyID) {
                    case 8:
                        twitter_callout = "Tellys";
                        award_name = "People's Telly";
                        break;
                    case 7:
                        twitter_callout = "@architizer A+Awards";
                        award_name = "Popular Choice";
                        break;
                    case 3:
                        twitter_callout = "Lovie";
                        award_name = "People's Lovie";
                        break;
                    case 1:
                        twitter_callout = "Webbys";
                        award_name = "Webbys People’s Voice";
                        break;
                    default:
                        twitter_callout = "";
                        break;
                }

                var message = "";
                if (properties["propertyDetails"].PropertyID != 1 && properties["propertyDetails"].PropertyID != 3 && properties["propertyDetails"].PropertyID != 8) { // everyone but Webbys
                    message = isLastDay ? (entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title) + " is competing in the " + twitter_callout + ". Let's help them win a Popular Choice Award!! &&LINK&&" :
                              (entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title) + " is now in " + this.getOrdinal(entry.CurrentRank, true) + " place for the " + twitter_callout + ". RT + VOTE: &&LINK&&";
                }
                else if (properties["propertyDetails"].PropertyID == 8) {
                    message = isLastDay ? (entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title) + " is competing in the " + twitter_callout + ". Let's help them win a " + award_name + " Awards!! &&LINK&&" :
                        (entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title) + " is now ready to be rated in the " + award_name + " Awards. RT + VOTE: &&LINK&&";
                }
                else if (properties["propertyDetails"].PropertyID == 3) {
                    message = isLastDay ? this.TwitterLovieNonRankedDictionary[Math.floor(Math.random() * this.TwitterLovieNonRankedDictionary.length)] : this.TwitterLovieRankedDictionary[Math.floor(Math.random() * this.TwitterLovieRankedDictionary.length)];
                    message = message.replace("[[TITLE]]", entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title).replace(/\[\[CALLOUT\]\]/g, twitter_callout).replace(/\[\[RANK\]\]/g, this.getOrdinal(entry.CurrentRank, true)).replace(/\[\[AWARD\]\]/g, award_name);
                }
                else { // Webbys random message
                    message = isLastDay ? this.TwitterNonRankedDictionary[Math.floor(Math.random() * this.TwitterNonRankedDictionary.length)] : this.TwitterRankedDictionary[Math.floor(Math.random() * this.TwitterRankedDictionary.length)];
                    message = message.replace("[[TITLE]]", entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title).replace(/\[\[CALLOUT\]\]/g, twitter_callout).replace(/\[\[RANK\]\]/g, this.getOrdinal(entry.CurrentRank, true)).replace(/\[\[AWARD\]\]/g, award_name);
                }
                // we have to build the link into the message and it must be encoded properly
                message = encodeURI(message).replace("&&LINK&&", link).replace(/#/g, '%23').replace(/\+/g, '%2B').replace(/&/g, '%26');

                return message;
            },
            FacebookOGDictionary: [
                { Title: "Webby People’s Voice needs YOU", Description: "The Internet can’t be stopped and neither can [[TITLE]]. Vote with me and bring them to Webbys victory." },
                { Title: "Love the Internet more than pizza? Us too.", Description: "I think [[TITLE]] is the best of the Internet. Vote with me for The 22nd Annual Webby People's Voice Awards!" },
                { Title: "Citizens of the Internet, it’s time to vote.", Description: "Let’s help [[TITLE]] win in the 22nd Annual Webby People’s Voice Awards. Vote with me." },
                { Title: "Get your clicking fingers ready.", Description: "I think [[TITLE]] is slaying the Internet. Let’s help them win a Webby People's Voice Award!" },
                { Title: "Your click counts!", Description: "I just voted for [[TITLE]] to win a Webby People’s Voice Award. You should too." },
                { Title: "Oh, it’s on.", Description: "I just voted for [[TITLE]] in the 22nd Annual Webby People’s Voice Awards. You should too, if you know what’s good." }
            ],
            FacebookLovieOGDictionary: [
                { Title: "The People’s Lovie Awards Needs You", Description: "I just voted for [[TITLE]] to win a People’s Lovie Award. You should too." }
            ],
            GetPVFacebookMessage: function (entry, isLastDay) {
                var facebook_callout = "";
                var award_name = "";
                var obj = {};
                switch (properties["propertyDetails"].PropertyID) {
                    case 8:
                        facebook_callout = "@tellyawards";
                        award_name = "People's Telly";
                        break;
                    case 7:
                        facebook_callout = "@architizer A+Awards";
                        award_name = "Popular Choice";
                        break;
                    case 3:
                        facebook_callout = "@lovieawards";
                        award_name = "People's Lovie";
                        break;
                    case 1:
                        facebook_callout = "@webbyawards";
                        award_name = "People’s Voice";
                    default:
                        break;
                }
                var message = "";
                if (properties["propertyDetails"].PropertyID != 1 && properties["propertyDetails"].PropertyID != 3 && properties["propertyDetails"].PropertyID != 8) { // everyone but Webbys
                    message = isLastDay ? entry.Title + " is competing in the " + facebook_callout + ". Let's help them win a " + award_name + " Award!!" :
                        entry.Title + " is now in " + this.getOrdinal(entry.CurrentRank, true) + " place for the " + facebook_callout + ". Let’s help them win a " + award_name + " Award!!";
                }
                if (properties["propertyDetails"].PropertyID == 8) {
                    message = isLastDay ? entry.Title + " is competing in the " + facebook_callout + ". Let's help them win a " + award_name + " Award!!" :
                        "You can now show your love for " + entry.Title + " in the People’s " + facebook_callout + ". Let’s help them win a " + award_name + " Award! Go vote now!";
                }
                else if (properties["propertyDetails"].PropertyID == 3) {
                    obj = this.FacebookLovieOGDictionary[0];
                    obj.Description = obj.Description.replace("[[TITLE]]", entry.Title);
                }
                else { // Webbys random Title and Description override for FB feed. no message?
                    obj = this.FacebookOGDictionary[Math.floor(Math.random() * this.FacebookOGDictionary.length)];
                    obj.Description = obj.Description.replace("[[TITLE]]", entry.AgencyName);
                }
                obj.message = message;
                return obj;
            },
            SubscriptionSet: function (id, bool) {
                localStorage.setItem("Subscription" + id, bool);
            },
            SubscriptionChecked: function (id) {
                return localStorage.getItem("Subscription" + id) === "true";
            },
            DownloadFile: function (orderID, specificFileName, specificFunction) {
                //FROM: http://stackoverflow.com/questions/24080018/download-file-from-an-asp-net-web-api-method-using-angularjs
                // Based on an implementation here: web.student.tuwien.ac.at/~e0427417/jsdownload.html
                var checkoutFileDownloadError = "";
                var debug = false;
                // Use an arraybuffer
                specificFunction(orderID)
                .success(function (data, status, headers) {
                    var octetStreamMime = 'application/octet-stream';
                    var success = false;
                    //Get the headers
                    headers = headers();

                    // Get the filename from the x-filename header or default to "download.pdf"
                    var filename = specificFileName || headers['x-filename'] || 'download.pdf';

                    // Determine the content type from the header or default to "application/octet-stream"
                    var contentType = headers['content-type'] || octetStreamMime;

                    try {
                        // Try using msSaveBlob if supported
                        if (debug) console.log("Trying saveBlob method ...");
                        var blob = new Blob([data], { type: contentType });
                        if (navigator.msSaveBlob)
                            navigator.msSaveBlob(blob, filename);
                        else {
                            // Try using other saveBlob implementations, if available
                            var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
                            if (saveBlob === undefined) throw "Not supported";
                            saveBlob(blob, filename);
                        }
                        if (debug) console.log("saveBlob succeeded");
                        success = true;
                    } catch (ex) {
                        if (debug) console.log("saveBlob method failed with the following exception:");
                        if (debug) console.log(ex);
                    }

                    if (!success) {
                        // Get the blob url creator
                        var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
                        if (urlCreator) {
                            // Try to use a download link
                            var link = document.createElement('a');
                            if ('download' in link) {
                                // Try to simulate a click
                                try {
                                    // Prepare a blob URL
                                    if (debug) console.log("Trying download link method with simulated click ...");
                                    var blob = new Blob([data], { type: contentType });
                                    var url = urlCreator.createObjectURL(blob);
                                    link.setAttribute('href', url);

                                    // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
                                    link.setAttribute("download", filename);

                                    // Simulate clicking the download link
                                    var event = document.createEvent('MouseEvents');
                                    event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                                    link.dispatchEvent(event);
                                    if (debug) console.log("Download link method with simulated click succeeded");
                                    success = true;

                                } catch (ex) {
                                    if (debug) console.log("Download link method with simulated click failed with the following exception:");
                                    if (debug) console.log(ex);
                                }
                            }

                            if (!success) {
                                // Fallback to window.location method
                                try {
                                    // Prepare a blob URL
                                    // Use application/octet-stream when using window.location to force download
                                    if (debug) console.log("Trying download link method with window.location ...");
                                    var blob = new Blob([data], { type: octetStreamMime });
                                    var url = urlCreator.createObjectURL(blob);
                                    window.location = url;
                                    if (debug) console.log("Download link method with window.location succeeded");
                                    success = true;
                                } catch (ex) {
                                    if (debug) console.log("Download link method with window.location failed with the following exception:");
                                    if (debug) console.log(ex);
                                }
                            }

                        }
                    }

                    if (!success) {
                        // Fallback to window.open method
                        if (debug) console.log("No methods worked for saving the arraybuffer, using last resort window.open");
                        window.open(httpPath, '_blank', '');
                    }
                })
                .error(function (data, status) {
                    if (debug) console.log("Request failed with status: " + status);

                    // Optionally write the error out to scope
                    return checkoutFileDownloadError = "Unable to download file.";
                });

            },
            DownloadCSV: function (res, filename) {
                var result = _.get(res, 'data', {});
                var blob = new Blob(["\ufeff", result.Data], { type: 'text/csv' });

                urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
                var dataUrl = urlCreator.createObjectURL(blob);

                if (navigator.msSaveBlob) {
                    navigator.msSaveBlob(blob, filename);
                }

                var element = document.createElement('a');

                element.setAttribute('href', dataUrl);
                element.setAttribute('download', filename);
                element.setAttribute('target', '_blank');

                if (document.createEvent) {
                    var event = document.createEvent('MouseEvents');
                    event.initEvent('click', true, true);
                    element.dispatchEvent(event);
                } else {
                    element.click();
                }
            },
            FilterRawQueryStringItems: function (paramStartsWith) {
                if (!paramStartsWith) {
                    return "";
                }

                var qs = $location.search();
                var newString = "";
                _.each(qs, function (value, key) {
                    if (key.toLowerCase().trim().substring(0, paramStartsWith.trim().length) === paramStartsWith.trim().toLowerCase()) {
                        newString = (newString ? newString + "&" : "") + (key + "=" + value);
                    }
                });
                return newString;
            },
            GetQueryStringItem: function (param) {
                var qs = $location.search();
                var newObject = {};
                _.each(qs, function (value, key) {
                    newObject[key.toLowerCase()] = value;
                });
                if (param in newObject) {
                    return newObject[param];
                }
                return '';
            },
            GetQueryStringItems: function (filterObj) {
                var qs = $location.search();
                var newObject = {};
                _.each(qs, function (value, key) {
                    newObject[key.toLowerCase()] = value;
                });
                for (var param in filterObj) {
                    if (param.toLowerCase() in newObject) {
                        filterObj[param] = newObject[param.toLowerCase()];
                    }
                }
                return filterObj;
            },
            GetNonBangQueryStringItem: function (param) {
                var qsobject = document.location.search.replace(/(^\?)/, '').split("&").map(function (n) {
                    return n = n.split("="),
                        this[n[0]] = n[1],
                        this;
                }.bind({}))[0];

                if (qsobject) {
                    return qsobject[param];
                }
                return null;
            },
            errorHandler: function (err, ctrlScope, displayError) {
                var errorObj = _.get(err, 'resObj', err);
                var errorMessagesProp = _.get(err, 'errorProperty', 'statusText');
                var errorMessages = errorObj[errorMessagesProp];
                var errorMessagesResult = (_.isArray(errorMessages)) ? errorMessages : [errorMessages];
                ctrlScope.errorMessage = errorMessagesResult;
                displayError();
                return err;
            },
            getEntryMappingByID: function (mappingContainer, entryPropertyID) {
                if (!mappingContainer) return null;

                return mappingContainer[entryPropertyID];
            },
            getEntryIDByMapping: function (mappingContainer, entryPropertyMapping) {
                if (!mappingContainer) return null;

                return mappingContainer[entryPropertyMapping];
            },
            isCurrentSeason: function (seasonObj) {
                var get = _.partial(_.get, seasonObj);
                var startDate = new Date(get('StartDate'));
                var endDate = new Date(get('EndDate'));
                var today = new Date();
                return today >= startDate && today <= endDate;
            },
            getOrdinal: function (num, concat) {
                var suf = "th";
                var check = num % 100;
                if (check < 10 || check > 20) {
                    switch (num % 10) {
                        case 1:
                            suf = "st";
                            break;
                        case 2:
                            suf = "nd";
                            break;
                        case 3:
                            suf = "rd";
                            break;
                    }
                }
                if (concat) {
                    return num + suf;
                } else {
                    return { num: num, suf: suf };
                }
            },
            Status: {
                Global: {
                    Active: 1,
                    Inactive: 7,
                    NeedsUpdated: 8,
                    New: 5,
                    RIP: 9,
                    GroupActive: 4
                },
                Property: {
                    AssignmentFulfilled: 6,
                    Scheduled: 2,
                    TemporarilyInactive: 11,
                    Unscheduled: 10
                },
                Review: {
                    Active: 3
                }
            },
            NoLoadReasons: {
                No_Download_By_Region: 1,
                Incompatible_With_Device: 2,
                URL_Broken: 3,
                No_Username_Provided: 4,
                Other: 5
            },
            IsSocialURL: function (url) {
                if (url) {
                    var socialPatterns = [
                    'http(s)?://(.*\.)?twitter\.com\/*\/?',
                    'http(s)?:\/\/([\w]+\.)?linkedin\.com\/*\/?',
                    'http(s)?:\/\/(www\.)?(facebook|fb)\.com\/*\/?',
                    'http(s)?:\/\/(www\.)?instagram\.com\/*\/?',
                    'http(s)?:\/\/plus\.google\.com\/*\/?',
                    'http(s)?://(.*\.)?pinterest\.com\/*\/?'];
                    for (var u = 0; u < socialPatterns.length; u++) {
                        if (url.match(new RegExp(socialPatterns[u]))) {
                            return true;
                        }
                    }
                }
                return false;
            }
        };
    }])
    .directive('checkBox', function () {
        return {
            scope: {
                ctrlBind: '=?ctrlBind',
                batchFn: '=?batchFn'
            },
            restrict: 'E',
            link: function (scope, element, attributes) {
                scope.label = attributes['label'] || '';
            },
            template: [
            '<span class="checkbox">',
                '<label class="inline">',
                    '<input type="checkbox" ng-model="ctrlBind" ng-click="batchFn(ctrlBind)" /><span></span> {{label}}',
                '</label>',
            '</span>'
            ].join('')
        }
    })
    .directive('pagination', function () {
        return {
            scope: {
                setPage: '&',
                currentPage: '=',
                totalPages: '=',
                noResults: '='
            },
            restrict: 'E',
            template: [
                '<div class="pagination" ng-hide="noResults">',
                    '<button class="btn btn-link" type="button" ng-click="setPage({newPage: 1})" ng-disabled="currentPage < 2">',
                        '<i class="iconic iconic-arrow-thick-left-fill-large-acute iconic-sm"></i><i class="iconic iconic-arrow-thick-left-fill-large-acute iconic-sm"></i>',
                    '</button>',
                    '<button class="btn btn-link" type="button" ng-click="setPage({newPage: currentPage - 1 })" ng-disabled="currentPage < 2">',
                        '<i class="iconic iconic-arrow-thick-left-fill-large-acute iconic-sm"></i>',
                    '</button>',
                    '<span>Page {{currentPage || 1}} of {{totalPages || 1}}</span>',
                    '<button class="btn btn-link" type="button" ng-click="setPage({newPage: currentPage + 1})" ng-disabled="currentPage >= totalPages">',
                        '<i class="iconic iconic-arrow-thick-right-fill-large-acute iconic-sm"></i>',
                    '</button>',
                    '<button class="btn btn-link" type="button" ng-click="setPage({newPage: totalPages})" ng-disabled="currentPage >= totalPages">',
                        '<i class="iconic iconic-arrow-thick-right-fill-large-acute iconic-sm"></i><i class="iconic iconic-arrow-thick-right-fill-large-acute iconic-sm"></i>',
                    '</button>',
                '</div>'
            ].join('')
        }
    });;
var entriesApp = angular.module('entriesApp', ['ngMessages', 'ui.router', 'ui.bootstrap', 'ui.bootstrap.modal', 'ngAnimate', 'oitozero.ngSweetAlert', 'rmModules', 'angulartics', 'angulartics.google.tagmanager', 'angulartics.google.analytics', 'angulartics.facebook.pixel', 'angulartics.snapchat.pixel', 'angulartics-twitter-pixel','ngStorage', 'credit-cards', 'exceptionOverwrite', 'com.2fdevs.videogular', 'ngSanitize', 'angular.filter']);

entriesApp.constant("moment", moment);
entriesApp.constant("appType", "frontend");

entriesApp.directive('checkValidUrl', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            ngModel.$validators.checkForPeriod = function (val) {
                if (val && element.attr('required')) {
                    var wwwCheck = val.indexOf('www.'),
                        dotCheck = val.split('.').length,
                        endingCheck = val.substring(val.length - 1);
                    if ((endingCheck !== '.') && ((wwwCheck > -1 && dotCheck > 2) || (wwwCheck == -1 && dotCheck > 1))) {
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    return true;
                }
            };
        }
    }
});

entriesApp.directive('checkValidUrlNonRequired', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            ngModel.$validators.checkForPeriod = function (val) {
                if (val) {
                    var wwwCheck = val.indexOf('www.'),
                        dotCheck = val.split('.').length,
                        endingCheck = val.substring(val.length - 1);
                    if ((endingCheck !== '.') && ((wwwCheck > -1 && dotCheck > 2) || (wwwCheck == -1 && dotCheck > 1))) {
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    return true;
                }
            };
        }
    }
});

//IE11 clear input hack https://github.com/angular/angular.js/issues/11193
entriesApp.directive('input', FixIEClearButton);

FixIEClearButton.$inject = ['$timeout', '$sniffer'];

function FixIEClearButton($timeout, $sniffer) {
    var directive = {
        restrict: 'E',
        require: '?ngModel',
        link: Link,
        controller: function () { }
    };

    return directive;

    function Link(scope, elem, attr, controller) {
        var type = elem[0].type;
        //ie11 doesn't seem to support the input event, at least according to angular
        if (type !== 'text' || !controller || $sniffer.hasEvent('input')) {
            return;
        }

        elem.on("mouseup", function (event) {
            var oldValue = elem.val();
            if (oldValue == "") {
                return;
            }

            $timeout(function () {
                var newValue = elem.val();
                if (newValue !== oldValue) {
                    elem.val(oldValue);
                    elem.triggerHandler('keydown');
                    elem.val(newValue);
                    elem.triggerHandler('focus');
                }
            }, 0, false);
        });

        scope.$on('$destroy', destroy);
        elem.on('$destroy', destroy);

        function destroy() {
            elem.off('mouseup');
        }
    }
}

// for password comparison
var compareTo = function () {
    return {
        require: "ngModel",
        scope: {
            otherModelValue: "=compareTo",
            skipCompare: "=preventCompareToCheck"
        },
        link: function (scope, element, attributes, ngModel) {

            ngModel.$validators.compareTo = function (modelValue) {
                if (scope.skipCompare && scope.skipCompare === true) { return true; }
                return (modelValue || "") === (scope.otherModelValue || "");
            };

            scope.$watch("otherModelValue", function () {
                ngModel.$validate();
            });
        }
    };
};

entriesApp.directive("compareTo", compareTo);

entriesApp.directive('customPasswordValidation', function () {
    var pCheck = new RegExp("^(?=(.*[^a-zA-Z0-9]){1,}).{6,}$");
    var itemExists = function (modelValue) {
        return (modelValue || '').length > 0;
    };

    return {
        require: "ngModel",
        scope: {
            performIt: "=customPasswordValidation",
            model: "=ngModel"
        },
        link: function (scope, element, attributes, ngModel) {
            scope.$watch('performIt', function (value) {
                validate();
            });

            // watch own value and re-validate on change
            scope.$watch("model", function (value) {
                validate();
            });

            var validate = function () {
                var itemValue = scope.model;
                var skipCheck = (!scope.performIt || scope.performIt !== true);

                if (skipCheck) {
                    ngModel.$setValidity('passwordRequired', true);
                    ngModel.$setValidity('passwordInvalid', true);
                }
                else {
                    var exists = itemExists(itemValue);

                    ngModel.$setValidity('passwordRequired', exists);
                    ngModel.$setValidity('passwordInvalid', exists && pCheck.test(itemValue || ""));
                }

            };
        }
    };
});
entriesApp.directive('checkListLang', function () {
    return {
        scope: {
            listLang: '=checkListLang',
            value: '=ngValueLang'
        },
        link: function (scope, elem, attrs) {
            var handler = function (setup) {
                var checked = elem.prop('checked');
                var index = $.inArray(scope.value, scope.listLang);

                if (checked && index == -1) {
                    if (setup) elem.prop('checked', false);
                    else scope.listLang.push(scope.value);
                } else if (!checked && index != -1) {
                    if (setup) elem.prop('checked', true);
                    else scope.listLang.splice(index, 1);
                }
            };

            var setupHandler = handler.bind(null, true);
            var changeHandler = handler.bind(null, false);

            elem.on('change', function () {
                scope.$apply(changeHandler);
            });
            scope.$watch('listLang', setupHandler, true);
        }
    };
});
entriesApp.directive('checkList', function () {
    return {
        scope: {
            list: '=checkList',
            value: '=ngValue',
            deviceCategories: '=deviceCats',
            deviceCategorySelected: '=deviceCategorySelected',
            durationCategories: '=durationCats',
            durationCategorySelected: '=durationCategorySelected',
            customFieldCategories: '=customFieldCats',
            customAddtnlFieldCategories: '=customAddtnlFieldCats',
            piece: '=piece',
            mediaType: '=mediaType',
            customFieldSelected: '=customFieldSelected',
            addtnlCustomFieldSelected: '=addtnlCustomFieldSelected',
            isCampaignCategoryType: '@isCampaignCategoryType',
            isSharedCategoryType: '@isSharedCategoryType',
            customList: '=checkListWithType'
        },
        link: function (scope, elem, attrs) {
            var updateCustomList = function (isChecked, isShared, propName) {
                if (scope.isCampaignCategoryType == 'true' || scope.isCampaignCategoryType == 'false' || scope.isCampaignCategoryType == true || scope.isCampaignCategoryType == false) {
                    if (isShared) {
                        propName = 'shared';
                    }
                    if (!scope.customList[propName]) { scope.customList[propName] = []; }
                    var index = $.inArray(scope.value, scope.customList[propName]);
                    if (isChecked && index == -1) {
                        scope.customList[propName].push(scope.value);
                    } else if (!isChecked && index != -1) {
                        scope.customList[propName].splice(index, 1);
                    }
                }
            }

            var handler = function (setup) {
                var checked = elem.prop('checked');
                var index = $.inArray(scope.value, scope.list);

                if (checked && index == -1) {
                    if (setup) elem.prop('checked', false);
                    else scope.list.push(scope.value);
                } else if (!checked && index != -1) {
                    if (setup) elem.prop('checked', true);
                    else scope.list.splice(index, 1);
                }

                if (!setup) {
                    updateCustomList(checked, scope.isSharedCategoryType, scope.isCampaignCategoryType == 'true' || scope.isCampaignCategoryType == true ? 'campaign' : 'individual');
                }

                scope.deviceCategorySelected.Status = false;
                _(scope.list).forEach(function (selected) {
                    if (scope.deviceCategories.indexOf(selected) >= 0) {
                        scope.deviceCategorySelected.Status = true;
                    }
                });

                scope.durationCategorySelected.Status = false;
                _(scope.list).forEach(function (selected) {
                    if (scope.durationCategories.indexOf(selected) >= 0) {
                        scope.durationCategorySelected.Status = true;
                    }
                });

                scope.customFieldSelected.Status = false;
                _.some(scope.list, function (selected) {
                    if (scope.customFieldCategories.indexOf(selected) != -1) {
                        scope.customFieldSelected.Status = true;
                        return true;
                    }
                });

                scope.addtnlCustomFieldSelected.Status = false;
                _(scope.list).forEach(function (selected) {
                    var addCatIndex = scope.customAddtnlFieldCategories.indexOf(selected);
                    if (addCatIndex > -1) {
                        var addCatID = scope.customAddtnlFieldCategories[addCatIndex];
                        if (scope.mediaType && scope.mediaType.AddtnlCustomFieldNames) {
                            var addtnlCustomFields = _.filter(scope.mediaType.AddtnlCustomFieldNames, function (acf) {
                                return acf.PropertyCategoryDataIDs.indexOf(addCatID) > -1;
                            });
                            if (!scope.piece.AddtnlCustomFields) {
                                scope.piece.AddtnlCustomFields = [];
                            }

                            _(addtnlCustomFields).forEach(function (addtnlCustomField) {
                                if (!_.find(scope.piece.AddtnlCustomFields, function (acf) {
                                return acf.CustomFieldName.trim() === addtnlCustomField.CustomFieldName.trim();
                                }) && addtnlCustomField) {
                                    var newAddtnlCustomField = angular.copy(addtnlCustomField);
                                    newAddtnlCustomField.CustomFieldValue = "";
                                    scope.piece.AddtnlCustomFields.push(newAddtnlCustomField);
                                }
                            });

                            if (scope.piece.AddtnlCustomFields && scope.piece.AddtnlCustomFields.length > 0) {
                                    scope.addtnlCustomFieldSelected.Status = true;
                            }
                        }
                    }
                });

                var removeAddIndex = [];
                if (scope.piece && scope.piece.AddtnlCustomFields && scope.piece.AddtnlCustomFields.length > 0) {
                    _(scope.piece.AddtnlCustomFields).forEach(function (acf, i) {
                        var keep = false;
                        for (var t = 0; t < scope.list.length; t++) {
                            if (!keep) {
                                keep = (acf.PropertyCategoryDataIDs.indexOf(scope.list[t]) > -1);
                            }
                        }

                        if (!keep) {
                            removeAddIndex.push(i);
                        }
                    });
                }
                for (var k = 0; k < removeAddIndex.length; k++) {
                    scope.piece.AddtnlCustomFields.splice(removeAddIndex[k], 1);
                }
            };

            var setupHandler = handler.bind(null, true);
            var changeHandler = handler.bind(null, false);

            elem.on('change', function () {
                scope.$apply(changeHandler);
            });
            scope.$watch('list', setupHandler, true);
        }
    };
});

entriesApp.directive('convertToNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            ngModel.$parsers.push(function (val) {
                if (val) {
                    return parseInt(val, 10);
                }
                else {
                    return null;
                }
            });
            ngModel.$formatters.push(function (val) {
                if (val) {
                    return '' + val;
                }
                return null;
            });
        }
    }
});

// Counts number of words in field and sets validity if more than max
//
// Usage:
//   <input maximum-words-validation="100"/>
// Example:
//   <textarea ng-model="myModel.description" maximum-words-validation="100"></textarea>
//   <span>{{myModel_description_words_count}} / 100 words</span>
//
// It will also set the {{fieldName}}_word_count variable on parent scope
entriesApp.directive('maximumWordsValidation', function () {
    'use strict';
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModelCtrl) {
            // Figure out name of count variable we will set on parent scope
            var wordCountName = attrs.ngModel.replace('.', '_') + '_words_count';

            scope.$watch(function () {
                return ngModelCtrl.$modelValue;
            }, function (newValue) {
                var wordCount = 0;

                try
                {
                    if (newValue)
                    {
                        wordCount = newValue.match(/\S+/g).length;
                    }
                    // Set count variable
                    scope.$parent[wordCountName] = wordCount;
                    // Update validity
                    var max = attrs.maximumWordsValidation;
                    ngModelCtrl.$setValidity('maximumWords', wordCount <= max);
                }
                catch (e) {
                    scope.$parent[wordCountName] = -1;
                    ngModelCtrl.$setValidity('maximumWords', true);
                }
            });
        }
    };
});

entriesApp.directive("emailNotEqualTo", function () {
    return {
        require: "ngModel",
        scope: {
            otherModelValue: "=emailNotEqualTo"
        },
        link: function (scope, element, attributes, ngModel) {

            ngModel.$validators.emailNotEqualTo = function (modelValue) {
                //account for null or undefined
                if (!modelValue && !scope.otherModelValue) return true;
                return modelValue !== scope.otherModelValue;
            };

            scope.$watch("otherModelValue", function () {
                ngModel.$validate();
            });
        }
    };
});

entriesApp.filter('numbersOnly', function () {
    return function (info) {
        if (!info) { return ''; }

        //var value = info.toString().trim().replace(/^\+/, '');
        var value = info.toString().trim().match(/[0-9]+/g);

        if (!value || value.length < 1) { return ''; }

        return value.join('');
    };
});


entriesApp.config(['$stateProvider', '$urlRouterProvider', '$animateProvider',
    function ($stateProvider, $urlRouterProvider, $animateProvider) {
    // prevent animations, except for elements with this class.
    $animateProvider.classNameFilter(/has-animation/);

    $urlRouterProvider.otherwise("/enter");

    $stateProvider
        .state('enter', {
            abstract: true,
            url: "/enter",
            template: "<ui-view />",
            controller: "entriesController"
        })
        .state('enter.select', {
            url: "",
            templateUrl: "/Entries/SelectMediaType",
            params: {
                submissionID: null
            },
            mode: 'entry'
        })
        .state('enter.extended', {
            url: "/extended",
            templateUrl: "/Entries/ExtendedDisplay",
            mode: 'entry',
            controller: function () {
                localStorage.setItem("extended", "-");
            }
        })
        .state('enter.submit', {
            url: "/submit-work/{deepLinkRef}",
            templateUrl: "/Entries/SubmitWork"
        })
        .state('enter.review', {
            url: "/edit-review",
            templateUrl: "/Entries/EditReview",
            mode: 'entry'
        })
        .state('enter.client', {
            url: "/client-info",
            templateUrl: "/Entries/ClientInfo",
            mode: 'entry'
        })
        .state('enter.checkout', {
            url: "/checkout",
            templateUrl: "/Entries/Checkout",
            mode: 'entry'
        })
        .state('enter.checkoutfinalize', {
            url: "/checkoutfinalize",
            templateUrl: "/Entries/CheckoutFinalize",
            mode: 'entry'
        })
        .state('enter.success', {
            url: "/success",
            templateUrl: "/Entries/PostCheckout",
            mode: 'entry'
        })
        .state('dashboard', {
            abstract: true,
            url: "/dashboard",
            template: "<ui-view />",
            controller: "userDashboardController"
        })
        .state('dashboard.list', {
            url: "",
            templateUrl: "/Entries/UserDashboard"
        })
        .state('dashboard.contact', {
            url: "/contact",
            templateUrl: "/Entries/UserContact"
        })
        .state('resetpassword', {
            url: "/reset-password",
            templateUrl: "/Entries/ResetPassword",
            controller: "passwordController",
            reloadOnSearch: false
        });

    }]);

entriesApp.filter('dateUtcToTZ', ['$filter', function ($filter) {
    return function (toConvert, formatToUse, numDaysToAdd) {
        if (!toConvert) return '';

        //get as pacific
        var dateObj = moment.tz(toConvert + 'Z', "America/Los_Angeles");
        if (!dateObj.isValid()) {
            return toConvert;
        }

        if (numDaysToAdd) {
            try {
                dateObj.add(numDaysToAdd, 'd');
            } catch (err) {
                var tempe = err;
            }
        }

        if (formatToUse) {
            //toDate returns date on local system
            //format("Z") returns offset
            return $filter('date')(dateObj.toDate(), formatToUse, dateObj.format("Z"));
        }
        else {
            return dateObj.format('MMM D, YYYY');
        }
    };
}]);

entriesApp.filter('convertToHtml', ['$sce', function ($sce) {
    return function (data) {
        return $sce.trustAsHtml(data);
    };
}]);

entriesApp.run(['$state', '$rootScope', 'sharedProperties', function ($state, $rootScope, sharedProperties) {
    $rootScope.$state = $state;
    if (initialPropertyData) {
        sharedProperties.setProperty("propertyDetails", initialPropertyData);
        initialPropertyData = null;
    }
}]);
;
angular.module('rmModules').controller('fileUploadController', ['$scope', '$rootScope', 'entriesFactory', 'sharedProperties', '$state', '$uibModal', '$uibModalStack', 'SweetAlert', 'appType',
function ($scope, $rootScope, entriesFactory, sharedProperties, $state, $uibModal, $uibModalStack, SweetAlert, appType) {

      // init
      $scope.status;
      $scope.showCloseBtn = true;

      $scope.$on('showUploadFileModal', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.uploadFileDialog({ backdrop: 'static', keyboard: false }, args);
          $scope.showCloseBtn = true;
      });

      $scope.uploadFileDialog = function (opts, successCallbackArgs) {
          var opts = opts || {};
          var modalData = function () {
              return null;
          };

          var propertyId = (appType == 'admin' ? sharedProperties.getProperty("propertyID") : sharedProperties.getProperty("propertyDetails").PropertyID)
          var query = '?propertyID=' + propertyId;

          var modalType = null;
          if (successCallbackArgs && successCallbackArgs.Params && successCallbackArgs.Params.length > 1) {
              modalType = successCallbackArgs.Params[1];
              if (modalType) {
                  query += '&type=' + modalType;
              }

              if (successCallbackArgs.Params[2])
                $scope.enableUploadLength = successCallbackArgs.Params[2];
          }

          var templateBase = '';
          if (appType == 'judging') templateBase = 'Judging';
          else if (appType == 'admin') templateBase = 'Admin';
          else if (appType) templateBase = 'Entries';

          var defaults = {
              templateUrl: "/" + templateBase + "/UploadFileModal" + query,
              controller: (propertyId == 2 ? UploadFileDialogReviewerCtrl : UploadFileDialogCtrl),
              scope: $scope,
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

          var combined = _.merge({}, defaults, opts);

          var modalInstance = $uibModal.open(combined);
      };
  }]);


var UploadFileDialogCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'entriesFactory', 'options', 'successCallbackArgs', 'SweetAlert', 'appType', function ($scope, $rootScope, $uibModalInstance, sharedProperties, entriesFactory, options, successCallbackArgs, SweetAlert, appType) {
    $scope.propertyID = appType == 'admin' ? sharedProperties.getProperty("propertyID") : sharedProperties.getProperty("propertyDetails").PropertyID;
    $scope.maxCampaignItems = ($scope.propertyID === 1 || $scope.propertyID === 3) ? 10 : ($scope.propertyID == 7 ? 12 : 5);
    $scope.isShortlist = false;

    $scope.statusUpload;
    $scope.submitted = false;

    $scope.piece = {};
    var modalType = '';
    if (successCallbackArgs && successCallbackArgs.Params && successCallbackArgs.Params.length > 0) {
        $scope.piece = successCallbackArgs.Params[0];

        if (successCallbackArgs.Params.length > 1) {
            modalType = successCallbackArgs.Params[1];
            if (modalType == 'slvideo')
            {
                $scope.maxCampaignItems = 1;
                $scope.isShortlist = true;
            }
        }
    }

    $scope.maxCheck = {};
    Object.defineProperty($scope.maxCheck, 'ShowCampaign', {
        get: function () {
            return ($scope.piece && $scope.piece.IsCampaign) || $scope.propertyID == 6;
        }
    });
    Object.defineProperty($scope.maxCheck, 'MaxAllowedCount', {
        get: function () {
            if ($scope.isShortlist) { return 1; }
            else if (($scope.piece && $scope.piece.IsCampaign) || $scope.propertyID == 7) { return $scope.maxCampaignItems; }
            else if ($scope.propertyID == 6) { return 4; }

            return 1;
        }
    });
    Object.defineProperty($scope.maxCheck, 'TreatAsCampaign', {
        get: function () {
            return $scope.propertyID == 6;
        }
    });

    //setup leadimageindex if there is one
    $scope.LeadImageIndex = null;
    function updateLeadImageFlag() {
        if ($scope.piece.FileList && $scope.piece.FileList.length > 0) {
            for (var x = 0; x <= $scope.piece.FileList.length - 1; x++) {
                if ($scope.piece.FileList[x].LeadImage) {
                    $scope.piece.LeadImageIndex = x;
                    break;
                }
            }
        }
        else {
            $scope.piece.LeadImageIndex = null;
        }
    }

    updateLeadImageFlag();

    var updateFilePieceData = function () {
        if (!$scope.piece.FileList || $scope.piece.FileList.length == 0) {
            $scope.piece.UploadFile = "";
            $scope.piece.OriginalFileName = "";
            $scope.piece.LeadImageIndex = null;
            return;
        }

        $scope.piece.UploadFile = $scope.piece.FileList[0].UploadFile;
        $scope.piece.OriginalFileName = $scope.piece.FileList[0].OriginalFileName;
        updateLeadImageFlag();
    };

    var updateFileAssetPieceData = function () {
        if (!$scope.piece.FileAssetList || $scope.piece.FileAssetList.length == 0) {
            $scope.piece.UploadFile = "";
            $scope.piece.OriginalFileName = "";
            $scope.piece.LeadImageIndex = null;
            return;
        }

        $scope.piece.UploadFile = $scope.piece.FileAssetList[0].UploadFile;
        $scope.piece.OriginalFileName = $scope.piece.FileAssetList[0].OriginalFileName;
    };

    $scope.removeFileUpload = function (index) {
        $scope.piece.FileList.splice(index, 1);
        updateFilePieceData();
        if ($scope.propertyID === 7) {
            $scope.submitted = true;
            $scope.showFileError = true;
        }
    };

    $scope.removeFileAssetUpload = function (index) {
        $scope.piece.FileAssetList.splice(index, 1);
        updateFileAssetPieceData();
        if ($scope.propertyID === 7) {
            $scope.submitted = true;
            $scope.showFileError = true;
        }
    };

    $scope.updateLeadImageIndex = function (value) {
        for (var x = 0; x <= $scope.piece.FileList.length - 1; x++) {
            if (x == value) {
                $scope.piece.FileList[x].LeadImage = true;
            } else {
                $scope.piece.FileList[x].LeadImage = null;
            }
        }
        $scope.showFileError = false;
    };

    $scope.setFileUrlFromS3 = function (fileUrl, fileName) {
        //just put files in list for now...will update from list to main ones in another function
        if (!$scope.piece.FileList) {
            $scope.piece.FileList = [];
        }

        $scope.piece.FileList.push({
            UploadFile: fileUrl,
            OriginalFileName: fileName,
            LeadImage: null
        });

        updateFilePieceData();

        $scope.$digest();
    }

    $scope.setFileAssetUrlFromS3 = function (fileUrl, fileName) {
        //just put files in list for now...will update from list to main ones in another function
        if (!$scope.piece.FileAssetList) {
            $scope.piece.FileAssetList = [];
        }

        $scope.piece.FileAssetList.push({
            UploadFile: fileUrl,
            OriginalFileName: fileName,
            LeadImage: null
        });

        updateFileAssetPieceData();

        $scope.$digest();
    }

    $scope.save = function (isValid) {
        //reset error
        $scope.statusUpload = undefined;

        if (!isValid) {
            $scope.submitted = true;
            return;
        }

        SweetAlert.swal({
            title: "Please ensure you have uploaded all files prior to proceeding. Once your entry is saved, you will no longer have the option to edit your elements.",
            type: "warning",
            showCancelButton: true,
            killButtonColor: true,
            confirmButtonClass: "btn btn-primary",
            cancelButtonClass: "btn btn-secondary",
            cancelButtonText: "Go Back",
            confirmButtonText: "Save",
            closeOnConfirm: true,
            iconHTML: "<i class='material-icons md-48 md-secondary'>info</i>"
        },
        function (isConfirm) {
            if (isConfirm) {
                $scope.submitted = false;

                var params = {
                    PropertyID: $scope.propertyID,
                    PieceID: $scope.piece.PieceID,
                    FileList: $scope.piece.FileList,
                    PieceLengthID: $scope.piece.PieceLengthID
                };

                //setup for custom non-entry specific modal
                if (modalType) {
                    params['modalType'] = modalType;
                }

                $scope.keepSpinning = true;

                entriesFactory.updatePieceFileList(params, appType == 'admin')
                    .success(function (data) {
                        if (data && data.Success) {

                            //TODO: DETERMINE MORE LEAN WAY TO HANDLE THIS - SINGLE ITEM VICE ENTIRE

                            if (successCallbackArgs) {
                                $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                            }

                            $uibModalInstance.dismiss('cancel');
                        }
                        else {
                            $scope.statusUpload = (data && data.Errors && data.Errors.length > 0 ? data.Errors[0] : '') || 'Unable to save files.';
                        }
                        $scope.keepSpinning = false;
                        params = undefined;
                    })
                    .error(function (error) {
                        $scope.statusUpload = 'Unable to save.';
                        $scope.keepSpinning = false;
                        params = undefined;
                    });
            }
        });
    };

    $scope.saveAsset = function (isValid) {
        //reset error
        $scope.statusUpload = undefined;

        if (!isValid) {
            $scope.submitted = true;
            return;
        }

        SweetAlert.swal({
            title: "Please ensure you have uploaded all files prior to proceeding. Once your entry is saved, you will no longer have the option to edit your elements.",
            type: "warning",
            showCancelButton: true,
            killButtonColor: true,
            confirmButtonClass: "btn btn-primary",
            cancelButtonClass: "btn btn-secondary",
            cancelButtonText: "Go Back",
            confirmButtonText: "Save",
            closeOnConfirm: true,
            iconHTML: "<i class='material-icons md-48 md-secondary'>info</i>"
        },
            function (isConfirm) {
                if (isConfirm) {
                    $scope.submitted = false;

                    var params = {
                        PropertyID: $scope.propertyID,
                        PieceID: $scope.piece.PieceID,
                        FileList: $scope.piece.FileAssetList,
                        PieceLengthID: $scope.piece.PieceLengthID
                    };

                    //setup for custom non-entry specific modal
                    if (modalType) {
                        params['modalType'] = modalType;
                    }

                    $scope.keepSpinning = true;

                    entriesFactory.updatePieceFileList(params, appType == 'admin')
                        .success(function (data) {
                            if (data && data.Success) {

                                //TODO: DETERMINE MORE LEAN WAY TO HANDLE THIS - SINGLE ITEM VICE ENTIRE

                                if (successCallbackArgs) {
                                    $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                                }

                                $uibModalInstance.dismiss('cancel');
                            }
                            else {
                                $scope.statusUpload = (data && data.Errors && data.Errors.length > 0 ? data.Errors[0] : '') || 'Unable to save files.';
                            }
                            $scope.keepSpinning = false;
                            params = undefined;
                        })
                        .error(function (error) {
                            $scope.statusUpload = 'Unable to save.';
                            $scope.keepSpinning = false;
                            params = undefined;
                        });
                }
            });
    };

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

}];


var UploadFileDialogReviewerCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'judgesFactory', 'options', 'successCallbackArgs', 'SweetAlert', 'appType', function ($scope, $rootScope, $uibModalInstance, sharedProperties, judgesFactory, options, successCallbackArgs, SweetAlert, appType) {
    $scope.propertyID = appType == 'admin' ? sharedProperties.getProperty("propertyID") : sharedProperties.getProperty("propertyDetails").PropertyID;

    $scope.statusUpload;
    $scope.submitted = false;

    $scope.reviewer = {};
    var modalType = '';
    if (successCallbackArgs && successCallbackArgs.Params && successCallbackArgs.Params.length > 0) {
        $scope.reviewer = successCallbackArgs.Params[0];

        if (successCallbackArgs.Params.length > 1) {
            modalType = successCallbackArgs.Params[1];
        }
    }

    $scope.maxCheck = {};

    $scope.removeFileUpload = function (index) {
        $scope.reviewer.HeadshotFileName = null;
    };

    $scope.setFileUrlFromS3 = function (fileUrl, fileName) {
        $scope.reviewer.HeadshotFileName = fileUrl;

        $scope.$digest();
    }
    $scope.save = function (isValid) {
        //reset error
        $scope.statusUpload = undefined;

        if (!isValid) {
            $scope.submitted = true;
            return;
        }

        $scope.submitted = false;

        var params = {
            PropertyID: $scope.propertyID,
            UserID: $scope.reviewer.UserID,
            UserReviewerID: $scope.reviewer.UserReviewerID,
            HeadshotFileName: $scope.reviewer.HeadshotFileName
        };

        //setup for custom non-entry specific modal
        if (modalType) {
            params['modalType'] = modalType;
        }

        $scope.keepSpinning = true;

        judgesFactory.updateReviewerHeadshot(params, appType == 'admin')
            .success(function (data) {
                if (data && data.Success) {

                    //TODO: DETERMINE MORE LEAN WAY TO HANDLE THIS - SINGLE ITEM VICE ENTIRE

                    if (successCallbackArgs) {
                        $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                    }

                    $uibModalInstance.dismiss('cancel');
                }
                else {
                    $scope.statusUpload = (data && data.Errors && data.Errors.length > 0 ? data.Errors[0] : '') || 'Unable to save files.';
                }
                $scope.keepSpinning = false;
                params = undefined;
            })
            .error(function (error) {
                $scope.statusUpload = 'Unable to save.';
                $scope.keepSpinning = false;
                params = undefined;
            });
    };

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

}];;
angular.module('rmModules').controller('loadingController', [
    '$scope',
    'sharedProperties',
    '$state',
    '$rootScope',
    '$http',
    'appType',
    function ($scope, sharedProperties, $state, $rootScope, $http, appType) {
        $scope.hasPendingRequests = function () {
            var validLoad = false;
            if ($http.pendingRequests.length > 0) {
                // Adjusted so pvsummarystatus is not counted towards pending for spinner purposes
                if
                (
                    (appType == "admin" && $http.pendingRequests[0].url.indexOf("/PV/FinalizePVSummaryDataGetStatus") === -1) ||
                    (
                        appType != "admin" && 
                        ($http.pendingRequests[0].url != "http://wmg-url-checker.herokuapp.com/" && $http.pendingRequests[0].url.indexOf("urlChecker") === -1)
                    )
                ) {
                    validLoad = true;
                }
            }
            return validLoad;
        };
    }]);;
angular.module('rmModules').controller('passwordController', [
    '$scope',
    'sharedProperties',
    '$state',
    '$rootScope',
    'userFactory',
    'appType',
    function ($scope, sharedProperties, $state, $rootScope, userFactory, appType) {
        $scope.showSuccess = false;
        $scope.showCodeMissing = false;
        $scope.resetInfo = {};
        $scope.statusReset = null;

        $scope.updatePassword = function () {
            $scope.keepSpinning = true;

            var tempPropertyID = -1;
            if (appType == 'admin') { tempPropertyID = 0; }
            else if (propertyID) {
                tempPropertyID = propertyID;
            }
            else if (tempPropertyID < 1) {
                var property = sharedProperties.getProperty("propertyDetails");
                if (property) {
                    tempPropertyID = property.PropertyID;
                }
                else
                {
                    tempPropertyID = -1;
                }
            }
            $scope.statusReset = null;

            userFactory.resetPassword
                (
                    $scope.resetInfo.Email,
                    tempPropertyID || 0,
                    sharedProperties.GetQueryStringItem('code'),
                    $scope.resetInfo.Password,
                    $scope.resetInfo.ConfirmPassword
                )
                .success(function (details) {
                    $scope.keepSpinning = false;
                    setupSuccessAndLink();
                })
                .error(function (error) {
                    if (error && error.ModelState[""] && error.ModelState[""].length > 0) {
                        $scope.statusReset = error.ModelState[""];
                    }
                    else {
                        $scope.statusReset = ['An unspecified error occurred.  Make sure your password is in the correct format and the email specified is the one you registered with.'];
                    }
                    $scope.keepSpinning = false;
                });
        };

        var setupSuccessAndLink = function () {
            $scope.showSuccess = true;
        };

        var updateQueryCheck = function () {
            $scope.showCodeMissing = sharedProperties.GetQueryStringItem('code') ? false : true;
        };

        $rootScope.$on('locationChangeSuccess', function () {
            updateQueryCheck();
        });


        var handleStateChanges = function (stateChangeType, event, toState, toParams, fromState, fromParams, options) {
            if (toState.name == "resetpassword") {
                updateQueryCheck();
            }
        }

        $scope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, options) {
            handleStateChanges('$stateChangeSuccess', event, toState, toParams, fromState, fromParams, options);
        });

        $scope.$on('$locationChangeSuccess', function (event) {
            updateQueryCheck();
        });
}]);;
angular.module('rmModules').controller('baseSharedController', ['$scope', 'sharedProperties', '$state', 'userFactory', 'appType', '$rootScope', '$localStorage',
  function ($scope, sharedProperties, $state, userFactory, appType, $rootScope, $localStorage) {
      $scope.propertyDetails = null;
      $scope.getSpinnerClass = function (pid) {
          if ([1, 3, 5, 7, 8].indexOf(pid) > -1) {
              return 'loading-spinner-white'
          } else {
              return 'loading-spinner'
          }
      };

      $scope.resetStorage = function () {
          $localStorage.$reset();
      };

      $scope.HasToken = function () {
          return sharedProperties.HasToken();
      };

      $scope.HasGuestToken = function () {
          return sharedProperties.HasGuestToken();
      };

      $scope.$on('propertyData', function (event, data) {
          checkForProperty();
      });
      $scope.copyrightYear = moment().year();
      var checkForProperty = function () {
          $scope.propertyDetails = sharedProperties.getProperty("propertyDetails") || {};
          if ($scope.propertyDetails && $scope.propertyDetails.UrlNonEntrySite && !$scope.propertyDetails.UrlNonEntrySiteNoProtocol) {
              $scope.propertyDetails.UrlNonEntrySiteNoProtocol = $scope.propertyDetails.UrlNonEntrySite.substr($scope.propertyDetails.UrlNonEntrySite.indexOf('://') + 3);
              if ($scope.propertyDetails.UrlNonEntrySiteNoProtocol.substr($scope.propertyDetails.UrlNonEntrySiteNoProtocol.length - 1) === '/') {
                  $scope.propertyDetails.UrlNonEntrySiteNoProtocol = $scope.propertyDetails.UrlNonEntrySiteNoProtocol.substr(0, $scope.propertyDetails.UrlNonEntrySiteNoProtocol.length - 1);
              }
          }
      };
      if (appType === 'frontend') {
          $scope.baseLogOut = function () {
              $rootScope.$broadcast('baseLogOut');
          };

          $scope.baseLogin = function () {
              $rootScope.$broadcast('baseLogin');
          };

          //TODO: Adjust for mode5 setting
          $scope.loginMode = [4, 5, 6, 8, 9].indexOf(propertyID) > -1 ? 5 : 0;

          $scope.loginThenDash = function () {
              $rootScope.$broadcast('loginThenDash');
          };

      } else if (appType === 'judging') {
          $scope.entryPropertyTitle = null;
          $scope.entryPropertySeasonTitle = null;
          $scope.showNoLoadMessage = false;
          $scope.submittedEntryMessage = {
              Show: false
          };
          $scope.errorMessage = [];

          var getCompletionPercentage = function (completed, required) {
              var eCompleted = parseInt(completed | 0);
              var eRequired = parseInt(required | 0);
              var perc = "";

              if (isNaN(eCompleted) || isNaN(eRequired) || eRequired == 0) {
                  perc = " ";
              } else {
                  perc = ((eCompleted / eRequired) * 100).toFixed(0);
              }

              return perc;
          }

          $scope.handleJudgingSetup = function (data) {
              if (data) {
                  if (data.Type == 'entryproperty') { $scope.entryPropertyTitle = data.Data; }
                  else if (data.Type == 'entryseason') { $scope.entryPropertySeasonTitle = data.Data; }
                  else if (data.Type == 'submitNoLoad') { $scope.showNoLoadMessage = true; }
                  else if (data.Type == 'entrypropertycss') { $scope.entryPropertyCssClass = data.Data; }
                  else if (data.Type == 'submitSuccess') {
                      $scope.submittedEntryMessage.Show = true;
                      $scope.submittedEntryMessage.ReviewsCompleted = data.ReviewsCompleted;
                      $scope.submittedEntryMessage.ReviewsRequired = data.ReviewsRequired;
                      $scope.submittedEntryMessage.Percentage = getCompletionPercentage(data.ReviewsCompleted, data.ReviewsRequired)
                  }
                  else if (data.Type == 'submitReset') { resetEntryMessages(); }
                  else if (data.Type == 'headerError') {
                      $scope.errorMessage = data.Errors;
                      sharedProperties.ShowThenHideArea("#entryListErrors", true);
                  }
              }
              else {
                  resetJudging();
              }
          };

          var resetEntryMessages = function () {
              $scope.showNoLoadMessage = false;
              $scope.submittedEntryMessage = {
                  Show: false
              };
          };

          var resetJudging = function () {
              $scope.entryPropertyTitle = null;
              $scope.entryPropertySeasonTitle = null;
              resetEntryMessages();
          };

          var logOutJudging = function () {
              userFactory.logout()
                .success(function () {
                    sharedProperties.RemoveToken();
                    $state.go('login');
                })
                .error(function (error) {
                    alert(error);
                });
          };

          $scope.logOutJudging = function () {
              logOutJudging();
          };

          var verifyLoggedInUser_Judge = function (entryPropertyName, afterloggedinDelegate) {
              if (!$scope.HasToken()) {
                  if ($state.current.name === 'login' || $state.current.name === 'login-redirect' || $state.current.name === 'forgotpassword' || $state.current.name === 'resetpassword') {
                      return;
                  }
                  else if ($state.includes('entry.*')) {
                      return redirectToLoginWithEntryOnLoginSuccess(entryPropertyName);
                  }
                  else {
                      return $state.go('login');
                  }
              }

              var tempPropertyID = entryPropertyName ? sharedProperties.getEntryIDByMapping(entryPropMap, entryPropertyName) : -1;

              userFactory.isJudge(tempPropertyID)
                .success(function (data) {
                    if (data && data.ValidAccount) {
                        if (afterloggedinDelegate) {
                            afterloggedinDelegate(data);
                        }
                    } else {
                        if ($state.current.name.includes('entry.*')) {
                            redirectToLoginWithEntryOnLoginSuccess(entryPropertyName);
                        }
                        else {
                            sharedProperties.RemoveToken();
                            $state.go('login');
                        }
                    }
                })
                .error(function (error) {
                    sharedProperties.RemoveToken();
                    $state.go('login');
                });
          };

          var redirectToLoginWithEntryOnLoginSuccess = function (entryPropertyName) {
              if (entryPropertyName) {
                  $state.go('login', { rt: entryPropertyName });
              }
              else {
                  $state.go('login');
              }
          };

          $scope.verifyLoggedInUser_Judge = function (entryPropertyName, afterloggedinDelegate) {
              verifyLoggedInUser_Judge(entryPropertyName, afterloggedinDelegate);
          };

          $scope.handleStateChangeBaseJudge = function (event, toState, toParams, fromState, fromParams, options) {
              $('html, body').scrollTop($("body").offset().top);

              if (!toState.module || (toState.module !== 'entry' && toState.module !== 'executiveentry')) {
                  resetJudging();
              }
              else if (toState.name !== 'entry.Load') {
                  resetEntryMessages();
              }
          };

          $scope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, options) {
              $scope.handleStateChangeBaseJudge(event, toState, toParams, fromState, fromParams, options);
          });

          $scope.logOutJudge = function () {
              userFactory.logout()
                .success(function () {
                    sharedProperties.RemoveToken();

                    //clear out submission
                    $rootScope.$broadcast('logout');
                    $state.go('login');
                })
                .error(function (error) {
                    $scope.status = error;
                });
          };
      }

      checkForProperty();

      $scope.spellings = [
          'organization', //0
          'check', //1
          'honor', //2
          'recognize', //3
          'humor', //4
          'categorize', //5
          'center', //6
          'prioritization', //7
          'normalize', //8
          'catalyze', //9
          'customize', //10
          'favorite', //11
          'program', //12
          'zip', //13
          'personalize', //14
          'personalization', //15
          'customizable', //16
          'familiarize﻿', //17
          'finalize﻿', //18
      ];

      var updateSpellings = function () {
          $scope.spellings = ['organisation', 'cheque', 'honour', 'recognise', 'humour', 'categorise', 'centre', 'prioritisation', 'normalise', 'catalyse', 'customise', 'favourite', 'programme', 'post', 'personalise', 'personalisation', 'customisable', 'familiarise﻿', 'finalise﻿', ];
      };

      if ($scope.propertyDetails.PropertyID === 3) { // Loveys (3)
          updateSpellings();
      }

      $scope.capitalizeWord = function(string) {
          return string[0].toUpperCase() + string.slice(1);
      }
  }
]);;
entriesApp.controller('entriesController', [
    '$scope',
    'entriesFactory',
    'propertyFactory',
    'geoFactory',
    'userFactory',
    'fileUploadFactory',
    'seasonFactory',
    'orderFactory',
    'pdfFactory',
    'mobileDetectionFactory',
    'sharedProperties',
    '$state',
    '$location',
    '$http',
    '$rootScope',
    'SweetAlert',
    '$window',
	'$uibModal',
    '$analytics',
    '$sce',
    '$localStorage',
    '$timeout',
    function ($scope, entriesFactory, propertyFactory, geoFactory, userFactory, fileUploadFactory, seasonFactory, orderFactory, pdfFactory, mobileDetectionFactory, sharedProperties, $state, $location, $http, $rootScope, SweetAlert, $window, $uibModal, $analytics, $sce, $localStorage, $timeout) {
        // init
        var currentUTCInfo = moment.utc();
        $scope.lovieDeadlineText = (currentUTCInfo.isSameOrAfter(moment.utc("05/18/2019")) ? (currentUTCInfo.isSameOrAfter(moment.utc("06/15/2019")) ? (currentUTCInfo.isSameOrAfter(moment.utc("07/01/2019")) ? "" : "Third") : "Second") : "First");

        $scope.setForm = function (form) {
            if (form.$name == "entryForm") $scope.entryForm = form;
            if (form.$name == "contactForm") $scope.contactForm = form;
            if (form.$name == "fileUploadForm") $scope.fileUploadForm = form;
        }


        var stateChanged_To = null;

        $scope.currentYear = moment().year();
        $scope.propertyId = propertyID || 1;
        $scope.maxCampaignItems = (propertyID === 1 || propertyID === 3) ? 10 : (propertyID == 7 ? 12 : 5);

        $scope.P7 = {};
        Object.defineProperty($scope.P7, 'RenamedTypologyCheck', {
            get: function () {
                return $scope.mediaTypeSelected && ['Plus', 'Typology', 'Architecture'].indexOf($scope.mediaTypeSelected.Name) >= 0;
            }
        });

        /*
        * Used to hide Call For Entries areaA
        * Also used to initialize the submission ReceivedPoster value when loading contact info step.
        * See $scope.$on('$stateChangeSuccess'...
        */
        $scope.disableCallForEntries = $scope.propertyId == 0;

        //Also located in Scripts\ng-controllers\admin\categoryController.js
        $scope.campaignModeAll =
        {
            PropertyID: 1,
            MediaType: 'Advertising, Media, & PR'
        };


        $scope.maxCheck = {};
        Object.defineProperty($scope.maxCheck, 'UseCustomCampaignMode', {
            get: function () {
                return $scope.propertyId == $scope.campaignModeAll.PropertyID && $scope.mediaTypeSelected && $scope.mediaTypeSelected.Name == $scope.campaignModeAll.MediaType;
            }
        });
        Object.defineProperty($scope.maxCheck, 'ShowCampaign', {
            get: function () {
                return $scope.piece.IsCampaign || $scope.propertyId == 6 || $scope.maxCheck.UseCustomCampaignMode;
            }
        });
        Object.defineProperty($scope.maxCheck, 'MaxAllowedCount', {
            get: function () {
                if ($scope.piece.IsCampaign || $scope.propertyId == 7 || $scope.maxCheck.UseCustomCampaignMode) { return $scope.maxCampaignItems; }
                else if ($scope.propertyId == 6) { return 4; }

                return 1;
            }
        });
        Object.defineProperty($scope.maxCheck, 'TreatAsCampaign', {
            get: function () {
                return $scope.propertyId == 6;
            }
        });

        $scope.vatAmount = 0;
        $scope.vatDirty = true;
        $scope.creditsEmpty = false;


        $scope.setVatDirt = function (bool) {
            $scope.vatDirty = bool;
        };

        $scope.submitNewUser = {};

        $scope.PDF_W9 = null
        //$scope.submission = null;
        //$scope.piece = null;
        //$scope.selectedEntries = [];
        //$scope.selectedEntriesMeta = [];
        $scope.preventOrderSubmit = false;
        //$scope.mediaTypes = [];
        $scope.mediaTypeGroups = [];
        //$scope.mediaTypeSelected = null;
        $scope.status;
        $scope.propertyDetails;
        //$scope.currentTimesEntered = 0;
        //$scope.countries = [];
        //$scope.statesForClient = [];
        //$scope.statesForContact = [];
        //$scope.statesForBillingInfo = [];
        $scope.selectedSubscriptions = [];
        $scope.fileUploadSettings = {};
        $scope.currentYear = new Date().getFullYear();
        //$scope.cart = null;
        $scope.host = window.location.protocol + "//" + window.location.host;
        //$scope.entryComplete = false;
        $scope.orderHasMailItems = false;
        $scope.orderHasUploadLaterItems = false;
        var tempPaymentTypeID = 1;
        // Set media type
        $scope.setMediaType = function (type) {
            $scope.mediaType = type;

        };

        $scope.addtnlCustomFieldSelected = {Status: false};

        var utmPrefix = "utm_";

        var scrollToPageTop = function () {
            $('html, body').scrollTop($("body").offset().top);
        };

        var resetSubmission = function (clearContactInfo) {
            $scope.submission = null;
            $scope.piece = null;
            $scope.selectedEntries = [];
            $scope.selectedEntriesMeta = [];
            $scope.selectedEntriesCustom = {};
            $scope.preventOrderSubmit = false;
            $scope.mediaTypeSelected = null;
            $scope.currentTimesEntered = 0;
            $scope.cart = null;
            $scope.entryComplete = false;
            $scope.orderHasMailItems = false;
            $scope.orderHasUploadLaterItems = false;
            if (clearContactInfo) { $scope.contact = null; }
        };

        var pieceTemplate = function () {
            return {
                PieceID: 0,
                MediaTypePropertyCategoryID: 0,
                MediaTypeName: "",
                SubmissionID: 0,
                Title: "",
                Urls: "",
                UrlList: [],
                IsCampaign: false,
                UploadFile: "",
                MailItem: "",
                OriginalFileName: "",
                EntryType: propertyID == 7 ? "Upload" : "Url",
                PasswordProtected: false,
                ProtectedUsername: "",
                ProtectedPassword: "",
                IsMobile: false,
                Entries: [],
                Credits: [],
                Client: null,
                ClientTypeID: 1,
                LangList: []
            };
        };
        var entryTemplate = function () {
            return {
                EntryID: 0,
                SubmissionID: 0,
                PieceID: 0,
                PropertyCategoryID: 0,
                RefNumber: 0,
                Price: 0,
                Recommended: false,
                Organization: "",
                PerformerName: "",
                Speech: "",
                AdminNotes: "",
                Thumbnail: ""
            };
        };

        var contactTemplate = function () {
            return {
                ClientID: 0,
                SubmissionID: 0,
                FirstName: "",
                LastName: "",
                Title: "",
                Organization: "",
                OrganizationUrl: "",
                Address1: "",
                Address2: "",
                State: "",
                City: "",
                Zip: "",
                Country: "",
                Phone: "",
                Email: "",
                AltContactFirstName: "",
                AltContactLastName: "",
                AltContactEmail: ""
            };
        };

        var cartTemplate = function () {
            return {
                CartID: 0,
                UserID: 0,
                PropertyID: propertyID,
                SubmissionID: 0,
                Subtotal: 0,
                Shipping: 0,
                Total: 0,
                ShippingType: null,
                BillingFirstName: "",
                BillingLastName: "",
                BillingEmail: "",
                BillingPhone: "",
                BillingAddress1: "",
                BillingAddress2: "",
                BillingCity: "",
                BillingState: "",
                BillingCountry: "",
                BillingZip: "",
                VatId: "",
                ShippingFirstName: "",
                ShippingLastName: "",
                ShippingEmail: "",
                ShippingPhone: "",
                ShippingAddress1: "",
                ShippingAddress2: "",
                ShippingCity: "",
                ShippingState: "",
                ShippingCountry: "",
                ShippingZip: "",
                PaymentTypeID: "1",
                cartItems: [],
                useContactInfo: false
            };
        };

        var cartItemTemplate = function () {
            return {
                CartItemID: 0,
                CartID: 0,
                EntryID: null,
                UnitPrice: 0,
                Quantity: 0,
                Price: 0
            };
        };

        var transactionTemplate = function () {
            return {
                CardholderName: "",
                CardholderNumber: "",
                ExpirationMonth: "",
                ExpirationYear: "",
                CVV: "",
                VATID: ""
            };
        };

        $scope.isMode5AndNotLoggedIn = function () {
            return $scope.loginMode === 5 && !sharedProperties.HasToken();
        };

        $scope.loginContentArea = function () {
            $rootScope.$broadcast('promptLoginEvent');
        };

        $scope.contact = contactTemplate();

        var updateUrlPrefix = function (event, data) {
            var url = null;
            if (event != null) {
                url = event.target.value;
            } else {
                url = data;
            }

            if (!url || !url.trim()) return null;


            if (!(/^https?:\/\//.test(url))) {
                if (url.length != 0) {
                    url = "http://" + url;
                }
                if (url && !(/^(?:(?:https?|http):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/.test(url))) {
                    url = url.replace("@", "").trim();
                }
            }

            return url;
        };

        $scope.checkUrlPrefix = function (event) {
            $scope.TempUrl = updateUrlPrefix(event, $scope.TempUrl || '');
        };

        $scope.socialDetection = function (event) {
            if ($scope.piece && $scope.mediaTypeSelected.EnableSocialURLCheck) {
                var url = updateUrlPrefix(event, ($scope.piece && $scope.piece.Urls ? $scope.piece.Urls : ''));
                $scope.piece.Urls = url;
                $scope.piece.IsSocial = sharedProperties.IsSocialURL($scope.piece.Urls);
                return;
            }
            $scope.piece.IsSocial = false;
            return;
        }

        $scope.mobileDetection = function (event, cb) {
            if (!$scope.piece) {
                if (cb) { cb(); return; }
                else return;
            }
            var url = updateUrlPrefix(event, ($scope.piece && $scope.piece.Urls ? $scope.piece.Urls : ''));
            $scope.piece.Urls = url;

            if (!$scope.piece.Urls) {
                $scope.piece.IsMobile = false;
                if (cb) { cb(); return; }
                else return;
            }
            var data = {
                url: url
            };
            mobileDetectionFactory.urlChecker(data)
                .success(function (results) {
                    if (results.status === 200) {
                        if (results.data && !results.data.error) {
                            $scope.piece.IsMobile = results.data.responsive;
                        }
                        else if (!results.error) {
                            $scope.piece.IsMobile = results.responsive;
                        }
                        else { $scope.piece.IsMobile = false; }
                    }
                    else { $scope.piece.IsMobile = false; }
                    if (cb) cb();
                })
                .error(function (error) {
                    $scope.piece.IsMobile = false;
                    if (cb) cb();
                });
        };

        // This is used on the client info page
        $scope.addHttp = function (event) {
            var el = event.target,
               url = el.value;
            if (!(/^https?:\/\//.test(url))) {
                if (url.length != 0) {
                    url = "http://" + url;
                }
            }
            $scope.submission.Contact.OrganizationUrl = url;
        };


        $scope.promptRegister = function () {
            if (sharedProperties.HasToken() || sharedProperties.HasGuestToken()) {
                userFactory.getContact()
                    .success(function (data) {
                        if (!$scope.contact.email || (!$scope.contact.lockEmail || [1, 3].indexOf($scope.propertyId) > -1)) {
                            sharedProperties.updateUser(data);
                        }
                    })
                    .error(function (error) {
                        $scope.promptRegisterActual();
                    });
            }
            else {
                $scope.promptRegisterActual();
            }
        };

        $scope.promptRegisterActual = function () {
            if ($location.search().login) {
                $rootScope.$broadcast('promptLoginEvent');
            } else if ($location.search().register) {
                $rootScope.$broadcast('promptRegisterEvent');
            } else if ($location.search().forgotpw) {
                $rootScope.$broadcast('promptForgotEvent');
            } else {
                // check registration
                if (
                        ($scope.propertyDetails.RequireRegistrationBeforeEntry === true && ($scope.propertyDetails.RequiredRegistryEntryCount || 0) === 0 && $state.current.name === "enter.select")
                    || ((($scope.currentTimesEntered > 0 && ($scope.currentTimesEntered % $scope.propertyDetails.RequiredRegistryEntryCount) === 0) || propertyID == 7) && $state.current.name === "enter.submit")
                    ) {
                    if ($scope.loginMode === 5) {
                        return $rootScope.$broadcast('promptLoginOrRegisterEvent');
                    }
                    $rootScope.$broadcast(showLoginFirst ? 'promptLoginEvent' : 'promptRegisterEvent');
                } else if ($scope.loginMode !== 5 && !sharedProperties.IsWebbyOrLovie() && $state.current.name === "enter.client") {
                    $rootScope.$broadcast(showLoginFirst ? 'promptLoginEvent' : 'promptRegisterEvent');
                }
            }

        };

        $scope.$on('updateUser', function (event, data) {
            if ($scope.submission) {
                if (data.data.SubUser == null) {
                    $scope.submission.Contact = _.merge({}, data.data, $scope.submission.Contact);
                } else {
                    $scope.submission.Contact = _.merge({}, data.data.SubUser, $scope.submission.Contact);
                }

                $scope.submission.Contact.lockEmail = !sharedProperties.IsWebbyOrLovie() || !sharedProperties.HasToken();

                $scope.submission.Contact.OrganizationUrl = updateUrlPrefix(null, $scope.submission.Contact.OrganizationUrl);
                getStates($scope.submission.Contact.Country, 'statesForContact')
            }
            else {
                if (data.data.SubUser == null) {
                    $scope.contact = data.data;
                } else {
                    $scope.contact = data.data.SubUser;
                }
                $scope.contact.lockEmail = !sharedProperties.IsWebbyOrLovie();
                $scope.contact.OrganizationUrl = updateUrlPrefix(null, $scope.contact.OrganizationUrl);
                getStates($scope.contact.Country, 'statesForContact')
            }
        });

        $scope.$on('login', function (event, data) {
            try {
                if ($state.current.mode == 'entry') {
                    getWelcomeData();
                }
                if ($localStorage.redirectStateInfo && $localStorage.redirectStateInfo.state) {
                    var redirectObj = angular.copy($localStorage.redirectStateInfo);
                    $localStorage.redirectStateInfo = null;
                    $scope.submitted = false;
                    $state.go(redirectObj.state.name, redirectObj.params);
                }
                if ($state.current.name == 'enter.submit' && propertyID != 7) {
                    $scope.nextStep('', $scope.entryForm.$valid && $scope.fileUploadForm.$valid, true);
                } else if ($state.current.name == 'enter.client') {
                    $scope.nextStep('', $scope.contactForm.$valid, true);
                } else if ($state.current.name == 'enter.review') {
                    $scope.nextStep('', true, true);
                }
            } catch (e) {
                //console.log(e);
            }
        });

        $scope.$on('logout', function (event, data) {
            try {
                $state.go('enter.select').then(function () {
                    $localStorage.$reset(defaultLocal);
                });
            } catch (e) {
            }
        });

        $scope.clearSelections = function () {
            $scope.selectedEntries = [];
            $scope.selectedEntriesCustom = {};
        };

        //Used to handle incoming requests from My Account page for "Review/Complete" and "Add To"
        var setupForLoadingAllBySubmissionID = function (sid, isForReviewPage) {
            //SETUP TO RETRIEVE THE DATA
            entriesFactory
              .getSubmission(sid)
                .success(function (details) {
                    if (details.Success) {
                        getPropDetails($scope.propertyId);
                        $scope.submission = details.Data;
                        $scope.mediaTypeSelected = {};
                        $scope.currentTimesEntered = $scope.submission.Pieces ? $scope.submission.Pieces.length : 0;
                        if (isForReviewPage) {
                            if (!$scope.mediaTypes) {
                                getMediaTypes($scope.propertyId)
                                  .then(function () {
                                      updateReviewData();
                                  });
                            } else {
                                updateReviewData();
                            }
                        }
                        else if (!$scope.mediaTypes) {
                            getMediaTypes($scope.propertyId);
                        }
                        scrollToPageTop();
                    }
                    else {
                        //TODO: What to do here?
                    }
                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };


        function resetEntries() {
            try {
                $localStorage.$reset(defaultLocal);
                $scope.mediaTypeSelected = null;
                $scope.currentTimesEntered = 0;
                $scope.entryComplete = false;
            } catch (e) {
                sharedProperties.clearLocalStorage('entries');
                $scope.mediaTypeSelected = null;
                $scope.currentTimesEntered = 0;
                $scope.entryComplete = false;
            }
        };

        var handleStateChanges = function (stateChangeType, event, toState, toParams, fromState, fromParams, options) {

            stateChanged_To = toState.name;

            if (stateChanged_To != "enter.checkoutfinalize" && stateChanged_To != "enter.success") {
                $scope.vatAmount = 0;
                $scope.vatDirty = true;
            }

            //set flag for hitting extended
            if (toState.name == "enter.extended") {
                sharedProperties.SetExtended("-");
                event.preventDefault();
                return $state.go('enter.select');
            }

            if (toState.mode == 'entry' && toState.name != 'enter.select') {
                checkBDOStatus();
            }

            if (fromState.name == "enter.client" || toState.name == "enter.client") { $scope.submitNewUser = {}; }
            if (fromState.name == "dashboard.list" || fromState.name == "dashboard.contact" || $location.search().clear) {
                resetEntries();
            }
            if (toState.name == "dashboard.list" || toState.name == "dashboard.contact" || toState.name == "resetpassword") {
                if (toState.name == "dashboard.list" || toState.name == "dashboard.contact") {
                    $scope.entryComplete = false;
                    resetEntries();
                }
                return;
            }

            if (toState.name == 'enter.select' && fromState.mode == 'entry') {
                getWelcomeData();
            }

            if (toState.name == 'enter.select') {
                $analytics.eventTrack('Lead');
            }

            if ($scope.entryComplete && toState.name != "enter.success" && toState.name != "enter.checkoutfinalize") {
                sharedProperties.setProperty("reviewsAccessible", false);
                // reset local storage
                resetEntries();
            }
            else if (toState.name == 'enter.review') {
                sharedProperties.setProperty("reviewsAccessible", true);
                var sid = sharedProperties.getProperty("entries_submission");
                if (sid) {
                    sharedProperties.setProperty("entries_submission", 0);
                    return setupForLoadingAllBySubmissionID(sid, true);
                } else {
                    $timeout(function () {
                        updateReviewData();
                    }, 300);
                }
            }

            if ($scope.entryComplete && toState.name == "enter.checkoutfinalize") {
                if (window.gtag && propertyID == 1) {
                    gtag('event', 'conversion',
                        {
                            'send_to': 'AW-1071429250/u5j2CP_goukBEILt8v4D',
                            'value': ($scope.order && $scope.order.Total ? $scope.order.Total : ''),
                            'currency': 'USD',
                            'transaction_id': ($scope.order && $scope.order.OrderID ? $scope.order.OrderID : '')
                        });
                }
                if (!$scope.propertyDetails) {
                    return;
                }
                return setupTwitterButton(
                    $scope.propertyDetails.UrlNonEntrySite,
                    $scope.propertyDetails.TwitterContent,
                    'checkoutTwitterContainer'
                );
            }
            else if ($scope.entryComplete && toState.name == "enter.success") {
                // reset local storage
                //$localStorage.$reset();
                //setupReviewTotals();
                //attachCategoryNames();
                //setupReviewBreakdown($scope.submission);
                $scope.entryComplete = false;
                //updateReviewData();

                $analytics.eventTrack('Step 6 - Checkout Successful');
                $analytics.eventTrack('Purchase', { value: $scope.submissionTotal, currency: 'USD' });
                return;
            }
            else if (!$scope.mediaTypeSelected && toState.name !== "enter.select") {
                if (!sharedProperties.HasToken() && toState.name === "enter.submit") {
                    $localStorage.redirectStateInfo = {state: toState, params: toParams};
                }
                event.preventDefault();
                $state.go('enter.select');
            }
            else {
                $scope.submitted = false;
                if (toState.name === "enter.submit") {
                    if ($scope.piece != null) checkIfCampaignSetupNeeded(true);
                }
                if (toState.name === "enter.client" || toState.name === "enter.submit") {
                    $scope.promptRegister();
                }
                else if (toState.name === "enter.select") {
                    var sid = toParams && toParams.submissionID ? toParams.submissionID : null;
                    if (sid) {
                        return setupForLoadingAllBySubmissionID(sid);
                    }
                    else {
                        getPropDetails($scope.propertyId);

                    }
                }
                else if (toState.name === "enter.checkout") {
                    setupReviewTotals();
                    $scope.preventOrderSubmit = false;

                    var date = new Date();
                    //set the default expiration drop-downs
                    $scope.transaction.ExpirationMonth = (date.getMonth() + 1).toString();
                    $scope.transaction.ExpirationYear = date.getFullYear().toString();
                    if ([3].indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1) {

                        $scope.calcVat();
                    }
                }
            }
        }

        function selectMediaTypeFromState(toState, toParams) {
            if (toState.name === "enter.submit" && toParams && toParams.deepLinkRef) {
                var dlMediaType = _.find($scope.mediaTypes, function (mt) {
                    return mt.DeepLinkRef && mt.DeepLinkRef.toLowerCase() === toParams.deepLinkRef.toLowerCase();
                });
                if (dlMediaType) {
                    $scope.createSubmission(dlMediaType);
                }
                else {
                    $state.go('enter.select');
                }
            }
        }

        $scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) {
            //TEMPORARILY DISPOSED OF IT
            ////stateChanged_To = toState.name;

            ////handleStateChanges('$stateChangeStart', event, toState, toParams, fromState, fromParams, options);

            this.locationSearch = $location.search();
            var utmInfo = sharedProperties.FilterRawQueryStringItems(utmPrefix);
            if (utmInfo) {
                $localStorage.siteUtmInfo = utmInfo;
            }
        });

        $scope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, options) {

            switch (toState.name) {
                case 'enter.submit':
                    var j = jQuery, doc = j(document);
                    doc.scrollTop(0);
                    selectMediaTypeFromState(toState, toParams);
                    break;
                case 'enter.client':
                    if ($scope.disableCallForEntries) {
                        $scope.submission.ReceivedPoster = false;
                    }
                    break;
            }

            //check if handled by statechangestart
            if (stateChanged_To && stateChanged_To == toState.name) {
                stateChanged_To = ''
                return;
            }

            stateChanged_To = ''
            try {
                handleStateChanges('$stateChangeSuccess', event, toState, toParams, fromState, fromParams, options);
            } catch (e) {
                console.log(e);
            }
            if (this.locationSearch) {
                $location.search(this.locationSearch);
            }
            var utmInfo = sharedProperties.FilterRawQueryStringItems(utmPrefix);
            if (utmInfo) {
                $localStorage.siteUtmInfo = utmInfo;
            }
        });

        function getPropDetails(propid) {
            propertyFactory.getPropertyDetails(propid)
                .success(function (details) {
                    $scope.propertyDetails = details;
                    $scope.requiredFields = $scope.propertyDetails.entryFormFieldToggles;
                    sharedProperties.setProperty("propertyDetails", details);
                    $rootScope.$broadcast('propertyData');
                    $scope.PDF_W9 = (details ? details.PDF_W9 : null);
                    getSeasonDetails(propid);
                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };



        function handleClosed() {
            window.location = $scope.propertyDetails.UrlClosed;
        };

        var setupDateGuidelines = function (details) {
            //Override date/times must be in utc
            $scope.isEarlyEntry = false;
            $scope.isFinalEntry = false;
            $scope.isExtendedEntry = false;
            $scope.isBDO = false;
            var today = moment.utc();
            if (today.isSameOrAfter(moment.utc(details.CfeStartDate)) && today.isBefore(moment.utc(details.EarlyEntryEndDate))) {
                sharedProperties.RemoveExtended();
                $scope.isEarlyEntry = true;
                $scope.typeOfDeadline = "Early Entry Deadline";
                if (details.EntryVisibleDeadline) {
                    $scope.deadline = details.EntryVisibleDeadline;
                } else {
                    $scope.deadline = details.EarlyEntryEndDate;
                    if (propertyID == 1) {
                        $scope.deadline = 'October 28, 2016';
                    }
                    else if (propertyID == 3) {
                        $scope.deadline = '2017-04-21T09:00:00';
                    }
                    else if (propertyID == 4) {
                        $scope.deadline = '2017-09-08T09:00:00';
                    }
                    else if (propertyID == 5) {
                        $scope.deadline = '2017-06-09T09:00:00';
                    }
                    else if (propertyID == 7) {
                        $scope.deadline = 'November 4, 2016';
                    }
                    else if (propertyID == 9) {
                        $scope.deadline = 'November 18, 2016';
                    }
                }
            } else if (today.isSameOrAfter(moment.utc(details.CfeStartDate)) && (today.isBefore(moment.utc(details.FinalEntryDeadline)) && today.isAfter(moment.utc(details.EarlyEntryEndDate)))) {
                sharedProperties.RemoveExtended();
                $scope.isFinalEntry = true;
                $scope.typeOfDeadline = propertyID == 7 || propertyID == 3 || propertyID == 1 ? "Final Entry Deadline" : "Entry Deadline";
                if (details.EntryVisibleFinalDeadline) {
                    $scope.deadline = details.EntryVisibleFinalDeadline;
                } else {
                    $scope.deadline = details.FinalEntryDeadline;
                    if (propertyID == 3) {
                        $scope.deadline = '2017-06-09T09:00:00';
                    }
                    else if (propertyID == 4) {
                        $scope.deadline = '2017-07-21T09:00:00';
                    }
                    else if (propertyID == 5) {
                        $scope.deadline = '2017-08-11T09:00:00';
                    }
                    else if (propertyID == 6) {
                        $scope.deadline = '2017-06-16T09:00:00';
                    }
                }
                if (details.EntryVisibleDeadline) {
                    $scope.deadline_start = details.EntryVisibleDeadline;
                } else {
                    $scope.deadline_start = details.EarlyEntryEndDate;
                }
            } else if (today.isSameOrAfter(moment.utc(details.CfeStartDate)) && (today.isAfter(moment.utc(details.FinalEntryDeadline)) && today.isBefore(moment.utc(details.ExtendedEntryDeadline)))) {
                sharedProperties.RemoveExtended();
                $scope.isExtendedEntry = true;
                $scope.typeOfDeadline = (propertyID == 3 ? "Grace Period Deadline" : "Extended Entry Deadline");
                if (details.EntryVisibleExtendedDeadline) {
                    $scope.deadline = details.EntryVisibleExtendedDeadline;
                } else {
                    $scope.deadline = details.ExtendedEntryDeadline;
                    if (propertyID == 1 || propertyID == 7) {
                        $scope.deadline = '2017-01-27T08:00:00';
                    }
                    else if (propertyID == 3) {
                        $scope.deadline = '2017-07-28T09:00:00';
                    }
                    else if (propertyID == 4) {
                        $scope.deadline = '2017-08-25T09:00:00';
                    }
                    else if (propertyID == 5) {
                        $scope.deadline = '2017-09-15T09:00:00';
                    }
                    else if (propertyID == 6) {
                        $scope.deadline = '2017-07-07T09:00:00';
                    }
                }
                if (details.EntryVisibleFinalDeadline) {
                    $scope.deadline_start = details.EntryVisibleFinalDeadline;
                } else {
                    $scope.deadline_start = details.FinalEntryDeadline;
                }
            } else {
                $scope.typeOfDeadline = "";
                $scope.deadline = null;
                $scope.deadline_start = null;

                if (details.BackdoorEntriesOpen) {
                    var item = sharedProperties.GetExtended();
                    if (item) {
                        if (item == details.SeasonID) {
                            item = true;
                        } else if (item == "-") {
                            sharedProperties.SetExtended(details.SeasonID);
                            item = true;
                        } else {
                            sharedProperties.RemoveExtended();
                        }
                    }

                    if (item && item == true) {
                        $scope.isBDO = true;
                        return;
                    }
                }
                sharedProperties.RemoveExtended();
                handleClosed();
            }
        };

        function checkBDOStatus() {
            var today = moment.utc();

            var details = $scope.seasonDetails;
            if (!details) {
                details = sharedProperties.getProperty("seasonDetails");
            }

            if (!details) {
                return getSeasonDetails(propertyID);
            } else if (today.isAfter(moment.utc(details.ExtendedEntryDeadline)) && details.BackdoorEntriesOpen) {
                var item = sharedProperties.GetExtended();
                if (item && (item == details.SeasonID || item == "-")) {
                    return $scope.isBDO = true;
                }
            }

            $scope.isBDO = false;
        }

        //retrieve season details for the current property's season
        function getSeasonDetails(propid) {
            seasonFactory.getCurrentDetailsByProperty(propid)
                .success(function (details) {
                    if (details && details.length > 0) {
                        sharedProperties.setProperty("seasonDetails", details[0]);
                        $scope.seasonDetails = details[0];
                        $scope.seasonStartDate = details[0].StartDate;
                        $scope.seasonEndDate = details[0].EndDate;
                        $scope.seasonYear = details[0].Year;
                        $scope.seasonNumber = sharedProperties.getOrdinal(details[0].SeasonNumber, false);
                        setupDateGuidelines(details[0]);
                        $scope.SeasonID = details[0].SeasonID;
                        $scope.promptRegister();
                    }
                    else {
                        //TODO: WHAT TO DO HERE IF NO SEASON DATA RETURNED?
                        handleClosed();
                    }
                })
                .error(function (error) {
                    $scope.status = error;
                });
        };

        function getMediaTypes(propid) {
            return entriesFactory.getMediaTypes(propid)
                .success(function (mediaTypes) {
                    $scope.mediaTypes = mediaTypes;
                    $scope.mediaTypeGroups = [];
                    for (var x = 0; x < mediaTypes.length; x++) {
                        var existingItemIndex = _.findIndex($scope.mediaTypeGroups, {
                            GroupingName: mediaTypes[x].GroupingName
                        });
                        if (existingItemIndex > -1) {
                            $scope.mediaTypeGroups[existingItemIndex].Count++;
                            $scope.mediaTypeGroups[existingItemIndex].Type = null;
                        } else {
                            $scope.mediaTypeGroups.push(
                                {
                                    GroupingName: mediaTypes[x].GroupingName,
                                    GroupingDisplayOrder: mediaTypes[x].GroupingDisplayOrder,
                                    Count: 1,
                                    Type: mediaTypes[x],
                                    Show: false,
                                    Description: mediaTypes[x].Description,
                                    CSSClass: mediaTypes[x].CSSClass,
                                    GroupingDescription: mediaTypes[x].GroupingDescription
                                })
                        }
                    }
                    $scope.mediaTypeGroups = _.sortBy($scope.mediaTypeGroups, "GroupingDisplayOrder");
                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        function getPieceLengths() {
            if ($scope.propertyDetails.PropertyID !== 8 && $scope.propertyDetails.PropertyID !== 1) {
                return;
            }
            entriesFactory.getPieceLengths()
                .success(function (resp) {
                    $scope.pieceLengths = resp.Data;
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        function getPieceCompanySize() {
            if ($scope.propertyDetails.PropertyID !== 7) {
                return;
            }
            entriesFactory.getPieceCompanySize()
                .success(function (resp) {
                    $scope.pieceCompanySizes = resp.Data;
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        $scope.companySizeFilter = function (item) {
            if (item && (item.MediaTypeName == $scope.mediaTypeSelected.Name || !item.MediaTypeName)) {
                return item;
            }
        };

        function getCountries() {
            geoFactory.getCountries(sharedProperties.getProperty("propertyDetails").PropertyID)
            .success(function (countries) {
                $scope.countries = countries;
            }).error(function (error) {
                $scope.status = error;
                console.error(error);
            });
        };

        $scope.getStates = function (countryAbbrev, stateList) {
            resetStateOption(countryAbbrev, stateList);
            getStates(countryAbbrev, stateList);

        }

        function getStates(countryAbbrev, stateList, cb) {
            if (!$scope.countries) return;
            var countryID = 0;
            for (var countryIndex = 0; countryIndex < $scope.countries.length; countryIndex++) {
                if ($scope.countries[countryIndex].Abbrev == countryAbbrev) {
                    countryID = $scope.countries[countryIndex].CountryID;
                }
            }
            $scope[stateList] = [];
            if (countryID == 0) return;
            geoFactory.getStates(countryID)
                .success(function (states) {
                    //console.log(states);
                    if (states.length > 0) {
                        $scope.showStateSelector = true;
                        $scope.showStateFreeText = !$scope.showStateSelector;
                        $scope[stateList] = states;
                    } else {
                        $scope.showStateSelector = false;
                        $scope.showStateFreeText = !$scope.showStateSelector;
                    }
                    if (cb) cb();
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                    if (cb) cb();
                });
        };

        function resetStateOption(country, stateList) {
            if (($scope.submission != undefined && $scope.submission.Contact != undefined) || ($scope.piece != undefined && $scope.piece.Client != undefined && $scope.piece.Client.Country != country) || ($scope.cart != undefined && $scope.cart.BillingCountry != country)) {
                if (stateList === 'statesForClient') {
                    $scope.piece.Client.State = "";
                }
                if (stateList === 'statesForContact' && $scope.submission) {
                    $scope.submission.Contact.State = "";
                }
                if (stateList === 'statesForBillingInfo') {
                    $scope.cart.BillingState = "";
                }
            }
        }


        function doPiecesMatch(piece1, piece2) {
            if (piece1.PieceID != 0 && piece2.PieceID != 0 && piece1.PieceID == piece2.PieceID) return true;
            if ($scope.propertyDetails.PropertyID != 7) {
                if (piece1.Title !== piece2.Title) return false;

                if (piece1.MediaTypePropertyCategoryID !== piece2.MediaTypePropertyCategoryID) return false;

                if (piece1.EntryType !== piece2.EntryType) return false;

                if (piece1.IsCampaign !== piece2.IsCampaign) return false;

                if (piece1.EntryType == "Url") {
                    return (piece1.Urls && piece1.Urls === piece2.Urls);
                }
                else if (piece1.EntryType == "Upload") {
                    return (piece1.OriginalFileName && piece1.OriginalFileName === piece2.OriginalFileName);
                }
                else if (piece1.EntryType == "Mail" || piece1.EntryType == "UploadLater") {
                    return (piece1.MailItem && piece1.MailItem === piece2.MailItem);
                }
            }

            return false;
        }

        $scope.updateLeadImageIndex = function (value) {
            for (var x = 0; x <= $scope.piece.FileList.length - 1; x++) {
                if (x == value) {
                    $scope.piece.FileList[x].LeadImage = true;
                } else {
                    $scope.piece.FileList[x].LeadImage = null;
                }
            }
            $scope.showFileError = false;
        }

        $scope.setFileUrlFromS3 = function (fileUrl, fileName) {
            //just put files in list for now...will update from list to main ones in another function
            if (!$scope.piece.FileList) {
                $scope.piece.FileList = [];
            }
            $scope.piece.FileList.push({
                UploadFile: fileUrl,
                OriginalFileName: fileName,
                LeadImage: null
            });

            updateFilePieceData();
            $scope.$digest();
        }

        var updateFilePieceData = function () {
            if (!$scope.piece.FileList || $scope.piece.FileList.length == 0) {
                $scope.piece.UploadFile = "";
                $scope.piece.OriginalFileName = "";
                $scope.piece.LeadImageIndex = null;
                return;
            }

            $scope.piece.UploadFile = $scope.piece.FileList[0].UploadFile;
            $scope.piece.OriginalFileName = $scope.piece.FileList[0].OriginalFileName;
            $scope.piece.LeadImageIndex = null;
        };

        $scope.removeFileUpload = function (index) {
            $scope.piece.FileList.splice(index, 1);
            updateFilePieceData();
            if ($scope.propertyDetails.PropertyID === 7) {
                $scope.submitted = true;
                $scope.showFileError = true;
            }
        }

        $scope.nextStep = function (nextStep, isValid, skipTransition) {
            var skipTransition = skipTransition || false;
            setUTMInfo();
            if (isValid || ($scope.submission.Pieces.length > 0 && skipTransition)) {
                if ($state.current.name == 'enter.submit') {
                    $scope.socialDetection();
                    $scope.mobileDetection(null, function () {
                        if (isValid) {
                            $scope.saveLocal();
                        }
                        $scope.submitted = false;
                        $scope.submitSubmission(nextStep, true, (skipTransition || !isValid));
                        $('html, body').scrollTop($("body").offset().top);
                    });
                    $analytics.eventTrack('Step 1 - Submit Work - Completed');
                    if (window.gtag && propertyID == 1) {
                        gtag('event', 'conversion',
                            {
                                'send_to': 'AW-1071429250/PxKhCNzkoukBEILt8v4D'
                            });
                    }
                    $analytics.eventTrack('CompleteRegistration');
                    if (twttr && twttr.conversion) {
                        twttr.conversion.trackPid('o4tcv', { tw_sale_amount: 0, tw_order_quantity: 0 });
                    }
                }
                else {
                    $scope.submitted = false;
                    $scope.submitSubmission(nextStep, true, (skipTransition || !isValid));
                    $('html, body').scrollTop($("body").offset().top);
                }
            } else {
                $scope.submitted = true;
                setTimeout(function () {
                    $('html, body').animate({
                        scrollTop: $(".has-error:visible:first").offset() ? $(".has-error:visible:first").offset().top - 50 : 0
                    }, 1000);
                }, 150);

            }
        }

        $scope.selectGroup = function (mediaTypeGroup, ignoreExpandCollapse) {
            if (mediaTypeGroup.Count > 1) {
                if (ignoreExpandCollapse) { return; }
                mediaTypeGroup.Show = !mediaTypeGroup.Show;
            } else {
                $scope.createSubmission(mediaTypeGroup.Type)
            }
        }

        var setSelectedEntriesCustom_ActualCategories = function (isShared, isCampaign) {
            var allCatTypes;
            if (isShared) {
                allCatTypes = _.filter($scope.mediaTypeSelected.CategoryTypes, function (o) { return o.IsShared; });
            }
            else {
                allCatTypes = _.filter($scope.mediaTypeSelected.CategoryTypes, function (o) { return o.IsCampaign == isCampaign && !o.IsShared; });
            }
            var allCats = _.flatMap(allCatTypes, 'Categories');
            var ids = _.map(allCats, function (n) {
                return n.PropertyCategoryID;
            });

            var newList = [];
            //only keep the ones in the list also in the cagegories shown
            for (var i = $scope.selectedEntries.length - 1; i >= 0; i--) {
                var index = $.inArray($scope.selectedEntries[i], ids);

                if (index > -1) {
                    newList.push($scope.selectedEntries[i]);
                }
            }

            return newList;
        };

        var setSelectedEntriesCustom = function () {
            if (!$scope.selectedEntries || $scope.selectedEntries.length <= 0) {
                $scope.selectedEntriesCustom = {};
                return;
            }

            if (!$scope.maxCheck || !$scope.maxCheck.UseCustomCampaignMode) {
                $scope.selectedEntriesCustom = {};
                return;
            }

            $scope.selectedEntriesCustom.individual = setSelectedEntriesCustom_ActualCategories(false, false);
            $scope.selectedEntriesCustom.campaign = setSelectedEntriesCustom_ActualCategories(false, true);
            $scope.selectedEntriesCustom.shared = setSelectedEntriesCustom_ActualCategories(true, false);
        }

        var setCategoriesWithDeviceList = function () {
            var tempCats = [];
            _($scope.mediaTypeSelected.CategoryTypes).forEach(function (obj) {
                _(obj.Categories).forEach(function (cat) {
                    if (cat.DeviceTypeGroupID != null) {
                        tempCats.push(cat.PropertyCategoryID);
                    }
                });
            });
            $scope.categoriesWithDeviceList = tempCats;
        }

        var setCategoriesWithDurationList = function () {
            var tempCats = [];
            _($scope.mediaTypeSelected.CategoryTypes).forEach(function (obj) {
                _(obj.Categories).forEach(function (cat) {
                    if (cat.EnableDurationOption) {
                        tempCats.push(cat.PropertyCategoryID);
                    }
                });
            });
            $scope.categoriesWithDurationList = tempCats;
        }

        var setCategoriesWithCustomFieldsList = function () {
            var tempCats = [];
            var tempCats2 = [];
            _($scope.mediaTypeSelected.CategoryTypes).forEach(function (obj) {
                _(obj.Categories).forEach(function (cat) {
                    if (cat.HasCustomField && !cat.OverrideDefaultCustomField) {
                        tempCats.push(cat.PropertyCategoryID);
                    }
                    else if (cat.HasCustomField && cat.OverrideDefaultCustomField) {
                        tempCats2.push(cat.PropertyCategoryID);
                    }
                });
            });
            $scope.categoriesWithCustomFieldsList = tempCats;
            $scope.categoriesWithAddtnlCustomFieldsList = tempCats2;
        }

        var toolTipText = "<div class='text-left'><strong>Campaign</strong><br />A campaign includes no less than 3 and no more than " + (($scope.propertyDetails.PropertyID === 1 || $scope.propertyDetails.PropertyID === 3) ? "10" : "5") + " elements. Integrated Marketing Campaigns MUST include at least one Website. <br/><br />" + ($scope.propertyDetails.PropertyID !== 3 ? "<strong>Media & PR</strong><br /> Media and PR entries are for either an individual element or campaign which includes no more than 5 elements. The work must include one digital element.<br/><br />" : "") + "<strong>Single</strong><br /> Only individual elements can be entered in the single entry categories. This includes a single banner/display ad, website, microsite, rich media, email, viral, branded content and game/application entry.</div>";
        $scope.campaignTooltip = $sce.trustAsHtml(toolTipText);

        var toolTipTextVatID = "<div class='text-left'>Please provide a VAT ID with a valid country code. If you do not know your VAT ID please leave this field blank.<br /><br />Example: DE234987234</div>";
        $scope.vatidTooltip = $sce.trustAsHtml(toolTipTextVatID);

        var companyRoleTooltip = "<div class='text-left'>i.e Advertising Agency, Production Company, Brand, etc.. <br />This information will be used for Agency and Production Company of the year.</div>";
        $scope.companyRoleTooltip = $sce.trustAsHtml(companyRoleTooltip);

        function setUTMInfo() {
            if ($scope.submission && !$scope.submission.UTMInfo) {
                $scope.submission.UTMInfo = sharedProperties.FilterRawQueryStringItems(utmPrefix) || $localStorage.siteUtmInfo;
                defaultLocal.siteUtmInfo = $localStorage.siteUtmInfo || $scope.submission.UTMInfo;
                defaultsForSuccess.siteUtmInfo = $localStorage.siteUtmInfo || $scope.submission.UTMInfo;
            }
        }

        // set up the page for new submission or new entry
        $scope.createSubmission = function (mediaType) {

            $scope.currentTimesEntered++;
            $scope.creditsEmpty = false; // Resetting empty row warning for "Add Row" section.

            if (!$scope.submission) {
                $scope.submission = {
                    SubmissionID: 0,
                    PropertyID: propertyID,
                    SeasonID: $scope.SeasonID || sharedProperties.getProperty("seasonDetails").SeasonID,
                    UserID: 1,
                    VideoPremierUrl: "",
                    notes: "",
                    Code: "",
                    Platform: "",
                    Description: "",
                    Tags: "",
                    Slug: "",
                    Uuid: "",
                    LanguageID: 1, // send 1 for en
                    Contact: $scope.contact,
                    Pieces: []
                };
            } else {
                try {
                    $scope.submission.SeasonID = $scope.SeasonID || sharedProperties.getProperty("seasonDetails").SeasonID;
                } catch (e) {
                    //console.log(e);
                }
            }

            setUTMInfo();

            $scope.piece = pieceTemplate();

            if ($scope.propertyId == 7) {
                $scope.piece.APlusProjectStatusID = 3;
                $scope.piece.APlusYearComplete = $scope.currentYear;
            }

            if (mediaType) {
                $scope.mediaTypeSelected = mediaType;
                $scope.piece.MediaTypePropertyCategoryID = mediaType.PropertyCategoryDataID;
                $scope.piece.MediaTypeName = mediaType.Name;
                $scope.piece.MediaTypeCssClass = mediaType.CSSClass;
                setCategoriesWithDeviceList();
                setCategoriesWithCustomFieldsList();
                setCategoriesWithDurationList();
            }

            $scope.selectedEntries = [];
            $scope.selectedEntriesMeta = [];
            $scope.selectedEntriesCustom = {};

            checkIfCampaignSetupNeeded();

            if (mediaTypeModal) {
                mediaTypeModal.dismiss();
                $scope.promptRegister();
                scrollToPageTop();
            }

            $state.go('enter.submit');
        };

        var checkIfCampaignSetupNeeded = function (isEditMode) {
            $scope.ShowCampaignSetup = false;
            $scope.ShowCampaignSetupSelection = false;

            if (!$scope.mediaTypeSelected.CategoryTypes || $scope.mediaTypeSelected.CategoryTypes.length == 0) {
                return;
            }

            // get category type index if campaign
            var campaignIndex = _.findIndex($scope.mediaTypeSelected.CategoryTypes, {
                IsCampaign: true
            });

            // show selection option if found
            if (campaignIndex > -1) {
                $scope.ShowCampaignSetup = true;
                if (!isEditMode) $scope.piece.IsCampaign = null;
            } else {
                $scope.piece.IsCampaign = false;
            }

            // get category type index if not campaign
            campaignIndex = _.findIndex($scope.mediaTypeSelected.CategoryTypes, {
                IsCampaign: false
            });

            if (campaignIndex > -1) {
                $scope.ShowCampaignSetupSelection = true;
            } else {
                $scope.piece.IsCampaign = true;
            }
        };

        var mediaTypeModal;
        var beginSelectMediaTypes = function (isValid) {
            // Webbys and Lovies get the Media Type picker modal
            if ([1, 3].indexOf($scope.propertyDetails.PropertyID) >= 0) {
                mediaTypeModal = $uibModal.open({
                    templateUrl: "/Entries/MediaTypePickerModal",
                    scope: $scope,
                    windowClass: "media-type-picker-modal"
                });
                $scope.submitSubmission('enter.select', isValid, true); // save submission, but prevent advancing
            } else {
                //$scope.piece = null;
                $scope.submitSubmission('enter.select', isValid);
            }
        }

        $scope.saveAndNew = function (isValid) {
            if (isValid) {
                $scope.saveLocal();
                beginSelectMediaTypes(isValid);
                $scope.submitted = false;
            }
        }


        $scope.submitAndNew = function (isValid) {
            if (isValid) {
                beginSelectMediaTypes(isValid);
                $scope.submitted = false;
            }
        }

        // save form to local object
        $scope.saveLocal = function () {
            //update for custom campaign mode
            if ($scope.maxCheck && $scope.maxCheck.UseCustomCampaignMode) {
                if (!$scope.selectedEntriesCustom) {
                    $scope.piece.IsCampaign = false;
                }
                else if ($scope.selectedEntriesCustom.campaign && $scope.selectedEntriesCustom.campaign.length > 0) {
                    $scope.piece.IsCampaign = true;
                }
                else if ($scope.selectedEntriesCustom.shared && $scope.selectedEntriesCustom.shared.length > 0) {
                    //default to a campaign
                    $scope.piece.IsCampaign = true;
                }
                else {
                    $scope.piece.IsCampaign = false;
                }
            }

            //check for any Additional Credit data not added yet
            $scope.addCredit(true);

            //check for any additional urls not added yet
            $scope.addUrl();

            $scope.adjustForYourRole();

            //adjust for selected entry type
            $scope.piece.MailItem = $scope.piece.EntryType === "Mail" || $scope.piece.EntryType === "UploadLater" ? $scope.piece.MediaTypeName + " (" + $scope.piece.EntryType + ")" : null;
            if ($scope.piece.EntryType !== "Url") {
                $scope.piece.Urls = null;
                $scope.piece.UrlList = [];
            }
            else {
                //adjust for no-campaign having more then 1 url
                if (!$scope.piece.IsCampaign && $scope.propertyId != 6) {
                    if ($scope.piece.Urls) {
                        $scope.piece.UrlList = [];
                    } else if ($scope.piece.UrlList && $scope.piece.UrlList.length > 0) {
                        $scope.piece.Urls = $scope.piece.UrlList[0];
                        $scope.piece.UrlList = [];
                    }
                }
            }
            if ($scope.piece.EntryType !== "Upload") {
                $scope.piece.OriginalFileName = null;
                $scope.piece.UploadFile = null;
                $scope.piece.FileList = [];
            }

            //update selected categories to only match the ones for the type (single/campaign) selected
            updateSelectedCategory();

            if ($scope.maxCheck && $scope.maxCheck.UseCustomCampaignMode) {
                //if custom mode, make sure custom list is updated from updated selectedentrieslist
                setSelectedEntriesCustom($scope.selectedEntries)
            }

            //get temp piece list
            var entryList = $scope.piece.Entries;
            var recommendedCategoryList = [];
            for (var i = 0; i < entryList.length; i++) {
                if (entryList[i].Recommended) {
                    recommendedCategoryList.push(entryList[i].PropertyCategoryID);
                }
            }
            $scope.piece.Entries = [];

            // split out entries in to separate
            _($scope.selectedEntries).forEach(function (value, key) {
                if (value > 0) {
                    // generate fresh entry
                    var newEntry = entryTemplate();
                    newEntry.EntryID = 0;
                    // set/update specifics
                    newEntry.PropertyCategoryID = value;
                    newEntry.Price = $scope.getCategoryPrice(value);

                    //search for existing w/recommended flag
                    if (recommendedCategoryList && recommendedCategoryList.length > 0 && $.inArray(value, recommendedCategoryList) > -1) {
                        newEntry.Recommended = true;
                    }

                    // push to entries
                    var found = false;
                    for (var index = 0; index < entryList.length; index++) {
                        if (entryList[index].PropertyCategoryID == newEntry.PropertyCategoryID) {
                            newEntry.EntryID = entryList[index].EntryID;
                            break;
                        }
                    }
                    $scope.piece.Entries.push(newEntry);
                }
            });

            // add piece
            var found = false;
            for (var index = 0; index < $scope.submission.Pieces.length; index++) {
                // find matching piece
                if (doPiecesMatch($scope.piece, $scope.submission.Pieces[index])) {
                    //merge existing
                    $scope.piece.PieceID = $scope.submission.Pieces[index].PieceID;
                    $scope.piece.Entries = _.unionBy($scope.piece.Entries, $scope.submission.Pieces[index].Entries, 'PropertyCategoryID');
                    $scope.submission.Pieces[index] = $scope.piece;
                    found = true;
                    break;
                } else {
                    // mark as not found
                    found = false;
                }
            }
            if (!found) {
                // add new
                $scope.submission.Pieces.push($scope.piece);
            }
        };

        function isCreditsValid(credits) {
            if (credits && credits.length > 0) {
                for (var t = 0; t < credits.length; t++) {
                    if (credits[t].FirstName || credits[t].LastName || credits[t].Title || credits[t].Organization) {
                        return true;
                    }
                }
            }
            return false;
        }

        $scope.isCreditsRequired = function () {
            return isCreditsRequired();
        };

        function isCreditsRequired() {
            if ($scope.propertyId === 7) {
                return !($scope.piece.Credits && $scope.piece.Credits.length > 0 && isCreditsValid($scope.piece.Credits));
            }
            return false;
        }

        $scope.clearCredits = function (selectedValue) {
            if (selectedValue) {
                $scope.piece.Credits = [];
            }
        };

        $scope.addCredit = function (ignoreValidation) {
            if (!$scope.addtlCredit || (!$scope.addtlCredit.FirstName && !$scope.addtlCredit.LastName && !$scope.addtlCredit.Organization && !$scope.addtlCredit.Title && !$scope.addtlCredit.CompanyRole)) {
                if (!ignoreValidation) {
                    $scope.creditsEmpty = true;
                }
                return;
            }
            else {
                $scope.creditsEmpty = false;
            }

            $scope.piece.Credits.push({
                FirstName: $scope.addtlCredit.FirstName,
                LastName: $scope.addtlCredit.LastName,
                Organization: $scope.addtlCredit.Organization,
                Title: $scope.addtlCredit.Title,
                CompanyRole: $scope.addtlCredit.CompanyRole,
                IsPrimary: false,
                IsRoot: false
            });

            $scope.addtlCredit.FirstName = null;
            $scope.addtlCredit.LastName = null;
            $scope.addtlCredit.Organization = null;
            $scope.addtlCredit.Title = null;
            $scope.addtlCredit.CompanyRole = null;

        };

        $scope.removeCredit = function (index) {
            $scope.piece.Credits.splice(index, 1);
        };

        $scope.addUrl = function (errorList) {
            if (errorList && Object.keys(errorList).length > 0) {
                $scope.campUrl = true;
                return;
            }

            if (!$scope.TempUrl || !$scope.TempUrl.trim())
                return;

            if (!$scope.piece.UrlList) {
                $scope.piece.UrlList = [];
            }

            $scope.piece.UrlList.push($scope.TempUrl);

            $scope.TempUrl = null;
            $scope.campUrl = false;

        };

        $scope.removeUrl = function (index) {
            $scope.piece.UrlList.splice(index, 1);
        };

        var updateSelectedCategory = function () {
            if (!$scope.ShowCampaignSetup) return;
            if (!$scope.selectedEntries || $scope.selectedEntries.length == 0) return;

            //todo: Setup 2nd cat type as campaign and verify this
            var allCatTypes = $scope.maxCheck && $scope.maxCheck.UseCustomCampaignMode ? $scope.mediaTypeSelected.CategoryTypes : _.filter($scope.mediaTypeSelected.CategoryTypes, function (o) { return o.IsCampaign == $scope.piece.IsCampaign; });
            var allCats = _.flatMap(allCatTypes, 'Categories');
            var ids = _.map(allCats, function (n) {
                return n.PropertyCategoryID;
            });

            //only keep the ones in the list also in the cagegories shown
            for (var i = $scope.selectedEntries.length - 1; i >= 0; i--) {
                var index = $.inArray($scope.selectedEntries[i], ids);

                if (index == -1) {
                    $scope.selectedEntries.splice(i, 1);
                }
            }
        };

        $scope.adjustForYourRole = function () {
            if ($scope.piece.ClientTypeID == 1) {
                //clear out items if Internal
                $scope.piece.Client = null;
            }
        };

        $scope.categorySelectedCheck = function (object) {
            return object && Object.keys(object).some(function (key) { return object[key]; });
        };

        // returns the category price for a specific category id
        $scope.getCategoryPrice = function (categoryID) {
            for (var mtIndex = 0; mtIndex < $scope.mediaTypes.length; mtIndex++) {
                for (var ctIndex = 0; ctIndex < $scope.mediaTypes[mtIndex].CategoryTypes.length; ctIndex++) {
                    for (var cIndex = 0; cIndex < $scope.mediaTypes[mtIndex].CategoryTypes[ctIndex].Categories.length; cIndex++) {
                        if ($scope.mediaTypes[mtIndex].CategoryTypes[ctIndex].Categories[cIndex].PropertyCategoryID == categoryID) {
                            return $scope.mediaTypes[mtIndex].CategoryTypes[ctIndex].Categories[cIndex].Price;
                        }
                    }
                }
            }

            return null;
        };

        var getCategoryForCategoryID = function (categoryID) {
            for (var x = 0; x < $scope.mediaTypes.length; x++) {
                for (var y = 0; y < $scope.mediaTypes[x].CategoryTypes.length; y++) {
                    for (var z = 0; z < $scope.mediaTypes[x].CategoryTypes[y].Categories.length; z++) {
                        if (categoryID == $scope.mediaTypes[x].CategoryTypes[y].Categories[z].PropertyCategoryID) {
                            return {
                                Name: $scope.mediaTypes[x].CategoryTypes[y].Categories[z].Name,
                                EnableParanthetical: $scope.mediaTypes[x].CategoryTypes[y].Categories[z].EnableParenthetical,
                                CatTypeShortName: $scope.mediaTypes[x].CategoryTypes[y].ShortName
                            };
                        }
                    }
                }
            }
            return null;
        };

        var attachCategoryNames = function () {
            if (!$scope.submission || !$scope.submission.Pieces) { return; }
            for (var x = 0; x < $scope.submission.Pieces.length; x++) {
                for (var y = 0; y < $scope.submission.Pieces[x].Entries.length; y++) {
                    var entryCategory = getCategoryForCategoryID($scope.submission.Pieces[x].Entries[y].PropertyCategoryID);
                    if (entryCategory) {
                        $scope.submission.Pieces[x].Entries[y].CategoryName = entryCategory.Name;
                        $scope.submission.Pieces[x].Entries[y].CategoryEnableParen = entryCategory.EnableParanthetical;
                        $scope.submission.Pieces[x].Entries[y].CatTypeShortName = entryCategory.CatTypeShortName;
                     }
                }
            }
        };

        var setupReviewTotals = function () {
            if (!$scope.submission || !$scope.submission.Pieces) { return; }
            var totalPrice = 0;
            for (var pi = 0; pi < $scope.submission.Pieces.length; pi++) {
                var pieceTotal = 0;
                for (var ei = 0; ei < $scope.submission.Pieces[pi].Entries.length; ei++) {
                    pieceTotal += $scope.submission.Pieces[pi].Entries[ei].Price;
                }
                $scope.submission.Pieces[pi].SubTotal = pieceTotal;
                totalPrice += pieceTotal;
            }
            $scope.submissionTotal = totalPrice + $scope.vatAmount;
        };

        // creates an array of category IDs from an array of entries
        var getCategoryIDsFromEntries = function (entries) {
            var idArray = [];
            for (var x = 0; x < entries.length; x++) {
                idArray.push(entries[x].PropertyCategoryID);
            }
            return idArray;
        };

        // grabs the recommendations and mobile recommendations from the server for the ReviewData object on review page
        var generateReviewRecommendations = function () {
            if (!$scope.submission || !$scope.submission.Pieces) { return; }
            var items = [];
            for (var pi = 0; pi < $scope.submission.Pieces.length; pi++) {
                var current = $scope.submission.Pieces[pi];
                items.push({
                    PieceID: current.PieceID,
                    MediaTypePropertyCategoryID: current.MediaTypePropertyCategoryID,
                    Title: current.Title,
                    EntryType: current.EntryType,
                    Urls: current.Urls,
                    UrlList: current.UrlList,
                    MailItem: current.MailItem,
                    OriginalFileName: current.OriginalFileName,
                    IsMobile: current.IsMobile,
                    PropertyCategoryDataIDs: getCategoryIDsFromEntries(current.Entries),
                    IsCampaign: current.IsCampaign,
                    IsSocial: current.IsSocial
                });
            }

            entriesFactory.getCategoryRecommendations({ data: items })
            .success(function (result) {
                // assign recommendations and mobile recommendations to review data
                if (!result.Success) return null;
                for (var pi = 0; pi < $scope.submission.Pieces.length; pi++) {
                    if (result.Data && result.Data.length > 0) {
                        for (var ri = 0; ri < result.Data.length; ri++) {
                            if (doPiecesMatch($scope.submission.Pieces[pi], result.Data[ri])) {
                                //assign recommendations
                                $scope.submission.Pieces[pi].Recommendations = result.Data[ri].Recommendations;
                                $scope.submission.Pieces[pi].MobileRecommendations = result.Data[ri].MobileRecommendations;
                                $scope.submission.Pieces[pi].SocialRecommendations = result.Data[ri].SocialRecommendations;
                                $scope.submission.Pieces[pi].PTRecommendations = result.Data[ri].PTRecommendations;
                            }
                        }
                    }
                    else {
                        $scope.submission.Pieces[pi].Recommendations = null;
                        $scope.submission.Pieces[pi].MobileRecommendations = null;
                        $scope.submission.Pieces[pi].SocialRecommendations = null;
                        $scope.submission.Pieces[pi].PTRecommendations = null;
                    }
                }
            }).error(function (error) {
                $scope.status = error;
                console.error(error);
            });
            return null;
        };

        var setupReviewBreakdown = function (submission) {
            var setupMedia = function (pieceList) {
                var mediaList = [];
                angular.forEach(pieceList, function (obj, key) {
                    var media = { MediaTypeCssClass: obj.MediaTypeCSSClass || obj.MediaTypeCssClass, MediaTypeName: obj.MediaTypeName, Pieces: [] };
                    var index = -1;
                    //check if already in list
                    for (var i = 0; i < mediaList.length; i++) {
                        if (mediaList[i].MediaTypeName == media.MediaTypeName) {
                            index = i;
                            break;
                        }
                    }
                    if (index == -1) {
                        mediaList.push(media);
                    }
                });
                return mediaList;
            };

            var populateMedia = function (item) {
                if (item == null) return null;
                var mediaList = setupMedia(item.Pieces);

                angular.forEach(item.Pieces, function (obj, key) {
                    var index = -1;
                    for (var i = 0; i < mediaList.length; i++) {
                        if (mediaList[i].MediaTypeName == obj.MediaTypeName) {
                            index = i;
                            break;
                        }
                    }
                    if (index > -1) {
                        mediaList[index].Pieces.push(obj);
                    }
                });
                return mediaList;
            };

            $scope.reviewData = populateMedia(submission);
        };

        var updateReviewData = function () {
            attachCategoryNames();
            setupReviewTotals();
            generateReviewRecommendations();
            setupReviewBreakdown($scope.submission);
        };

        // clones an entry with the given url and media type id and adds it to the entries with the new category ID
        // calls generateReviewData to recalculate prices and update recommendations
        $scope.addRecommendedCategory = function (piece, category, mobile) {
            if (piece.MediaTypePropertyCategoryID == category.MediaTypeID) {
                for (var pi = 0; pi < $scope.submission.Pieces.length; pi++) {
                    if (doPiecesMatch(piece, $scope.submission.Pieces[pi])) {
                        var newEntry = entryTemplate();
                        newEntry.EntryID = 0;
                        // set/update specifics
                        newEntry.PropertyCategoryID = category.PropertyCategoryID;
                        newEntry.Recommended = true;
                        newEntry.Price = $scope.getCategoryPrice(category.PropertyCategoryID);
                        newEntry.CategoryName = category.CategoryName || category.PropertyCategoryName;
                        $scope.submission.Pieces[pi].Entries.push(newEntry);
                        break;
                    }
                }
            } else {
                // find if useable piece exists
                var pieceFound = false;
                for (var pieceIndex = 0; pieceIndex < $scope.submission.Pieces.length; pieceIndex++) {
                    var tempPiece = $scope.submission.Pieces[pieceIndex];
                    var pieceURL = piece.Urls + piece.OriginalFileName + piece.MailItem;
                    var tempPieceURL = tempPiece.Urls + tempPiece.OriginalFileName + tempPiece.MailItem;
                    if (piece.EntryType == tempPiece.EntryType && tempPiece.MediaTypePropertyCategoryID == category.MediaTypeID && pieceURL == tempPieceURL && piece.IsCampaign == tempPiece.IsCampaign) {
                        for (var x = 0; x < $scope.submission.Pieces[pieceIndex].Entries.length; x++) {
                            if ($scope.submission.Pieces[pieceIndex].Entries[x].PropertyCategoryID == category.PropertyCategoryID) return;
                        }
                        var newEntry = entryTemplate();
                        newEntry.EntryID = 0;
                        // set/update specifics
                        newEntry.PropertyCategoryID = category.PropertyCategoryID;
                        newEntry.Recommended = true;
                        newEntry.Price = $scope.getCategoryPrice(category.PropertyCategoryID);
                        newEntry.CategoryName = category.CategoryName || category.PropertyCategoryName;
                        $scope.submission.Pieces[pieceIndex].Entries.push(newEntry);
                        pieceFound = true;
                        break;
                    }
                }
                if (!pieceFound) {
                    var newPiece = angular.copy(piece);
                    newPiece.PieceID = 0;
                    newPiece.MediaTypePropertyCategoryID = category.MediaTypeID;
                    newPiece.MediaTypeName = category.MediaTypeName;
                    if (mobile) {
                        newPiece.DeviceTypeID = 15; // mobile website
                    }
                    //clear client id
                    if (newPiece.Client) {
                        newPiece.Client.ClientID = 0;
                    }
                    //clear credit ids
                    if (newPiece.Credits.length > 0) {
                        for (var x = 0; x < newPiece.Credits.length; x++) {
                            newPiece.Credits[x].CreditID = 0;
                        }
                    }
                    var newEntry = entryTemplate();
                    newEntry.EntryID = 0;
                    // set/update specifics
                    newEntry.PropertyCategoryID = category.PropertyCategoryID;
                    newEntry.Recommended = true;
                    newEntry.Price = $scope.getCategoryPrice(category.PropertyCategoryID);
                    newEntry.CategoryName = category.CategoryName || category.PropertyCategoryName;
                    newPiece.Entries = [];
                    newPiece.Entries.push(newEntry);
                    newPiece.SubTotal = category.Price;

                    if (newPiece.IsCampaign && !category.ParentTypeIsCampaign) {
                        //remove campaign specific data
                        newPiece.UrlList = null;
                        newPiece.IsCampaign = false;
                    }

                    if (newPiece.IsSocial && category.ParentTypeIsCampaign && !newPiece.IsCampaign) {
                        newPiece.IsCampaign = true;
                    }
                    $scope.submission.Pieces.push(newPiece)
                }
            }
            displaySuccessAlertAddedCategory(piece);
            updateReviewData();
            // uncomment to make recommendations save submission when added.
            //$scope.submitSubmission('', true, true);
        };

        var displayTimer = null;

        function displaySuccessAlertAddedCategory(piece) {
            if (displayTimer) $timeout.cancel(displayTimer);

            piece.addedCategorySuccess = true;

            displayTimer = $timeout(function () {
                piece.addedCategorySuccess = false;
            }, 2000);
        }

        $scope.editPiece = function (piece) {
            // populate $scope.entry with appropriate data
            $scope.selectedEntries = [];
            for (var i = 0; i < piece.Entries.length; i++) {
                $scope.selectedEntries.push(piece.Entries[i].PropertyCategoryID);
            }

            for (var i = 0; i < $scope.mediaTypes.length; i++) {
                if ($scope.mediaTypes[i].PropertyCategoryDataID == piece.MediaTypePropertyCategoryID) {
                    $scope.mediaTypeSelected = $scope.mediaTypes[i];
                    i = $scope.mediaTypes.length;
                }
            }
            setCategoriesWithDeviceList();
            setCategoriesWithCustomFieldsList();
            setCategoriesWithDurationList();
            $scope.piece = piece;
            //selectCategoryGroup();
            try {
                var leadImageIndex = (piece && piece.FileList && piece.FileList.length > 0 ? _.findIndex(piece.FileList, function (f) {
                    return f.LeadImage;
                }) : null);
                $scope.piece.LeadImageIndex = $localStorage.piece.LeadImageIndex == 0 || leadImageIndex == 0 ? 0 : leadImageIndex || $localStorage.piece.LeadImageIndex || null;
            } catch (e) {

            }

            //adjusts $scope.selectedEntriesCustom - needs to be here so the $scope.mediaTypeSelected has been assigned
            setSelectedEntriesCustom($scope.selectedEntries);

            checkIfCampaignSetupNeeded(true);
            $state.go('enter.submit');
        }



        $scope.fillBillingWithContact = function (turnOn) {
            if (turnOn) {
                $scope.cart.BillingFirstName = $scope.submission.Contact.FirstName;
                $scope.cart.BillingLastName = $scope.submission.Contact.LastName;
                $scope.cart.BillingEmail = $scope.submission.Contact.Email;
                $scope.cart.BillingPhone = $scope.submission.Contact.Phone;
                $scope.cart.BillingAddress1 = $scope.submission.Contact.Address1;
                $scope.cart.BillingAddress2 = $scope.submission.Contact.Address2;
                $scope.cart.BillingCity = $scope.submission.Contact.City;
                $scope.cart.BillingCountry = $scope.submission.Contact.Country;
                $scope.cart.BillingState = $scope.submission.Contact.State;
                $scope.cart.BillingZip = $scope.submission.Contact.Zip;
            } else {
                $scope.cart.BillingFirstName = "";
                $scope.cart.BillingLastName = "";
                $scope.cart.BillingEmail = "";
                $scope.cart.BillingPhone = "";
                $scope.cart.BillingAddress1 = "";
                $scope.cart.BillingAddress2 = "";
                $scope.cart.BillingCity = "";
                $scope.cart.BillingCountry = "";
                $scope.cart.BillingState = "";
                $scope.cart.BillingZip = "";
            }
        }


        //save submission to server
        $scope.submitSubmission = function (nextStep, isValid, preventStateChange) {
            if (!isValid) {
                $scope.submitted = true;
                return;
            }

            if (nextStep === 'enter.client') {
                $analytics.eventTrack('Step 2 - Review - Completed');
                $analytics.eventTrack('AddToCart');
            }

            if (!sharedProperties.HasToken() && !sharedProperties.HasGuestToken()) {
                if (nextStep === 'enter.checkout') {
                    $scope.submitted = true;
                    return;
                }
                else if (nextStep === 'enter.review') {
                    attachCategoryNames();
                }
                if (!preventStateChange) {
                    $state.go(nextStep);
                }
                return;
            }

            if (nextStep === 'enter.select') {
                //scroll to top
                $('html, body').animate({
                    scrollTop: $("body").offset().top
                }, 1000);
            }

            $scope.submitted = false;

            //update for no on cfe poster
            if (!$scope.submission.ReceivedPoster && $scope.submission.Code) { $scope.submission.Code = ''; }

            entriesFactory.insertSubmission({ data: $scope.submission })
                .success(function (response) {
                    if (response.Success && response.Data.PricesHaveBeenChanged) {
                        getMediaTypes($scope.propertyId);
                    }
                    if (!response.Success) {
                        if (response.Message === "Email is already taken.") {
                            $state.go("enter.client").then(function () {
                                $scope.errorMessage = ["This email cannot be used. Please use a different email or login."];
                                sharedProperties.ShowThenHideArea("#errors");
                            });
                        }
                        else {
                            $scope.errorMessage = [response.Message || "Error saving information"];
                        }
                        sharedProperties.ShowThenHideArea("#errors");
                    }

                    var data = response.Data;
                    if (!data) {
                        //Deal with null response
                        $scope.status = "Error saving information";
                        return;
                    }
                    $scope.contact = $scope.submission.Contact;
                    $scope.submission = data;
                    $scope.submission.Contact = $scope.contact;
                    ////$scope.attachMediaTypes();
                    //console.log($scope.submission);
                    if (nextStep === 'enter.checkout') {

                        $scope.cart = $localStorage.cart || new cartTemplate();
                        //reset cart items list
                        $scope.cart.cartItems = [];
                        $scope.cart.PaymentTypeID = tempPaymentTypeID;
                        $scope.transaction = transactionTemplate();
                        var total = 0;
                        for (var pi = 0; pi < $scope.submission.Pieces.length; pi++) {
                            for (var index = 0; index < $scope.submission.Pieces[pi].Entries.length; index++) {
                                var item = cartItemTemplate();
                                item.EntryID = $scope.submission.Pieces[pi].Entries[index].EntryID;
                                item.UnitPrice = $scope.submission.Pieces[pi].Entries[index].Price;
                                item.Quantity = 1;
                                item.Price = $scope.submission.Pieces[pi].Entries[index].Price;
                                total += item.Price;
                                $scope.cart.cartItems.push(item);
                            }
                        }
                        $scope.cart.Total = $scope.cart.Subtotal = total;
                        $scope.cart.SubmissionID = $scope.submission.SubmissionID;
                        if ($scope.cart.BillingCountry != "") {
                            getStates($scope.cart.BillingCountry, "statesForBillingInfo");
                        }
                    }
                    if (!preventStateChange) {
                        $state.go(nextStep).then(function () {
                            setupWorldPayClient(nextStep);
                        });
                    }

                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        //World Pay related functions
        function isWorldPayProperty() {
            return sharedProperties.getProperty("propertyDetails").PropertyID == 3;
        }

        function isWorldPayValid() {
            if (isWorldPayProperty() && $scope.cart.PaymentTypeID == 1) {
                return $scope.transaction.Token ? true : false;
            }
            return true;
        }

        function setupWorldPayClient(nextStep) {
            if (nextStep === 'enter.checkout' && isWorldPayProperty() && $scope.cart.PaymentTypeID == 1) {
                var form = document.getElementById('checkoutForm');
                if (Worldpay.helpers && Worldpay.helpers.templateFormCallback) {
                    Worldpay.helpers.templateFormCallback = function (a, b, c) {
                    };
                }
                Worldpay.useOwnForm({
                    'clientKey': appSettings.WPClientKey,
                    'form': form,
                    'callback': function (status, response) {
                        if (response.error && response.error.message) {
                            SweetAlert.swal({
                                title: response.error.message || "Error processing your payment.",
                                type: "warning",
                                showCancelButton: false,
                                killButtonColor: true,
                                confirmButtonClass: "btn btn-primary",
                                cancelButtonClass: "btn btn-secondary",
                                confirmButtonText: "Ok",
                                closeOnConfirm: true,
                                iconHTML: "<i class='material-icons md-48 md-secondary'>info_outline</i>"
                            },
                            function (isConfirm) {
                                if (isConfirm) {

                                }
                            });
                            $scope.preventOrderSubmit = false;
                        } else if (!response.error) {
                            var checkoutFormController = angular.element("[name='checkoutForm']").controller("form");
                            if (checkoutFormController){
                                $scope.transaction.Token = response.token;
                                Worldpay.formBuilder(form, 'input', 'hidden', 'token', $scope.transaction.Token);
                                $scope.submitCart(checkoutFormController.$valid);
                            }
                            else {
                                SweetAlert.swal({
                                    title: "Error processing your payment.",
                                    type: "warning",
                                    showCancelButton: false,
                                    killButtonColor: true,
                                    confirmButtonClass: "btn btn-primary",
                                    cancelButtonClass: "btn btn-secondary",
                                    confirmButtonText: "Ok",
                                    closeOnConfirm: true,
                                    iconHTML: "<i class='material-icons md-48 md-secondary'>info_outline</i>"
                                },
                            function (isConfirm) {
                                if (isConfirm) {

                                }
                            });
                                $scope.preventOrderSubmit = false;
                            }
                        }
                    }
                });
            }
        }

        $scope.toggleSubscriptionSelection = function (id, event) {
            var index = $.inArray(id, $scope.selectedSubscriptions);
            if (index > -1) {
                $scope.selectedSubscriptions.splice(index, 1);
            } else {
                $scope.selectedSubscriptions.push(id);
            }
            sharedProperties.SubscriptionSet(id, event.target.checked);
        };

        $scope.subscriptionChecked = function (id) {
            return sharedProperties.SubscriptionChecked(id);
        };

        $scope.hasVatChange = function () {
            if (!$scope.cart.HasVatNumber) {
                $scope.cart.VatNumber = "";
            }
        };

        $scope.calcVat = function () {
            $scope.cart.ShippingCountry = $scope.submission.Contact.Country;
            $scope.cart.BillingCountry = $scope.submission.Contact.Country;
            orderFactory.calcVat($scope.cart)
            .success(function (res) {
                if (res == null) {

                    SweetAlert.swal({
                        title: "Error calculating VAT. Ensure all fields are correct.",
                        type: "warning",
                        showCancelButton: false,
                        killButtonColor: true,
                        confirmButtonClass: "btn btn-primary",
                        cancelButtonClass: "btn btn-secondary",
                        confirmButtonText: "Ok",
                        closeOnConfirm: true,
                        iconHTML: "<i class='material-icons md-48 md-secondary'>info_outline</i>"
                    },
                    function (isConfirm) {
                        if (isConfirm) {

                        }
                    });
                    return;
                }
                else if (!res.Success) {
                    SweetAlert.swal({
                        title: res.Errors || "Error calculating VAT. Ensure all fields are correct.",
                        type: "warning",
                        showCancelButton: false,
                        killButtonColor: true,
                        confirmButtonClass: "btn btn-primary",
                        cancelButtonClass: "btn btn-secondary",
                        confirmButtonText: "Ok",
                        closeOnConfirm: true,
                        iconHTML: "<i class='material-icons md-48 md-secondary'>info_outline</i>"
                    },
                    function (isConfirm) {
                        if (isConfirm) {

                        }
                    });

                    return;
                }
                $scope.vatAmount = res.Data.VatAmount;
                setupReviewTotals();
                $scope.vatDirty = false;
            })
            .error(function (error) {
                //$scope.submitStatus = _.get(error, 'message', 'There was an error processing the request.  Please try again');
                //setTimeout(function () {
                //    $('html, body').animate({
                //        scrollTop: $(".has-error:visible:first").offset() ? $(".has-error:visible:first").offset().top - 50 : 0
                //    }, 1000);
                //}, 150);
                $scope.vatDirty = true;
                $scope.status = error;
            });
        };

        $scope.submitCart = function (isValid) {
            if (!isWorldPayValid())
                return;
            $scope.orderHasMailItems = false;
            $scope.orderHasUploadLaterItems = false;
            $scope.checkoutFileDownloadError = '';
            $scope.submitted = true;
            if (isValid && !$scope.preventOrderSubmit) {
                $analytics.eventTrack('Step 4 - Checkout - Completed');
                if (twttr && twttr.conversion) {
                    twttr.conversion.trackPid('o4tcs', { tw_sale_amount: 0, tw_order_quantity: 0 });
                }
                $scope.preventOrderSubmit = true;
                $scope.submitted = false;
                if ($scope.selectedSubscriptions.length > 0) {
                    $scope.cart.SubscriptionEmail = $scope.contact.Email;
                    $scope.cart.SubscriptionIDs = $scope.selectedSubscriptions;
                }
                else {
                    $scope.cart.SubscriptionEmail = null;
                    $scope.cart.SubscriptionIDs = [];
                }
                if ($scope.transaction.Token) {
                    $scope.transaction.CardholderNumber = null;
                    $scope.transaction.CVV = null;
                }
                orderFactory.submitCart($scope.cart, $scope.transaction)
                    .success(function (data) {
                        if (data == null) {
                            $scope.transaction.Token = null;
                            SweetAlert.swal({
                                title: "Error processing your payment.",
                                type: "warning",
                                showCancelButton: false,
                                killButtonColor: true,
                                confirmButtonClass: "btn btn-primary",
                                cancelButtonClass: "btn btn-secondary",
                                confirmButtonText: "Ok",
                                closeOnConfirm: true,
                                iconHTML: "<i class='material-icons md-48 md-secondary'>info_outline</i>"
                            },
                            function (isConfirm) {
                                if (isConfirm) {

                                }
                            });
                            $scope.preventOrderSubmit = false;
                            return;
                        }
                        else if (!data.Success) {
                            $scope.transaction.Token = null;
                            SweetAlert.swal({
                                title: data.Errors || "Error processing your payment.",
                                type: "warning",
                                showCancelButton: false,
                                killButtonColor: true,
                                confirmButtonClass: "btn btn-primary",
                                cancelButtonClass: "btn btn-secondary",
                                confirmButtonText: "Ok",
                                closeOnConfirm: true,
                                iconHTML: "<i class='material-icons md-48 md-secondary'>info_outline</i>"
                            },
                            function (isConfirm) {
                                if (isConfirm) {

                                }
                            });
                            $scope.preventOrderSubmit = false;
                            return;
                        }
                        $scope.order = data.Data;
                        $scope.entryComplete = true;

                        $state.go('enter.checkoutfinalize').then(function () {
                            try {
                                // begin analytics ecommerce
                                var lowerCasedProductsObject = [];

                                _.each($scope.order.OrderItems, function (v, k) {
                                    var item;

                                    item = _.pick($scope.order.OrderItems[k], ['Price', 'Quantity', 'Name', 'EntryID']);
                                    item = _.transform(item, function (result, val, key) {
                                        result[key.toLowerCase()] = val;
                                    });

                                    item.category = 'Entries'
                                    item.id = $scope.order.Confirmation;
                                    item.sku = item.entryid;

                                    var pieceContainerOfEntry = _.find($scope.submission.Pieces, _.flow(
                                        _.property('Entries'),
                                        _.partialRight(_.some, { EntryID: item.entryid })
                                    ));
                                    if (pieceContainerOfEntry) {
                                        var submissionEntry = _.find(pieceContainerOfEntry.Entries, { EntryID: item.entryid });
                                    }
                                    if (item.name == null) {
                                        item.name = pieceContainerOfEntry.MediaTypeName && submissionEntry.PropertyCategoryName ? (pieceContainerOfEntry.MediaTypeName + ' - ' + submissionEntry.PropertyCategoryName) : pieceContainerOfEntry.MediaTypeName && submissionEntry.CategoryName ? (pieceContainerOfEntry.MediaTypeName + ' - ' + submissionEntry.CategoryName) : 'Entries Category Order Item #' + k;
                                    }

                                    lowerCasedProductsObject.push(item);
                                });


                                // Send eCommerce transaction to Google Analytics
                                $analytics.transactionTrack({
                                    'id': _.get($scope.order, 'Confirmation', null),
                                    'revenue': _.get($scope.order, 'Total', null),
                                    'tax': $scope.vatAmount,
                                    'products': lowerCasedProductsObject
                                });

                                // end analytics ecommerce
                            } catch (e) {

                            }

                            attachCategoryNames();
                            setupReviewTotals();
                            setupReviewBreakdown($scope.submission);
                            $localStorage.$reset(defaultsForSuccess);
                            $scope.submission = new defaultSubmission();
                            $scope.entryComplete = true;

                            // code

                        });
                        $('html, body').animate({
                            scrollTop: $("body").offset().top
                        }, 1000);

                        var hasMailItems = false;
                        for (var index = $scope.submission.Pieces.length - 1; index >= 0 ; index--) {
                            if ($scope.submission.Pieces[index].EntryType == 'Mail') {
                                $scope.orderHasMailItems = true;
                                break;
                            }
                            if ($scope.submission.Pieces[index].EntryType == 'UploadLater') {
                                $scope.orderHasUploadLaterItems = true;
                                break;
                            }
                        }

                    })
                    .error(function (error) {
                        //TODO: SHOW ERROR MESSAGE;
                        $scope.transaction.Token = null;
                        $scope.preventOrderSubmit = false;
                    });
            } else {
                $scope.preventOrderSubmit = false;
                setTimeout(function () {
                    $('html, body').animate({
                        scrollTop: $(".has-error:visible:first").offset().top - 50
                    }, 1000);
                }, 150);
            }
        };

        $scope.submitClientInfoAndPayment = function (isValid, paymentTypeID, paymentTitle) {
            if (!isValid) {
                $scope.submitted = true;
                setTimeout(function () {
                    $('html, body').animate({
                        scrollTop: $(".has-error:visible:first").offset().top - 50
                    }, 1000);
                }, 150);
                return
            }
            if (!sharedProperties.HasToken() && !sharedProperties.HasGuestToken()) {
                if ($scope.loginMode === 5) {
                    saveNewUserMode5(isValid, paymentTypeID, paymentTitle);
                }
                else if ([1, 3].indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1) {
                    saveNewUser(isValid, paymentTypeID, paymentTitle);
                }
            } else {
                proceedToCheckout(isValid, paymentTypeID, paymentTitle);
            }
        }

        var proceedToCheckout = function (isValid, paymentTypeID, paymentTitle) {
            tempPaymentTypeID = paymentTypeID;
            $scope.nextStep('enter.checkout', isValid)
            if (isValid) {
                $analytics.eventTrack('Step 3 - Client Info - Completed');
                $analytics.eventTrack('InitiateCheckout');
            };
            $scope.paymentTitle = paymentTitle;
        }

        var saveNewUserMode5 = function (isValid, paymentTypeID, paymentTitle) {
            $scope.errorMessage = [];

            if ($scope.loginMode !== 5) { return; }

            var params = {
                FirstName: $scope.submission.Contact.FirstName,
                LastName: $scope.submission.Contact.LastName,
                Email: $scope.submission.Contact.Email,
                Password: $scope.submitNewUser.Password,
                ConfirmPassword: $scope.submitNewUser.PasswordConfirm,
                PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID,
                ProvidedConsent: $scope.submission.Contact.ProvidedConsent
            };

            userFactory.insertUser(params)// register user from contact info
                .success(function () {
                    //login the user
                    userFactory.login(params.Email, params.Password, params.PropertyID)
                        .success(function (data) {
                            $scope.submitNewUser = {};
                            sharedProperties.SetToken(data.access_token, false);
                            proceedToCheckout(isValid, paymentTypeID, paymentTitle);
                        })
                        .error(function (error) {
                            $scope.errorMessage = error;
                        });
                })
                .error(function (error) {
                    if (error.ModelState[""].length == 1 && error.ModelState[""][0] == 'Name ' + params.Email.toLowerCase() + ' is already taken.') {
                        error.ModelState[""][0] = error.ModelState[""][0] + " Login using that email or choose a different email.";
                    }
                    $scope.errorMessage = error.ModelState[""];
                    sharedProperties.ShowThenHideArea("#errors");
                });
        };

        var saveNewUser = function (isValid, paymentTypeID, paymentTitle) {
            if (sharedProperties.getProperty("propertyDetails").PropertyID != 1 && sharedProperties.getProperty("propertyDetails").PropertyID != 3)
                return;
            var params = {
                FirstName: $scope.submission.Contact.FirstName,
                LastName: $scope.submission.Contact.LastName,
                Email: $scope.submission.Contact.Email,
                Password: 'TempPassword1!',
                ConfirmPassword: 'TempPassword1!',
                PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID,
                Guest: true,
                ProvidedConsent: $scope.submission.Contact.ProvidedConsent
            };

            userFactory.insertUser(params)// register user from contact info
                .success(function () {
                    //login the user
                    userFactory.login(params.Email, params.Password, params.PropertyID)
                        .success(function (data) {
                            sharedProperties.SetToken(data.access_token, true);//set guest login token
                            proceedToCheckout(isValid, paymentTypeID, paymentTitle);
                        })
                        .error(function (error) {
                            $scope.statusRegistration = error;
                        });
                })
                .error(function (error) {
                    if (error.ModelState[""].length == 1 && error.ModelState[""][0] == 'Name ' + params.Email.toLowerCase() + ' is already taken.') {// login the user but save the token someplace else
                        userFactory.login(params.Email, sharedProperties.getProperty("propertyDetails").GuestCode, params.PropertyID)
                           .success(function (data) {
                               sharedProperties.SetToken(data.access_token, true);
                               proceedToCheckout(isValid, paymentTypeID, paymentTitle);
                           })
                           .error(function (error) {
                               $scope.errorMessage = ["This email cannot be used."];
                               sharedProperties.ShowThenHideArea("#errors");
                               $scope.statusRegistration = error;
                           });
                    } else {
                        $scope.statusRegistration = error.ModelState[""];
                    }
                });
        };

        $scope.clearSubmissionLength = function () {
            $scope.piece.PieceLengthID = null;
        };

        // removes an entry from the piece
        // calls generateReviewData to recalculate prices and update recommendations
        $scope.removeEntryFromPiece = function (categoryID, piece) {
            SweetAlert.swal({
                title: "Do you want to remove this item?",
                type: "warning",
                showCancelButton: true,
                killButtonColor: true,
                confirmButtonClass: "btn btn-primary",
                cancelButtonClass: "btn btn-secondary",
                confirmButtonText: "Remove",
                closeOnConfirm: true,
                iconHTML: "<i class='material-icons md-48 md-secondary'>help_outline</i>"
            },
            function (isConfirm) {
                if (isConfirm) {
                    for (var index = $scope.submission.Pieces.length - 1; index >= 0; index--) {
                        if (doPiecesMatch(piece, $scope.submission.Pieces[index])) {
                            //find entries with category ID
                            for (var ei = $scope.submission.Pieces[index].Entries.length - 1; ei >= 0; ei--) {
                                if ($scope.submission.Pieces[index].Entries[ei].PropertyCategoryID == categoryID) {
                                    $scope.submission.Pieces[index].Entries.splice(ei, 1);
                                }
                            }
                            if ($scope.submission.Pieces[index].Entries.length == 0) {
                                $scope.submission.Pieces.splice(index, 1);
                            }
                        }
                    }

                    updateReviewData();
                }
            });
        };


        $scope.removePiece = function (piece) {
            SweetAlert.swal({
                title: "Do you want to remove this item?",
                type: "warning",
                showCancelButton: true,
                killButtonColor: true,
                confirmButtonClass: "btn btn-primary",
                cancelButtonClass: "btn btn-secondary",
                confirmButtonText: "Remove",
                closeOnConfirm: true,
                iconHTML: "<i class='material-icons md-48 md-secondary'>help_outline</i>"
            },
            function (isConfirm) {
                if (isConfirm) {
                    for (var index = $scope.submission.Pieces.length - 1; index >= 0; index--) {
                        if (doPiecesMatch(piece, $scope.submission.Pieces[index])) {
                            $scope.submission.Pieces.splice(index, 1);
                        }
                    }
                    $scope.submitSubmission('enter.review', true);
                    updateReviewData();
                }
            });
        };


        $scope.showPhoneLink = function () {
            return ($scope.propertyId && $scope.propertyId > 0 && $scope.propertyId != 3);
        };

        $scope.downloadInvoice = function (orderID) {
            downloadFile(orderID, "invoice-" + orderID + ".pdf", pdfFactory.getInvoice)
        };
        $scope.downloadPackingLabel = function (orderID) {
            downloadFile(orderID, "packinglabel-" + orderID + ".pdf", pdfFactory.getPackingLabel)
        };
        $scope.downloadShippingLabel = function (orderID) {
            downloadFile(orderID, "shippinglabel-" + orderID + ".pdf", pdfFactory.getShippingLabel)
        };



        //FROM: http://stackoverflow.com/questions/24080018/download-file-from-an-asp-net-web-api-method-using-angularjs
        // Based on an implementation here: web.student.tuwien.ac.at/~e0427417/jsdownload.html
        var downloadFile = function (orderID, specificFileName, specificFunction) {
            $scope.checkoutFileDownloadError = "";
            var debug = false;
            // Use an arraybuffer
            specificFunction(orderID)
            .success(function (data, status, headers) {
                var octetStreamMime = 'application/octet-stream';
                var success = false;
                //Get the headers
                headers = headers();

                // Get the filename from the x-filename header or default to "download.pdf"
                var filename = specificFileName || headers['x-filename'] || 'download.pdf';

                // Determine the content type from the header or default to "application/octet-stream"
                var contentType = headers['content-type'] || octetStreamMime;

                try {
                    // Try using msSaveBlob if supported
                    if (debug) console.log("Trying saveBlob method ...");
                    var blob = new Blob([data], { type: contentType });
                    if (navigator.msSaveBlob)
                        navigator.msSaveBlob(blob, filename);
                    else {
                        // Try using other saveBlob implementations, if available
                        var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
                        if (saveBlob === undefined) throw "Not supported";
                        saveBlob(blob, filename);
                    }
                    if (debug) console.log("saveBlob succeeded");
                    success = true;
                } catch (ex) {
                    if (debug) console.log("saveBlob method failed with the following exception:");
                    if (debug) console.log(ex);
                }

                if (!success) {
                    // Get the blob url creator
                    var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
                    if (urlCreator) {
                        // Try to use a download link
                        var link = document.createElement('a');
                        if ('download' in link) {
                            // Try to simulate a click
                            try {
                                // Prepare a blob URL
                                if (debug) console.log("Trying download link method with simulated click ...");
                                var blob = new Blob([data], { type: contentType });
                                var url = urlCreator.createObjectURL(blob);
                                link.setAttribute('href', url);

                                // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
                                link.setAttribute("download", filename);

                                // Simulate clicking the download link
                                var event = document.createEvent('MouseEvents');
                                event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                                link.dispatchEvent(event);
                                if (debug) console.log("Download link method with simulated click succeeded");
                                success = true;

                            } catch (ex) {
                                if (debug) console.log("Download link method with simulated click failed with the following exception:");
                                if (debug) console.log(ex);
                            }
                        }

                        if (!success) {
                            // Fallback to window.location method
                            try {
                                // Prepare a blob URL
                                // Use application/octet-stream when using window.location to force download
                                if (debug) console.log("Trying download link method with window.location ...");
                                var blob = new Blob([data], { type: octetStreamMime });
                                var url = urlCreator.createObjectURL(blob);
                                window.location = url;
                                if (debug) console.log("Download link method with window.location succeeded");
                                success = true;
                            } catch (ex) {
                                if (debug) console.log("Download link method with window.location failed with the following exception:");
                                if (debug) console.log(ex);
                            }
                        }

                    }
                }

                if (!success) {
                    // Fallback to window.open method
                    if (debug) console.log("No methods worked for saving the arraybuffer, using last resort window.open");
                    window.open(httpPath, '_blank', '');
                }
            })
            .error(function (data, status) {
                if (debug) console.log("Request failed with status: " + status);

                // Optionally write the error out to scope
                $scope.checkoutFileDownloadError = "Unable to download file.";
            });
        };

        var initTwitter = function () {
            $window.twttr = (function (d, s, id) {
                var js, fjs = d.getElementsByTagName(s)[0],
                  t = $window.twttr || {};
                if (d.getElementById(id)) return t;
                js = d.createElement(s);
                js.id = id;
                js.src = "https://platform.twitter.com/widgets.js";
                fjs.parentNode.insertBefore(js, fjs);

                t._e = [];
                t.ready = function (f) {
                    t._e.push(f);
                };

                return t;
            }(document, "script", "twitter-wjs"));

            // Wait for the asynchronous resources to load
            $window.twttr.ready(function (twttr) {
                // Now bind our custom intent events
                twttr.events.bind('tweet', function (event) {
                    // Do something there
                    $analytics.eventTrack('Step 5 - Tweeted Entry');
                    $analytics.eventTrack('Step 5 - Twitter Step - Completed');
                    $state.go('enter.success');
                });
            });
        };

        var setupTwitterButton = function (url, msg, containerElementId) {
            $window.twttr.ready(function (twttr) {
                twttr.widgets.createShareButton(
                    ' ',
                    document.getElementById(containerElementId),
                    {
                        text: msg,
                        size: 'large'
                    }
                );
            });
        };

        var defaultTransaction = {
            CardholderName: "",
            CardholderNumber: "",
            ExpirationMonth: "",
            ExpirationYear: "",
            CVV: "",
            VATID: ""
        };

        var defaultSubmission = function () {
            return {
                SubmissionID: 0,
                PropertyID: propertyID,
                SeasonID: null,
                UserID: 1,
                VideoPremierUrl: "",
                notes: "",
                Code: "",
                Platform: "",
                Description: "",
                Tags: "",
                Slug: "",
                Uuid: "",
                LanguageID: 1,
                Contact: null,
                Pieces: []
            };
        };

        var defaultsForSuccess = {
            submission: new defaultSubmission(),
            piece: new pieceTemplate(),
            mediaTypeSelected: null,
            selectedEntries: [],
            selectedEntriesCustom: [],
            transaction: defaultTransaction,
            cart: new cartTemplate(),
            entryComplete: true,
            statesForClient: [],
            statesForContact: [],
            statesForBillingInfo: [],
            mediaTypes: null,
            showStateSelector: false,
            showStateFreeText: false,
            currentTimesEntered: 0,
            paymentTitle: "",
            SeasonID: null,
            countries: [],
            siteUtmInfo: $localStorage.siteUtmInfo
        };

        var defaultLocal = {
            submission: new defaultSubmission(),
            piece: new pieceTemplate(),
            mediaTypeSelected: null,
            selectedEntries: [],
            selectedEntriesCustom: [],
            transaction: defaultTransaction,
            cart: new cartTemplate(),
            entryComplete: false,
            statesForClient: [],
            statesForContact: [],
            statesForBillingInfo: [],
            mediaTypes: null,
            showStateSelector: false,
            showStateFreeText: false,
            currentTimesEntered: 0,
            paymentTitle: "",
            SeasonID: null,
            countries: [],
            categoriesWithDeviceList: [],
            categoriesWithCustomFieldsList: [],
            categoriesWithDurationList: [],
            categoriesWithAddtnlCustomFieldsList: [],
            customFieldSelected: { Status: false },
            deviceCategorySelected: { Status: false },
            durationCategorySelected: { Status: false },
            siteUtmInfo: $localStorage.siteUtmInfo
        };

        // setup local persistant storage
        $scope.submission = $localStorage.submission || new defaultSubmission();
        $scope.piece = $localStorage.piece || new pieceTemplate();
        $scope.mediaTypeSelected = $localStorage.mediaTypeSelected || null;
        $scope.selectedEntries = $localStorage.selectedEntries || [];
        $scope.selectedEntriesCustom = $localStorage.selectedEntriesCustom || {};
        $scope.transaction = defaultTransaction;
        if ($scope.submission && $scope.submission.Pieces.length > 0) {
            $scope.reviewData = setupReviewBreakdown($scope.submission)
        } else {
            $scope.reviewData = {};
        }
        $scope.cart = $localStorage.cart || new cartTemplate();
        $scope.entryComplete = $localStorage.entryComplete || false;
        $scope.statesForClient = $localStorage.statesForClient || [];
        $scope.statesForContact = $localStorage.statesForContact || [];
        $scope.statesForBillingInfo = $localStorage.statesForBillingInfo || [];
        $scope.showStateSelector = $localStorage.showStateSelector || false;
        $scope.currentTimesEntered = $localStorage.currentTimesEntered || 0;
        $scope.paymentTitle = $localStorage.paymentTitle || "";
        $scope.SeasonID = $localStorage.SeasonID || null;
        $scope.mediaTypes = $localStorage.mediaTypes;
        $scope.countries = $localStorage.countries;

        $scope.categoriesWithDeviceList = $localStorage.categoriesWithDeviceList || [];
        $scope.categoriesWithDurationList = $localStorage.categoriesWithDurationList || [];
        $scope.deviceCategorySelected = $localStorage.deviceCategorySelected || { Status: false };
        $scope.durationCategorySelected = $localStorage.durationCategorySelected || { Status: false };
        $scope.categoriesWithCustomFieldsList = $localStorage.categoriesWithCustomFieldsList || [];
        $scope.categoriesWithAddtnlCustomFieldsList = $localStorage.categoriesWithAddtnlCustomFieldsList || [];
        $scope.customFieldSelected = $localStorage.customFieldSelected || { Status: false };

        if ($scope.piece && $scope.propertyId == 7) {
            try {
                if ($localStorage.piece) {
                    $scope.piece.LeadImageIndex = $localStorage.piece.LeadImageIndex == 0 ? 0 : $localStorage.piece.LeadImageIndex || null;
                } else {
                    $scope.piece.LeadImageIndex = null;
                }
            } catch (e) {
                $localStorage.$reset(defaultLocal);
            }
            $scope.$watch('piece.APlusProjectStatusID', function (newData, oldData) {
                if (newData != null && oldData !== newData && oldData !== undefined) {
                    $scope.selectedEntries = [];
                }
            });
        }

        $scope.$watch('deviceCategorySelected', function () {
            $localStorage.deviceCategorySelected = $scope.deviceCategorySelected;
        });

        $scope.$watch('durationCategorySelected', function () {
            $localStorage.durationCategorySelected = $scope.durationCategorySelected;
        });

        $scope.$watch('categoriesWithDeviceList', function () {
            $localStorage.categoriesWithDeviceList = $scope.categoriesWithDeviceList;
        });

        $scope.$watch('categoriesWithDurationList', function () {
            $localStorage.categoriesWithDurationList = $scope.categoriesWithDurationList;
        });

        $scope.$watch('categoriesWithCustomFieldsList', function () {
            $localStorage.categoriesWithCustomFieldsList = $scope.categoriesWithCustomFieldsList;
        });

        $scope.$watch('categoriesWithAddtnlCustomFieldsList', function () {
            $localStorage.categoriesWithAddtnlCustomFieldsList = $scope.categoriesWithAddtnlCustomFieldsList;
        });

        $scope.$watch('customFieldSelected', function () {
            $localStorage.customFieldSelected = $scope.customFieldSelected;
        });

        $scope.$watch('addtnlCustomFieldSelected', function () {
            $localStorage.addtnlCustomFieldSelected = $scope.addtnlCustomFieldSelected;
        });
        
        $scope.$watch('countries', function () {
            $localStorage.countries = $scope.countries;
        });

        $scope.$watch('submission', function () {
            if ($state.current.name === "enter.checkoutfinalize" || $state.current.name === "enter.success") {
                return;
            }
            $localStorage.submission = $scope.submission;
        });

        $scope.$watch('piece', function () {
            $localStorage.piece = $scope.piece;
        });

        $scope.$watch('mediaTypeSelected', function () {
            $localStorage.mediaTypeSelected = $scope.mediaTypeSelected;
            var companySizeTooltip = "<div class='text-left'>" + ($scope.mediaTypeSelected && $scope.mediaTypeSelected.Name == "Product" ? "Please select the number of employees who work for the entering brand." : "Please select the number of employees working in the entering firm.") + "</div>";
            $scope.companySizeTooltip = $sce.trustAsHtml(companySizeTooltip);
        });

        $scope.$watch('selectedEntries', function () {
            $localStorage.selectedEntries = $scope.selectedEntries;
        });

        $scope.$watch('selectedEntriesCustom', function () {
            $localStorage.selectedEntriesCustom = $scope.selectedEntriesCustom;
        });

        $scope.$watch('selectedEntriesCustom.individual', function () {
            $localStorage.selectedEntriesCustom.individual = $scope.selectedEntriesCustom.individual;
        });

        $scope.$watch('selectedEntriesCustom.campaign', function () {
            $localStorage.selectedEntriesCustom.campaign = $scope.selectedEntriesCustom.campaign;
        });

        $scope.$watch('selectedEntriesCustom.shared', function () {
            $localStorage.selectedEntriesCustom.shared = $scope.selectedEntriesCustom.shared;
        });

        $scope.$watch('reviewData', function () {
            $localStorage.reviewData = $scope.reviewData;
        });

        $scope.$watch('cart', function () {
            $localStorage.cart = $scope.cart;
        });

        $scope.$watch('entryComplete', function () {
            $localStorage.entryComplete = $scope.entryComplete;
        });

        $scope.$watch('statesForClient', function () {
            $localStorage.statesForClient = $scope.statesForClient;
        });

        $scope.$watch('statesForContact', function () {
            $localStorage.statesForContact = $scope.statesForContact;
        });

        $scope.$watch('statesForBillingInfo', function () {
            $localStorage.statesForBillingInfo = $scope.statesForBillingInfo;
        });

        $scope.$watch('showStateSelector', function () {
            $localStorage.showStateSelector = $scope.showStateSelector;
        });

        $scope.$watch('currentTimesEntered', function () {
            $localStorage.currentTimesEntered = $scope.currentTimesEntered;
        });

        $scope.$watch('paymentTitle', function () {
            $localStorage.paymentTitle = $scope.paymentTitle;
        });

        $scope.$watch('SeasonID', function () {
            $localStorage.SeasonID = $scope.SeasonID;
        });

        $scope.$watch('mediaTypes', function () {
            $localStorage.mediaTypes = $scope.mediaTypes;
        });

        if ($scope.cart) {
            // not localstorage
            $scope.$watch('cart.BillingCountry', function (newData, oldData) {
                if ((newData && oldData !== newData) && !$scope.cart.useContactInfo) {
                    $scope.cart.BillingState = "";
                }
                getStates(newData, 'statesForBillingInfo', function () {
                    if ($scope.statesForBillingInfo) {
                        var setStateDefault = true;
                        _.find($scope.statesForBillingInfo, function (e) {
                            if (e.Abbrev === $scope.cart.BillingState) {
                                setStateDefault = false;
                            }
                        });
                        if (setStateDefault) {
                            $scope.cart.BillingState = "";
                        }
                    }
                });
            });
        }

        $scope.$watch(function () {
            return angular.toJson($localStorage);
        }, function () {
            if ($state.current.name !== "enter.checkoutfinalize" && $state.current.name !== "enter.success") {
                $scope.submission = $localStorage.submission || new defaultSubmission();
            }
            $scope.piece = $localStorage.piece || new pieceTemplate();
            $scope.mediaTypeSelected = $localStorage.mediaTypeSelected || null;
            $scope.selectedEntries = $localStorage.selectedEntries || [];
            $scope.selectedEntriesCustom = $localStorage.selectedEntriesCustom || {};
            $scope.cart = $localStorage.cart || new cartTemplate();
            $scope.entryComplete = $localStorage.entryComplete || false;
            $scope.statesForClient = $localStorage.statesForClient || [];
            $scope.statesForContact = $localStorage.statesForContact || [];
            $scope.statesForBillingInfo = $localStorage.statesForBillingInfo || [];
            $scope.showStateSelector = $localStorage.showStateSelector || false;
            $scope.currentTimesEntered = $localStorage.currentTimesEntered || 0;
            $scope.paymentTitle = $localStorage.paymentTitle || "";
            $scope.SeasonID = $localStorage.SeasonID || null;
            $scope.mediaTypes = $localStorage.mediaTypes;
            if (!$scope.mediaTypes) getMediaTypes($scope.propertyId);
            $scope.countries = $localStorage.countries;
            if (!$scope.countries || $scope.countries.length == 0) {
                getCountries();
            }
            $scope.customFieldSelected = $localStorage.customFieldSelected || { Status: false };
            $scope.categoriesWithDeviceList = $localStorage.categoriesWithDeviceList || [];
            $scope.categoriesWithDurationList = $localStorage.categoriesWithDurationList || [];
            $scope.deviceCategorySelected = $localStorage.deviceCategorySelected || { Status: false };
            $scope.durationCategorySelected = $localStorage.durationCategorySelected || { Status: false };
            $scope.categoriesWithCustomFieldsList = $localStorage.categoriesWithCustomFieldsList || [];
            $scope.categoriesWithAddtnlCustomFieldsList = $localStorage.categoriesWithAddtnlCustomFieldsList || [];
        });


        var getWelcomeData = function () {
            if (sharedProperties.HasToken() || sharedProperties.HasGuestToken()) {
                entriesFactory.getWelcomeData($scope.propertyId).success(function (successData) {
                    $scope.WelcomeData = {};

                    if (successData) {
                        if (successData.Success) {
                            $scope.WelcomeData.CountSaved = successData.Data.CountSaved;
                            $scope.WelcomeData.CountSavedEntries = successData.Data.CountSavedEntries;
                            $scope.WelcomeData.Name = successData.Data.Entrant.FirstName;
                        }
                        else if (successData.Message == 'NO USER') {
                            //logout
                            $scope.baseLogOut();
                        }
                        else {
                            //???
                        }
                    }
                    else {
                        //TODO: Hide Message!?!
                    }
                })
                .error(function (error, status) {
                    if ((status && status == 401) || (error.Message && error.Message == "Authorization has been denied for this request.")) {
                        $scope.baseLogOut();
                    }
                    $scope.status = error;
                    console.error(error);
                });
            }
        };

        $scope.toggleLanguageSelection = function toggleLanguageSelection(lang) {
            if (!$scope.piece.LangList) $scope.piece.LangList = [];
            var idx = $scope.piece.LangList.indexOf(lang);

            // Is currently selected
            if (idx > -1) {
                $scope.piece.LangList.splice(idx, 1);
            }

                // Is newly selected
            else {
                $scope.piece.LangList.push( parseInt(lang));
            }
        };

        $scope.getAPlusDeadlineYear = function () {
            return (new Date()).getFullYear() - 2;
        };

        $scope.aPlusBuildDeadlineTooltip = $sce.trustAsHtml("Products introduced prior to January 1, " + $scope.getAPlusDeadlineYear() + " will be entered into the Foundation Categories--trusted products already in-use in building projects. <br /> <br /> Products introduced after January 1, " + $scope.getAPlusDeadlineYear() + " will be entered into the Innovation Categories--new products that have recently become available to market and may not yet be in-use.");

        $scope.categoryTypeUpdate = function () {
            if ($scope.mediaTypeSelected.CategoryGroups && $scope.mediaTypeSelected.CategoryGroups.length > 0) {
                $scope.selectedEntries = [];
                selectCategoryGroup();
            }
        };

        function selectCategoryGroup() {
            if ($scope.mediaTypeSelected && $scope.mediaTypeSelected.CategoryGroups && $scope.mediaTypeSelected.CategoryGroups.length > 0) {
                if ($scope.piece.APlusIsBeforeDeadline) {
                    $scope.selectedCategoryGroup = _.find($scope.mediaTypeSelected.CategoryGroups, function (cg) {
                        return cg.id === 1;
                    });
                }
                else if (!$scope.piece.APlusIsBeforeDeadline) {
                    $scope.selectedCategoryGroup = _.find($scope.mediaTypeSelected.CategoryGroups, function (cg) {
                        return cg.id === 2;
                    });
                }
            }
        }

        /* Start it off */
        getMediaTypes($scope.propertyId);
        getCountries();
        initTwitter();
        getWelcomeData();
        getPieceLengths();
        getPieceCompanySize();
        //selectCategoryGroup();
    }]);;
entriesApp.controller('menuController', [
    '$scope',
    'sharedProperties',
    '$state',
    '$rootScope',
    'SweetAlert',
    function ($scope, sharedProperties, $state, $rootScope, SweetAlert) {
        $scope.changeStep = function (state) {
            if ($state.current.name === "enter.select") {
                return "";
            } else if ($state.current.name === "enter.submit") {
                if (_.includes(['enter.select', 'enter.submit', 'enter.review'], state)) {
                    if (state === "enter.review" && sharedProperties.getProperty("reviewsAccessible")) {
                        SweetAlert.swal({
                            title: "There are unsaved changes on this page. \n Are you sure you want to leave?",
                            type: "warning",
                            showCancelButton: true,
                            killButtonColor: true,
                            confirmButtonClass: "btn-primary btn",
                            cancelButtonClass: "btn-secondary btn",
                            confirmButtonText: "Continue",
                            closeOnConfirm: true,
                            iconHTML: "<i class='material-icons md-48 md-secondary'>warning</i>"
                        },
                        function (isConfirm) {
                            if (isConfirm) {
                                $state.go(state);
                            }
                        });
                    } else if (state != "enter.review") {
                        $state.go(state);
                    }

                }
            } else if ($state.current.name === "enter.review") {
                if (_.includes(['enter.select', 'enter.submit', 'enter.review'], state)) {
                    $state.go(state);
                }
            } else if ($state.current.name === "enter.client") {
                if (_.includes(['enter.select', 'enter.submit', 'enter.review', 'enter.client'], state)) {
                    $state.go(state);
                }
            } else if ($state.current.name === "enter.checkout") {
                if (_.includes(['enter.select', 'enter.submit', 'enter.review', 'enter.client', 'enter.checkout'], state)) {
                    $state.go(state);
                }
            }
        };
    }]);;
entriesApp.controller('payOrderController', ['$scope', '$rootScope', 'orderFactory', 'sharedProperties', '$state', '$uibModal', '$uibModalStack', 'geoFactory',
  function ($scope, $rootScope, orderFactory, sharedProperties, $state, $uibModal, $uibModalStack, geoFactory) {

      // init
      $scope.status;
      $scope.showCloseBtn = true;

      $scope.$on('showPayOrderModal', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.payOrderDialog({ backdrop: 'static', keyboard: false }, args);
          $scope.showCloseBtn = true;
      });

      $scope.payOrderDialog = function (opts, successCallbackArgs) {
          var opts = opts || {};
          var modalData = function () {
              return null;
          };

          var defaults = {
              templateUrl: "/Entries/PayOrderModal",
              controller: PayOrderDialogCtrl,
              scope: $scope,
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

          var combined = _.merge({}, defaults, opts);

          var modalInstance = $uibModal.open(combined);

          if (modalInstance) {
              modalInstance.rendered.then(function () {
                  $scope.$broadcast('renderedPayOrderModal');
              });
          }
      };
  }]);


var PayOrderDialogCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'orderFactory', 'geoFactory', 'options', 'successCallbackArgs', function ($scope, $rootScope, $uibModalInstance, sharedProperties, orderFactory, geoFactory, options, successCallbackArgs) {

    $scope.statusOrder;
    $scope.submitted = false;

    $scope.orderID = (successCallbackArgs && successCallbackArgs.Params && successCallbackArgs.Params.length > 0) ? successCallbackArgs.Params[0] : {};
    $scope.creditCard = {};

    var submitCreditCardPayment = function () {
        
        orderFactory.submitCreditCardPayment({ creditCard: $scope.creditCard, order: $scope.currentEditableOrder }).success(function (response) {
            if (response.Success) {
                $scope.currentEditableOrder = response.Data;
                $scope.currentEditableOrder.PaymentStatusName = sharedProperties.GetPaymentStatusName($scope.currentEditableOrder.PaymentStatusID);
                $scope.creditCard = {
                    CardType: "",
                    CardholderName: "",
                    CardholderNumber: "",
                    ExpirationMonth: (new Date().getMonth()) + 1,
                    ExpirationYear: new Date().getFullYear(),
                    CVV: ""
                };
                $scope.successMessage = ["Payment was successfully processed."];
                sharedProperties.ShowThenHideArea("#orderEditSuccess", true);
            }
            else {
                $scope.disableCreditCardButton = false;
                $scope.errorMessage = response.Errors || ["Unable to process Creditcard, please check card information and retry."];
                sharedProperties.ShowThenHideArea("#orderEditErrors", true);
            }
        }).error(function (error) {
            $scope.disableCreditCardButton = false;
            $scope.status = error;
        });
    }

    $scope.save = function (isValid) {
        if (!isWorldPayValid())
            return;
        //reset error
        $scope.statusOrder = undefined;

        if ($scope.keepSpinning) {
            return;
        }
        else if (!isValid) {
            $scope.submitted = true;
            return;
        }

        $scope.keepSpinning = true;
        
        $scope.submitted = false;

        $scope.creditCard.CardType = $scope.editOrder && $scope.editOrder.cardNum ? $scope.editOrder.cardNum.$ccType : null;

        if ($scope.creditCard.Token) {
            $scope.creditCard.CardholderNumber = null;
            $scope.creditCard.CVV = null;
        }

        var params = {
            PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID,
            Order: $scope.order,
            CreditCard: $scope.creditCard
        };
        
        orderFactory.submitCreditCardPaymentDash(params)
            .success(function (data) {
                if (data && data.Success) {

                    //TODO: DETERMINE MORE LEAN WAY TO HANDLE THIS - SINGLE ITEM VICE ENTIRE

                    if (successCallbackArgs) {
                        $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                    }

                    $uibModalInstance.dismiss('cancel');
                }
                else {
                    $scope.creditCard.Token = null;
                    $scope.statusOrder = (data && data.Errors && data.Errors.length > 0 ? data.Errors[0] : '') || 'Unable to complete payment.';
                }
                $scope.keepSpinning = false;
                params = undefined;
            })
            .error(function (error) {
                $scope.creditCard.Token = null;
                $scope.statusOrder = 'Unable to complete.';
                $scope.keepSpinning = false;
                params = undefined;
            });
    };

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };


    function getCountries() {
        if ($scope.countries && $scope.countries.length > 0) return;

        geoFactory.getCountries()
          .success(function (successData) {
              $scope.countries = successData;
          })
          .error(function (error) {
              $scope.status = error;
          });
    };
    
    function getStatesByCountryAbbrev(abbrev) {
        geoFactory.getStatesByCountryAbbrev(abbrev)
          .success(function (successData) {
              if (successData.length > 0) {
                  $scope.showStateSelector = true;
                  $scope.states = successData;
              } else {
                  $scope.showStateSelector = false;
              }

          })
          .error(function (error) {
              $scope.status = error;
          });
    };

    $scope.getStatesByCountryAbbrev = function (countryAbbrev, bypassStateClear) {
        if ($scope.order && !bypassStateClear) {
            $scope.order.BillingState = '';
        }
        getStatesByCountryAbbrev(countryAbbrev);
    };


    $scope.fillBillingWithContact = function (turnOn) {
        var updateState = false;
        if (turnOn) {
            updateState = $scope.order.BillingCountry != $scope.submissionData.Entrant.Country;

            $scope.order.BillingFirstName = $scope.submissionData.Entrant.FirstName;
            $scope.order.BillingLastName = $scope.submissionData.Entrant.LastName;
            $scope.order.BillingEmail = $scope.submissionData.Entrant.Email;
            $scope.order.BillingPhone = $scope.submissionData.Entrant.Phone;
            $scope.order.BillingAddress1 = $scope.submissionData.Entrant.Address1;
            $scope.order.BillingAddress2 = $scope.submissionData.Entrant.Address2;
            $scope.order.BillingCity = $scope.submissionData.Entrant.City;
            $scope.order.BillingCountry = $scope.submissionData.Entrant.Country;
            $scope.order.BillingState = $scope.submissionData.Entrant.State;
            $scope.order.BillingZip = $scope.submissionData.Entrant.Zip;
        } else {
            updateState = $scope.order.BillingCountry != $scope.defaultOrder.BillingCountry;

            $scope.order.BillingFirstName = $scope.defaultOrder.BillingFirstName;
            $scope.order.BillingLastName = $scope.defaultOrder.BillingLastName;
            $scope.order.BillingEmail = $scope.defaultOrder.BillingEmail;
            $scope.order.BillingPhone = $scope.defaultOrder.BillingPhone;
            $scope.order.BillingAddress1 = $scope.defaultOrder.BillingAddress1;
            $scope.order.BillingAddress2 = $scope.defaultOrder.BillingAddress2;
            $scope.order.BillingCity = $scope.defaultOrder.BillingCity;
            $scope.order.BillingCountry = $scope.defaultOrder.BillingCountry;
            $scope.order.BillingState = $scope.defaultOrder.BillingState;
            $scope.order.BillingZip = $scope.defaultOrder.BillingZip;
        }

        if (updateState) {
            getStatesByCountryAbbrev($scope.order.BillingCountry, true);
        }
    };


    var getOrderData = function () {
        orderFactory.getOrderForPaying($scope.orderID)
            .then(function (res) {
                if (res && res.data && res.data.Success) {
                    $scope.order = res.data.Data;
                    $scope.defaultOrder = angular.copy(res.data.Data);

                    if ($scope.order.BillingCountry != "") {
                        getStatesByCountryAbbrev($scope.order.BillingCountry, true);
                    }
                }
                else {
                    $scope.order = null;
                    $scope.defaultOrder = null;
                    $scope.status = 'Error';
                }
                
            })
          .catch(function (error) {
              $scope.status = error;
          });
    };

    var loadData = function () {
        $scope.currentYear = moment().year();

        var date = new Date();
        ////set the default expiration drop-downs
        $scope.creditCard.ExpirationMonth = (date.getMonth() + 1).toString();
        $scope.creditCard.ExpirationYear = date.getFullYear().toString();

        getOrderData();
        getCountries();
    };

    //World Pay related functions
    function isWorldPayProperty() {
        return sharedProperties.getProperty("propertyDetails").PropertyID == 3;
    }

    function setupWorldPayClient() {
        if (isWorldPayProperty()) {
            var form = document.getElementById('payOrderForm');
            if (Worldpay.helpers && Worldpay.helpers.templateFormCallback) {
                Worldpay.helpers.templateFormCallback = function (a, b, c) {
                };
            }
            Worldpay.useOwnForm({
                'clientKey': appSettings.WPClientKey,
                'form': form,
                'callback': function (status, response) {
                    $scope.$apply(function () {
                        if (response.error && response.error.message) {
                            if (angular.isArray(response.error.message)) {
                                $scope.statusOrder = "";
                                for (var u = 0; u < response.error.message.length; u++) {
                                    $scope.statusOrder = $scope.statusOrder + response.error.message[u] + (u == (response.error.message.length - 1) ? "" : ", ");
                                }
                            }
                            else {
                                $scope.statusOrder = response.error.message;
                            }
                            $scope.submitted = false;
                        } else if (!response.error) {
                            var checkoutFormController = angular.element("[name='payOrderForm']").controller("form");
                            if (checkoutFormController) {
                                $scope.creditCard.Token = response.token;
                                Worldpay.formBuilder(form, 'input', 'hidden', 'token', $scope.creditCard.Token);
                                $scope.save(checkoutFormController.$valid);
                            }
                            else {
                                $scope.statusOrder = 'Unable to complete.';
                                $scope.submitted = false;
                            }
                        }
                    });
                }
            });
        }
    }

    function isWorldPayValid() {
        if (isWorldPayProperty()) {
            return $scope.creditCard.Token ? true : false;
        }
        return true;
    }

    $scope.$on('renderedPayOrderModal', function (event, args) {
        setupWorldPayClient();
    });

    loadData();
}];;
/// <reference path="userController.js" />
entriesApp.controller('userController', ['$scope', '$rootScope', 'userFactory', 'sharedProperties', '$state', '$uibModal', '$uibModalStack',
  function ($scope, $rootScope, userFactory, sharedProperties, $state, $uibModal, $uibModalStack) {

      // init
      $scope.user;
      $scope.status;
      $scope.showCloseBtn = true;
      $scope.oauthChecking = false;
      $scope.propertyDetails = sharedProperties.getProperty("propertyDetails");

      $scope.oAuth = {
          OAuthID: null,
          OAuthProvider: null,
          FirstName: null,
          LastName: null
      };

      $scope.clearOAuth = function ()
      {
          if (!$scope.oAuth) { return; }
          $scope.oAuth.OAuthID = null;
          $scope.oAuth.OAuthProvider = null;
          $scope.oAuth.FirstName = null;
          $scope.oAuth.LastName = null;
      }

      $scope.user = {
          UserID: 0,
          RoleID: 0,
          PropertyID: 0,
          FirstName: "",
          LastName: "",
          Email: "",
          Password: "",
          Title: "",
          Birthday: "",
          Address1: "",
          Address2: "",
          City: "",
          State: "",
          Country: "",
          VATNumber: "",
          Phone: "",
          Zip: "",
          Fax: "",
          TimeZone: "",
          TempPassword: "",
          Notes: "",
          LoginCount: "",
          LastUpdated: "",
          Deactivated: "",
          Activated: "",
          Created: "",
          LastLogin: "",
          UserLanguages: []
      };

      var userModel = Object.create($scope.user);

      $scope.registrationDialog = function (opts, successCallbackArgs) {
          $scope.oauthChecking = false;
          var opts = opts || {};
          var modalData = function () {
              return null;
          };

          var defaults = {
              templateUrl: "/Entries/RegisterModal",
              controller: RegistrationDialogCtrl,
              scope: $scope,
              windowClass: 'register-modal',
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

          var combined = _.merge({}, defaults, opts);

          var modalInstance = $uibModal.open(combined);
      };

      $scope.HasToken = function () {
          return sharedProperties.HasToken();
      };

      $scope.$on('promptLoginEventFromDashboard', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.loginDialog({ backdrop: 'static', keyboard: true }, args);
          $scope.showCloseBtn = true;
      });

      $scope.$on('promptLoginEvent', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.loginDialog({ backdrop: 'static', keyboard: false }, args);
          $scope.showCloseBtn = ($scope.loginMode === 5);
      });

      $scope.$on('promptRegisterEvent', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.registrationDialog({ backdrop: 'static', keyboard: false }, args);
          var propertyID = sharedProperties.getProperty("propertyDetails").PropertyID;
          $scope.showCloseBtn = propertyID == 1 || propertyID == 3;
      });

      $scope.$on('promptForgotEvent', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.forgotDialog({ backdrop: 'static', keyboard: false }, args);
          $scope.showCloseBtn = false;
      });

      $scope.$on('promptLoginOrRegisterEvent', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.loginOrRegisterDialog({ backdrop: 'static', keyboard: false }, args);
      });

      $scope.$on('updateUser', function (event, data) {
          $scope.LoggedInEmail = data.data.Email;
      });

      $scope.$on('baseLogOut', function (event, data) {
          $scope.logOut();
      });

      $scope.$on('baseLogin', function (event, data) {
          $scope.loginDialog();
      });

      $scope.$on('loginThenDash', function (event, data) {
          $scope.loginDialog({}, false, "dashboard.list");
      });

      $scope.logOut = function () {
          userFactory.logout()
            .success(function () {
                try {
                    sharedProperties.RemoveToken();
                    //clear out submission
                    $rootScope.$broadcast('logout');
                } catch (e) {
                    //console.log(e);
                }
            })
            .error(function (error) {
                $scope.status = error;
            });
      };

      $scope.logOutHeader = function () {
          userFactory.logout()
            .success(function () {
                sharedProperties.RemoveToken();
                //clear out submission
                $rootScope.$broadcast('logout');
                $rootScope.$broadcast('promptLoginEvent');
            })
            .error(function (error) {
                $scope.status = error;
            });
      };

      $scope.determineLogout = function () {
          sharedProperties.getProperty("propertyDetails").PropertyID != 9 && $scope.loginMode !== 5 ? $scope.logOutHeader() : $scope.logOut();
      };

      $scope.loginDialog = function (opts, successCallbackArgs, changeState) {
          $scope.oauthChecking = false;
          var opts = opts || {};
          var modalData = function () {
              return null;
          };

          var defaults = {
              templateUrl: "/Entries/LoginModal",
              controller: LoginDialogCtrl,
              scope: $scope,
              windowClass: 'login-modal',
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

          var combined = _.merge({}, defaults, opts);

          if (changeState) {
              var modalInstance = $uibModal.open(combined).closed.then(function(){
                  if ($scope.HasToken()) {
                      $state.go(changeState);
                  }
              });
          } else {
              var modalInstance = $uibModal.open(combined);
          }
      };

      $scope.forgotDialog = function (opts, successCallbackArgs) {
          var opts = opts || {};
          var modalData = function () {
              return null;
          };

          var defaults = {
              templateUrl: "/Entries/ForgotModal",
              controller: ForgotDialogCtrl,
              scope: $scope,
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

          var combined = _.merge({}, defaults, opts);

          var modalInstance = $uibModal.open(combined);
      };

      $scope.loginOrRegisterDialog = function (opts, successCallbackArgs) {
          var opts = opts || {};
          var modalData = function () {
              return null;
          };

          var defaults = {
              templateUrl: "/Entries/LoginRegisterPickerModal",
              controller: LoginOrRegisterDialogCtrl,
              scope: $scope,
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

          var combined = _.merge({}, defaults, opts);

          var modalInstance = $uibModal.open(combined);
      };
  }]);

var RegistrationDialogCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'userFactory', 'options', 'successCallbackArgs', function ($scope, $rootScope, $uibModalInstance, sharedProperties, userFactory, options, successCallbackArgs) {
    $scope.statusRegistration;

    $scope.save = function () {
        //reset error
        $scope.statusRegistration;
        var params = {
            FirstName: $scope.user.FirstName,
            LastName: $scope.user.LastName,
            Email: $scope.user.Email,
            Password: $scope.user.Password,
            ConfirmPassword: $scope.user.PasswordConfirm,
            PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID,
            ProvidedConsent: $scope.user.ProvidedConsent,
            OAuthID: $scope.oAuth.OAuthID,
            OAuthProvider: $scope.oAuth.OAuthProvider
        };
        $scope.keepSpinning = true;

        //oauth
        if ($scope.oAuth && $scope.oAuth.OAuthID && $scope.oAuth.OAuthProvider) {
            return $scope.registerOauth(params);
        }

        userFactory.insertUser(params)
            .success(function (data) {
                userFactory.login(params.Email, params.Password, params.PropertyID)
                    .success(function (data) {
                        sharedProperties.SetToken(data.access_token);
                        userFactory.getContact()
                            .success(function (data) {
                                $scope.keepSpinning = false;
                                sharedProperties.updateUser(data);

                                if (successCallbackArgs) {
                                    $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                                }

                                $rootScope.$broadcast('login');

                                $scope.user.FirstName = '';
                                $scope.user.LastName = '';
                                $scope.user.Email = '';
                                $scope.user.Password = '';
                                $scope.user.PasswordConfirm = '';
                                $uibModalInstance.close();
                                $scope.clearOAuth();
                            })
                            .error(function (error) {
                                $scope.keepSpinning = false;
                            });
                    })
                    .error(function (error) {
                        $scope.statusRegistration = error;
                        $scope.keepSpinning = false;
                    });
            })
            .error(function (error) {
                $scope.statusRegistration = error.ModelState[""];
                $scope.keepSpinning = false;
            });

    };

    $scope.login = function () {
        $uibModalInstance.dismiss('cancel', successCallbackArgs);
        $scope.loginDialog(options);
    }

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

    $scope.registerOauth = function (params) {
        userFactory.insertUserOauth(params)
            .then(function (oauthResponse) {
                if (oauthResponse && oauthResponse.data && oauthResponse.data.Success) {
                    //login
                    $scope.keepSpinning = true;

                    sharedProperties.SetToken(oauthResponse.data.Data.access_token);
                    userFactory.getContact()
                        .success(function (cData) {
                            sharedProperties.updateUser(cData);
                            $scope.keepSpinning = false;
                            if (successCallbackArgs) {
                                $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                            }
                            $rootScope.$broadcast('login', cData);
                            $scope.user.Email = '';
                            $scope.user.Password = '';
                            $scope.user.FirstName = null;
                            $scope.user.LastName = null;
                            $uibModalInstance.close();
                            $scope.clearOAuth();
                        })
                        .error(function (error) {
                            //$scope.status = error;
                            $scope.keepSpinning = false;
                        });
                }
                else {
                    $scope.statusRegistration = ['Unable to verify user.'];
                    $scope.keepSpinning = false;
                }
            })
            .catch(function (error) {
                if (error && error.data && error.data.ModelState[""] && error.data.ModelState[""].length > 0) {
                    $scope.statusRegistration = error.data.ModelState[""];
                }
                else {
                    $scope.statusRegistration = ['Unable to register user.'];
                }
                $scope.keepSpinning = false;
            });
    };

}];

var LoginDialogCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'userFactory', 'options', 'successCallbackArgs', function ($scope, $rootScope, $uibModalInstance, sharedProperties, userFactory, options, successCallbackArgs) {
    $scope.statusLogin;

    $scope.login = function () {
        //reset error
        $scope.statusLogin = undefined;

        var params = {
            Email: $scope.user.Email,
            Password: $scope.user.Password,
            PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID
        };

        $scope.keepSpinning = true;

        userFactory.login(params.Email, params.Password, params.PropertyID)
            .success(function (data) {
                sharedProperties.SetToken(data.access_token);
                userFactory.getContact()
                    .success(function (data) {
                        sharedProperties.updateUser(data);
                        $scope.keepSpinning = false;
                        if (successCallbackArgs) {
                            $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                        }
                        $rootScope.$broadcast('login', data);
                        $scope.user.Email = '';
                        $scope.user.Password = '';
                        $uibModalInstance.close();
                        $scope.clearOAuth();
                    })
                    .error(function (error) {
                        //$scope.status = error;
                        $scope.keepSpinning = false;
                    });
            })
            .error(function (error) {
                $scope.statusLogin = error;
                $scope.keepSpinning = false;
            });
    };

    $scope.register = function () {
        $uibModalInstance.dismiss('cancel');
        $scope.registrationDialog(options, successCallbackArgs);
    };

    $scope.forgot = function () {
        $uibModalInstance.dismiss('cancel');
        $scope.forgotDialog(options, successCallbackArgs);
    };

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

    $scope.showOauthError = function (message) {
        $scope.$apply(function () {
            if (!$scope.statusLogin) { $scope.statusLogin = {}; }
            $scope.statusLogin.error_description = message || 'Unable to verify user.';
        });
    }

    $scope.adjustFromOauth = function (oauthData, provider) {
        $scope.statusLogin = undefined;
        $scope.oauthChecking = true;
        userFactory.verifyOAuth(oauthData, provider)
            .then(function (oauthResponse) {
                if (oauthResponse.data.Message == 'LOGIN') {
                    //login
                    $scope.keepSpinning = true;

                    sharedProperties.SetToken(oauthResponse.data.Data.access_token);
                    userFactory.getContact()
                        .success(function (cData) {
                            sharedProperties.updateUser(cData);
                            $scope.keepSpinning = false;
                            if (successCallbackArgs) {
                                $rootScope.$broadcast(successCallbackArgs.Broadcast, successCallbackArgs);
                            }
                            $rootScope.$broadcast('login', cData);
                            $scope.user.Email = '';
                            $scope.user.Password = '';
                            $scope.user.FirstName = null;
                            $scope.user.LastName = null;
                            $uibModalInstance.close();
                            $scope.clearOAuth();
                            $scope.oauthChecking = false;
                        })
                        .error(function (error) {
                            //$scope.status = error;
                            $scope.keepSpinning = false;
                            $scope.oauthChecking = false;
                        });
                }
                else if (oauthResponse.data.Message == "REGISTER") {
                    //register
                    $scope.user.Email = oauthResponse.data.Data.Email;
                    $scope.user.FirstName = oauthResponse.data.Data.FirstName;
                    $scope.user.LastName = oauthResponse.data.Data.LastName;
                    $scope.oAuth.OAuthID = oauthResponse.data.Data.Id;
                    $scope.oAuth.OAuthProvider = oauthResponse.data.Data.Provider;
                    $scope.oAuth.FirstName = oauthResponse.data.Data.FirstName;
                    $scope.oAuth.LastName = oauthResponse.data.Data.LastName;
                    $uibModalInstance.close();
                    $scope.registrationDialog(options, successCallbackArgs);
                    $scope.oauthChecking = false;
                }
                else {
                    if (!$scope.statusLogin) { $scope.statusLogin = {}; }
                    $scope.statusLogin.error_description = 'Unable to verify user.';
                    $scope.oauthChecking = false;
                }
            })
            .catch(function (error) {
                if (!$scope.statusLogin) { $scope.statusLogin = {}; }
                $scope.statusLogin.error_description = 'Unable to verify user.';
                $scope.oauthChecking = false;
            });
    };

}];


var ForgotDialogCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'userFactory', 'options', 'successCallbackArgs', function ($scope, $rootScope, $uibModalInstance, sharedProperties, userFactory, options, successCallbackArgs) {
    $scope.statusForgot;
    $scope.showSuccess = false;

    $scope.resetPassword = function () {
        //reset error
        $scope.statusForgot = undefined;
        $scope.showSuccess = false;

        var params = {
            Email: $scope.user.Email,
            PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID
        };
 //test
        $scope.keepSpinning = true;

        userFactory.forgotPassword(params.Email,params.PropertyID)
            .success(function (data) {
                //show success screen
                $scope.keepSpinning = false;
                $scope.showSuccess = true;
            })
            .error(function (error) {
                $scope.statusForgot = error;
                $scope.statusForgot.error_description = error.Message;
                $scope.keepSpinning = false;
            });
    };

    $scope.login = function () {
        $uibModalInstance.dismiss('cancel');
        $scope.loginDialog(options, successCallbackArgs);
    }

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

}];


var LoginOrRegisterDialogCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'options', 'successCallbackArgs', function ($scope, $rootScope, $uibModalInstance, options, successCallbackArgs) {
    $scope.showLogin = function () {
        $uibModalInstance.dismiss('cancel');
        $scope.loginDialog(options, successCallbackArgs);
    };

    $scope.showRegister = function () {
        $uibModalInstance.dismiss('cancel');
        $scope.registrationDialog(options, successCallbackArgs);
    };

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

}];;
entriesApp.controller('userDashboardController', [
    '$scope',
    'entriesFactory',
    'userFactory',
    'propertyFactory',
    'pdfFactory',
    'geoFactory',
    'sharedProperties',
    '$state',
    '$location',
    '$http',
    '$rootScope',
    '$filter',
    '$analytics',
    'seasonFactory',
    '$localStorage',
    '$sce',
    function ($scope, entriesFactory, userFactory, propertyFactory, pdfFactory, geoFactory, sharedProperties, $state, $location, $http, $rootScope, $filter, $analytics, seasonFactory, $localStorage, $sce) {
        var stateChanged_To = null;

        $scope.propertyId = propertyID || 1;

        $scope.allowUploadEdit = false;
        $scope.preventUpload = false;
        $scope.currentSeasonID = 0;

        $scope.treatAsCampaign = $scope.propertyId == 6;

        var toolTipTextVatID = "<div class='text-left'>Please provide a VAT ID with a valid country code. If you do not know your VAT ID please leave this field blank.<br /><br />Example: DE234987234</div>";
        $scope.vatidTooltip = $sce.trustAsHtml(toolTipTextVatID);

        function resetState() {
            $scope.newCredit = {};
            $scope.newCredit.FirstName = "";
            $scope.newCredit.LastName = "";
            $scope.newCredit.Organization = "";
            $scope.newCredit.Title = "";
            $scope.PDF_W9 = null;
            $scope.submissionData = null;
            $scope.savedSubmissions = null;
            $scope.submittedSubmissions = null;
            $scope.savedEntriesCount = null;
            $scope.videoUploads = null;

            if ($state.current.name === "dashboard.contact" && !sharedProperties.HasToken()) {
                $state.go("dashboard.list");
                $scope.currentUser = null;
            }
        }

        // Initialize $scope's state
        resetState();

        $scope.$on('logout', resetState);

        var propertyData = sharedProperties.getProperty("propertyDetails");
        if (propertyData) {
            $scope.PDF_W9 = propertyData.PDF_W9;
        }
        else {
            propertyFactory
              .getPropertyDetails($scope.propertyId)
              .success(function (details) {
                  sharedProperties.setProperty('propertyDetails', details);
                  $scope.PDF_W9 = (details ? details.PDF_W9 : null);
              })
              .error(function (error) {
                  $scope.status = error;
                  console.error(error);
              });
        }

        $scope.collapseCredits = function () {
            this.props.isEditable = !this.props.isEditable;
        };

        $scope.selectedSubmissionIDs = [];
        $scope.toggleSubmissionSelection = function (submissionID) {
            var idx = $scope.selectedSubmissionIDs.indexOf(submissionID);

            // is currently selected
            if (idx > -1) {
                $scope.selectedSubmissionIDs.splice(idx, 1);
            }
            else {
                $scope.selectedSubmissionIDs.push(submissionID);
            }
        };

        $scope.mergeSubmission = function () {
            entriesFactory.mergeSubmissions({ Data: $scope.selectedSubmissionIDs })
                .then(function (result) {
                    if (result && result.data && result.data.Success) {
                        //Redirect to Review page for specific submission
                        $scope.reviewAndComplete({ SubmissionID: result.data.Data })
                    }
                    else {
                        //Handle no valid data returned
                        $scope.errorMessage = ["Error occurred while merging orders."];
                        sharedProperties.ShowThenHideArea("#userListErrors");
                    }
                })
                .catch(function (error) {
                    $scope.errorMessage = ["Error merging orders."];
                    sharedProperties.ShowThenHideArea("#userListErrors");
                });
        };

        $scope.callbackIdentifier = 'userDashboardController';

        $scope.logOut = function () {
            userFactory
              .logout()
              .then(resetState)
              .then(function () {
                  sharedProperties.RemoveToken();
                  if ($state.current.name == 'dashboard.contact') {
                      $state.go('dashboard.list');
                  }
                  else {
                      promptLogin(sharedProperties.FormatForLoginCallback($scope.callbackIdentifier, loadData));
                  }
              })
              .catch(function (error) {
                  $scope.status = error;
              });
        };

        $scope.HasToken = function () {
            return sharedProperties.HasToken();
        };

        var promptLogin = function (afterSuccessData) {
            if (sharedProperties.HasToken()) {
                userFactory.getContact()
                    .success(function (data) {
                        if (data) {
                            if (afterSuccessData && afterSuccessData['fn']) {
                                afterSuccessData['fn']();
                            }
                        }
                        else {
                            sharedProperties.RemoveToken();
                            promptLoginActual(afterSuccessData);
                        }
                    })
                    .error(function (error) {
                        sharedProperties.RemoveToken();
                        promptLoginActual(afterSuccessData);
                    });
            }
            else {
                promptLoginActual(afterSuccessData);
            }
        };

        var promptLoginActual = function (afterSuccessData) {
            $rootScope.$broadcast('promptLoginEventFromDashboard', afterSuccessData);
        };


        var loadData = function () {
            entriesFactory.getSubmissionsForHome(sharedProperties.GetExtended())
                .success(function (successData) {
                    if (successData.Data) {
                        $scope.submissionData = successData.Data;
                        $scope.savedSubmissions = _.has($scope.submissionData, 'SavedSubmissions') ? $scope.submissionData.SavedSubmissions : null;
                        $scope.submittedSubmissions = _.has($scope.submissionData, 'SubmittedSubmissions') ? $scope.submissionData.SubmittedSubmissions : null;
                        $scope.savedEntriesCount = successData.Count;
                        $scope.videoUploads = _.has($scope.submissionData, 'VideoUploads') ? $scope.submissionData.VideoUploads : null;
                        $scope.podcastUploads = _.has($scope.submissionData, 'PodcastUploads') ? $scope.submissionData.PodcastUploads : null;
                    }
                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        $scope.$on('login', loadData);

        $scope.$on($scope.callbackIdentifier, function (event, args) {
            if (args && args['fn'] && $.isFunction(args['fn'])) {
                args['fn']();
            }
        });

        var handleStateChanges = function (stateChangeType, event, toState, toParams, fromState, fromParams, options) {
            stateChanged_To = toState.name;

            if (toState.name == "dashboard.list") {
                promptLogin(sharedProperties.FormatForLoginCallback($scope.callbackIdentifier, loadData));
            } else if (toState.name == "dashboard.contact") {
                if (!sharedProperties.HasToken()) {
                    return $state.go("dashboard.list");
                }
                getUserContactDetails();
            }
        }

        $scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) {
            stateChanged_To == toState.name;

            handleStateChanges('$stateChangeStart', event, toState, toParams, fromState, fromParams, options);

        });
        $scope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, options) {
            if (stateChanged_To && stateChanged_To == toState.name) {
                stateChanged_To = ''
                return;
            }

            stateChanged_To = ''
            handleStateChanges('$stateChangeSuccess', event, toState, toParams, fromState, fromParams, options);
        });

        $scope.saveSub = function (isEditable, sub) {
            if (isEditable == false) {
                saveSubmission(sub)
            }
        };

        $scope.updatePieces = function (isEditable, pieces) {
            if (isEditable == false) {
                updatePieces(pieces);
            }
        };

        $scope.updatePiece = function (isEditable, piece) {
            if (isEditable == false) {
                updatePieces([piece]);
            }
        };

        // For updating piecce title and credits
        function updatePieces(pieces) {
            if (!pieces || pieces.length < 1)
                return;

            var data = {
                SubmissionID: pieces[0].SubmissionID,
                Pieces: []
            };
            for (var i = 0; i < pieces.length; i++) {
                data.Pieces.push({
                    PieceID: pieces[i].PieceID,
                    PieceTitle: pieces[i].Title,
                    Credits: pieces[i].Credits,
                    APlusDescription: pieces[i].APlusDescription
                });
            }


            entriesFactory.updatePieceFromDashboard(data)
                .success(function (data) {
                    if (!data || !data.Success) {
                        //Deal with null response
                        $scope.errorMessage = ["Error saving information"];
                        sharedProperties.ShowThenHideArea("#userListErrors");

                        return;
                    }
                    _.each(pieces, function (p) {
                        itemIndexToReplace = _.findIndex(data.Data.Pieces, { PieceID: p.PieceID });

                        p.Credits = data.Data.Pieces[itemIndexToReplace].Credits || [];

                        p.Credits.push({ SubmissionID: p.SubmissionID, PieceID: p.PieceID });
                    });

                    $analytics.eventTrack('Submission Edited/Saved');
                    $scope.successMessage = ["Submission saved successfully!"];
                    sharedProperties.ShowThenHideArea("#userListSuccess");
                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        }
        var updateUrlPrefix = function (data) {
            var url = data;
            if (!url || !url.trim()) return url;

            url = url.replace("@", "").trim();

            if (!(/^https?:\/\//.test(url))) {
                if (url.length != 0) {
                    url = "http://" + url;
                }
            }

            return url;
        };
        //$scope.updatePiecePodcastInfo = function (piece, isValid) {
        //    $scope.submitted = true;
        //    for (var i = 0; i < piece.AdditionalURLs.length > 0; i++) {
        //        piece.AdditionalURLs[i].value = updateUrlPrefix(piece.AdditionalURLs[i].value);
        //    }
        //    if (isValid) {
        //        entriesFactory.updatePieceURLsFromDashboard(piece).success(function (data) {
        //            if (data && data.Success) {
        //                piece.AdditionalURLs = data.Data;
        //                piece.AdditionalURLs.push({ id: 0, value: "" });
        //                $analytics.eventTrack('Submission Edited/Saved');
        //                $scope.successMessage = ["Podcast URLs saved successfully!"];
        //                sharedProperties.ShowThenHideArea("#userListSuccess");
        //            }
        //        }).error(function (error) {
        //            $scope.status = error;
        //            conseol.error(error);
        //        });
        //    }
        //};

        //$scope.removePiecePodcastInfo = function (pieceID, urlIndex) {
        //    var selectedPiece = _.find($scope.podcastUploads, function (p) { return p.PieceID == pieceID; });
        //    _.remove(selectedPiece.AdditionalURLs, function (u, i) { return i == urlIndex; });
        //};

        function saveSubmission(sub) {

            sub.Contact = $scope.submissionData.Entrant;
            entriesFactory.insertSubmission({ data: sub })
            .success(function (data) {
                if (!data) {
                    //Deal with null response
                    $scope.errorMessage = ["Error saving information"];
                    sharedProperties.ShowThenHideArea("#userListErrors");

                    return;
                }
                _.each(data.Data.Pieces, function (i) {
                    i.Credits.push({ SubmissionID: sub.SubmissionID, PieceID: i.PieceID });
                });

                itemIndexToReplace = _.findIndex($scope.submissionData.SubmittedSubmissions, { SubmissionID: data.Data.SubmissionID });
                _.merge($scope.submissionData.SubmittedSubmissions[itemIndexToReplace], data.Data);
                $analytics.eventTrack('Submission Edited/Saved');
                $scope.successMessage = ["Submission saved successfully!"];
                sharedProperties.ShowThenHideArea("#userListSuccess");


            })
            .error(function (error) {
                $scope.status = error;
                console.error(error);
            });
        }

        $scope.removeCredit = function (sub, piece, cID) {
            itemIndexToReplace = _.findIndex($scope.submissionData.SubmittedSubmissions, { SubmissionID: sub.SubmissionID });
            currentSub = $scope.submissionData.SubmittedSubmissions[itemIndexToReplace];
            pieceIndexToReplace = _.findIndex(currentSub.Pieces, { PieceID: piece.PieceID });

            creditsToKeep = _.omitBy(piece.Credits, function (i) {
                return i.CreditID === cID;
            });

            currentSub.Pieces[pieceIndexToReplace].Credits = _.values(creditsToKeep);

        }

        $scope.hasMailItem = function (sub) {
            mailCount = $filter('filter')(sub.Pieces, { EntryType: "Mail" });
            if (mailCount.length > 0) {
                return true
            } else {
                return false
            }
        };

        $scope.reviewAndComplete = function (sub) {
            sharedProperties.setProperty("entries_submission", sub.SubmissionID);
            $state.go('enter.review');
        };

        $scope.reviewAndAddNew = function (sub) {
            $state.go('enter.select', { submissionID: sub.SubmissionID });
        };


        $scope.downloadInvoice = function (orderID) {
            downloadFile(orderID, "invoice-" + orderID + ".pdf", pdfFactory.getInvoice)
        };
        $scope.downloadPackingLabel = function (orderID) {
            downloadFile(orderID, "packinglabel-" + orderID + ".pdf", pdfFactory.getPackingLabel)
        };
        $scope.downloadShippingLabel = function (orderID) {
            downloadFile(orderID, "shippinglabel-" + orderID + ".pdf", pdfFactory.getShippingLabel)
        };

        //FROM: http://stackoverflow.com/questions/24080018/download-file-from-an-asp-net-web-api-method-using-angularjs
        // Based on an implementation here: web.student.tuwien.ac.at/~e0427417/jsdownload.html
        var downloadFile = function (orderID, specificFileName, specificFunction) {
            $scope.checkoutFileDownloadError = "";
            var debug = false;
            // Use an arraybuffer
            specificFunction(orderID)
            .success(function (data, status, headers) {
                var octetStreamMime = 'application/octet-stream';
                var success = false;
                //Get the headers
                headers = headers();

                // Get the filename from the x-filename header or default to "download.pdf"
                var filename = specificFileName || headers['x-filename'] || 'download.pdf';

                // Determine the content type from the header or default to "application/octet-stream"
                var contentType = headers['content-type'] || octetStreamMime;

                try {
                    // Try using msSaveBlob if supported
                    if (debug) console.log("Trying saveBlob method ...");
                    var blob = new Blob([data], { type: contentType });
                    if (navigator.msSaveBlob)
                        navigator.msSaveBlob(blob, filename);
                    else {
                        // Try using other saveBlob implementations, if available
                        var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
                        if (saveBlob === undefined) throw "Not supported";
                        saveBlob(blob, filename);
                    }
                    if (debug) console.log("saveBlob succeeded");
                    success = true;
                } catch (ex) {
                    if (debug) console.log("saveBlob method failed with the following exception:");
                    if (debug) console.log(ex);
                }

                if (!success) {
                    // Get the blob url creator
                    var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
                    if (urlCreator) {
                        // Try to use a download link
                        var link = document.createElement('a');
                        if ('download' in link) {
                            // Try to simulate a click
                            try {
                                // Prepare a blob URL
                                if (debug) console.log("Trying download link method with simulated click ...");
                                var blob = new Blob([data], { type: contentType });
                                var url = urlCreator.createObjectURL(blob);
                                link.setAttribute('href', url);

                                // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
                                link.setAttribute("download", filename);

                                // Simulate clicking the download link
                                var event = document.createEvent('MouseEvents');
                                event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                                link.dispatchEvent(event);
                                if (debug) console.log("Download link method with simulated click succeeded");
                                success = true;

                            } catch (ex) {
                                if (debug) console.log("Download link method with simulated click failed with the following exception:");
                                if (debug) console.log(ex);
                            }
                        }

                        if (!success) {
                            // Fallback to window.location method
                            try {
                                // Prepare a blob URL
                                // Use application/octet-stream when using window.location to force download
                                if (debug) console.log("Trying download link method with window.location ...");
                                var blob = new Blob([data], { type: octetStreamMime });
                                var url = urlCreator.createObjectURL(blob);
                                window.location = url;
                                if (debug) console.log("Download link method with window.location succeeded");
                                success = true;
                            } catch (ex) {
                                if (debug) console.log("Download link method with window.location failed with the following exception:");
                                if (debug) console.log(ex);
                            }
                        }

                    }
                }

                if (!success) {
                    // Fallback to window.open method
                    if (debug) console.log("No methods worked for saving the arraybuffer, using last resort window.open");
                    window.open(httpPath, '_blank', '');
                }
            })
            .error(function (data, status) {
                if (debug) console.log("Request failed with status: " + status);

                // Optionally write the error out to scope
                $scope.checkoutFileDownloadError = "Unable to download file.";
            });
        };


        // Edit Contact Details


        function getCountries() {
            if ($scope.countries && $scope.countries.length > 0) return;

            geoFactory.getCountries(sharedProperties.getProperty("propertyDetails").PropertyID)
              .success(function (successData) {
                  $scope.countries = successData;
              })
              .error(function (error) {
                  $scope.status = error;
              });
        };

        function getStates(abbrev) {
            geoFactory.getStatesByCountryAbbrev(abbrev)
              .success(function (successData) {
                  if (successData.length > 0) {
                      $scope.showStateSelector = true;
                      $scope.showStateFreeText = !$scope.showStateSelector;
                      $scope.states = successData;
                  } else {
                      $scope.showStateSelector = false;
                      $scope.showStateFreeText = !$scope.showStateSelector;
                  }

              })
              .error(function (error) {
                  $scope.status = error;
              });
        };

        function getUserContactDetails() {
            userFactory.getContact()
            .success(function (data) {
                if (data) {
                    $scope.currentUser = data;
                    var setupUsersStateWatch = $scope.$watch("currentUser.Country", function () { getStates($scope.currentUser.Country); setupUsersStateWatch(); });

                }
            })
            .error(function (error) {
            });

            getCountries();

        }

        $scope.countryChange = function () {
            $scope.currentUser.State = null;
            if ($scope.currentUser.Country) {
                getStates($scope.currentUser.Country);
            }
            else {
                $scope.states = [];
            }
        };

        $scope.collapse = function () {
            this.props.isExpanded = !this.props.isExpanded;
            this.anchorProps.label = this.props.isExpanded ? 'Cancel' : 'Update Password';
            $scope.currentUser.Password = null;
            $scope.currentUser.ConfirmPassword = null;
        };

        $scope.submitDetails = function (isValid) {
            if (isValid) {
                $scope.submitted = false;
                $scope.currentUser.PropertyID = $scope.propertyId;
                $analytics.eventTrack('Update Contact Details - User Dashboard');
                userFactory.saveEntrantDetails($scope.currentUser)
                .success(function (data) {
                    if (data.Success) {
                        $state.go('dashboard.list').then(function () {
                            $scope.successMessage = ["Contact details succesfully updated."];
                            sharedProperties.ShowThenHideArea("#userListSuccess");
                        });
                    } else {
                        if (data.Message) { $scope.errorMessage = [data.Message]; }
                        else if (data.Errors && data.Errors.length > 0) { $scope.errorMessage = data.Errors; }
                        else { $scope.errorMessage = ["There was an error saving."]; }
                        sharedProperties.ShowThenHideArea("#userListErrors");
                    }
                })
                .error(function (error) {
                });

            } else {
                $scope.submitted = true;
            }

        };

        var setupDateGuidelines = function (details) {
            var today = moment.utc();
            if ((today.isBefore(moment.utc(details.FinalEntryDeadline)) || today.isSame(moment.utc(details.FinalEntryDeadline), 'day'))) {
                $scope.typeOfDeadline = "Entry Deadline";
                if (details.EntryVisibleFinalDeadline) {
                    $scope.deadline = details.EntryVisibleFinalDeadline;
                } else {
                    $scope.deadline = details.FinalEntryDeadline;
                }
            } else if ((today.isAfter(moment.utc(details.FinalEntryDeadline)) && today.isBefore(moment.utc(details.ExtendedEntryDeadline))) || today.isSame(moment.utc(details.ExtendedEntryDeadline), 'day')) {
                $scope.typeOfDeadline = "Extended Entry Deadline";
                if (details.EntryVisibleExtendedDeadline) {
                    $scope.deadline = details.EntryVisibleExtendedDeadline;
                } else {
                    $scope.deadline = details.ExtendedEntryDeadline;
                }
            } else {
                $scope.typeOfDeadline = "";
                $scope.deadline = null;
            }

            if ($scope.propertyId == 7)
            {
                if (today.isBefore(moment.utc(details.JudgingRnd2StartDate))) {
                    $scope.allowUploadEdit = true;
                }
                else {
                    $scope.preventUpload = true;
                }
            }
        };


        //retrieve season details for the current property's season
        function getSeasonDetails(propid) {
            seasonFactory.getCurrentDetailsByProperty(propid)
                .success(function (details) {
                    if (details && details.length > 0) {
                        $scope.seasonEndDate = details[0].EndDate;
                        $scope.seasonYear = details[0].Year;
                        $scope.seasonNumber = sharedProperties.getOrdinal(details[0].SeasonNumber, false);
                        setupDateGuidelines(details[0]);
                        $scope.currentSeasonID = details[0].SeasonID;
                        $scope.shortlistVideoDueDate = details[0].ShortlistVideoDueDate;
                    }
                    else {
                        //TODO: WHAT TO DO HERE IF NO SEASON DATA RETURNED?
                    }
                })
                .error(function (error) {
                    $scope.status = error;
                });
        };

        getSeasonDetails(sharedProperties.getProperty("propertyDetails").PropertyID);

        // This is used on the client info page
        $scope.addHttp = function (event) {
            var el = event.target,
               url = el.value;
            if (!(/^https?:\/\//.test(url))) {
                if (url.length != 0) {
                    url = "http://" + url;
                }
            }
            $scope.currentUser.OrganizationUrl = url;
        };

        $scope.showOauthError = function (message) {
            $scope.$apply(function () {
                $scope.errorMessage = [message || 'Unable to verify user.'];
                sharedProperties.ShowThenHideArea("#userListErrors");
            });
        }

        $scope.adjustFromOauth = function (oauthData, provider) {
            $scope.errorMessage = undefined;
            $scope.successMessage = undefined;
            userFactory.assignOAuth(oauthData, provider)
                .then(function (oauthResponse) {
                    if (oauthResponse && oauthResponse.data && oauthResponse.data.Success) {
                        $scope.successMessage = ["Successfully associated the Architizer account with this account."];
                        sharedProperties.ShowThenHideArea("#userListSuccess");
                        $scope.currentUser.ExternalLoginProviders = [provider];
                    }
                    else if (oauthResponse && oauthResponse.data && oauthResponse.data.Errors && oauthResponse.data.Errors.length > 0)
                    {
                        $scope.errorMessage = oauthResponse.data.Errors;
                        sharedProperties.ShowThenHideArea("#userListErrors");
                    }
                    else {

                        $scope.errorMessage = ['Unable to link to Architizer account.'];
                        sharedProperties.ShowThenHideArea("#userListErrors");
                    }
                })
                .catch(function (error) {
                    $scope.errorMessage = [error || 'Unable to link to Architizer account.'];
                    sharedProperties.ShowThenHideArea("#userListErrors");
                });
        };


        $scope.uploadFiles = function (piece, customType, displayPieceLength) {
            $rootScope.$broadcast('showUploadFileModal', sharedProperties.FormatForLoginCallback($scope.callbackIdentifier, loadData, piece, customType, displayPieceLength));
        };

        $scope.payOrder = function (orderID) {
            $rootScope.$broadcast('showPayOrderModal', sharedProperties.FormatForLoginCallback($scope.callbackIdentifier, loadData, orderID));
        };

        $scope.showPhoneLink = function () {
            return ($scope.propertyId && $scope.propertyId > 0 && $scope.propertyId != 3);
        };

        function getPieceLengths() {
            if ($scope.propertyDetails.PropertyID !== 8) {
                return;
            }
            entriesFactory.getPieceLengths()
                .success(function (resp) {
                    $scope.pieceLengths = resp.Data;
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        }

        getPieceLengths();
    }]);;
/**
 * @license Angulartics
 * (c) 2013 Luis Farzati http://luisfarzati.github.io/angulartics
 * License: MIT
 */
!function (a, b) {
    "use strict"; function c() {
        // General buffering handler
        function b(a) { return function () { k.waitForVendorCount && (m[a] || (m[a] = []), m[a].push(arguments)) } }
        // As handlers are installed by plugins, they get pushed into a list and invoked in order.
        function c(b, c, d) { return n[b] || (n[b] = []), n[b].push(c), o[c] = d, function () { if (!this.settings.optOut) { var c = Array.prototype.slice.apply(arguments); return this.$inject(["$q", a.bind(this, function (d) { return d.all(n[b].map(function (b) { var e = o[b] || {}; if (e.async) { var f = d.defer(), g = a.copy(c); return g.unshift(f.resolve), b.apply(this, g), f.promise } return d.when(b.apply(this, c)) }, this)) })]) } } }
        // Will run setTimeout if delay is > 0
        // Runs immediately if no delay to make sure cache/buffer is flushed before anything else.
        // Plugins should take care to register handlers by order of precedence.
        function d(a, b) { b ? setTimeout(a, b) : a() }
        // General function to register plugin handlers. Flushes buffers immediately upon registration according to the specified delay.
        function e(b, e, f) {
            // Do not add a handler if developerMode is true
            if (!j.developerMode) { p[b] = c(b, e, f); var g = j[b], h = g ? g.bufferFlushDelay : null, i = null !== h ? h : j.bufferFlushDelay; a.forEach(m[b], function (a, b) { d(function () { e.apply(this, a) }, b * i) }) }
        } function f(a) { return a.replace(/^./, function (a) { return a.toUpperCase() }) }
        // Adds to the provider a 'register#{handlerName}' function that manages multiple plugins and buffer flushing.
        function g(a) { var d = "register" + f(a); q[d] = function (b, c) { e(a, b, c) }, p[a] = c(a, b(a)) } function h(b, c, d) { a.forEach(c, d); for (var e in b) i[e] = b[e] } var i = this, j = {
            pageTracking: { autoTrackFirstPage: !0, autoTrackVirtualPages: !0, trackRelativePath: !1, trackRoutes: !0, trackStates: !0, autoBasePath: !1, basePath: "", excludedRoutes: [] }, eventTracking: {}, bufferFlushDelay: 1e3,// Support only one configuration for buffer flush delay to simplify buffering
            trackExceptions: !1, optOut: !1, developerMode: !1
        }, l = ["pageTrack", "eventTrack", "exceptionTrack", "transactionTrack", "setAlias", "setUsername", "setUserProperties", "setUserPropertiesOnce", "setSuperProperties", "setSuperPropertiesOnce", "incrementProperty", "userTimings", "clearCookies"], m = {}, n = {}, o = {}, p = { settings: j };
        // Opt in and opt out functions
        p.setOptOut = function (a) { this.settings.optOut = a, s() }, p.getOptOut = function () { return this.settings.optOut }; var q = { $get: ["$injector", function (a) { return r(a) }], api: p, settings: j, virtualPageviews: function (a) { this.settings.pageTracking.autoTrackVirtualPages = a }, trackStates: function (a) { this.settings.pageTracking.trackStates = a }, trackRoutes: function (a) { this.settings.pageTracking.trackRoutes = a }, excludeRoutes: function (a) { this.settings.pageTracking.excludedRoutes = a }, firstPageview: function (a) { this.settings.pageTracking.autoTrackFirstPage = a }, withBase: function (b) { this.settings.pageTracking.basePath = b ? a.element(document).find("base").attr("href") : "" }, withAutoBase: function (a) { this.settings.pageTracking.autoBasePath = a }, trackExceptions: function (a) { this.settings.trackExceptions = a }, developerMode: function (a) { this.settings.developerMode = a } }, r = function (b) { return a.extend(p, { $inject: b.invoke }) }, s = function () { h(q, l, g) };
        // Initial register
        h(q, l, g)
    } function d(b, c, d, e) {
        function f(a) { for (var b = 0; b < d.settings.pageTracking.excludedRoutes.length; b++) { var c = d.settings.pageTracking.excludedRoutes[b]; if (c instanceof RegExp && c.test(a) || a.indexOf(c) > -1) return !0 } return !1 } function g(a, b) { f(a) || d.pageTrack(a, b) } d.settings.pageTracking.autoTrackFirstPage && e.invoke(["$location", function (a) {/* Only track the 'first page' if there are no routes or states on the page */
            var b = !0; if (e.has("$route")) { var f = e.get("$route"); if (f) for (var h in f.routes) { b = !1; break } else null === f && (b = !1) } else if (e.has("$state")) { var i = e.get("$state"); for (var j in i.get()) { b = !1; break } } if (b) if (d.settings.pageTracking.autoBasePath && (d.settings.pageTracking.basePath = c.location.pathname), d.settings.pageTracking.trackRelativePath) { var k = d.settings.pageTracking.basePath + a.url(); g(k, a) } else g(a.absUrl(), a)
        }]), d.settings.pageTracking.autoTrackVirtualPages && e.invoke(["$location", function (a) {
            d.settings.pageTracking.autoBasePath && (/* Add the full route to the base. */
            d.settings.pageTracking.basePath = c.location.pathname + "#"); var f = !0; if (d.settings.pageTracking.trackRoutes && e.has("$route")) { var h = e.get("$route"); if (h) for (var i in h.routes) { f = !1; break } else null === h && (f = !1); b.$on("$routeChangeSuccess", function (b, c) { if (!c || !(c.$$route || c).redirectTo) { var e = d.settings.pageTracking.basePath + a.url(); g(e, a) } }) } d.settings.pageTracking.trackStates && (e.has("$state") && !e.has("$transitions") && (f = !1, b.$on("$stateChangeSuccess", function (b, c) { var e = d.settings.pageTracking.basePath + a.url(); g(e, a) })), e.has("$state") && e.has("$transitions") && (f = !1, e.invoke(["$transitions", function (b) {
                b.onSuccess({}, function (b) {
                    var c = b.options();
                    // only track for transitions that would have triggered $stateChangeSuccess
                    if (c.notify) { var e = d.settings.pageTracking.basePath + a.url(); g(e, a) }
                })
            }]))), f && b.$on("$locationChangeSuccess", function (b, c) { if (!c || !(c.$$route || c).redirectTo) if (d.settings.pageTracking.trackRelativePath) { var e = d.settings.pageTracking.basePath + a.url(); g(e, a) } else g(a.absUrl(), a) })
        }]), d.settings.developerMode && a.forEach(d, function (a, b) { "function" == typeof a && (d[b] = function () { }) })
    } function e(b) {
        return {
            restrict: "A", link: function (c, d, e) {
                var f = e.analyticsOn || "click", g = {}; a.forEach(e.$attr, function (a, b) { i(b) && (g[j(b)] = e[b], e.$observe(b, function (a) { g[j(b)] = a })) }), a.element(d[0]).bind(f, function (f) {
                    var i = e.analyticsEvent || h(d[0]); g.eventType = f.type, e.analyticsIf && !c.$eval(e.analyticsIf) || (
                    // Allow components to pass through an expression that gets merged on to the event properties
                    // eg. analytics-properites='myComponentScope.someConfigExpression.$analyticsProperties'
                    e.analyticsProperties && a.extend(g, c.$eval(e.analyticsProperties)), b.eventTrack(i, g))
                })
            }
        }
    } function f(a) { a.decorator("$exceptionHandler", ["$delegate", "$injector", function (a, b) { return function (c, d) { var e = a(c, d), f = b.get("$analytics"); return f.settings.trackExceptions && f.exceptionTrack(c, d), e } }]) } function g(a) { return ["a:", "button:", "button:button", "button:submit", "input:button", "input:submit"].indexOf(a.tagName.toLowerCase() + ":" + (a.type || "")) >= 0 } function h(a) { return g(a) ? a.innerText || a.value : a.id || a.name || a.tagName } function i(a) { return "analytics" === a.substr(0, 9) && ["On", "Event", "If", "Properties", "EventType"].indexOf(a.substr(9)) === -1 } function j(a) {
        var b = a.slice(9);// slice off the 'analytics' prefix
        // slice off the 'analytics' prefix
        return "undefined" != typeof b && null !== b && b.length > 0 ? b.substring(0, 1).toLowerCase() + b.substring(1) : b
    } var k = window.angulartics || (window.angulartics = {}); k.waitForVendorCount = 0, k.waitForVendorApi = function (a, b, c, d, e) { e || k.waitForVendorCount++, d || (d = c, c = void 0), !Object.prototype.hasOwnProperty.call(window, a) || void 0 !== c && void 0 === window[a][c] ? setTimeout(function () { k.waitForVendorApi(a, b, c, d, !0) }, b) : (k.waitForVendorCount--, d(window[a])) },/**
 * @ngdoc overview
 * @name angulartics
 */
    a.module("angulartics", []).provider("$analytics", c).run(["$rootScope", "$window", "$analytics", "$injector", d]).directive("analyticsOn", ["$analytics", e]).config(["$provide", f])
}(angular);


/**
 * @license Angulartics
 * (c) 2014 Luis Farzati http://luisfarzati.github.io/angulartics
 * License: MIT
 */
(function (angular) {
    'use strict';

    /**
     * @ngdoc overview
     * @name angulartics.debug
     * Enables analytics debugging to console
     */
    angular.module('angulartics.debug', ['angulartics'])
    .config(['$analyticsProvider', function ($analyticsProvider) {

        $analyticsProvider.registerPageTrack(function (path) {
            console.log('Page tracking: ', path);
        });

        /**
         * Track Event
         * @name eventTrack
         */
        $analyticsProvider.registerEventTrack(function (action, properties) {
            console.log("Event tracking: ", action, properties);
        });

        /**
         * Track Transaction
         * @name transactionTrack
         */
        $analyticsProvider.registerTransactionTrack(function (action, properties) {
            console.log("Transaction tracking: ", action, properties);
        });

    }]);
})(angular);;
! function (window, angular, undefined) {
    "use strict";
    angular.module("angulartics.google.analytics", ["angulartics"]).config(["$analyticsProvider", function ($analyticsProvider) {
        function detectUniversalAnalytics() {
            var gaNamespace = window.GoogleAnalyticsObject;
            return gaNamespace && window[gaNamespace]
        }

        function detectClassicAnalytics() {
            return !angular.isUndefined(window._gaq)
        }

        function dimensionsAndMetrics(properties) {
            var key, customData = {};
            for (key in properties) key.indexOf("dimension") && key.indexOf("metric") || (customData[key] = properties[key]);
            return customData
        }
        $analyticsProvider.settings.pageTracking.trackRelativePath = !0, $analyticsProvider.settings.ga = {
            additionalAccountNames: undefined,
            additionalAccountHitTypes: {
                pageview: !0,
                event: !0,
                exception: !1,
                ecommerce: !1,
                userTiming: !1,
                setUserProperties: !1,
                userId: !1
            },
            disableEventTracking: null,
            disablePageTracking: null,
            enhancedEcommerce: !1,
            transport: null,
            userId: null
        }, $analyticsProvider.registerPageTrack(function (path, properties) {
            properties = properties || {}, $analyticsProvider.settings.ga.disablePageTracking || dispatchToGa("pageview", "send", angular.extend({}, properties, {
                hitType: "pageview",
                page: path
            }))
        }), $analyticsProvider.registerEventTrack(function (action, properties) {
            if (!$analyticsProvider.settings.ga.disableEventTracking && (action || action + "" == "0")) {
                if (properties = properties || {}, properties.category = properties.category || "Event", properties.value) {
                    var parsed = parseInt(properties.value, 10);
                    properties.value = isNaN(parsed) ? 0 : parsed
                }
                angular.isFunction(properties.hitCallback) || (properties.hitCallback = null), properties.nonInteraction = properties.nonInteraction || properties.noninteraction, dispatchToGa("event", "send", angular.extend({}, properties, {
                    hitType: "event",
                    eventCategory: properties.category,
                    eventAction: action,
                    eventLabel: properties.label,
                    eventValue: properties.value,
                    nonInteraction: properties.nonInteraction,
                    page: properties.page || window.location.hash.substring(1) || window.location.pathname,
                    hitCallback: properties.hitCallback
                }))
            }
        }), $analyticsProvider.registerExceptionTrack(function (error, cause) {
            dispatchToGa("exception", "send", {
                hitType: "event",
                eventCategory: "Exceptions",
                eventAction: error.toString(),
                eventLabel: error.stack,
                nonInteraction: !0,
                page: window.location.hash.substring(1) || window.location.pathname,
                isException: !0
            })
        }), $analyticsProvider.registerSetUsername(function (userId) {
            $analyticsProvider.settings.ga.userId = userId
        }), $analyticsProvider.registerSetUserProperties(function (properties) {
            properties && dispatchToGa("setUserProperties", "set", dimensionsAndMetrics(properties))
        }), $analyticsProvider.registerUserTimings(function (properties) {
            return !angular.isObject(properties) || angular.isArray(properties) ? console.log("Required argument properties is missing or not an object") : (angular.forEach(["timingCategory", "timingVar", "timingValue"], function (prop) {
                if (angular.isUndefined(properties[prop])) return console.log("Argument properties missing required property " + prop)
            }), void dispatchToGa("userTiming", "send", {
                hitType: "timing",
                timingCategory: properties.timingCategory,
                timingVar: properties.timingVar,
                timingValue: properties.timingValue,
                timingLabel: properties.timingLabel,
                optSampleRate: properties.optSampleRate,
                page: properties.page || window.location.hash.substring(1) || window.location.pathname
            }))
        }), $analyticsProvider.registerTransactionTrack(function (transaction) {
            var product, i, transactionToSend;
            transactionToSend = angular.copy(transaction);
            delete transactionToSend.products;
            if (dispatchToGa("ecommerce", "require", "ecommerce"), dispatchToGa("ecommerce", "ecommerce:addTransaction", transactionToSend), transaction.products)
                for (i = 0; i < transaction.products.length; i++) {
                    product = transaction.products[i],
                    product.sku = transaction.products[i].sku || product.id,
                    product.id = transaction.products[i].id || transaction.id,
                    dispatchToGa("ecommerce", "ecommerce:addItem", transaction.products[i]);
                }
            transaction.currencyCode && dispatchToGa("ecommerce", "_set", transaction.currencyCode), dispatchToGa("ecommerce", "ecommerce:send", angular.copy(transactionToSend))
        });
        var dispatchToGa = function () {
            function dispatchToUniversal_(command, fieldsObj, shouldCopyHit) {
                var uaCommand, pluginName, userId = $analyticsProvider.settings.ga.userId;
                if ("require" === command && "ecommerce" === fieldsObj) return pluginName = fieldsObj, $analyticsProvider.settings.ga.enhancedEcommerce && (pluginName = "ec"), applyUniversalCall_([command, pluginName], shouldCopyHit);
                if (userId && angular.isObject(fieldsObj) && (fieldsObj.userId = userId), $analyticsProvider.settings.ga.transport && (fieldsObj.transport = $analyticsProvider.settings.ga.transport), command.indexOf("ecommerce:") > -1 && $analyticsProvider.settings.ga.enhancedEcommerce) switch (command) {
                    case "ecommerce:addTransaction":
                        command = ["ec:setAction", "purchase"];
                        break;
                    case "ecommerce:addItem":
                        command = "ec:addProduct", fieldsObj.id = fieldsObj.sku;
                        break;
                    case "ecommerce:send":
                        command = "send", fieldsObj.hitType = "event", fieldsObj.eventCategory = "Angulartics Enhanced Ecommerce", fieldsObj.eventAction = "Purchase", fieldsObj.nonInteraction = !0
                }
                uaCommand = command instanceof Array ? command.concat(fieldsObj) : [command, fieldsObj], applyUniversalCall_(uaCommand, shouldCopyHit)
            }

            function applyUniversalCall_(commandArray, shouldCopyHit) {
                var commandClone, userId = $analyticsProvider.settings.ga.userId,
                    gaNamespace = window.GoogleAnalyticsObject;
                window[gaNamespace].apply(this, commandArray), shouldCopyHit && (commandClone = angular.copy(commandArray), userId && !$analyticsProvider.settings.ga.additionalAccountHitTypes.userId && commandClone[2] && "object" == typeof commandClone[2] && delete commandClone[2].userId, angular.forEach($analyticsProvider.settings.ga.additionalAccountNames, function (accountName) {
                    commandClone[0] = accountName + "." + commandClone[0], window[gaNamespace].apply(this, commandClone)
                }))
            }

            function dispatchToClassic_(command, fieldsObj, shouldCopyHit) {
                if ("set" === command) return console.log('Classic Analytics does not support the "set" command or Custom Dimensions. Command ignored.');
                var classicCommand;
                if ("send" === command) switch (fieldsObj.hitType) {
                    case "pageview":
                        classicCommand = ["_trackPageview", fieldsObj.page];
                        break;
                    case "event":
                        classicCommand = ["_trackEvent", fieldsObj.category, fieldsObj.action, fieldsObj.label, fieldsObj.value, fieldsObj.nonInteraction];
                        break;
                    case "timing":
                        classicCommand = ["_trackTiming", fieldsObj.timingCategory, fieldsObj.timingVar, fieldsObj.timingValue, fieldsObj.timingLabel, fieldsObj.optSampleRate]
                }
                return "ecommerce:addTransaction" === command && (classicCommand = ["_addTrans", fieldsObj.id, fieldsObj.affiliation, fieldsObj.revenue, fieldsObj.tax, fieldsObj.shipping, fieldsObj.billingCity, fieldsObj.billingRegion, fieldsObj.billingCountry]), "ecommerce:addItem" === command && (classicCommand = ["_addItem", fieldsObj.id, fieldsObj.sku, fieldsObj.name, fieldsObj.category, fieldsObj.price, fieldsObj.quantity]), "_set" === command && (classicCommand = ["_set", "currencyCode", fieldsObj]), "ecommerce:send" === command && (classicCommand = ["_trackTrans"]), classicCommand ? (window._gaq.push(classicCommand), void (shouldCopyHit && angular.forEach($analyticsProvider.settings.ga.additionalAccountNames, function (accountName) {
                    var classicCommandClone = [].slice.call(classicCommand);
                    classicCommandClone[0] = accountName + "." + classicCommandClone[0], window._gaq.push(classicCommandClone)
                }))) : console.log("Unable to find command " + command + " or fieldsObj missing required properties. Command ignored.")
            }
            var handler;
            return detectClassicAnalytics() && (handler = dispatchToClassic_), detectUniversalAnalytics() && (handler = dispatchToUniversal_), handler ? function (method, command, fieldsObj) {
                var shouldCopyHit = $analyticsProvider.settings.ga.additionalAccountHitTypes[method];
                handler(command, fieldsObj, shouldCopyHit)
            } : angular.noop
        }()
    }])
}(window, window.angular);
//# sourceMappingURL=../dist/angulartics-ga.min.js.mapa;
!function(window,angular,undefined){"use strict";angular.module("angulartics.facebook.pixel",["angulartics"]).config(["$analyticsProvider",function($analyticsProvider){$analyticsProvider.settings.pageTracking.trackRelativePath=!0,$analyticsProvider.registerPageTrack(function(path){window.fbq&&fbq("track","PageView")}),$analyticsProvider.registerEventTrack(function(action,properties){properties=properties||{};var eventList=["ViewContent","Search","AddToCart","AddToWishlist","InitiateCheckout","AddPaymentInfo","Purchase","Lead","CompleteRegistration"];window.fbq&&(-1===eventList.indexOf(action)?fbq("trackCustom",action,properties):fbq("track",action,properties))})}])}(window,window.angular);
//# sourceMappingURL=../dist/angulartics-facebook-pixel.min.js.map;
(function (window, angular, undefined) {
    'use strict';
    angular.module('angulartics.snapchat.pixel', ['angulartics'])
        .config(['$analyticsProvider', function ($analyticsProvider) {
            $analyticsProvider.settings.pageTracking.trackRelativePath = true;
            $analyticsProvider.registerEventTrack(function (action, properties) {
                properties = properties || {};
                var eventList = [
                    'purchase', 'page_view', 'view_content', 'add_cart', 'sign_up'];
                if (window.snaptr) {
                    if (action.toLowerCase() === 'addtocart') {
                        snaptr('track', 'ADD_CART', properties);
                    }
                    else if (action.toLowerCase() === 'initiatecheckout') {
                        snaptr('track', 'START_CHECKOUT', properties);
                    }
                    else if (eventList.indexOf(action.toLowerCase()) === -1) {
                        properties.description = action;
                        snaptr('track', 'VIEW_CONTENT', properties);
                    }                   
                    else {
                        if (action.toLowerCase() === 'purchase') {
                            properties.price = properties.value;
                        }
                        snaptr('track', action.toUpperCase(), properties);
                    }
                }
            });

        }]);
})(window, window.angular);;
(function (window, angular, undefined) {
    'use strict';
    angular.module('angulartics-twitter-pixel', ['angulartics'])
        .config(['$analyticsProvider', function ($analyticsProvider) {
            $analyticsProvider.settings.pageTracking.trackRelativePath = true;
            $analyticsProvider.registerEventTrack(function (action, properties) {
                properties = properties || {};
                if (window.twq) {
                    twq('track', action);
                }
            });

        }]);
})(window, window.angular);;
    /**
     * @license Angulartics v0.19.2
     * (c) 2013 Luis Farzati http://luisfarzati.github.io/angulartics
     * Google Tag Manager Plugin Contributed by http://github.com/danrowe49
     * License: MIT
     */

    (function (angular) {
        'use strict';


        /**
         * @ngdoc overview
         * @name angulartics.google.analytics
         * Enables analytics support for Google Tag Manager (http://google.com/tagmanager)
         */

        angular.module('angulartics.google.tagmanager', ['angulartics'])
            .config(['$analyticsProvider', function ($analyticsProvider) {

                $analyticsProvider.settings.ga = {
                    userId: null
                };

                /**
                 * Send content views to the dataLayer
                 *
                 * @param {string} path Required 'content name' (string) describes the content loaded
                 */

                $analyticsProvider.registerPageTrack(function (path) {
                    var dataLayer = window.dataLayer = window.dataLayer || [];
                    dataLayer.push({
                        'event': 'content-view',
                        'content-name': path,
                        'userId': $analyticsProvider.settings.ga.userId
                    });
                });

                /**
                 * Send interactions to the dataLayer, i.e. for event tracking in Google Analytics
                 * @name eventTrack
                 *
                 * @param {string} action Required 'action' (string) associated with the event
                 * @param {object} properties Comprised of the mandatory field 'category' (string) and optional  fields 'label' (string), 'value' (integer) and 'noninteraction' (boolean)
                 */

                $analyticsProvider.registerEventTrack(eventTrack);

                function eventTrack(action, properties) {
                    var dataLayer = window.dataLayer = window.dataLayer || [];
                    properties = properties || {};
                    dataLayer.push({
                        'event': properties.event || 'interaction',
                        'target': properties.category,
                        'action': action,
                        'target-properties': properties.label,
                        'value': properties.value,
                        'interaction-type': properties.noninteraction,
                        'userId': $analyticsProvider.settings.ga.userId
                    });

                }

                /**
                 * Send exceptions to the dataLayer, reusing the existing Event Tracking tag in GTM
                 * @name exceptionTrack
                 *
                 * @param {object} error An Error object to track: error.toString() used for event 'action', error.stack used for event 'label'.
                 * @param {object} cause The cause of the error given from $exceptionHandler, not used
                 */

                $analyticsProvider.registerExceptionTrack(function (error, cause) {

                    eventTrack(error.toString(), {
                        'category': 'Exceptions',
                        'label': error.stack
                    });

                });

                /**
                 * Set userId for use with Universal Analytics User ID feature
                 * @name setUsername
                 * 
                 * @param {string} userId Required 'userId' value (string) used to identify user cross-device in Google Analytics
                 */

                $analyticsProvider.registerSetUsername(function (userId) {
                    $analyticsProvider.settings.ga.userId = userId;
                });

            }]);

    })(angular);
;
/**
 * Bunch of useful filters for angularJS(with no external dependencies!)
 * @version v0.5.17 - 2017-09-22 * @link https://github.com/a8m/angular-filter
 * @author Ariel Mashraki <ariel@mashraki.co.il>
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */!function(a,b,c){"use strict";function d(a){return E(a)?a:Object.keys(a).map(function(b){return a[b]})}function e(a){return null===a}function f(a,b){var d=Object.keys(a);return d.map(function(d){return b[d]!==c&&b[d]==a[d]}).indexOf(!1)==-1}function g(a,b){function c(a,b,c){for(var d=0;b+d<=a.length;){if(a.charAt(b+d)==c)return d;d++}return-1}for(var d=0,e=0;e<=b.length;e++){var f=c(a,d,b.charAt(e));if(f==-1)return!1;d+=f+1}return!0}function h(a,b,c){var d=0;return a.filter(function(a){var e=y(c)?d<b&&c(a):d<b;return d=e?d+1:d,e})}function i(a,b){return Math.round(a*Math.pow(10,b))/Math.pow(10,b)}function j(a,b,c){b=b||[];var d=Object.keys(a);return d.forEach(function(d){if(D(a[d])&&!E(a[d])){var e=c?c+"."+d:c;j(a[d],b,e||d)}else{var f=c?c+"."+d:d;b.push(f)}}),b}function k(a){return a&&a.$evalAsync&&a.$watch}function l(){return function(a,b){return a>b}}function m(){return function(a,b){return a>=b}}function n(){return function(a,b){return a<b}}function o(){return function(a,b){return a<=b}}function p(){return function(a,b){return a==b}}function q(){return function(a,b){return a!=b}}function r(){return function(a,b){return a===b}}function s(){return function(a,b){return a!==b}}function t(a){return function(b,c){return b=D(b)?d(b):b,!(!E(b)||z(c))&&b.some(function(b){return B(c)&&D(b)||A(c)?a(c)(b):b===c})}}function u(a,b){return b=b||0,b>=a.length?a:E(a[b])?u(a.slice(0,b).concat(a[b],a.slice(b+1)),b):u(a,b+1)}function v(a){return function(b,c){function e(a,b){return!z(b)&&a.some(function(a){return I(a,b)})}if(b=D(b)?d(b):b,!E(b))return b;var f=[],g=a(c);return z(c)?b.filter(function(a,b,c){return c.indexOf(a)===b}):b.filter(function(a){var b=g(a);return!e(f,b)&&(f.push(b),!0)})}}function w(a,b,c){return b?a+c+w(a,--b,c):a}function x(){return function(a){return B(a)?a.split(" ").map(function(a){return a.charAt(0).toUpperCase()+a.substring(1)}).join(" "):a}}var y=b.isDefined,z=b.isUndefined,A=b.isFunction,B=b.isString,C=b.isNumber,D=b.isObject,E=b.isArray,F=b.forEach,G=b.extend,H=b.copy,I=b.equals;String.prototype.contains||(String.prototype.contains=function(){return String.prototype.indexOf.apply(this,arguments)!==-1}),b.module("a8m.angular",[]).filter("isUndefined",function(){return function(a){return b.isUndefined(a)}}).filter("isDefined",function(){return function(a){return b.isDefined(a)}}).filter("isFunction",function(){return function(a){return b.isFunction(a)}}).filter("isString",function(){return function(a){return b.isString(a)}}).filter("isNumber",function(){return function(a){return b.isNumber(a)}}).filter("isArray",function(){return function(a){return b.isArray(a)}}).filter("isObject",function(){return function(a){return b.isObject(a)}}).filter("isEqual",function(){return function(a,c){return b.equals(a,c)}}),b.module("a8m.conditions",[]).filter({isGreaterThan:l,">":l,isGreaterThanOrEqualTo:m,">=":m,isLessThan:n,"<":n,isLessThanOrEqualTo:o,"<=":o,isEqualTo:p,"==":p,isNotEqualTo:q,"!=":q,isIdenticalTo:r,"===":r,isNotIdenticalTo:s,"!==":s}),b.module("a8m.is-null",[]).filter("isNull",function(){return function(a){return e(a)}}),b.module("a8m.after-where",[]).filter("afterWhere",function(){return function(a,b){if(a=D(a)?d(a):a,!E(a)||z(b))return a;var c=a.map(function(a){return f(b,a)}).indexOf(!0);return a.slice(c===-1?0:c)}}),b.module("a8m.after",[]).filter("after",function(){return function(a,b){return a=D(a)?d(a):a,E(a)?a.slice(b):a}}),b.module("a8m.before-where",[]).filter("beforeWhere",function(){return function(a,b){if(a=D(a)?d(a):a,!E(a)||z(b))return a;var c=a.map(function(a){return f(b,a)}).indexOf(!0);return a.slice(0,c===-1?a.length:++c)}}),b.module("a8m.before",[]).filter("before",function(){return function(a,b){return a=D(a)?d(a):a,E(a)?a.slice(0,b?--b:b):a}}),b.module("a8m.chunk-by",["a8m.filter-watcher"]).filter("chunkBy",["filterWatcher",function(a){return function(b,c,d){function e(a,b){for(var c=[];a--;)c[a]=b;return c}function f(a,b,c){return E(a)?a.map(function(a,d,f){return d*=b,a=f.slice(d,d+b),!z(c)&&a.length<b?a.concat(e(b-a.length,c)):a}).slice(0,Math.ceil(a.length/b)):a}return a.isMemoized("chunkBy",arguments)||a.memoize("chunkBy",arguments,this,f(b,c,d))}}]),b.module("a8m.concat",[]).filter("concat",[function(){return function(a,b){if(z(b))return a;if(E(a))return D(b)?a.concat(d(b)):a.concat(b);if(D(a)){var c=d(a);return D(b)?c.concat(d(b)):c.concat(b)}return a}}]),b.module("a8m.contains",[]).filter({contains:["$parse",t],some:["$parse",t]}),b.module("a8m.count-by",[]).filter("countBy",["$parse",function(a){return function(b,c){var e,f={},g=a(c);return b=D(b)?d(b):b,!E(b)||z(c)?b:(b.forEach(function(a){e=g(a),f[e]||(f[e]=0),f[e]++}),f)}}]),b.module("a8m.defaults",[]).filter("defaults",["$parse",function(a){return function(b,c){if(b=D(b)?d(b):b,!E(b)||!D(c))return b;var e=j(c);return b.forEach(function(b){e.forEach(function(d){var e=a(d),f=e.assign;z(e(b))&&f(b,e(c))})}),b}}]),b.module("a8m.every",[]).filter("every",["$parse",function(a){return function(b,c){return b=D(b)?d(b):b,!(E(b)&&!z(c))||b.every(function(b){return D(b)||A(c)?a(c)(b):b===c})}}]),b.module("a8m.filter-by",[]).filter("filterBy",["$parse",function(a){return function(b,e,f,g){var h;return f=B(f)||C(f)?String(f).toLowerCase():c,b=D(b)?d(b):b,!E(b)||z(f)?b:b.filter(function(b){return e.some(function(c){if(~c.indexOf("+")){var d=c.replace(/\s+/g,"").split("+");h=d.map(function(c){return a(c)(b)}).join(" ")}else h=a(c)(b);return!(!B(h)&&!C(h))&&(h=String(h).toLowerCase(),g?h===f:h.contains(f))})})}}]),b.module("a8m.first",[]).filter("first",["$parse",function(a){return function(b){var e,f,g;return b=D(b)?d(b):b,E(b)?(g=Array.prototype.slice.call(arguments,1),e=C(g[0])?g[0]:1,f=C(g[0])?C(g[1])?c:g[1]:g[0],g.length?h(b,e,f?a(f):f):b[0]):b}}]),b.module("a8m.flatten",[]).filter("flatten",function(){return function(a,b){return b=b||!1,a=D(a)?d(a):a,E(a)?b?[].concat.apply([],a):u(a,0):a}}),b.module("a8m.fuzzy-by",[]).filter("fuzzyBy",["$parse",function(a){return function(b,c,e,f){var h,i,j=f||!1;return b=D(b)?d(b):b,!E(b)||z(c)||z(e)?b:(i=a(c),b.filter(function(a){return h=i(a),!!B(h)&&(h=j?h:h.toLowerCase(),e=j?e:e.toLowerCase(),g(h,e)!==!1)}))}}]),b.module("a8m.fuzzy",[]).filter("fuzzy",function(){return function(a,b,c){function e(a,b){var c,d,e=Object.keys(a);return 0<e.filter(function(e){return c=a[e],!!d||!!B(c)&&(c=f?c:c.toLowerCase(),d=g(c,b)!==!1)}).length}var f=c||!1;return a=D(a)?d(a):a,!E(a)||z(b)?a:(b=f?b:b.toLowerCase(),a.filter(function(a){return B(a)?(a=f?a:a.toLowerCase(),g(a,b)!==!1):!!D(a)&&e(a,b)}))}}),b.module("a8m.group-by",["a8m.filter-watcher"]).filter("groupBy",["$parse","filterWatcher",function(a,b){return function(c,d){function e(a,b){var c,d={};return F(a,function(a){c=b(a),d[c]||(d[c]=[]),d[c].push(a)}),d}return!D(c)||z(d)?c:b.isMemoized("groupBy",arguments)||b.memoize("groupBy",arguments,this,e(c,a(d)))}}]),b.module("a8m.is-empty",[]).filter("isEmpty",function(){return function(a){return D(a)?!d(a).length:!a.length}}),b.module("a8m.join",[]).filter("join",function(){return function(a,b){return z(a)||!E(a)?a:(z(b)&&(b=" "),a.join(b))}}),b.module("a8m.last",[]).filter("last",["$parse",function(a){return function(b){var e,f,g,i=H(b);return i=D(i)?d(i):i,E(i)?(g=Array.prototype.slice.call(arguments,1),e=C(g[0])?g[0]:1,f=C(g[0])?C(g[1])?c:g[1]:g[0],g.length?h(i.reverse(),e,f?a(f):f).reverse():i[i.length-1]):i}}]),b.module("a8m.map",[]).filter("map",["$parse",function(a){return function(b,c){return b=D(b)?d(b):b,!E(b)||z(c)?b:b.map(function(b){return a(c)(b)})}}]),b.module("a8m.omit",[]).filter("omit",["$parse",function(a){return function(b,c){return b=D(b)?d(b):b,!E(b)||z(c)?b:b.filter(function(b){return!a(c)(b)})}}]),b.module("a8m.pick",[]).filter("pick",["$parse",function(a){return function(b,c){return b=D(b)?d(b):b,!E(b)||z(c)?b:b.filter(function(b){return a(c)(b)})}}]),b.module("a8m.range",[]).filter("range",function(){return function(a,b,c,d,e){c=c||0,d=d||1;for(var f=0;f<parseInt(b);f++){var g=c+f*d;a.push(A(e)?e(g):g)}return a}}),b.module("a8m.remove-with",[]).filter("removeWith",function(){return function(a,b){return z(b)?a:(a=D(a)?d(a):a,a.filter(function(a){return!f(b,a)}))}}),b.module("a8m.remove",[]).filter("remove",function(){return function(a){a=D(a)?d(a):a;var b=Array.prototype.slice.call(arguments,1);return E(a)?a.filter(function(a){return!b.some(function(b){return I(b,a)})}):a}}),b.module("a8m.reverse",[]).filter("reverse",[function(){return function(a){return a=D(a)?d(a):a,B(a)?a.split("").reverse().join(""):E(a)?a.slice().reverse():a}}]),b.module("a8m.search-field",[]).filter("searchField",["$parse",function(a){return function(b){var c,e;b=D(b)?d(b):b;var f=Array.prototype.slice.call(arguments,1);return E(b)&&f.length?b.map(function(b){return e=f.map(function(d){return(c=a(d))(b)}).join(" "),G(b,{searchField:e})}):b}}]),b.module("a8m.to-array",[]).filter("toArray",function(){return function(a,b){return D(a)?b?Object.keys(a).map(function(b){return G(a[b],{$key:b})}):d(a):a}}),b.module("a8m.unique",[]).filter({unique:["$parse",v],uniq:["$parse",v]}),b.module("a8m.where",[]).filter("where",function(){return function(a,b){return z(b)?a:(a=D(a)?d(a):a,a.filter(function(a){return f(b,a)}))}}),b.module("a8m.xor",[]).filter("xor",["$parse",function(a){return function(b,c,e){function f(b,c){var d=a(e);return c.some(function(a){return e?I(d(a),d(b)):I(a,b)})}return e=e||!1,b=D(b)?d(b):b,c=D(c)?d(c):c,E(b)&&E(c)?b.concat(c).filter(function(a){return!(f(a,b)&&f(a,c))}):b}}]),b.module("a8m.math.abs",[]).filter("abs",function(){return function(a){return Math.abs(a)}}),b.module("a8m.math.byteFmt",[]).filter("byteFmt",function(){var a=[{str:"B",val:1024}];return["KB","MB","GB","TB","PB","EB","ZB","YB"].forEach(function(b,c){a.push({str:b,val:1024*a[c].val})}),function(b,c){if(C(c)&&isFinite(c)&&c%1===0&&c>=0&&C(b)&&isFinite(b)){for(var d=0;d<a.length-1&&b>=a[d].val;)d++;return b/=d>0?a[d-1].val:1,i(b,c)+" "+a[d].str}return"NaN"}}),b.module("a8m.math.degrees",[]).filter("degrees",function(){return function(a,b){if(C(b)&&isFinite(b)&&b%1===0&&b>=0&&C(a)&&isFinite(a)){var c=180*a/Math.PI;return Math.round(c*Math.pow(10,b))/Math.pow(10,b)}return"NaN"}}),b.module("a8m.math.kbFmt",[]).filter("kbFmt",function(){var a=[{str:"KB",val:1024}];return["MB","GB","TB","PB","EB","ZB","YB"].forEach(function(b,c){a.push({str:b,val:1024*a[c].val})}),function(b,c){if(C(c)&&isFinite(c)&&c%1===0&&c>=0&&C(b)&&isFinite(b)){for(var d=0;d<a.length-1&&b>=a[d].val;)d++;return b/=d>0?a[d-1].val:1,i(b,c)+" "+a[d].str}return"NaN"}}),b.module("a8m.math.max",[]).filter("max",["$parse",function(a){function b(b,c){var d=b.map(function(b){return a(c)(b)});return d.indexOf(Math.max.apply(Math,d))}return function(a,c){return E(a)?z(c)?Math.max.apply(Math,a):a[b(a,c)]:a}}]),b.module("a8m.math.min",[]).filter("min",["$parse",function(a){function b(b,c){var d=b.map(function(b){return a(c)(b)});return d.indexOf(Math.min.apply(Math,d))}return function(a,c){return E(a)?z(c)?Math.min.apply(Math,a):a[b(a,c)]:a}}]),b.module("a8m.math.percent",[]).filter("percent",function(){return function(a,b,c){var d=B(a)?Number(a):a;return b=b||100,c=c||!1,!C(d)||isNaN(d)?a:c?Math.round(d/b*100):d/b*100}}),b.module("a8m.math.radians",[]).filter("radians",function(){return function(a,b){if(C(b)&&isFinite(b)&&b%1===0&&b>=0&&C(a)&&isFinite(a)){var c=3.14159265359*a/180;return Math.round(c*Math.pow(10,b))/Math.pow(10,b)}return"NaN"}}),b.module("a8m.math.radix",[]).filter("radix",function(){return function(a,b){var c=/^[2-9]$|^[1-2]\d$|^3[0-6]$/;return C(a)&&c.test(b)?a.toString(b).toUpperCase():a}}),b.module("a8m.math.shortFmt",[]).filter("shortFmt",function(){return function(a,b){return C(b)&&isFinite(b)&&b%1===0&&b>=0&&C(a)&&isFinite(a)?a<1e3?""+a:a<1e6?i(a/1e3,b)+" K":a<1e9?i(a/1e6,b)+" M":i(a/1e9,b)+" B":"NaN"}}),b.module("a8m.math.sum",[]).filter("sum",function(){return function(a,b){return E(a)?a.reduce(function(a,b){return a+b},b||0):a}}),b.module("a8m.ends-with",[]).filter("endsWith",function(){return function(a,b,c){var d,e=c||!1;return!B(a)||z(b)?a:(a=e?a:a.toLowerCase(),d=a.length-b.length,a.indexOf(e?b:b.toLowerCase(),d)!==-1)}}),b.module("a8m.latinize",[]).filter("latinize",[function(){function a(a){return a.replace(/[^\u0000-\u007E]/g,function(a){return c[a]||a})}for(var b=[{base:"A",letters:"AⒶＡÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ"},{base:"AA",letters:"Ꜳ"},{base:"AE",letters:"ÆǼǢ"},{base:"AO",letters:"Ꜵ"},{base:"AU",letters:"Ꜷ"},{base:"AV",letters:"ꜸꜺ"},{base:"AY",letters:"Ꜽ"},{base:"B",letters:"BⒷＢḂḄḆɃƂƁ"},{base:"C",letters:"CⒸＣĆĈĊČÇḈƇȻꜾ"},{base:"D",letters:"DⒹＤḊĎḌḐḒḎĐƋƊƉꝹ"},{base:"DZ",letters:"ǱǄ"},{base:"Dz",letters:"ǲǅ"},{base:"E",letters:"EⒺＥÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ"},{base:"F",letters:"FⒻＦḞƑꝻ"},{base:"G",letters:"GⒼＧǴĜḠĞĠǦĢǤƓꞠꝽꝾ"},{base:"H",letters:"HⒽＨĤḢḦȞḤḨḪĦⱧⱵꞍ"},{base:"I",letters:"IⒾＩÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ"},{base:"J",letters:"JⒿＪĴɈ"},{base:"K",letters:"KⓀＫḰǨḲĶḴƘⱩꝀꝂꝄꞢ"},{base:"L",letters:"LⓁＬĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ"},{base:"LJ",letters:"Ǉ"},{base:"Lj",letters:"ǈ"},{base:"M",letters:"MⓂＭḾṀṂⱮƜ"},{base:"N",letters:"NⓃＮǸŃÑṄŇṆŅṊṈȠƝꞐꞤ"},{base:"NJ",letters:"Ǌ"},{base:"Nj",letters:"ǋ"},{base:"O",letters:"OⓄＯÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ"},{base:"OI",letters:"Ƣ"},{base:"OO",letters:"Ꝏ"},{base:"OU",letters:"Ȣ"},{base:"OE",letters:"Œ"},{base:"oe",letters:"œ"},{base:"P",letters:"PⓅＰṔṖƤⱣꝐꝒꝔ"},{base:"Q",letters:"QⓆＱꝖꝘɊ"},{base:"R",letters:"RⓇＲŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ"},{base:"S",letters:"SⓈＳẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ"},{base:"T",letters:"TⓉＴṪŤṬȚŢṰṮŦƬƮȾꞆ"},{base:"TZ",letters:"Ꜩ"},{base:"U",letters:"UⓊＵÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ"},{base:"V",letters:"VⓋＶṼṾƲꝞɅ"},{base:"VY",letters:"Ꝡ"},{base:"W",letters:"WⓌＷẀẂŴẆẄẈⱲ"},{base:"X",letters:"XⓍＸẊẌ"},{base:"Y",letters:"YⓎＹỲÝŶỸȲẎŸỶỴƳɎỾ"},{base:"Z",letters:"ZⓏＺŹẐŻŽẒẔƵȤⱿⱫꝢ"},{base:"a",letters:"aⓐａẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ"},{base:"aa",letters:"ꜳ"},{base:"ae",letters:"æǽǣ"},{base:"ao",letters:"ꜵ"},{base:"au",letters:"ꜷ"},{base:"av",letters:"ꜹꜻ"},{base:"ay",letters:"ꜽ"},{base:"b",letters:"bⓑｂḃḅḇƀƃɓ"},{base:"c",letters:"cⓒｃćĉċčçḉƈȼꜿↄ"},{base:"d",letters:"dⓓｄḋďḍḑḓḏđƌɖɗꝺ"},{base:"dz",letters:"ǳǆ"},{base:"e",letters:"eⓔｅèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ"},{base:"f",letters:"fⓕｆḟƒꝼ"},{base:"g",letters:"gⓖｇǵĝḡğġǧģǥɠꞡᵹꝿ"},{base:"h",letters:"hⓗｈĥḣḧȟḥḩḫẖħⱨⱶɥ"},{base:"hv",letters:"ƕ"},{base:"i",letters:"iⓘｉìíîĩīĭïḯỉǐȉȋịįḭɨı"},{base:"j",letters:"jⓙｊĵǰɉ"},{base:"k",letters:"kⓚｋḱǩḳķḵƙⱪꝁꝃꝅꞣ"},{base:"l",letters:"lⓛｌŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ"},{base:"lj",letters:"ǉ"},{base:"m",letters:"mⓜｍḿṁṃɱɯ"},{base:"n",letters:"nⓝｎǹńñṅňṇņṋṉƞɲŉꞑꞥ"},{base:"nj",letters:"ǌ"},{base:"o",letters:"oⓞｏòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ"},{base:"oi",letters:"ƣ"},{base:"ou",letters:"ȣ"},{base:"oo",letters:"ꝏ"},{base:"p",letters:"pⓟｐṕṗƥᵽꝑꝓꝕ"},{base:"q",letters:"qⓠｑɋꝗꝙ"},{base:"r",letters:"rⓡｒŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ"},{base:"s",letters:"sⓢｓßśṥŝṡšṧṣṩșşȿꞩꞅẛ"},{base:"t",letters:"tⓣｔṫẗťṭțţṱṯŧƭʈⱦꞇ"},{base:"tz",letters:"ꜩ"},{base:"u",letters:"uⓤｕùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ"},{base:"v",letters:"vⓥｖṽṿʋꝟʌ"},{base:"vy",letters:"ꝡ"},{base:"w",letters:"wⓦｗẁẃŵẇẅẘẉⱳ"},{base:"x",letters:"xⓧｘẋẍ"},{base:"y",letters:"yⓨｙỳýŷỹȳẏÿỷẙỵƴɏỿ"},{base:"z",letters:"zⓩｚźẑżžẓẕƶȥɀⱬꝣ"}],c={},d=0;d<b.length;d++)for(var e=b[d].letters.split(""),f=0;f<e.length;f++)c[e[f]]=b[d].base;return function(b){return B(b)?a(b):b}}]),b.module("a8m.ltrim",[]).filter("ltrim",function(){return function(a,b){var c=b||"\\s";return B(a)?a.replace(new RegExp("^"+c+"+"),""):a}}),b.module("a8m.match",[]).filter("match",function(){return function(a,b,c){var d=new RegExp(b,c);return B(a)?a.match(d):null}}),b.module("a8m.phoneUS",[]).filter("phoneUS",function(){return function(a){return a+="","("+a.slice(0,3)+") "+a.slice(3,6)+"-"+a.slice(6)}}),b.module("a8m.repeat",[]).filter("repeat",[function(){return function(a,b,c){var d=~~b;return B(a)&&d?w(a,--b,c||""):a}}]),b.module("a8m.rtrim",[]).filter("rtrim",function(){return function(a,b){var c=b||"\\s";return B(a)?a.replace(new RegExp(c+"+$"),""):a}}),b.module("a8m.slugify",[]).filter("slugify",[function(){return function(a,b){var c=z(b)?"-":b;return B(a)?a.toLowerCase().replace(/\s+/g,c):a}}]),b.module("a8m.split",[]).filter("split",function(){function a(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}return function(b,c,d){var f,g,h,i;return z(b)||!B(b)?null:(z(c)&&(c=""),isNaN(d)&&(d=0),f=new RegExp(a(c),"g"),g=b.match(f),e(g)||d>=g.length?[b]:0===d?b.split(c):(h=b.split(c),i=h.splice(0,d+1),h.unshift(i.join(c)),h))}}),b.module("a8m.starts-with",[]).filter("startsWith",function(){return function(a,b,c){var d=c||!1;return!B(a)||z(b)?a:(a=d?a:a.toLowerCase(),!a.indexOf(d?b:b.toLowerCase()))}}),b.module("a8m.stringular",[]).filter("stringular",function(){return function(a){var b=Array.prototype.slice.call(arguments,1);return a.replace(/{(\d+)}/g,function(a,c){return z(b[c])?a:b[c]})}}),b.module("a8m.strip-tags",[]).filter("stripTags",function(){return function(a){return B(a)?a.replace(/<\S[^><]*>/g,""):a}}),b.module("a8m.test",[]).filter("test",function(){return function(a,b,c){var d=new RegExp(b,c);return B(a)?d.test(a):a}}),b.module("a8m.trim",[]).filter("trim",function(){return function(a,b){var c=b||"\\s";return B(a)?a.replace(new RegExp("^"+c+"+|"+c+"+$","g"),""):a}}),b.module("a8m.truncate",[]).filter("truncate",function(){return function(a,b,c,d){return b=z(b)?a.length:b,d=d||!1,c=c||"",!B(a)||a.length<=b?a:a.substring(0,d?a.indexOf(" ",b)===-1?a.length:a.indexOf(" ",b):b)+c}}),b.module("a8m.ucfirst",[]).filter({ucfirst:x,titleize:x}),b.module("a8m.uri-component-encode",[]).filter("uriComponentEncode",["$window",function(a){return function(b){return B(b)?a.encodeURIComponent(b):b}}]),b.module("a8m.uri-encode",[]).filter("uriEncode",["$window",function(a){return function(b){return B(b)?a.encodeURI(b):b}}]),b.module("a8m.wrap",[]).filter("wrap",function(){return function(a,b,c){return B(a)&&y(b)?[b,a,c||b].join(""):a}}),b.module("a8m.filter-watcher",[]).provider("filterWatcher",function(){this.$get=["$window","$rootScope",function(a,b){function c(b,c){function d(){var b=[];return function(c,d){if(D(d)&&!e(d)){if(~b.indexOf(d))return"[Circular]";b.push(d)}return a==d?"$WINDOW":a.document==d?"$DOCUMENT":k(d)?"$SCOPE":d}}return[b,JSON.stringify(c,d())].join("#").replace(/"/g,"")}function d(a){var b=a.targetScope.$id;F(l[b],function(a){delete j[a]}),delete l[b]}function f(){m(function(){b.$$phase||(j={})},2e3)}function g(a,b){var c=a.$id;return z(l[c])&&(a.$on("$destroy",d),l[c]=[]),l[c].push(b)}function h(a,b){var d=c(a,b);return j[d]}function i(a,b,d,e){var h=c(a,b);return j[h]=e,k(d)?g(d,h):f(),e}var j={},l={},m=a.setTimeout;return{isMemoized:h,memoize:i}}]}),b.module("angular.filter",["a8m.ucfirst","a8m.uri-encode","a8m.uri-component-encode","a8m.slugify","a8m.latinize","a8m.strip-tags","a8m.stringular","a8m.truncate","a8m.starts-with","a8m.ends-with","a8m.wrap","a8m.trim","a8m.ltrim","a8m.rtrim","a8m.repeat","a8m.test","a8m.match","a8m.split","a8m.phoneUS","a8m.to-array","a8m.concat","a8m.contains","a8m.unique","a8m.is-empty","a8m.after","a8m.after-where","a8m.before","a8m.before-where","a8m.defaults","a8m.where","a8m.reverse","a8m.remove","a8m.remove-with","a8m.group-by","a8m.count-by","a8m.chunk-by","a8m.search-field","a8m.fuzzy-by","a8m.fuzzy","a8m.omit","a8m.pick","a8m.every","a8m.filter-by","a8m.xor","a8m.map","a8m.first","a8m.last","a8m.flatten","a8m.join","a8m.range","a8m.math.max","a8m.math.min","a8m.math.abs","a8m.math.percent","a8m.math.radix","a8m.math.sum","a8m.math.degrees","a8m.math.radians","a8m.math.byteFmt","a8m.math.kbFmt","a8m.math.shortFmt","a8m.angular","a8m.conditions","a8m.is-null","a8m.filter-watcher"])}(window,window.angular);;
