/* Minification failed. Returning unminified contents.
(179,297-304): run-time error JS1019: Can't have 'break' outside of loop: break a
 */
/*
 AngularJS
 (c) 2010-2020 Google LLC. http://angularjs.org
 License: MIT
 AngularJS NES v1.5.26
 (c) 2023 HeroDevs, Inc.
 Released under the HeroDevs NES License.
*/
(function(v){'use strict';function P(a,b){b=b||Error;return function(){var d=arguments[0],c;c="["+(a?a+":":"")+d+"] http://errors.angularjs.xlts.dev/1.5.26/"+(a?a+"/":"")+d;for(d=1;d<arguments.length;d++){c=c+(1==d?"?":"&")+"p"+(d-1)+"=";var f=encodeURIComponent,e;e=arguments[d];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=f(e)}return new b(c)}}function na(a){if(null==a||$a(a))return!1;if(D(a)||B(a)||E&&a instanceof
E)return!0;var b="length"in Object(a)&&a.length;return ba(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"===typeof a.item)}function q(a,b,d){var c,f;if(a)if(x(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(D(a)||na(a)){var e="object"!==typeof a;c=0;for(f=a.length;c<f;c++)(e||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(Ac(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)xa.call(a,c)&&b.call(d,a[c],c,a);return a}function Bc(a,b,d){for(var c=Object.keys(a).sort(),f=0;f<c.length;f++)b.call(d,a[c[f]],c[f]);return c}function Cc(a){return function(b,d){a(d,b)}}function oe(){return++vb}function Ub(a,b,d){for(var c=a.$$hashKey,f=0,e=b.length;f<e;++f){var g=b[f];if(G(g)||x(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],n=g[m];d&&G(n)?fa(n)?a[m]=new Date(n.valueOf()):
ab(n)?a[m]=new RegExp(n):n.nodeName?a[m]=n.cloneNode(!0):Vb(n)?a[m]=n.clone():"__proto__"!==m&&(G(a[m])||(a[m]=D(n)?[]:{}),Ub(a[m],[n],!0)):a[m]=n}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function U(a){return Ub(a,ya.call(arguments,1),!1)}function pe(a){return Ub(a,ya.call(arguments,1),!0)}function Y(a){return parseInt(a,10)}function Wb(a,b){return U(Object.create(a),b)}function A(){}function bb(a){return a}function ia(a){return function(){return a}}function Dc(a){return x(a.toString)&&a.toString!==
oa}function z(a){return"undefined"===typeof a}function w(a){return"undefined"!==typeof a}function G(a){return null!==a&&"object"===typeof a}function Ac(a){return null!==a&&"object"===typeof a&&!Ec(a)}function B(a){return"string"===typeof a}function ba(a){return"number"===typeof a}function fa(a){return"[object Date]"===oa.call(a)}function x(a){return"function"===typeof a}function ab(a){return"[object RegExp]"===oa.call(a)}function $a(a){return a&&a.window===a}function cb(a){return a&&a.$evalAsync&&
a.$watch}function Ma(a){return"boolean"===typeof a}function qe(a){return a&&ba(a.length)&&re.test(oa.call(a))}function Vb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function se(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function va(a){return R(a.nodeName||a[0]&&a[0].nodeName)}function db(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function ta(a,b){function d(a,b){var d=b.$$hashKey,e;if(D(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(Ac(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)xa.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!G(a))return a;var b=e.indexOf(a);if(-1!==b)return g[b];if($a(a)||cb(a))throw za("cpws");var b=!1,c=f(a);void 0===c&&(c=D(a)?[]:Object.create(Ec(a)),b=!0);e.push(a);g.push(c);return b?d(a,c):c}function f(a){switch(oa.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),
a.byteOffset,a.length);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(/\/([^/]*)$/)[1]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(x(a.cloneNode))return a.cloneNode(!0)}
var e=[],g=[];if(b){if(qe(b)||"[object ArrayBuffer]"===oa.call(b))throw za("cpta");if(a===b)throw za("cpi");D(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]});e.push(a);g.push(b);return d(a,b)}return c(a)}function pa(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(D(a)){if(!D(b))return!1;if((d=a.length)===b.length){for(c=0;c<d;c++)if(!pa(a[c],b[c]))return!1;return!0}}else{if(fa(a))return fa(b)?pa(a.getTime(),
b.getTime()):!1;if(ab(a))return ab(b)?a.toString()===b.toString():!1;if(cb(a)||cb(b)||$a(a)||$a(b)||D(b)||fa(b)||ab(b))return!1;d=W();for(c in a)if("$"!==c.charAt(0)&&!x(a[c])){if(!pa(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&w(b[c])&&!x(b[c]))return!1;return!0}return!1}function eb(a,b,d){return a.concat(ya.call(b,d))}function fb(a,b){var d=2<arguments.length?ya.call(arguments,2):[];return!x(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,
eb(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function te(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:$a(b)?d="$WINDOW":b&&v.document===b?d="$DOCUMENT":cb(b)&&(d="$SCOPE");return d}function gb(a,b){if(!z(a))return ba(b)||(b=b?2:null),JSON.stringify(a,te,b)}function Fc(a){return B(a)?JSON.parse(a):a}function Gc(a,b){a=a.replace(ue,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return ja(d)?b:d}function Xb(a,
b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=Gc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function Aa(a){a=E(a).clone().empty();var b=E("<div>").append(a).html();try{return a[0].nodeType===Na?R(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+R(b)})}catch(d){return R(b)}}function Hc(a){try{return decodeURIComponent(a)}catch(b){}}function Ic(a){var b={};q((a||"").split("&"),function(a){var c,f,e;a&&(f=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),
-1!==c&&(f=a.substring(0,c),e=a.substring(c+1)),f=Hc(f),w(f)&&(e=w(e)?Hc(e):!0,xa.call(b,f)?D(b[f])?b[f].push(e):b[f]=[b[f],e]:b[f]=e))});return b}function Yb(a){var b=[];q(a,function(a,c){D(a)?q(a,function(a){b.push(qa(c,!0)+(!0===a?"":"="+qa(a,!0)))}):b.push(qa(c,!0)+(!0===a?"":"="+qa(a,!0)))});return b.length?b.join("&"):""}function wb(a){return qa(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function qa(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 ve(a,b){var d,c,f=Qa.length;for(c=0;c<f;++c)if(d=Qa[c]+b,B(d=a.getAttribute(d)))return d;return null}function we(a,b){var d,c,f={};q(Qa,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});q(Qa,function(b){b+="app";var f;!d&&(f=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=f,c=f.getAttribute(b))});d&&(xe?(f.strictDi=null!==ve(d,"strict-di"),b(d,c?[c]:[],f)):
v.console.error("AngularJS: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match."))}function Jc(a,b,d){G(d)||(d={});d=U({strictDi:!1},d);var c=function(){a=E(a);if(a.injector()){var c=a[0]===v.document?"document":Aa(a);throw za("btstrpd",c.replace(/</g,"&lt;").replace(/>/g,"&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=hb(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},f=/^NG_ENABLE_DEBUG_INFO!/,e=/^NG_DEFER_BOOTSTRAP!/;v&&f.test(v.name)&&(d.debugInfoEnabled=!0,v.name=v.name.replace(f,""));if(v&&!e.test(v.name))return c();v.name=v.name.replace(e,"");Z.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};x(Z.resumeDeferredBootstrap)&&Z.resumeDeferredBootstrap()}function ye(){v.name="NG_ENABLE_DEBUG_INFO!"+
v.name;v.location.reload()}function ze(a){a=Z.element(a).injector();if(!a)throw za("test");return a.get("$$testability")}function Kc(a,b){b=b||"_";return a.replace(Ae,function(a,c){return(c?b:"")+a.toLowerCase()})}function Be(){var a;if(!Lc){var b=xb();(Ba=z(b)?v.jQuery:b?v[b]:void 0)&&Ba.fn.on?(E=Ba,U(Ba.fn,{scope:Ra.scope,isolateScope:Ra.isolateScope,controller:Ra.controller,injector:Ra.injector,inheritedData:Ra.inheritedData}),a=Ba.cleanData,Ba.cleanData=function(b){for(var c,f=0,e;null!=(e=b[f]);f++)(c=
Ba._data(e,"events"))&&c.$destroy&&Ba(e).triggerHandler("$destroy");a(b)}):E=S;Z.element=E;Lc=!0}}function Ce(){S.htmlPrefilter=function(a){var b=a.replace(De,"<$1></$2>");v.console&&v.console.warn&&a!==b&&v.console.warn("JQLite changed the HTML string:\n\n"+a+"\n\nto remove self-closing tags, resulting in this HTML string:\n\n"+b+"\n\nJQLite no longer does this replacement when you stop calling UNSAFE_restoreLegacyJqLiteXHTMLReplacement; please update your code to avoid self-closing tags.");return b}}
function Ee(a){if(w(a))S.$jQueryLt4CompatibilityEnabled=a;else return S.$jQueryLt4CompatibilityEnabled}function ib(a,b,d){if(!a)throw za("areq",b||"?",d||"required");return a}function Sa(a,b,d){d&&D(a)&&(a=a[a.length-1]);ib(x(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 za("badname",b);}function Mc(a,b,d){if(!b)return a;b=b.split(".");for(var c,f=a,e=b.length,g=0;g<e;g++)c=b[g],a&&(a=(f=a)[c]);return!d&&
x(a)?fb(f,a):a}function yb(a){for(var b=a[0],d=a[a.length-1],c,f=1;b!==d&&(b=b.nextSibling);f++)if(c||a[f]!==b)c||(c=ya.call(a,0,f)),c.push(b);return c?E(c):a}function W(){return Object.create(null)}function Fe(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=P("$injector"),c=P("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||P;return b(a,"module",function(){var a={};return function(e,g,h){if("hasOwnProperty"===e)throw c("badname","module");g&&a.hasOwnProperty(e)&&(a[e]=null);return b(a,e,function(){function a(b,
d,e,f){f||(f=c);return function(){f[e||"push"]([b,d,arguments]);return H}}function b(a,d){return function(b,f){f&&x(f)&&(f.$$moduleName=e);c.push([a,d,arguments]);return H}}if(!g)throw d("nomod",e);var c=[],f=[],r=[],s=a("$injector","invoke","push",f),H={_invokeQueue:c,_configBlocks:f,_runBlocks:r,requires:g,name:e,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:s,run:function(a){r.push(a);return this}};h&&s(h);return H})}})}function ma(a,b){if(D(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(G(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function Ge(a){U(a,{bootstrap:Jc,
copy:ta,extend:U,merge:pe,equals:pa,element:E,forEach:q,injector:hb,noop:A,bind:fb,toJson:gb,fromJson:Fc,identity:bb,isUndefined:z,isDefined:w,isString:B,isFunction:x,isObject:G,isNumber:ba,isElement:Vb,isArray:D,version:He,isDate:fa,lowercase:R,uppercase:zb,callbacks:{$$counter:0},getTestability:ze,UNSAFE_restoreLegacyJqLiteXHTMLReplacement:Ce,jqLite_jQueryLt4CompatibilityEnabled:Ee,$$minErr:P,$$csp:$,reloadWithDebugInfo:ye});Zb=Fe(v);Zb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Ie});
a.provider("$compile",Nc).directive({a:Je,input:Oc,textarea:Oc,form:Ke,script:Le,select:Me,option:Ne,ngBind:Oe,ngBindHtml:Pe,ngBindTemplate:Qe,ngClass:Re,ngClassEven:Se,ngClassOdd:Te,ngCloak:Ue,ngController:Ve,ngForm:We,ngHide:Xe,ngIf:Ye,ngInclude:Ze,ngInit:$e,ngNonBindable:af,ngPluralize:bf,ngRepeat:cf,ngShow:df,ngStyle:ef,ngSwitch:ff,ngSwitchWhen:gf,ngSwitchDefault:hf,ngOptions:jf,ngTransclude:kf,ngModel:lf,ngList:mf,ngChange:nf,pattern:Pc,ngPattern:Pc,required:Qc,ngRequired:Qc,minlength:Rc,ngMinlength:Rc,
maxlength:Sc,ngMaxlength:Sc,ngValue:of,ngModelOptions:pf}).directive({ngInclude:qf,input:rf}).directive(Ab).directive(Tc);a.provider({$anchorScroll:sf,$animate:tf,$animateCss:uf,$$animateJs:vf,$$animateQueue:wf,$$AnimateRunner:xf,$$animateAsyncRun:yf,$browser:zf,$cacheFactory:Af,$controller:Bf,$document:Cf,$exceptionHandler:Df,$filter:Uc,$$forceReflow:Ef,$interpolate:Ff,$interval:Gf,$http:Hf,$httpParamSerializer:If,$httpParamSerializerJQLike:Jf,$httpBackend:Kf,$xhrFactory:Lf,$jsonpCallbacks:Mf,$location:Nf,
$log:Of,$parse:Pf,$rootScope:Qf,$q:Rf,$$q:Sf,$sce:Tf,$sceDelegate:Uf,$sniffer:Vf,$templateCache:Wf,$templateRequest:Xf,$$testability:Yf,$timeout:Zf,$window:$f,$$rAF:ag,$$jqLite:bg,$$HashMap:cg,$$cookieReader:dg})}])}function jb(a){return a.replace(eg,function(a,d,c,f){return f?c.toUpperCase():c}).replace(fg,"Moz$1")}function Vc(a){a=a.nodeType;return 1===a||!a||9===a}function Wc(a,b){var d,c,f,e=b.createDocumentFragment(),g=[],h;if($b.test(a)){d=e.appendChild(b.createElement("div"));c=(gg.exec(a)||
["",""])[1].toLowerCase();f=S.htmlPrefilter(a);if(10>Ca)for(c=kb[c]||kb._default,d.innerHTML=c[1]+f+c[2],h=c[0];h--;)d=d.firstChild;else{c=ka[c]||[];for(h=c.length;-1<--h;)d.appendChild(v.document.createElement(c[h])),d=d.firstChild;d.innerHTML=f}g=eb(g,d.childNodes);d=e.firstChild;d.textContent=""}else g.push(b.createTextNode(a));e.textContent="";e.innerHTML="";q(g,function(a){e.appendChild(a)});return e}function Xc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function S(a){if(a instanceof
S)return a;var b;B(a)&&(a=da(a),b=!0);if(!(this instanceof S)){if(b&&"<"!==a.charAt(0))throw ac("nosel");return new S(a)}if(b){b=v.document;var d;a=(d=hg.exec(a))?[b.createElement(d[1])]:(d=Wc(a,b))?d.childNodes:[]}Yc(this,a)}function bc(a){return a.cloneNode(!0)}function Bb(a,b){b||lb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,f=d.length;c<f;c++)lb(d[c])}function Zc(a,b,d,c){if(w(c))throw ac("offargs");var f=(c=Cb(a))&&c.events,e=c&&c.handle;if(e)if(b){var g=function(b){var c=
f[b];w(d)&&db(c||[],d);w(d)&&c&&0<c.length||(a.removeEventListener(b,e,!1),delete f[b])};q(b.split(" "),function(a){g(a);Db[a]&&g(Db[a])})}else for(b in f)"$destroy"!==b&&a.removeEventListener(b,e,!1),delete f[b]}function lb(a,b){var d=a.ng339,c=d&&mb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Zc(a)),delete mb[d],a.ng339=void 0))}function Cb(a,b){var d=a.ng339,d=d&&mb[d];b&&!d&&(a.ng339=d=++ig,d=mb[d]={events:{},data:{},handle:void 0});return d}function cc(a,
b,d){if(Vc(a)){var c=w(d),f=!c&&b&&!G(b),e=!b;a=(a=Cb(a,!f))&&a.data;if(c)a[b]=d;else{if(e)return a;if(f)return a&&a[b];U(a,b)}}}function Eb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function Fb(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",da((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+da(b)+" "," ")))})}function Gb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||
"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=da(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",da(d))}}function Yc(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 $c(a,b){return Hb(a,"$"+(b||"ngController")+"Controller")}function Hb(a,b,d){9===a.nodeType&&(a=a.documentElement);for(b=D(b)?b:[b];a;){for(var c=0,f=b.length;c<f;c++)if(w(d=E.data(a,
b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function ad(a){for(Bb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Ib(a,b){b||Bb(a);var d=a.parentNode;d&&d.removeChild(a)}function jg(a,b){b=b||v;if("complete"===b.document.readyState)b.setTimeout(a);else E(b).on("load",a)}function bd(a,b){var d=Jb[b.toLowerCase()];return d&&cd[va(a)]&&d}function kg(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var e=b[d||c.type],g=e?e.length:0;if(g){if(z(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=e.specialHandlerWrapper||lg;1<g&&(e=ma(e));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,e[l])}};d.elem=a;return d}function lg(a,b,d){d.call(a,b)}function mg(a,b,d){var c=b.relatedTarget;c&&(c===a||ng.call(a,c))||d.call(a,b)}function bg(){this.$get=
function(){return U(S,{hasClass:function(a,b){a.attr&&(a=a[0]);return Eb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Gb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return Fb(a,b)}})}}function Da(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||oe)():d+":"+a}function Ua(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function dd(a){a=(Function.prototype.toString.call(a)+
" ").replace(og,"");return a.match(pg)||a.match(qg)}function rg(a){return(a=dd(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function hb(a,b){function d(a){return function(b,c){if(G(b))q(b,Cc(a));else return a(b,c)}}function c(a,b){Ta(a,"service");if(x(b)||D(b))b=r.instantiate(b);if(!b.$get)throw Ea("pget",a);return n[a+"Provider"]=b}function f(a,b){return function(){var c=M.invoke(b,this);if(z(c))throw Ea("undef",a);return c}}function e(a,b,d){return c(a,{$get:!1!==d?f(a,b):b})}function g(a){ib(z(a)||
D(a),"modulesToLoad","not an array");var b=[],c;q(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=r.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{B(a)?(c=Zb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):x(a)?b.push(r.invoke(a)):D(a)?b.push(r.invoke(a)):Sa(a,"module")}catch(e){throw D(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1===e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ea("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 Ea("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e),a[b]}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=hb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!==typeof l)throw Ea("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);D(a)&&(a=a[a.length-1]);d=11>=Ca?!1:"function"===typeof a&&/^(?:class\b|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=D(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:hb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Ua([],!0),n={$provide:{provider:d(c),
factory:d(e),service:d(function(a,b){return e(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return e(a,ia(b),!1)}),constant:d(function(a,b){Ta(a,"constant");n[a]=b;s[a]=b}),decorator:function(a,b){var c=r.get(a+"Provider"),d=c.$get;c.$get=function(){var a=M.invoke(d,c);return M.invoke(b,null,{$delegate:a})}}}},r=n.$injector=h(n,function(a,b){Z.isString(b)&&l.push(b);throw Ea("unpr",l.join(" <- "));}),s={},H=h(s,function(a,b){var c=r.get(a+"Provider",b);return M.invoke(c.$get,
c,void 0,a)}),M=H;n.$injectorProvider={$get:ia(H)};var p=g(a),M=H.get("$injector");M.strictDi=b;q(p,function(a){a&&M.invoke(a)});return M}function sf(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function f(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===va(a))return b=a,!0});return b}function e(a){if(a){a.scrollIntoView();var c;c=g.yOffset;x(c)?c=c():Vb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):
ba(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=B(a)?a:ba(a)?a.toString():d.hash();var b;a?(b=h.getElementById(a))?e(b):(b=f(h.getElementsByName(a)))?e(b):"top"===a&&e(null):e(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||jg(function(){c.$evalAsync(g)})});return g}]}function nb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;D(a)&&(a=a.join(" "));D(b)&&(b=b.join(" "));return a+" "+b}function sg(a){B(a)&&
(a=a.split(" "));var b=W();q(a,function(a){a.length&&(b[a]=!0)});return b}function Fa(a){return G(a)?a:{}}function tg(a,b,d,c){function f(a){try{a.apply(null,ya.call(arguments,1))}finally{if(H--,0===H)for(;M.length;)try{M.pop()()}catch(b){d.error(b)}}}function e(){N=null;g();h()}function g(){p=I();p=z(p)?null:p;pa(p,u)&&(p=u);u=p}function h(){if(y!==k.url()||L!==p)y=k.url(),L=p,q(C,function(a){a(k.url(),p)})}var k=this,l=a.location,m=a.history,n=a.setTimeout,r=a.clearTimeout,s={};k.isMock=!1;var H=
0,M=[];k.$$completeOutstandingRequest=f;k.$$incOutstandingRequestCount=function(){H++};k.notifyWhenNoOutstandingRequests=function(a){0===H?a():M.push(a)};var p,L,y=l.href,F=b.find("base"),N=null,I=c.history?function(){try{return m.state}catch(a){}}:A;g();L=p;k.url=function(b,d,e){z(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=L===e;if(y===b&&(!c.history||f))return k;var h=y&&Ja(y)===Ja(b);y=b;L=e;!c.history||h&&f?(h||(N=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&&(N=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),L=p);N&&(N=b);return k}return N||l.href.replace(/%27/g,"'")};k.state=function(){return p};var C=[],J=!1,u=null;k.onUrlChange=function(b){if(!J){if(c.history)E(a).on("popstate",e);E(a).on("hashchange",e);J=!0}C.push(b);return b};k.$$applicationDestroyed=function(){E(a).off("hashchange popstate",e)};k.$$checkUrlChange=h;k.baseHref=function(){var a=F.attr("href");return a?a.replace(/^(https?:)?\/\/[^/]*/,
""):""};k.defer=function(a,b){var c;H++;c=n(function(){delete s[c];f(a)},b||0);s[c]=!0;return c};k.defer.cancel=function(a){return s[a]?(delete s[a],r(a),f(A),!0):!1}}function zf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new tg(a,c,b,d)}]}function Af(){this.$get=function(){function a(a,c){function f(a){a!==n&&(r?r===a&&(r=a.n):r=a,e(a.n,a.p),e(a,n),n=a,n.n=null)}function e(a,b){a!==b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw P("$cacheFactory")("iid",a);var g=0,h=
U({},c,{id:a}),k=W(),l=c&&c.capacity||Number.MAX_VALUE,m=W(),n=null,r=null;return b[a]={put:function(a,b){if(!z(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});f(c)}a in k||g++;k[a]=b;g>l&&this.remove(r.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;f(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b===n&&(n=b.p);b===r&&(r=b.n);e(b.n,b.p);delete m[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=W();g=0;m=W();n=r=null},destroy:function(){m=
h=k=null;delete b[a]},info:function(){return U({},h,{size:g})}}}var b={};a.info=function(){var a={};q(b,function(b,f){a[f]=b.info()});return a};a.get=function(a){return b[a]};return a}}function Wf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Nc(a,b){function d(a,b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*([\w$]*)\s*$/,e=W();q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw ha("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};g[4]&&(n[a]=e[f])}});return e}function c(a){var b=a.charAt(0);if(!b||b!==R(b))throw ha("baddir",a);if(a!==a.trim())throw ha("baddir",a);}function f(a){var b=a.require||a.controller&&a.name;!D(b)&&G(b)&&q(b,function(a,c){var d=a.match(l);a.substring(d[0].length)||(b[c]=d[0]+c)});return b}var e={},g=/^\s*directive:\s*([\w-]+)\s+(\S.*|)$/,h=/(([\w-]+)(?::([^;]+))?;?)/,k=se("ngSrc,ngSrcset,src,srcset"),l=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,
m=/^(on[a-z]+|formaction)$/,n=W();this.directive=function y(b,d){ib(b,"name");Ta(b,"directive");B(b)?(c(b),ib(d,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];q(e[b],function(e,g){try{var h=a.invoke(e);x(h)?h={compile:ia(h)}:!h.compile&&h.link&&(h.compile=ia(h.link));h.priority=h.priority||0;h.index=g;h.name=h.name||b;h.require=f(h);var k=h,l=h.restrict;if(l&&(!B(l)||!/[EACM]/.test(l)))throw ha("badrestrict",l,b);k.restrict=
l||"EA";h.$$moduleName=e.$$moduleName;d.push(h)}catch(m){c(m)}});return d}])),e[b].push(d)):q(b,Cc(y));return this};this.component=function(a,b){function c(a){function e(b){return x(b)||D(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:ug(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require};
q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)});return g}var d=b.controller||function(){};q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,x(d)&&(d[b]=a))});c.$inject=["$injector"];return this.directive(a,c)};this.aHrefSanitizationWhitelist=function(a){return w(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return w(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var r=!0;this.debugInfoEnabled=function(a){return w(a)?
(r=a,this):r};var s=!0;this.preAssignBindingsEnabled=function(a){return w(a)?(s=a,this):s};var H=10;this.onChangesTtl=function(a){return arguments.length?(H=a,this):H};var M=!0;this.commentDirectivesEnabled=function(a){return arguments.length?(M=a,this):M};var p=!0;this.cssClassDirectivesEnabled=function(a){return arguments.length?(p=a,this):p};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,
b,c,f,n,J,u,Q,K,O){function ga(){try{if(!--za)throw $=void 0,ha("infchng",H);u.$apply(function(){for(var a=[],b=0,c=$.length;b<c;++b)try{$[b]()}catch(d){a.push(d)}$=void 0;if(a.length)throw a;})}finally{za++}}function t(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}function T(a,b,c){wa.innerHTML="<span "+b+">";b=wa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function ua(a,
b){try{a.addClass(b)}catch(c){}}function ca(a,b,c,d,e){a instanceof E||(a=E(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Na&&k.nodeValue.match(f)&&Xc(k,a[g]=v.document.createElement("span"))}var l=Oa(a,b,a,c,d,e);ca.$$addScopeClass(a);var m=null;return function(b,c,d){ib(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"!==va(d)&&oa.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==m?E(ia(m,E("<div>").append(a).html())):c?Ra.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);ca.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function Oa(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,n,s,y;if(p)for(y=Array(c.length),m=0;m<h.length;m+=3)f=h[m],y[f]=c[f];else y=c;m=0;for(n=h.length;m<n;)k=y[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),ca.$$addScopeInfo(E(k),l)):l=
a,s=c.transcludeOnThisElement?la(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?la(a,b):null,c(f,l,k,d,s)):f&&f(a,k.childNodes,void 0,e)}for(var h=[],k,l,m,n,p,s=0;s<a.length;s++){k=new t;l=P(a[s],[],k,0===s?d:void 0,e);(f=l.length?Va(l,a[s],k,b,c,null,[],[],f):null)&&f.scope&&ca.$$addScopeClass(k.$$element);k=f&&f.terminal||!(m=a[s].childNodes)||!m.length?null:Oa(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(s,f,k),n=!0,p=p||f;f=null}return n?g:
null}function la(a,b,c){function d(e,f,g,h,k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var e=d.$$slots=W(),f;for(f in b.$$slots)e[f]=b.$$slots[f]?la(a,b.$$slots[f],c):null;return d}function P(a,b,c,d,e){var f=c.$attr,g;switch(a.nodeType){case 1:g=va(a);V(b,Ga(g),"E",d,e);for(var k,l,m,n,s=a.attributes,p=0,y=s&&s.length;p<y;p++){var r=!1,K=!1;k=s[p];l=k.name;m=da(k.value);k=Ga(l);(n=Ja.test(k))&&(l=l.replace(ed,"").substr(8).replace(/_(.)/g,
function(a,b){return b.toUpperCase()}));(k=k.match(Ka))&&Y(k[1])&&(r=l,K=l.substr(0,l.length-5)+"end",l=l.substr(0,l.length-6));k=Ga(l.toLowerCase());f[k]=l;if(n||!c.hasOwnProperty(k))c[k]=m,bd(a,k)&&(c[k]=!0);sa(a,b,m,k,n);V(b,k,"A",d,e,r,K)}"input"===g&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off");if(!Ia)break;f=a.className;G(f)&&(f=f.animVal);if(B(f)&&""!==f)for(;a=h.exec(f);)k=Ga(a[2]),V(b,k,"C",d,e)&&(c[k]=da(a[3])),f=f.substr(a.index+a[0].length);break;case Na:if(11===
Ca)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Na;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);Ca&&a.parentNode&&"textarea"===va(a.parentNode)||ma(b,a.nodeValue);break;case 8:if(!Ha)break;La(a,b,c,d,e)}b.sort(fa);return b}function La(a,b,c,d,e){try{var f=g.exec(a.nodeValue);if(f){var h=Ga(f[1]);V(b,h,"M",d,e)&&(c[h]=da(f[2]))}}catch(k){}}function fd(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ha("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 E(d)}function S(a,b,c){return function(d,e,f,g,h){e=fd(e[0],b,c);return a(d,e,f,g,h)}}function ec(a,b,c,d,e,f){var g;return a?ca(b,c,d,e,f):function(){g||(g=ca(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function Va(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){if(a){c&&(a=S(a,c,d));a.require=u.require;a.directiveName=I;if(K===u||u.$$isolateScope)a=ra(a,{isolateScope:!0});h.push(a)}if(b){c&&
(b=S(b,c,d));b.require=u.require;b.directiveName=I;if(K===u||u.$$isolateScope)b=ra(b,{isolateScope:!0});k.push(b)}}function n(a,e,f,g,l){function m(a,b,c,d){var e;cb(a)||(d=c,c=b,b=a,a=void 0);M&&(e=H);c||(c=M?J.parent():J);if(d){var f=l.$$slots[d];if(f)return f(a,b,e,c,T);if(z(f))throw ha("noslot",d,Aa(J));}else return l(a,b,e,c,T)}var p,u,C,O,F,H,I,J;b===f?(g=d,J=d.$$element):(J=E(f),g=new t(J,d));F=e;K?O=e.$new(!0):y&&(F=e.$parent);l&&(I=m,I.$$boundTransclude=l,I.isSlotFilled=function(a){return!!l.$$slots[a]});
r&&(H=ba(J,g,I,r,O,e,K));K&&(ca.$$addScopeInfo(J,O,!0,!(Q&&(Q===K||Q===K.$$originalDirective))),ca.$$addScopeClass(J,!0),O.$$isolateBindings=K.$$isolateBindings,u=na(e,g,O,O.$$isolateBindings,K),u.removeWatches&&O.$on("$destroy",u.removeWatches));for(p in H){u=r[p];C=H[p];var ga=u.$$bindings.bindToController;if(s){C.bindingInfo=ga?na(F,g,C.instance,ga,u):{};var dc=C();dc!==C.instance&&(C.instance=dc,J.data("$"+u.name+"Controller",dc),C.bindingInfo.removeWatches&&C.bindingInfo.removeWatches(),C.bindingInfo=
na(F,g,C.instance,ga,u))}else C.instance=C(),J.data("$"+u.name+"Controller",C.instance),C.bindingInfo=na(F,g,C.instance,ga,u)}q(r,function(a,b){var c=a.require;a.bindToController&&!D(c)&&G(c)&&U(H[b].instance,X(b,c,J,H))});q(H,function(a){var b=a.instance;if(x(b.$onChanges))try{b.$onChanges(a.bindingInfo.initialChanges)}catch(d){c(d)}if(x(b.$onInit))try{b.$onInit()}catch(e){c(e)}x(b.$doCheck)&&(F.$watch(function(){b.$doCheck()}),b.$doCheck());x(b.$onDestroy)&&F.$on("$destroy",function(){b.$onDestroy()})});
p=0;for(u=h.length;p<u;p++)C=h[p],ta(C,C.isolateScope?O:e,J,g,C.require&&X(C.directiveName,C.require,J,H),I);var T=e;K&&(K.template||null===K.templateUrl)&&(T=O);a&&a(T,f.childNodes,void 0,l);for(p=k.length-1;0<=p;p--)C=k[p],ta(C,C.isolateScope?O:e,J,g,C.require&&X(C.directiveName,C.require,J,H),I);q(H,function(a){a=a.instance;x(a.$postLink)&&a.$postLink()})}l=l||{};for(var p=-Number.MAX_VALUE,y=l.newScopeDirective,r=l.controllerDirectives,K=l.newIsolateScopeDirective,Q=l.templateDirective,C=l.nonTlbTranscludeDirective,
O=!1,H=!1,M=l.hasElementTranscludeDirective,F=d.$$element=E(b),u,I,J,ga=e,T,ua=!1,w=!1,v,A=0,La=a.length;A<La;A++){u=a[A];var B=u.$$start,Oa=u.$$end;B&&(F=fd(b,B,Oa));J=void 0;if(p>u.priority)break;if(v=u.scope)u.templateUrl||(G(v)?(Z("new/isolated scope",K||y,u,F),K=u):Z("new/isolated scope",K,u,F)),y=y||u;I=u.name;if(!ua&&(u.replace&&(u.templateUrl||u.template)||u.transclude&&!u.$$tlb)){for(v=A+1;ua=a[v++];)if(ua.transclude&&!ua.$$tlb||ua.replace&&(ua.templateUrl||ua.template)){w=!0;break}ua=!0}!u.templateUrl&&
u.controller&&(r=r||W(),Z("'"+I+"' controller",r[I],u,F),r[I]=u);if(v=u.transclude)if(O=!0,u.$$tlb||(Z("transclusion",C,u,F),C=u),"element"===v)M=!0,p=u.priority,J=F,F=d.$$element=E(ca.$$createComment(I,d[I])),b=F[0],ka(f,ya.call(J,0),b),J[0].$$parentNode=J[0].parentNode,ga=ec(w,J,e,p,g&&g.name,{nonTlbTranscludeDirective:C});else{var la=W();J=E(bc(b)).contents();if(G(v)){J=[];var R=W(),Va=W();q(v,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;R[a]=b;la[b]=null;Va[b]=c});q(F.contents(),
function(a){var b=R[Ga(va(a))];b?(Va[b]=!0,la[b]=la[b]||[],la[b].push(a)):J.push(a)});q(Va,function(a,b){if(!a)throw ha("reqslot",b);});for(var V in la)la[V]&&(la[V]=ec(w,la[V],e))}F.empty();ga=ec(w,J,e,void 0,void 0,{needsNewScope:u.$$isolateScope||u.$$newScope});ga.$$slots=la}if(u.template)if(H=!0,Z("template",Q,u,F),Q=u,v=x(u.template)?u.template(F,d):u.template,v=Fa(v),u.replace){g=u;J=$b.test(v)?gd(ia(u.templateNamespace,da(v))):[];b=J[0];if(1!==J.length||1!==b.nodeType)throw ha("tplrt",I,"");
ka(f,F,b);La={$attr:{}};v=P(b,[],La);var Y=a.splice(A+1,a.length-(A+1));(K||y)&&aa(v,K,y);a=a.concat(v).concat(Y);ea(d,La);La=a.length}else F.html(v);if(u.templateUrl)H=!0,Z("template",Q,u,F),Q=u,u.replace&&(g=u),n=ja(a.splice(A,a.length-A),F,d,f,O&&ga,h,k,{controllerDirectives:r,newScopeDirective:y!==u&&y,newIsolateScopeDirective:K,templateDirective:Q,nonTlbTranscludeDirective:C}),La=a.length;else if(u.compile)try{T=u.compile(F,d,ga);var $=u.$$originalDirective||u;x(T)?m(null,fb($,T),B,Oa):T&&m(fb($,
T.pre),fb($,T.post),B,Oa)}catch(fa){c(fa,Aa(F))}u.terminal&&(n.terminal=!0,p=Math.max(p,u.priority))}n.scope=y&&!0===y.scope;n.transcludeOnThisElement=O;n.templateOnThisElement=H;n.transclude=ga;l.hasElementTranscludeDirective=M;return n}function X(a,b,c,d){var e;if(B(b)){var f=b.match(l);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 ha("ctreq",b,a);}else if(D(b))for(e=
[],g=0,f=b.length;g<f;g++)e[g]=X(a,b[g],c,d);else G(b)&&(e={},q(b,function(b,f){e[f]=X(a,b,c,d)}));return e||null}function ba(a,b,c,d,e,f,g){var h=W(),k;for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},n=l.controller;"@"===n&&(n=b[l.name]);m=J(n,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function aa(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Wb(a[d],{$$isolateScope:b,$$newScope:c})}function V(b,c,f,g,h,k,l){if(c===
h)return null;var m=null;if(e.hasOwnProperty(c)){h=a.get(c+"Directive");for(var n=0,p=h.length;n<p;n++)if(c=h[n],(z(g)||g>c.priority)&&-1!==c.restrict.indexOf(f)){k&&(c=Wb(c,{$$start:k,$$end:l}));if(!c.$$bindings){var s=m=c,r=c.name,K={isolateScope:null,bindToController:null};G(s.scope)&&(!0===s.bindToController?(K.bindToController=d(s.scope,r,!0),K.isolateScope={}):K.isolateScope=d(s.scope,r,!1));G(s.bindToController)&&(K.bindToController=d(s.bindToController,r,!0));if(K.bindToController&&!s.controller)throw ha("noctrl",
r);m=m.$$bindings=K;G(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function Y(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 ea(a,b){var c=b.$attr,d=a.$attr;q(a,function(d,e){"$"!==e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,e){a.hasOwnProperty(e)||"$"===e.charAt(0)||(a[e]=b,"class"!==e&&"style"!==e&&(d[e]=c[e]))})}function ja(a,
b,c,d,e,g,h,k){var l=[],m,n,p=b[0],s=a.shift(),y=Wb(s,{templateUrl:null,transclude:null,replace:null,$$originalDirective:s}),r=x(s.templateUrl)?s.templateUrl(b,c):s.templateUrl,K=s.templateNamespace;b.empty();f(r).then(function(f){var u,C;f=Fa(f);if(s.replace){f=$b.test(f)?gd(ia(K,da(f))):[];u=f[0];if(1!==f.length||1!==u.nodeType)throw ha("tplrt",s.name,r);f={$attr:{}};ka(d,b,u);var Q=P(u,[],f);G(s.scope)&&aa(Q,!0);a=Q.concat(a);ea(c,f)}else u=p,b.html(f);a.unshift(y);m=Va(a,u,c,e,b,s,g,h,k);q(d,
function(a,c){a===u&&(d[c]=b[0])});for(n=Oa(b[0].childNodes,e);l.length;){f=l.shift();C=l.shift();var O=l.shift(),H=l.shift(),Q=b[0];if(!f.$$destroyed){if(C!==p){var F=C.className;k.hasElementTranscludeDirective&&s.replace||(Q=bc(u));ka(O,E(C),Q);ua(E(Q),F)}C=m.transcludeOnThisElement?la(f,m.transclude,H):H;m(n,f,Q,d,C)}}l=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=la(b,m.transclude,e)),m(n,b,c,d,a)))}}function fa(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 Z(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ha("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,Aa(d));}function ma(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&ca.$$addBindingClass(a);return function(a,c){var e=c.parent();b||ca.$$addBindingClass(e);ca.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ia(a,
b){a=R(a||"html");switch(a){case "svg":case "math":var c=v.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function qa(a,b){if("srcdoc"===b)return Q.HTML;var c=va(a);if("src"===b||"ngSrc"===b){if(-1===["img","video","audio","source","track"].indexOf(c))return Q.RESOURCE_URL}else if("a"!==c&&"image"!==c&&"xlinkHref"===b||"form"===c&&"action"===b)return Q.RESOURCE_URL}function sa(a,c,d,e,f){var g=qa(a,e),h=k[e]||f,l=b(d,!f,g,h);if(l){if("multiple"===
e&&"select"===va(a))throw ha("selmulti",Aa(a));c.push({priority:100,compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=W());if(m.test(e))throw ha("nodomevents");var k=f[e];k!==d&&(l=k&&b(k,!0,g,h),d=k);l&&(f[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function ka(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=v.document.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);E.hasData(d)&&(E.data(c,E.data(d)),E(d).off("$destroy"));E.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function ra(a,b){return U(function(){return a.apply(null,arguments)},a,b)}function ta(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,Aa(d))}}function na(a,
c,d,e,f){function g(b,c,e){!x(d.$onChanges)||c===e||c!==c&&e!==e||($||(a.$$postDigest(ga),$=[]),m||(m={},$.push(h)),m[b]&&(e=m[b].previousValue),m[b]=new Kb(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],l={},m;q(e,function(e,h){var m=e.attrName,p=e.optional,s,y,r,K;switch(e.mode){case "@":p||xa.call(c,m)||(d[h]=c[m]=void 0);p=c.$observe(m,function(a){if(B(a)||Ma(a))g(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;s=c[m];B(s)?d[h]=b(s)(a):Ma(s)&&(d[h]=s);l[h]=new Kb(fc,d[h]);k.push(p);break;
case "=":if(!xa.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;y=n(c[m]);K=y.literal?pa:function(a,b){return a===b||a!==a&&b!==b};r=y.assign||function(){s=d[h]=y(a);throw ha("nonassign",c[m],m,f.name);};s=d[h]=y(a);p=function(b){K(b,d[h])||(K(b,s)?r(a,b=d[h]):d[h]=b);return s=b};p.$stateful=!0;p=e.collection?a.$watchCollection(c[m],p):a.$watch(n(c[m],p),null,y.literal);k.push(p);break;case "<":if(!xa.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;y=n(c[m]);var u=y.literal,Q=d[h]=y(a);l[h]=
new Kb(fc,d[h]);p=a.$watch(y,function(a,b){if(b===a){if(b===Q||u&&pa(b,Q))return;b=Q}g(h,a,b);d[h]=a},u);k.push(p);break;case "&":y=c.hasOwnProperty(m)?n(c[m]):A;if(y===A&&p)break;d[h]=function(b){return y(a,b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var Ba=/^\w/,wa=v.document.createElement("div"),Ha=M,Ia=p,za=H,$;t.prototype={$normalize:Ga,$addClass:function(a){a&&0<a.length&&K.addClass(this.$$element,a)},$removeClass:function(a){a&&
0<a.length&&K.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=hd(a,b);c&&c.length&&K.addClass(this.$$element,c);(c=hd(b,a))&&c.length&&K.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=bd(this.$$element[0],a),g=id[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=Kc(a,"-"));f=va(this.$$element);if(!("a"!==f&&"image"!==f||"href"!==a&&"xlinkHref"!==a)||"img"===f&&"src"===a)this[a]=b=O(b,"img"===f||"image"===
f);else if("srcset"===a&&("img"===f||"source"===f)&&w(b)){for(var f="",g=/^\s*(\S*[^\s,])(?:\s+([^\s,]+))?\s*(,|$)/,k=""+b,l;null!==(l=g.exec(k));){var m=l[2],n=l[3],f=f+O(l[1],!0);m&&(f+=" "+m);m||","!==n||(f+=" ");f+=n;k=k.slice(l[0].length)}this[a]=b=f}!1!==d&&(null===b||z(b)?this.$$element.removeAttr(e):Ba.test(e)?this.$$element.attr(e,b):T(this.$$element[0],e,b));(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=
W()),e=d[a]||(d[a]=[]);e.push(b);u.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||z(c[a])||b(c[a])});return function(){db(e,b)}}};var Da=b.startSymbol(),Ea=b.endSymbol(),Fa="{{"===Da&&"}}"===Ea?bb:function(a){return a.replace(/\{\{/g,Da).replace(/}}/g,Ea)},Ja=/^ngAttr[A-Z]/,Ka=/^(.+)Start$/;ca.$$addBindingInfo=r?function(a,b){var c=a.data("$binding")||[];D(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:A;ca.$$addBindingClass=r?function(a){ua(a,"ng-binding")}:A;ca.$$addScopeInfo=r?function(a,
b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:A;ca.$$addScopeClass=r?function(a,b){ua(a,b?"ng-isolate-scope":"ng-scope")}:A;ca.$$createComment=function(a,b){var c="";r&&(c=" "+(a||"")+": ",b&&(c+=b+" "));return v.document.createComment(c)};return ca}]}function Kb(a,b){this.previousValue=a;this.currentValue=b}function Ga(a){return jb(a.replace(ed,""))}function hd(a,b){var d="",c=a.split(/\s+/),f=b.split(/\s+/),e=0;a:for(;e<c.length;e++){for(var g=c[e],h=0;h<f.length;h++)if(g===
f[h])continue a;d+=(0<d.length?" ":"")+g}return d}function gd(a){a=E(a);var b=a.length;if(1>=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Na&&""===d.nodeValue.trim())&&vg.call(a,b,1)}return a}function ug(a,b){if(b&&B(b))return b;if(B(a)){var d=jd.exec(a);if(d)return d[3]}}function Bf(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Ta(b,"controller");G(b)?U(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",
function(d,c){function f(a,b,c,d){if(!a||!G(a.$scope))throw P("$controller")("noscp",d,b);a.$scope[b]=c}return function(e,g,h,k){var l,m,n;h=!0===h;k&&B(k)&&(n=k);if(B(e)){k=e.match(jd);if(!k)throw kd("ctrlfmt",e);m=k[1];n=n||k[3];e=a.hasOwnProperty(m)?a[m]:Mc(g.$scope,m,!0)||(b?Mc(c,m,!0):void 0);if(!e)throw kd("ctrlreg",m);Sa(e,m,!0)}if(h)return h=(D(e)?e[e.length-1]:e).prototype,l=Object.create(h||null),n&&f(g,n,l,m||e.name),U(function(){var a=d.invoke(e,l,g,m);a!==l&&(G(a)||x(a))&&(l=a,n&&f(g,
n,l,m||e.name));return l},{instance:l,identifier:n});l=d.instantiate(e,g,m);n&&f(g,n,l,m||e.name);return l}}]}function Cf(){this.$get=["$window",function(a){return E(a.document)}]}function Df(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function gc(a){return G(a)?fa(a)?a.toISOString():gb(a):a}function If(){this.$get=function(){return function(a){if(!a)return"";var b=[];Bc(a,function(a,c){null===a||z(a)||(D(a)?q(a,function(a){b.push(qa(c)+"="+qa(gc(a)))}):b.push(qa(c)+
"="+qa(gc(a))))});return b.join("&")}}}function Jf(){this.$get=function(){return function(a){function b(a,f,e){null===a||z(a)||(D(a)?q(a,function(a,c){b(a,f+"["+(G(a)?c:"")+"]")}):G(a)&&!fa(a)?Bc(a,function(a,c){b(a,f+(e?"":"[")+c+(e?"":"]"))}):d.push(qa(f)+"="+qa(gc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function hc(a,b){if(B(a)){var d=a.replace(wg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(ld))||(c=(c=d.match(xg))&&yg[c[0]].test(d));c&&(a=Fc(d))}}return a}
function md(a){var b=W(),d;B(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var f=R(da(a.substr(0,d)));a=da(a.substr(d+1));f&&(b[f]=b[f]?b[f]+", "+a:a)}):G(a)&&q(a,function(a,d){var e=R(d),g=da(a);e&&(b[e]=b[e]?b[e]+", "+g:g)});return b}function nd(a){var b;return function(d){b||(b=md(a));return d?(d=b[R(d)],void 0===d&&(d=null),d):b}}function od(a,b,d,c){if(x(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function Hf(){var a=this.defaults={transformResponse:[hc],transformRequest:[function(a){return G(a)&&
"[object File]"!==oa.call(a)&&"[object Blob]"!==oa.call(a)&&"[object FormData]"!==oa.call(a)?gb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ma(ic),put:ma(ic),patch:ma(ic)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return w(a)?(d=!!a,this):d};var c=this.interceptors=[];
this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(f,e,g,h,k,l,m){function n(b){function c(a,b){for(var d=0,e=b.length;d<e;){var f=b[d++],g=b[d++];a=a.then(f,g)}b.length=0;return a}function e(a,b){var c,d={};q(a,function(a,e){x(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}function f(a){var b=U({},a);b.data=od(a.data,a.headers,a.status,g.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}if(!G(b))throw P("$http")("badreq",b);if(!B(m.valueOf(b.url)))throw P("$http")("badreq",
b.url);var g=U({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer,jsonpCallbackParam:a.jsonpCallbackParam},b);g.headers=function(b){var c=a.headers,d=U({},b.headers),f,g,h,c=U({},c.common,c[R(b.method)]);a:for(f in c){g=R(f);for(h in d)if(R(h)===g)continue a;d[f]=c[f]}return e(d,ma(b))}(b);g.method=zb(g.method);g.paramSerializer=B(g.paramSerializer)?l.get(g.paramSerializer):g.paramSerializer;var h=[],n=[],s=k.when(g);q(p,function(a){(a.request||
a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&n.push(a.response,a.responseError)});s=c(s,h);s=s.then(function(b){var c=b.headers,d=od(b.data,nd(c),void 0,b.transformRequest);z(d)&&q(c,function(a,b){"content-type"===R(b)&&delete c[b]});z(b.withCredentials)&&!z(a.withCredentials)&&(b.withCredentials=a.withCredentials);return r(b,d).then(f,f)});s=c(s,n);d?(s.success=function(a){Sa(a,"fn");s.then(function(b){a(b.data,b.status,b.headers,g)});return s},s.error=function(a){Sa(a,
"fn");s.then(null,function(b){a(b.data,b.status,b.headers,g)});return s}):(s.success=pd("success"),s.error=pd("error"));return s}function r(c,d){function g(a){if(a){var c={};q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){p(c,a,d,e)}K&&(200<=a&&300>a?K.put(T,[a,c,md(d),e]):K.remove(T));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function p(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?u.resolve:u.reject)({data:a,
status:b,headers:nd(d),config:c,statusText:e})}function r(a){p(a.data,a.status,ma(a.headers()),a.statusText)}function J(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var u=k.defer(),Q=u.promise,K,O,ga=c.headers,t="jsonp"===R(c.method),T=c.url;t?T=m.getTrustedResourceUrl(T):B(T)||(T=m.valueOf(T));T=s(T,c.paramSerializer(c.params));t&&(T=H(T,c.jsonpCallbackParam));n.pendingRequests.push(c);Q.then(J,J);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||
(K=G(c.cache)?c.cache:G(a.cache)?a.cache:M);K&&(O=K.get(T),w(O)?O&&x(O.then)?O.then(r,r):D(O)?p(O[1],O[0],ma(O[2]),O[3]):p(O,200,{},"OK"):K.put(T,Q));z(O)&&((O=qd(c.url)?e()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(ga[c.xsrfHeaderName||a.xsrfHeaderName]=O),f(c.method,T,d,l,ga,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return Q}function s(a,b){0<b.length&&(a+=(-1===a.indexOf("?")?"?":"&")+b);return a}function H(a,b){if(/[&?][^&?=]+=JSON_CALLBACK/.test(a))throw jc("badjsonp",
a);if((new RegExp("[&?]"+b+"=")).test(a))throw jc("badjsonp",b,a);return a+=(-1===a.indexOf("?")?"?":"&")+b+"=JSON_CALLBACK"}var M=g("$http");a.paramSerializer=B(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var p=[];q(c,function(a){p.unshift(B(a)?l.get(a):l.invoke(a))});n.pendingRequests=[];(function(a){q(arguments,function(a){n[a]=function(b,c){return n(U({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){n[a]=function(b,c,d){return n(U({},
d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=a;return n}]}function Lf(){this.$get=function(){return function(){return new v.XMLHttpRequest}}}function Kf(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(a,b,d,c){return zg(a,c,a.defer,b,d[0])}]}function zg(a,b,d,c,f){function e(a,b,d){a=a.replace("JSON_CALLBACK",b);var e=f.createElement("script"),m=null;e.type="text/javascript";e.src=a;e.async=!0;m=function(a){e.removeEventListener("load",m,!1);e.removeEventListener("error",
m,!1);f.body.removeChild(e);e=null;var g=-1,s="unknown";a&&("load"!==a.type||c.wasCalled(b)||(a={type:"error"}),s=a.type,g="error"===a.type?404:200);d&&d(g,s)};e.addEventListener("load",m,!1);e.addEventListener("error",m,!1);f.body.appendChild(e);return m}return function(f,h,k,l,m,n,r,s,H,M){function p(){F&&F();N&&N.abort()}function L(b,c,e,f,g){w(C)&&d.cancel(C);F=N=null;b(c,e,f,g);a.$$completeOutstandingRequest(A)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"===R(f))var y=c.createCallback(h),
F=e(h,y,function(a,b){var d=200===a&&c.getResponse(y);L(l,a,d,"",b);c.removeCallback(y)});else{var N=b(f,h);N.open(f,h,!0);q(m,function(a,b){w(a)&&N.setRequestHeader(b,a)});N.onload=function(){var a=N.statusText||"",b="response"in N?N.response:N.responseText,c=1223===N.status?204:N.status;0===c&&(c=b?200:"file"===wa(h).protocol?404:0);L(l,c,b,N.getAllResponseHeaders(),a)};f=function(){L(l,-1,null,null,"")};N.onerror=f;N.onabort=f;N.ontimeout=f;q(H,function(a,b){N.addEventListener(b,a)});q(M,function(a,
b){N.upload.addEventListener(b,a)});r&&(N.withCredentials=!0);if(s)try{N.responseType=s}catch(I){if("json"!==s)throw I;}N.send(z(k)?null:k)}if(0<n)var C=d(p,n);else n&&x(n.then)&&n.then(p)}}function Ff(){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,f){function e(a){return"\\\\\\"+a}function g(c){return c.replace(n,a).replace(r,b)}function h(a,b,c,d){var e=a.$watch(function(a){e();
return d(a)},b,c);return e}function k(e,k,n,p){function r(a){try{var b=a;a=n?f.getTrusted(n,b):f.valueOf(b);var d;if(p&&!w(a))d=a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=gb(a)}d=a}return d}catch(g){c(Ka.interr(e,g))}}if(!e.length||-1===e.indexOf(a)){var y;k||(k=g(e),y=ia(k),y.exp=e,y.expressions=[],y.$$watchDelegate=h);return y}p=!!p;var F,q,I=0,C=[],J=[];y=e.length;for(var u=[],Q=[];I<y;)if(-1!==(F=e.indexOf(a,I))&&-1!==(q=e.indexOf(b,F+
l)))I!==F&&u.push(g(e.substring(I,F))),I=e.substring(F+l,q),C.push(I),J.push(d(I,r)),I=q+m,Q.push(u.length),u.push("");else{I!==y&&u.push(g(e.substring(I)));break}n&&1<u.length&&Ka.throwNoconcat(e);if(!k||C.length){var K=function(a){for(var b=0,c=C.length;b<c;b++){if(p&&z(a[b]))return;u[Q[b]]=a[b]}return u.join("")};return U(function(a){var b=0,d=C.length,f=Array(d);try{for(;b<d;b++)f[b]=J[b](a);return K(f)}catch(g){c(Ka.interr(e,g))}},{exp:e,expressions:C,$$watchDelegate:function(a,b){var c;return a.$watchGroup(J,
function(d,e){var f=K(d);x(b)&&b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,m=b.length,n=new RegExp(a.replace(/./g,e),"g"),r=new RegExp(b.replace(/./g,e),"g");k.startSymbol=function(){return a};k.endSymbol=function(){return b};return k}]}function Gf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,f){function e(e,k,l,m){function n(){r?e.apply(null,s):e(p)}var r=4<arguments.length,s=r?ya.call(arguments,4):[],H=b.setInterval,M=b.clearInterval,p=0,L=w(m)&&!m,y=(L?c:d).defer(),
F=y.promise;l=w(l)?l:0;F.$$intervalId=H(function(){L?f.defer(n):a.$evalAsync(n);y.notify(p++);0<l&&p>=l&&(y.resolve(p),M(F.$$intervalId),delete g[F.$$intervalId]);L||a.$apply()},k);g[F.$$intervalId]=y;return F}var g={};e.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 e}]}function kc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=wb(a[b]);return a.join("/")}function rd(a,b){var d=wa(a);b.$$protocol=
d.protocol;b.$$host=d.hostname;b.$$port=Y(d.port)||Ag[d.protocol]||null}function sd(a,b){if(Bg.test(a))throw ob("badpath",a);var d="/"!==a.charAt(0);d&&(a="/"+a);var c=wa(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=Ic(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function ra(a,b){if(b.slice(0,a.length)===a)return b.substr(a.length)}function Ja(a){var b=a.indexOf("#");return-1===
b?a:a.substr(0,b)}function pb(a){return a.replace(/(#.+)|#$/,"$1")}function lc(a,b,d){this.$$html5=!0;d=d||"";rd(a,this);this.$$parse=function(a){var d=ra(b,a);if(!B(d))throw ob("ipthprfx",a,b);sd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Yb(this.$$search),d=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=kc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,f){if(f&&"#"===f[0])return this.hash(f.slice(1)),
!0;var e,g;w(e=ra(a,c))?(g=e,g=d&&w(e=ra(d,e))?b+(ra("/",e)||e):a+g):w(e=ra(b,c))?g=b+e:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function mc(a,b,d){rd(a,this);this.$$parse=function(c){var f=ra(a,c)||ra(b,c),e;z(f)||"#"!==f.charAt(0)?this.$$html5?e=f:(e="",z(f)&&(a=c,this.replace())):(e=ra(d,f),z(e)&&(e=f));sd(e,this);c=this.$$path;var f=a,g=/^\/[A-Z]:(\/.*)/;e.slice(0,f.length)===f&&(e=e.replace(f,""));g.exec(e)||(c=(e=g.exec(c))?e[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=
Yb(this.$$search),f=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=kc(this.$$path)+(b?"?"+b:"")+f;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Ja(a)===Ja(b)?(this.$$parse(b),!0):!1}}function td(a,b,d){this.$$html5=!0;mc.apply(this,arguments);this.$$parseLinkUrl=function(c,f){if(f&&"#"===f[0])return this.hash(f.slice(1)),!0;var e,g;a===Ja(c)?e=c:(g=ra(b,c))?e=a+d+g:b===c+"/"&&(e=b);e&&this.$$parse(e);return!!e};this.$$compose=function(){var b=Yb(this.$$search),
f=this.$$hash?"#"+wb(this.$$hash):"";this.$$url=kc(this.$$path)+(b?"?"+b:"")+f;this.$$absUrl=a+d+this.$$url}}function Lb(a){return function(){return this[a]}}function ud(a,b){return function(d){if(z(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Nf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a};this.html5Mode=function(a){if(Ma(a))return b.enabled=a,this;if(G(a)){Ma(a.enabled)&&(b.enabled=a.enabled);Ma(a.requireBase)&&
(b.requireBase=a.requireBase);if(Ma(a.rewriteLinks)||B(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,f,e,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 n=c.url(),r;if(b.enabled){if(!m&&b.requireBase)throw ob("nobase");
r=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/");m=f.history?lc:td}else r=Ja(n),m=mc;var s=r.substr(0,Ja(r).lastIndexOf("/")+1);l=new m(r,s,"#"+a);l.$$parseLinkUrl(n,n);l.$$state=c.state();var H=/^\s*(javascript|mailto):/i;e.on("click",function(a){var f=b.rewriteLinks;if(f&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var g=E(a.target);"a"!==va(g[0]);)if(g[0]===e[0]||!(g=g.parent())[0])return;if(!B(f)||!z(g.attr(f))){var f=g.prop("href"),h=g.attr("href")||g.attr("xlink:href");
G(f)&&"[object SVGAnimatedString]"===f.toString()&&(f=wa(f.animVal).href);H.test(f)||!f||g.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(f,h)||(a.preventDefault(),l.absUrl()!==c.url()&&d.$apply())}}});pb(l.absUrl())!==pb(n)&&c.url(l.absUrl(),!0);var M=!0;c.onUrlChange(function(a,b){z(ra(s,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=pb(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)):(M=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=pb(c.url()),b=pb(l.absUrl()),e=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&f.history&&e!==l.$$state;if(M||m)M=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,e).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=e):(m&&h(b,g,e===l.$$state?null:l.$$state),k(a,e)))});l.$$replace=!1});return l}]}function Of(){var a=!0,b=this;this.debugEnabled=function(b){return w(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 f(a){var b=d.console||{},f=b[a]||b.log||A;a=!1;try{a=!!f.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});return f.apply(b,a)}:function(a,b){f(a,null==b?"":b)}}return{log:f("log"),info:f("info"),warn:f("warn"),error:f("error"),
debug:function(){var c=f("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Wa(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw ea("isecfld",b);return a}function Cg(a){return a+""}function Ha(a,b){if(a){if(a.constructor===a)throw ea("isecfn",b);if(a.window===a)throw ea("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ea("isecdom",b);if(a===Object)throw ea("isecobj",b);}return a}function vd(a,
b){if(a){if(a.constructor===a)throw ea("isecfn",b);if(a===Dg||a===Eg||a===Fg)throw ea("isecff",b);}}function Mb(a,b){if(a&&(a===wd||a===xd||a===yd||a===zd||a===Ad||a===Bd||a===Gg||a===Hg||a===Nb||a===Ig||a===Cd||a===Jg))throw ea("isecaf",b);}function Kg(a,b){return"undefined"!==typeof a?a:b}function Dd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function X(a,b){var d,c,f;switch(a.type){case t.Program:d=!0;q(a.body,function(a){X(a.expression,b);d=d&&a.expression.constant});a.constant=
d;break;case t.Literal:a.constant=!0;a.toWatch=[];break;case t.UnaryExpression:X(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case t.BinaryExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case t.LogicalExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case t.ConditionalExpression:X(a.test,b);X(a.alternate,b);X(a.consequent,
b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case t.Identifier:a.constant=!1;a.toWatch=[a];break;case t.MemberExpression:X(a.object,b);a.computed&&X(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case t.CallExpression:d=f=a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){X(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=f?c:[a];
break;case t.AssignmentExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case t.ArrayExpression:d=!0;c=[];q(a.elements,function(a){X(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case t.ObjectExpression:d=!0;c=[];q(a.properties,function(a){X(a.value,b);d=d&&a.value.constant&&!a.computed;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case t.ThisExpression:a.constant=
!1;a.toWatch=[];break;case t.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Ed(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Fd(a){return a.type===t.Identifier||a.type===t.MemberExpression}function Gd(a){if(1===a.body.length&&Fd(a.body[0].expression))return{type:t.AssignmentExpression,left:a.body[0].expression,right:{type:t.NGValueParameter},operator:"="}}function Hd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===
t.Literal||a.body[0].expression.type===t.ArrayExpression||a.body[0].expression.type===t.ObjectExpression)}function Id(a,b){this.astBuilder=a;this.$filter=b}function Jd(a,b){this.astBuilder=a;this.$filter=b}function Ob(a){return"constructor"===a}function nc(a){return x(a.valueOf)?a.valueOf():Lg.call(a)}function Pf(){var a=W(),b=W(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,f;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns=function(a,b){c=a;f=b;return this};this.$get=["$filter",
function(e){function g(c,d,f){var g,k,H;f=f||L;switch(typeof c){case "string":H=c=c.trim();var u=f?b:a;g=u[H];if(!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=f?p:M;var Q=new oc(g);g=(new pc(Q,e,g)).parse(c);g.constant?g.$$watchDelegate=r:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l);f&&(g=h(g));u[H]=g}return s(g,d);case "function":return s(c,d);default:return s(A,d)}}function h(a){function b(c,d,e,f){var g=L;L=!0;try{return a(c,d,e,f)}finally{L=g}}if(!a)return a;
b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);b.inputs=a.inputs;return b}function k(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=nc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function l(a,b,c,d,e){var f=d.inputs,g;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&nc(b));return g},b,c,e)}for(var l=[],
m=[],n=0,s=f.length;n<s;n++)l[n]=k,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a);if(b||(b=!k(h,l[c])))m[c]=h,l[c]=h&&nc(h)}b&&(g=d(a,void 0,void 0,m));return g},b,c,e)}function m(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;x(b)&&b.apply(this,arguments);w(a)&&d.$$postDigest(function(){w(f)&&e()})},c)}function n(a,b,c,d){function e(a){var b=!0;q(a,function(a){w(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},
function(a,c,d){g=a;x(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function r(a,b,c,d){var e=a.$watch(function(a){e();return d(a)},b,c);return e}function s(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==n&&c!==m?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 w(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?
a.inputs:[a]);return c}var H=$().noUnsafeEval,M={csp:H,expensiveChecks:!1,literals:ta(d),isIdentifierStart:x(c)&&c,isIdentifierContinue:x(f)&&f},p={csp:H,expensiveChecks:!0,literals:ta(d),isIdentifierStart:x(c)&&c,isIdentifierContinue:x(f)&&f},L=!1;g.$$runningExpensiveChecks=function(){return L};return g}]}function Rf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return Kd(function(b){a.$evalAsync(b)},b)}]}function Sf(){this.$get=["$browser","$exceptionHandler",function(a,b){return Kd(function(b){a.defer(b)},
b)}]}function Kd(a,b){function d(){var a=new g;a.resolve=f(a,a.resolve);a.reject=f(a,a.reject);a.notify=f(a,a.notify);return a}function c(){this.$$state={status:0}}function f(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=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{x(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 g(){this.promise=new c}function h(a){var b=new g;b.reject(a);return b.promise}function k(a,b,c){var d=null;try{x(c)&&(d=c())}catch(e){return h(e)}return d&&x(d.then)?d.then(function(){return b(a)},h):b(a)}function l(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)}function m(a){if(!x(a))throw n("norslvr",a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise}var n=P("$q",TypeError);U(c.prototype,{then:function(a,b,c){if(z(a)&&z(b)&&z(c))return this;
var d=new g;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,r,a)},function(b){return k(b,h,a)},b)}});U(g.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(n("qcycle",a)):this.$$resolve(a))},$$resolve:function(a){function c(a){k||(k=!0,h.$$resolve(a))}function d(a){k||
(k=!0,h.$$reject(a))}var g,h=this,k=!1;try{if(G(a)||x(a))g=a&&a.then;x(g)?(this.promise.$$state.status=-1,g.call(a,c,d,f(this,this.notify))):(this.promise.$$state.value=a,this.promise.$$state.status=1,e(this.promise.$$state))}catch(l){d(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(x(a)?a(c):c)}catch(h){b(h)}}})}});var r=l;m.prototype=c.prototype;m.defer=d;m.reject=h;m.when=l;m.resolve=r;m.all=function(a){var b=new g,c=0,d=D(a)?[]:{};q(a,function(a,e){c++;l(a).then(function(a){d[e]=a;--c||b.resolve(d)},function(a){b.reject(a)})});0===c&&b.resolve(d);return b.promise};m.race=function(a){var b=d();q(a,function(a){l(a).then(b.resolve,b.reject)});return b.promise};return m}function ag(){this.$get=
["$window","$timeout",function(a,b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,f=!!d,e=f?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};e.supported=f;return e}]}function Qf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=
0;this.$id=++vb;this.$$ChildScope=null}b.prototype=a;return b}var b=10,d=P("$rootScope"),c=null,f=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(e,g,h){function k(a){a.currentScope.$$destroyed=!0}function l(a){9===Ca&&(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=++vb;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 n(a){if(L.$$phase)throw d("inprog",L.$$phase);L.$$phase=a}function r(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function s(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function H(){}function M(){for(;t.length;)try{t.shift()()}catch(a){e(a)}f=
null}function p(){null===f&&(f=h.defer(function(){L.$apply(M)}))}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:H,get:f,exp:e||a,eq:!!d};c=null;x(b)||(l.fn=A);k||(k=h.$$watchers=[],k.$$digestWatchIndex=-1);k.unshift(l);k.$$digestWatchIndex++;r(this,1);return function(){var a=db(k,l);0<=a&&(r(h,-1),a<k.$$digestWatchIndex&&k.$$digestWatchIndex--);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)});q(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(!z(e)){if(G(e))if(na(e))for(f!==n&&(f=n,s=f.length=0,l++),a=e.length,s!==a&&(l++,f.length=s=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!==p&&(f=p={},s=0,l++);a=0;for(b in e)xa.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)):(s++,f[b]=g,l++));if(s>a)for(b in l++,f)xa.call(e,b)||(s--,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),n=[],p={},r=!0,s=0;return this.$watch(m,function(){r?(r=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(na(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)xa.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,k,l,m,p,r,s=b,q,t=[],N,w;n("$digest");
h.$$checkUrlChange();this===L&&null!==f&&(h.defer.cancel(f),M());c=null;do{r=!1;q=this;for(p=0;p<y.length;p++){try{w=y[p],w.scope.$eval(w.expression,w.locals)}catch(v){e(v)}c=null}y.length=0;a:do{if(p=q.$$watchers)for(p.$$digestWatchIndex=p.length;p.$$digestWatchIndex--;)try{if(a=p[p.$$digestWatchIndex])if(m=a.get,(g=m(q))!==(k=a.last)&&!(a.eq?pa(g,k):ja(g)&&ja(k)))r=!0,c=a,a.last=a.eq?ta(g,null):g,l=a.fn,l(g,k===H?g:k,q),5>s&&(N=4-s,t[N]||(t[N]=[]),t[N].push({msg:x(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):
a.exp,newVal:g,oldVal:k}));else if(a===c){r=!1;break a}}catch(z){e(z)}if(!(p=q.$$watchersCount&&q.$$childHead||q!==this&&q.$$nextSibling))for(;q!==this&&!(p=q.$$nextSibling);)q=q.$parent}while(q=p);if((r||y.length)&&!s--)throw L.$$phase=null,d("infdig",b,t);}while(r||y.length);for(L.$$phase=null;I<F.length;)try{F[I++]()}catch(A){e(A)}F.length=I=0},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===L&&h.$$applicationDestroyed();r(this,
-this.$$watchersCount);for(var b in this.$$listenerCount)s(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=A;this.$on=this.$watch=this.$watchGroup=function(){return A};this.$$listeners=
{};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){L.$$phase||y.length||h.defer(function(){y.length&&L.$digest()});y.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){F.push(a)},$apply:function(a){try{n("$apply");try{return this.$eval(a)}finally{L.$$phase=null}}catch(b){e(b)}finally{try{L.$digest()}catch(c){throw e(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&t.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,s(e,1,a))}},$emit:function(a,b){var c=[],d,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=eb([h],arguments,1),l,m;do{d=f.$$listeners[a]||c;h.currentScope=f;l=0;for(m=d.length;l<
m;l++)if(d[l])try{d[l].apply(null,k)}catch(n){e(n)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;f=f.$parent}while(f);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return f;for(var g=eb([f],arguments,1),h,k;c=d;){f.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){e(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}f.currentScope=null;return f}};var L=new m,y=L.$$asyncQueue=[],F=L.$$postDigestQueue=[],t=L.$$applyAsyncQueue=[],I=0;return L}]}function Ie(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return w(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return w(a)?(b=a,this):b};
this.$get=function(){return function(d,c){var f=c?b:a,e;e=wa(d&&d.trim()).href;return""===e||e.match(f)?d:"unsafe:"+e}}}function Mg(a){if("self"===a)return a;if(B(a)){if(-1<a.indexOf("***"))throw Ia("iwcard",a);a=Ld(a).replace(/\\\*\\\*/g,".*").replace(/\\\*/g,"[^:/.?&;]*");return new RegExp("^"+a+"$")}if(ab(a))return new RegExp("^"+a.source+"$");throw Ia("imatcher");}function Md(a){var b=[];w(a)&&q(a,function(a){b.push(Mg(a))});return b}function Uf(){this.SCE_CONTEXTS=sa;var a=["self"],b=[];this.resourceUrlWhitelist=
function(b){arguments.length&&(a=Md(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=Md(a));return b};this.$get=["$injector",function(d){function c(a,b){return"self"===a?qd(b):!!a.exec(b.href)}function f(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 e=function(a){throw Ia("unsafe");
};d.has("$sanitize")&&(e=d.get("$sanitize"));var g=f(),h={};h[sa.HTML]=f(g);h[sa.CSS]=f(g);h[sa.URL]=f(g);h[sa.JS]=f(g);h[sa.RESOURCE_URL]=f(h[sa.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw Ia("icontext",a,b);if(null===b||z(b)||""===b)return b;if("string"!==typeof b)throw Ia("itype",a);return new c(b)},getTrusted:function(d,f){if(null===f||z(f)||""===f)return f;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&f instanceof g)return f.$$unwrapTrustedValue();if(d===sa.RESOURCE_URL){var g=
wa(f.toString()),n,r,s=!1;n=0;for(r=a.length;n<r;n++)if(c(a[n],g)){s=!0;break}if(s)for(n=0,r=b.length;n<r;n++)if(c(b[n],g)){s=!1;break}if(s)return f;throw Ia("insecurl",f.toString());}if(d===sa.HTML)return e(f);throw Ia("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Tf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ca)throw Ia("iequirks");var c=ma(sa);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=bb);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 f=c.parseAs,e=c.getTrusted,g=c.trustAs;q(sa,function(a,b){var d=R(b);c[jb("parse_as_"+d)]=function(b){return f(a,b)};c[jb("get_trusted_"+d)]=function(b){return e(a,b)};c[jb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function Vf(){this.$get=["$window",
"$document",function(a,b){var d={},c=!(a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,f=Y((/android (\d+)/.exec(R((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h=g.body&&g.body.style,k=!1,l=!1;h&&(k=!!("transition"in h||"webkitTransition"in h),l=!!("animation"in h||"webkitAnimation"in h));return{history:!(!c||4>f||e),hasEvent:function(a){if("input"===a&&11>=Ca)return!1;
if(z(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:$(),transitions:k,animations:l,android:f}}]}function Xf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,f){function e(g,h){e.totalPendingRequests++;if(!B(g)||z(b.get(g)))g=f.getTrustedResourceUrl(g);var k=d.defaults&&d.defaults.transformResponse;D(k)?k=k.filter(function(a){return a!==hc}):k===hc&&(k=null);return d.get(g,U({cache:b,transformResponse:k},
a))["finally"](function(){e.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw Ng("tpload",g,a.status,a.statusText);return c.reject(a)})}e.totalPendingRequests=0;return e}]}function Yf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=Z.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+Ld(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 Zf(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(a,b,d,c,f){function e(e,
k,l){x(e)||(l=k,k=e,e=A);var m=ya.call(arguments,3),n=w(l)&&!l,r=(n?c:d).defer(),s=r.promise,q;q=b.defer(function(){try{r.resolve(e.apply(null,m))}catch(b){r.reject(b),f(b)}finally{delete g[s.$$timeoutId]}n||a.$apply()},k);s.$$timeoutId=q;g[q]=r;return s}var g={};e.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 e}]}function wa(a){Ca&&(aa.setAttribute("href",a),a=aa.href);aa.setAttribute("href",
a);return{href:aa.href,protocol:aa.protocol?aa.protocol.replace(/:$/,""):"",host:aa.host,search:aa.search?aa.search.replace(/^\?/,""):"",hash:aa.hash?aa.hash.replace(/^#/,""):"",hostname:aa.hostname,port:aa.port,pathname:"/"===aa.pathname.charAt(0)?aa.pathname:"/"+aa.pathname}}function qd(a){a=B(a)?wa(a):a;return a.protocol===Nd.protocol&&a.host===Nd.host}function $f(){this.$get=ia(v)}function Od(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},c={},f="";return function(){var a,
g,h,k,l;try{a=d.cookie||""}catch(m){a=""}if(a!==f)for(f=a,a=f.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),z(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function dg(){this.$get=Od}function Uc(a){function b(d,c){if(G(d)){var f={};q(d,function(a,c){f[c]=b(c,a)});return f}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",Pd);b("date",Qd);b("filter",Og);b("json",Pg);
b("limitTo",Qg);b("lowercase",Rg);b("number",Rd);b("orderBy",Sd);b("uppercase",Sg)}function Og(){return function(a,b,d,c){if(!na(a)){if(null==a)return a;throw P("filter")("notarray",a);}c=c||"$";var f;switch(qc(b)){case "function":break;case "boolean":case "null":case "number":case "string":f=!0;case "object":b=Tg(b,d,c,f);break;default:return a}return Array.prototype.filter.call(a,b)}}function Tg(a,b,d,c){var f=G(a)&&d in a;!0===b?b=pa:x(b)||(b=function(a,b){if(z(a))return!1;if(null===a||null===
b)return a===b;if(G(b)||G(a)&&!Dc(a))return!1;a=R(""+a);b=R(""+b);return-1!==a.indexOf(b)});return function(e){return f&&!G(e)?Pa(e,a[d],b,d,!1):Pa(e,a,b,d,c)}}function Pa(a,b,d,c,f,e){var g=qc(a),h=qc(b);if("string"===h&&"!"===b.charAt(0))return!Pa(a,b.substring(1),d,c,f);if(D(a))return a.some(function(a){return Pa(a,b,d,c,f)});switch(g){case "object":var k;if(f){for(k in a)if("$"!==k.charAt(0)&&Pa(a[k],b,d,c,!0))return!0;return e?!1:Pa(a,b,d,c,!1)}if("object"===h){for(k in b)if(e=b[k],!x(e)&&!z(e)&&
(g=k===c,!Pa(g?a:a[k],e,d,c,g,g)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function qc(a){return null===a?"null":typeof a}function Pd(a){var b=a.NUMBER_FORMATS;return function(a,c,f){z(c)&&(c=b.CURRENCY_SYM);z(f)&&(f=b.PATTERNS[1].maxFrac);return null==a?a:Td(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,f).replace(/\u00A4/g,c)}}function Rd(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Td(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Ug(a){var b=
0,d,c,f,e,g;-1<(c=a.indexOf(Ud))&&(a=a.replace(Ud,""));0<(f=a.search(/e/i))?(0>c&&(c=f),c+=+a.slice(f+1),a=a.substring(0,f)):0>c&&(c=a.length);for(f=0;a.charAt(f)===rc;f++);if(f===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===rc;)g--;c-=f;d=[];for(e=0;f<=g;f++,e++)d[e]=+a.charAt(f)}c>Vd&&(d=d.splice(0,Vd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function Vg(a,b,d,c){var f=a.d,e=f.length-a.i;b=z(b)?Math.min(Math.max(d,e),c):+b;d=b+a.i;c=f[d];if(0<d){f.splice(Math.max(a.i,d));for(var g=d;g<f.length;g++)f[g]=
0}else for(e=Math.max(0,e),a.i=1,f.length=Math.max(1,d=b+1),f[0]=0,g=1;g<d;g++)f[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)f.unshift(0),a.i++;f.unshift(1);a.i++}else f[d-1]++;for(;e<Math.max(0,b);e++)f.push(0);if(b=f.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))f.unshift(b),a.i++}function Td(a,b,d,c,f){if(!B(a)&&!ba(a)||isNaN(a))return"";var e=!isFinite(a),g=!1,h=Math.abs(a)+"",k="";if(e)k="\u221e";else{g=Ug(h);Vg(g,f,b.minFrac,b.maxFrac);k=g.d;h=g.i;f=g.e;e=[];for(g=k.reduce(function(a,
b){return a&&!b},!0);0>h;)k.unshift(0),h++;0<h?e=k.splice(h,k.length):(e=k,k=[0]);h=[];for(k.length>=b.lgSize&&h.unshift(k.splice(-b.lgSize,k.length).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize,k.length).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);e.length&&(k+=c+e.join(""));f&&(k+="e+"+f)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Pb(a,b,d,c){var f="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,f="-");for(a=""+a;a.length<b;)a=rc+a;d&&(a=a.substr(a.length-b));return f+
a}function V(a,b,d,c,f){d=d||0;return function(e){e=e["get"+a]();if(0<d||e>-d)e+=d;0===e&&-12===d&&(e=12);return Pb(e,b,c,f)}}function qb(a,b,d){return function(c,f){var e=c["get"+a](),g=zb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return f[g][e]}}function Wd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Xd(a){return function(b){var d=Wd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Pb(b,a)}}function sc(a,
b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Qd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var e=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(e=Y(b[9]+b[10]),g=Y(b[9]+b[11]));h.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));e=Y(b[4]||0)-e;g=Y(b[5]||0)-g;h=Y(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,e,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,e){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;B(c)&&(c=Wg.test(c)?Y(c):b(c));ba(c)&&(c=new Date(c));if(!fa(c)||!isFinite(c.getTime()))return c;for(;d;)(l=Xg.exec(d))?(h=eb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();e&&(m=Gc(e,m),c=Xb(c,e,!0));q(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){z(b)&&(b=2);return gb(a,b)}}function Qg(){return function(a,
b,d){b=Infinity===Math.abs(Number(b))?Number(b):Y(b);if(ja(b))return a;ba(a)&&(a=a.toString());if(!na(a))return a;d=!d||isNaN(d)?0:Y(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?tc(a,d,d+b):0===d?tc(a,b,a.length):tc(a,Math.max(0,d+b),d)}}function tc(a,b,d){return B(a)?a.slice(b,d):ya.call(a,b,d)}function Sd(a){function b(b){return b.map(function(b){var c=1,d=bb;if(x(b))d=b;else if(B(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var f=
d(),d=function(a){return a[f]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,k=b.type;if(d===k){var k=a.value,l=b.value;"string"===d?(k=k.toLowerCase(),l=l.toLowerCase()):"object"===d&&(G(k)&&(k=a.index),G(l)&&(l=b.index));k!==l&&(c=k<l?-1:1)}else c=d<k?-1:1;return c}return function(a,e,g,h){if(null==a)return a;if(!na(a))throw P("orderBy")("notarray",a);D(e)||(e=[e]);0===e.length&&
(e=["+"]);var k=b(e),l=g?-1:1,m=x(h)?h:c;a=Array.prototype.map.call(a,function(a,b){return{value:a,tieBreaker:{value:b,type:"number",index:b},predicateValues:k.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("object"===c)a:{if(x(e.valueOf)&&(e=e.valueOf(),d(e)))break a;Dc(e)&&(e=e.toString(),d(e))}return{value:e,type:c,index:b}})}});a.sort(function(a,b){for(var c=0,d=k.length;c<d;c++){var e=m(a.predicateValues[c],b.predicateValues[c]);if(e)return e*k[c].descending*
l}return m(a.tieBreaker,b.tieBreaker)*l});return a=a.map(function(a){return a.value})}}function Xa(a){x(a)&&(a={link:a});a.restrict=a.restrict||"AC";return ia(a)}function Yd(a,b,d,c,f){var e=this,g=[];e.$error={};e.$$success={};e.$pending=void 0;e.$name=f(b.name||b.ngForm||"")(d);e.$dirty=!1;e.$pristine=!0;e.$valid=!0;e.$invalid=!1;e.$submitted=!1;e.$$parentForm=Qb;e.$rollbackViewValue=function(){q(g,function(a){a.$rollbackViewValue()})};e.$commitViewValue=function(){q(g,function(a){a.$commitViewValue()})};
e.$addControl=function(a){Ta(a.$name,"input");g.push(a);a.$name&&(e[a.$name]=a);a.$$parentForm=e};e.$$renameControl=function(a,b){var c=a.$name;e[c]===a&&delete e[c];e[b]=a;a.$name=b};e.$removeControl=function(a){a.$name&&e[a.$name]===a&&delete e[a.$name];q(e.$pending,function(b,c){e.$setValidity(c,null,a)});q(e.$error,function(b,c){e.$setValidity(c,null,a)});q(e.$$success,function(b,c){e.$setValidity(c,null,a)});db(g,a);a.$$parentForm=Qb};Zd({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&&(db(d,c),0===d.length&&delete a[b])},$animate:c});e.$setDirty=function(){c.removeClass(a,Ya);c.addClass(a,Rb);e.$dirty=!0;e.$pristine=!1;e.$$parentForm.$setDirty()};e.$setPristine=function(){c.setClass(a,Ya,Rb+" ng-submitted");e.$dirty=!1;e.$pristine=!0;e.$submitted=!1;q(g,function(a){a.$setPristine()})};e.$setUntouched=function(){q(g,function(a){a.$setUntouched()})};e.$setSubmitted=function(){c.addClass(a,"ng-submitted");
e.$submitted=!0;e.$$parentForm.$setSubmitted()}}function uc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function Za(a,b,d,c,f,e){var g=R(b[0].type);if(!f.android){var h=!1;b.on("compositionstart",function(){h=!0});b.on("compositionend",function(){h=!1;l()})}var k,l=function(a){k&&(e.defer.cancel(k),k=null);if(!h){var f=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(f=da(f));(c.$viewValue!==f||""===f&&c.$$hasNativeValidators)&&c.$setViewValue(f,a)}};
if(f.hasEvent("input"))b.on("input",l);else{var m=function(a,b,c){k||(k=e.defer(function(){k=null;b&&b.value===c||l(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(f.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if($d[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=e.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});
c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Sb(a,b){return function(d,c){var f,e;if(fa(d))return d;if(B(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(f=a.exec(d))return f.shift(),e=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},
q(f,function(a,c){c<b.length&&(e[b[c]]=+a)}),new Date(e.yyyy,e.MM-1,e.dd,e.HH,e.mm,e.ss||0,1E3*e.sss||0)}return NaN}}function rb(a,b,d,c){return function(f,e,g,h,k,l,m){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function r(a){return w(a)&&!fa(a)?d(a)||void 0:a}vc(f,e,g,h);Za(f,e,g,h,k,l);var s=h&&h.$options&&h.$options.timezone,q;h.$$parserName=a;h.$parsers.push(function(a){if(h.$isEmpty(a))return null;if(b.test(a))return a=d(a,q),s&&(a=Xb(a,s)),a});h.$formatters.push(function(a){if(a&&
!fa(a))throw sb("datefmt",a);if(n(a))return(q=a)&&s&&(q=Xb(q,s,!0)),m("date")(a,c,s);q=null;return""});if(w(g.min)||g.ngMin){var t;h.$validators.min=function(a){return!n(a)||z(t)||d(a)>=t};g.$observe("min",function(a){t=r(a);h.$validate()})}if(w(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!n(a)||z(p)||d(a)<=p};g.$observe("max",function(a){p=r(a);h.$validate()})}}}function vc(a,b,d,c){(c.$$hasNativeValidators=G(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};
return c.badInput||c.typeMismatch?void 0:a})}function ae(a){a.$$parserName="number";a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if($g.test(b))return parseFloat(b)});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!ba(b))throw sb("numfmt",b);b=b.toString()}return b})}function tb(a){w(a)&&!ba(a)&&(a=parseFloat(a));return ja(a)?void 0:a}function wc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1<a&&1>a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function be(a,b,d,c,f){if(w(c)){a=
a(c);if(!a.constant)throw sb("constexpr",d,c);return a(b)}return f}function xc(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 f=a[d],m=0;m<b.length;m++)if(f===b[m])continue a;c.push(f)}return c}function f(a){var b=[];return D(a)?(q(a,function(a){b=b.concat(f(a))}),b):B(a)?a.split(" "):G(a)?(q(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",link:function(e,g,h){function k(a){a=l(a,1);h.$addClass(a)}function l(a,
b){var c=g.data("$classCounts")||W(),d=[];q(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 m(a,b){var e=c(b,a),f=c(a,b),e=l(e,1),f=l(f,-1);e&&e.length&&d.addClass(g,e);f&&f.length&&d.removeClass(g,f)}function n(a){if(!0===b||(e.$index&1)===b){var c=f(a||[]);if(!r)k(c);else if(!pa(a,r)){var d=f(r);m(d,c)}}r=D(a)?a.map(function(a){return ma(a)}):ma(a)}var r;h.$observe("class",function(b){n(e.$eval(h[a]))});"ngClass"!==a&&e.$watch("$index",
function(a,c){var d=a&1;if(d!==(c&1)){var e=f(r);d===b?k(e):(d=l(e,-1),h.$removeClass(d))}});e.$watch(h[a],n,!0)}}}]}function Zd(a){function b(a,b){b&&!e[a]?(k.addClass(f,a),e[a]=!0):!b&&e[a]&&(k.removeClass(f,a),e[a]=!1)}function d(a,c){a=a?"-"+Kc(a,"-"):"";b(ub+a,!0===c);b(ce+a,!1===c)}var c=a.ctrl,f=a.$element,e={},g=a.set,h=a.unset,k=a.$animate;e[ce]=!(e[ub]=f.hasClass(ub));c.$setValidity=function(a,e,f){z(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&h(c.$pending,a,f),de(c.$pending)&&
(c.$pending=void 0));Ma(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(ee,!0),c.$valid=c.$invalid=void 0,d("",null)):(b(ee,!1),c.$valid=de(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?void 0:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function de(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var ah=/^\/(.+)\/([a-z]*)$/,xa=Object.prototype.hasOwnProperty,
R=function(a){return B(a)?a.toLowerCase():a},zb=function(a){return B(a)?a.toUpperCase():a},Ca,E,Ba,ya=[].slice,vg=[].splice,bh=[].push,oa=Object.prototype.toString,Ec=Object.getPrototypeOf,za=P("ng"),Z=v.angular||(v.angular={}),Zb,vb=0;Ca=v.document.documentMode;var ja=Number.isNaN||function(a){return a!==a};A.$inject=[];bb.$inject=[];var D=Array.isArray,re=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,da=function(a){return B(a)?a.trim():a},Ld=function(a){return a.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g,
"\\$1").replace(/\x08/g,"\\x08")},$=function(){if(!w($.rules)){var a=v.document.querySelector("[ng-csp]")||v.document.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");$.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=$;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return $.rules},xb=function(){if(w(xb.name_))return xb.name_;var a,b,d=Qa.length,
c,f;for(b=0;b<d;++b)if(c=Qa[b],a=v.document.querySelector("["+c.replace(":","\\:")+"jq]")){f=a.getAttribute(c+"jq");break}return xb.name_=f},ue=/:/g,Qa=["ng-","data-ng-","ng:","x-ng-"],xe=function(a){var b=a.currentScript;if(!b)return!0;if(!(b instanceof v.HTMLScriptElement||b instanceof v.SVGScriptElement))return!1;b=b.attributes;return[b.getNamedItem("src"),b.getNamedItem("href"),b.getNamedItem("xlink:href")].every(function(b){if(!b)return!0;if(!b.value)return!1;var c=a.createElement("a");c.href=
b.value;if(a.location.origin===c.origin)return!0;switch(c.protocol){case "http:":case "https:":case "ftp:":case "blob:":case "file:":case "data:":return!0;default:return!1}})}(v.document),Ae=/[A-Z]/g,Lc=!1,De=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)(?:[^\w:>-][^>]*)?)\/>/gi,Na=3,He={vendor:"XLTS.dev",distribution:"AngularJS NES",author:"HeroDevs, Inc.",full:"1.5.26",major:1,minor:5,dot:26,codeName:"angularjs-nes-1.5.26"};S.expando="ng339";S.$jQueryLt4CompatibilityEnabled=!0;
var mb=S.cache={},ig=1;S._data=function(a){return this.cache[a[this.expando]]||{}};var eg=/([:\-_]+(.))/g,fg=/^moz([A-Z])/,Db={mouseleave:"mouseout",mouseenter:"mouseover"},ac=P("jqLite"),hg=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,$b=/<|&#?\w+;/,gg=/<([\w:-]+)/,ka={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr","tbody","table"]};ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead;ka.th=ka.td;var kb={option:[1,'<select multiple="multiple">',"</select>"],_default:[0,"",""]},yc;for(yc in ka){var fe=
ka[yc],ge=fe.slice().reverse();kb[yc]=[ge.length,"<"+ge.join("><")+">","</"+fe.join("></")+">"]}kb.optgroup=kb.option;var ng=v.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Ra=S.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===v.document.readyState?v.setTimeout(b):(this.on("DOMContentLoaded",b),S(v).on("load",b))},toString:function(){var a=[];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?E(this[a]):
E(this[this.length+a])},length:0,push:bh,sort:[].sort,splice:[].splice},Jb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Jb[R(a)]=a});var cd={};q("input select option textarea button form details".split(" "),function(a){cd[a]=!0});var id={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:cc,removeData:lb,hasData:function(a){for(var b in mb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b<
d;b++)lb(a[b])},htmlPrefilter:function(a){return a}},function(a,b){S[b]=a});q({data:cc,inheritedData:Hb,scope:function(a){return E.data(a,"$scope")||Hb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return E.data(a,"$isolateScope")||E.data(a,"$isolateScopeNoTemplate")},controller:$c,injector:function(a){return Hb(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:Eb,css:function(a,b,d){b=jb(b);if(w(d))a.style[b]=d;else return a.style[b]},attr:function(a,
b,d){var c=S.$jQueryLt4CompatibilityEnabled,f=a.nodeType;if(f!==Na&&2!==f&&8!==f){var f=R(b),e=c&&Jb[f];if(w(d)){var g=!c,c=!c&&0!==f.indexOf("aria-");e&&(a[b]=!!d);null===d&&g||!1===d&&c||!d&&e?a.removeAttribute(b):a.setAttribute(b,e?f:d)}else return a=e?a[b]||(a.attributes.getNamedItem(b)||A).specified?f:void 0:a.getAttribute&&a.getAttribute(b,2),null===a?void 0:a}},prop:function(a,b,d){if(w(d))a[b]=d;else return a[b]},text:function(){function a(a,d){if(z(d)){var c=a.nodeType;return 1===c||c===
Na?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(z(b)){if(a.multiple&&"select"===va(a)){var d=[];q(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(z(b))return a.innerHTML;Bb(a,!0);a.innerHTML=b},empty:ad},function(a,b){S.prototype[b]=function(b,c){var f,e,g=this.length;if(a!==ad&&z(2===a.length&&a!==Eb&&a!==$c?b:c)){if(G(b)){for(f=0;f<g;f++)if(a===cc)a(this[f],b);else for(e in b)a(this[f],
e,b[e]);return this}f=a.$dv;g=z(f)?Math.min(g,1):g;for(e=0;e<g;e++){var h=a(this[e],b,c);f=f?f+h:h}return f}for(f=0;f<g;f++)a(this[f],b,c);return this}});q({removeData:lb,on:function(a,b,d,c){if(w(c))throw ac("onargs");if(Vc(a)){c=Cb(a,!0);var f=c.events,e=c.handle;e||(e=c.handle=kg(a,f));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=f[b];h||(h=f[b]=[],h.specialHandlerWrapper=c,"$destroy"===b||g||a.addEventListener(b,e,!1));h.push(d)};g--;)b=c[g],Db[b]?(h(Db[b],mg),
h(b,void 0,!0)):h(b)}},off:Zc,one:function(a,b,d){a=E(a);a.on(b,function f(){a.off(b,d);a.off(b,f)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;Bb(a);q(new S(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];q(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 S(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;q(new S(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){Xc(a,E(b).eq(0).clone()[0])},remove:Ib,detach:function(a){Ib(a,!0)},after:function(a,b){var d=a,c=a.parentNode;if(c){b=new S(b);for(var f=0,e=b.length;f<e;f++){var g=b[f];c.insertBefore(g,d.nextSibling);d=g}}},addClass:Gb,removeClass:Fb,toggleClass:function(a,b,d){b&&q(b.split(" "),function(b){var f=d;z(f)&&(f=!Eb(a,b));(f?Gb:Fb)(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:bc,triggerHandler:function(a,b,d){var c,f,e=b.type||b,g=Cb(a);if(g=(g=g&&g.events)&&g[e])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===
this.immediatePropagationStopped},stopPropagation:A,type:e,target:a},b.type&&(c=U(c,b)),b=ma(g),f=d?[c].concat(d):[c],q(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,f)})}},function(a,b){S.prototype[b]=function(b,c,f){for(var e,g=0,h=this.length;g<h;g++)z(e)?(e=a(this[g],b,c,f),w(e)&&(e=E(e))):Yc(e,a(this[g],b,c,f));return w(e)?e:this}});S.prototype.bind=S.prototype.on;S.prototype.unbind=S.prototype.off;Ua.prototype={put:function(a,b){this[Da(a,this.nextUid)]=b},get:function(a){return this[Da(a,
this.nextUid)]},remove:function(a){var b=this[a=Da(a,this.nextUid)];delete this[a];return b}};var cg=[function(){this.$get=[function(){return Ua}]}],pg=/^([^(]+?)=>/,qg=/^[^(]*\(([^)]*)\)/m,ch=/,/,dh=/^\s*(_?)(\S+?)\1\s*$/,og=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ea=P("$injector");hb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw B(d)&&d||(d=a.name||rg(a)),Ea("strictdi",d);b=dd(a);q(b[1].split(ch),function(a){a.replace(dh,function(a,b,d){c.push(d)})})}a.$inject=
c}}else D(a)?(b=a.length-1,Sa(a[b],"fn"),c=a.slice(0,b)):Sa(a,"fn",!0);return c};var he=P("$animate"),vf=function(){this.$get=A},wf=function(){var a=new Ua,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function f(a,b,c){var d=!1;b&&(b=B(b)?b.split(" "):D(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function e(){q(b,function(b){var c=a.get(b);if(c){var d=sg(b.attr("class")),e="",f="";q(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&
Gb(a,e);f&&Fb(a,f)});a.remove(b)}});b.length=0}return{enabled:A,on:A,off:A,pin:A,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=f(k,h,!0),l=f(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(e);g=new d;g.complete();return g}}}]},tf=["$provide",function(a){var b=this;this.$$registeredAnimations=Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw he("notcsel",
d);var f=d+"-animation";b.$$registeredAnimations[d.substr(1)]=f;a.factory(f,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 he("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(f,e,g,h){e=e&&E(e);g=g&&E(g);e=e||g.parent();b(f,e,g);return a.push(f,"enter",Fa(h))},move:function(f,e,g,h){e=e&&E(e);g=g&&E(g);e=e||g.parent();b(f,e,g);return a.push(f,"move",Fa(h))},leave:function(b,c){return a.push(b,"leave",Fa(c),function(){b.remove()})},addClass:function(b,c,g){g=Fa(g);g.addClass=nb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,
c,g){g=Fa(g);g.removeClass=nb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Fa(h);h.addClass=nb(h.addClass,c);h.removeClass=nb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Fa(k);k.from=k.from?U(k.from,c):c;k.to=k.to?U(k.to,g):g;k.tempClasses=nb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],yf=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)}}}]},xf=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(a,b,d,c,f){function e(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){var d=c[0];d&&d.hidden?f(a,0,!1):b(a)};this._state=0}e.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()};e.all=function(a,b){function c(f){e=e&&f;++d===
a.length&&b(e)}var d=0,e=!0;q(a,function(a){a.done(c)})};e.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:A,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&&(q(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=0,this._state=2)}};return e}]},uf=function(){this.$get=["$$rAF","$q","$$AnimateRunner",
function(a,b,d){return function(b,f){function e(){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=f||{};g.$$prepared||(g=ta(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var h,k=new d;return{start:e,end:e}}}]},ha=P("$compile"),fc=new function(){};Nc.$inject=["$provide","$$sanitizeUriProvider"];Kb.prototype.isFirstChange=
function(){return this.previousValue===fc};var ed=/^((?:x|data)[:\-_])/i,kd=P("$controller"),jd=/^(\S+)(\s+as\s+([\w$]+))?$/,Ef=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof E&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},ld="application/json",ic={"Content-Type":ld+";charset=utf-8"},xg=/^\[|^\{(?!\{)/,yg={"[":/]$/,"{":/}$/},wg=/^\)]\}',?\n/,jc=P("$http"),pd=function(a){return function(){throw jc("legacy",a);}},Ka=Z.$interpolateMinErr=P("$interpolate");
Ka.throwNoconcat=function(a){throw Ka("noconcat",a);};Ka.interr=function(a,b){return Ka("interr",a,b.toString())};var Mf=function(){this.$get=["$window",function(a){function b(a){var b=function(a){b.data=a;b.called=!0};b.id=a;return b}var d=a.angular.callbacks,c={};return{createCallback:function(a){a="_"+(d.$$counter++).toString(36);var e="angular.callbacks."+a,g=b(a);c[e]=d[a]=g;return e},wasCalled:function(a){return c[a].called},getResponse:function(a){return c[a].data},removeCallback:function(a){delete d[c[a].id];
delete c[a]}}}]},eh=/^([^?#]*)(\?([^#]*))?(#(.*))?$/,Ag={http:80,https:443,ftp:21},ob=P("$location"),Bg=/^\s*[\\/]{2,}/,fh={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:Lb("$$absUrl"),url:function(a){if(z(a))return this.$$url;var b=eh.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:Lb("$$protocol"),host:Lb("$$host"),port:Lb("$$port"),path:ud("$$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(B(a)||ba(a))a=a.toString(),this.$$search=Ic(a);else if(G(a))a=ta(a,{}),q(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw ob("isrcharg");break;default:z(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:ud("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};q([td,mc,lc],function(a){a.prototype=
Object.create(fh);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==lc||!this.$$html5)throw ob("nostate");this.$$state=z(b)?null:b;return this}});var ea=P("$parse"),wd=[].constructor,xd=(!1).constructor,yd=Function.constructor,zd=(0).constructor,Ad={}.constructor,Bd="".constructor,Gg=wd.prototype,Hg=xd.prototype,Nb=yd.prototype,Ig=zd.prototype,Cd=Ad.prototype,Jg=Bd.prototype,Dg=Nb.call,Eg=Nb.apply,Fg=Nb.bind,Lg=Cd.valueOf,Tb=W();q("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),
function(a){Tb[a]=!0});var gh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},oc=function(a){this.options=a};oc.prototype={constructor:oc,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.isIdentifierStart(this.peekMultichar()))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=Tb[b],f=Tb[d];Tb[a]||c||f?(a=f?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},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},
isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=
w(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ea("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=R(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(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}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,f=!1;this.index<this.text.length;){var e=this.text.charAt(this.index),c=c+e;if(f)"u"===e?(f=this.text.substring(this.index+
1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=gh[e]||e,f=!1;else if("\\"===e)f=!0;else{if(e===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=e}this.index++}this.throwError("Unterminated quote",b)}};var t=function(a,b){this.lexer=a;this.options=b};t.Program="Program";t.ExpressionStatement="ExpressionStatement";t.AssignmentExpression="AssignmentExpression";t.ConditionalExpression=
"ConditionalExpression";t.LogicalExpression="LogicalExpression";t.BinaryExpression="BinaryExpression";t.UnaryExpression="UnaryExpression";t.CallExpression="CallExpression";t.MemberExpression="MemberExpression";t.Identifier="Identifier";t.Literal="Literal";t.ArrayExpression="ArrayExpression";t.Property="Property";t.ObjectExpression="ObjectExpression";t.ThisExpression="ThisExpression";t.LocalsExpression="LocalsExpression";t.NGValueParameter="NGValueParameter";t.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:t.Program,body:a}},expressionStatement:function(){return{type:t.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();if(this.expect("=")){if(!Fd(a))throw ea("lval");a={type:t.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:t.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:t.LogicalExpression,
operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:t.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:t.BinaryExpression,operator:b.text,
left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:t.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.selfReferential.hasOwnProperty(this.peek().text)?a=ta(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:t.Literal,value:this.options.literals[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:t.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:t.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:t.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:t.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.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:t.Identifier,name:a.text}},constant:function(){return{type:t.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:t.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:t.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"),
b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:t.ObjectExpression,properties:a}},throwError:function(a,b){throw ea("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ea("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 ea("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,f){if(this.tokens.length>a){a=this.tokens[a];var e=a.text;if(e===b||e===d||e===c||e===f||!(b||d||c||f))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:t.ThisExpression},$locals:{type:t.LocalsExpression}}};Id.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:[]};X(c,d.$filter);var f="",e;this.stage="assign";if(e=Gd(c))this.state.computing="assign",f=this.nextId(),this.recurse(e,f),this.return_(f),f="fn.assign="+this.generateFunction("assign","s,v,l");e=Ed(c.body);d.stage="inputs";q(e,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);f='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+f+this.watchFns()+"return fn;";f=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",f))(this.$filter,Wa,Ha,vd,Cg,Mb,Kg,Dd,a);this.state=this.stage=void 0;f.literal=Hd(c);f.constant=c.constant;return f},USE:"use",STRICT:"strict",watchFns:function(){var a=
[],b=this.state.inputs,d=this;q(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;q(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,f,e){var g,h,k=this,l,m,n;c=c||A;if(!e&&w(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,f,!0));else switch(a.type){case t.Program:q(a.body,function(b,c){k.recurse(b.expression,void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case t.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;
case t.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case t.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,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 t.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 t.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 t.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);Wa(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||
"s",function(){f&&1!==f&&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||Ob(a.name))&&k.addEnsureSafeObject(b);c(b);break;case t.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){f&&1!==f&&k.addEnsureSafeAssignContext(g);if(a.computed)h=
k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),f&&1!==f&&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{Wa(a.property.name);f&&1!==f&&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||Ob(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)},!!f);break;case t.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(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);q(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,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 t.AssignmentExpression:h=this.nextId();g={};this.recurse(a.left,void 0,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 t.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case t.ObjectExpression:l=[];n=!1;q(a.properties,function(a){a.computed&&(n=!0)});n?(b=b||this.nextId(),this.assign(b,"{}"),q(a.properties,function(a){a.computed?(g=k.nextId(),k.recurse(a.key,g)):g=a.key.type===t.Identifier?a.key.name:""+a.key.value;h=k.nextId();k.recurse(a.value,
h);k.assign(k.member(b,g,a.computed),h)})):(q(a.properties,function(b){k.recurse(b.value,a.constant?void 0:k.nextId(),void 0,function(a){l.push(k.escape(b.key.type===t.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case t.ThisExpression:this.assign(b,"s");c("s");break;case t.LocalsExpression:this.assign(b,"l");c("l");break;case t.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){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},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,f,e){var g=this;return function(){g.recurse(a,b,d,c,f,e)}},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(B(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+
"'";if(ba(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 ea("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]}};Jd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;X(c,d.$filter);var f,e;if(f=Gd(c))e=this.recurse(f);f=Ed(c.body);
var g;f&&(g=[],q(f,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});f=0===c.body.length?A:1===c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};e&&(f.assign=function(a,b,c){return e(a,c,b)});g&&(f.inputs=g);f.literal=Hd(c);f.constant=c.constant;return f},recurse:function(a,b,d){var c,f,e=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case t.Literal:return this.value(a.value,
b);case t.UnaryExpression:return f=this.recurse(a.argument),this["unary"+a.operator](f,b);case t.BinaryExpression:return c=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](c,f,b);case t.LogicalExpression:return c=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](c,f,b);case t.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case t.Identifier:return Wa(a.name,e.expression),e.identifier(a.name,
e.expensiveChecks||Ob(a.name),b,d,e.expression);case t.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Wa(a.property.name,e.expression),f=a.property.name),a.computed&&(f=this.recurse(a.property)),a.computed?this.computedMember(c,f,b,d,e.expression):this.nonComputedMember(c,f,e.expensiveChecks,b,d,e.expression);case t.CallExpression:return g=[],q(a.arguments,function(a){g.push(e.recurse(a))}),a.filter&&(f=this.$filter(a.callee.name)),a.filter||(f=this.recurse(a.callee,!0)),a.filter?
function(a,c,d,e){for(var n=[],r=0;r<g.length;++r)n.push(g[r](a,c,d,e));a=f.apply(void 0,n,e);return b?{context:void 0,name:void 0,value:a}:a}:function(a,c,d,m){var n=f(a,c,d,m),r;if(null!=n.value){Ha(n.context,e.expression);vd(n.value,e.expression);r=[];for(var s=0;s<g.length;++s)r.push(Ha(g[s](a,c,d,m),e.expression));r=Ha(n.value.apply(n.context,r),e.expression)}return b?{value:r}:r};case t.AssignmentExpression:return c=this.recurse(a.left,!0,1),f=this.recurse(a.right),function(a,d,g,m){var n=c(a,
d,g,m);a=f(a,d,g,m);Ha(n.value,e.expression);Mb(n.context);n.context[n.name]=a;return b?{value:a}:a};case t.ArrayExpression:return g=[],q(a.elements,function(a){g.push(e.recurse(a))}),function(a,c,d,e){for(var f=[],r=0;r<g.length;++r)f.push(g[r](a,c,d,e));return b?{value:f}:f};case t.ObjectExpression:return g=[],q(a.properties,function(a){a.computed?g.push({key:e.recurse(a.key),computed:!0,value:e.recurse(a.value)}):g.push({key:a.key.type===t.Identifier?a.key.name:""+a.key.value,computed:!1,value:e.recurse(a.value)})}),
function(a,c,d,e){for(var f={},r=0;r<g.length;++r)g[r].computed?f[g[r].key(a,c,d,e)]=g[r].value(a,c,d,e):f[g[r].key]=g[r].value(a,c,d,e);return b?{value:f}:f};case t.ThisExpression:return function(a){return b?{value:a}:a};case t.LocalsExpression:return function(a,c){return b?{value:c}:c};case t.NGValueParameter:return function(a,c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,f,e){d=a(d,c,f,e);d=w(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,f,
e){d=a(d,c,f,e);d=w(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,f,e){d=!a(d,c,f,e);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,f,e,g){var h=a(c,f,e,g);c=b(c,f,e,g);h=Dd(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,f,e,g){var h=a(c,f,e,g);c=b(c,f,e,g);h=(w(h)?h:0)-(w(c)?c:0);return d?{value:h}:h}},"binary*":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)*b(c,f,e,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,
f,e,g){c=a(c,f,e,g)/b(c,f,e,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)%b(c,f,e,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)===b(c,f,e,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)!==b(c,f,e,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)==b(c,f,e,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,
f,e,g){c=a(c,f,e,g)!=b(c,f,e,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)<b(c,f,e,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)>b(c,f,e,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)<=b(c,f,e,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)>=b(c,f,e,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,f,e,g){c=
a(c,f,e,g)&&b(c,f,e,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)||b(c,f,e,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(f,e,g,h){f=a(f,e,g,h)?b(f,e,g,h):d(f,e,g,h);return c?{value:f}:f}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d,c,f){return function(e,g,h,k){e=g&&a in g?g:e;c&&1!==c&&e&&!e[a]&&(e[a]={});g=e?e[a]:void 0;b&&Ha(g,f);return d?{context:e,name:a,
value:g}:g}},computedMember:function(a,b,d,c,f){return function(e,g,h,k){var l=a(e,g,h,k),m,n;null!=l&&(m=b(e,g,h,k),m+="",Wa(m,f),c&&1!==c&&(Mb(l),l&&!l[m]&&(l[m]={})),n=l[m],Ha(n,f));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,f,e){return function(g,h,k,l){g=a(g,h,k,l);f&&1!==f&&(Mb(g),g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d||Ob(b))&&Ha(h,e);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,f,e){return e?e[b]:a(d,c,f)}}};var pc=
function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new t(a,d);this.astCompiler=d.csp?new Jd(this.ast,b):new Id(this.ast,b)};pc.prototype={constructor:pc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var Ia=P("$sce"),sa={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Ng=P("$compile"),aa=v.document.createElement("a"),Nd=wa(v.location.href);Od.$inject=["$document"];Uc.$inject=["$provide"];var Vd=22,Ud=".",rc="0";Pd.$inject=["$locale"];
Rd.$inject=["$locale"];var Yg={yyyy:V("FullYear",4,0,!1,!0),yy:V("FullYear",2,0,!0,!0),y:V("FullYear",1,0,!1,!0),MMMM:qb("Month"),MMM:qb("Month",!0),MM:V("Month",2,1),M:V("Month",1,1),LLLL:qb("Month",!1,!0),dd:V("Date",2),d:V("Date",1),HH:V("Hours",2),H:V("Hours",1),hh:V("Hours",2,-12),h:V("Hours",1,-12),mm:V("Minutes",2),m:V("Minutes",1),ss:V("Seconds",2),s:V("Seconds",1),sss:V("Milliseconds",3),EEEE:qb("Day"),EEE:qb("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?"+":"")+(Pb(Math[0<a?"floor":"ceil"](a/60),2)+Pb(Math.abs(a%60),2))},ww:Xd(2),w:Xd(1),G:sc,GG:sc,GGG:sc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},Xg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,Wg=/^-?\d+$/;Qd.$inject=["$locale"];var Rg=ia(R),Sg=ia(zb);Sd.$inject=["$parse"];var Je=ia({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var f=
"[object SVGAnimatedString]"===oa.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(f)||a.preventDefault()})}}}}),Ab={};q(Jb,function(a,b){function d(a,d,f){a.$watch(f[c],function(a){f.$set(b,!!a)})}if("multiple"!==a){var c=Ga("ng-"+b),f=d;"checked"===a&&(f=function(a,b,f){f.ngModel!==f[c]&&d(a,b,f)});Ab[c]=function(){return{restrict:"A",priority:100,link:f}}}});q(id,function(a,b){Ab[b]=function(){return{priority:100,link:function(a,c,f){if("ngPattern"===b&&"/"===f.ngPattern.charAt(0)&&
(c=f.ngPattern.match(ah))){f.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(f[b],function(a){f.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=Ga("ng-"+a);Ab[b]=function(){return{priority:99,link:function(d,c,f){var e=a,g=a;"href"===a&&"[object SVGAnimatedString]"===oa.call(c.prop("href"))&&(g="xlinkHref",f.$attr[g]="xlink:href",e=null);f.$observe(b,function(b){b?(f.$set(g,b),Ca&&e&&c.prop(e,f[g])):"href"===a&&f.$set(g,null)})}}}});var Qb={$addControl:A,$$renameControl:function(a,
b){a.$name=b},$removeControl:A,$setValidity:A,$setDirty:A,$setPristine:A,$setSubmitted:A};Yd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var ie=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||A}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Yd,compile:function(d,e){d.addClass(Ya).addClass(ub);var g=e.name?"name":a&&e.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in
e)){var r=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",r,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",r,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):A;g&&(s(a,n),e.$observe(g,function(b){n.$name!==b&&(s(a,void 0),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);s(a,void 0);U(n,Qb)})}}}}}]},Ke=
ie(),We=ie(!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)$/,hh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@/]*(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,ih=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,$g=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,je=/^(\d{4,})-(\d{2})-(\d{2})$/,ke=
/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,zc=/^(\d{4,})-W(\d\d)$/,le=/^(\d{4,})-(\d\d)$/,me=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,$d=W();q(["date","datetime-local","month","time","week"],function(a){$d[a]=!0});var ne={text:function(a,b,d,c,f,e){Za(a,b,d,c,f,e);uc(c)},date:rb("date",je,Sb(je,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":rb("datetimelocal",ke,Sb(ke,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:rb("time",me,Sb(me,["HH","mm","ss",
"sss"]),"HH:mm:ss.sss"),week:rb("week",zc,function(a,b){if(fa(a))return a;if(B(a)){zc.lastIndex=0;var d=zc.exec(a);if(d){var c=+d[1],f=+d[2],e=d=0,g=0,h=0,k=Wd(c),f=7*(f-1);b&&(d=b.getHours(),e=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+f,d,e,g,h)}}return NaN},"yyyy-Www"),month:rb("month",le,Sb(le,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,f,e){vc(a,b,d,c);Za(a,b,d,c,f,e);ae(c);var g,h;if(w(d.min)||d.ngMin)c.$validators.min=function(a){return c.$isEmpty(a)||
z(g)||a>=g},d.$observe("min",function(a){g=tb(a);c.$validate()});if(w(d.max)||d.ngMax)c.$validators.max=function(a){return c.$isEmpty(a)||z(h)||a<=h},d.$observe("max",function(a){h=tb(a);c.$validate()})},url:function(a,b,d,c,f,e){Za(a,b,d,c,f,e);uc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||hh.test(d)}},email:function(a,b,d,c,f,e){Za(a,b,d,c,f,e);uc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||ih.test(d)}},
radio:function(a,b,d,c){z(d.name)&&b.attr("name",++vb);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)},range:function(a,b,d,c,f,e){function g(a,c){b.attr(a,d[a]);d.$observe(a,c)}function h(a){n=tb(a);ja(c.$modelValue)||(m?(a=b.val(),n>a&&(a=n,b.val(a)),c.$setViewValue(a)):c.$validate())}function k(a){r=tb(a);ja(c.$modelValue)||(m?(a=b.val(),r<a&&(b.val(r),a=r<n?n:r),c.$setViewValue(a)):
c.$validate())}function l(a){s=tb(a);ja(c.$modelValue)||(m&&c.$viewValue!==b.val()?c.$setViewValue(b.val()):c.$validate())}vc(a,b,d,c);ae(c);Za(a,b,d,c,f,e);var m=c.$$hasNativeValidators&&"range"===b[0].type,n=m?0:void 0,r=m?100:void 0,s=m?1:void 0,q=b[0].validity;a=w(d.min);f=w(d.max);e=w(d.step);var t=c.$render;c.$render=m&&w(q.rangeUnderflow)&&w(q.rangeOverflow)?function(){t();c.$setViewValue(b.val())}:t;a&&(c.$validators.min=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||z(n)||b>=
n},g("min",h));f&&(c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||z(r)||b<=r},g("max",k));e&&(c.$validators.step=m?function(){return!q.stepMismatch}:function(a,b){var d;if(!(d=c.$isEmpty(b)||z(s))){d=n||0;var e=s,f=Number(b);if((f|0)!==f||(d|0)!==d||(e|0)!==e){var g=Math.max(wc(f),wc(d),wc(e)),g=Math.pow(10,g),f=f*g;d*=g;e*=g}d=0===(f-d)%e}return d},g("step",l))},checkbox:function(a,b,d,c,f,e,g,h){var k=be(h,a,"ngTrueValue",d.ngTrueValue,!0),l=be(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 pa(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:A,button:A,submit:A,reset:A,file:A},Oc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,e,g,h){if(h[0]){var k=R(g.type);"range"!==k||g.hasOwnProperty("ngInputRange")||(k="text");
(ne[k]||ne.text)(f,e,g,h[0],b,a,d,c)}}}}}],rf=function(){var a={configurable:!0,enumerable:!1,get:function(){return this.getAttribute("value")||""},set:function(a){this.setAttribute("value",a)}};return{restrict:"E",priority:200,compile:function(b,d){if("hidden"===R(d.type))return{pre:function(b,d,e,g){b=d[0];b.parentNode&&b.parentNode.insertBefore(b,b.nextSibling);Object.defineProperty&&Object.defineProperty(b,"value",a)}}}}},jh=/^(true|false|\d+)$/,of=function(){return{restrict:"A",priority:100,
compile:function(a,b){return jh.test(b.ngValue)?function(a,b,f){f.$set("value",a.$eval(f.ngValue))}:function(a,b,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},Oe=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,f){a.$$addBindingInfo(c,f.ngBind);c=c[0];b.$watch(f.ngBind,function(a){c.textContent=z(a)?"":a})}}}}],Qe=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,e){c=
a(d.attr(e.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];e.$observe("ngBindTemplate",function(a){d.textContent=z(a)?"":a})}}}}],Pe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,f){var e=b(f.ngBindHtml),g=b(f.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,f){d.$$addBindingInfo(c,f.ngBindHtml);b.$watch(g,function(){var d=e(b);c.html(a.getTrustedHtml(d)||"")})}}}}],nf=ia({restrict:"A",require:"ngModel",
link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Re=xc("",!0),Te=xc("Odd",0),Se=xc("Even",1),Ue=Xa({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Ve=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Tc={},kh={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Ga("ng-"+a);
Tc[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(f,e){var g=d(e[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};kh[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var Ye=["$animate","$compile",function(a,b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,f,e,g){var h,k,l;d.$watch(f.ngIf,function(d){d?k||g(function(d,e){k=e;d[d.length++]=b.$$createComment("end ngIf",
f.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=yb(h.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),h=null))})}}}],Ze=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Z.noop,compile:function(c,f){var e=f.ngInclude||f.src,g=f.onload||"",h=f.autoscroll;return function(c,f,m,n,r){var s=0,q,t,p,v=function(){t&&(t.remove(),t=null);q&&(q.$destroy(),q=null);
p&&(d.leave(p).done(function(a){!1!==a&&(t=null)}),t=p,p=null)};c.$watch(e,function(e){var m=function(a){!1===a||!w(h)||h&&!c.$eval(h)||b()},t=++s;e?(a(e,!0).then(function(a){if(!c.$$destroyed&&t===s){var b=c.$new();n.template=a;a=r(b,function(a){v();d.enter(a,null,f).done(m)});q=b;p=a;q.$emit("$includeContentLoaded",e);c.$eval(g)}},function(){c.$$destroyed||t!==s||(v(),c.$emit("$includeContentError",e))}),c.$emit("$includeContentRequested",e)):(v(),n.template=null)})}}}}],qf=["$compile",function(a){return{restrict:"ECA",
priority:-400,require:"ngInclude",link:function(b,d,c,f){oa.call(d[0]).match(/SVG/)?(d.empty(),a(Wc(f.template,v.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(b))}}}],$e=Xa({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),mf=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var f=b.attr(d.$attr.ngList)||", ",e="false"!==d.ngTrim,g=e?da(f):f;c.$parsers.push(function(a){if(!z(a)){var b=
[];a&&q(a.split(g),function(a){a&&b.push(e?da(a):a)});return b}});c.$formatters.push(function(a){if(D(a))return a.join(f)});c.$isEmpty=function(a){return!a||!a.length}}}},ub="ng-valid",ce="ng-invalid",Ya="ng-pristine",Rb="ng-dirty",ee="ng-pending",sb=P("ngModel"),lh=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,f,e,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;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=void 0;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Qb;var m=f(d.ngModel),n=m.assign,r=m,s=n,t=null,v,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=f(d.ngModel+"()"),e=f(d.ngModel+"($$$p)");r=function(a){var c=m(a);x(c)&&(c=b(a));
return c};s=function(a,b){x(m(a))?e(a,{$$$p:b}):n(a,b)}}else if(!m.assign)throw sb("nonassign",d.ngModel,Aa(c));};this.$render=A;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(e.removeClass(c,"ng-not-empty"),e.addClass(c,"ng-empty")):(e.removeClass(c,"ng-empty"),e.addClass(c,"ng-not-empty"))};var L=0;Zd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:e});this.$setPristine=function(){p.$dirty=
!1;p.$pristine=!0;e.removeClass(c,Rb);e.addClass(c,Ya)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;e.removeClass(c,Ya);e.addClass(c,Rb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;e.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;e.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(t);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!ja(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:void 0,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=!0;q(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!x(h.then))throw sb("nopromise",
h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},A):g(!0)}function f(a,b){h===L&&p.$setValidity(a,b)}function g(a){h===L&&c(a)}L++;var h=L;(function(){var a=p.$$parserName||"parse";if(z(v))f(a,null);else return v||(q(p.$validators,function(a,b){f(b,null)}),q(p.$asyncValidators,function(a,b){f(b,null)})),f(a,v),v;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(t);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(v=z(b)?void 0:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),z(b)){v=!1;break}ja(p.$modelValue)&&(p.$modelValue=r(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:void 0,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);q(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&&w(d.debounce)&&(d=d.debounce,ba(d)?c=d:ba(d[b])?c=d[b]:ba(d["default"])&&(c=d["default"]));
g.cancel(t);c?t=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=r(a);if(b!==p.$modelValue&&(p.$modelValue===p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;v=void 0;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(p.$modelValue,p.$viewValue,A))}return b})}],lf=["$rootScope",function(a){return{restrict:"A",
require:["ngModel","^?form","^?ngModelOptions"],controller:lh,priority:1,compile:function(b){b.addClass(Ya).addClass("ng-untouched").addClass(ub);return{pre:function(a,b,f,e){var g=e[0];b=e[1]||g.$$parentForm;g.$$setOptions(e[2]&&e[2].$options);b.$addControl(g);f.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,f,e){var g=e[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,
function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],mh=/(\s+|^)default(\s+|$)/,pf=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,b){var d=this;this.$options=ta(a.$eval(b.ngModelOptions));w(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=da(this.$options.updateOn.replace(mh,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=
!0}]}},af=Xa({terminal:!0,priority:1E3}),nh=P("ngOptions"),oh=/^\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]+?))?$/,jf=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!q&&na(a))b=a;else{b=
[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var n=a.match(oh);if(!n)throw nh("iexp",a,Aa(b));var r=n[5]||n[7],q=n[6];a=/ as /.test(n[0])&&n[1];var t=n[9];b=d(n[2]?n[1]:r);var v=a&&d(a)||b,p=t&&d(t),w=t?function(a,b){return p(c,b)}:function(a){return Da(a)},y=function(a,b){return w(a,u(a,b))},z=d(n[2]||n[1]),N=d(n[3]||""),I=d(n[4]||""),C=d(n[8]),x={},u=q?function(a,b){x[q]=b;x[r]=a;return x}:function(a){x[r]=a;return x};return{trackBy:t,getTrackByValue:y,getWatchables:d(C,
function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var h=a===d?g:d[g],l=a[h],h=u(l,h),l=w(l,h);b.push(l);if(n[2]||n[1])l=z(c,h),b.push(l);n[4]&&(h=I(c,h),b.push(h))}return b}),getOptions:function(){for(var a=[],b={},d=C(c)||[],g=f(d),h=g.length,n=0;n<h;n++){var p=d===g?n:g[n],r=u(d[p],p),q=v(c,r),p=w(q,r),s=z(c,r),x=N(c,r),r=I(c,r),q=new e(p,q,s,x,r);a.push(q);b[p]=q}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[y(a)]},getViewValueFromOption:function(a){return t?
ta(a.viewValue):a.viewValue}}}}}var f=v.document.createElement("option"),e=v.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=A},post:function(d,h,k,l){function m(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);b.value=a.selectValue}function n(){var a=I&&r.readValue();if(I)for(var b=I.items.length-1;0<=b;b--){var c=I.items[b];w(c.group)?Ib(c.element.parentNode):
Ib(c.element)}I=C.getOptions();var d={};y&&h.prepend(v);I.items.forEach(function(a){var b;if(w(a.group)){b=d[a.group];b||(b=e.cloneNode(!1),A.appendChild(b),b.label=null===a.group?"null":a.group,d[a.group]=b);var c=f.cloneNode(!1)}else b=A,c=f.cloneNode(!1);b.appendChild(c);m(a,c)});h[0].appendChild(A);s.$render();s.$isEmpty(a)||(b=r.readValue(),(C.trackBy||t?pa(a,b):a===b)||(s.$setViewValue(b),s.$render()))}var r=l[0],s=l[1],t=k.multiple,v;l=0;for(var p=h.children(),z=p.length;l<z;l++)if(""===p[l].value){v=
p.eq(l);break}var y=!!v,F=!1,x=E(f.cloneNode(!1));x.val("?");var I,C=c(k.ngOptions,h,d),A=b[0].createDocumentFragment(),u=function(){y?F&&v.removeAttr("selected"):v.remove()};t?(s.$isEmpty=function(a){return!a||0===a.length},r.writeValue=function(a){I.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){if(a=I.getOptionFromViewValue(a))a.element.selected=!0})},r.readValue=function(){var a=h.val()||[],b=[];q(a,function(a){(a=I.selectValueMap[a])&&!a.disabled&&b.push(I.getViewValueFromOption(a))});
return b},C.trackBy&&d.$watchCollection(function(){if(D(s.$viewValue))return s.$viewValue.map(function(a){return C.getTrackByValue(a)})},function(){s.$render()})):(r.writeValue=function(a){var b=I.selectValueMap[h.val()],c=I.getOptionFromViewValue(a);b&&b.element.removeAttribute("selected");c?(h[0].value!==c.selectValue&&(x.remove(),u(),h[0].value=c.selectValue,c.element.selected=!0),c.element.setAttribute("selected","selected")):null===a||y?(x.remove(),y||h.prepend(v),h.val(""),F&&(v.prop("selected",
!0),v.attr("selected","selected"))):(u(),h.prepend(x),h.val("?"),x.prop("selected",!0),x.attr("selected","selected"))},r.readValue=function(){var a=I.selectValueMap[h.val()];return a&&!a.disabled?(u(),x.remove(),I.getViewValueFromOption(a)):null},C.trackBy&&d.$watch(function(){return C.getTrackByValue(s.$viewValue)},function(){s.$render()}));y?(v.remove(),a(v)(d),8===v[0].nodeType?(F=!1,r.registerOption=function(a,b){""===b.val()&&(F=!0,v=b,v.removeClass("ng-scope"),s.$render(),b.on("$destroy",function(){v=
void 0;F=!1}))}):(v.removeClass("ng-scope"),F=!0)):v=E(f.cloneNode(!1));h.empty();n();d.$watchCollection(C.getWatchables,n)}}}}],bf=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,f=/^when(Minus)?(.+)$/;return{link:function(e,g,h){function k(a){g.text(a||"")}var l=h.count,m=h.$attr.when&&g.attr(h.$attr.when),n=h.offset||0,r=e.$eval(m)||{},s={},t=b.startSymbol(),v=b.endSymbol(),p=t+l+"-"+n+v,w=Z.noop,y;q(h,function(a,b){var c=f.exec(b);c&&(c=(c[1]?"-":"")+R(c[2]),r[c]=g.attr(h.$attr[b]))});
q(r,function(a,d){s[d]=b(a.replace(c,p))});e.$watch(l,function(b){var c=parseFloat(b),f=ja(c);f||c in r||(c=a.pluralCat(c-n));c===y||f&&ja(y)||(w(),f=s[c],z(f)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+m),w=A,k()):w=e.$watch(f,k),y=c)})}}}],cf=["$parse","$animate","$compile",function(a,b,d){var c=P("ngRepeat"),f=function(a,b,c,d,f,m,n){a[c]=d;f&&(a[f]=m);a.$index=b;a.$first=0===b;a.$last=b===n-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,g){var h=g.ngRepeat,k=d.$$createComment("end ngRepeat",h),l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw c("iexp",h);var m=l[1],n=l[2],r=l[3],s=l[4],l=m.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/);if(!l)throw c("iidexp",m);var t=l[3]||l[1],v=l[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 c("badident",
r);var p,w,y,z,x={$id:Da};s?p=a(s):(y=function(a,b){return Da(b)},z=function(a){return a});return function(a,d,e,g,l){p&&(w=function(b,c,d){v&&(x[v]=b);x[t]=c;x.$index=d;return p(a,x)});var m=W();a.$watchCollection(n,function(e){var g,n,p=d[0],s,u=W(),x,A,E,B,G,D,J;r&&(a[r]=e);if(na(e))G=e,n=w||y;else for(J in n=w||z,G=[],e)xa.call(e,J)&&"$"!==J.charAt(0)&&G.push(J);x=G.length;J=Array(x);for(g=0;g<x;g++)if(A=e===G?g:G[g],E=e[A],B=n(A,E,g),m[B])D=m[B],delete m[B],u[B]=D,J[g]=D;else{if(u[B])throw q(J,
function(a){a&&a.scope&&(m[a.id]=a)}),c("dupes",h,B,E);J[g]={id:B,scope:void 0,clone:void 0};u[B]=!0}for(s in m){D=m[s];B=yb(D.clone);b.leave(B);if(B[0].parentNode)for(g=0,n=B.length;g<n;g++)B[g].$$NG_REMOVED=!0;D.scope.$destroy()}for(g=0;g<x;g++)if(A=e===G?g:G[g],E=e[A],D=J[g],D.scope){s=p;do s=s.nextSibling;while(s&&s.$$NG_REMOVED);D.clone[0]!==s&&b.move(yb(D.clone),null,p);p=D.clone[D.clone.length-1];f(D.scope,g,t,E,v,A,x)}else l(function(a,c){D.scope=c;var d=k.cloneNode(!1);a[a.length++]=d;b.enter(a,
null,p);p=d;D.clone=a;u[D.id]=D;f(D.scope,g,t,E,v,A,x)});m=u})}}}}],df=["$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"})})}}}],Xe=["$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"})})}}}],ef=Xa(function(a,b,d){a.$watch(d.ngStyle,function(a,
d){d&&a!==d&&q(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),ff=["$animate","$compile",function(a,b){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(d,c,f,e){var g=[],h=[],k=[],l=[],m=function(a,b){return function(c){!1!==c&&a.splice(b,1)}};d.$watch(f.ngSwitch||f.on,function(c){for(var d,f;k.length;)a.cancel(k.pop());d=0;for(f=l.length;d<f;++d){var t=yb(h[d].clone);l[d].$destroy();(k[d]=a.leave(t)).done(m(k,d))}h.length=0;l.length=0;(g=e.cases["!"+c]||e.cases["?"])&&
q(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],gf=Xa({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,f){a=d.ngSwitchWhen.split(d.ngSwitchWhenSeparator).sort().filter(function(a,b,c){return c[b-1]!==a});q(a,function(a){c.cases["!"+a]=c.cases["!"+a]||[];c.cases["!"+a].push({transclude:f,element:b})})}}),hf=Xa({transclude:"element",
priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,f){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:f,element:b})}}),ph=P("ngTransclude"),kf=["$compile",function(a){return{restrict:"EAC",terminal:!0,compile:function(b){var d=a(b.contents());b.empty();return function(a,b,e,g,h){function k(){d(a,function(a){b.append(a)})}if(!h)throw ph("orphan",Aa(b));e.ngTransclude===e.$attr.ngTransclude&&(e.ngTransclude="");e=e.ngTransclude||e.ngTranscludeSlot;h(function(a,c){a.length?
b.append(a):(k(),c.$destroy())},null,e);e&&!h.isSlotFilled(e)&&k()}}}}],Le=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"===d.type&&a.put(d.id,b[0].text)}}}],qh={$setViewValue:A,$render:A},rh=["$element","$scope",function(a,b){var d=this,c=new Ua;d.ngModelCtrl=qh;d.unknownOption=E(v.document.createElement("option"));d.renderUnknownOption=function(b){b="? "+Da(b)+" ?";d.unknownOption.val(b);a.prepend(d.unknownOption);a.val(b)};b.$on("$destroy",
function(){d.renderUnknownOption=A});d.removeUnknownOption=function(){d.unknownOption.parent()&&d.unknownOption.remove()};d.readValue=function(){d.removeUnknownOption();return a.val()};d.writeValue=function(b){d.hasOption(b)?(d.removeUnknownOption(),a.val(b),""===b&&d.emptyOption.prop("selected",!0)):null==b&&d.emptyOption?(d.removeUnknownOption(),a.val("")):d.renderUnknownOption(b)};d.addOption=function(a,b){if(8!==b[0].nodeType){Ta(a,'"option value"');""===a&&(d.emptyOption=b);var g=c.get(a)||0;
c.put(a,g+1);d.ngModelCtrl.$render();b[0].hasAttribute("selected")&&(b[0].selected=!0)}};d.removeOption=function(a){var b=c.get(a);b&&(1===b?(c.remove(a),""===a&&(d.emptyOption=void 0)):c.put(a,b-1))};d.hasOption=function(a){return!!c.get(a)};d.registerOption=function(a,b,c,h,k){if(h){var l;c.$observe("value",function(a){w(l)&&d.removeOption(l);l=a;d.addOption(a,b)})}else k?a.$watch(k,function(a,f){c.$set("value",a);f!==a&&d.removeOption(f);d.addOption(a,b)}):d.addOption(c.value,b);b.on("$destroy",
function(){d.removeOption(c.value);d.ngModelCtrl.$render()})}}],Me=function(){return{restrict:"E",require:["select","?ngModel"],controller:rh,priority:1,link:{pre:function(a,b,d,c){var f=c[1];if(f){var e=c[0];e.ngModelCtrl=f;b.on("change",function(){a.$apply(function(){f.$setViewValue(e.readValue())})});if(d.multiple){e.readValue=function(){var a=[];q(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};e.writeValue=function(a){var c=new Ua(a);q(b.find("option"),function(a){a.selected=
w(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==f.$viewValue||pa(g,f.$viewValue)||(g=ma(f.$viewValue),f.$render());h=f.$viewValue});f.$isEmpty=function(a){return!a||0===a.length}}}},post:function(a,b,d,c){var f=c[1];if(f){var e=c[0];f.$render=function(){e.writeValue(f.$viewValue)}}}}}},Ne=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,d){var c,f;w(d.ngValue)?c=!0:w(d.value)?c=a(d.value,!0):(f=a(b.text(),!0))||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,f)}}}}],Qc=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()}))}}},Pc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var f,e=d.ngPattern||d.pattern;d.$observe("pattern",function(a){B(a)&&0<a.length&&(a=
new RegExp("^"+a+"$"));if(a&&!a.test)throw P("ngPattern")("noregexp",e,a,Aa(b));f=a||void 0;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||z(f)||f.test(b)}}}}},Sc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var f=-1;d.$observe("maxlength",function(a){a=Y(a);f=ja(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>f||c.$isEmpty(b)||b.length<=f}}}}},Rc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,
d,c){if(c){var f=0;d.$observe("minlength",function(a){f=Y(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=f}}}}};v.angular.bootstrap?v.console&&console.log("WARNING: Tried to load angular more than once."):(Be(),Ge(Z),Z.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 f=a|0,e=c;void 0===e&&(e=Math.min(b(a),3));Math.pow(10,e);return 1==f&&0==
e?"one":"other"}})}]),E(v.document).ready(function(){we(v.document,Jc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(window.angular.element("<style>").text('@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;}'));
//# sourceMappingURL=angular.min.js.map
;
/*
 AngularJS
 (c) 2010-2020 Google LLC. http://angularjs.org
 License: MIT
 AngularJS NES v1.5.26
 (c) 2023 HeroDevs, Inc.
 Released under the HeroDevs NES License.
*/
(function(S,B){'use strict';function Da(a,b,c){if(!a)throw Ma("areq",b||"?",c||"required");return a}function Ea(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;X(a)&&(a=a.join(" "));X(b)&&(b=b.join(" "));return a+" "+b}function Na(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function Y(a,b,c){var d="";a=X(a)?a:a&&G(a)&&a.length?a.split(/\s+/):[];r(a,function(a,l){a&&0<a.length&&(d+=0<l?" ":"",d+=c?b+a:a+b)});return d}function Oa(a){if(a instanceof F)switch(a.length){case 0:return a;
case 1:if(1===a[0].nodeType)return a;break;default:return F(ta(a))}if(1===a.nodeType)return F(a)}function ta(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 Pa(a,b,c){r(b,function(b){a.addClass(b,c)})}function Qa(a,b,c){r(b,function(b){a.removeClass(b,c)})}function Z(a){return function(b,c){c.addClass&&(Pa(a,b,c.addClass),c.addClass=null);c.removeClass&&(Qa(a,b,c.removeClass),c.removeClass=null)}}function oa(a){a=a||{};if(!a.$$prepared){var b=a.domOperation||
P;a.domOperation=function(){a.$$domOperationFired=!0;b();b=P};a.$$prepared=!0}return a}function ha(a,b){Fa(a,b);Ga(a,b)}function Fa(a,b){b.from&&(a.css(b.from),b.from=null)}function Ga(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||""),l=(d.removeClass||"")+" "+(c.removeClass||"");a=Ra(a.attr("class"),e,l);c.preparationClasses&&(d.preparationClasses=$(c.preparationClasses,d.preparationClasses),delete c.preparationClasses);
e=d.domOperation!==P?d.domOperation:null;ua(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 Ra(a,b,c){function d(a){G(a)&&(a=a.split(" "));var b={};r(a,function(a){a.length&&(b[a]=!0)});return b}var e={};a=d(a);b=d(b);r(b,function(a,b){e[b]=1});c=d(c);r(c,function(a,b){e[b]=1===e[b]?null:-1});var l={addClass:"",removeClass:""};r(e,function(b,c){var d,e;1===b?(d="addClass",
e=!a[c]||a[c+"-remove"]):-1===b&&(d="removeClass",e=a[c]||a[c+"-add"]);e&&(l[d].length&&(l[d]+=" "),l[d]+=c)});return l}function A(a){return a instanceof F?a[0]:a}function Sa(a,b,c){var d="";b&&(d=Y(b,"ng-",!0));c.addClass&&(d=$(d,Y(c.addClass,"-add")));c.removeClass&&(d=$(d,Y(c.removeClass,"-remove")));d.length&&(c.preparationClasses=d,a.addClass(d))}function pa(a,b){var c=b?"-"+b+"s":"";la(a,[ma,c]);return[ma,c]}function va(a,b){var c=b?"paused":"",d=aa+"PlayState";la(a,[d,c]);return[d,c]}function la(a,
b){a.style[b[0]]=b[1]}function $(a,b){return a?b?a+" "+b:a:b}function Ha(a,b,c){var d=Object.create(null),e=a.getComputedStyle(b)||{};r(c,function(a,b){var c=e[a];"animationDuration"===a&&"auto"===c&&(c="0s");"animationIterationCount"===a&&"infinite"===c&&(c="1");if(c){var g=c.charAt(0);if("-"===g||"+"===g||0<=g)c=Ta(c);0===c&&(c=null);d[b]=c}});return d}function Ta(a){var b=0;a=a.split(/\s*,\s*/);r(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 wa(a){return 0===a||null!=a}function Ia(a,b){var c=T,d=a+"s";b?c+="Duration":d+=" linear all";return[c,d]}function Ja(){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 Ka(a,b,c){r(c,function(c){a[c]=xa(a[c])?a[c]:b.style.getPropertyValue(c)})}var T,ya,aa,za;void 0===S.ontransitionend&&void 0!==S.onwebkittransitionend?
(T="WebkitTransition",ya="webkitTransitionEnd transitionend"):(T="transition",ya="transitionend");void 0===S.onanimationend&&void 0!==S.onwebkitanimationend?(aa="WebkitAnimation",za="webkitAnimationEnd animationend"):(aa="animation",za="animationend");var qa=aa+"Delay",Aa=aa+"Duration",ma=T+"Delay",La=T+"Duration",Ma=B.$$minErr("ng"),Ua={transitionDuration:La,transitionDelay:ma,transitionProperty:T+"Property",animationDuration:Aa,animationDelay:qa,animationIterationCount:aa+"IterationCount"},Va={transitionDuration:La,
transitionDelay:ma,animationDuration:Aa,animationDelay:qa},Ba,ua,r,X,xa,ea,Ca,ba,G,K,F,P;B.module("ngAnimate",[],function(){P=B.noop;Ba=B.copy;ua=B.extend;F=B.element;r=B.forEach;X=B.isArray;G=B.isString;ba=B.isObject;K=B.isUndefined;xa=B.isDefined;Ca=B.isFunction;ea=B.isElement}).directive("ngAnimateSwap",["$animate","$rootScope",function(a,b){return{restrict:"A",transclude:"element",terminal:!0,priority:600,link:function(b,d,e,l,m){var J,g;b.$watchCollection(e.ngAnimateSwap||e["for"],function(e){J&&
a.leave(J);g&&(g.$destroy(),g=null);if(e||0===e)g=b.$new(),m(g,function(b){J=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 l=d.ngAnimateChildren;G(l)&&0===l.length?c.data("$$ngAnimateChildren",!0):(e(a(l)(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(),m=0;m<b.length;m++)b[m]();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);r(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 l[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 l=this.rules={skip:[],cancel:[],join:[]};l.join.push(function(a,b,c){return!b.structural&&e(b)});l.skip.push(function(a,b,c){return!b.structural&&!e(b)});l.skip.push(function(a,b,c){return"leave"===c.event&&b.structural});l.skip.push(function(a,b,c){return c.structural&&2===c.state&&!b.structural});l.cancel.push(function(a,b,c){return c.structural&&b.structural});l.cancel.push(function(a,b,c){return 2===c.state&&b.structural});
l.cancel.push(function(a,b,d){if(d.structural)return!1;a=b.addClass;b=b.removeClass;var e=d.addClass;d=d.removeClass;return K(a)&&K(b)||K(e)&&K(d)?!1:c(a,d)||c(b,e)});this.$get=["$$rAF","$rootScope","$rootElement","$document","$$HashMap","$$animation","$$AnimateRunner","$templateRequest","$$jqLite","$$forceReflow",function(b,c,g,l,C,Wa,Q,t,H,R){function O(){var a=!1;return function(b){a?b():c.$$postDigest(function(){a=!0;b()})}}function y(a,b,c){var f=A(b),d=A(a),L=[];(a=h[c])&&r(a,function(a){x.call(a.node,
f)?L.push(a.callback):"leave"===c&&x.call(a.node,d)&&L.push(a.callback)});return L}function q(a,b,c){var f=ta(b);return a.filter(function(a){return!(a.node===f&&(!c||a.callback===c))})}function u(a,h,w){function q(c,f,d,h){sa(function(){var c=y(R,a,f);c.length?b(function(){r(c,function(b){b(a,d,h)});"close"!==d||a[0].parentNode||ra.off(a)}):"close"!==d||a[0].parentNode||ra.off(a)});c.progress(f,d,h)}function k(b){var c=a,f=n;f.preparationClasses&&(c.removeClass(f.preparationClasses),f.preparationClasses=
null);f.activeClasses&&(c.removeClass(f.activeClasses),f.activeClasses=null);E(a,n);ha(a,n);n.domOperation();s.complete(!b)}var n=Ba(w),u,R;if(a=Oa(a))u=A(a),R=a.parent();var n=oa(n),s=new Q,sa=O();X(n.addClass)&&(n.addClass=n.addClass.join(" "));n.addClass&&!G(n.addClass)&&(n.addClass=null);X(n.removeClass)&&(n.removeClass=n.removeClass.join(" "));n.removeClass&&!G(n.removeClass)&&(n.removeClass=null);n.from&&!ba(n.from)&&(n.from=null);n.to&&!ba(n.to)&&(n.to=null);if(!u)return k(),s;w=[u.className,
n.addClass,n.removeClass].join(" ");if(!Xa(w))return k(),s;var g=0<=["enter","move","leave"].indexOf(h),x=l[0].hidden,t=!f||x||L.get(u);w=!t&&z.get(u)||{};var H=!!w.state;t||H&&1===w.state||(t=!N(a,R,h));if(t)return x&&q(s,h,"start"),k(),x&&q(s,h,"close"),s;g&&M(a);x={structural:g,element:a,event:h,addClass:n.addClass,removeClass:n.removeClass,close:k,options:n,runner:s};if(H){if(d("skip",a,x,w)){if(2===w.state)return k(),s;V(a,w,x);return w.runner}if(d("cancel",a,x,w))if(2===w.state)w.runner.end();
else if(w.structural)w.close();else return V(a,w,x),w.runner;else if(d("join",a,x,w))if(2===w.state)V(a,x,{});else return Sa(a,g?h:null,n),h=x.event=w.event,n=V(a,w,x),w.runner}else V(a,x,{});(H=x.structural)||(H="animate"===x.event&&0<Object.keys(x.options.to||{}).length||e(x));if(!H)return k(),ka(a),s;var C=(w.counter||0)+1;x.counter=C;I(a,1,x);c.$$postDigest(function(){var b=z.get(u),c=!b,b=b||{},f=0<(a.parent()||[]).length&&("animate"===b.event||b.structural||e(b));if(c||b.counter!==C||!f){c&&
(E(a,n),ha(a,n));if(c||g&&b.event!==h)n.domOperation(),s.end();f||ka(a)}else h=!b.structural&&e(b,!0)?"setClass":b.event,I(a,2),b=Wa(a,h,b.options),s.setHost(b),q(s,h,"start",{}),b.done(function(b){k(!b);(b=z.get(u))&&b.counter===C&&ka(A(a));q(s,h,"close",{})})});return s}function M(a){a=A(a).querySelectorAll("[data-ng-animate]");r(a,function(a){var b=parseInt(a.getAttribute("data-ng-animate"),10),c=z.get(a);if(c)switch(b){case 2:c.runner.end();case 1:z.remove(a)}})}function ka(a){a=A(a);a.removeAttribute("data-ng-animate");
z.remove(a)}function k(a,b){return A(a)===A(b)}function N(a,b,c){c=F(l[0].body);var f=k(a,c)||"HTML"===a[0].nodeName,d=k(a,g),h=!1,q,e=L.get(A(a));(a=F.data(a[0],"$ngAnimatePin"))&&(b=a);for(b=A(b);b;){d||(d=k(b,g));if(1!==b.nodeType)break;a=z.get(b)||{};if(!h){var s=L.get(b);if(!0===s&&!1!==e){e=!0;break}else!1===s&&(e=!1);h=a.structural}if(K(q)||!0===q)a=F.data(b,"$$ngAnimateChildren"),xa(a)&&(q=a);if(h&&!1===q)break;f||(f=k(b,c));if(f&&d)break;if(!d&&(a=F.data(b,"$ngAnimatePin"))){b=A(a);continue}b=
b.parentNode}return(!h||q)&&!0!==e&&d&&f}function I(a,b,c){c=c||{};c.state=b;a=A(a);a.setAttribute("data-ng-animate",b);c=(b=z.get(a))?ua(b,c):c;z.put(a,c)}var z=new C,L=new C,f=null,s=c.$watch(function(){return 0===t.totalPendingRequests},function(a){a&&(s(),c.$$postDigest(function(){c.$$postDigest(function(){null===f&&(f=!0)})}))}),h=Object.create(null),sa=a.classNameFilter(),Xa=sa?function(a){return sa.test(a)}:function(){return!0},E=Z(H),x=S.Node.prototype.contains||function(a){return this===
a||!!(this.compareDocumentPosition(a)&16)},ra={on:function(a,b,c){var f=ta(b);h[a]=h[a]||[];h[a].push({node:f,callback:c});F(b).on("$destroy",function(){z.get(f)||ra.off(a,b,c)})},off:function(a,b,c){if(1!==arguments.length||G(arguments[0])){var f=h[a];f&&(h[a]=1===arguments.length?null:q(f,b,c))}else for(f in b=arguments[0],h)h[f]=q(h[f],b)},pin:function(a,b){Da(ea(a),"element","not an element");Da(ea(b),"parentElement","not an element");a.data("$ngAnimatePin",b)},push:function(a,b,c,f){c=c||{};
c.domOperation=f;return u(a,b,c)},enabled:function(a,b){var c=arguments.length;if(0===c)b=!!f;else if(ea(a)){var d=A(a);1===c?b=!L.get(d):L.put(d,!b)}else b=f=!!a;return b}};return ra}]}]).provider("$$animation",["$animateProvider",function(a){var b=this.drivers=[];this.$get=["$$jqLite","$rootScope","$injector","$$AnimateRunner","$$HashMap","$$rAFScheduler",function(a,d,e,l,m,J){function g(a){function b(a){if(a.processed)return a;a.processed=!0;var d=a.domNode,u=d.parentNode;e.put(d,a);for(var M;u;){if(M=
e.get(u)){M.processed||(M=b(M));break}u=u.parentNode}(M||c).children.push(a);return a}var c={children:[]},d,e=new m;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,k=[];for(d=0;d<c.length;d++){var g=c[d];0>=a&&(a=e,e=0,b.push(k),k=[]);k.push(g.fn);g.children.forEach(function(a){e++;c.push(a)});a--}k.length&&b.push(k);
return b}(c)}var v=[],C=Z(a);return function(m,Q,t){function H(a){a=a.hasAttribute("ng-animate-ref")?[a]:a.querySelectorAll("[ng-animate-ref]");var b=[];r(a,function(a){var c=a.getAttribute("ng-animate-ref");c&&c.length&&b.push(a)});return b}function R(a){var b=[],c={};r(a,function(a,d){var h=A(a.element),e=0<=["enter","move"].indexOf(a.event),h=a.structural?H(h):[];if(h.length){var k=e?"to":"from";r(h,function(a){var b=a.getAttribute("ng-animate-ref");c[b]=c[b]||{};c[b][k]={animationID:d,element:F(a)}})}else b.push(a)});
var d={},e={};r(c,function(c,k){var q=c.from,z=c.to;if(q&&z){var s=a[q.animationID],g=a[z.animationID],u=q.animationID.toString();if(!e[u]){var m=e[u]={structural:!0,beforeStart:function(){s.beforeStart();g.beforeStart()},close:function(){s.close();g.close()},classes:O(s.classes,g.classes),from:s,to:g,anchors:[]};m.classes.length?b.push(m):(b.push(s),b.push(g))}e[u].anchors.push({out:q.element,"in":z.element})}else q=q?q.animationID:z.animationID,z=q.toString(),d[z]||(d[z]=!0,b.push(a[q]))});return b}
function O(a,b){a=a.split(" ");b=b.split(" ");for(var c=[],d=0;d<a.length;d++){var e=a[d];if("ng-"!==e.substring(0,3))for(var q=0;q<b.length;q++)if(e===b[q]){c.push(e);break}}return c.join(" ")}function y(a){for(var c=b.length-1;0<=c;c--){var d=e.get(b[c])(a);if(d)return d}}function q(a,b){function c(a){(a=a.data("$$animationRunner"))&&a.setHost(b)}a.from&&a.to?(c(a.from.element),c(a.to.element)):c(a.element)}function u(){var a=m.data("$$animationRunner");!a||"leave"===Q&&t.$$domOperationFired||a.end()}
function M(b){m.off("$destroy",u);m.removeData("$$animationRunner");C(m,t);ha(m,t);t.domOperation();I&&a.removeClass(m,I);m.removeClass("ng-animate");k.complete(!b)}t=oa(t);var ka=0<=["enter","move","leave"].indexOf(Q),k=new l({end:function(){M()},cancel:function(){M(!0)}});if(!b.length)return M(),k;m.data("$$animationRunner",k);var N=Ea(m.attr("class"),Ea(t.addClass,t.removeClass)),I=t.tempClasses;I&&(N+=" "+I,t.tempClasses=null);var z;ka&&(z="ng-"+Q+"-prepare",a.addClass(m,z));v.push({element:m,
classes:N,event:Q,structural:ka,options:t,beforeStart:function(){m.addClass("ng-animate");I&&a.addClass(m,I);z&&(a.removeClass(m,z),z=null)},close:M});m.on("$destroy",u);if(1<v.length)return k;d.$$postDigest(function(){var a=[];r(v,function(b){b.element.data("$$animationRunner")?a.push(b):b.close()});v.length=0;var b=R(a),c=[];r(b,function(a){c.push({domNode:A(a.from?a.from.element:a.element),fn:function(){a.beforeStart();var b,c=a.close;if((a.anchors?a.from.element||a.to.element:a.element).data("$$animationRunner")){var d=
y(a);d&&(b=d.start)}b?(b=b(),b.done(function(a){c(!a)}),q(a,b)):c()}})});J(g(c))});return k}}]}]).provider("$animateCss",["$animateProvider",function(a){var b=Ja(),c=Ja();this.$get=["$window","$$jqLite","$$AnimateRunner","$timeout","$$forceReflow","$sniffer","$$rAFScheduler","$$animateQueue",function(a,e,l,m,J,g,v,C){function B(a,b){var c=a.parentNode;return(c.$$ngAnimateParentKey||(c.$$ngAnimateParentKey=++O))+"-"+a.getAttribute("class")+"-"+b}function Q(q,g,m,R){var k;0<b.count(m)&&(k=c.get(m),
k||(g=Y(g,"-stagger"),e.addClass(q,g),k=Ha(a,q,R),k.animationDuration=Math.max(k.animationDuration,0),k.transitionDuration=Math.max(k.transitionDuration,0),e.removeClass(q,g),c.put(m,k)));return k||{}}function t(a){y.push(a);v.waitUntilQuiet(function(){b.flush();c.flush();for(var a=J(),d=0;d<y.length;d++)y[d](a);y.length=0})}function H(c,e,g){(e=b.get(g))||(e=Ha(a,c,Ua));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 R=Z(e),O=0,y=[];return function(a,c){function d(){k()}function v(){k(!0)}function k(b){if(!(x||F&&O)){x=!0;O=!1;f.$$skipPreparationClasses||e.removeClass(a,ga);e.removeClass(a,ea);va(h,!1);pa(h,!1);r(y,function(a){h.style[a[0]]=""});R(a,f);ha(a,f);Object.keys(s).length&&r(s,function(a,b){a?h.style.setProperty(b,a):h.style.removeProperty(b)});if(f.onDone)f.onDone();fa&&fa.length&&a.off(fa.join(" "),z);var c=a.data("$$animateCss");c&&(m.cancel(c[0].timer),
a.removeData("$$animateCss"));G&&G.complete(!b)}}function N(a){p.blockTransition&&pa(h,a);p.blockKeyframeAnimation&&va(h,!!a)}function I(){G=new l({end:d,cancel:v});t(P);k();return{$$willAnimate:!1,start:function(){return G},end:d}}function z(a){a.stopPropagation();var b=a.originalEvent||a;a=b.$manualTimeStamp||Date.now();b=parseFloat(b.elapsedTime.toFixed(3));Math.max(a-Z,0)>=S&&b>=n&&(F=!0,k())}function L(){function b(){if(!x){N(!1);r(y,function(a){h.style[a[0]]=a[1]});R(a,f);e.addClass(a,ea);if(p.recalculateTimingStyles){na=
h.className+" "+ga;ia=B(h,na);D=H(h,na,ia);ca=D.maxDelay;K=Math.max(ca,0);n=D.maxDuration;if(0===n){k();return}p.hasTransitions=0<D.transitionDuration;p.hasAnimations=0<D.animationDuration}p.applyAnimationDelay&&(ca="boolean"!==typeof f.delay&&wa(f.delay)?parseFloat(f.delay):ca,K=Math.max(ca,0),D.animationDelay=ca,da=[qa,ca+"s"],y.push(da),h.style[da[0]]=da[1]);S=1E3*K;V=1E3*n;if(f.easing){var d,g=f.easing;p.hasTransitions&&(d=T+"TimingFunction",y.push([d,g]),h.style[d]=g);p.hasAnimations&&(d=aa+
"TimingFunction",y.push([d,g]),h.style[d]=g)}D.transitionDuration&&fa.push(ya);D.animationDuration&&fa.push(za);Z=Date.now();var L=S+1.5*V;d=Z+L;var g=a.data("$$animateCss")||[],l=!0;if(g.length){var I=g[0];(l=d>I.expectedEndTime)?m.cancel(I.timer):g.push(k)}l&&(L=m(c,L,!1),g[0]={timer:L,expectedEndTime:d},g.push(k),a.data("$$animateCss",g));if(fa.length)a.on(fa.join(" "),z);f.to&&(f.cleanupStyles&&Ka(s,h,Object.keys(f.to)),Ga(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(!x)if(h.parentNode){var d=function(a){if(F)O&&a&&(O=!1,k());else if(O=!a,D.animationDuration)if(a=va(h,O),O)y.push(a);else{var b=y,c=b.indexOf(a);0<=a&&b.splice(c,1)}},g=0<ba&&(D.transitionDuration&&0===W.transitionDuration||D.animationDuration&&0===W.animationDuration)&&Math.max(W.animationDelay,W.transitionDelay);g?m(b,Math.floor(g*ba*1E3),!1):b();w.resume=function(){d(!0)};w.pause=function(){d(!1)}}else k()}var f=c||{};f.$$prepared||(f=oa(Ba(f)));var s={},h=A(a);
if(!h||!h.parentNode||!C.enabled())return I();var y=[],J=a.attr("class"),E=Na(f),x,O,F,G,w,K,S,n,V,Z,fa=[];if(0===f.duration||!g.animations&&!g.transitions)return I();var ja=f.event&&X(f.event)?f.event.join(" "):f.event,$="",U="";ja&&f.structural?$=Y(ja,"ng-",!0):ja&&($=ja);f.addClass&&(U+=Y(f.addClass,"-add"));f.removeClass&&(U.length&&(U+=" "),U+=Y(f.removeClass,"-remove"));f.applyClassesEarly&&U.length&&R(a,f);var ga=[$,U].join(" ").trim(),na=J+" "+ga,ea=Y(ga,"-active"),J=E.to&&0<Object.keys(E.to).length;
if(!(0<(f.keyframeStyle||"").length||J||ga))return I();var ia,W;0<f.stagger?(E=parseFloat(f.stagger),W={transitionDelay:E,animationDelay:E,transitionDuration:0,animationDuration:0}):(ia=B(h,na),W=Q(h,ga,ia,Va));f.$$skipPreparationClasses||e.addClass(a,ga);f.transitionStyle&&(E=[T,f.transitionStyle],la(h,E),y.push(E));0<=f.duration&&(E=0<h.style[T].length,E=Ia(f.duration,E),la(h,E),y.push(E));f.keyframeStyle&&(E=[aa,f.keyframeStyle],la(h,E),y.push(E));var ba=W?0<=f.staggerIndex?f.staggerIndex:b.count(ia):
0;(ja=0===ba)&&!f.skipBlocking&&pa(h,9999);var D=H(h,na,ia),ca=D.maxDelay;K=Math.max(ca,0);n=D.maxDuration;var p={};p.hasTransitions=0<D.transitionDuration;p.hasAnimations=0<D.animationDuration;p.hasTransitionAll=p.hasTransitions&&"all"===D.transitionProperty;p.applyTransitionDuration=J&&(p.hasTransitions&&!p.hasTransitionAll||p.hasAnimations&&!p.hasTransitions);p.applyAnimationDuration=f.duration&&p.hasAnimations;p.applyTransitionDelay=wa(f.delay)&&(p.applyTransitionDuration||p.hasTransitions);p.applyAnimationDelay=
wa(f.delay)&&p.hasAnimations;p.recalculateTimingStyles=0<U.length;if(p.applyTransitionDuration||p.applyAnimationDuration)n=f.duration?parseFloat(f.duration):n,p.applyTransitionDuration&&(p.hasTransitions=!0,D.transitionDuration=n,E=0<h.style[T+"Property"].length,y.push(Ia(n,E))),p.applyAnimationDuration&&(p.hasAnimations=!0,D.animationDuration=n,y.push([Aa,n+"s"]));if(0===n&&!p.recalculateTimingStyles)return I();if(null!=f.delay){var da;"boolean"!==typeof f.delay&&(da=parseFloat(f.delay),K=Math.max(da,
0));p.applyTransitionDelay&&y.push([ma,da+"s"]);p.applyAnimationDelay&&y.push([qa,da+"s"])}null==f.duration&&0<D.transitionDuration&&(p.recalculateTimingStyles=p.recalculateTimingStyles||ja);S=1E3*K;V=1E3*n;f.skipBlocking||(p.blockTransition=0<D.transitionDuration,p.blockKeyframeAnimation=0<D.animationDuration&&0<W.animationDelay&&0===W.animationDuration);f.from&&(f.cleanupStyles&&Ka(s,h,Object.keys(f.from)),Fa(a,f));p.blockTransition||p.blockKeyframeAnimation?N(n):f.skipBlocking||pa(h,!1);return{$$willAnimate:!0,
end:d,start:function(){if(!x)return w={end:d,cancel:v,resume:null,pause:null},G=new l(w),t(L),G}}}}]}]).provider("$$animateCssDriver",["$$animationProvider",function(a){a.drivers.push("$$animateCssDriver");this.$get=["$animateCss","$rootScope","$$AnimateRunner","$rootElement","$sniffer","$$jqLite","$document",function(a,c,d,e,l,m,J){function g(a){return a.replace(/\bng-\S+\b/g,"")}function v(a,b){G(a)&&(a=a.split(" "));G(b)&&(b=b.split(" "));return a.filter(function(a){return-1===b.indexOf(a)}).join(" ")}
function C(c,e,m){function l(a){var b={},c=A(a).getBoundingClientRect();r(["width","height","top","left"],function(a){var d=c[a];switch(a){case "top":d+=t.scrollTop;break;case "left":d+=t.scrollLeft}b[a]=Math.floor(d)+"px"});return b}function u(){var c=g(m.attr("class")||""),d=v(c,k),c=v(k,c),d=a(C,{to:l(m),addClass:"ng-anchor-in "+d,removeClass:"ng-anchor-out "+c,delay:!0});return d.$$willAnimate?d:null}function J(){C.remove();e.removeClass("ng-animate-shim");m.removeClass("ng-animate-shim")}var C=
F(A(e).cloneNode(!0)),k=g(C.attr("class")||"");e.addClass("ng-animate-shim");m.addClass("ng-animate-shim");C.addClass("ng-anchor");H.append(C);var N;c=function(){var c=a(C,{addClass:"ng-anchor-out",delay:!0,from:l(e)});return c.$$willAnimate?c:null}();if(!c&&(N=u(),!N))return J();var I=c||N;return{start:function(){function a(){c&&c.end()}var b,c=I.start();c.done(function(){c=null;if(!N&&(N=u()))return c=N.start(),c.done(function(){c=null;J();b.complete()}),c;J();b.complete()});return b=new d({end:a,
cancel:a})}}}function B(a,b,c,e){var g=Q(a,P),m=Q(b,P),l=[];r(e,function(a){(a=C(c,a.out,a["in"]))&&l.push(a)});if(g||m||0!==l.length)return{start:function(){function a(){r(b,function(a){a.end()})}var b=[];g&&b.push(g.start());m&&b.push(m.start());r(l,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 Q(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=$(e.event,e.preparationClasses));c=a(d,e);return c.$$willAnimate?c:null}if(!l.animations&&!l.transitions)return P;var t=J[0].body;c=A(e);var H=F(c.parentNode&&11===c.parentNode.nodeType||t.contains(c)?c:t);return function(a){return a.from&&a.to?B(a.from,a.to,a.classes,a.anchors):Q(a)}}]}]).provider("$$animateJs",["$animateProvider",function(a){this.$get=["$injector","$$AnimateRunner","$$jqLite",function(b,c,d){function e(c){c=X(c)?c:c.split(" ");for(var d=
[],e={},l=0;l<c.length;l++){var r=c[l],B=a.$$registeredAnimations[r];B&&!e[r]&&(d.push(b.get(B)),e[r]=!0)}return d}var l=Z(d);return function(a,b,d,v){function C(){v.domOperation();l(a,v)}function B(a,b,d,e,f){switch(d){case "animate":b=[b,e.from,e.to,f];break;case "setClass":b=[b,F,G,f];break;case "addClass":b=[b,F,f];break;case "removeClass":b=[b,G,f];break;default:b=[b,f]}b.push(e);if(a=a.apply(a,b))if(Ca(a.start)&&(a=a.start()),a instanceof c)a.done(f);else if(Ca(a))return a;return P}function A(a,
b,d,e,f){var g=[];r(e,function(e){var k=e[f];k&&g.push(function(){var e,f,g=!1,h=function(a){g||(g=!0,(f||P)(a),e.complete(!a))};e=new c({end:function(){h()},cancel:function(){h(!0)}});f=B(k,a,b,d,function(a){h(!1===a)});return e})});return g}function t(a,b,d,e,f){var g=A(a,b,d,e,f);if(0===g.length){var h,k;"beforeSetClass"===f?(h=A(a,"removeClass",d,e,"beforeRemoveClass"),k=A(a,"addClass",d,e,"beforeAddClass")):"setClass"===f&&(h=A(a,"removeClass",d,e,"removeClass"),k=A(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&&r(g,function(a){b.push(a())});b.length?c.all(b,a):a();return function(a){r(b,function(b){a?b.cancel():b.end()})}}}var H=!1;3===arguments.length&&ba(d)&&(v=d,d=null);v=oa(v);d||(d=a.attr("class")||"",v.addClass&&(d+=" "+v.addClass),v.removeClass&&(d+=" "+v.removeClass));var F=v.addClass,G=v.removeClass,y=e(d),q,u;if(y.length){var M,K;"leave"===b?(K="leave",M="afterLeave"):(K="before"+b.charAt(0).toUpperCase()+
b.substr(1),M=b);"enter"!==b&&"move"!==b&&(q=t(a,b,v,y,K));u=t(a,b,v,y,M)}if(q||u){var k;return{$$willAnimate:!0,end:function(){k?k.end():(H=!0,C(),ha(a,v),k=new c,k.complete(!0));return k},start:function(){function b(c){H=!0;C();ha(a,v);k.complete(c)}if(k)return k;k=new c;var d,e=[];q&&e.push(function(a){d=q(a)});e.length?e.push(function(a){C();a(!0)}):C();u&&e.push(function(a){d=u(a)});k.setHost({end:function(){H||((d||P)(void 0),b(void 0))},cancel:function(){H||((d||P)(!0),b(!0))}});c.chain(e,
b);return k}}}}}]}]).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),m=d(a.to);if(b||m)return{start:function(){function a(){return function(){r(d,function(a){a.end()})}}var d=[];b&&d.push(b.start());m&&d.push(m.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();window.analytics && analytics.page(window.location.hash.replace('#',''), { "modal": true });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
 (c) 2010-2020 Google LLC. http://angularjs.org
 License: MIT
 AngularJS NES v1.5.26
 (c) 2023 HeroDevs, Inc.
 Released under the HeroDevs NES License.
*/
(function(y,l){'use strict';function w(){return["$animate",function(t){return{restrict:"AE",transclude:"element",priority:1,terminal:!0,require:"^^ngMessages",link:function(u,n,a,c,f){var e=n[0],d,r=a.ngMessage||a.when;a=a.ngMessageExp||a.whenExp;var k=function(a){d=a?p(a)?a:a.split(/[\s,]+/):null;c.reRender()};a?(k(u.$eval(a)),u.$watchCollection(a,k)):k(r);var g,s;c.register(e,s={test:function(a){var m=d;a=m?p(m)?0<=m.indexOf(a):m.hasOwnProperty(a):void 0;return a},attach:function(){g||f(function(a,
m){t.enter(a,null,n);g=a;var d=g.$$attachId=c.getAttachId();g.on("$destroy",function(){g&&g.$$attachId===d&&(c.deregister(e),s.detach());m.$destroy()})})},detach:function(){if(g){var a=g;g=null;t.leave(a)}}})}}}]}var v,p,q,x;l.module("ngMessages",[],function(){v=l.forEach;p=l.isArray;q=l.isString;x=l.element}).directive("ngMessages",["$animate",function(t){function u(a,c){return q(c)&&0===c.length||n(a.$eval(c))}function n(a){return q(a)?a.length:!!a}return{require:"ngMessages",restrict:"AE",controller:["$element",
"$scope","$attrs",function(a,c,f){function e(a,c){for(var b=c,d=[];b&&b!==a;){var h=b.$$ngMessageNode;if(h&&h.length)return g[h];b.childNodes.length&&-1===d.indexOf(b)?(d.push(b),b=b.childNodes[b.childNodes.length-1]):b.previousSibling?b=b.previousSibling:(b=b.parentNode,d.push(b))}}var d=this,r=0,k=0;this.getAttachId=function(){return k++};var g=this.messages={},s,l;this.render=function(m){m=m||{};s=!1;l=m;for(var g=u(c,f.ngMessagesMultiple)||u(c,f.multiple),b=[],e={},h=d.head,r=!1,k=0;null!=h;){k++;
var q=h.message,p=!1;r||v(m,function(a,b){!p&&n(a)&&q.test(b)&&!e[b]&&(p=e[b]=!0,q.attach())});p?r=!g:b.push(q);h=h.next}v(b,function(a){a.detach()});b.length!==k?t.setClass(a,"ng-active","ng-inactive"):t.setClass(a,"ng-inactive","ng-active")};c.$watchCollection(f.ngMessages||f["for"],d.render);a.on("$destroy",function(){v(g,function(a){a.message.detach()})});this.reRender=function(){s||(s=!0,c.$evalAsync(function(){s&&l&&d.render(l)}))};this.register=function(c,f){var b=r.toString();g[b]={message:f};
var k=a[0],h=g[b];d.head?(k=e(k,c))?(h.next=k.next,k.next=h):(h.next=d.head,d.head=h):d.head=h;c.$$ngMessageNode=b;r++;d.reRender()};this.deregister=function(c){var f=c.$$ngMessageNode;delete c.$$ngMessageNode;var b=g[f];(c=e(a[0],c))?c.next=b.next:d.head=b.next;delete g[f];d.reRender()}}]}}]).directive("ngMessagesInclude",["$templateRequest","$document","$compile",function(l,p,n){function a(a,f){var e=n.$$createComment?n.$$createComment("ngMessagesInclude",f):p[0].createComment(" ngMessagesInclude: "+
f+" "),e=x(e);a.after(e);a.remove()}return{restrict:"AE",require:"^^ngMessages",link:function(c,f,e){var d=e.ngMessagesInclude||e.src;l(d).then(function(e){c.$$destroyed||(q(e)&&!e.trim()?a(f,d):n(e)(c,function(c){f.after(c);a(f,d)}))})}}}]).directive("ngMessage",w()).directive("ngMessageExp",w())})(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
 (c) 2010-2020 Google LLC. http://angularjs.org
 License: MIT
 AngularJS NES v1.5.26
 (c) 2023 HeroDevs, Inc.
 Released under the HeroDevs NES License.
*/
(function(s,d){'use strict';function J(d){var h=[];u(h,B).chars(d);return h.join("")}var v=d.$$minErr("$sanitize"),C,h,D,E,p,B,F,G,u;d.module("ngSanitize",[]).provider("$sanitize",function(){function g(a,e){var c={},b=a.split(","),f;for(f=0;f<b.length;f++)c[e?p(b[f]):b[f]]=!0;return c}function K(a){for(var e={},c=0,b=a.length;c<b;c++){var f=a[c];e[f.name]=f.value}return e}function H(a){return a.replace(/&/g,"&amp;").replace(L,function(a){var c=a.charCodeAt(0);a=a.charCodeAt(1);return"&#"+(1024*(c-
55296)+(a-56320)+65536)+";"}).replace(M,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function I(a){for(;a;){if(a.nodeType===s.Node.ELEMENT_NODE)for(var e=a.attributes,c=0,b=e.length;c<b;c++){var f=e[c],k=f.name.toLowerCase();if("xmlns:ns1"===k||0===k.lastIndexOf("ns1:",0))a.removeAttributeNode(f),c--,b--}(e=a.firstChild)&&I(e);a=t("nextSibling",a)}}function t(a,e){var c=e[a];if(c&&F.call(e,c))throw v("elclob",e.outerHTML||e.outerText);return c}var w=!1;this.$get=
["$$sanitizeUri",function(a){w&&h(n,z);return function(e){var c=[];G(e,u(c,function(b,c){return!/^unsafe:/.test(a(b,c))}));return c.join("")}}];this.enableSvg=function(a){return E(a)?(w=a,this):w};C=d.bind;h=d.extend;D=d.forEach;E=d.isDefined;p=d.lowercase;B=d.noop;G=function(a,e){null===a||void 0===a?a="":"string"!==typeof a&&(a=""+a);var c=x(a);if(!c)return"";var b=5;do{if(0===b)throw v("uinput");b--;a=c.innerHTML;c=x(a)}while(a!==c.innerHTML);for(b=c.firstChild;b;){switch(b.nodeType){case 1:e.start(b.nodeName.toLowerCase(),
K(b.attributes));break;case 3:e.chars(b.textContent)}var f;if(!(f=b.firstChild)&&(1===b.nodeType&&e.end(b.nodeName.toLowerCase()),f=t("nextSibling",b),!f))for(;null==f;){b=t("parentNode",b);if(b===c)break;f=t("nextSibling",b);1===b.nodeType&&e.end(b.nodeName.toLowerCase())}b=f}for(;b=c.firstChild;)c.removeChild(b)};u=function(a,e){var c=!1,b=C(a,a.push);return{start:function(a,k){a=p(a);!c&&A[a]&&(c=a);c||!0!==n[a]||(b("<"),b(a),D(k,function(c,k){var d=p(k),g="img"===a&&"src"===d||"image"===a&&("href"===
d||"xlink:href"===d)||"background"===d;!0!==y[d]||!0===m[d]&&!e(c,g)||(b(" "),b(k),b('="'),b(H(c)),b('"'))}),b(">"))},end:function(a){a=p(a);c||!0!==n[a]||!0===k[a]||(b("</"),b(a),b(">"));a==c&&(c=!1)},chars:function(a){c||b(H(a))}}};F=s.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)};var L=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,M=/([^#-~ |!])/g,k=g("area,br,col,hr,img,wbr"),q=g("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),l=g("rp,rt"),r=h({},l,q),q=h({},q,g("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")),
l=h({},l,g("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")),z=g("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"),A=g("script,style"),n=h({},k,q,l,r),m=g("background,cite,href,longdesc,src,xlink:href,xml:base"),r=g("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"),
l=g("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),y=h({},m,l,r),x=function(a,e){function c(b){b="<remove></remove>"+b;try{var c=(new a.DOMParser).parseFromString(b,"text/html").body;c.firstChild.remove();return c}catch(e){}}var b;try{b=!!c("")}catch(k){b=!1}if(b)return c;if(!e||!e.implementation)throw v("noinert");b=e.implementation.createHTMLDocument("inert");var d=(b.documentElement||b.getDocumentElement()).querySelector("body");return function(a){d.innerHTML=a;e.documentMode&&I(d);return d}}(s,s.document)});d.module("ngSanitize").filter("linky",
["$sanitize",function(g){var h=/(?:(ftp|https?):\/\/|(www\.)|(?:^|(mailto:)|([^a-z0-9._%+-]))[a-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,p=/^mailto:/i,s=d.$$minErr("linky"),t=d.isDefined,w=d.isFunction,u=d.isObject,v=d.isString;return function(d,q,l){function r(a){a&&m.push(J(a))}function z(a,b){var d,e=A(a);m.push("<a ");for(d in e)m.push(d+'="'+e[d]+'" ');!t(q)||"target"in e||m.push('target="',q,'" ');m.push('href="',a.replace(/"/g,"&quot;"),'">');r(b);m.push("</a>")}if(null==d||""===d)return d;
if(!v(d))throw s("notstring",d);for(var A=w(l)?l:u(l)?function(){return l}:function(){return{}},n=d,m=[],y,x,a,e;d=n.match(h);)y=(d[4]||"").length,a=d[0].slice(y),x=a.replace(p,""),d[1]||d[3]||(a=(d[2]?"http://":"mailto:")+a),e=d.index,r(n.slice(0,e+y)),z(a,x),n=n.slice(e+d[0].length);r(n);return g(m.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());
        };

        dataFactory.updatePieceURLs = function (data) {
            return $http.post(urlBase + '/entry/UpdatePieceURLs', 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.pieceIsForShortlistArtwork = function (pieceID) {
            return $http.get(urlBase + '/entry/PieceIsForShortlistArtwork/' + pieceID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.pieceIsForShortlistPodcast = function (pieceID) {
            return $http.get(urlBase + '/entry/PieceIsForShortlistPodcast/' + pieceID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.pieceIsForAdvertisement = function (pieceID) {
            return $http.get(urlBase + '/entry/PieceIsForShortlistAdvertisement/' + 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 (propertyID) {
            return $http.get(urlBase + '/entry/GetPieceLengths/' + propertyID);
        };

        dataFactory.getPieceCategoryOptions = function (catId) {
            return $http.get(urlBase + '/entry/GetPieceCategoryOptions/' + catId);
        };

        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.getFilteredCompanyEntries = function (props) {
            return $http.post(urlBase + '/export/ExportCompanyEntries/', props, sharedProperties.AuthenticationHeader())
        };

        dataFactory.getFilteredInventionsEntries = function (props) {
            return $http.post(urlBase + '/export/ExportInventionsEntries/', 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.exportAssignments = function (props) {
            return $http.post(urlBase + '/export/ExportAssignments/', 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.exportTimeWinnersForAudit = function (propertyId, seasonId) {
            return $http.get(urlBase + '/export/ExportTimeWinnersForAudit/' + propertyId + '/' + seasonId, sharedProperties.AuthenticationHeader());
        };

        dataFactory.exportWinnersForAudit = function (propertyId, seasonId) {
            return $http.get(urlBase + '/export/ExportWinnersForAudit/' + propertyId + '/' + seasonId, sharedProperties.AuthenticationHeader());
        };

        dataFactory.exportAuditEntryList = function (props) {
            return $http.post(urlBase + '/export/GetAuditEntryListForAdminExport/', props, 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.getFundRecommendationsCSVForAdmin = function (data) {
            return $http.get(urlBase + '/Reviewer/GetFundRecommendationsCSVForAdmin/' + 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 = ''
                    if (propId == 1) {
                        str = 'PieceID, Title, Organization, MediaType, EntrantEmail, IsWinner, IsPVWinner, IsHonoree, IsNominee, Categories, CreditFirst, CreditLast, CreditTitle, CreditOrganization, CreditBrand' + '\r\n';
                    }
                    else {
                        str = 'PieceID, Title, Organization, MediaType, EntrantEmail, IsWinner, IsPVWinner, IsHonoree, IsNominee, Categories, 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']) + sanitizeCSVData(array[p]['MediaType']) + sanitizeCSVData(array[p]['EntrantEmail'])
                            + sanitizeCSVData(array[p]['IsWinner']) + sanitizeCSVData(array[p]['IsPVWinner']) + sanitizeCSVData(array[p]['IsHonoree']) + sanitizeCSVData(array[p]['IsNominee']) + sanitizeCSVData((array[p]['Categories'].length > 0 ? array[p]['Categories'].join(',') : ''));

                        for (var c = 0; c < array[p]['Credits'].length; c++) {
                            var credit = array[p]['Credits'][c];
                            var tempLine = ''
                            if (propId == 1) {
                                tempLine = line + sanitizeCSVData(credit['FirstName']) + sanitizeCSVData(credit['LastName']) + sanitizeCSVData(credit['Title']) + sanitizeCSVData(credit['Organization']) + sanitizeCSVData(credit['Brand']);
                            }
                            else {
                                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.exportTotalByCatCSV = function (propId, seasonNumber) {
            $http.get(urlBase + '/export/ExportTotalByCat/' + 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 = 'MediaType, CategoryType, Category, EntriesCount' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['MediaType']) + sanitizeCSVData(array[p]['CategoryType']) + sanitizeCSVData(array[p]['Category']) + sanitizeCSVData(array[p]['EntriesCount']);
                        str += line + '\r\n';
                    }

                    sharedProperties.DownloadCSV({ data: { Data: str } }, "TotalByCatExport-" + 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, DateValidated(UTC), SignUp Date' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var validData = sanitizeCSVData(array[p]['Validated']); 
                        var line = sanitizeCSVData(array[p]['Email']) + validData + sanitizeCSVData(array[p]['ConfirmationURL']) + (validData == '"x",' ? sanitizeCSVData(array[p]['DateValidated']) : '"",') + sanitizeCSVData(array[p]['DateCreated']);
                        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.exportCategoryEntryCountCSV = function (propertyId, seasonId, exportType) {
            $http.post(urlBase + '/export/ExportCategoryEntryCount/', { "SeasonID": seasonId, "PropertyID": propertyId, "ExportType": exportType }, 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 = 'MediaType, CategoryType, Category, EntryCount' + '\r\n';

                    for (var p = 0; p < array.length; p++) {
                        var line = sanitizeCSVData(array[p]['MediaType']) + sanitizeCSVData(array[p]['CategoryType']) + sanitizeCSVData(array[p]['Category']) + sanitizeCSVData(array[p]['EntryCount']);
                        str += line + '\r\n';
                    }

                    sharedProperties.DownloadCSV({ data: { Data: str } }, "EntryCountByCateogryExport-" + propertyId + "-Season-" + seasonId + (exportType == 1 ? "-OriginalCategories" : "") + ".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', 'sharedProperties', function ($http, sharedProperties) {

        var urlBase = appSettings.WebApiUrl;
        var dataFactory = {};

        // GET
        dataFactory.GetUploadSettings = function () {
            return $http.post(urlBase + '/file/GetUploadSettings', data);
        };

        dataFactory.GetUploadSettings = function (data) {
            return $http.post(urlBase + '/file/GetPrivateFile', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.RemoveFile = function (data) {
            return $http.post(urlBase + '/file/RemoveFile', data, sharedProperties.AuthenticationHeader());
        };


        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());
            },
            disableSeasonForReviewer: function (reviewerId, seasonId) {
                if (!reviewerId || !seasonId) {
                    return console.error('missing parameter');
                }
                var data = {
                    SeasonID: seasonId,
                    UserID: reviewerId
                };
                return $http.post(urlBase + '/Reviewer/DisableSeasonForReviewer/', 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());
            },
            submitFundRecommendation: function (data) {
                return $http.post(urlBase + '/Reviewer/SubmitFundRecommendation/', 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.submitStripeCart = function (cart, stripeInfo) {
            return $http.post(urlBase + '/order/submitstripecart', { cartInfo: cart, stripeInfo: stripeInfo }, 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.submitStripePaymentDash = function (data) {
            return $http.post(urlBase + '/order/ProcessStripeForOrderDash', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.processStripeForStoreOrderHistory = function (data) {
            return $http.post(urlBase + '/order/ProcessStripeForStoreOrderHistory', 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());
        };

        dataFactory.getTaxInfo = function (data) {
            if (data.PropertyId != 3 && data.PropertyId != 6) {
                return $http.post(urlBase + '/ecommerce/GetOrderTaxInfo', data, sharedProperties.AuthenticationHeader());
            }
            return;
        };

        dataFactory.generateWorldPayData = function (cart, transaction) {
                return $http.post(urlBase + '/order/GenerateWorldPayData', { cartInfo: cart, cardInfo: transaction }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.generateWorldPayDataForOrderDash = function (cart, transaction) {
            return $http.post(urlBase + '/order/GenerateWorldPayDataForOrderDash', { Order: cart, CreditCard: transaction }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.generateStripeDataForOrderDash = function (cart, stripeData) {
            return $http.post(urlBase + '/order/GenerateStripeDataForOrderDash', { Order: cart, stripeInfo: stripeData }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.generateStripeDataForStoreOrderHistory = function (cart, stripeData) {
            return $http.post(urlBase + '/order/GenerateStripeDataForStoreOrderHistory', { Order: cart, stripeInfo: stripeData }, sharedProperties.AuthenticationHeader());
        };

        dataFactory.generateStripeData = function (cart, stripeInfo) {
            return $http.post(urlBase + '/order/GenerateStripeData', { cartInfo: cart, "stripeInfo": stripeInfo }, 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, entryPropertyID) {
            return $http.get(urlBase + '/property/GetActiveEntryPropertyForSpecialAchievements/' + includeRecommendations + "/" + judgingPropertyID + (entryPropertyID ? ("/" + entryPropertyID) : ""), 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.authorizeGoogle = function (data) {
            return $http.post(urlBase + "/PV/AuthorizeGoogle", 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());
        }
        reviewsFactory.getCategoryReviewCount = function (data) {
            return $http.post(urlBase + '/Review/GetCategoryReviewCount', data, sharedProperties.AuthenticationHeader());
        }
        reviewsFactory.updateExecJudgingCategoryHide = function (data) {
            return $http.post(urlBase + '/Review/UpdateExecJudgingCategoryHide', 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.getSubscriptionsByProperty = function (propid) {
            return $http.get(urlBase + '/season/GetCurrentSeasonEntrySubscriptions/' + 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.cloneSubs = function (data) {
            return $http.post(urlBase + '/season/CloneSubs', data, sharedProperties.AuthenticationHeader());
        }

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

        dataFactory.cloneDifferenceReviewers = function (data) {
            return $http.post(urlBase + '/season/CloneDifferenceReviewers', 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.getUserEntrantAddtlDetails = function (propertyId, userid) {
            return $http.get(urlBase + '/user/entrant/GetAddtlDetails/' + propertyId + '/' + userid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.unSubscribeEntrant = function (propertyId, userid) {
            return $http.get(urlBase + '/user/entrant/UnSubscribe/' + propertyId + '/' + userid, sharedProperties.AuthenticationHeader());
        };

        dataFactory.manualSubscribeEntrant = function (propertyId, userid) {
            return $http.get(urlBase + '/user/entrant/ManualSubscribe/' + 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.unBlockUserRequestType = function (userRequestType) {
            return $http.post(urlBase + '/user/entrant/UnBlockRequestType', userRequestType, sharedProperties.AuthenticationHeader());
        };
        dataFactory.getContact = function () {
            return $http.post(urlBase + '/Account/ContactInfo', null, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getStripeUserData = function () {
            return $http.get(urlBase + '/User/GetStripePortalInfo', 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.getSubStatus = function (propertyId) {
            return $http.get(urlBase + "/user/entrant/GetCurrentSubscription/" + propertyId, sharedProperties.AuthenticationHeader());
        }

        dataFactory.unSubscribe = function (propertyId) {
            return $http.get(urlBase + "/user/entrant/UnSubscribe/" + propertyId, 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());
        }

        dataFactory.updateEntrantFiles = function (data) {
            return $http.post(urlBase + '/user/UpdateEntrantFiles/', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getSubmittedEntrants = function (data) {
            return $http.post(urlBase + '/user/GetSubmittedEntrants/', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getSubmittedOrgs = function (data) {
            return $http.post(urlBase + '/user/GetSubmittedOrgs/', data, 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', ['$location', function ($location) {
    var pageObj = {};
    pageObj.title = "The Webby Awards";
    pageObj.description = "Welcome to The Webby Awards Gallery.";

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

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

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

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

    pageObj.setCanonical = function () {
        var currentUrl = $location.absUrl();
        if(currentUrl)
            pageObj.canonicalLink = currentUrl.split('?')[0];
    };

    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 TimeAccess = "TimeOnly";
        var extendedFlag = "extended";

        var getStorageItem = function (key) {
            return localStorage.getItem(key) || sessionStorage.getItem(key);
        };

        var removeStorageItem = function (key) {
            sessionStorage.removeItem(key);
            localStorage.removeItem(key);
        };

        function getStripeProperties() {
            return [1,3,4,5,8,9,14,15,17,19];
        }

        function getHonorsEnhancementProperties() {
            return [8,9,4,5,14,15,17];
        }

        function getFieldMaxLength(propertyId, fieldName, mediaType) {
            switch (fieldName) {
                case "ResultsEvaluation":
                    if (propertyId == 19)
                        return 1000;
                    else
                        return 300;
                    break;
                case "ProjectSummary":
                    if (propertyId == 19 && mediaType == 'Company')
                        return 1000;
                    else if (propertyId == 19 && mediaType == 'Inventions')
                        return 300;
                    else
                        return 500;
                    break;
                case "Objectives":
                    if (propertyId == 19)
                        return 1000;
                    else
                        return 300;
                    break;
                case "CompanyEffortsDiversity":
                    if (propertyId == 19)
                        return 1000;
                    else
                        return 300;
                    break;
                case "CompanyEffortsSustainability":
                    if (propertyId == 19)
                        return 1000;
                    else
                        return 300;
                    break;
                default:
                    return 300;
            }
        }

        return {

            GetStripeProperties: getStripeProperties,
            GetHonorsEnhancementProperties: getHonorsEnhancementProperties,
            getFieldMaxLength: getFieldMaxLength,
            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") {
                    localStorage.setItem(APlusAccess, data);
                } else if (site == "Magellan") {
                    localStorage.setItem(MagellanAccess, data);
                } else if (site == "Time") {
                    localStorage.setItem(TimeAccess, data);
                }
            },
            GetAccessLimited: function () {
                var access = ""
                if (localStorage.getItem(APlusAccess) === 'true')
                    access += "APlus,";
                if (localStorage.getItem(MagellanAccess) === 'true')
                    access += "Magellan,";
                if (localStorage.getItem(TimeAccess) === 'true')
                    access += "Time,";

                return access;
            },
            GetGlobalAccess: function () {
                if (localStorage.getItem(TimeAccess) === 'true')
                    return false;
                return true;
            },
            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 || propID == 19;
                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 || propID == 19;
                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"
            ],
            TwitterAnthemRankedDictionary: [
                "ATTENTION: [[TITLE]] is in [[RANK]] place to win an Anthem Community Voice Award! 👏 Rally the troops to celebrate now!: &&LINK&& #AnthemAwards"
            ],
            TwitterAnthemNonRankedDictionary: [
                "Help [[TITLE]] win an Anthem Community Voice Award! Join me in celebrating their work! &&LINK&& #AnthemAwards",
                "Celebrate changemakers with the Anthem Awards and support [[TITLE]] to win a Community Voice Award: &&LINK&& #AnthemAwards",
                "Show your support for game-changing impact work! Help [[TITLE]] win an Anthem Community Voice Award. &&LINK&& #AnthemAwards",
                "My support + yours = Anthem Community Voice glory for [[TITLE]]. Celebrate now! &&LINK&& #AnthemAwards",
                "TODAY is the last day to show support for [[TITLE]]. Join the Anthem Awards Celebration: &&LINK&& #AnthemAwards",
                "It’s time to celebrate! Help [[TITLE]] win an Anthem Community Voice Award. The celebration window ends TODAY &&LINK&& #AnthemAwards"
            ],
            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;
                    case 14:
                        twitter_callout = "Anthem Community Voice";
                        award_name = "Anthem Community Voice";
                        break;
                    case 15:
                        twitter_callout = "@signalawards Listener’s Choice #signalawards";
                        award_name = "Listener’s Choice";
                        break;
                    case 17:
                        twitter_callout = "#collisionaudiencechoice";
                        break;
                    default:
                        twitter_callout = "";
                        break;
                }

                var message = "";
                if (properties["propertyDetails"].PropertyID != 1 && properties["propertyDetails"].PropertyID != 3 && properties["propertyDetails"].PropertyID != 8 && properties["propertyDetails"].PropertyID != 14 && properties["propertyDetails"].PropertyID != 15) {
                    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 if (properties["propertyDetails"].PropertyID == 14) {
                    message = isLastDay ? this.TwitterAnthemNonRankedDictionary[Math.floor(Math.random() * this.TwitterAnthemNonRankedDictionary.length)] : this.TwitterAnthemRankedDictionary[Math.floor(Math.random() * this.TwitterAnthemRankedDictionary.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 if (properties["propertyDetails"].PropertyID == 15) {
                    message = isLastDay ? (entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title) + " is competing in the " + twitter_callout + ". Let's help them win a " + award_name + " Award!! &&LINK&&" :
                        (entry.TwitterName ? "@" + entry.TwitterName.replace('@', '') : entry.Title) + " is now in " + this.getOrdinal(entry.CurrentRank, true) + " place " + twitter_callout + ". RT + VOTE: &&LINK&&";
                }
                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." }
            ],
            FacebookAnthemOGDictionary: [
                { Title: "The Anthem Awards Needs You", Description: "It’s time to celebrate! Help [[TITLE]] win an Anthem Community Voice Award." }
            ],
            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";
                        break;
                    case 14:
                        facebook_callout = "Anthem Community Voice";
                        award_name = "Anthem Community Voice";
                        break;
                    case 15:
                        facebook_callout = "@signalawards Listener’s Choice #signalawards";
                        award_name = "Listener’s Choice";
                        break;
                    case 17:
                        facebook_callout = "#collisionaudiencechoice";
                        break;
                    default:
                        break;
                }
                var message = "";
                if (properties["propertyDetails"].PropertyID != 1 && properties["propertyDetails"].PropertyID != 3 && properties["propertyDetails"].PropertyID != 8 && properties["propertyDetails"].PropertyID != 14 && properties["propertyDetails"].PropertyID != 15) {
                    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 if (properties["propertyDetails"].PropertyID == 14) {
                    obj = this.FacebookAnthemOGDictionary[0];
                    obj.Description = obj.Description.replace("[[TITLE]]", entry.Title);
                }
                else if (properties["propertyDetails"].PropertyID == 15) {
                    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!!";
                }
                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";
            },

            WebbySubscriptionSet: function (id, bool) {
                localStorage.setItem("WebbySubscription" + id, bool);
            },
            WebbySubscriptionChecked: function (id) {
                return localStorage.getItem("WebbySubscription" + 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.gtag', 'angulartics.facebook.pixel', 'angulartics.snapchat.pixel', 'angulartics-twitter-pixel', 'angulartics-tik-tok-pixel', 'angulartics.reddit.pixel', 'angulartics.segment', '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.subscription', {
            url: "/subscription",
            templateUrl: "/Entries/Subscription",
            mode: 'entry'
        })
        .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?pares&oid",
            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: "?pares&oid",
            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 == 'entrant.nonprofitdoc' ? 'taxDocument' : 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 : (modalType == 'spaAsset' ? UploadFileDialogSPACtrl : ((modalType != null && modalType.indexOf('entrant.') == 0 )? UploadFileDialogEntrantCtrl : 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 : ($scope.propertyID == 15 ? 2 : 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 || $scope.propertyId == 9;
        }
    });
    Object.defineProperty($scope.maxCheck, 'MaxAllowedCount', {
        get: function () {
            if ($scope.isShortlist) { return 1; }
            else if (($scope.piece && $scope.piece.IsCampaign) || $scope.propertyID == 7 || $scope.propertyID == 14 || $scope.propertyID == 15) { return $scope.maxCampaignItems; }
            else if ($scope.propertyID == 6) { return 4; }
            else if ($scope.propertyID == 19) { return 5; }
            else if ($scope.propertyId == 9) { return 2; }

            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.removeArtworkFileUpload = function () {
        $scope.piece.File = null;
    }

    $scope.checkShortlistItem = function (file) {
        return file.ShortlistItem == 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.setArtworkFileUrlFromS3 = 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,
            ShortlistItem: true
        });

        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;
        }
        if ($scope.propertyID == 14 || $scope.propertyID == 15) {
            SavePiece(true);
        }
        else {
            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>"
            },
                SavePiece);
        }
    };

    function SavePiece (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');
    };

}];

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

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

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

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

    $scope.maxCheck = {};

    $scope.removeFileUpload = function () {
        $scope.specialAchievement.Assets = [];
    };

    $scope.setFileUrlFromS3 = function (fileUrl, fileName) {
        if ($scope.specialAchievement.Assets && $scope.specialAchievement.Assets.length > 0) {
            $scope.specialAchievement.Assets[0].Source = fileUrl;
        }
        else {
            $scope.specialAchievement.Assets = [{
                'IsMain': true,
                'Source': fileUrl,
                'SpecialAchievementAssetTypeID': 1,
                'Thumb': ''
            }];
        }

        $scope.$digest();
    };

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

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

        $scope.submitted = false;

        var params = $scope.specialAchievement;

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

        $scope.keepSpinning = true;

        specialAchievementFactory.saveSpecialAchievementAssets(params)
            .success(function (data) {
                if (data) {

                    //TODO: DETERMINE MORE LEAN WAY TO HANDLE THIS - SINGLE ITEM VICE ENTIRE
                    if ($scope.currentEditItem) {
                        $scope.currentEditItem.Assets = $scope.specialAchievement.Assets;
                    }

                    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 UploadFileDialogEntrantCtrl = ['$scope', '$rootScope', '$uibModalInstance', 'sharedProperties', 'userFactory', 'options', 'successCallbackArgs', 'SweetAlert', 'appType', 'fileUploadFactory', function ($scope, $rootScope, $uibModalInstance, sharedProperties, userFactory, options, successCallbackArgs, SweetAlert, appType, fileUploadFactory) {
    $scope.propertyID = appType == 'admin' ? sharedProperties.getProperty("propertyID") : sharedProperties.getProperty("propertyDetails").PropertyID;

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

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

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

    $scope.maxCheck = {};

    $scope.removeFileUpload = function () {
        if (modalType == "entrant.nonprofitdoc") {
            $scope.entrant.NonProfitDocument = $scope.entrant.NonProfitDocumentOriginalName = null;
        }
        else if (modalType == "entrant.logo") {
            $scope.entrant.OrganizationLogoImage = $scope.entrant.OrganizationLogoImageOriginalName = null;
        }
        else if (modalType == "entrant.hero") {
            $scope.entrant.OrganizationHeroImage = $scope.entrant.OrganizationHeroImageOriginalName = null;
        }
    };

    $scope.setFileUrlFromS3 = function (fileUrl, fileName) {
        if (modalType == "entrant.nonprofitdoc") {
            $scope.entrant.NonProfitDocument = fileUrl.replace($scope.propertyID + '/TaxDocuments/', '');
            $scope.entrant.NonProfitDocumentOriginalName = fileName;
            $scope.$digest();
        }
        else if (modalType == "entrant.logo") {
            $scope.entrant.OrganizationLogoImage = fileUrl.replace($scope.propertyID + '/Directory/', '');
            $scope.entrant.OrganizationLogoImageOriginalName = fileName;
            $scope.$digest();
        }
        else if (modalType == "entrant.hero") {
            $scope.entrant.OrganizationHeroImage = fileUrl.replace($scope.propertyID + '/Directory/', '');
            $scope.entrant.OrganizationHeroImageOriginalName = fileName;
            $scope.$digest();
        }
    };

    $scope.downloadProofDocument = function (currentEditableUser) {
          if (currentEditableUser) {
              fileUploadFactory.GetUploadSettings({ 'PropertyID': currentEditableUser.PropertyID, 'FileName': currentEditableUser.NonProfitDocument, 'Folder': 'TaxDocuments' }).success(function (response) {
                  if (response) {
                      window.open(response, "_blank");
                  }
              });
          }
      };

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

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

        $scope.submitted = false;

        var params = $scope.entrant;

        //setup for custom non-entry specific modal
        if (modalType) {
            params['modalType'] = (modalType == 'entrant.nonprofitdoc' ? 'TaxDocument' : modalType);
        }

        $scope.keepSpinning = true;

        userFactory.updateEntrantFiles(params)
            .success(function (data) {
                if (data) {
                    if ($scope.currentEditableUser) {
                        $scope.currentEditableUser.NonProfitDocument = $scope.entrant.NonProfitDocument;
                        $scope.currentEditableUser.NonProfitDocumentOriginalName = $scope.entrant.NonProfitDocumentOriginalName;
                        $scope.currentEditableUser.OrganizationLogoImage = $scope.entrant.OrganizationLogoImage;
                        $scope.currentEditableUser.OrganizationLogoImageOriginalName = $scope.entrant.OrganizationLogoImageOriginalName;
                        $scope.currentEditableUser.OrganizationHeroImage = $scope.entrant.OrganizationHeroImage;
                        $scope.currentEditableUser.OrganizationHeroImageOriginalName = $scope.entrant.OrganizationHeroImageOriginalName;
                    }
                    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)
                    )) && !IsSmoothingLazy()
                ) {
                    validLoad = true;
                }
            }
            return validLoad;
        };

        function IsSmoothingLazy() {
            return (appType == "admin" && $http.pendingRequests[0].url.indexOf("/entry/GetRankingData") >= 0 && $http.pendingRequests[0].data && $http.pendingRequests[0].data.Data && $http.pendingRequests[0].data.Data.PageNumber && $http.pendingRequests[0].data.Data.PageNumber > 1);
        }

        $scope.isSpinnerInvoked = function () {
            return invokeSpinner;
        };
    }]);;
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('pieceUpdateController', ['$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('showPieceUpdateModal', function (event, args) {
          $uibModalStack.dismissAll();
          $scope.updatePieceDialog({ backdrop: 'static', keyboard: false }, args);
          $scope.showCloseBtn = true;
      });

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

          var modalType = null;

          var templateBase = 'Entries';
          var defaults = {
              templateUrl: "/" + templateBase + "/UpdateURLModal",
              controller: PieceUpdateDialogCtrl,
              scope: $scope,
              resolve: {
                  data: modalData,
                  options: opts,
                  successCallbackArgs: successCallbackArgs
              }
          };

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

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


var PieceUpdateDialogCtrl = ['$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 = {};
    if (successCallbackArgs && successCallbackArgs.Params && successCallbackArgs.Params.length > 0) {
        $scope.piece = successCallbackArgs.Params[0];
    }

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

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

    $scope.removeUrl = function (index) {
        $scope.piece.UrlList.splice(index, 1);
    };

    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, prop1, prop2) {
        if (prop1) {
            if (prop2) {
                $scope[prop1][prop2] = updateUrlPrefix(event);
            }
            else {
                $scope[prop1] = updateUrlPrefix(event);
            }
        }
        else {
            $scope.TempUrl = updateUrlPrefix(event, $scope.TempUrl || '');
        }
    };

    $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.save = function (isValid) {
        //reset error
        $scope.statusUpload = undefined;

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

        if ($scope.propertyID == 14) {
            SavePiece(true);
        }
        else {
            SweetAlert.swal({
                title: "Please ensure you have specified the correct information. Once your entry is saved, you will no longer have the option to edit it.",
                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>"
            },
                SavePiece);
        }
    };

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

    function SavePiece (isConfirm) {
        if (isConfirm) {
            $scope.submitted = false;
            $scope.keepSpinning = true;

            if (!$scope.piece.UrlList)
                $scope.piece.UrlList = [];

            if ($scope.TempUrl) {
                $scope.piece.UrlList.push(angular.copy($scope.TempUrl));
                $scope.TempUrl = '';
            }

            entriesFactory.updatePieceURLs($scope.piece)
                .success(function (data) {
                    if (data && data.Success) {

                        $scope.piece = data.Data;

                        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 update Piece.';
                    }
                    $scope.keepSpinning = false;
                })
                .error(function (error) {
                    $scope.statusUpload = 'Unable to save.';
                    $scope.keepSpinning = false;
                });
        }
    }

}];;
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, 14, 15, 17].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',
    'cmsFactory',
    'sharedProperties',
    '$state',
    '$location',
    '$http',
    '$rootScope',
    'SweetAlert',
    '$window',
	'$uibModal',
    '$analytics',
    '$sce',
    '$localStorage',
    '$timeout',
    '$document',
    function ($scope, entriesFactory, propertyFactory, geoFactory, userFactory, fileUploadFactory, seasonFactory, orderFactory, pdfFactory, mobileDetectionFactory, cmsFactory, sharedProperties, $state, $location, $http, $rootScope, SweetAlert, $window, $uibModal, $analytics, $sce, $localStorage, $timeout, $document) {
        // init
        var paymentElement = null;
        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;
            if (form.$name == "fileUploadForm2") $scope.fileUploadForm2 = form;
            if (form.$name == "fileUploadProofForm2") $scope.fileUploadProofForm2 = 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 == 6;

        //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 || $scope.propertyId == 9;
            }
        });
        Object.defineProperty($scope.maxCheck, 'MaxAllowedCount', {
            get: function () {

                if ($scope.propertyId == 1) {
                    return $scope.mediaTypeSelected.NumberOfAdditionalURLs;
                }

                if (($scope.piece.IsCampaign || $scope.propertyId == 7 || $scope.maxCheck.UseCustomCampaignMode) || $scope.propertyId == 14) { return $scope.maxCampaignItems; }
                else if ($scope.propertyId == 6) { return 4; }
                else if ($scope.propertyId == 15) { return 2; }
                else if ($scope.propertyId == 19) { return 10; }
                else if ($scope.propertyId == 1) { return 10; }
                else if ($scope.propertyId == 9) { return 2; }

                return 1;
            }
        });
        Object.defineProperty($scope.maxCheck, 'MaxURLAllowedCount', {
            get: function () {
                if ($scope.propertyId == 15) { return 1; }
                return 1;
            }
        });
        Object.defineProperty($scope.maxCheck, 'TreatAsCampaign', {
            get: function () {
                return $scope.propertyId == 1 || $scope.propertyId == 6 || $scope.propertyId == 14 || $scope.propertyId == 15;
            }
        });

        $scope.getFieldMaxLength = sharedProperties.getFieldMaxLength;

        $scope.vatAmount = 0;
        $scope.vatDirty = true;
        $scope.creditsEmpty = false;

        $scope.openLogoFileSelector = function () {
            $('.file_upload').find("input[type='file']").trigger('click');
        };

        $scope.openHeroFileSelector = function () {
            $('.file_upload_dir').find("input[type='file']").trigger('click');
        };

        $scope.openNonProfitFileSelector = function () {
            $('.file_upload_proof').find("input[type='file']").trigger('click');
        };

        $scope.setFileProofNameFromS3 = function (fileUrl, fileName) {
            if (!$scope.submission.Contact) {
                $scope.submission.Contact = {};
            }
            $scope.submission.Contact.NonProfitDocumentOriginalName = fileName;
            $scope.submission.Contact.NonProfitDocument = fileUrl.replace($scope.propertyDetails.PropertyID + '/TaxDocuments/', '');
            $scope.$digest();
        };

        $scope.removeNonProfitFileUpload = function () {
            if (!$scope.submission.Contact) {
                $scope.submission.Contact = {};
            }
            $scope.submission.Contact.NonProfitDocumentOriginalName = null;
            $scope.submission.Contact.NonProfitDocument = null;
        };

        $scope.setHeroFileNameFromS3 = function (fileUrl, fileName) {
            if (!$scope.submission.Contact) {
                $scope.submission.Contact = {};
            }
            $scope.submission.Contact.OrganizationHeroImageOriginalName = fileName;
            $scope.submission.Contact.OrganizationHeroImage = fileUrl.replace($scope.propertyDetails.PropertyID + '/Directory/', '');
            $scope.$digest();
        };

        $scope.setLogoFileNameFromS3 = function (fileUrl, fileName) {
            if (!$scope.submission.Contact) {
                $scope.submission.Contact = {};
            }
            $scope.submission.Contact.OrganizationLogoImageOriginalName = fileName;
            $scope.submission.Contact.OrganizationLogoImage = fileUrl.replace($scope.propertyDetails.PropertyID + '/Directory/', '');
            $scope.$digest();
        };

        $scope.removeLogoUpload = function () {
            $scope.submission.Contact.OrganizationLogoImageOriginalName = null;
            $scope.submission.Contact.OrganizationLogoImage = null;
        };

        $scope.removeHeroUpload = function () {
            $scope.submission.Contact.OrganizationHeroImageOriginalName = null;
            $scope.submission.Contact.OrganizationHeroImage = null;
        };

        $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.timeshowedRegister = false;
            $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: [],
                CategoriesForCustomUrls: {},
                CustomUrls: [],
                IsCampaign: false,
                UploadFile: "",
                MailItem: "",
                OriginalFileName: "",
                EntryType: (propertyID == 15 ? "UrlUpload" : (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: "",
                ReferralInfo: ""
            };
        };

        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.isLoggedIn = function () {
            return sharedProperties.HasToken();
        };

        $scope.loginContentArea = function () {
            $rootScope.$broadcast('promptLoginEvent');
        };

        $scope.contact = contactTemplate();

        // set some referral options for Magellan
        $scope.referralOptions = setDefaultReferralOptions();

        function setDefaultReferralOptions() {
            return $scope.propertyId === 6 ?
                [
                    {
                        value: false, label: 'I am a previous entrant'
                    },
                    {
                        value: false, label: 'Email from Travel Weekly'
                    },
                    {
                        value: false, label: 'Personal email invite to enter'
                    },
                    {
                        value: false, label: 'Facebook'
                    },
                    {
                        value: false, label: 'LinkedIn'
                    },
                    {
                        value: false, label: 'Instagram'
                    },
                    {
                        value: false, label: 'Banner or pop - up ad on TravelWeekly.com or eNewsletter'
                    },
                    {
                        value: false, label: 'Print ad in Travel Weekly'
                    },
                    {
                        value: false, label: 'Referred by a friend / colleague'
                    },
                    {
                        value: false, label: 'At a live event produced by Travel Weekly / Northstar Travel Group'
                    },
                    { value: false, label: 'Other', detail: '' }
                ] : null;
        }

        $scope.referralOptionChecked = function (val, index) {
            $scope.referralOptions[index].value = val;
            if (index === 10 && val === false) { $scope.referralOptions[10].detail = '' };
        };

        $scope.referralDetailChanged = function (event) {
            $scope.referralOptions[10].detail = event.target.value;
        };

        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, prop1, prop2) {
            if (prop1) {
                if (prop2) {
                    $scope[prop1][prop2] = updateUrlPrefix(event);
                }
                else {
                    $scope[prop1] = updateUrlPrefix(event);
                }
            }
            else {
                $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 {
                if (!([19].indexOf($scope.propertyId) > -1)) {
                    $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');
                } else if (propertyID == 19 && !$scope.timeshowedRegister) {
                    $scope.timeshowedRegister = true;
                    return $rootScope.$broadcast('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) {
            //if ($scope.submission && $scope.submission.Pieces && $scope.submission.Pieces.length > 0)
            //    $scope.submitSubmission(null, true, true);
            if (data) {
                $analytics.setAlias(data.Email);
                $analytics.setUsername(data.Email);
                $analytics.setUserProperties(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);
                }
                // ensure this is null if user has provided
                if (data.ReferralInfo) {
                    $scope.referralOptions = null;
                }
                GetSubData();
            } catch (e) {
                //console.log(e);
            }
        });

        $scope.$on('logout', function (event, data) {
            try {
                $state.go('enter.select').then(function () {
                    $localStorage.$reset(defaultLocal);
                });
                // reset the referral options - make sure they are present for next user/submission
                $scope.referralOptions = setDefaultReferralOptions();
            } 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.timeshowedRegister = false;
                $scope.entryComplete = false;
                $scope.propertySelectedSubscription = null;
            } catch (e) {
                sharedProperties.clearLocalStorage('entries');
                $scope.mediaTypeSelected = null;
                $scope.currentTimesEntered = 0;
                $scope.timeshowedRegister = false;
                $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 ($scope.entryComplete && toState.name != "enter.success" && toState.name != "enter.checkoutfinalize") {
                sharedProperties.setProperty("reviewsAccessible", false);
                // reset local storage
                resetEntries();
            }
            else if (toState.name == 'enter.review') {
                friendlyCategoryNameResolver();
                $analytics.eventTrack('enter_work',
                    {
                        title: $scope.piece.Title,
                        categories: $scope.friendlyCategoryNameArray,
                        company_roles: ($scope.piece.ClientTypeID == 1 ? 'Internal' : ($scope.piece.ClientTypeID == 2 ? 'Agency' : 'PR Firm'))
                    }
                );
                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 (window.gtag && (propertyID == 1 || propertyID == 14)) {
                    var lowerCaseditemsObject = [];

                    _.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.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.category = pieceContainerOfEntry.MediaTypeName ? pieceContainerOfEntry.MediaTypeName : ('Entries Category Order Item #' + k);
                            item.name = pieceContainerOfEntry.MediaTypeName && submissionEntry.PropertyCategoryName && pieceContainerOfEntry.Title ? (pieceContainerOfEntry.MediaTypeName + ' - ' + submissionEntry.PropertyCategoryName + ' - ' + pieceContainerOfEntry.Title) : pieceContainerOfEntry.MediaTypeName && submissionEntry.CategoryName && pieceContainerOfEntry.Title ? (pieceContainerOfEntry.MediaTypeName + ' - ' + submissionEntry.CategoryName + ' - ' + pieceContainerOfEntry.Title) : ('Entries Category Order Item #' + k);
                        }

                        lowerCaseditemsObject.push(item);
                    });

                    if (propertyID == 1) {
                        gtag('event', 'purchase',
                            {
                                'send_to': 'UA-11774933-4',
                                'affiliation': 'Webby' + ($scope.isLive ? ' Test' : ''),
                                'value': ($scope.order && $scope.order.Total ? $scope.order.Total : ''),
                                'currency': 'USD',
                                'transaction_id': ($scope.order && $scope.order.OrderID ? $scope.order.OrderID : ''),
                                'items': lowerCaseditemsObject
                            });
                    }

                    if (propertyID == 14) {
                        gtag('event', 'purchase',
                            {
                                'send_to': 'G-D9F6D3GBQB',
                                'affiliation': 'Anthem' + ($scope.isLive ? ' Test' : ''),
                                'value': ($scope.order && $scope.order.Total ? $scope.order.Total : ''),
                                'currency': 'USD',
                                'transaction_id': ($scope.order && $scope.order.OrderID ? $scope.order.OrderID : ''),
                                'items': lowerCaseditemsObject
                            });
                    }
                    
                }
                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('checkout_success', { confirmation: $scope.order.Confirmation, currency: 'USD', value: $scope.submissionTotal });
                $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();
                    //}
                    GetStripeIntent();
                }
            }
        }

        function IsStripeProperty() {
            return sharedProperties.GetStripeProperties().indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1;
        }

        $scope.IsStripeProperty = function () {
            return IsStripeProperty();
        };

        function GetStripeIntent() {
            if (IsStripeProperty() && $scope.cart.PaymentTypeID == 1 && $scope.submissionTotal > 0) {
                orderFactory.generateStripeData($scope.cart, $localStorage.userStripeIntent)
                    .success(function (data) {
                        if (data == null || !data.Success || !data.Data || !data.Data.ClientKey) {
                            SweetAlert.swal({
                                title: data.Errors || "Unable to continue. Please go back and try again.",
                                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) {
                                });
                            $state.go('enter.client');
                        }
                        else {
                            $localStorage.userStripeIntent = data.Data;

                            //var appearance = {
                            //    theme: 'stripe',
                            //};

                            //var paymentElementOptions = {
                            //    layout: "tabs",
                            //};
                            try {
                                var clientKey = $localStorage.userStripeIntent.ClientKey;
                                var elements = stripeClass.elements({ clientSecret: clientKey });
                                paymentElement = elements.create("card");
                                paymentElement.mount("#payment-element");
                            }
                            catch (error) {
                                console.log(error);
                            }
                        }
                    })
                    .error(function (error) {
                        //TODO: SHOW ERROR MESSAGE;
                    });
            }
        }

        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;
            }
            GetSubData();
            if ($scope.propertyId === 6) {
                GetContact();
            }
            GetCMSContent();
        });

        function GetCMSContent() {
            if (!sharedProperties)
                return;

            cmsFactory.getCMSAppTypeContents({ AppName: "Entries", PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID })
                .then(function (response) {
                    if (response && response.data)
                        $scope.entriesCMSContent = response.data;
                }, function (response) {
                    // TODO: Error
                });
        }

        $scope.getCMSContentByRegion = function (regionName, isDirective) {
            if ($scope.entriesCMSContent && $scope.entriesCMSContent.length > 0) {
                var cmsContent = $scope.entriesCMSContent.filter(function (contentItem) {
                    return contentItem.ContentRegionName.toLowerCase().trim() == regionName.toLowerCase().trim();
                });
                if (cmsContent && cmsContent.length > 0)
                    return (isDirective ? cmsContent[0].Content : $sce.trustAsHtml(cmsContent[0].Content));
            }
            return;
        };

        function GetContact() {
            if (sharedProperties.HasToken()) {
                userFactory.getContact()
                    .success(function (data) {
                        if (data) {
                            // if the user has referral info then hide the options
                            if (data.ReferralInfo) {
                                $scope.referralOptions = null;
                            }
                        }
                    });
            }
        }

        function GetSubData() {
            if (sharedProperties.HasToken()) {
                userFactory.getSubStatus($scope.propertyId).success(function (subData) {
                    $scope.currentUserSubData = subData;
                    if (subData)
                    {
                        setupReviewTotals();
                    }
                });
            }
        }

        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);
                    $scope.isLive = details.IsLive;
                    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 || propertyID == 8 || propertyID == 17 || propertyID == 19 ? "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 = "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 getSubscriptions(propid) {
            seasonFactory.getSubscriptionsByProperty(propid)
                .success(function (subscriptions) {
                    $scope.entrySubscriptions = [];
                    if (subscriptions && subscriptions.length > 0) {
                        $scope.entrySubscriptions = subscriptions;
                    }
                })
                .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 && $scope.propertyDetails.PropertyID !== 14 && $scope.propertyDetails.PropertyID !== 15 && $scope.propertyDetails.PropertyID !== 17) {
                return;
            }
            entriesFactory.getPieceLengths($scope.propertyDetails.PropertyID)
                .success(function (resp) {
                    $scope.pieceLengths = resp.Data;
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        $scope.pieceCategoryOptionsChange = function () {
            if ($scope.piece.PropertyCategoryDataOptionID && $scope.pieceCategoryOptions && $scope.pieceCategoryOptions.length > 0) {
                $scope.selectedpieceCategoryOption = _.find($scope.pieceCategoryOptions, function (pco) {
                    return pco.id == $scope.piece.PropertyCategoryDataOptionID;
                });
                if ($scope.selectedpieceCategoryOption && !$scope.selectedpieceCategoryOption.isOther) {
                    $scope.piece.PropertyCategoryDataOptionOther = null;
                }
            }
            else {
                $scope.piece.PropertyCategoryDataOptionOther = $scope.selectedpieceCategoryOption = null;
            }
        };

        function getPieceCategoryOptions(catId) {
            if ($scope.propertyDetails.PropertyID !== 14) {
                return;
            }
            entriesFactory.getPieceCategoryOptions(catId)
                .success(function (resp) {
                    $scope.pieceCategoryOptions = resp.Data;
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        function getPieceCompanySize() {
            if ($scope.propertyDetails.PropertyID !== 7 && $scope.propertyDetails.PropertyID !== 19) {
                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;
            }
        };

        $scope.timeCompanySizeFilter = function (item) {
            if (item && (item.MediaTypeName == $scope.mediaTypeSelected.Name)) {
                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);

        }
        
        $scope.addCategoryTypeForCustomURL = function (category, event) {
            if ([19].indexOf($scope.propertyId) > -1 && !sharedProperties.HasToken()) {
                $scope.promptRegisterActual();
            }
            if (!category.EnableCustomURLs) return;

            var selectedtypes = initCategoryTypeForCustomUrl(category);

            if (event.currentTarget.checked) {
                selectedtypes.categories[category.PropertyCategoryID] = true;
            } else {
                delete selectedtypes.categories[category.PropertyCategoryID];
            }

            if (Object.getOwnPropertyNames(selectedtypes.categories).length == 0 ) {
                delete $scope.piece.CategoriesForCustomUrls[category.ParentCategoryID];
            }
        }

        function initCategoryTypeForCustomUrl(category) {
            if (!(category.ParentCategoryID in $scope.piece.CategoriesForCustomUrls)) {
                $scope.piece.CategoriesForCustomUrls[category.ParentCategoryID] = {
                    customURLTitle: category.CustomURLTitle,
                    customURLDescription: category.CustomURLDescription,
                    urlList: [],
                    maxURLAllowedCount: 3,
                    tempUrl: null,
                    campUrl: false,
                    categories: {}
                };
            }

            return $scope.piece.CategoriesForCustomUrls[category.ParentCategoryID];
        }

        $scope.checkCustomUrlPrefix = function (customURLData, event) {
            customURLData.tempUrl = updateUrlPrefix(event, customURLData.tempUrl);
        }

        $scope.removeCustomUrl = function (customURLData, index) {
            customURLData.urlList.splice(index, 1);
            resetCustomUrls();
        }

        $scope.addCustomUrl = function (customURLData, errorList) {
            if (errorList && Object.keys(errorList).length > 0) {
                customURLData.campUrl = true;
                return;
            }

            if (!customURLData.tempUrl || !customURLData.tempUrl.trim())
                return;

            if (!customURLData.urlList) {
                customURLData.urlList = [];
            }

            customURLData.urlList.push(customURLData.tempUrl);

            customURLData.tempUrl = null;
            customURLData.campUrl = false;

            resetCustomUrls();
        }

        function resetCategoriesForCustomUrls() {
            $scope.piece.CategoriesForCustomUrls = {};
            for (var i = 0; i < $scope.mediaTypeSelected.CategoryTypes.length; i++) {
                var categoryType = $scope.mediaTypeSelected.CategoryTypes[i];
                if (!categoryType.EnableCustomURLs) {
                    continue;
                }
                for (var catIdx = 0; catIdx < categoryType.Categories.length; catIdx++) {
                    var category = categoryType.Categories[catIdx];
                    for (var eIdx = 0; eIdx < $scope.piece.Entries.length; eIdx++) {
                        var entry = $scope.piece.Entries[eIdx];
                        if (category.PropertyCategoryID != entry.PropertyCategoryID) {
                            continue;
                        }

                        var selectedtypes = initCategoryTypeForCustomUrl(category);
                        selectedtypes.categories[category.PropertyCategoryID] = true;
                    }
                }
            }
            
            for (var i = 0; i < $scope.piece.CustomUrls.length; i++) {
                var customUrl = $scope.piece.CustomUrls[i];
                var selectedTypes = $scope.piece.CategoriesForCustomUrls[customUrl.CustomURLCategoryID];
                selectedTypes.urlList.push(customUrl.Url);
            }
        }

        function resetCustomUrls() {
            $scope.piece.CustomUrls = [];

            for (var categoryId in $scope.piece.CategoriesForCustomUrls) {
                var urls = $scope.piece.CategoriesForCustomUrls[categoryId].urlList;

                for (var i = 0; i < urls.length; i++) {
                    $scope.piece.CustomUrls.push({
                        Url: urls[i],
                        DisplayOrder: i + 1,
                        CustomURLCategoryID: categoryId
                    });
                }
            }
        }

        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") {
                    // check prop
                    if (propertyID == 19) {
                        var urlListString1 = (piece1.Urls && piece1.Urls.length > 0 ? piece1.Urls : "");
                        var urlListString2 = (piece2.Urls && piece2.Urls.length > 0 ? piece2.Urls : "");
                        return (piece1.Title && (piece1.Title === piece2.Title && urlListString1 === urlListString2));
                    }
                    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" || piece1.EntryType == "FormOnly") {
                    return (piece1.MailItem && piece1.MailItem === piece2.MailItem);
                }
                else if (piece1.EntryType == "UrlUpload" && $scope.propertyDetails.PropertyID != 15) {
                    return (piece1.OriginalFileName && piece1.OriginalFileName === piece2.OriginalFileName) && (piece1.Urls && piece1.Urls === piece2.Urls);
                }
                else if (piece1.EntryType == "UrlUpload" && $scope.propertyDetails.PropertyID == 15) {
                    return (piece1.Urls && piece1.Urls === piece2.Urls && piece1.OriginalFileName === piece2.OriginalFileName);
                }
            }

            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.propertyDetails.PropertyID === 19) {
                $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 = [];
            var tempDict = {};

            _($scope.mediaTypeSelected.CategoryTypes).forEach(function (obj) {
                _(obj.Categories).forEach(function (cat) {
                    if (cat.HasCustomField && !cat.OverrideDefaultCustomField) {
                        tempCats.push(cat.PropertyCategoryID);
                        tempDict[cat.PropertyCategoryID] = cat.OriginalCategoryName;
                    }
                    else if (cat.HasCustomField && cat.OverrideDefaultCustomField) {
                        tempCats2.push(cat.PropertyCategoryID);
                        tempDict[cat.PropertyCategoryID] = cat.OriginalCategoryName;
                    }
                });
            });
            $scope.categoriesWithCustomFieldsList = tempCats;
            $scope.categoriesWithAddtnlCustomFieldsList = tempCats2;
            $scope.dictCategoriesWithCustomFieldsList = tempDict;
        }

        if ($scope.propertyDetails.PropertyID === 6) {
            var toolTipText = "<div class='text-left'><strong>Campaign</strong><br />A campaign includes no less than 3 and no more than 5 elements. Integrated Marketing Campaigns MUST include at least one digital element. <br/><br /> <strong>Single</strong><br /> Only individual elements can be entered in the single entry categories.</div>";
        }
        else if ($scope.propertyDetails.PropertyID === 9) {
            var toolTipText = "<div class='text-left'><strong>Campain or Series</strong><br />A series includes no less than 3 and no more than 5 elements. Integrated and Multi-Channel Campaigns MUST include at least one digital element.<br/><br />" + "<strong>Single</strong><br /> Only individual elements can be entered in the single entry categories.</div>";
        }
        else {
            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 digital element. <br/><br />" + ($scope.propertyDetails.PropertyID !== 3 ? "<strong>" + ($scope.propertyDetails.PropertyID == 1 ? "Branded Content, " : "") + "Media and PR</strong><br /> " + ($scope.propertyDetails.PropertyID == 1 ? "Branded Content, " : "") + "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.</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);

        var brandTooltip = "<div class='text-left'>i.e Brand, Advertising Agency, Production Company etc.. <br />This information will be used for Brand Company of the year.</div>";
        $scope.brandTooltip = $sce.trustAsHtml(brandTooltip);

        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);
                }
            }

            $analytics.eventTrack('entry_started',
                {
                    entry_type: mediaType.Name
                }
            );

            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;
                $scope.piece.IsPodcast = mediaType.IsPodcast;
                setCategoriesWithDeviceList();
                setCategoriesWithCustomFieldsList();
                setCategoriesWithDurationList();
            }
            $scope.selectedEntries = [];
            $scope.selectedEntriesMeta = [];
            $scope.selectedEntriesCustom = {};

            checkIfCampaignSetupNeeded();

            if (mediaTypeModal) {
                mediaTypeModal.dismiss();
                $scope.promptRegister();
                scrollToPageTop();
            }
            if ($scope.entrySubscriptions && $scope.entrySubscriptions.length > 0 && (!$scope.currentUserSubData || HasNotRenewedForCurrentSeason()) && ($localStorage.seasonSubSelection != sharedProperties.getProperty("seasonDetails").SeasonID)) {
                $state.go('enter.subscription');
            }
            else {
                $state.go('enter.submit');
            }
        };

        function HasNotRenewedForCurrentSeason() {
            return ($scope.currentUserSubData && $scope.currentUserSubData.Status == 'active' && !$scope.currentUserSubData.HasRenewedForCurrentSeason);
        }

        $scope.HasNotRenewedForCurrentSeason = function () {
            return HasNotRenewedForCurrentSeason();
        };

        $scope.GetRemainingEntryCount = function () {
            return GetRemainingEntryCount();
        };

        function GetRemainingEntryCount() {
            if (!$scope.currentUserSubData)
                return 0;
            return Math.max(($scope.currentUserSubData.EntryCreditAmount - $scope.currentUserSubData.UsedEntryCreditAmount - GetFreeEntryCount()), 0);
        }

        function GetFreeEntryCount() {
            var freeEntryCount = 0;
            for (var y = 0; y < $scope.submission.Pieces.length; y++) {
                for (var u = 0; u < $scope.submission.Pieces[y].Entries.length; u++){
                    if ($scope.submission.Pieces[y].Entries[u].IsFree) {
                        freeEntryCount = freeEntryCount + 1;
                    }
                }
            }
            return freeEntryCount;
        }

        function setSeasonSubSelection() {
            $localStorage.seasonSubSelection = sharedProperties.getProperty("seasonDetails").SeasonID;
        };

        $scope.goToStep = function (nextStep) {
            $state.go(nextStep);
        };

        $scope.clearSubSelection = function () {
            clearSubSelection();
            setSeasonSubSelection();
        };

        $scope.removeSubSelection = function () {
            clearSubSelection();
            setupReviewTotals();
        };

        function clearSubSelection() {
            $scope.propertySelectedSubscription = null;
        }
        $scope.selectSubscription = function (sub) {
            $scope.propertySelectedSubscription = sub;
            setSeasonSubSelection();
        };

        $scope.addSubscription = function (sub) {
            $scope.propertySelectedSubscription = sub;
            setupReviewTotals();
        };

        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.EntryType !== "UrlUpload") {
                $scope.piece.Urls = null;
                $scope.piece.UrlList = [];
            }
            else {
                //adjust for no-campaign having more then 1 url
                if (!$scope.piece.IsCampaign && $scope.propertyId != 6 && $scope.propertyId != 1 && $scope.propertyId != 14 && $scope.propertyId != 15 && $scope.propertyId != 19 && $scope.propertyId != 9 && !$scope.piece.IsPodcast) {
                    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.EntryType !== "UrlUpload") {
                $scope.piece.OriginalFileName = null;
                $scope.piece.UploadFile = null;
                if ($scope.propertyDetails.PropertyID !== 19) {
                    $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 && !$scope.addtlCredit.Brand)) {
                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,
                Brand: $scope.addtlCredit.Brand,
                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.addtlCredit.Brand = 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);
        };

        $scope.makeUrlMain = function (index) {
            if ($scope.piece.UrlList[index]) {
                var currentMain = angular.copy($scope.piece.Urls);
                $scope.piece.Urls = angular.copy($scope.piece.UrlList[index]);
                $scope.piece.UrlList[index] = currentMain;
            }
        };

        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,
                                CatTypeFullName: $scope.mediaTypes[x].CategoryTypes[y].Name
                            };
                        }
                    }
                }
            }
            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;
                     }
                }
            }
        };

        $scope.friendlyCategoryNameArray = [];
        var friendlyCategoryNameResolver = function () {
            
            if (!$scope.submission || !$scope.submission.Pieces) { return; }
            for (var x = 0; x < $scope.selectedEntries.length; x++) {
                var entryCategory = getCategoryForCategoryID($scope.selectedEntries[x]);
                if (entryCategory) {
                    $scope.friendlyCategoryNameArray.push(`${entryCategory.CatTypeFullName}: ${entryCategory.Name}`);
                }
            }
        };

        var setupReviewTotals = function () {
            if (!$scope.submission || !$scope.submission.Pieces || $scope.submission.Pieces.length <= 0) { return; }
            var totalPrice = 0;
            if (($scope.propertySelectedSubscription && $scope.propertySelectedSubscription.HasEntryCredit) || ($scope.currentUserSubData && $scope.currentUserSubData.HasEntryCredit)) {
                var entryMaxCredit = ($scope.propertySelectedSubscription ? angular.copy($scope.propertySelectedSubscription.EntryCreditAmount) : ($scope.currentUserSubData.EntryCreditAmount - $scope.currentUserSubData.UsedEntryCreditAmount));
                var entryCredit = ($scope.propertySelectedSubscription ? angular.copy($scope.propertySelectedSubscription.EntryCreditAmount) : ($scope.currentUserSubData.EntryCreditAmount - $scope.currentUserSubData.UsedEntryCreditAmount));
                for (var pi2 = 0; pi2 < $scope.submission.Pieces.length; pi2++) {
                    var pieceTotal2 = 0;
                    for (var ei2 = 0; ei2 < $scope.submission.Pieces[pi2].Entries.length; ei2++) {
                        if (entryCredit <= entryMaxCredit && entryCredit > 0) {
                            entryCredit = entryCredit - 1;
                            $scope.submission.Pieces[pi2].Entries[ei2].IsFree = true;
                        }
                        else {
                            $scope.submission.Pieces[pi2].Entries[ei2].IsFree = false;
                        }
                        pieceTotal2 += ($scope.submission.Pieces[pi2].Entries[ei2].IsFree ? 0 : $scope.submission.Pieces[pi2].Entries[ei2].Price);
                    }
                    $scope.submission.Pieces[pi2].SubTotal = pieceTotal2;
                    totalPrice += pieceTotal2;
                }
            }
            else {
                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++) {
                        $scope.submission.Pieces[pi].Entries[ei].IsFree = false;
                        pieceTotal += $scope.submission.Pieces[pi].Entries[ei].Price;
                    }
                    $scope.submission.Pieces[pi].SubTotal = pieceTotal;
                    totalPrice += pieceTotal;
                }
            }
            $scope.submissionTotalPrice = totalPrice;
            $scope.submissionTotal = totalPrice + $scope.vatAmount + ($scope.propertySelectedSubscription ? $scope.propertySelectedSubscription.Cost : 0);
        };

        $scope.displayPriceDifference = function () {
            if (!$scope.propertySelectedSubscription && $scope.entrySubscriptions && $scope.entrySubscriptions.length > 0) {
                setupReviewTotals();
                var costDiff = $scope.entrySubscriptions[0].Cost - $scope.submissionTotalPrice;
                if (costDiff && costDiff > 0) {
                    $scope.costDiff = costDiff;
                    return "Only +$" + costDiff;
                }
            }
            return "Free";
        };

        // 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);
            $scope.reviewEntrySub = angular.copy(submission.PropertySubscription);
        };

        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 && $scope.propertyId != 14 && $scope.propertyId != 15) {
                        //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;
            resetCategoriesForCustomUrls();
            //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 = "";
            }
        }

        function applyReferralInfo() {
            if ($scope.referralOptions) {
                let ReferralInfo = '';
                for (let i = 0; i < $scope.referralOptions.length; i++) {
                    const option = $scope.referralOptions[i];
                    if (option.value) {
                        if (ReferralInfo.length > 0)
                            ReferralInfo = ReferralInfo + ';';
                        ReferralInfo = ReferralInfo + option.label;
                        // add other option detail
                        if (i === 10)
                            ReferralInfo = ReferralInfo + ': ' + option.detail;
                    }
                }
                $scope.submission.Contact.ReferralInfo = ReferralInfo;
            }
        }

        //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;
                    $scope.cart.PropertySubscription = $scope.submission.PropertySubscription;
                    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 = ''; }

            if ($scope.propertySelectedSubscription) {
                $scope.submission.PropertySubscription = $scope.propertySelectedSubscription;
            }
            else {
                $scope.submission.PropertySubscription = null;
            }

            // add referralInfo if it exists
            applyReferralInfo();

            // Capture which subscriptions were checked off by user and send event to analytics
            var selectedSubsciptions = [];
            // $scope.selectedSubscriptions is unreliable because selectedSubscriptions are stored to localStorage. refresh will not hydrate the array.
            $scope.propertyDetails.Subscriptions.forEach(sub => {
                if ($scope.propertyId != 1) {
                    if ($scope.subscriptionChecked(sub.SubscriptionIdentifier)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
                else {
                    if ($scope.webbySubscriptionChecked(sub.PropertySubscriptionID)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
            });

            if ($scope.submission && $scope.submission.Contact && selectedSubsciptions && selectedSubsciptions.length > 0)
                $scope.submission.Contact.SubscriptionIDs = selectedSubsciptions;

            // clean up duplicate pieces
            if ($scope.propertyId === 19 && $scope.submission.Pieces && $scope.submission.Pieces.length > 0) {
                let newPieces = [];
                for (i = 0; i < $scope.submission.Pieces.length; i++) {
                    var piece = $scope.submission.Pieces[i];
                    var existing = _.find(newPieces, (p) => {
                        return p.Title === piece.Title && piece.Urls === p.Urls;
                    });
                    if (!existing) {
                        newPieces.push(piece);
                    }
                }
                $scope.submission.Pieces = newPieces;
            }

            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].IsFree ? 0 : $scope.submission.Pieces[pi].Entries[index].Price);
                                item.Quantity = 1;
                                item.Price = ($scope.submission.Pieces[pi].Entries[index].IsFree ? 0 : $scope.submission.Pieces[pi].Entries[index].Price);
                                total += item.Price;
                                $scope.cart.cartItems.push(item);
                            }
                        }
                        $scope.cart.Total = $scope.cart.Subtotal = (total + ($scope.submission.PropertySubscription ? $scope.submission.PropertySubscription.Cost : 0));
                        $scope.cart.SubmissionID = $scope.submission.SubmissionID;
                        $scope.cart.PropertySubscription = $scope.submission.PropertySubscription;
                        if ($scope.cart.BillingCountry != "") {
                            getStates($scope.cart.BillingCountry, "statesForBillingInfo");
                        }
                    }
                    if (!preventStateChange) {
                        $state.go(nextStep).then(function () {

                        });
                    }

                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        //World Pay related functions
        function isWorldPayProperty() {
            return sharedProperties.getProperty("propertyDetails").PropertyID == 3;
        }

        $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.toggleWebbySubscriptionSelection = function (id, event) {
            var index = $.inArray(id, $scope.selectedSubscriptions);
            if (index > -1) {
                $scope.selectedSubscriptions.splice(index, 1);
            } else {
                $scope.selectedSubscriptions.push(id);
            }
            sharedProperties.WebbySubscriptionSet(id, event.target.checked);
        };

        $scope.subscriptionChecked = function (id) {
            return sharedProperties.SubscriptionChecked(id);
        };

        $scope.webbySubscriptionChecked = function (id) {
            return sharedProperties.WebbySubscriptionChecked(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) {
            $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 (IsStripeProperty() && $scope.cart.PaymentTypeID == 1 && $scope.submissionTotal > 0) {
                    invokeSpinner = true;
                    stripeClass.confirmCardPayment($localStorage.userStripeIntent.ClientKey, {
                        payment_method: {
                            card: paymentElement
                        }
                    }).then(function (result) {
                        invokeSpinner = false;
                        if (result.error && (!result.paymentIntent || result.paymentIntent.status != "succeeded")) {
                            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) {
                                });
                            $scope.preventOrderSubmit = false;
                            return;
                        } else {
                            orderFactory.submitStripeCart($scope.cart, { IntentID: result.paymentIntent.id })
                                .success(function (data) {
                                    if (data == 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) {
                                            });
                                        $scope.preventOrderSubmit = false;
                                        return;
                                    }
                                    else if (!data.Success) {
                                        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) {

                                            });
                                        $scope.preventOrderSubmit = false;
                                        return;
                                    }
                                    $localStorage.userStripeIntent = null;
                                    CompleteCheckout(data);

                                })
                                .error(function (error) {
                                    //TODO: SHOW ERROR MESSAGE;
                                    $scope.preventOrderSubmit = false;
                                });
                        }
                    });
                }
                else {
                    orderFactory.submitCart($scope.cart, $scope.transaction)
                        .success(function (data) {
                            if (data == 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) {
                                    });
                                $scope.preventOrderSubmit = false;
                                return;
                            }
                            else if (!data.Success) {
                                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) {

                                    });
                                $scope.preventOrderSubmit = false;
                                return;
                            }
                            CompleteCheckout(data);

                        })
                        .error(function (error) {
                            //TODO: SHOW ERROR MESSAGE;
                            $scope.preventOrderSubmit = false;
                        });
                }
            } else {
                $scope.preventOrderSubmit = false;
                setTimeout(function () {
                    $('html, body').animate({
                        scrollTop: $(".has-error:visible:first").offset().top - 50
                    }, 1000);
                }, 150);
                $('.collapse').collapse('show'); // Open all collapsible panels to show validation errors.
            }
        };

        function CompleteCheckout(data) {
            $scope.order = data.Data;
            $scope.entryComplete = true;
            $state.go(propertyID == 1 || propertyID == 17 || propertyID == 19 ? 'enter.success' : '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;
                        }

                        //GA4 Ecom items update
                        item.item_name = item.name;
                        item.item_id = item.id;
                        item.item_category = item.category;

                        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,
                        'currency': $scope.propertyDetails.CurrencyAbbrev.toUpperCase()
                    });

                    // 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;
                }
            }
        }

        $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);
                $('.collapse').collapse('show'); // Open all collapsible panels to show validation errors.
                return;
            }

            if (window.ttq) {
                var ttObj = {};
                if ($scope.submission.Contact.Email) {
                    ttObj.email = $scope.submission.Contact.Email.toLowerCase().trim();
                }
                ttq.identify(ttObj);
            }

            if (!sharedProperties.HasToken() && !sharedProperties.HasGuestToken()) {
                if ($scope.loginMode === 5) {
                    saveNewUserMode5(isValid, paymentTypeID, paymentTitle);
                    $analytics.eventTrack('lead_created', { source: 'entry_registration', email: `${$scope.submission.Contact.Email}`  });
                }
                else if ([1, 3].indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1) {
                    saveNewUser(isValid, paymentTypeID, paymentTitle);
                    $analytics.eventTrack('lead_created', { source: 'entry_registration', email: `${$scope.submission.Contact.Email}` });
                }
                else if ([19].indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1) {
                    saveNewUserTime(isValid, paymentTypeID, paymentTitle);
                    $analytics.eventTrack('lead_created', { source: 'entry_registration', email: `${$scope.submission.Contact.Email}` });
                }
            } else {
                proceedToCheckout(isValid, paymentTypeID, paymentTitle);
                $analytics.eventTrack('lead_created', { source: 'entry_registration', email: `${$scope.submission.Contact.Email}` });
            }
        }

        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; }

            // Capture which subscriptions were checked off by user and send event to analytics
            var selectedSubsciptions = [];
            // $scope.selectedSubscriptions is unreliable because selectedSubscriptions are stored to localStorage. refresh will not hydrate the array.
            $scope.propertyDetails.Subscriptions.forEach(sub => {
                if ($scope.propertyId != 1) {
                    if ($scope.subscriptionChecked(sub.SubscriptionIdentifier)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
                else {
                    if ($scope.webbySubscriptionChecked(sub.PropertySubscriptionID)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
                
            });

            if (!sharedProperties.HasToken() && sharedProperties.getProperty('propertyDetails').CaptchaSiteKey) {
                grecaptcha.ready(function () {
                    grecaptcha.execute(sharedProperties.getProperty('propertyDetails').CaptchaSiteKey, { action: 'submit' }).then(function (token) {

                        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,
                            SubscriptionIDs: selectedSubsciptions,
                            CaptchaResponse: token
                        };

                        userFactory.insertUser(params)// register user from contact info
                            .success(function () {
                                //login the user
                                userFactory.login(params.Email, params.Password, params.PropertyID)
                                    .success(function (data) {
                                        $analytics.setAlias(data.Email);
                                        $analytics.setUsername(data.Email);
                                        $analytics.setUserProperties(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");
                            });
                    });
                });
            }
            else {
                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,
                    SubscriptionIDs: selectedSubsciptions,
                };

                userFactory.insertUser(params)// register user from contact info
                    .success(function () {
                        //login the user
                        userFactory.login(params.Email, params.Password, params.PropertyID)
                            .success(function (data) {
                                $analytics.setAlias(data.Email);
                                $analytics.setUsername(data.Email);
                                $analytics.setUserProperties(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 saveNewUserTime = function (isValid, paymentTypeID, paymentTitle) {
            $scope.errorMessage = [];

            if (!([19].indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1)) { return; }

            // Capture which subscriptions were checked off by user and send event to analytics
            var selectedSubsciptions = [];
            // $scope.selectedSubscriptions is unreliable because selectedSubscriptions are stored to localStorage. refresh will not hydrate the array.
            $scope.propertyDetails.Subscriptions.forEach(sub => {
                if ($scope.propertyId != 1) {
                    if ($scope.subscriptionChecked(sub.SubscriptionIdentifier)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
                else {
                    if ($scope.webbySubscriptionChecked(sub.PropertySubscriptionID)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }

            });

            if (!sharedProperties.HasToken() && sharedProperties.getProperty('propertyDetails').CaptchaSiteKey) {
                grecaptcha.ready(function () {
                    grecaptcha.execute(sharedProperties.getProperty('propertyDetails').CaptchaSiteKey, { action: 'submit' }).then(function (token) {

                        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,
                            SubscriptionIDs: selectedSubsciptions,
                            CaptchaResponse: token
                        };

                        userFactory.insertUser(params)// register user from contact info
                            .success(function () {
                                //login the user
                                userFactory.login(params.Email, params.Password, params.PropertyID)
                                    .success(function (data) {
                                        $analytics.setAlias(data.Email);
                                        $analytics.setUsername(data.Email);
                                        $analytics.setUserProperties(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");
                            });
                    });
                });
            }
            else {
                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,
                    SubscriptionIDs: selectedSubsciptions
                };

                userFactory.insertUser(params)// register user from contact info
                    .success(function () {
                        //login the user
                        userFactory.login(params.Email, params.Password, params.PropertyID)
                            .success(function (data) {
                                $analytics.setAlias(data.Email);
                                $analytics.setUsername(data.Email);
                                $analytics.setUserProperties(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 && sharedProperties.getProperty("propertyDetails").PropertyID != 19)
                return;
            // Capture which subscriptions were checked off by user and send event to analytics
            var selectedSubsciptions = [];
            // $scope.selectedSubscriptions is unreliable because selectedSubscriptions are stored to localStorage. refresh will not hydrate the array.
            $scope.propertyDetails.Subscriptions.forEach(sub => {
                if ($scope.propertyId != 1) {
                    if ($scope.subscriptionChecked(sub.SubscriptionIdentifier)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
                else {
                    if ($scope.webbySubscriptionChecked(sub.PropertySubscriptionID)) {
                        selectedSubsciptions.push(sub.PropertySubscriptionID);
                    }
                }
            });

            if (!sharedProperties.HasToken() && sharedProperties.getProperty('propertyDetails').CaptchaSiteKey) {
                grecaptcha.ready(function () {
                    grecaptcha.execute(sharedProperties.getProperty('propertyDetails').CaptchaSiteKey, { action: 'submit' }).then(function (token) {
                        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,
                            SubscriptionIDs: selectedSubsciptions,
                            CaptchaResponse: token
                        };

                        userFactory.insertUser(params)// register user from contact info
                            .success(function () {
                                //login the user
                                userFactory.login(params.Email, params.Password, params.PropertyID)
                                    .success(function (data) {
                                        $analytics.setAlias(data.Email);
                                        $analytics.setUsername(data.Email);
                                        $analytics.setUserProperties(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) {
                                            $analytics.setAlias(data.Email);
                                            $analytics.setUsername(data.Email);
                                            $analytics.setUserProperties(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[""];
                                }
                            });
                    });
                });
            }
            else {
                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,
                    SubscriptionIDs: selectedSubsciptions,
                };

                userFactory.insertUser(params)// register user from contact info
                    .success(function () {
                        //login the user
                        userFactory.login(params.Email, params.Password, params.PropertyID)
                            .success(function (data) {
                                $analytics.setAlias(data.Email);
                                $analytics.setUsername(data.Email);
                                $analytics.setUserProperties(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) {
                                    $analytics.setAlias(data.Email);
                                    $analytics.setUsername(data.Email);
                                    $analytics.setUserProperties(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,
            timeshowedRegister: false,
            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,
            timeshowedRegister: false,
            paymentTitle: "",
            SeasonID: null,
            countries: [],
            categoriesWithDeviceList: [],
            categoriesWithCustomFieldsList: [],
            categoriesWithDurationList: [],
            categoriesWithAddtnlCustomFieldsList: [],
            dictCategoriesWithCustomFieldsList: [],
            customFieldSelected: { Status: false },
            deviceCategorySelected: { Status: false },
            durationCategorySelected: { Status: false },
            siteUtmInfo: $localStorage.siteUtmInfo,
            seasonSubSelection: $localStorage.seasonSubSelection
        };

        // 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.timeshowedRegister = $localStorage.timeshowedRegister || false;
        $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.dictCategoriesWithCustomFieldsList = $localStorage.dictCategoriesWithCustomFieldsList || [];
        $scope.customFieldSelected = $localStorage.customFieldSelected || { Status: false };
        $scope.propertySelectedSubscription = $localStorage.propertySelectedSubscription || null;
        $scope.currentUserSubData = $localStorage.currentUserSubData || null;

        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('dictCategoriesWithCustomFieldsList', function () {
            $localStorage.dictCategoriesWithCustomFieldsList = $scope.dictCategoriesWithCustomFieldsList;
        });

        $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);
            if ($scope.mediaTypeSelected && $scope.mediaTypeSelected.PropertyCategoryDataID)
                getPieceCategoryOptions($scope.mediaTypeSelected.PropertyCategoryDataID);
            if ($scope.mediaTypeSelected && $scope.mediaTypeSelected.CategoryTypes && $scope.mediaTypeSelected.CategoryTypes.length > 0)
                $scope.mediaTypeSelected.CategoryTypes.forEach(ct => $scope.HasNewForYear = ct.Categories.some(cat => cat.IsNewForYear === true));       
        });

        $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('currentUserSubData', function () {
            $localStorage.currentUserSubData = $scope.currentUserSubData;
        });
        $scope.$watch('showStateSelector', function () {
            $localStorage.showStateSelector = $scope.showStateSelector;
        });

        $scope.$watch('currentTimesEntered', function () {
            $localStorage.currentTimesEntered = $scope.currentTimesEntered;
        });

        $scope.$watch('timeshowedRegister', function () {
            $localStorage.timeshowedRegister = $scope.timeshowedRegister;
        });

        $scope.$watch('paymentTitle', function () {
            $localStorage.paymentTitle = $scope.paymentTitle;
        });

        $scope.$watch('SeasonID', function () {
            $localStorage.SeasonID = $scope.SeasonID;
        });

        $scope.$watch('mediaTypes', function () {
            $localStorage.mediaTypes = $scope.mediaTypes;
        });

        $scope.$watch('propertySelectedSubscription', function () {
            $localStorage.propertySelectedSubscription = $scope.propertySelectedSubscription;
        });

        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 = "";
                        }
                    }
                });
            });
        }

        var mtWatcherRunning = false;
        $scope.$watch(function () {
            return angular.toJson($localStorage);
        }, function () {
            if ($state.current.name !== "enter.checkoutfinalize" && $state.current.name !== "enter.success") {
                $scope.submission = $scope.submission || $localStorage.submission || new defaultSubmission();
            }
            $scope.piece = $localStorage.piece || new pieceTemplate();
            $scope.mediaTypeSelected = $scope.mediaTypeSelected || $localStorage.mediaTypeSelected || null;
            if ($scope.piece && $scope.mediaTypeSelected && !!!$scope.piece.MediaTypePropertyCategoryID) {
                $scope.piece.MediaTypePropertyCategoryID = $scope.mediaTypeSelected.PropertyCategoryDataID;
                $scope.piece.MediaTypeName = $scope.mediaTypeSelected.Name;
                $scope.piece.MediaTypeCssClass = $scope.mediaTypeSelected.CSSClass;
            }
            $scope.selectedEntries = $localStorage.selectedEntries || [];
            $scope.selectedEntriesCustom = $localStorage.selectedEntriesCustom || {};
            $scope.cart = $localStorage.cart || new cartTemplate();
            $scope.entryComplete = $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.timeshowedRegister = $localStorage.timeshowedRegister || 0;
            $scope.paymentTitle = $localStorage.paymentTitle || "";
            $scope.SeasonID = $localStorage.SeasonID || null;
            $scope.mediaTypes = $localStorage.mediaTypes;
            if (!$scope.mediaTypes && !mtWatcherRunning)
            {
                mtWatcherRunning = true;
                getMediaTypes($scope.propertyId).then(function () {
                    mtWatcherRunning = false;
                });
            }
            $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 || [];
            $scope.dictCategoriesWithCustomFieldsList = $localStorage.dictCategoriesWithCustomFieldsList || [];
            $scope.propertySelectedSubscription = $localStorage.propertySelectedSubscription || null;
            $scope.currentUserSubData = $localStorage.currentUserSubData || null;
        });


        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;
                    });
                }
            }
        }


        $scope.$on('$viewContentLoaded', function () {
            //Here your view content is fully loaded !!

            if (propertyID == 17) {

                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        //console.log(mutation)
                        if (mutation.addedNodes && mutation.addedNodes.length > 0) {
                                // element has class `MyClass`
                                console.log('element ".hover-stretch" added');
                                const hoverStretch = $document[0].querySelectorAll('.hover-stretch');
                                hoverStretch.forEach(word => {
                                    // Get all the letters in the word
                                    const letters = word.textContent.split('');

                                    // Wrap each letter in a span element
                                    const wrappedLetters = letters.map(letter => `<span>${letter}</span>`);
                                    word.innerHTML = wrappedLetters.join('');

                                    // Add event listener for hover effect
                                    const letterSpans = word.querySelectorAll('span');
                                    letterSpans.forEach(span => {
                                        // init with default font variation settings  
                                        span.style.setProperty('--fsetting', "'ital' 1, 'wdth' 80, 'wght' 400");

                                        span.addEventListener('mouseover', () => {
                                            span.style.setProperty('--fsetting', "'ital' 1, 'wdth' 170, 'wght' 400");
                                            span.style.fontVariationSettings = 'var(--fsetting)';
                                        });

                                        span.addEventListener('mouseout', () => {
                                            span.style.setProperty('--fsetting', "'ital' 1, 'wdth' 80, 'wght' 400");
                                        });
                                    });
                                });
                            
                        }
                    });
                });

                var config = {
                    attributes: true,
                    childList: true,
                    characterData: true
                };

                observer.observe(document.body, config);

            }
        });

        /* Start it off */
        getMediaTypes($scope.propertyId);
        getSubscriptions($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', '$localStorage', '$analytics',
    function ($scope, $rootScope, orderFactory, sharedProperties, $state, $uibModal, $uibModalStack, geoFactory, $localStorage, $analytics) {

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

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

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

          $scope.localStorageData = $localStorage;

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

          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;
        });
    };

    function IsStripeProperty() {
        return sharedProperties.GetStripeProperties().indexOf(sharedProperties.getProperty("propertyDetails").PropertyID) > -1;
    }

    $scope.IsStripeProperty = function () {
        return IsStripeProperty();
    };

    var displaySpinner = false;
    $scope.displayModalSpinner = function () {
        return displaySpinner;
    };

    function GetStripeIntent() {
        if (IsStripeProperty()) {
            displaySpinner = true;
            orderFactory.generateStripeDataForOrderDash($scope.order, $scope.localStorageData.userStripeIntent)
                .success(function (data) {
                    displaySpinner = false;
                    if (data == null || !data.Success || !data.Data || !data.Data.ClientKey) {
                        SweetAlert.swal({
                            title: data.Errors || "Unable to continue. Please go back and try again.",
                            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) {
                            });
                        $state.go('enter.client');
                    }
                    else {
                        $scope.localStorageData.userStripeIntent = data.Data;

                        //var appearance = {
                        //    theme: 'stripe',
                        //};

                        //var paymentElementOptions = {
                        //    layout: "tabs",
                        //};
                        try {
                            var clientKey = $scope.localStorageData.userStripeIntent.ClientKey;
                            var elements = stripeClass.elements({ clientSecret: clientKey });
                            paymentElement = elements.create("card");
                            paymentElement.mount("#payment-element");
                        }
                        catch (error) {
                            console.log(error);
                        }
                    }
                })
                .error(function (error) {
                    displaySpinner = false;
                    //TODO: SHOW ERROR MESSAGE;
                });
        }
    }

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

        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;

        var params = {
            PropertyID: sharedProperties.getProperty("propertyDetails").PropertyID,
            Order: $scope.order,
            CreditCard: $scope.creditCard
        };
        if (IsStripeProperty()) {
            //invokeSpinner = true;
            stripeClass.confirmCardPayment($scope.localStorageData.userStripeIntent.ClientKey, {
                payment_method: {
                    card: paymentElement
                }
            }).then(function (result) {
                //invokeSpinner = false;
                $scope.preventSubmission = false;
                $scope.$apply(function () {
                    if (result.error && (!result.paymentIntent || result.paymentIntent.status != "succeeded")) {
                        $scope.keepSpinning = false;
                        $scope.statusOrder = 'Unable to complete.';
                    } else {
                        params.StripeData = { IntentID: result.paymentIntent.id };
                        orderFactory.submitStripePaymentDash(params)
                            .success(function (data) {
                                $scope.keepSpinning = false;
                                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.statusOrder = (data && data.Errors && data.Errors.length > 0 ? data.Errors[0] : '') || 'Unable to complete payment.';
                                }
                                $scope.localStorageData.userStripeIntent = null;
                            })
                            .error(function (error) {
                                $scope.keepSpinning = false;
                                //TODO: SHOW ERROR MESSAGE;
                            });
                    }
                });
            });
        }
        else {

            orderFactory.submitCreditCardPaymentDash(params)
                .success(function (data) {
                    $scope.preventSubmission = false;
                    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.statusOrder = (data && data.Errors && data.Errors.length > 0 ? data.Errors[0] : '') || 'Unable to complete payment.';
                    }
                    $scope.keepSpinning = false;
                    params = undefined;
                })
                .error(function (error) {
                    $scope.preventSubmission = false;
                    $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);
                    GetStripeIntent();

                    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();
    };

    loadData();
    if (IsStripeProperty())
        displaySpinner = true;
}];;
/// <reference path="userController.js" />
entriesApp.controller('userController', ['$scope', '$rootScope', 'userFactory', 'sharedProperties', '$state', '$uibModal', '$uibModalStack', '$analytics',
  function ($scope, $rootScope, userFactory, sharedProperties, $state, $uibModal, $uibModalStack, $analytics) {

      // 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();
      };

      function GetSubData() {
          if (sharedProperties.HasToken()) {
              userFactory.getSubStatus(sharedProperties.getProperty("propertyDetails").PropertyID).success(function (subData) {
                  $scope.currentUserSubData = subData;
              });
          }
      }

      $scope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, options)
      {

          GetSubData();
      });

      $scope.$on('login', function (event, args) {
          GetSubData();
      });

      $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 || propertyID == 19;
      });

      $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', '$analytics', function ($scope, $rootScope, $uibModalInstance, sharedProperties, userFactory, options, successCallbackArgs, $analytics) {
    $scope.statusRegistration;
    $scope.save = function () {
        //reset error
        $scope.statusRegistration;

        if (sharedProperties.getProperty('propertyDetails').CaptchaSiteKey) {
            grecaptcha.ready(function () {
                grecaptcha.execute(sharedProperties.getProperty('propertyDetails').CaptchaSiteKey, { action: 'submit' }).then(function (token) {

                    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,
                        CaptchaResponse: token,
                    };
                    $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) {
                                    $analytics.setAlias(data.Email);
                                    $analytics.setUsername(data.Email);
                                    $analytics.setUserProperties(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;
                        });
                });
            });
        }
        else {
            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) {
                            $analytics.setAlias(data.Email);
                            $analytics.setUsername(data.Email);
                            $analytics.setUserProperties(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', '$analytics', function ($scope, $rootScope, $uibModalInstance, sharedProperties, userFactory, options, successCallbackArgs, $analytics) {
    $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) {
                $analytics.setAlias(params.Email);
                $analytics.setUsername(params.Email);
                $analytics.setUserProperties(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',
    '$localStorage',
    'SweetAlert',
    'orderFactory',
    function ($scope, entriesFactory, userFactory, propertyFactory, pdfFactory, geoFactory, sharedProperties, $state, $location, $http, $rootScope, $filter, $analytics, seasonFactory, $localStorage, $sce, $localStorage, SweetAlert, orderFactory) {
        var stateChanged_To = null;

        $scope.propertyId = propertyID || 1;

        $scope.allowUploadEdit = false;
        $scope.preventUpload = false;
        $scope.currentSeasonID = 0;

        $scope.treatAsCampaign = $scope.propertyId == 1 || $scope.propertyId == 6 || $scope.propertyId == 9 || $scope.propertyId == 14 || $scope.propertyId == 15;
        $scope.canEditEntryType = $scope.propertyId == 5 || $scope.propertyId == 14 || $scope.propertyId == 15;

        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;
            $scope.artworkUploads = null;

            if ($state.current.name === "dashboard.contact" && !sharedProperties.HasToken()) {
                $state.go("dashboard.list");
                $scope.currentUser = null;
            }
        }

        $scope.getFieldMaxLength = sharedProperties.getFieldMaxLength;

        function GetSubData() {
            if (sharedProperties.HasToken()) {
                userFactory.getSubStatus($scope.propertyId).success(function (subData) {
                    $scope.currentUserSubData = subData;
                });
            }
        }

        $scope.openLogoFileSelector = function () {
            $('.file_upload').find("input[type='file']").trigger('click');
        };

        $scope.openHeroFileSelector = function () {
            $('.file_upload_dir').find("input[type='file']").trigger('click');
        };

        $scope.setHeroFileNameFromS3 = function (fileUrl, fileName) {
            $scope.currentUser.OrganizationHeroImageOriginalName = fileName;
            $scope.currentUser.OrganizationHeroImage = fileUrl.replace($scope.propertyDetails.PropertyID + '/Directory/', '');
            $scope.$digest();
        };

        $scope.setLogoFileNameFromS3 = function (fileUrl, fileName) {
            $scope.currentUser.OrganizationLogoImageOriginalName = fileName;
            $scope.currentUser.OrganizationLogoImage = fileUrl.replace($scope.propertyDetails.PropertyID + '/Directory/', '');
            $scope.$digest();
        };

        $scope.removeLogoUpload = function () {
            $scope.currentUser.OrganizationLogoImageOriginalName = null;
            $scope.currentUser.OrganizationLogoImage = null;
        };

        $scope.removeHeroUpload = function () {
            $scope.currentUser.OrganizationHeroImageOriginalName = null;
            $scope.currentUser.OrganizationHeroImage = null;
        };

        $scope.openNonProfitFileSelector = function () {
            $('.file_upload_proof').find("input[type='file']").trigger('click');
        };

        $scope.setFileProofNameFromS3 = function (fileUrl, fileName) {
            $scope.currentUser.NonProfitDocumentOriginalName = fileName;
            $scope.currentUser.NonProfitDocument = fileUrl.replace($scope.propertyDetails.PropertyID + '/TaxDocuments/', '');
            $scope.$digest();
        };

        $scope.removeNonProfitFileUpload = function () {
            $scope.currentUser.NonProfitDocumentOriginalName = null;
            $scope.currentUser.NonProfitDocument = null;
        };

        $scope.unSubscribe = function () {
            SweetAlert.swal({
                title: "Do you want to continue to unsubsribe?",
                type: "warning",
                showCancelButton: true,
                killButtonColor: true,
                confirmButtonClass: "btn btn-primary",
                cancelButtonClass: "btn btn-secondary",
                confirmButtonText: "Yes",
                closeOnConfirm: true,
                iconHTML: " "
            },
                function (isConfirm) {
                    if (isConfirm) {
                        userFactory.unSubscribe($scope.propertyId).success(function (resp) {
                            GetSubData();
                            if (resp) {
                                SweetAlert.swal({
                                    title: "You have successfully unsubscribed.",
                                    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) {
                                    });
                            }
                            else{
                                SweetAlert.swal({
                                    title: "You have failed to unsubscribed. Please contact customer service to verify/complete subscription removal.",
                                    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) {
                                    });
                            }
                        });
                    }
                });
        };

        // Initialize $scope's state
        $scope.isAllowedEntryEdit = function () {
            if (!$scope.entryEditDeadline) {
                return true;
            }
            var today = moment.utc();
            return today.isBefore(moment.utc($scope.entryEditDeadline));
        };

        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 (isEditable, overrideState) {
            this.props.isEditable = (overrideState ? 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.artworkUploads = _.has($scope.submissionData, 'ArtworkUploads') ? $scope.submissionData.ArtworkUploads : null;
                        $scope.podcastUploads = _.has($scope.submissionData, 'PodcastUploads') ? $scope.submissionData.PodcastUploads : null;
                        $scope.podcastDetails = _.has($scope.submissionData, 'PodcastDetails') ? $scope.submissionData.PodcastDetails : null;
                        $scope.advertisingUploads = _.has($scope.submissionData, 'AdvertisingUploads') ? $scope.submissionData.AdvertisingUploads : null;
                        if ($scope.podcastDetails && $scope.podcastDetails.length > 0) {
                            for (var t = 0; t < $scope.podcastDetails.length; t++) {
                                $scope.podcastDetails[t].AdditionalURLs.push({ id: 0, value: "" });
                            }
                        }
                    }
                })
                .error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
            GetSubData();
        };

        $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();
            }
            GetSubData();
        };

        $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++) {
                var pieceUpdate = {
                    PieceID: pieces[i].PieceID,
                    PieceTitle: pieces[i].Title,
                    Credits: pieces[i].Credits,
                    APlusDescription: pieces[i].APlusDescription,
                    ProjectSummary: pieces[i].ProjectSummary,
                    Objectives: pieces[i].Objectives,
                    ResultsEvaluation: pieces[i].ResultsEvaluation,
                    CompanyCreationDate: pieces[i].CompanyCreationDate,
                    CompanyRevenue: pieces[i].CompanyRevenue,
                    CompanyEffortsDiversity: pieces[i].CompanyEffortsDiversity,
                    CompanyEffortsSustainability: pieces[i].CompanyEffortsSustainability,
                    IsInventionAvailable: pieces[i].IsInventionAvailable,
                    WhenInventionAvailable: pieces[i].WhenInventionAvailable,
                    InventionPrice: pieces[i].InventionPrice,
                    UrlList: pieces[i].UrlList,
                    CompanyUrl: pieces[i].Urls,
                    PieceCompanySizeID: pieces[i].PieceCompanySizeID,
                    Presenter: pieces[i].Presenter,
                    AddtnlCustomFields: pieces[i].AddtnlCustomFields,
                };

                if (sharedProperties.getProperty("propertyDetails").PropertyID == 14 && pieces[i].EntryType == "FormOnly") {
                    pieceUpdate.EntryType = pieces[i].EntryType;
                }
                data.Pieces.push(pieceUpdate);
            }


            $scope.addCustomUrl = function (piece, urlCategory) {
                if (!urlCategory.TempUrl || !urlCategory.TempUrl.trim())
                    return;

                if (!piece.CustomUrls) {
                    piece.CustomUrls = [];
                }

                piece.CustomUrls.push({
                    Url: urlCategory.TempUrl,
                    CustomURLCategoryID: urlCategory.CategoryID,
                    DisplayOrder: 0
                });

                urlCategory.TempUrl = null;

                $scope.reNumberCustomUrls(piece);
            };

            $scope.removeCustomUrl = function (piece, index) {
                piece.CustomUrls.splice(index, 1);
                $scope.reNumberCustomUrls(piece);
            };

            $scope.getCustomUrlLength = function (piece, categoryId) {
                var customUrlLength = 0;
                for (var customUrl in piece.CustomUrls) {
                    if (customUrl.CustomURLCategoryID == categoryId) {
                        customUrlLength++;
                    }
                }
                return customUrlLength;
            }

            $scope.checkCustomUrlPrefix = function (piece, event, categoryType) {
                categoryType.TempUrl = updateUrlPrefix(event, categoryType.TempUrl || '');
            };

            $scope.reNumberCustomUrls = function (piece) {
                var categoryMax = {};
                for (var index in piece.CustomUrls) {
                    var customUrl = piece.CustomUrls[index]
                    if (!(customUrl.CustomURLCategoryID in categoryMax)) {
                        categoryMax[customUrl.CustomURLCategoryID] = 1;
                    }

                    customUrl.DisplayOrder = categoryMax[customUrl.CustomURLCategoryID];
                    categoryMax[customUrl.CustomURLCategoryID]++;
                }
            }


            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.podcastDetails, 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.singleMediaTypeFilter = function (className) {
            return function (item) {
                return item.Pieces[0].MediaTypeCSSClass == className;
            }
        };

        $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) {

                    if (propertyID == 19) {
                        if (today.isBefore(moment.utc(details.EntryVisibleDeadline))) {
                            $scope.timeDashboarddeadline = details.EntryVisibleDeadline
                        }
                        else if (today.isBefore(moment.utc(details.EntryVisibleFinalDeadline))) {
                            $scope.timeDashboarddeadline = details.EntryVisibleFinalDeadline
                        }
                        else if (today.isBefore(moment.utc(details.EntryVisibleExtendedDeadline))) {
                            $scope.timeDashboarddeadline = details.EntryVisibleExtendedDeadline
                        }
                    }

                    $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 == 14) {
                $scope.allowUploadEdit = true;
            }

            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;
                        $scope.shortlistArtworkDueDate = details[0].ShortlistArtworkDueDate;
                        $scope.entryEditDeadline = details[0].EntryEditDeadline;
                        $scope.seasonCFEEndDate = details[0].CfeEndDate;
                    }
                    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.updatePieceData = function (piece) {
            $rootScope.$broadcast('showPieceUpdateModal', sharedProperties.FormatForLoginCallback($scope.callbackIdentifier, loadData, piece));
        };

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

        $scope.removeFile = 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 getPieceCompanySize() {
            if ($scope.propertyDetails.PropertyID !== 7 && $scope.propertyDetails.PropertyID !== 19) {
                return;
            }
            entriesFactory.getPieceCompanySize()
                .success(function (resp) {
                    $scope.pieceCompanySizes = resp.Data;
                }).error(function (error) {
                    $scope.status = error;
                    console.error(error);
                });
        };

        var updateEventUrlPrefix = 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, prop1, prop2) {
            if (prop1) {
                if (prop2) {
                    $scope[prop1][prop2] = updateEventUrlPrefix(event);
                }
                else {
                    $scope[prop1] = updateEventUrlPrefix(event);
                }
            }
            else {
                $scope.TempUrl = updateEventUrlPrefix(event, $scope.TempUrl || '');
            }
        };

        $scope.addUrl = function (errorList, piece) {
            if (errorList && Object.keys(errorList).length > 0) {
                $scope.campUrl = true;
                return;
            }

            if (!$scope.TempUrl || !$scope.TempUrl.trim())
                return;

            if (!piece.UrlList) {
                piece.UrlList = [];
            }

            piece.UrlList.push($scope.TempUrl);

            TempUrl = null;
            campUrl = false;

        };


        $scope.removeUrl = function (index, piece) {
            piece.UrlList.splice(index, 1);
        };

        $scope.timeCompanySizeFilter = function (item, mediaType) {
            if (item && (item.MediaTypeName == mediaType)) {
                return item;
            }
        };

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

        getPieceLengths();
        getPieceCompanySize();
    }]);;
angular.module('rmModules')
    .factory('cmsFactory', ['$http', 'sharedProperties', function ($http, sharedProperties) {

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

        dataFactory.getCMSAppTypes = function (data) {
            return $http.get(urlBase + '/CMS/GetCMSAppTypes/'+data.PropertyID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getCMSAppTypeContent = function (data) {
            return $http.get(urlBase + '/CMS/GetCMSAppTypeContent/' + data.CMSAppTypeID, sharedProperties.AuthenticationHeader());
        };

        dataFactory.saveCMSRegionContent = function (data) {
            return $http.post(urlBase + '/CMS/SaveCMSRegionContent/', data, sharedProperties.AuthenticationHeader());
        };

        dataFactory.getCMSAppTypeContents = function (data) {
            return $http.post(urlBase + '/CMS/GetCMSAppTypeContents/', data);
        };

        return dataFactory;
    }]);;
/**
 * @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);
;
   (function (angular) {
        'use strict';
       angular.module('angulartics-tik-tok-pixel', ['angulartics'])
            .config(['$analyticsProvider', function ($analyticsProvider) {
                $analyticsProvider.registerPageTrack(function (path) {
                    var tiktokTagFunc = window.ttq || null;
                    if (tiktokTagFunc) {
                        tiktokTagFunc.track('ViewContent', {'content_id': path});
                    }
                });

                $analyticsProvider.registerEventTrack(eventTrack);

                function eventTrack(action, properties) {
                    var tiktokTagFunc = window.ttq || null;
                    if (tiktokTagFunc) {
                        if (properties) {
                            tiktokTagFunc.track(action, {
                                'content_id': action,
                                'content_category': properties.category,
                                'content_name': properties.label,
                                'value': properties.value
                            });
                        }
                        else {
                            tiktokTagFunc.track(action);
                        }
                    }
                }

                $analyticsProvider.registerExceptionTrack(function (error, cause) {
                    eventTrack(error.toString(), {
                        'category': 'Exceptions',
                        'label': error.stack
                    });

                });
            }]);

    })(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);;
   (function (angular) {
        'use strict';
        angular.module('angulartics.gtag', ['angulartics'])
            .config(['$analyticsProvider', function ($analyticsProvider) {
                $analyticsProvider.registerPageTrack(function (path) {
                    var googleTagFunc = window.gtag || null;
                    if (googleTagFunc) {
                        googleTagFunc('event', 'page_view', {page_path: path});
                    }
                });

                $analyticsProvider.registerEventTrack(eventTrack);

                function eventTrack(action, properties) {
                    var googleTagFunc = window.gtag || null;
                    if (googleTagFunc) {
                        if (properties) {
                            googleTagFunc('event', action, {
                                'event_category': properties.category,
                                'event_label': properties.label,
                                'value': properties.value
                            });
                        }
                        else {
                            googleTagFunc('event', action);
                        }
                    }
                }

                $analyticsProvider.registerTransactionTrack(transactionTrack);

                function transactionTrack(transaction) {
                    var googleTagFunc = window.gtag || null;
                    if (googleTagFunc) {
                        if (transaction) {
                            googleTagFunc('event', 'purchase', {
                                transaction_id: transaction.id,
                                value: transaction.revenue,
                                tax: transaction.tax,
                                items: transaction.products,
                                currency: transaction.currency
                            });
                        }
                    }
                }

                $analyticsProvider.registerExceptionTrack(function (error, cause) {
                    eventTrack(error.toString(), {
                        'category': 'Exceptions',
                        'label': error.stack
                    });

                });
            }]);

    })(angular);
;
   (function (angular) {
        'use strict';
        angular.module('angulartics.reddit.pixel', ['angulartics'])
            .config(['$analyticsProvider', function ($analyticsProvider) {
                $analyticsProvider.registerPageTrack(function (path) {
                    var redditTagFunc = window.rdt || null;
                    if (redditTagFunc) {
                        redditTagFunc('track', 'PageVisit');
                    }
                });

                $analyticsProvider.registerEventTrack(eventTrack);

                function eventTrack(action, properties) {
                    var redditTagFunc = window.rdt || null;
                    if (redditTagFunc) {
                        redditTagFunc('track', 'Custom', { customEventName: action })
                    }
                }

                $analyticsProvider.registerExceptionTrack(function (error, cause) {
                    eventTrack(error.toString(), null);

                });
            }]);

    })(angular);
;
(function (window, angular, undefined) {
    'use strict';

    /**
     * @ngdoc overview
     * @name angulartics.segment
     * Enables analytics support for Segment (http://segment.com)
     */
    angular.module('angulartics.segment', ['angulartics'])
        .config(['$analyticsProvider', function ($analyticsProvider) {

            // This allows users to load their segment library async, queue events,
            // and send them whenever the script is ready
            angulartics.waitForVendorApi("analytics", 1000, "initialized", registerHandlers);

            function registerHandlers() {
                // https://segment.com/docs/libraries/analytics.js/#page
                // analytics.page([category], [name], [properties], [options], [callback]);
                // TODO : Support optional parameters where the parameter order and type changes their meaning
                // e.g.
                // (string) is (name)
                // (string, string) is (category, name)
                // (string, object) is (name, properties)
                $analyticsProvider.registerPageTrack(function (path, properties) {
                    try {
                        // only pass `path`, segment script will automatically populate properties
                        analytics.page(path);
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });

                // https://segment.com/docs/libraries/analytics.js/#track
                // analytics.track(event, [properties], [options], [callback]);
                $analyticsProvider.registerEventTrack(function (event, properties, options, callback) {
                    try {
                        analytics.track(event, properties, options, callback);
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });

                /**
                 * Send exceptions to segment
                 * @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) {
                    try {
                        analytics.track(error.toString(), {
                            category: 'Exceptions',
                            label: error.stack,
                        });
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });
                // https://segment.com/docs/libraries/analytics.js/#identify
                // analytics.identify([userId], [traits], [options], [callback]);
                $analyticsProvider.registerSetUsername(function (userId) {
                    try {
                        analytics.identify(userId);
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });

                // https://segment.com/docs/libraries/analytics.js/#identify
                // analytics.identify([userId], [traits], [options], [callback]);
                $analyticsProvider.registerSetUserProperties(function (traits, options, callback) {
                    try {
                        analytics.identify(traits, options, callback);
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });

                // https://segment.com/docs/libraries/analytics.js/#identify
                // analytics.identify([userId], [traits], [options], [callback]);
                $analyticsProvider.registerSetUserPropertiesOnce(function (userId, traits, options, callback) {
                    try {
                        analytics.identify(userId, traits, options, callback);
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });

                // https://segment.com/docs/libraries/analytics.js/#alias
                // analytics.alias(userId, previousId, options, callback);
                $analyticsProvider.registerSetAlias(function (userId, previousId, options, callback) {
                    try {
                        analytics.alias(userId, previousId, options, callback);
                    } catch (e) {
                        if (!(e instanceof ReferenceError)) {
                            throw e;
                        }
                    }
                });
            }

        }]);

})(window, window.angular);;
