From f6af0d6b340e39e1db13f9b140d77324d7f687a4 Mon Sep 17 00:00:00 2001 From: mjunior Date: Sun, 29 Sep 2019 21:32:32 +0200 Subject: [PATCH] Advanced security configurations + content expiration exception --- README.md | 100 +++++++++-- Resources/pom.xml | 2 +- .../META-INF/resources/hi-config.xsd | 144 +++++++++++++-- .../main/resources/META-INF/resources/hi.js | 21 ++- .../resources/META-INF/resources/hi.min.js | 2 +- Web/pom.xml | 13 +- .../java/org/emerjoin/hi/web/ActiveUser.java | 49 ++--- .../java/org/emerjoin/hi/web/AppContext.java | 35 +++- .../emerjoin/hi/web/DispatcherServlet.java | 3 +- .../org/emerjoin/hi/web/boot/BootAgent.java | 2 +- .../hi/web/config/AppConfigurations.java | 23 ++- .../org/emerjoin/hi/web/config/Frontiers.java | 115 ++++++++++++ .../org/emerjoin/hi/web/config/Security.java | 170 ++++++++++++++++++ .../hi/web/config/xml/XMLConfigProvider.java | 26 +-- .../config/xml/sections/FrontiersConfig.java | 44 +++-- .../config/xml/sections/SecurityConfig.java | 58 ++++++ .../hi/web/config/xml/sections/WebConfig.java | 6 +- .../hi/web/events/CSRFAttackAttemptEvent.java | 10 ++ .../org/emerjoin/hi/web/i18n/I18nStarter.java | 6 +- .../emerjoin/hi/web/i18n/I18nXmlConfig.java | 4 +- .../org/emerjoin/hi/web/internal/Router.java | 5 +- .../org/emerjoin/hi/web/mvc/Controller.java | 50 ++++++ .../org/emerjoin/hi/web/mvc/HTMLizer.java | 1 - .../hi/web/req/FrontierSecurityChecklist.java | 45 +++++ .../hi/web/req/FrontiersReqHandler.java | 99 +++++++--- .../emerjoin/hi/web/req/MVCReqHandler.java | 6 + .../hi/web/security/CsrfTokenUtil.java | 83 +++++++++ .../emerjoin/hi/web/{uti => util}/Timing.java | 2 +- 28 files changed, 979 insertions(+), 145 deletions(-) create mode 100644 Web/src/main/java/org/emerjoin/hi/web/config/Frontiers.java create mode 100644 Web/src/main/java/org/emerjoin/hi/web/config/Security.java create mode 100644 Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/SecurityConfig.java create mode 100644 Web/src/main/java/org/emerjoin/hi/web/events/CSRFAttackAttemptEvent.java create mode 100644 Web/src/main/java/org/emerjoin/hi/web/req/FrontierSecurityChecklist.java create mode 100644 Web/src/main/java/org/emerjoin/hi/web/security/CsrfTokenUtil.java rename Web/src/main/java/org/emerjoin/hi/web/{uti => util}/Timing.java (92%) diff --git a/README.md b/README.md index 543ff74..a942741 100755 --- a/README.md +++ b/README.md @@ -5,26 +5,102 @@ It's a light Java Framework that allows developers to write fully Ajax web appli # Need some guidance? Please read the documentation at [https://docs.hi-framework.org/1.1.0/getting-started/](https://docs.hi-framework.org/1.1.0/getting-started/index.html "Hi-Framework docs") -# 1.5.0 Changes -* Redirect API Introduced +# 1.6.0 Changes +* New Security Configurations Introduced +* Content Expiration exception introduced -## Redirect API Usage example -See the code snippet below: -```java + +## Content expiration event +See snippet below: + +```javascript + + Hi.template({ + + ... + + $frontiers:{ + + ... + + //Handle content expiration exception + expired : function(call){ + alert("Content expired"); + } + + ... + + } + + ... + + }); + + +``` + + +## Security configurations + +### Frontiers security configurations +See the __Hi.xml__ snippet below: +```xml ... - @Inject - RequestContext context; + + 1600 + + + + HS512 + 4d1138af-18da-43fc-b4f5-e4bbebbc13d1 + 25 + + + false + true + + + + + + ... +``` + +### General security configurations +See the __Hi.xml__ snippet below: +```xml - public void whatever(){ - - context.sendRedirect("people/list"); - - } + ... + + + + true + false + + + + + + + + + + + + + + ... ``` + + + + + + The API will perform the redirect regardless of being invoked in the middle of an AJAX Request. \ No newline at end of file diff --git a/Resources/pom.xml b/Resources/pom.xml index 4152711..cbe092f 100755 --- a/Resources/pom.xml +++ b/Resources/pom.xml @@ -7,7 +7,7 @@ org.emerjoin Hi-Framework-Resources - 1.5.0 + 1.6.0 jar \ No newline at end of file diff --git a/Resources/src/main/resources/META-INF/resources/hi-config.xsd b/Resources/src/main/resources/META-INF/resources/hi-config.xsd index e82860d..da145b5 100755 --- a/Resources/src/main/resources/META-INF/resources/hi-config.xsd +++ b/Resources/src/main/resources/META-INF/resources/hi-config.xsd @@ -1,6 +1,6 @@ - + @@ -8,6 +8,12 @@ + + + + + + @@ -40,18 +46,12 @@ - - - - - - @@ -64,9 +64,121 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -195,11 +307,13 @@ - - - - - + + + + + + + diff --git a/Resources/src/main/resources/META-INF/resources/hi.js b/Resources/src/main/resources/META-INF/resources/hi.js index 676ae24..858b44e 100755 --- a/Resources/src/main/resources/META-INF/resources/hi.js +++ b/Resources/src/main/resources/META-INF/resources/hi.js @@ -2383,7 +2383,6 @@ Hi.$frontiers.Promise = function(){ var request = undefined; - var getGlobalHandler = function(name){ if(__.hasOwnProperty("$frontiers")) { @@ -2496,6 +2495,21 @@ Hi.$frontiers.Promise = function(){ }; + this._setExpired = function(){ + + var gExpiredHandler = getGlobalHandler("expired"); + var gErrorHandler = getGlobalHandler("catch"); + + if(typeof gExpiredHandler=="function"){ + gExpiredHandler.call(getGlobalHandlers(),this); + }else if(typeof gErrorHandler=="function"){ + gErrorHandler.call(getGlobalHandlers(),419); + } + + this._setRequestFinished(); + + }; + this._setForbidden = function(){ var gForbiddenHandler = getGlobalHandler("forbidden"); @@ -3050,6 +3064,9 @@ var fMx = function(params,$functionUrl,_$tout,_$fmut,_$si,_$si_method,_$abpon,fa case 408: promisse._setTimedOut(); break; + case 419: + promisse._setExpired(); + break; case 421: promisse._setInterrupted(); break; @@ -3070,7 +3087,7 @@ var fMx = function(params,$functionUrl,_$tout,_$fmut,_$si,_$si_method,_$abpon,fa ajaxParams.method = "POST"; ajaxParams.url = $functionUrl; - ajaxParams.headers = {csrfToken: App.csrfToken}; + //ajaxParams.headers = {csrfToken: App.csrfToken}; ajaxParams.dataType = "json"; ajaxParams.cache = false; ajaxParams.timeout = _$tout; diff --git a/Resources/src/main/resources/META-INF/resources/hi.min.js b/Resources/src/main/resources/META-INF/resources/hi.min.js index 77ba432..05bb716 100644 --- a/Resources/src/main/resources/META-INF/resources/hi.min.js +++ b/Resources/src/main/resources/META-INF/resources/hi.min.js @@ -1 +1 @@ -var _0x1c9f=['app','cache','deploy-id-','base64_url','destroy','deployMode','init','$injector','$startedUp','root','$init','injector','concat','invoke','$inject','$compile','initialize','hi_cache_regs','stringify','prepareView','getNamedRoute','getTextViewPath','getURL','stores','get','parse','storeView','getStorageKey','hi-app-views-','updateCache','There\x20was\x20an\x20error\x20when\x20trying\x20to\x20parse\x20views\x20cache\x20JSON','
','find','.hi','remove','getCache','normalizePath','substr','fetch','setTitle','title','getTitle','controllers','loadedControllers','setLoadedController','push','wasControllerLoaded','getViewController','setViewController','Invalid\x20view\x20controller','$new','$startup','fireBeforeView','setScopeProps','$preLoad','$onPreLoad','$route','setActivePath','setLocation','$postLoad','proceed','$onClose','$activeView','#view_content','isGoingBack','$apply','$onPostLoad','$onRedirectFinish','$preventClose','$close','Invalid\x20active\x20view\x20object','commands','all','set','$reload','location','replace','url','reload','$url','value','$reloadLanguage','$redirect','redirect','$root','$dictionary','i18n','reset','export','component','strip','empty','copy','ucfirst','toUpperCase','toLowerCase','URLToJson','split','substring','getKidProperties','lcfirst','camelCase','forEach','explode','valueOf','goto','Hi.$nav.navigateTo(\x27','onClick','routeBack','history','last','namedRoutes','getPreviousPath','removeVal','active','abort','getCachingURL','dialog','true','Ignore-Js','response','write','data','$invoke','setNextControllerInfo','base_url','encodeGetParams','currentPage','currentRoute','pushState','resetLocation','replaceState','isSameRoute','requestData','embedded','AJAX_MVC','ajax','$onRedirectError','status','controller/action\x20HTTP\x20request\x20failed\x20:\x20','nextControllerInfo','Invalid\x20route\x20supplied\x20:\x20','toSlashes','_setRequest','callback','_setRequestFinished','finally','_setHttpError','catch','timeout','_setOverRequest','try','Wrong\x20parameters','interrupted','Invalid\x20params\x20supplied\x20to\x20Upload\x20class\x20constructor','getName','getFiles','rootTemplate','extend','prototype','startsWith','onpopstate','charAt','exported','format','ExpressionPromise','with','isPrototypeOf','Promisse','$params','responseText','details','_setInterrupted','POST','headers','dataType','json','$$$upload:','_file_','arg','$args','processData','$template','$view','$angular','$config','changeLocation','debugLogs','debug','error','angular','$ui','html','$nav','$util','$test','configs','frontiers','delay','getMockCallTimeout','MockCall','result','undefined','success','_setResult','$frontiers','Promise','_setException','_setTimedOut','forbidden','_setForbidden','overrequest','MockTemplate','template','ViewTestPromise','route','resolveRoute','receptor','gettable','markup','controller','scope','hasOwnProperty','action','warn','No\x20controller\x20and\x20action\x20names\x20detected.\x20Suspending\x20preparation','viewHtml','build','nav','getViewPath','createViewScope','No\x20scope\x20returned\x20to\x20receptor','$embed','withHtml','view','directives','aload','asrc','err','attr','src','onload','onerror','$observe','No\x20name\x20attribute\x20defined\x20on\x20view\x20element','embed','onbusy','onready','onfail','string','length','function','call','onError','navigateTo','$element','element','append','name','$eval','ajaxify','removeAttr','href','click','javascript:void(0)','bind','directivesDefiner','setModule','angularModule','define','object','Angular\x20directives\x20could\x20not\x20defined.\x20No\x20valid\x20angular\x20module\x20supplied','directive','ngUpload','trim','Invalid\x20upload\x20name\x20:\x20','type','file','The\x20upload\x20element\x20with\x20name\x20\x27','\x27\x20must\x20be\x20of\x20type\x20\x22file\x22','onfiles','change','target','files','run','isArray','modules','Injecting\x20the\x20following\x20modules\x20to\x20Hi\x20Application\x20:\x20','No\x20modules\x20to\x20be\x20injected\x20to\x20Hi\x20Application','No\x20run\x20function\x20for\x20Hi\x20Application','indexOf','Invalid\x20value\x20set\x20for\x20property\x20Hi.$config.angular.modules','module'];(function(_0xb51c48,_0x326637){var _0x2c18e1=function(_0x5b4e5c){while(--_0x5b4e5c){_0xb51c48['push'](_0xb51c48['shift']());}};var _0xd06bf3=function(){var _0x4195e6={'data':{'key':'cookie','value':'timeout'},'setCookie':function(_0x493756,_0x2b23f2,_0x3551dc,_0x2034a3){_0x2034a3=_0x2034a3||{};var _0x3b3f41=_0x2b23f2+'='+_0x3551dc;var _0x372bfc=0x0;for(var _0x372bfc=0x0,_0x336d1d=_0x493756['length'];_0x372bfc<_0x336d1d;_0x372bfc++){var _0x7a8ca2=_0x493756[_0x372bfc];_0x3b3f41+=';\x20'+_0x7a8ca2;var _0x1cfe7e=_0x493756[_0x7a8ca2];_0x493756['push'](_0x1cfe7e);_0x336d1d=_0x493756['length'];if(_0x1cfe7e!==!![]){_0x3b3f41+='='+_0x1cfe7e;}}_0x2034a3['cookie']=_0x3b3f41;},'removeCookie':function(){return'dev';},'getCookie':function(_0x6bd093,_0x20f08e){_0x6bd093=_0x6bd093||function(_0x1b503c){return _0x1b503c;};var _0x304dff=_0x6bd093(new RegExp('(?:^|;\x20)'+_0x20f08e['replace'](/([.$?*|{}()[]\/+^])/g,'$1')+'=([^;]*)'));var _0x1ec98f=function(_0x4230f8,_0x5e9065){_0x4230f8(++_0x5e9065);};_0x1ec98f(_0x2c18e1,_0x326637);return _0x304dff?decodeURIComponent(_0x304dff[0x1]):undefined;}};var _0x569513=function(){var _0x1e2f38=new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');return _0x1e2f38['test'](_0x4195e6['removeCookie']['toString']());};_0x4195e6['updateCookie']=_0x569513;var _0xbf6c93='';var _0x1719af=_0x4195e6['updateCookie']();if(!_0x1719af){_0x4195e6['setCookie'](['*'],'counter',0x1);}else if(_0x1719af){_0xbf6c93=_0x4195e6['getCookie'](null,'counter');}else{_0x4195e6['removeCookie']();}};_0xd06bf3();}(_0x1c9f,0x1db));var _0xf1c9=function(_0x30f639,_0x1f0f72){_0x30f639=_0x30f639-0x0;var _0x10c8c3=_0x1c9f[_0x30f639];return _0x10c8c3;};var _0x522bf6=function(){var _0x132d9e=!![];return function(_0x1475d7,_0x4337a4){var _0x33cf87=_0x132d9e?function(){if(_0x4337a4){var _0x5f0385=_0x4337a4['apply'](_0x1475d7,arguments);_0x4337a4=null;return _0x5f0385;}}:function(){};_0x132d9e=![];return _0x33cf87;};}();var _0x1ea46c=_0x522bf6(this,function(){var _0x535f91=function(){return'\x64\x65\x76';},_0x2e08fb=function(){return'\x77\x69\x6e\x64\x6f\x77';};var _0x57e764=function(){var _0x5e9928=new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');return!_0x5e9928['\x74\x65\x73\x74'](_0x535f91['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var _0x592a3a=function(){var _0x3d0c61=new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');return _0x3d0c61['\x74\x65\x73\x74'](_0x2e08fb['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var _0x2fbce3=function(_0x327d7d){var _0x39ef44=~-0x1>>0x1+0xff%0x0;if(_0x327d7d['\x69\x6e\x64\x65\x78\x4f\x66']('\x69'===_0x39ef44)){_0x19837a(_0x327d7d);}};var _0x19837a=function(_0x443ed2){var _0x150fef=~-0x4>>0x1+0xff%0x0;if(_0x443ed2['\x69\x6e\x64\x65\x78\x4f\x66']((!![]+'')[0x3])!==_0x150fef){_0x2fbce3(_0x443ed2);}};if(!_0x57e764()){if(!_0x592a3a()){_0x2fbce3('\x69\x6e\x64\u0435\x78\x4f\x66');}else{_0x2fbce3('\x69\x6e\x64\x65\x78\x4f\x66');}}else{_0x2fbce3('\x69\x6e\x64\u0435\x78\x4f\x66');}});_0x1ea46c();var __={};var Hi={};Hi[_0xf1c9('0x0')]=undefined;Hi[_0xf1c9('0x1')]=undefined;Hi[_0xf1c9('0x2')]={};Hi[_0xf1c9('0x3')]={};Hi[_0xf1c9('0x3')]['nav']={};Hi['$config']['nav'][_0xf1c9('0x4')]=!![];Hi[_0xf1c9('0x3')][_0xf1c9('0x5')]=![];var Log={};Log[_0xf1c9('0x6')]=function(_0x3314eb){if(Hi[_0xf1c9('0x3')][_0xf1c9('0x5')])console[_0xf1c9('0x7')](_0x3314eb);};Hi['$config']['ui']={};Hi[_0xf1c9('0x3')][_0xf1c9('0x8')]={};Hi[_0xf1c9('0x9')]={};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')]={};Hi[_0xf1c9('0x9')]['js']={};Hi[_0xf1c9('0xb')]={};Hi[_0xf1c9('0xc')]={};Hi[_0xf1c9('0xd')]={};Hi[_0xf1c9('0xd')][_0xf1c9('0xe')]={};Hi[_0xf1c9('0xd')][_0xf1c9('0xe')][_0xf1c9('0xf')]={};Hi[_0xf1c9('0xd')][_0xf1c9('0xe')]['frontiers'][_0xf1c9('0x10')]=0x0;Hi[_0xf1c9('0xd')][_0xf1c9('0xe')][_0xf1c9('0xf')]['evalTimeout']=0x32;Hi[_0xf1c9('0xd')][_0xf1c9('0x11')]=function(){var _0x18ed88=Hi[_0xf1c9('0xd')]['configs'][_0xf1c9('0xf')][_0xf1c9('0x10')];var _0x3a685e=Hi['$test'][_0xf1c9('0xe')][_0xf1c9('0xf')]['evalTimeout'];if(_0x18ed88>0x0)return _0x18ed88;return _0x3a685e;};Hi[_0xf1c9('0xd')][_0xf1c9('0x12')]=function(_0x2df997){this[_0xf1c9('0x13')]=function(_0x849d4b){var _0x52bfd5=Hi[_0xf1c9('0xd')]['getMockCallTimeout']();if(typeof _0x2df997!=_0xf1c9('0x14')&&_0x2df997>0x0)_0x52bfd5=_0x2df997;setTimeout(_0x849d4b,_0x52bfd5);};this[_0xf1c9('0x15')]=function(_0x540643){var _0x3a5d5d=new Hi['$frontiers']['Promise']();this[_0xf1c9('0x13')](function(){_0x3a5d5d[_0xf1c9('0x16')](_0x540643);});return _0x3a5d5d;};this[_0xf1c9('0x7')]=function(_0x38eb56){var _0x1f5f7b=new Hi[(_0xf1c9('0x17'))][(_0xf1c9('0x18'))]();this[_0xf1c9('0x13')](function(){_0x1f5f7b[_0xf1c9('0x19')](_0x38eb56);});return _0x1f5f7b;};this['timeout']=function(){var _0x24f7ea=new Hi[(_0xf1c9('0x17'))][(_0xf1c9('0x18'))]();this[_0xf1c9('0x13')](function(){_0x24f7ea[_0xf1c9('0x1a')]();});return _0x24f7ea;};this[_0xf1c9('0x1b')]=function(){var _0x4b6e44=new Hi[(_0xf1c9('0x17'))]['Promise']();this[_0xf1c9('0x13')](function(){_0x4b6e44[_0xf1c9('0x1c')]();});return _0x4b6e44;};this[_0xf1c9('0x1d')]=function(){var _0x3aa515=new Hi[(_0xf1c9('0x17'))][(_0xf1c9('0x18'))]();this[_0xf1c9('0x13')](function(){_0x3aa515['_setOverRequest']();});return _0x3aa515;};};Hi[_0xf1c9('0xd')][_0xf1c9('0x1e')]=function(_0xbdea3d){Hi[_0xf1c9('0x1f')](_0xbdea3d);};Hi['$test'][_0xf1c9('0x20')]=function(_0x274923){this[_0xf1c9('0x21')]=Hi[_0xf1c9('0xb')][_0xf1c9('0x22')](_0x274923);this[_0xf1c9('0x23')]={};this[_0xf1c9('0x24')]={};this[_0xf1c9('0x24')][_0xf1c9('0xa')]=function(){return this[_0xf1c9('0x23')][_0xf1c9('0x25')];};this[_0xf1c9('0x24')][_0xf1c9('0x26')]=function(){return this[_0xf1c9('0x23')][_0xf1c9('0x27')];};if(!(this['route'][_0xf1c9('0x28')](_0xf1c9('0x26'))&&this[_0xf1c9('0x21')]['hasOwnProperty'](_0xf1c9('0x29')))){console[_0xf1c9('0x2a')](_0xf1c9('0x2b'));this['gettable']=![];}this[_0xf1c9('0x2c')]='';this[_0xf1c9('0x2d')]=function(){Hi[_0xf1c9('0x3')][_0xf1c9('0x2e')][_0xf1c9('0x4')]=![];if(!this['gettable'])return![];var _0x5a1c7f=Hi[_0xf1c9('0xb')][_0xf1c9('0x2f')](this[_0xf1c9('0x21')][_0xf1c9('0x26')],this[_0xf1c9('0x21')][_0xf1c9('0x29')]);Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x30')](_0x5a1c7f,{},this[_0xf1c9('0x2c')],![],this['receptor'],![],undefined);if(!this[_0xf1c9('0x23')][_0xf1c9('0x28')](_0xf1c9('0x27'))){console[_0xf1c9('0x2a')](_0xf1c9('0x31'));return![];}this['receptor'][_0xf1c9('0x27')][_0xf1c9('0x32')]=function(){};this['gettable'][_0xf1c9('0x23')]=this[_0xf1c9('0x23')];return this[_0xf1c9('0x24')];};this[_0xf1c9('0x33')]=function(_0x3b9050){this[_0xf1c9('0x2c')]=_0x3b9050;return this;};};Hi['$test'][_0xf1c9('0x34')]=function(_0x2e3b3e){return new Hi[(_0xf1c9('0xd'))][(_0xf1c9('0x20'))](_0x2e3b3e);};Hi[_0xf1c9('0x2')][_0xf1c9('0x35')]={};Hi['$angular'][_0xf1c9('0x35')][_0xf1c9('0x36')]=function(){return{'restrict':'A','link':function(_0x38a6f7,_0x5ea693,_0x1ae407){var _0x313790=new Image();var _0x130c6e=![];var _0x1a047d=![];var _0x1b2aa0=![];if(_0x1ae407[_0xf1c9('0x28')]('asrc')){_0x130c6e=_0x1ae407[_0xf1c9('0x37')];}else{return;}var _0x52b8eb=function(){_0x1a047d=_0x1ae407['aload'];_0x1b2aa0=_0x1a047d;if(_0x1ae407['hasOwnProperty'](_0xf1c9('0x38'))){_0x1b2aa0=_0x1ae407['err'];}$(_0x5ea693)[_0xf1c9('0x39')](_0xf1c9('0x3a'),_0x1a047d);var _0x543cfa=new Image();_0x543cfa[_0xf1c9('0x3b')]=function(){$(_0x5ea693)[_0xf1c9('0x39')](_0xf1c9('0x3a'),_0x130c6e);};_0x543cfa[_0xf1c9('0x3c')]=function(){$(_0x5ea693)[_0xf1c9('0x39')](_0xf1c9('0x3a'),_0x1b2aa0);};_0x543cfa['src']=_0x130c6e;};_0x52b8eb();_0x1ae407[_0xf1c9('0x3d')](_0xf1c9('0x37'),function(_0x86ca3a){if(typeof _0x86ca3a!=_0xf1c9('0x14')){_0x130c6e=_0x1ae407[_0xf1c9('0x37')];_0x52b8eb();}});}};};Hi[_0xf1c9('0x2')][_0xf1c9('0x35')][_0xf1c9('0x34')]=function(){return{'restrict':'E','scope':![],'link':function(_0x19f41c,_0xd4c4b9,_0x2145e8){var _0x16be8d=![];if(!_0x2145e8[_0xf1c9('0x28')]('name'))throw new Error(_0xf1c9('0x3e'));if(_0x2145e8[_0xf1c9('0x28')](_0xf1c9('0x3f')))_0x16be8d=_0x2145e8[_0xf1c9('0x3f')];var _0x79fc7c=_0xf1c9('0x40');var _0x497895=![];if(_0x2145e8[_0xf1c9('0x28')](_0x79fc7c))_0x497895=_0x2145e8[_0x79fc7c];var _0x4adcbf=_0xf1c9('0x41');var _0x3312b3=![];if(_0x2145e8['hasOwnProperty'](_0x4adcbf))_0x3312b3=_0x2145e8[_0x4adcbf];var _0x4069a7=_0xf1c9('0x42');var _0x1eca97=![];if(_0x2145e8['hasOwnProperty'](_0x4069a7))_0x1eca97=_0x2145e8[_0x4069a7];var _0x2e464f=function(_0x18119e,_0x40c241,_0x38850e,_0x44889f){if(typeof _0x18119e!=_0xf1c9('0x43')||_0x18119e[_0xf1c9('0x44')]<0x1)throw new Error('URL\x20is\x20now\x20valid');if(typeof _0x44889f==_0xf1c9('0x45'))_0x44889f[_0xf1c9('0x46')](_0x19f41c);var _0x4a0d2a={};_0x4a0d2a[_0xf1c9('0x47')]=function(){if(typeof _0x38850e==_0xf1c9('0x45'))_0x38850e[_0xf1c9('0x46')](_0x19f41c);};try{Hi['$nav'][_0xf1c9('0x48')](_0x18119e,![],!![],function(_0x8a1cc2){_0x8a1cc2[_0xf1c9('0x27')][_0xf1c9('0x49')]=_0x8a1cc2[_0xf1c9('0x4a')];_0x8a1cc2[_0xf1c9('0x27')]['$embed']=_0x2e464f;_0x19f41c[_0x2145e8['name']]=_0x8a1cc2[_0xf1c9('0x27')];_0x19f41c['$applyAsync'](function(){$(_0xd4c4b9)['empty']();$(_0xd4c4b9)[_0xf1c9('0x4b')](_0x8a1cc2[_0xf1c9('0x4a')]);if(typeof _0x40c241==_0xf1c9('0x45'))_0x40c241[_0xf1c9('0x46')]();});},_0x19f41c,_0x4a0d2a);}catch(_0x4c61bf){if(typeof _0x38850e==_0xf1c9('0x45'))_0x38850e[_0xf1c9('0x46')](_0x19f41c);}};if(!_0x16be8d)_0x19f41c[_0x2145e8[_0xf1c9('0x4c')]]={'$embed':_0x2e464f};else _0x2e464f(_0x16be8d,function(){if(typeof _0x3312b3==_0xf1c9('0x43'))_0x19f41c[_0xf1c9('0x4d')](_0x3312b3);},function(){if(typeof _0x1eca97==_0xf1c9('0x43'))_0x19f41c['$eval'](_0x1eca97);},function(){if(typeof _0x497895==_0xf1c9('0x43'))_0x19f41c['$eval'](_0x497895);});}};};Hi[_0xf1c9('0x2')][_0xf1c9('0x35')][_0xf1c9('0x4e')]=function(){return{'restrict':'A','link':function(_0x2fa2ea,_0x17f3bb,_0x3e176a){$(_0x17f3bb)[_0xf1c9('0x4f')](_0xf1c9('0x4e'));if(_0x3e176a[_0xf1c9('0x50')]){var _0x3e310a=_0x3e176a[_0xf1c9('0x50')];var _0x30ffa0=_0xf1c9('0x51');$(_0x17f3bb)[_0xf1c9('0x39')](_0xf1c9('0x50'),_0xf1c9('0x52'));if(_0x3e176a['on']){_0x30ffa0=_0x3e176a['on'];$(_0x17f3bb)[_0xf1c9('0x4f')]('on');}Hi[_0xf1c9('0xb')][_0xf1c9('0x53')]($(_0x17f3bb),_0x3e310a,_0x30ffa0);}}};};Hi[_0xf1c9('0x2')][_0xf1c9('0x54')]=function(_0x3ee764){this['angularModule']=_0x3ee764;this[_0xf1c9('0x55')]=function(_0xc88d1d){this[_0xf1c9('0x56')]=_0xc88d1d;};this[_0xf1c9('0x57')]=function(){if(typeof this[_0xf1c9('0x56')]==_0xf1c9('0x58')){if(typeof this[_0xf1c9('0x56')]['directive']!='function'){throw new Error(_0xf1c9('0x59'));}}for(var _0xcc49f8 in Hi[_0xf1c9('0x2')][_0xf1c9('0x35')]){var _0x5aaccb=Hi['$angular'][_0xf1c9('0x35')][_0xcc49f8];this[_0xf1c9('0x56')][_0xf1c9('0x5a')](_0xcc49f8,_0x5aaccb);}};};Hi[_0xf1c9('0x2')]['directives'][_0xf1c9('0x5b')]=function(_0x534ab2){return{'restrict':'A','scope':![],'link':function(_0xf1c5a,_0x3382d7,_0x586565){var _0x163759=_0x586565[_0xf1c9('0x5b')];var _0x99e7cf=undefined;if(_0x163759[_0xf1c9('0x5c')]()[_0xf1c9('0x44')]<0x1){throw new Error(_0xf1c9('0x5d')+_0x163759);}if(!_0x586565[_0xf1c9('0x28')](_0xf1c9('0x5e')))throw new Error('The\x20type\x20property\x20is\x20missing\x20on\x20the\x20upload\x20element\x20with\x20name\x20\x27'+_0x163759+'\x27');if(_0x586565[_0xf1c9('0x5e')]!==_0xf1c9('0x5f'))throw new Error(_0xf1c9('0x60')+_0x163759+_0xf1c9('0x61'));if(_0x586565[_0xf1c9('0x28')](_0xf1c9('0x62'))){_0x99e7cf=_0x534ab2(_0x586565[_0xf1c9('0x62')]);}$(_0x3382d7)[_0xf1c9('0x63')](function(_0x5b760e){var _0x32b963=_0x5b760e[_0xf1c9('0x64')][_0xf1c9('0x65')];var _0x1101c3=new Upload(_0x163759,_0x32b963);_0x196535(_0x1101c3);_0x51bb12(_0x1101c3);});var _0x196535=function(_0x416bd0){_0xf1c5a[_0x163759]=_0x416bd0;};var _0x51bb12=function(_0x1edac1){if(typeof _0x99e7cf!=_0xf1c9('0x14'))_0x99e7cf(_0xf1c5a,{'upload':_0x1edac1});};}};};Hi[_0xf1c9('0x2')]['app']=![];Hi[_0xf1c9('0x2')][_0xf1c9('0x66')]=function(){var _0x29eb7d=[];var _0x36018f=![];if(Array[_0xf1c9('0x67')](Hi[_0xf1c9('0x3')][_0xf1c9('0x8')]['modules'])){_0x29eb7d=Hi[_0xf1c9('0x3')]['angular'][_0xf1c9('0x68')];Log[_0xf1c9('0x6')](_0xf1c9('0x69'));Log[_0xf1c9('0x6')](_0x29eb7d);}else{Log[_0xf1c9('0x6')](_0xf1c9('0x6a'));}if(typeof Hi[_0xf1c9('0x3')]['angular'][_0xf1c9('0x66')]==_0xf1c9('0x45')){_0x36018f=Hi[_0xf1c9('0x3')][_0xf1c9('0x8')]['run'];}else{Log[_0xf1c9('0x6')](_0xf1c9('0x6b'));}if(Array['isArray'](_0x29eb7d)){if(_0x29eb7d[_0xf1c9('0x6c')]('ng')==-0x1)_0x29eb7d['push']('ng');}else{throw new Error(_0xf1c9('0x6d'));}if(_0x29eb7d[_0xf1c9('0x44')]==0x0)_0x29eb7d['push']('ng');var _0x52de73=angular['module']('hi',_0x29eb7d);if(typeof AppHooks!=_0xf1c9('0x14'))AppHooks['fireBeforeRun'](_0x52de73);var _0x37d5a0=angular[_0xf1c9('0x6e')](_0xf1c9('0x6f'),['ng']);if(typeof AppHooks!='undefined')AppHooks['fireSetupApp'](_0x37d5a0);var _0x2784b8=new Hi[(_0xf1c9('0x2'))][(_0xf1c9('0x54'))](_0x52de73);_0x2784b8[_0xf1c9('0x57')]();var _0x59fe00=function(_0x5820ea,_0x2678d9){if(typeof sessionStorage!=_0xf1c9('0x14')){if(typeof App=='undefined'){Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')]['on']=![];}else{var _0x5c0ba2=![];if(sessionStorage[_0xf1c9('0x28')](_0xf1c9('0x71')+App[_0xf1c9('0x72')]))_0x5c0ba2=sessionStorage[_0xf1c9('0x71')+App[_0xf1c9('0x72')]];else{Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x73')]();}if(_0x5c0ba2){if(_0x5c0ba2!=App['deployId']){Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x73')]();}}sessionStorage[_0xf1c9('0x71')+App[_0xf1c9('0x72')]]=App['deployId'];if(App[_0xf1c9('0x74')]=='DEVELOPMENT')Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')]['on']=![];}}Hi['i18n'][_0xf1c9('0x75')]();Hi[_0xf1c9('0x2')][_0xf1c9('0x76')]=angular['injector'](_0x29eb7d);Hi[_0xf1c9('0x2')]['$compile']=_0x2678d9;__=_0x5820ea;Hi[_0xf1c9('0x0')]=_0x5820ea;__[_0xf1c9('0x77')]=![];for(var _0x5ed08e in Hi[_0xf1c9('0x9')]['js']['root']){var _0x5b027b=Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x78')][_0x5ed08e];__[_0x5ed08e]=_0x5b027b;}if(__[_0xf1c9('0x28')](_0xf1c9('0x79'))){if(typeof __[_0xf1c9('0x79')]==_0xf1c9('0x45')){__[_0xf1c9('0x79')][_0xf1c9('0x46')](__);}}Hi['$angular']['$injector']=angular[_0xf1c9('0x7a')]([_0xf1c9('0x6f')][_0xf1c9('0x7b')](_0x29eb7d));if(typeof App!=_0xf1c9('0x14')){if(typeof _0x36018f==_0xf1c9('0x45')){Hi[_0xf1c9('0x2')][_0xf1c9('0x76')][_0xf1c9('0x7c')](_0x36018f);}if(typeof $startup!=_0xf1c9('0x45')){throw new Error('$startup\x20function\x20is\x20undefined');}setTimeout(function(){$startup();},0x5);}};_0x59fe00[_0xf1c9('0x7d')]=['$rootScope',_0xf1c9('0x7e')];_0x52de73[_0xf1c9('0x66')](_0x59fe00);Hi[_0xf1c9('0x2')][_0xf1c9('0x6f')]=_0x52de73;};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')]['cache']={'on':!![]};Hi['$ui'][_0xf1c9('0xa')]['cache'][_0xf1c9('0x7f')]=function(){try{if(sessionStorage){if(!sessionStorage[_0xf1c9('0x80')]){sessionStorage['hi_cache_regs']=JSON[_0xf1c9('0x81')](new Array());}}}catch(_0x45986f){return![];}};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x82')]=function(_0x3d20ef){var _0x51cdaf=![];if(typeof _0x3d20ef===_0xf1c9('0x43')){_0x51cdaf=Hi['$nav'][_0xf1c9('0x83')](_0x3d20ef);}else{_0x51cdaf=_0x3d20ef;}if(_0x51cdaf){var _0x4a76e2=Hi[_0xf1c9('0xb')][_0xf1c9('0x84')](_0x51cdaf[_0xf1c9('0x26')],_0x51cdaf['action']);var _0x35f3eb=Hi[_0xf1c9('0xb')][_0xf1c9('0x85')](_0x51cdaf);if(Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x86')](_0x35f3eb)){return;}$[_0xf1c9('0x87')](_0x35f3eb,function(_0x14ecf6){try{var _0x28a966=JSON[_0xf1c9('0x88')](_0x14ecf6);var _0x50c8c1=_0x28a966[_0xf1c9('0x25')];Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x89')](_0x35f3eb,_0x50c8c1);}catch(_0x184b7c){}});}};Hi[_0xf1c9('0x9')]['html']['cache'][_0xf1c9('0x8a')]=function(){return _0xf1c9('0x8b')+App[_0xf1c9('0x72')];};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x8c')]=function(_0x3f2ecc){if(typeof localStorage!=_0xf1c9('0x14')&&typeof _0x3f2ecc==_0xf1c9('0x58')){localStorage[Hi[_0xf1c9('0x9')][_0xf1c9('0xa')]['cache'][_0xf1c9('0x8a')]()]=JSON[_0xf1c9('0x81')](_0x3f2ecc);}};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')]['getCache']=function(){var _0xd5536a={};if(typeof localStorage!=_0xf1c9('0x14')){var _0x408212=Hi['$ui'][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x8a')]();if(localStorage[_0xf1c9('0x28')](_0x408212)){try{_0xd5536a=JSON[_0xf1c9('0x88')](localStorage[_0x408212]);}catch(_0x4d64f1){Log[_0xf1c9('0x6')](_0xf1c9('0x8d'));}}}return _0xd5536a;};Hi[_0xf1c9('0x9')]['html'][_0xf1c9('0x70')][_0xf1c9('0x73')]=function(){if(typeof localStorage!=_0xf1c9('0x14')){Hi['$ui']['html'][_0xf1c9('0x70')][_0xf1c9('0x8c')]({});}};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x89')]=function(_0xd98aa3,_0x223a5e){if(!Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')]['on']){return![];}var _0x420a40=$(_0xf1c9('0x8e'));_0x420a40[_0xf1c9('0xa')](_0x223a5e);$(_0x420a40)[_0xf1c9('0x8f')](_0xf1c9('0x90'))[_0xf1c9('0x91')]();var _0x4c2785=$(_0x420a40)[_0xf1c9('0xa')]();var _0x58465d=Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x92')]();_0x58465d[Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x93')](_0xd98aa3)]=_0x4c2785;Hi[_0xf1c9('0x9')]['html'][_0xf1c9('0x70')][_0xf1c9('0x8c')](_0x58465d);Log[_0xf1c9('0x6')]('Caching\x20view\x20of\x20path\x20<'+_0xd98aa3+'>');};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x93')]=function(_0x389ae5){var _0x1589c9=_0x389ae5[_0xf1c9('0x6c')]('?');if(_0x1589c9!=-0x1){return _0x389ae5[_0xf1c9('0x94')](0x0,_0x1589c9);}return _0x389ae5;};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')]['cache'][_0xf1c9('0x86')]=function(_0x5702fe){if(!Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')]['on']){return![];}var _0x24ee96=Hi[_0xf1c9('0x9')]['html']['cache'][_0xf1c9('0x92')]();return _0x24ee96[_0xf1c9('0x28')](Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x93')](_0x5702fe));};Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x95')]=function(_0x1523fb){var _0x13e483=Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x92')]();return _0x13e483[Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')]['normalizePath'](_0x1523fb)];};Hi[_0xf1c9('0x9')]['html'][_0xf1c9('0x96')]=function(_0x51136a){$(_0xf1c9('0x97'))[_0xf1c9('0xa')](_0x51136a);};Hi[_0xf1c9('0x9')]['html'][_0xf1c9('0x98')]=function(){return $(_0xf1c9('0x97'))[_0xf1c9('0xa')]();};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x99')]={};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9a')]=[];Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9b')]=function(_0x48b428,_0x5555b0){Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9a')][_0xf1c9('0x9c')](_0x48b428+'/'+_0x5555b0);};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9d')]=function(_0x516e45,_0x3aff6f){var _0x2d44ff=_0x516e45+'/'+_0x3aff6f;var _0x11b223=Hi[_0xf1c9('0x9')]['js']['loadedControllers'][_0xf1c9('0x6c')](_0x2d44ff);if(_0x11b223==-0x1){return![];}return!![];};Hi[_0xf1c9('0x9')]['js']['templatesParent']={};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9e')]=function(_0x828767,_0x235de1){var _0x195e3d=Hi[_0xf1c9('0xb')][_0xf1c9('0x84')](_0x828767,_0x235de1);if(Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x99')][_0xf1c9('0x28')](_0x195e3d)){var _0x59ac59=Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x99')][_0x195e3d];return _0x59ac59;}else{return![];}};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9f')]=function(_0x2a0d07,_0x1e78c7,_0x15ac4f){var _0x317340=Hi['$nav'][_0xf1c9('0x84')](_0x2a0d07,_0x1e78c7);Hi[_0xf1c9('0x9')]['js']['controllers'][_0x317340]=_0x15ac4f;};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x30')]=function(_0x1f7b4d,_0xd20935,_0xf17531,_0x1761f5,_0xd67f02,_0x5ce9d7,_0x559c92){var _0x406bc9=Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9e')](_0x1f7b4d[_0xf1c9('0x26')],_0x1f7b4d[_0xf1c9('0x29')]);if(typeof _0x406bc9==_0xf1c9('0x14')){throw new Error('No\x20controller\x20defined.\x20Cant\x20prepare\x20context');return;}if(typeof _0x406bc9!=_0xf1c9('0x45')){throw new Error(_0xf1c9('0xa0'));}var _0x4210ee=![];if(_0x1761f5){if(typeof _0x5ce9d7!='undefined'){_0x4210ee=_0x5ce9d7[_0xf1c9('0xa1')](![]);}else{_0x4210ee=__[_0xf1c9('0xa1')](![]);}}else{if(!__[_0xf1c9('0x77')]&&__[_0xf1c9('0x28')](_0xf1c9('0xa2'))){if(typeof __[_0xf1c9('0xa2')]==_0xf1c9('0x45')){__[_0xf1c9('0x77')]=!![];__[_0xf1c9('0xa2')][_0xf1c9('0x46')](__,{'controller':_0x1f7b4d['controller'],'action':_0x1f7b4d[_0xf1c9('0x29')]});}}_0x4210ee=__[_0xf1c9('0xa1')](!![]);}var _0x5b003a=Hi[_0xf1c9('0x2')]['$injector'];var _0x54917e={'_':_0x4210ee,'__':__,'$scope':_0x4210ee,'$rootScope':__,'template':__};var _0x3abc6c=_0x1f7b4d[_0xf1c9('0x26')]+'/'+_0x1f7b4d['action'];if(typeof AppHooks!=_0xf1c9('0x14'))AppHooks[_0xf1c9('0xa3')](_0x3abc6c,_0x4210ee,_0x54917e);_0x5b003a[_0xf1c9('0x7c')](_0x406bc9,![],_0x54917e);Hi['$ui']['js'][_0xf1c9('0xa4')](_0x4210ee,_0xd20935);if(_0x4210ee['hasOwnProperty']('$preLoad')){var _0x65683a=_0x4210ee[_0xf1c9('0xa5')][_0xf1c9('0x46')](_0x4210ee,_0xf17531);if(typeof _0x65683a!=_0xf1c9('0x14')){_0xf17531=_0x65683a;}}if(__[_0xf1c9('0x28')](_0xf1c9('0xa6'))){if(typeof __['$onPreLoad']==_0xf1c9('0x45')){var _0x65683a=__[_0xf1c9('0xa6')][_0xf1c9('0x46')](__,_0x4210ee[_0xf1c9('0xa7')],_0x4210ee,_0xf17531);if(typeof _0x65683a!=_0xf1c9('0x14')){_0xf17531=_0x65683a;}}}var _0xb191eb=Hi[_0xf1c9('0x2')]['$compile'](_0xf17531);var _0x20ef32=_0xb191eb(_0x4210ee);var _0x2f5227=function(){var _0x3b3f02=Hi[_0xf1c9('0xb')][_0xf1c9('0x85')](_0xd20935[_0xf1c9('0xa7')]);var _0x3bc085=Hi['$nav'][_0xf1c9('0xa8')](_0x3b3f02);Hi['$nav'][_0xf1c9('0xa9')](_0x3b3f02,JSON['stringify']({'index':_0x3bc085}));};if(_0xd67f02&&_0x1761f5){_0xd67f02[_0xf1c9('0x4a')]=_0x20ef32;_0xd67f02['scope']=_0x4210ee;_0xd67f02[_0xf1c9('0x25')]=_0xf17531;if(typeof _0x4210ee[_0xf1c9('0xaa')]!=_0xf1c9('0x14')){_0x4210ee[_0xf1c9('0xaa')]['call'](_0x4210ee);}var _0x4afcc8=Hi[_0xf1c9('0x3')][_0xf1c9('0x2e')]['changeLocation'];if(_0x1761f5)_0x4afcc8=![];if(_0x4afcc8){_0x2f5227();}return _0xd67f02;}var _0x4993a7={};_0x4993a7[_0xf1c9('0xab')]=function(){if(__[_0xf1c9('0x28')](_0xf1c9('0xac'))&&__[_0xf1c9('0x28')](_0xf1c9('0xad'))){if(typeof __[_0xf1c9('0xac')]==_0xf1c9('0x45')){__[_0xf1c9('0xac')][_0xf1c9('0x46')](__,__[_0xf1c9('0xad')][_0xf1c9('0xa7')]);}}var _0x5257f9=__[_0xf1c9('0x28')](_0xf1c9('0xad'));__[_0xf1c9('0xad')]=_0x4210ee;Hi[_0xf1c9('0x1')]=_0x4210ee;$(_0xf1c9('0xae'))[_0xf1c9('0xa')]('');$('#view_content')[_0xf1c9('0x4b')](_0x20ef32);var _0x2af15e=Hi[_0xf1c9('0x3')][_0xf1c9('0x2e')][_0xf1c9('0x4')];if(_0x2af15e&&_0x5257f9){_0x2f5227();}Hi[_0xf1c9('0xb')][_0xf1c9('0xaf')]=![];_0x4210ee[_0xf1c9('0xb0')](function(){if(typeof _0x4210ee[_0xf1c9('0xaa')]!=_0xf1c9('0x14')){_0x4210ee[_0xf1c9('0xaa')][_0xf1c9('0x46')](_0x4210ee);}if(__['hasOwnProperty'](_0xf1c9('0xb1'))){if(typeof __[_0xf1c9('0xb1')]==_0xf1c9('0x45')){__[_0xf1c9('0xb1')]['call'](__,_0x4210ee[_0xf1c9('0xa7')],_0x4210ee);}}if(__[_0xf1c9('0x28')](_0xf1c9('0xb2'))&&_0x5257f9){if(typeof __['$onRedirectFinish']=='function'){__[_0xf1c9('0xb2')][_0xf1c9('0x46')](__);}}});};if(__[_0xf1c9('0x28')](_0xf1c9('0xad'))){if(typeof __[_0xf1c9('0xad')]=='object'){if(__[_0xf1c9('0xad')][_0xf1c9('0x28')](_0xf1c9('0xb3'))&&__['$activeView'][_0xf1c9('0x28')](_0xf1c9('0xb4'))){if(__[_0xf1c9('0xad')][_0xf1c9('0xb3')]){__[_0xf1c9('0xad')]['$close'][_0xf1c9('0x46')](__[_0xf1c9('0xad')],_0x4993a7);}else{_0x4993a7['proceed']();}}else{if(typeof __['$activeView'][_0xf1c9('0xb4')]==_0xf1c9('0x45')){__[_0xf1c9('0xad')][_0xf1c9('0xb4')][_0xf1c9('0x46')](__[_0xf1c9('0xad')]);_0x4993a7['proceed']();}else{_0x4993a7[_0xf1c9('0xab')]();}}Hi[_0xf1c9('0xb')][_0xf1c9('0xaf')]=![];}else{throw new Error(_0xf1c9('0xb5'));}}else{_0x4993a7[_0xf1c9('0xab')]();}};Hi[_0xf1c9('0x9')]['js']['commands']={};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')][_0xf1c9('0xb7')]={};Hi['$ui']['js'][_0xf1c9('0xb6')][_0xf1c9('0xb8')]=function(_0x4bf627,_0x6ff69a){Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')][_0xf1c9('0xb7')][_0x4bf627]=_0x6ff69a;};Hi['$ui']['js'][_0xf1c9('0xb6')][_0xf1c9('0xb8')](_0xf1c9('0xb9'),function(_0x239ec4){if(_0x239ec4[_0xf1c9('0x28')]('url')){document[_0xf1c9('0xba')][_0xf1c9('0xbb')](_0x239ec4[_0xf1c9('0xbc')]);}else{document[_0xf1c9('0xba')][_0xf1c9('0xbd')]();}return!![];});Hi['$ui']['js'][_0xf1c9('0xb6')][_0xf1c9('0xb8')](_0xf1c9('0xbe'),function(_0x5b8626){if(_0x5b8626[_0xf1c9('0x28')]('value'))Hi[_0xf1c9('0xb')][_0xf1c9('0xa9')](_0x5b8626[_0xf1c9('0xbf')],{});});Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')]['set'](_0xf1c9('0xc0'),function(_0x4bf288){Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x73')]();document[_0xf1c9('0xba')][_0xf1c9('0xbd')]();});Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')][_0xf1c9('0xb8')](_0xf1c9('0xc1'),function(_0x2ff996){if(_0x2ff996['hasOwnProperty']('url'))Hi[_0xf1c9('0xc2')](_0x2ff996[_0xf1c9('0xbc')]);});Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')][_0xf1c9('0x66')]=function(_0x4ae149,_0x30b78e){if(Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')]['all']['hasOwnProperty'](_0x4ae149)){var _0x2018a0=Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')][_0xf1c9('0xb7')][_0x4ae149];return _0x2018a0(_0x30b78e);}return![];};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xa4')]=function(_0x1113ab,_0x541216){var _0x4c3e12={};if(_0x541216[_0xf1c9('0xc3')]){_0x4c3e12=_0x541216[_0xf1c9('0xc3')];}if(_0x541216[_0xf1c9('0x28')](_0xf1c9('0xc4'))){var _0x7744ca=_0x541216[_0xf1c9('0xc4')];Hi[_0xf1c9('0xc5')][_0xf1c9('0xc6')]();Hi[_0xf1c9('0xc5')][_0xf1c9('0xc7')](_0x7744ca);delete _0x541216[_0xf1c9('0xc4')];}for(var _0x3e0346 in _0x4c3e12){var _0x21aaeb=_0x4c3e12[_0x3e0346];__[_0x3e0346]=_0x21aaeb;}__['__t']=__t;for(var _0x21342f in _0x541216){var _0x1df1e1=_0x541216[_0x21342f];_0x1113ab[_0x21342f]=_0x1df1e1;}};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x78')]={};Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xc8')]=function(_0x3f5b57,_0x37e777){Hi['$angular'][_0xf1c9('0x35')][_0x3f5b57]=_0x37e777;};Hi[_0xf1c9('0xc')][_0xf1c9('0xc9')]=function(_0x369c9b){var _0x1ee707=angular['toJson'](_0x369c9b);return JSON[_0xf1c9('0x88')](_0x1ee707);};Hi[_0xf1c9('0xc')][_0xf1c9('0xca')]=function(){return angular[_0xf1c9('0xcb')]({});};Hi[_0xf1c9('0xc')][_0xf1c9('0xcc')]=function(_0x52689d){var _0x23dd2b=_0x52689d[_0xf1c9('0x94')](0x0,0x1);return _0x23dd2b[_0xf1c9('0xcd')]()+_0x52689d['substr'](0x1);};Hi[_0xf1c9('0xc')]['lcfirst']=function(_0x1eb061){var _0x19d135=_0x1eb061[_0xf1c9('0x94')](0x0,0x1);return _0x19d135[_0xf1c9('0xce')]()+_0x1eb061[_0xf1c9('0x94')](0x1);};Hi['$util'][_0xf1c9('0xcf')]=function(_0x2161b9){var _0xfac0b6=_0x2161b9[_0xf1c9('0xd0')]('&');var _0x557c48={};for(var _0x54bfb5 in _0xfac0b6){var _0x1b07d3=_0xfac0b6[_0x54bfb5];if(typeof _0x1b07d3!=_0xf1c9('0x43'))continue;var _0x531ba5=_0x1b07d3[_0xf1c9('0x6c')]('=');var _0x5e22ac=_0x1b07d3[_0xf1c9('0xd1')](0x0,_0x531ba5);var _0x1284f9=_0x1b07d3[_0xf1c9('0xd1')](_0x531ba5+0x1,_0x1b07d3['length']);_0x557c48[_0x5e22ac]=_0x1284f9;}return _0x557c48;};Hi[_0xf1c9('0xc')]['encodeGetParams']=function(_0xaeead5){var _0x427433='';var _0x39aefe=0x0;for(var _0xdd4054 in _0xaeead5){var _0x56efc0=_0xaeead5[_0xdd4054];if(_0x39aefe!==0x0){_0x427433=_0x427433+'&';}_0x427433=_0x427433+_0xdd4054+'='+_0x56efc0;_0x39aefe++;}return encodeURI(_0x427433);};Hi['$util'][_0xf1c9('0xd2')]=function(_0x390248,_0x39fc54){var _0xcf732f=[];for(var _0xd1eff3 in _0x39fc54){if(_0xd1eff3[_0xf1c9('0x6c')](_0x390248)>-0x1){var _0x458527=_0xd1eff3[_0xf1c9('0xbb')](_0x390248,'')[_0xf1c9('0x5c')]();if(_0x458527!=''){_0xcf732f[_0xf1c9('0x9c')](Hi[_0xf1c9('0xc')][_0xf1c9('0xd3')](_0x458527));}}}return _0xcf732f;};Hi['$util'][_0xf1c9('0xd4')]=function(_0xb0cb4e){var _0x559cc4='';_0xb0cb4e[_0xf1c9('0xd5')](function(_0x3ac959,_0x436634){if(_0x436634==0x0){_0x559cc4=_0x3ac959;}else{var _0x278507=_0x3ac959[0x0]['toUpperCase']();var _0xb9fd23=_0x3ac959[_0xf1c9('0x94')](0x1,_0x3ac959[_0xf1c9('0x44')]-0x1);var _0x2b2fc8=_0x278507+_0xb9fd23;_0x559cc4=_0x559cc4+_0x2b2fc8;}});return _0x559cc4;};Hi['$util'][_0xf1c9('0xd6')]=function(_0x21be62,_0x5139b7){var _0x406a1d=new Array();var _0x465b6d='';if(_0x5139b7[_0xf1c9('0x5c')]()==''){return[];}for(var _0x46d382 in _0x5139b7){var _0x313e81=_0x5139b7[_0x46d382];if(typeof _0x313e81!=_0xf1c9('0x43')){continue;}if(_0x313e81==_0x21be62){if(_0x465b6d!=''){_0x406a1d[_0xf1c9('0x9c')](_0x465b6d);_0x465b6d='';}}else{_0x465b6d=_0x465b6d+_0x313e81;}}if(_0x465b6d!=''&&_0x406a1d[_0xf1c9('0x44')]==0x0){_0x406a1d[_0xf1c9('0x9c')](_0x465b6d);}else if(_0x406a1d[_0xf1c9('0x44')]>0x0){if(_0x406a1d[_0x406a1d[_0xf1c9('0x44')]-0x1][_0xf1c9('0xd7')]()!=_0x465b6d){_0x406a1d[_0xf1c9('0x9c')](_0x465b6d);}}return _0x406a1d;};Hi[_0xf1c9('0xb')][_0xf1c9('0xd8')]=function(_0x224af3,_0x57241a){var _0x55e01a=_0xf1c9('0xd9')+_0x57241a+'\x27);';$('#'+_0x224af3)[_0xf1c9('0x39')](_0xf1c9('0xda'),_0x55e01a);};Hi[_0xf1c9('0xb')][_0xf1c9('0x53')]=function(_0x3e5fc5,_0x1da891,_0x14a04e){var _0x2db5c5=_0xf1c9('0xd9')+_0x1da891+'\x27);';if(_0x14a04e){if(typeof _0x3e5fc5===_0xf1c9('0x43')){$('#'+_0x3e5fc5)['bind'](_0x14a04e,function(){eval(_0x2db5c5);});}else{$(_0x3e5fc5)['bind'](_0x14a04e,function(){eval(_0x2db5c5);});}}else{$('#'+_0x3e5fc5)[_0xf1c9('0x39')](_0xf1c9('0xda'),_0x2db5c5);}};Hi[_0xf1c9('0xb')][_0xf1c9('0x2f')]=function(_0x2da3ce,_0x496857){var _0x2a4f4a={'controller':_0x2da3ce,'action':_0x496857};return _0x2a4f4a;};Hi[_0xf1c9('0xb')]['getTextViewPath']=function(_0x404154,_0x1b7de1){return _0x404154+'_'+_0x1b7de1;};Hi[_0xf1c9('0xb')][_0xf1c9('0xdb')]=function(_0x5d2252){Hi[_0xf1c9('0xb')]['isGoingBack']=!![];Hi[_0xf1c9('0xb')][_0xf1c9('0x48')](_0x5d2252,undefined);};Hi['$nav'][_0xf1c9('0xdc')]=[];Hi[_0xf1c9('0xb')][_0xf1c9('0xdd')]=![];Hi[_0xf1c9('0xb')][_0xf1c9('0xaf')]=![];Hi[_0xf1c9('0xb')][_0xf1c9('0xde')]={};Hi['$nav']['newNamedRoute']=function(_0x17b16e,_0x15be43){if(!Hi[_0xf1c9('0xb')]['hasOwnProperty'](_0x17b16e)){Hi[_0xf1c9('0xb')][_0xf1c9('0xde')][_0x17b16e]=_0x15be43;return _0x15be43;}return![];};Hi['$nav'][_0xf1c9('0x83')]=function(_0x58aecf){if(typeof _0x58aecf===_0xf1c9('0x43')){if(Hi[_0xf1c9('0xb')][_0xf1c9('0xde')]['hasOwnProperty'](_0x58aecf)){return Hi['$nav'][_0xf1c9('0xde')][_0x58aecf];}return![];}};Hi[_0xf1c9('0xb')][_0xf1c9('0xa8')]=function(_0x495c3c){Hi['$nav'][_0xf1c9('0xdc')][_0xf1c9('0x9c')](_0x495c3c);return Hi[_0xf1c9('0xb')]['history'][_0xf1c9('0x44')]-0x1;};Hi[_0xf1c9('0xb')][_0xf1c9('0xdf')]=function(_0x5dca61){if(Hi[_0xf1c9('0xb')][_0xf1c9('0xdc')][_0xf1c9('0x44')]>0x0){var _0x5b6dce=Hi['$nav'][_0xf1c9('0xdc')][0x0];Hi[_0xf1c9('0xb')]['history'][_0xf1c9('0xe0')](_0x5b6dce);return _0x5b6dce;}return![];};Hi['$nav'][_0xf1c9('0xe1')]=![];Hi[_0xf1c9('0xb')][_0xf1c9('0x48')]=function(_0x217da9,_0x2a2373,_0x4413ff,_0x45f367,_0x4d73af,_0x114ceb){if(Hi[_0xf1c9('0xb')][_0xf1c9('0xe1')]){if(Hi[_0xf1c9('0xb')]['active']['hasOwnProperty']('abort')){Hi[_0xf1c9('0xb')][_0xf1c9('0xe1')][_0xf1c9('0xe2')]();Hi['$nav'][_0xf1c9('0xe1')]=![];}}Hi[_0xf1c9('0xb')][_0xf1c9('0xdd')]={'name':_0x217da9};var _0x51a899=Hi[_0xf1c9('0xb')][_0xf1c9('0x22')](_0x217da9);_0x51a899=JSON[_0xf1c9('0x88')](JSON[_0xf1c9('0x81')](_0x51a899));if(!_0x4413ff){if(__['hasOwnProperty']('$onRedirectStart')){if(typeof __['$onRedirectStart']=='function'){__['$onRedirectStart'][_0xf1c9('0x46')](__,_0x51a899);}}}if(!_0x51a899){return![];}var _0x449a62=Hi['$nav'][_0xf1c9('0x85')](_0x51a899);var _0xe35f96=Hi[_0xf1c9('0xb')][_0xf1c9('0xe3')](_0x51a899);if(_0x51a899['get']){_0x2a2373=_0x51a899['get'];}if(_0x2a2373){_0x51a899[_0xf1c9('0x87')]=_0x2a2373;}var _0x33a16f=Hi[_0xf1c9('0xb')][_0xf1c9('0x85')](_0x51a899);if(!_0x51a899[_0xf1c9('0xe4')]){var _0x25ae2b=![];var _0xa70cf6={};if(Hi[_0xf1c9('0x9')][_0xf1c9('0xa')]['cache'][_0xf1c9('0x86')](_0xe35f96)){_0x25ae2b=Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x95')](_0xe35f96);_0xa70cf6['Ignore-View']=_0xf1c9('0xe5');}if(Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9d')](_0x51a899[_0xf1c9('0x26')],_0x51a899[_0xf1c9('0x29')])){_0xa70cf6[_0xf1c9('0xe6')]=_0xf1c9('0xe5');}if(_0x4413ff){_0x51a899['embedded']=!![];}Hi[_0xf1c9('0xb')]['requestData'](_0x51a899,function(_0x11ff97){if(_0x11ff97[_0xf1c9('0xe7')]!=0xc8){if(typeof _0x11ff97==_0xf1c9('0x43')&&_0x4413ff==![]){document[_0xf1c9('0xe8')](_0x11ff97);return;}if(_0x4413ff){if(typeof _0x114ceb[_0xf1c9('0x47')]=='function')_0x114ceb['onError']();return;}throw new Error('Request\x20to\x20server\x20returned\x20an\x20unexpected\x20result');return;}var _0x45d53d=_0x11ff97[_0xf1c9('0xe9')];if(_0x45d53d[_0xf1c9('0x28')](_0xf1c9('0xea'))){var _0x205e99=_0x45d53d['$invoke'];for(var _0x3c373e in _0x205e99){var _0x4de717=_0x205e99[_0x3c373e];if(Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0xb6')]['run'](_0x3c373e,_0x4de717)){return null;}}}var _0x332acb=_0x11ff97[_0xf1c9('0x34')];if(_0x11ff97[_0xf1c9('0x26')]){Hi[_0xf1c9('0xb')][_0xf1c9('0xeb')](_0x51a899['controller'],_0x51a899['action']);eval(_0x11ff97[_0xf1c9('0x26')]);Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9b')](_0x51a899[_0xf1c9('0x26')],_0x51a899[_0xf1c9('0x29')]);}if(!Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x86')](_0xe35f96)){Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x89')](_0xe35f96,_0x332acb);}else{_0x332acb=Hi[_0xf1c9('0x9')][_0xf1c9('0xa')][_0xf1c9('0x70')][_0xf1c9('0x95')](_0xe35f96);}var _0x102de6=_0x51a899[_0xf1c9('0x26')];var _0x83b3eb=_0x51a899[_0xf1c9('0x29')];var _0x42e624=Hi[_0xf1c9('0xb')][_0xf1c9('0x2f')](_0x102de6,_0x83b3eb);_0x45d53d[_0xf1c9('0xa7')]=_0x51a899;var _0x36e962={};var _0x510e2c=Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x30')](_0x42e624,_0x45d53d,_0x332acb,_0x4413ff,_0x36e962,_0x4d73af,_0x114ceb);if(_0x4413ff){if(typeof _0x45f367==_0xf1c9('0x45')){_0x45f367['call']({},_0x510e2c);}}},_0xa70cf6);}};Hi[_0xf1c9('0xb')][_0xf1c9('0x85')]=function(_0x44164f,_0x2852f7){var _0x251e74='';if(typeof App!=_0xf1c9('0x14'))_0x251e74=App[_0xf1c9('0xec')];if(_0x44164f[_0xf1c9('0x26')]&&!_0x44164f[_0xf1c9('0x26')]){_0x251e74=_0x251e74+_0x44164f[_0xf1c9('0x26')]+'/';}else if(_0x44164f[_0xf1c9('0x26')]&&!_0x44164f[_0xf1c9('0x26')]){_0x251e74=_0x251e74+_0x44164f['controller']+'/';}else if(_0x44164f[_0xf1c9('0x26')]&&_0x44164f['controller']){_0x251e74=_0x251e74+_0x44164f[_0xf1c9('0x26')]+'/';}if(_0x44164f[_0xf1c9('0x29')]){_0x251e74=_0x251e74+_0x44164f[_0xf1c9('0x29')];}if(_0x44164f[_0xf1c9('0x87')]){if(typeof _0x44164f[_0xf1c9('0x87')]===_0xf1c9('0x43')){_0x251e74=_0x251e74+'?'+_0x44164f[_0xf1c9('0x87')];}else{var _0x55fc9b=Hi['$util'][_0xf1c9('0xed')](_0x44164f['get']);_0x251e74=_0x251e74+'?'+_0x55fc9b;}}return _0x251e74;};Hi[_0xf1c9('0xb')][_0xf1c9('0xe3')]=function(_0x21bacd,_0x47a9fa){var _0x371532='';if(typeof App!=_0xf1c9('0x14'))_0x371532=App[_0xf1c9('0x72')];if(_0x21bacd['controller']&&!_0x21bacd[_0xf1c9('0x26')]){_0x371532=_0x371532+_0x21bacd[_0xf1c9('0x26')]+'/';}else if(_0x21bacd[_0xf1c9('0x26')]&&!_0x21bacd[_0xf1c9('0x26')]){_0x371532=_0x371532+_0x21bacd['controller']+'/';}else if(_0x21bacd['controller']&&_0x21bacd[_0xf1c9('0x26')]){_0x371532=_0x371532+_0x21bacd['controller']+'/';}if(_0x21bacd[_0xf1c9('0x29')]){_0x371532=_0x371532+_0x21bacd[_0xf1c9('0x29')];}var _0x4ab510={};if(_0x21bacd[_0xf1c9('0x87')])_0x4ab510=Hi[_0xf1c9('0xc')][_0xf1c9('0xcf')](_0x21bacd[_0xf1c9('0x87')]);if(_0x4ab510[_0xf1c9('0x28')]('$')){var _0x24346d=_0x4ab510['$'];_0x371532=_0x371532+'.'+_0x24346d;}return _0x371532;};Hi[_0xf1c9('0xb')][_0xf1c9('0xee')]=![];Hi[_0xf1c9('0xb')]['currentRoute']=![];Hi[_0xf1c9('0xb')][_0xf1c9('0xa9')]=function(_0x509ec0,_0x40d79f){Hi['$nav'][_0xf1c9('0xee')]=_0x509ec0;Hi['$nav'][_0xf1c9('0xef')]=JSON[_0xf1c9('0x88')](_0x40d79f);if(!Hi['$nav'][_0xf1c9('0xaf')]){window[_0xf1c9('0xdc')][_0xf1c9('0xf0')](Hi[_0xf1c9('0xb')][_0xf1c9('0xef')],'',_0x509ec0);}};Hi[_0xf1c9('0xb')][_0xf1c9('0xf1')]=function(){if(Hi[_0xf1c9('0xb')][_0xf1c9('0xee')]){window[_0xf1c9('0xdc')][_0xf1c9('0xf2')](Hi['$nav'][_0xf1c9('0xef')],Hi[_0xf1c9('0xb')][_0xf1c9('0xee')]+Math['random'](),Hi[_0xf1c9('0xb')][_0xf1c9('0xee')]);}};Hi[_0xf1c9('0xb')][_0xf1c9('0xf3')]=function(_0x1e14d0){return Hi[_0xf1c9('0xb')][_0xf1c9('0xee')]===_0x1e14d0;};Hi[_0xf1c9('0xb')][_0xf1c9('0xf4')]=function(_0x13b0ab,_0x1d0cd0,_0x1721b8){if(_0x13b0ab){var _0x240ab6=!![];if(_0x13b0ab[_0xf1c9('0x28')](_0xf1c9('0xf5'))){_0x240ab6=![];delete _0x13b0ab['dembed'];}var _0x42a8e0=Hi[_0xf1c9('0xb')][_0xf1c9('0x85')](_0x13b0ab);var _0x4a9c72=![];var _0x147fc1={};_0x1721b8[_0xf1c9('0xf6')]=0x1;if(_0x1721b8){_0x147fc1=_0x1721b8;}var _0x28bf7b=![];var _0x1b4fa4=$[_0xf1c9('0xf7')]({'url':_0x42a8e0,'headers':_0x1721b8,'success':function(_0x449430){_0x1d0cd0(_0x449430);},'error':function(_0x576171,_0x547c3e,_0x197007){if(__[_0xf1c9('0x28')](_0xf1c9('0xf8'))){if(typeof __[_0xf1c9('0xf8')]=='function')__[_0xf1c9('0xf8')][_0xf1c9('0x46')](__,_0x13b0ab,_0x576171[_0xf1c9('0xf9')],_0x1b4fa4);}if(__['hasOwnProperty'](_0xf1c9('0xb2'))){if(typeof __[_0xf1c9('0xb2')]==_0xf1c9('0x45')){__[_0xf1c9('0xb2')]['call'](__,_0x13b0ab);}}console[_0xf1c9('0x7')](_0xf1c9('0xfa')+_0x42a8e0);_0x28bf7b=_0x576171['responseText'];},'complete':function(){Hi[_0xf1c9('0xb')][_0xf1c9('0xe1')]=![];if(typeof _0x28bf7b=='string')_0x1d0cd0(_0x28bf7b);}});if(_0x240ab6){Hi[_0xf1c9('0xb')][_0xf1c9('0xe1')]=_0x1b4fa4;}}};Hi[_0xf1c9('0xb')][_0xf1c9('0xfb')]={};Hi['$nav'][_0xf1c9('0xeb')]=function(_0x321e62,_0x5028e7){Hi[_0xf1c9('0xb')][_0xf1c9('0xfb')]={'controller':_0x321e62,'action':_0x5028e7};};Hi['$nav'][_0xf1c9('0x22')]=function(_0x4724c2){if(typeof _0x4724c2===_0xf1c9('0x43')){if(_0x4724c2[_0xf1c9('0x6c')]('/')!==-0x1){var _0x1dd0d7=_0x4724c2['length']-0x1;var _0x1cb944=-0x1;var _0x22bb1c=![];var _0x4d9c06=![];var _0x4ce8e4='';var _0x173a69='';for(var _0x180171 in _0x4724c2){var _0x4ee919=_0x4724c2[_0x180171];if(_0x4ee919!=='/'&&_0x4ee919!=='?'){_0x4ce8e4=_0x4ce8e4+_0x4ee919;}else{if(_0x1cb944==-0x1){throw new Error(_0xf1c9('0xfc')+_0x4724c2);}if(!_0x22bb1c&&!_0x4d9c06){_0x22bb1c=_0x4ce8e4;_0x4ce8e4='';}else if(_0x22bb1c&&!_0x4d9c06){_0x4d9c06=_0x4ce8e4;_0x4ce8e4='';}else if(_0x22bb1c&&_0x4d9c06){_0x4ce8e4=_0x4ce8e4+_0x4ee919;}}if(_0x180171==_0x1dd0d7){if(!_0x4d9c06&&_0x22bb1c){_0x4d9c06=_0x4ce8e4;}else if(_0x22bb1c&&_0x4d9c06){_0x173a69=_0x4ce8e4;}}_0x1cb944=_0x180171;}if(!(_0x22bb1c&&_0x4d9c06))throw new Error(_0xf1c9('0xfc')+_0x4724c2);var _0x4b9a7d={};_0x4b9a7d[_0xf1c9('0x26')]=_0x22bb1c;_0x4b9a7d[_0xf1c9('0x29')]=_0x4d9c06;if(_0x173a69){_0x4b9a7d[_0xf1c9('0x87')]=_0x173a69;}return _0x4b9a7d;}return Hi[_0xf1c9('0xb')][_0xf1c9('0x83')](_0x4724c2);}else{if(_0x4724c2[_0xf1c9('0x28')](_0xf1c9('0x26'))||_0x4724c2[_0xf1c9('0x28')](_0xf1c9('0x34'))){var _0x33ea4a=JSON[_0xf1c9('0x88')](JSON[_0xf1c9('0x81')](_0x4724c2));if(_0x4724c2['hasOwnProperty']('controller')){_0x33ea4a['controller']=_0x4724c2[_0xf1c9('0x26')];delete _0x33ea4a[_0xf1c9('0x26')];}if(_0x4724c2[_0xf1c9('0x28')](_0xf1c9('0x34'))){_0x33ea4a[_0xf1c9('0x29')]=_0x4724c2['view'];delete _0x33ea4a[_0xf1c9('0x34')];}return _0x33ea4a;}return _0x4724c2;}};Hi[_0xf1c9('0xb')][_0xf1c9('0xfd')]=function(_0x8fdda3){return Hi[_0xf1c9('0xb')][_0xf1c9('0x85')](_0x8fdda3);};Hi['$frontiers']={};Hi[_0xf1c9('0x17')][_0xf1c9('0x18')]=function(){var _0x3a7dd6={'obj':![],'prop':![],'callback':![]};var _0x1c4595=undefined;var _0x5b6cd7=undefined;var _0x1e01f9=undefined;var _0x531665=undefined;var _0x4d8dda=undefined;var _0x5ac485=undefined;var _0x5a7236=undefined;var _0x746852=undefined;var _0x4872de=function(_0x2e444c){if(__[_0xf1c9('0x28')](_0xf1c9('0x17'))){if(__[_0xf1c9('0x17')][_0xf1c9('0x28')](_0x2e444c))return __[_0xf1c9('0x17')][_0x2e444c];}return undefined;};var _0x3bb4df=function(){if(__[_0xf1c9('0x28')](_0xf1c9('0x17'))){return __[_0xf1c9('0x17')];}return undefined;};this[_0xf1c9('0xfe')]=function(_0x24480a){_0x746852=_0x24480a;};this[_0xf1c9('0x16')]=function(_0x5c5c4e){if(typeof _0x3a7dd6[_0xf1c9('0xff')]==_0xf1c9('0x45'))_0x3a7dd6[_0xf1c9('0xff')][_0xf1c9('0x46')](this,_0x5c5c4e);this[_0xf1c9('0x100')]();};this[_0xf1c9('0x100')]=function(){if(typeof _0x5a7236==_0xf1c9('0x45'))_0x5a7236[_0xf1c9('0x46')](this);else{var _0x1b798b=_0x4872de(_0xf1c9('0x101'));if(typeof _0x1b798b!=_0xf1c9('0x14')){_0x1b798b[_0xf1c9('0x46')](_0x3bb4df(),this);}}};this[_0xf1c9('0x102')]=function(_0x10e017){if(typeof _0x5ac485==_0xf1c9('0x45')){_0x5ac485['call'](this,_0x10e017);}else{var _0xb94d6f=_0x4872de(_0xf1c9('0x103'));if(typeof _0xb94d6f!='undefined'){_0xb94d6f['call'](_0x3bb4df(),this,_0x10e017);}}this['_setRequestFinished']();};this[_0xf1c9('0x1a')]=function(){var _0x5c7b25=_0x4872de(_0xf1c9('0x104'));var _0x38391b=_0x4872de(_0xf1c9('0x103'));if(typeof _0x5b6cd7==_0xf1c9('0x45')){_0x5b6cd7['call'](this);}else if(_0x5c7b25=='function'){_0x5c7b25[_0xf1c9('0x46')](_0x3bb4df(),this);}else if(typeof _0x5ac485==_0xf1c9('0x45')){this[_0xf1c9('0x102')](0x198);}else if(typeof _0x38391b==_0xf1c9('0x45')){_0x38391b[_0xf1c9('0x46')](_0x3bb4df(),this,0x198);}this[_0xf1c9('0x100')]();};this['_setForbidden']=function(){var _0x40d718=_0x4872de(_0xf1c9('0x1b'));var _0x15460a=_0x4872de(_0xf1c9('0x103'));if(typeof _0x1c4595==_0xf1c9('0x45')){_0x1c4595['call'](this);}else if(typeof _0x40d718==_0xf1c9('0x45')){_0x40d718[_0xf1c9('0x46')](_0x3bb4df(),this);}else if(typeof _0x5ac485=='function'){this[_0xf1c9('0x102')](0x193);}else if(typeof _0x15460a==_0xf1c9('0x45')){_0x15460a[_0xf1c9('0x46')](_0x3bb4df(),0x193);}this[_0xf1c9('0x100')]();};this['_setInterrupted']=function(){var _0xc22a16=_0x4872de('interrupted');var _0x5d2f4c=_0x4872de('catch');if(typeof _0x531665==_0xf1c9('0x45')){_0x531665[_0xf1c9('0x46')](this);}else if(typeof _0xc22a16==_0xf1c9('0x45')){_0xc22a16['call'](_0x3bb4df(),this);}else if(typeof _0x5ac485==_0xf1c9('0x45')){this[_0xf1c9('0x102')](0x1c4);}else if(typeof _0x5d2f4c==_0xf1c9('0x45')){_0x5d2f4c[_0xf1c9('0x46')](_0x3bb4df(),this,0x1c4);}this[_0xf1c9('0x100')]();};this[_0xf1c9('0x105')]=function(){var _0x347ab1=_0x4872de(_0xf1c9('0x1d'));var _0x1c5bba=_0x4872de(_0xf1c9('0x103'));if(typeof _0x4d8dda==_0xf1c9('0x45')){_0x4d8dda[_0xf1c9('0x46')](this);}else if(typeof _0x347ab1=='function'){_0x347ab1[_0xf1c9('0x46')](_0x3bb4df(),this);}else if(typeof _0x5ac485=='function'){this[_0xf1c9('0x102')](0x1ad);}else if(typeof _0x1c5bba==_0xf1c9('0x45')){_0x5ac485['call'](_0x3bb4df(),this,0x1ad);}this['_setRequestFinished']();};this[_0xf1c9('0x19')]=function(_0x2b4f1f){var _0x3e9ef4=_0x4872de(_0xf1c9('0x103'));if(typeof _0x5ac485==_0xf1c9('0x45')){_0x5ac485[_0xf1c9('0x46')](this,_0x2b4f1f);}else if(typeof _0x3e9ef4==_0xf1c9('0x45')){_0x3e9ef4[_0xf1c9('0x46')](_0x3bb4df(),this,_0x2b4f1f);}this[_0xf1c9('0x100')]();};this[_0xf1c9('0x106')]=function(_0x5dd141){if(typeof _0x5dd141==_0xf1c9('0x45')){_0x3a7dd6['callback']=_0x5dd141;}else{throw new Error('Wrong\x20parameters');}return this;};this[_0xf1c9('0x101')]=function(_0x2e266f){if(typeof _0x2e266f==_0xf1c9('0x45')){_0x5a7236=_0x2e266f;}else{throw new Error(_0xf1c9('0x107'));}return this;};this['run']=function(){};this['do']=function(){this[_0xf1c9('0x66')]();};this['forbidden']=function(_0x3b29b8){if(typeof _0x3b29b8!=_0xf1c9('0x45'))throw new Error(_0xf1c9('0x107'));_0x1c4595=_0x3b29b8;return this;};this[_0xf1c9('0x104')]=function(_0x5a2aab){if(typeof _0x5a2aab!=_0xf1c9('0x45'))throw new Error(_0xf1c9('0x107'));_0x5b6cd7=_0x5a2aab;return this;};this[_0xf1c9('0x108')]=function(_0x47fbc){if(typeof _0x47fbc!=_0xf1c9('0x45'))throw new Error(_0xf1c9('0x107'));_0x531665=_0x47fbc;return this;};this[_0xf1c9('0x1d')]=function(_0x4c3237){if(typeof _0x4c3237!=_0xf1c9('0x45'))throw new Error(_0xf1c9('0x107'));_0x4d8dda=_0x4c3237;return this;};this[_0xf1c9('0x103')]=function(_0x5a6543){if(typeof _0x5a6543!=_0xf1c9('0x45'))throw new Error(_0xf1c9('0x107'));_0x5ac485=_0x5a6543;return this;};this['getRequest']=function(){return _0x746852;};};var Upload=function(_0x425056,_0x2e0bca){if(typeof _0x425056!==_0xf1c9('0x43')||typeof _0x2e0bca!==_0xf1c9('0x58'))throw new Error(_0xf1c9('0x109'));this[_0xf1c9('0x4c')]=_0x425056;this[_0xf1c9('0x65')]=_0x2e0bca;this[_0xf1c9('0x10a')]=function(){return this['name'];};this[_0xf1c9('0x10b')]=function(){return this[_0xf1c9('0x65')];};this[_0xf1c9('0x44')]=function(){return this['files'][_0xf1c9('0x44')];};};Hi[_0xf1c9('0x10c')]=function(_0x1764ee){Hi['$ui']['js'][_0xf1c9('0x78')]=_0x1764ee;};Hi[_0xf1c9('0x1f')]=function(_0x54c948){jQuery[_0xf1c9('0x10d')](_0x54c948,Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x78')]);Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x78')]=_0x54c948;};Hi['redirect']=Hi[_0xf1c9('0xb')][_0xf1c9('0x48')];Hi[_0xf1c9('0xbd')]=function(_0x54962b,_0x12134f){if(typeof _0x12134f!=_0xf1c9('0x14')){var _0x3e0b76=Hi[_0xf1c9('0xb')]['resolveRoute'](_0x54962b);_0x3e0b76[_0xf1c9('0x87')]=_0x12134f;var _0x54962b=Hi[_0xf1c9('0xb')][_0xf1c9('0x85')](_0x3e0b76);document[_0xf1c9('0xba')][_0xf1c9('0xbb')](_0x54962b);}else{document[_0xf1c9('0xba')][_0xf1c9('0xbb')](App[_0xf1c9('0xec')]+_0x54962b);}};Hi[_0xf1c9('0x4e')]=Hi[_0xf1c9('0xb')]['navigateTo'];Hi[_0xf1c9('0x34')]=function(_0x200786){var _0x48b21b=Hi[_0xf1c9('0xb')]['nextControllerInfo'];var _0x1c30c3=Hi[_0xf1c9('0xb')][_0xf1c9('0x22')](_0x48b21b);_0x200786[_0xf1c9('0xa7')]=_0x1c30c3;Hi[_0xf1c9('0x9')]['js'][_0xf1c9('0x9f')](_0x48b21b[_0xf1c9('0x26')],_0x48b21b[_0xf1c9('0x29')],_0x200786);};String[_0xf1c9('0x10e')][_0xf1c9('0x10f')]=function(_0x3a051f){return this[_0xf1c9('0x6c')](_0x3a051f)===0x0;};Array['prototype'][_0xf1c9('0xe0')]=function(_0xbb5d78){var _0x22512b=this;var _0x357fea=_0x22512b[_0xf1c9('0x6c')](_0xbb5d78);if(_0x357fea>-0x1){_0x22512b['splice'](_0x357fea,0x1);}};window[_0xf1c9('0x110')]=function(_0x185f04){if(typeof App==_0xf1c9('0x14'))return;var _0x4507e9=App[_0xf1c9('0xec')];var _0x4d6214=window['location']['toString']();if(_0x4d6214[_0xf1c9('0x10f')](_0x4507e9)){var _0xbd9472=_0x4d6214[_0xf1c9('0x111')](_0x4d6214['length']-0x1);if(_0xbd9472=='#'){return;}var _0x5687df=_0x4d6214['replace'](App[_0xf1c9('0xec')],'');Hi[_0xf1c9('0xb')][_0xf1c9('0xdb')](_0x5687df);}};Hi[_0xf1c9('0xc5')]={};Hi[_0xf1c9('0xc5')][_0xf1c9('0x112')]={};Hi[_0xf1c9('0xc5')][_0xf1c9('0xc6')]=function(){delete Hi[_0xf1c9('0xc5')]['exported'];Hi['i18n'][_0xf1c9('0x112')]={};if(typeof $i18nTemplateBundle!=_0xf1c9('0x14')){Hi['i18n'][_0xf1c9('0xc7')]($i18nTemplateBundle);}if(typeof $i18nBundle!='undefined'){Hi[_0xf1c9('0xc5')][_0xf1c9('0xc7')]($i18nBundle);}};Hi[_0xf1c9('0xc5')][_0xf1c9('0xc7')]=function(_0x6edef9){for(var _0x40ac9e in _0x6edef9){if(_0x6edef9[_0xf1c9('0x28')](_0x40ac9e)){Hi[_0xf1c9('0xc5')][_0xf1c9('0x112')][_0x40ac9e]=_0x6edef9[_0x40ac9e];}}};Hi[_0xf1c9('0xc5')][_0xf1c9('0x75')]=function(){Hi[_0xf1c9('0xc5')][_0xf1c9('0xc6')]();};Hi['i18n'][_0xf1c9('0x87')]=function(_0x54f5b6){if(!Hi[_0xf1c9('0xc5')][_0xf1c9('0x112')][_0xf1c9('0x28')](_0x54f5b6))return![];return Hi[_0xf1c9('0xc5')][_0xf1c9('0x112')][_0x54f5b6];};Hi['i18n'][_0xf1c9('0x113')]=function(_0x2154b8,_0x11029d){for(var _0x40b238 in _0x11029d){var _0x22e28a='{{'+_0x40b238+'}}';var _0x4f36eb=_0x11029d[_0x40b238];_0x2154b8=_0x2154b8[_0xf1c9('0xd0')](_0x22e28a)['join'](_0x4f36eb);}return _0x2154b8;};Hi[_0xf1c9('0xc5')][_0xf1c9('0x114')]=function(_0x1b8135){this[_0xf1c9('0x115')]=function(_0x4db438){return Hi['i18n'][_0xf1c9('0x113')](_0x1b8135,_0x4db438);};};Hi[_0xf1c9('0xc5')]['isExpression']=function(_0x4e64de){return _0x4e64de[_0xf1c9('0x6c')]('{{')!=-0x1&&_0x4e64de[_0xf1c9('0x6c')]('}}')!=-0x1;};function translate(_0x4d68c4,_0x591f82){var _0x499f2d=_0x4d68c4;if(typeof _0x591f82!=_0xf1c9('0x14'))_0x499f2d=_0x591f82;var _0x383fdb=Hi[_0xf1c9('0xc5')][_0xf1c9('0x87')](_0x499f2d);if(!_0x383fdb){if(Hi[_0xf1c9('0xc5')]['isExpression'](_0x4d68c4))return new Hi[(_0xf1c9('0xc5'))][(_0xf1c9('0x114'))](_0x4d68c4);return _0x4d68c4;}if(Hi[_0xf1c9('0xc5')]['isExpression'](_0x383fdb))return new Hi[(_0xf1c9('0xc5'))]['ExpressionPromise'](_0x383fdb);return _0x383fdb;}function __t(_0x2487f7,_0x154058){return translate(_0x2487f7,_0x154058);}var $fiis={};var fMx=function(_0x47e371,_0x55251c,_0x172403,_0xc154f1,_0x5e49e,_0x26c087,_0x4cbe0c,_0x2ab64e){var _0x58ed33=![];if(_0x2ab64e[_0xf1c9('0x44')]>0x0){for(var _0x283933 in _0x2ab64e){var _0x59c722=_0x2ab64e[_0x283933];if(Upload[_0xf1c9('0x10e')][_0xf1c9('0x116')](_0x59c722)){_0x58ed33=!![];break;}}}var _0x59dcb0=new Hi[(_0xf1c9('0x17'))]['Promise']();if($fiis['hasOwnProperty'](_0xc154f1)){if(_0x5e49e){if(_0x26c087){if(_0x4cbe0c){$fiis[_0xc154f1][_0xf1c9('0xe2')]();}else return new Hi[(_0xf1c9('0x17'))][(_0xf1c9('0x117'))]();}else{if(JSON[_0xf1c9('0x81')](_0x47e371)==$fiis[_0xc154f1][_0xf1c9('0x118')]){if(_0x4cbe0c){$fiis[_0xc154f1][_0xf1c9('0xe2')]();}else return new Hi[(_0xf1c9('0x17'))][(_0xf1c9('0x18'))]();}}}}var _0x42614b={'success':function(_0x10cf2a){if(_0x10cf2a[_0xf1c9('0x28')](_0xf1c9('0xea'))){var _0x1e31a9=_0x10cf2a[_0xf1c9('0xea')];for(var _0x1b411d in _0x1e31a9){var _0x547c5e=_0x1e31a9[_0x1b411d];Hi['$ui']['js'][_0xf1c9('0xb6')][_0xf1c9('0x66')](_0x1b411d,_0x547c5e);}}if(_0x10cf2a['hasOwnProperty']('$root')){if(typeof __!=_0xf1c9('0x14')){for(var _0x20f76d in _0x10cf2a[_0xf1c9('0xc3')]){__[_0x20f76d]=_0x10cf2a[_0xf1c9('0xc3')][_0x20f76d];}__[_0xf1c9('0xb0')]();}}_0x59dcb0[_0xf1c9('0x16')](_0x10cf2a[_0xf1c9('0x13')]);},'error':function(_0x14cf31,_0x213084,_0x1d103e){var _0x3d907b=_0x14cf31[_0xf1c9('0x119')];var _0x12e7d6=undefined;try{var _0x9325d8=JSON[_0xf1c9('0x88')](_0x3d907b);if(_0x9325d8['hasOwnProperty'](_0xf1c9('0x5e'))&&_0x9325d8[_0xf1c9('0x28')](_0xf1c9('0x11a'))){_0x59dcb0[_0xf1c9('0x19')](_0x9325d8);return;}}catch(_0x538475){}if(_0x213084==_0xf1c9('0xe2')){_0x59dcb0[_0xf1c9('0x11b')]();}else if(_0x213084==_0xf1c9('0x104')){_0x59dcb0['_setTimedOut']();}else{switch(_0x14cf31[_0xf1c9('0xf9')]){case 0x193:_0x59dcb0['_setForbidden']();break;case 0x198:_0x59dcb0[_0xf1c9('0x1a')]();break;case 0x1a5:_0x59dcb0[_0xf1c9('0x11b')]();break;case 0x1ad:_0x59dcb0[_0xf1c9('0x105')]();break;default:_0x59dcb0[_0xf1c9('0x19')](0x1f4);break;}}},'complete':function(){delete $fiis[_0xc154f1];}};_0x42614b['method']=_0xf1c9('0x11c');_0x42614b[_0xf1c9('0xbc')]=_0x55251c;_0x42614b[_0xf1c9('0x11d')]={'csrfToken':App['csrfToken']};_0x42614b[_0xf1c9('0x11e')]=_0xf1c9('0x11f');_0x42614b[_0xf1c9('0x70')]=![];_0x42614b['timeout']=_0x172403;if(!_0x58ed33){_0x42614b[_0xf1c9('0xe9')]=JSON[_0xf1c9('0x81')](_0x47e371);}else{var _0x418119=new FormData();var _0x28ca08={};var _0x2b73bb={};for(var _0x525c48 in _0x2ab64e){var _0x59c722=_0x2ab64e[_0x525c48];if(Upload['prototype'][_0xf1c9('0x116')](_0x59c722)){var _0x4b4b54=_0x59c722[_0xf1c9('0x10a')]();_0x2b73bb[_0x4b4b54]=_0x59c722[_0xf1c9('0x44')]();_0x28ca08['arg'+_0x525c48]=_0xf1c9('0x120')+_0x4b4b54;var _0x3f15f9=_0x59c722[_0xf1c9('0x10b')]();for(var _0x1eba6e=0x0;_0x1eba6e<_0x3f15f9[_0xf1c9('0x44')];_0x1eba6e++)_0x418119[_0xf1c9('0x4b')](_0x4b4b54+_0xf1c9('0x121')+_0x1eba6e,_0x3f15f9[_0x1eba6e]);}else{if(typeof _0x59c722!=_0xf1c9('0x45'))_0x28ca08[_0xf1c9('0x122')+_0x525c48]=_0x59c722;}}_0x418119[_0xf1c9('0x4b')]('$uploads',JSON[_0xf1c9('0x81')](_0x2b73bb));_0x418119[_0xf1c9('0x4b')](_0xf1c9('0x123'),JSON[_0xf1c9('0x81')](_0x28ca08));_0x42614b[_0xf1c9('0x124')]=![];_0x42614b['contentType']=![];_0x42614b[_0xf1c9('0xe9')]=_0x418119;}var _0x588441=$[_0xf1c9('0xf7')](_0x42614b);_0x59dcb0['_setRequest'](_0x588441);_0x588441[_0xf1c9('0x118')]=JSON[_0xf1c9('0x81')](_0x47e371);$fiis[_0xc154f1]=_0x588441;return _0x59dcb0;}; \ No newline at end of file +var _0x24a4=['Invalid\x20value\x20set\x20for\x20property\x20Hi.$config.angular.modules','push','module','fireBeforeRun','app','deploy-id-','base64_url','cache','destroy','deployId','deployMode','i18n','init','injector','$compile','$startedUp','root','$init','$injector','concat','invoke','$startup\x20function\x20is\x20undefined','$inject','$rootScope','initialize','hi_cache_regs','stringify','getNamedRoute','getTextViewPath','getURL','get','storeView','getStorageKey','hi-app-views-','updateCache','getCache','parse','
','find','.hi','remove','normalizePath','Caching\x20view\x20of\x20path\x20<','substr','stores','setTitle','title','getTitle','controllers','loadedControllers','wasControllerLoaded','getViewController','setViewController','$new','$startup','fireBeforeView','setScopeProps','$preLoad','$onPreLoad','$route','setLocation','$postLoad','proceed','$onClose','$activeView','$view','#view_content','isGoingBack','$apply','$onPostLoad','$onRedirectFinish','$preventClose','$close','Invalid\x20active\x20view\x20object','commands','all','set','$reload','url','location','replace','reload','$url','value','$reloadLanguage','$redirect','redirect','$root','$dictionary','export','__t','strip','ucfirst','toUpperCase','toLowerCase','split','substring','getKidProperties','lcfirst','explode','valueOf','goto','Hi.$nav.navigateTo(\x27','\x27);','onClick','getViewPath','routeBack','navigateTo','history','last','newNamedRoute','namedRoutes','setActivePath','getPreviousPath','removeVal','active','abort','$onRedirectStart','dialog','Ignore-View','Ignore-Js','true','embedded','response','Request\x20to\x20server\x20returned\x20an\x20unexpected\x20result','data','$invoke','view','fetch','createViewScope','base_url','encodeGetParams','URLToJson','currentPage','currentRoute','pushState','resetLocation','replaceState','random','isSameRoute','requestData','AJAX_MVC','ajax','$onRedirectError','status','responseText','nextControllerInfo','setNextControllerInfo','Invalid\x20route\x20supplied\x20:\x20','toSlashes','_setRequest','callback','_setRequestFinished','finally','_setHttpError','catch','_setTimedOut','_setExpired','_setInterrupted','interrupted','_setOverRequest','_setException','try','Wrong\x20parameters','getRequest','Invalid\x20params\x20supplied\x20to\x20Upload\x20class\x20constructor','getName','getFiles','files','rootTemplate','extend','prototype','splice','onpopstate','toString','startsWith','exported','reset','format','join','with','isExpression','ExpressionPromise','isPrototypeOf','Promisse','$params','details','method','dataType','json','$$$upload:','_file_','$uploads','$args','contentType','$template','$angular','$config','nav','changeLocation','debugLogs','error','angular','$ui','html','$nav','$util','$test','configs','frontiers','delay','evalTimeout','result','undefined','success','Promise','_setResult','timeout','forbidden','$frontiers','_setForbidden','overrequest','MockTemplate','template','ViewTestPromise','route','resolveRoute','receptor','gettable','markup','controller','scope','hasOwnProperty','No\x20controller\x20and\x20action\x20names\x20detected.\x20Suspending\x20preparation','viewHtml','build','action','warn','No\x20scope\x20returned\x20to\x20receptor','$embed','withHtml','directives','aload','asrc','err','onload','src','onerror','attr','$observe','name','embed','onready','onfail','string','function','call','onError','$element','element','empty','append','$eval','ajaxify','removeAttr','href','click','javascript:void(0)','bind','directivesDefiner','angularModule','setModule','define','object','directive','Angular\x20directives\x20could\x20not\x20defined.\x20No\x20valid\x20angular\x20module\x20supplied','ngUpload','trim','length','Invalid\x20upload\x20name\x20:\x20','type','The\x20type\x20property\x20is\x20missing\x20on\x20the\x20upload\x20element\x20with\x20name\x20\x27','The\x20upload\x20element\x20with\x20name\x20\x27','\x27\x20must\x20be\x20of\x20type\x20\x22file\x22','onfiles','target','run','isArray','modules','debug','Injecting\x20the\x20following\x20modules\x20to\x20Hi\x20Application\x20:\x20','No\x20modules\x20to\x20be\x20injected\x20to\x20Hi\x20Application','No\x20run\x20function\x20for\x20Hi\x20Application','indexOf'];(function(_0x467335,_0x4bbaeb){var _0x3010e2=function(_0x58650a){while(--_0x58650a){_0x467335['push'](_0x467335['shift']());}};_0x3010e2(++_0x4bbaeb);}(_0x24a4,0xc3));var _0x3441=function(_0x40fbb4,_0x137568){_0x40fbb4=_0x40fbb4-0x0;var _0x652484=_0x24a4[_0x40fbb4];return _0x652484;};var __={};var Hi={};Hi[_0x3441('0x0')]=undefined;Hi['$view']=undefined;Hi[_0x3441('0x1')]={};Hi[_0x3441('0x2')]={};Hi['$config'][_0x3441('0x3')]={};Hi[_0x3441('0x2')][_0x3441('0x3')][_0x3441('0x4')]=!![];Hi['$config'][_0x3441('0x5')]=![];var Log={};Log['debug']=function(_0x4f0eaf){if(Hi['$config'][_0x3441('0x5')])console[_0x3441('0x6')](_0x4f0eaf);};Hi[_0x3441('0x2')]['ui']={};Hi['$config'][_0x3441('0x7')]={};Hi[_0x3441('0x8')]={};Hi['$ui'][_0x3441('0x9')]={};Hi['$ui']['js']={};Hi[_0x3441('0xa')]={};Hi[_0x3441('0xb')]={};Hi[_0x3441('0xc')]={};Hi[_0x3441('0xc')][_0x3441('0xd')]={};Hi[_0x3441('0xc')][_0x3441('0xd')][_0x3441('0xe')]={};Hi[_0x3441('0xc')]['configs']['frontiers'][_0x3441('0xf')]=0x0;Hi[_0x3441('0xc')][_0x3441('0xd')]['frontiers'][_0x3441('0x10')]=0x32;Hi[_0x3441('0xc')]['getMockCallTimeout']=function(){var _0x57cafb=Hi[_0x3441('0xc')]['configs'][_0x3441('0xe')]['delay'];var _0x4e48a1=Hi[_0x3441('0xc')][_0x3441('0xd')][_0x3441('0xe')][_0x3441('0x10')];if(_0x57cafb>0x0)return _0x57cafb;return _0x4e48a1;};Hi[_0x3441('0xc')]['MockCall']=function(_0x1b5497){this[_0x3441('0x11')]=function(_0x70225a){var _0x34e619=Hi[_0x3441('0xc')]['getMockCallTimeout']();if(typeof _0x1b5497!=_0x3441('0x12')&&_0x1b5497>0x0)_0x34e619=_0x1b5497;setTimeout(_0x70225a,_0x34e619);};this[_0x3441('0x13')]=function(_0x458b7e){var _0x178a71=new Hi['$frontiers'][(_0x3441('0x14'))]();this[_0x3441('0x11')](function(){_0x178a71[_0x3441('0x15')](_0x458b7e);});return _0x178a71;};this['error']=function(_0x3144f0){var _0x30ae3c=new Hi['$frontiers'][(_0x3441('0x14'))]();this[_0x3441('0x11')](function(){_0x30ae3c['_setException'](_0x3144f0);});return _0x30ae3c;};this[_0x3441('0x16')]=function(){var _0x3486cc=new Hi['$frontiers'][(_0x3441('0x14'))]();this[_0x3441('0x11')](function(){_0x3486cc['_setTimedOut']();});return _0x3486cc;};this[_0x3441('0x17')]=function(){var _0x54c8d1=new Hi[(_0x3441('0x18'))][(_0x3441('0x14'))]();this[_0x3441('0x11')](function(){_0x54c8d1[_0x3441('0x19')]();});return _0x54c8d1;};this[_0x3441('0x1a')]=function(){var _0x30af6d=new Hi[(_0x3441('0x18'))]['Promise']();this[_0x3441('0x11')](function(){_0x30af6d['_setOverRequest']();});return _0x30af6d;};};Hi[_0x3441('0xc')][_0x3441('0x1b')]=function(_0x2220e7){Hi[_0x3441('0x1c')](_0x2220e7);};Hi[_0x3441('0xc')][_0x3441('0x1d')]=function(_0x1da5c7){this[_0x3441('0x1e')]=Hi['$nav'][_0x3441('0x1f')](_0x1da5c7);this[_0x3441('0x20')]={};this[_0x3441('0x21')]={};this[_0x3441('0x21')]['html']=function(){return this[_0x3441('0x20')][_0x3441('0x22')];};this[_0x3441('0x21')][_0x3441('0x23')]=function(){return this['receptor'][_0x3441('0x24')];};if(!(this[_0x3441('0x1e')]['hasOwnProperty'](_0x3441('0x23'))&&this[_0x3441('0x1e')][_0x3441('0x25')]('action'))){console['warn'](_0x3441('0x26'));this[_0x3441('0x21')]=![];}this[_0x3441('0x27')]='';this[_0x3441('0x28')]=function(){Hi[_0x3441('0x2')][_0x3441('0x3')][_0x3441('0x4')]=![];if(!this[_0x3441('0x21')])return![];var _0x2db584=Hi[_0x3441('0xa')]['getViewPath'](this[_0x3441('0x1e')][_0x3441('0x23')],this[_0x3441('0x1e')][_0x3441('0x29')]);Hi['$ui']['js']['createViewScope'](_0x2db584,{},this[_0x3441('0x27')],![],this['receptor'],![],undefined);if(!this[_0x3441('0x20')]['hasOwnProperty'](_0x3441('0x24'))){console[_0x3441('0x2a')](_0x3441('0x2b'));return![];}this['receptor'][_0x3441('0x24')][_0x3441('0x2c')]=function(){};this[_0x3441('0x21')][_0x3441('0x20')]=this[_0x3441('0x20')];return this['gettable'];};this[_0x3441('0x2d')]=function(_0x2a26d5){this[_0x3441('0x27')]=_0x2a26d5;return this;};};Hi[_0x3441('0xc')]['view']=function(_0x3c6493){return new Hi[(_0x3441('0xc'))][(_0x3441('0x1d'))](_0x3c6493);};Hi[_0x3441('0x1')][_0x3441('0x2e')]={};Hi[_0x3441('0x1')]['directives'][_0x3441('0x2f')]=function(){return{'restrict':'A','link':function(_0x1c9fbe,_0x2a3989,_0x15c0ca){var _0x4cfc6e=new Image();var _0x4abff4=![];var _0x5d797e=![];var _0x29190b=![];if(_0x15c0ca[_0x3441('0x25')](_0x3441('0x30'))){_0x4abff4=_0x15c0ca[_0x3441('0x30')];}else{return;}var _0x341322=function(){_0x5d797e=_0x15c0ca[_0x3441('0x2f')];_0x29190b=_0x5d797e;if(_0x15c0ca['hasOwnProperty']('err')){_0x29190b=_0x15c0ca[_0x3441('0x31')];}$(_0x2a3989)['attr']('src',_0x5d797e);var _0x4cfc6e=new Image();_0x4cfc6e[_0x3441('0x32')]=function(){$(_0x2a3989)['attr'](_0x3441('0x33'),_0x4abff4);};_0x4cfc6e[_0x3441('0x34')]=function(){$(_0x2a3989)[_0x3441('0x35')]('src',_0x29190b);};_0x4cfc6e[_0x3441('0x33')]=_0x4abff4;};_0x341322();_0x15c0ca[_0x3441('0x36')]('asrc',function(_0x199c38){if(typeof _0x199c38!=_0x3441('0x12')){_0x4abff4=_0x15c0ca['asrc'];_0x341322();}});}};};Hi[_0x3441('0x1')][_0x3441('0x2e')]['view']=function(){return{'restrict':'E','scope':![],'link':function(_0x56901a,_0x3a3d34,_0x23c138){var _0x51f862=![];if(!_0x23c138[_0x3441('0x25')](_0x3441('0x37')))throw new Error('No\x20name\x20attribute\x20defined\x20on\x20view\x20element');if(_0x23c138[_0x3441('0x25')](_0x3441('0x38')))_0x51f862=_0x23c138[_0x3441('0x38')];var _0x328bbf='onbusy';var _0x3340af=![];if(_0x23c138['hasOwnProperty'](_0x328bbf))_0x3340af=_0x23c138[_0x328bbf];var _0x568fee=_0x3441('0x39');var _0x26950a=![];if(_0x23c138[_0x3441('0x25')](_0x568fee))_0x26950a=_0x23c138[_0x568fee];var _0x46b7cc=_0x3441('0x3a');var _0x10a05f=![];if(_0x23c138[_0x3441('0x25')](_0x46b7cc))_0x10a05f=_0x23c138[_0x46b7cc];var _0x73ae04=function(_0x51f862,_0x35e2b6,_0x3e4f3d,_0x4050d8){if(typeof _0x51f862!=_0x3441('0x3b')||_0x51f862['length']<0x1)throw new Error('URL\x20is\x20now\x20valid');if(typeof _0x4050d8==_0x3441('0x3c'))_0x4050d8[_0x3441('0x3d')](_0x56901a);var _0x4d06eb={};_0x4d06eb[_0x3441('0x3e')]=function(){if(typeof _0x3e4f3d==_0x3441('0x3c'))_0x3e4f3d[_0x3441('0x3d')](_0x56901a);};try{Hi[_0x3441('0xa')]['navigateTo'](_0x51f862,![],!![],function(_0x5cb948){_0x5cb948[_0x3441('0x24')][_0x3441('0x3f')]=_0x5cb948[_0x3441('0x40')];_0x5cb948[_0x3441('0x24')][_0x3441('0x2c')]=_0x73ae04;_0x56901a[_0x23c138[_0x3441('0x37')]]=_0x5cb948[_0x3441('0x24')];_0x56901a['$applyAsync'](function(){$(_0x3a3d34)[_0x3441('0x41')]();$(_0x3a3d34)[_0x3441('0x42')](_0x5cb948[_0x3441('0x40')]);if(typeof _0x35e2b6=='function')_0x35e2b6[_0x3441('0x3d')]();});},_0x56901a,_0x4d06eb);}catch(_0x3d752b){if(typeof _0x3e4f3d==_0x3441('0x3c'))_0x3e4f3d[_0x3441('0x3d')](_0x56901a);}};if(!_0x51f862)_0x56901a[_0x23c138['name']]={'$embed':_0x73ae04};else _0x73ae04(_0x51f862,function(){if(typeof _0x26950a==_0x3441('0x3b'))_0x56901a[_0x3441('0x43')](_0x26950a);},function(){if(typeof _0x10a05f=='string')_0x56901a['$eval'](_0x10a05f);},function(){if(typeof _0x3340af==_0x3441('0x3b'))_0x56901a['$eval'](_0x3340af);});}};};Hi['$angular']['directives'][_0x3441('0x44')]=function(){return{'restrict':'A','link':function(_0x438ca8,_0x175ceb,_0x362be1){$(_0x175ceb)[_0x3441('0x45')](_0x3441('0x44'));if(_0x362be1[_0x3441('0x46')]){var _0x298cf4=_0x362be1[_0x3441('0x46')];var _0x225e9b=_0x3441('0x47');$(_0x175ceb)['attr'](_0x3441('0x46'),_0x3441('0x48'));if(_0x362be1['on']){_0x225e9b=_0x362be1['on'];$(_0x175ceb)['removeAttr']('on');}Hi[_0x3441('0xa')][_0x3441('0x49')]($(_0x175ceb),_0x298cf4,_0x225e9b);}}};};Hi['$angular'][_0x3441('0x4a')]=function(_0x1d67d0){this[_0x3441('0x4b')]=_0x1d67d0;this[_0x3441('0x4c')]=function(_0x284dd6){this[_0x3441('0x4b')]=_0x284dd6;};this[_0x3441('0x4d')]=function(){if(typeof this[_0x3441('0x4b')]==_0x3441('0x4e')){if(typeof this[_0x3441('0x4b')][_0x3441('0x4f')]!=_0x3441('0x3c')){throw new Error(_0x3441('0x50'));}}for(var _0x3fafa1 in Hi[_0x3441('0x1')][_0x3441('0x2e')]){var _0x1e6d9c=Hi[_0x3441('0x1')][_0x3441('0x2e')][_0x3fafa1];this[_0x3441('0x4b')][_0x3441('0x4f')](_0x3fafa1,_0x1e6d9c);}};};Hi[_0x3441('0x1')][_0x3441('0x2e')][_0x3441('0x51')]=function(_0x288c0a){return{'restrict':'A','scope':![],'link':function(_0x240bb3,_0x3b1c23,_0x90048d){var _0x549afb=_0x90048d[_0x3441('0x51')];var _0x201cf9=undefined;if(_0x549afb[_0x3441('0x52')]()[_0x3441('0x53')]<0x1){throw new Error(_0x3441('0x54')+_0x549afb);}if(!_0x90048d[_0x3441('0x25')](_0x3441('0x55')))throw new Error(_0x3441('0x56')+_0x549afb+'\x27');if(_0x90048d[_0x3441('0x55')]!=='file')throw new Error(_0x3441('0x57')+_0x549afb+_0x3441('0x58'));if(_0x90048d[_0x3441('0x25')]('onfiles')){_0x201cf9=_0x288c0a(_0x90048d[_0x3441('0x59')]);}$(_0x3b1c23)['change'](function(_0x27ebfa){var _0x22cbf1=_0x27ebfa[_0x3441('0x5a')]['files'];var _0x3f02cf=new Upload(_0x549afb,_0x22cbf1);_0x491832(_0x3f02cf);_0x2b6a9a(_0x3f02cf);});var _0x491832=function(_0x4057b3){_0x240bb3[_0x549afb]=_0x4057b3;};var _0x2b6a9a=function(_0x2fd7d3){if(typeof _0x201cf9!=_0x3441('0x12'))_0x201cf9(_0x240bb3,{'upload':_0x2fd7d3});};}};};Hi[_0x3441('0x1')]['app']=![];Hi[_0x3441('0x1')][_0x3441('0x5b')]=function(){var _0x44a5d4=[];var _0x17e10e=![];if(Array[_0x3441('0x5c')](Hi[_0x3441('0x2')][_0x3441('0x7')][_0x3441('0x5d')])){_0x44a5d4=Hi[_0x3441('0x2')][_0x3441('0x7')][_0x3441('0x5d')];Log[_0x3441('0x5e')](_0x3441('0x5f'));Log[_0x3441('0x5e')](_0x44a5d4);}else{Log[_0x3441('0x5e')](_0x3441('0x60'));}if(typeof Hi[_0x3441('0x2')][_0x3441('0x7')][_0x3441('0x5b')]==_0x3441('0x3c')){_0x17e10e=Hi[_0x3441('0x2')]['angular'][_0x3441('0x5b')];}else{Log['debug'](_0x3441('0x61'));}if(Array[_0x3441('0x5c')](_0x44a5d4)){if(_0x44a5d4[_0x3441('0x62')]('ng')==-0x1)_0x44a5d4['push']('ng');}else{throw new Error(_0x3441('0x63'));}if(_0x44a5d4[_0x3441('0x53')]==0x0)_0x44a5d4[_0x3441('0x64')]('ng');var _0x5cfa1c=angular[_0x3441('0x65')]('hi',_0x44a5d4);if(typeof AppHooks!=_0x3441('0x12'))AppHooks[_0x3441('0x66')](_0x5cfa1c);var _0x216e6b=angular[_0x3441('0x65')](_0x3441('0x67'),['ng']);if(typeof AppHooks!=_0x3441('0x12'))AppHooks['fireSetupApp'](_0x216e6b);var _0x2dcc63=new Hi[(_0x3441('0x1'))]['directivesDefiner'](_0x5cfa1c);_0x2dcc63[_0x3441('0x4d')]();var _0x361ed2=function(_0x46e9ea,_0x94c322){if(typeof sessionStorage!=_0x3441('0x12')){if(typeof App=='undefined'){Hi[_0x3441('0x8')][_0x3441('0x9')]['cache']['on']=![];}else{var _0xfff8a0=![];if(sessionStorage[_0x3441('0x25')](_0x3441('0x68')+App[_0x3441('0x69')]))_0xfff8a0=sessionStorage['deploy-id-'+App[_0x3441('0x69')]];else{Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x6b')]();}if(_0xfff8a0){if(_0xfff8a0!=App['deployId']){Hi['$ui']['html']['cache'][_0x3441('0x6b')]();}}sessionStorage['deploy-id-'+App[_0x3441('0x69')]]=App[_0x3441('0x6c')];if(App[_0x3441('0x6d')]=='DEVELOPMENT')Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['on']=![];}}Hi[_0x3441('0x6e')][_0x3441('0x6f')]();Hi[_0x3441('0x1')]['$injector']=angular[_0x3441('0x70')](_0x44a5d4);Hi[_0x3441('0x1')][_0x3441('0x71')]=_0x94c322;__=_0x46e9ea;Hi['$template']=_0x46e9ea;__[_0x3441('0x72')]=![];for(var _0xb8b76a in Hi[_0x3441('0x8')]['js'][_0x3441('0x73')]){var _0x598653=Hi[_0x3441('0x8')]['js']['root'][_0xb8b76a];__[_0xb8b76a]=_0x598653;}if(__[_0x3441('0x25')](_0x3441('0x74'))){if(typeof __[_0x3441('0x74')]==_0x3441('0x3c')){__['$init'][_0x3441('0x3d')](__);}}Hi[_0x3441('0x1')][_0x3441('0x75')]=angular[_0x3441('0x70')]([_0x3441('0x67')][_0x3441('0x76')](_0x44a5d4));if(typeof App!=_0x3441('0x12')){if(typeof _0x17e10e==_0x3441('0x3c')){Hi[_0x3441('0x1')][_0x3441('0x75')][_0x3441('0x77')](_0x17e10e);}if(typeof $startup!=_0x3441('0x3c')){throw new Error(_0x3441('0x78'));}setTimeout(function(){$startup();},0x5);}};_0x361ed2[_0x3441('0x79')]=[_0x3441('0x7a'),_0x3441('0x71')];_0x5cfa1c[_0x3441('0x5b')](_0x361ed2);Hi['$angular'][_0x3441('0x67')]=_0x5cfa1c;};Hi[_0x3441('0x8')]['html'][_0x3441('0x6a')]={'on':!![]};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x7b')]=function(){try{if(sessionStorage){if(!sessionStorage[_0x3441('0x7c')]){sessionStorage[_0x3441('0x7c')]=JSON[_0x3441('0x7d')](new Array());}}}catch(_0x273099){return![];}};Hi[_0x3441('0x8')][_0x3441('0x9')]['prepareView']=function(_0x3f54ed){var _0x33b33f=![];if(typeof _0x3f54ed===_0x3441('0x3b')){_0x33b33f=Hi[_0x3441('0xa')][_0x3441('0x7e')](_0x3f54ed);}else{_0x33b33f=_0x3f54ed;}if(_0x33b33f){var _0x4775fa=Hi[_0x3441('0xa')][_0x3441('0x7f')](_0x33b33f['controller'],_0x33b33f[_0x3441('0x29')]);var _0x489b41=Hi[_0x3441('0xa')][_0x3441('0x80')](_0x33b33f);if(Hi[_0x3441('0x8')][_0x3441('0x9')]['cache']['stores'](_0x489b41)){return;}$[_0x3441('0x81')](_0x489b41,function(_0xf3f2d2){try{var _0x1fbbbd=JSON['parse'](_0xf3f2d2);var _0x1dd2a9=_0x1fbbbd[_0x3441('0x22')];Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x82')](_0x489b41,_0x1dd2a9);}catch(_0x1a1f10){}});}};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x83')]=function(){return _0x3441('0x84')+App['base64_url'];};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x85')]=function(_0x384fa1){if(typeof localStorage!=_0x3441('0x12')&&typeof _0x384fa1==_0x3441('0x4e')){localStorage[Hi[_0x3441('0x8')]['html']['cache']['getStorageKey']()]=JSON[_0x3441('0x7d')](_0x384fa1);}};Hi['$ui']['html'][_0x3441('0x6a')][_0x3441('0x86')]=function(){var _0x131b30={};if(typeof localStorage!=_0x3441('0x12')){var _0x4c845f=Hi['$ui'][_0x3441('0x9')][_0x3441('0x6a')]['getStorageKey']();if(localStorage[_0x3441('0x25')](_0x4c845f)){try{_0x131b30=JSON[_0x3441('0x87')](localStorage[_0x4c845f]);}catch(_0x126b0b){Log[_0x3441('0x5e')]('There\x20was\x20an\x20error\x20when\x20trying\x20to\x20parse\x20views\x20cache\x20JSON');}}}return _0x131b30;};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['destroy']=function(){if(typeof localStorage!=_0x3441('0x12')){Hi['$ui'][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x85')]({});}};Hi['$ui'][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x82')]=function(_0x6980e7,_0x1db124){if(!Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['on']){return![];}var _0x2e24e9=$(_0x3441('0x88'));_0x2e24e9[_0x3441('0x9')](_0x1db124);$(_0x2e24e9)[_0x3441('0x89')](_0x3441('0x8a'))[_0x3441('0x8b')]();var _0x6a3fbe=$(_0x2e24e9)[_0x3441('0x9')]();var _0x4c56f5=Hi['$ui']['html'][_0x3441('0x6a')][_0x3441('0x86')]();_0x4c56f5[Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x8c')](_0x6980e7)]=_0x6a3fbe;Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x85')](_0x4c56f5);Log['debug'](_0x3441('0x8d')+_0x6980e7+'>');};Hi[_0x3441('0x8')][_0x3441('0x9')]['cache'][_0x3441('0x8c')]=function(_0x5e6aa9){var _0xb9be90=_0x5e6aa9[_0x3441('0x62')]('?');if(_0xb9be90!=-0x1){return _0x5e6aa9[_0x3441('0x8e')](0x0,_0xb9be90);}return _0x5e6aa9;};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x8f')]=function(_0x15e3e3){if(!Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['on']){return![];}var _0x5eba59=Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x86')]();return _0x5eba59[_0x3441('0x25')](Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['normalizePath'](_0x15e3e3));};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['fetch']=function(_0x425cd2){var _0x9128d8=Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x86')]();return _0x9128d8[Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x8c')](_0x425cd2)];};Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x90')]=function(_0x3922ec){$(_0x3441('0x91'))[_0x3441('0x9')](_0x3922ec);};Hi['$ui'][_0x3441('0x9')][_0x3441('0x92')]=function(){return $(_0x3441('0x91'))[_0x3441('0x9')]();};Hi[_0x3441('0x8')]['js'][_0x3441('0x93')]={};Hi[_0x3441('0x8')]['js']['loadedControllers']=[];Hi[_0x3441('0x8')]['js']['setLoadedController']=function(_0x66f80a,_0x3b002e){Hi[_0x3441('0x8')]['js'][_0x3441('0x94')][_0x3441('0x64')](_0x66f80a+'/'+_0x3b002e);};Hi[_0x3441('0x8')]['js'][_0x3441('0x95')]=function(_0x3665da,_0x1b34c3){var _0x50cdb5=_0x3665da+'/'+_0x1b34c3;var _0x4fa59b=Hi[_0x3441('0x8')]['js'][_0x3441('0x94')][_0x3441('0x62')](_0x50cdb5);if(_0x4fa59b==-0x1){return![];}return!![];};Hi[_0x3441('0x8')]['js']['templatesParent']={};Hi[_0x3441('0x8')]['js'][_0x3441('0x96')]=function(_0x279c4f,_0x2cc03e){var _0x8d2345=Hi[_0x3441('0xa')][_0x3441('0x7f')](_0x279c4f,_0x2cc03e);if(Hi['$ui']['js'][_0x3441('0x93')][_0x3441('0x25')](_0x8d2345)){var _0x4a7fb2=Hi[_0x3441('0x8')]['js'][_0x3441('0x93')][_0x8d2345];return _0x4a7fb2;}else{return![];}};Hi[_0x3441('0x8')]['js'][_0x3441('0x97')]=function(_0x360e51,_0x168d93,_0x1b4c48){var _0x353764=Hi[_0x3441('0xa')][_0x3441('0x7f')](_0x360e51,_0x168d93);Hi[_0x3441('0x8')]['js']['controllers'][_0x353764]=_0x1b4c48;};Hi[_0x3441('0x8')]['js']['createViewScope']=function(_0x1cea4a,_0x20b184,_0x3b73cb,_0x18cbfc,_0x56fec3,_0x33f838,_0x59e5c5){var _0x3c414d=Hi[_0x3441('0x8')]['js'][_0x3441('0x96')](_0x1cea4a[_0x3441('0x23')],_0x1cea4a[_0x3441('0x29')]);if(typeof _0x3c414d=='undefined'){throw new Error('No\x20controller\x20defined.\x20Cant\x20prepare\x20context');return;}if(typeof _0x3c414d!=_0x3441('0x3c')){throw new Error('Invalid\x20view\x20controller');}var _0x2ba6c2=![];if(_0x18cbfc){if(typeof _0x33f838!=_0x3441('0x12')){_0x2ba6c2=_0x33f838[_0x3441('0x98')](![]);}else{_0x2ba6c2=__[_0x3441('0x98')](![]);}}else{if(!__[_0x3441('0x72')]&&__['hasOwnProperty'](_0x3441('0x99'))){if(typeof __[_0x3441('0x99')]==_0x3441('0x3c')){__['$startedUp']=!![];__[_0x3441('0x99')]['call'](__,{'controller':_0x1cea4a[_0x3441('0x23')],'action':_0x1cea4a[_0x3441('0x29')]});}}_0x2ba6c2=__[_0x3441('0x98')](!![]);}var _0x4ede20=Hi[_0x3441('0x1')][_0x3441('0x75')];var _0x2e7b5b={'_':_0x2ba6c2,'__':__,'$scope':_0x2ba6c2,'$rootScope':__,'template':__};var _0x1202ee=_0x1cea4a[_0x3441('0x23')]+'/'+_0x1cea4a[_0x3441('0x29')];if(typeof AppHooks!='undefined')AppHooks[_0x3441('0x9a')](_0x1202ee,_0x2ba6c2,_0x2e7b5b);_0x4ede20['invoke'](_0x3c414d,![],_0x2e7b5b);Hi[_0x3441('0x8')]['js'][_0x3441('0x9b')](_0x2ba6c2,_0x20b184);if(_0x2ba6c2['hasOwnProperty'](_0x3441('0x9c'))){var _0x110b84=_0x2ba6c2[_0x3441('0x9c')][_0x3441('0x3d')](_0x2ba6c2,_0x3b73cb);if(typeof _0x110b84!=_0x3441('0x12')){_0x3b73cb=_0x110b84;}}if(__[_0x3441('0x25')]('$onPreLoad')){if(typeof __[_0x3441('0x9d')]=='function'){var _0x110b84=__[_0x3441('0x9d')][_0x3441('0x3d')](__,_0x2ba6c2[_0x3441('0x9e')],_0x2ba6c2,_0x3b73cb);if(typeof _0x110b84!='undefined'){_0x3b73cb=_0x110b84;}}}var _0x53b1a1=Hi[_0x3441('0x1')][_0x3441('0x71')](_0x3b73cb);var _0x3473c8=_0x53b1a1(_0x2ba6c2);var _0x5d71e2=function(){var _0x439a13=Hi[_0x3441('0xa')][_0x3441('0x80')](_0x20b184[_0x3441('0x9e')]);var _0x3bc2fb=Hi[_0x3441('0xa')]['setActivePath'](_0x439a13);Hi[_0x3441('0xa')][_0x3441('0x9f')](_0x439a13,JSON[_0x3441('0x7d')]({'index':_0x3bc2fb}));};if(_0x56fec3&&_0x18cbfc){_0x56fec3['element']=_0x3473c8;_0x56fec3[_0x3441('0x24')]=_0x2ba6c2;_0x56fec3[_0x3441('0x22')]=_0x3b73cb;if(typeof _0x2ba6c2[_0x3441('0xa0')]!=_0x3441('0x12')){_0x2ba6c2['$postLoad'][_0x3441('0x3d')](_0x2ba6c2);}var _0x2f0341=Hi[_0x3441('0x2')][_0x3441('0x3')][_0x3441('0x4')];if(_0x18cbfc)_0x2f0341=![];if(_0x2f0341){_0x5d71e2();}return _0x56fec3;}var _0x432176={};_0x432176[_0x3441('0xa1')]=function(){if(__[_0x3441('0x25')](_0x3441('0xa2'))&&__[_0x3441('0x25')]('$activeView')){if(typeof __['$onClose']==_0x3441('0x3c')){__[_0x3441('0xa2')][_0x3441('0x3d')](__,__[_0x3441('0xa3')][_0x3441('0x9e')]);}}var _0x41c55c=__[_0x3441('0x25')]('$activeView');__['$activeView']=_0x2ba6c2;Hi[_0x3441('0xa4')]=_0x2ba6c2;$(_0x3441('0xa5'))[_0x3441('0x9')]('');$(_0x3441('0xa5'))['append'](_0x3473c8);var _0x2f0341=Hi[_0x3441('0x2')]['nav'][_0x3441('0x4')];if(_0x2f0341&&_0x41c55c){_0x5d71e2();}Hi['$nav'][_0x3441('0xa6')]=![];_0x2ba6c2[_0x3441('0xa7')](function(){if(typeof _0x2ba6c2[_0x3441('0xa0')]!=_0x3441('0x12')){_0x2ba6c2[_0x3441('0xa0')][_0x3441('0x3d')](_0x2ba6c2);}if(__[_0x3441('0x25')](_0x3441('0xa8'))){if(typeof __[_0x3441('0xa8')]==_0x3441('0x3c')){__[_0x3441('0xa8')]['call'](__,_0x2ba6c2[_0x3441('0x9e')],_0x2ba6c2);}}if(__[_0x3441('0x25')](_0x3441('0xa9'))&&_0x41c55c){if(typeof __['$onRedirectFinish']==_0x3441('0x3c')){__[_0x3441('0xa9')][_0x3441('0x3d')](__);}}});};if(__[_0x3441('0x25')]('$activeView')){if(typeof __[_0x3441('0xa3')]==_0x3441('0x4e')){if(__['$activeView']['hasOwnProperty'](_0x3441('0xaa'))&&__['$activeView'][_0x3441('0x25')]('$close')){if(__[_0x3441('0xa3')][_0x3441('0xaa')]){__[_0x3441('0xa3')][_0x3441('0xab')][_0x3441('0x3d')](__[_0x3441('0xa3')],_0x432176);}else{_0x432176[_0x3441('0xa1')]();}}else{if(typeof __[_0x3441('0xa3')][_0x3441('0xab')]==_0x3441('0x3c')){__[_0x3441('0xa3')][_0x3441('0xab')]['call'](__[_0x3441('0xa3')]);_0x432176['proceed']();}else{_0x432176[_0x3441('0xa1')]();}}Hi[_0x3441('0xa')][_0x3441('0xa6')]=![];}else{throw new Error(_0x3441('0xac'));}}else{_0x432176[_0x3441('0xa1')]();}};Hi['$ui']['js'][_0x3441('0xad')]={};Hi[_0x3441('0x8')]['js'][_0x3441('0xad')][_0x3441('0xae')]={};Hi[_0x3441('0x8')]['js'][_0x3441('0xad')][_0x3441('0xaf')]=function(_0x42e51c,_0x4ba143){Hi[_0x3441('0x8')]['js'][_0x3441('0xad')][_0x3441('0xae')][_0x42e51c]=_0x4ba143;};Hi[_0x3441('0x8')]['js'][_0x3441('0xad')][_0x3441('0xaf')](_0x3441('0xb0'),function(_0x165235){if(_0x165235[_0x3441('0x25')](_0x3441('0xb1'))){document[_0x3441('0xb2')][_0x3441('0xb3')](_0x165235[_0x3441('0xb1')]);}else{document[_0x3441('0xb2')][_0x3441('0xb4')]();}return!![];});Hi['$ui']['js'][_0x3441('0xad')]['set'](_0x3441('0xb5'),function(_0x1baf5e){if(_0x1baf5e[_0x3441('0x25')]('value'))Hi['$nav'][_0x3441('0x9f')](_0x1baf5e[_0x3441('0xb6')],{});});Hi[_0x3441('0x8')]['js']['commands'][_0x3441('0xaf')](_0x3441('0xb7'),function(_0x43a97b){Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x6b')]();document[_0x3441('0xb2')][_0x3441('0xb4')]();});Hi['$ui']['js'][_0x3441('0xad')][_0x3441('0xaf')](_0x3441('0xb8'),function(_0xe060ca){if(_0xe060ca[_0x3441('0x25')](_0x3441('0xb1')))Hi[_0x3441('0xb9')](_0xe060ca[_0x3441('0xb1')]);});Hi[_0x3441('0x8')]['js']['commands'][_0x3441('0x5b')]=function(_0x3ff0c9,_0xdd5c95){if(Hi[_0x3441('0x8')]['js']['commands']['all'][_0x3441('0x25')](_0x3ff0c9)){var _0x1fac25=Hi[_0x3441('0x8')]['js']['commands'][_0x3441('0xae')][_0x3ff0c9];return _0x1fac25(_0xdd5c95);}return![];};Hi[_0x3441('0x8')]['js'][_0x3441('0x9b')]=function(_0x314912,_0x4c4aff){var _0x27a2d4={};if(_0x4c4aff['$root']){_0x27a2d4=_0x4c4aff[_0x3441('0xba')];}if(_0x4c4aff[_0x3441('0x25')](_0x3441('0xbb'))){var _0x11998b=_0x4c4aff[_0x3441('0xbb')];Hi[_0x3441('0x6e')]['reset']();Hi[_0x3441('0x6e')][_0x3441('0xbc')](_0x11998b);delete _0x4c4aff[_0x3441('0xbb')];}for(var _0x408f34 in _0x27a2d4){var _0x459dfb=_0x27a2d4[_0x408f34];__[_0x408f34]=_0x459dfb;}__[_0x3441('0xbd')]=__t;for(var _0x37ae59 in _0x4c4aff){var _0x16f9c9=_0x4c4aff[_0x37ae59];_0x314912[_0x37ae59]=_0x16f9c9;}};Hi[_0x3441('0x8')]['js']['root']={};Hi[_0x3441('0x8')]['js']['component']=function(_0x2dafe4,_0x4c4204){Hi[_0x3441('0x1')][_0x3441('0x2e')][_0x2dafe4]=_0x4c4204;};Hi[_0x3441('0xb')][_0x3441('0xbe')]=function(_0x28dcbb){var _0x47e602=angular['toJson'](_0x28dcbb);return JSON[_0x3441('0x87')](_0x47e602);};Hi[_0x3441('0xb')][_0x3441('0x41')]=function(){return angular['copy']({});};Hi[_0x3441('0xb')][_0x3441('0xbf')]=function(_0x35fc01){var _0x3d5b15=_0x35fc01[_0x3441('0x8e')](0x0,0x1);return _0x3d5b15[_0x3441('0xc0')]()+_0x35fc01[_0x3441('0x8e')](0x1);};Hi[_0x3441('0xb')]['lcfirst']=function(_0x3655e7){var _0x1f0ca8=_0x3655e7[_0x3441('0x8e')](0x0,0x1);return _0x1f0ca8[_0x3441('0xc1')]()+_0x3655e7[_0x3441('0x8e')](0x1);};Hi[_0x3441('0xb')]['URLToJson']=function(_0x4271f4){var _0x32f03d=_0x4271f4[_0x3441('0xc2')]('&');var _0x3fc75b={};for(var _0x31fda0 in _0x32f03d){var _0x21b631=_0x32f03d[_0x31fda0];if(typeof _0x21b631!='string')continue;var _0xd725ff=_0x21b631['indexOf']('=');var _0x280370=_0x21b631[_0x3441('0xc3')](0x0,_0xd725ff);var _0x2dd36e=_0x21b631['substring'](_0xd725ff+0x1,_0x21b631[_0x3441('0x53')]);_0x3fc75b[_0x280370]=_0x2dd36e;}return _0x3fc75b;};Hi[_0x3441('0xb')]['encodeGetParams']=function(_0x54b21c){var _0x16fb65='';var _0x405e59=0x0;for(var _0x58a472 in _0x54b21c){var _0x2a5f46=_0x54b21c[_0x58a472];if(_0x405e59!==0x0){_0x16fb65=_0x16fb65+'&';}_0x16fb65=_0x16fb65+_0x58a472+'='+_0x2a5f46;_0x405e59++;}return encodeURI(_0x16fb65);};Hi[_0x3441('0xb')][_0x3441('0xc4')]=function(_0x57a502,_0x3101cd){var _0x11d21f=[];for(var _0x503a10 in _0x3101cd){if(_0x503a10[_0x3441('0x62')](_0x57a502)>-0x1){var _0x41ae8c=_0x503a10[_0x3441('0xb3')](_0x57a502,'')[_0x3441('0x52')]();if(_0x41ae8c!=''){_0x11d21f['push'](Hi[_0x3441('0xb')][_0x3441('0xc5')](_0x41ae8c));}}}return _0x11d21f;};Hi[_0x3441('0xb')]['camelCase']=function(_0x47481c){var _0x1b9e62='';_0x47481c['forEach'](function(_0x58b7fd,_0x4eadb3){if(_0x4eadb3==0x0){_0x1b9e62=_0x58b7fd;}else{var _0x43537d=_0x58b7fd[0x0][_0x3441('0xc0')]();var _0x4b8fc8=_0x58b7fd[_0x3441('0x8e')](0x1,_0x58b7fd['length']-0x1);var _0xe68b5a=_0x43537d+_0x4b8fc8;_0x1b9e62=_0x1b9e62+_0xe68b5a;}});return _0x1b9e62;};Hi['$util'][_0x3441('0xc6')]=function(_0x264946,_0x7b8830){var _0x169517=new Array();var _0x47f928='';if(_0x7b8830['trim']()==''){return[];}for(var _0x4a33ac in _0x7b8830){var _0x5bee9d=_0x7b8830[_0x4a33ac];if(typeof _0x5bee9d!=_0x3441('0x3b')){continue;}if(_0x5bee9d==_0x264946){if(_0x47f928!=''){_0x169517[_0x3441('0x64')](_0x47f928);_0x47f928='';}}else{_0x47f928=_0x47f928+_0x5bee9d;}}if(_0x47f928!=''&&_0x169517[_0x3441('0x53')]==0x0){_0x169517['push'](_0x47f928);}else if(_0x169517[_0x3441('0x53')]>0x0){if(_0x169517[_0x169517[_0x3441('0x53')]-0x1][_0x3441('0xc7')]()!=_0x47f928){_0x169517[_0x3441('0x64')](_0x47f928);}}return _0x169517;};Hi['$nav'][_0x3441('0xc8')]=function(_0x1ecd4e,_0x522bb4){var _0x32e512=_0x3441('0xc9')+_0x522bb4+_0x3441('0xca');$('#'+_0x1ecd4e)['attr'](_0x3441('0xcb'),_0x32e512);};Hi['$nav'][_0x3441('0x49')]=function(_0x178f65,_0x4b2006,_0x19fa1c){var _0x22fee5='Hi.$nav.navigateTo(\x27'+_0x4b2006+_0x3441('0xca');if(_0x19fa1c){if(typeof _0x178f65===_0x3441('0x3b')){$('#'+_0x178f65)[_0x3441('0x49')](_0x19fa1c,function(){eval(_0x22fee5);});}else{$(_0x178f65)['bind'](_0x19fa1c,function(){eval(_0x22fee5);});}}else{$('#'+_0x178f65)[_0x3441('0x35')](_0x3441('0xcb'),_0x22fee5);}};Hi[_0x3441('0xa')][_0x3441('0xcc')]=function(_0x1fff39,_0x5a00dc){var _0x1e7ee8={'controller':_0x1fff39,'action':_0x5a00dc};return _0x1e7ee8;};Hi[_0x3441('0xa')]['getTextViewPath']=function(_0x1c867f,_0x11c9e0){return _0x1c867f+'_'+_0x11c9e0;};Hi[_0x3441('0xa')][_0x3441('0xcd')]=function(_0x2092da){Hi[_0x3441('0xa')]['isGoingBack']=!![];Hi[_0x3441('0xa')][_0x3441('0xce')](_0x2092da,undefined);};Hi[_0x3441('0xa')][_0x3441('0xcf')]=[];Hi[_0x3441('0xa')][_0x3441('0xd0')]=![];Hi[_0x3441('0xa')][_0x3441('0xa6')]=![];Hi['$nav']['namedRoutes']={};Hi[_0x3441('0xa')][_0x3441('0xd1')]=function(_0x4d9776,_0x1ed031){if(!Hi['$nav']['hasOwnProperty'](_0x4d9776)){Hi[_0x3441('0xa')][_0x3441('0xd2')][_0x4d9776]=_0x1ed031;return _0x1ed031;}return![];};Hi[_0x3441('0xa')][_0x3441('0x7e')]=function(_0x4c88bf){if(typeof _0x4c88bf===_0x3441('0x3b')){if(Hi[_0x3441('0xa')][_0x3441('0xd2')][_0x3441('0x25')](_0x4c88bf)){return Hi['$nav'][_0x3441('0xd2')][_0x4c88bf];}return![];}};Hi[_0x3441('0xa')][_0x3441('0xd3')]=function(_0x50f41d){Hi['$nav'][_0x3441('0xcf')][_0x3441('0x64')](_0x50f41d);return Hi[_0x3441('0xa')][_0x3441('0xcf')][_0x3441('0x53')]-0x1;};Hi['$nav'][_0x3441('0xd4')]=function(_0x9edb6f){if(Hi[_0x3441('0xa')]['history'][_0x3441('0x53')]>0x0){var _0x4b4b35=Hi[_0x3441('0xa')][_0x3441('0xcf')][0x0];Hi['$nav']['history'][_0x3441('0xd5')](_0x4b4b35);return _0x4b4b35;}return![];};Hi[_0x3441('0xa')][_0x3441('0xd6')]=![];Hi[_0x3441('0xa')][_0x3441('0xce')]=function(_0x44c05e,_0x19994f,_0x40d4d9,_0x197984,_0x497333,_0x426bd7){if(Hi[_0x3441('0xa')][_0x3441('0xd6')]){if(Hi[_0x3441('0xa')]['active'][_0x3441('0x25')](_0x3441('0xd7'))){Hi[_0x3441('0xa')][_0x3441('0xd6')]['abort']();Hi[_0x3441('0xa')][_0x3441('0xd6')]=![];}}Hi['$nav']['last']={'name':_0x44c05e};var _0x4856cf=Hi[_0x3441('0xa')][_0x3441('0x1f')](_0x44c05e);_0x4856cf=JSON['parse'](JSON['stringify'](_0x4856cf));if(!_0x40d4d9){if(__[_0x3441('0x25')](_0x3441('0xd8'))){if(typeof __[_0x3441('0xd8')]=='function'){__['$onRedirectStart'][_0x3441('0x3d')](__,_0x4856cf);}}}if(!_0x4856cf){return![];}var _0x588701=Hi['$nav'][_0x3441('0x80')](_0x4856cf);var _0x49f5ba=Hi[_0x3441('0xa')]['getCachingURL'](_0x4856cf);if(_0x4856cf[_0x3441('0x81')]){_0x19994f=_0x4856cf[_0x3441('0x81')];}if(_0x19994f){_0x4856cf['get']=_0x19994f;}var _0x37b5bb=Hi[_0x3441('0xa')]['getURL'](_0x4856cf);if(!_0x4856cf[_0x3441('0xd9')]){var _0x4be053=![];var _0x2da27f={};if(Hi[_0x3441('0x8')][_0x3441('0x9')]['cache']['stores'](_0x49f5ba)){_0x4be053=Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['fetch'](_0x49f5ba);_0x2da27f[_0x3441('0xda')]='true';}if(Hi[_0x3441('0x8')]['js'][_0x3441('0x95')](_0x4856cf['controller'],_0x4856cf[_0x3441('0x29')])){_0x2da27f[_0x3441('0xdb')]=_0x3441('0xdc');}if(_0x40d4d9){_0x4856cf[_0x3441('0xdd')]=!![];}Hi[_0x3441('0xa')]['requestData'](_0x4856cf,function(_0x3b895d){if(_0x3b895d[_0x3441('0xde')]!=0xc8){if(typeof _0x3b895d==_0x3441('0x3b')&&_0x40d4d9==![]){document['write'](_0x3b895d);return;}if(_0x40d4d9){if(typeof _0x426bd7[_0x3441('0x3e')]=='function')_0x426bd7[_0x3441('0x3e')]();return;}throw new Error(_0x3441('0xdf'));return;}var _0x36f9f1=_0x3b895d[_0x3441('0xe0')];if(_0x36f9f1[_0x3441('0x25')](_0x3441('0xe1'))){var _0x53f247=_0x36f9f1['$invoke'];for(var _0x37d5a6 in _0x53f247){var _0x58c422=_0x53f247[_0x37d5a6];if(Hi[_0x3441('0x8')]['js'][_0x3441('0xad')][_0x3441('0x5b')](_0x37d5a6,_0x58c422)){return null;}}}var _0x34da8d=_0x3b895d[_0x3441('0xe2')];if(_0x3b895d['controller']){Hi[_0x3441('0xa')]['setNextControllerInfo'](_0x4856cf[_0x3441('0x23')],_0x4856cf[_0x3441('0x29')]);eval(_0x3b895d[_0x3441('0x23')]);Hi['$ui']['js']['setLoadedController'](_0x4856cf[_0x3441('0x23')],_0x4856cf[_0x3441('0x29')]);}if(!Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0x8f')](_0x49f5ba)){Hi[_0x3441('0x8')][_0x3441('0x9')][_0x3441('0x6a')]['storeView'](_0x49f5ba,_0x34da8d);}else{_0x34da8d=Hi['$ui'][_0x3441('0x9')][_0x3441('0x6a')][_0x3441('0xe3')](_0x49f5ba);}var _0x54d810=_0x4856cf[_0x3441('0x23')];var _0x430c81=_0x4856cf[_0x3441('0x29')];var _0x4f001a=Hi[_0x3441('0xa')][_0x3441('0xcc')](_0x54d810,_0x430c81);_0x36f9f1[_0x3441('0x9e')]=_0x4856cf;var _0x295b37={};var _0xf12a56=Hi[_0x3441('0x8')]['js'][_0x3441('0xe4')](_0x4f001a,_0x36f9f1,_0x34da8d,_0x40d4d9,_0x295b37,_0x497333,_0x426bd7);if(_0x40d4d9){if(typeof _0x197984==_0x3441('0x3c')){_0x197984[_0x3441('0x3d')]({},_0xf12a56);}}},_0x2da27f);}};Hi['$nav'][_0x3441('0x80')]=function(_0x5aa4e7,_0x5cdea7){var _0x1e2fe9='';if(typeof App!=_0x3441('0x12'))_0x1e2fe9=App[_0x3441('0xe5')];if(_0x5aa4e7[_0x3441('0x23')]&&!_0x5aa4e7[_0x3441('0x23')]){_0x1e2fe9=_0x1e2fe9+_0x5aa4e7[_0x3441('0x23')]+'/';}else if(_0x5aa4e7[_0x3441('0x23')]&&!_0x5aa4e7[_0x3441('0x23')]){_0x1e2fe9=_0x1e2fe9+_0x5aa4e7[_0x3441('0x23')]+'/';}else if(_0x5aa4e7[_0x3441('0x23')]&&_0x5aa4e7[_0x3441('0x23')]){_0x1e2fe9=_0x1e2fe9+_0x5aa4e7[_0x3441('0x23')]+'/';}if(_0x5aa4e7['action']){_0x1e2fe9=_0x1e2fe9+_0x5aa4e7[_0x3441('0x29')];}if(_0x5aa4e7['get']){if(typeof _0x5aa4e7['get']===_0x3441('0x3b')){_0x1e2fe9=_0x1e2fe9+'?'+_0x5aa4e7[_0x3441('0x81')];}else{var _0x1527d0=Hi[_0x3441('0xb')][_0x3441('0xe6')](_0x5aa4e7[_0x3441('0x81')]);_0x1e2fe9=_0x1e2fe9+'?'+_0x1527d0;}}return _0x1e2fe9;};Hi[_0x3441('0xa')]['getCachingURL']=function(_0x379676,_0x478c92){var _0x3d3ac0='';if(typeof App!=_0x3441('0x12'))_0x3d3ac0=App[_0x3441('0x69')];if(_0x379676[_0x3441('0x23')]&&!_0x379676[_0x3441('0x23')]){_0x3d3ac0=_0x3d3ac0+_0x379676['controller']+'/';}else if(_0x379676['controller']&&!_0x379676[_0x3441('0x23')]){_0x3d3ac0=_0x3d3ac0+_0x379676['controller']+'/';}else if(_0x379676[_0x3441('0x23')]&&_0x379676['controller']){_0x3d3ac0=_0x3d3ac0+_0x379676[_0x3441('0x23')]+'/';}if(_0x379676[_0x3441('0x29')]){_0x3d3ac0=_0x3d3ac0+_0x379676[_0x3441('0x29')];}var _0x17f94f={};if(_0x379676[_0x3441('0x81')])_0x17f94f=Hi[_0x3441('0xb')][_0x3441('0xe7')](_0x379676[_0x3441('0x81')]);if(_0x17f94f['hasOwnProperty']('$')){var _0x53d005=_0x17f94f['$'];_0x3d3ac0=_0x3d3ac0+'.'+_0x53d005;}return _0x3d3ac0;};Hi[_0x3441('0xa')][_0x3441('0xe8')]=![];Hi[_0x3441('0xa')][_0x3441('0xe9')]=![];Hi[_0x3441('0xa')][_0x3441('0x9f')]=function(_0x166459,_0x40f09e){Hi[_0x3441('0xa')][_0x3441('0xe8')]=_0x166459;Hi[_0x3441('0xa')][_0x3441('0xe9')]=JSON['parse'](_0x40f09e);if(!Hi['$nav'][_0x3441('0xa6')]){window[_0x3441('0xcf')][_0x3441('0xea')](Hi[_0x3441('0xa')][_0x3441('0xe9')],'',_0x166459);}};Hi[_0x3441('0xa')][_0x3441('0xeb')]=function(){if(Hi[_0x3441('0xa')][_0x3441('0xe8')]){window[_0x3441('0xcf')][_0x3441('0xec')](Hi[_0x3441('0xa')][_0x3441('0xe9')],Hi[_0x3441('0xa')][_0x3441('0xe8')]+Math[_0x3441('0xed')](),Hi[_0x3441('0xa')][_0x3441('0xe8')]);}};Hi[_0x3441('0xa')][_0x3441('0xee')]=function(_0x394a53){return Hi[_0x3441('0xa')][_0x3441('0xe8')]===_0x394a53;};Hi[_0x3441('0xa')][_0x3441('0xef')]=function(_0x436777,_0x16b75d,_0x3fcfce){if(_0x436777){var _0x3654b7=!![];if(_0x436777[_0x3441('0x25')]('embedded')){_0x3654b7=![];delete _0x436777['dembed'];}var _0x5187c9=Hi[_0x3441('0xa')][_0x3441('0x80')](_0x436777);var _0x1e4e27=![];var _0x5cfc9f={};_0x3fcfce[_0x3441('0xf0')]=0x1;if(_0x3fcfce){_0x5cfc9f=_0x3fcfce;}var _0x40bda6=![];var _0x284b68=$[_0x3441('0xf1')]({'url':_0x5187c9,'headers':_0x3fcfce,'success':function(_0x3d6d0c){_0x16b75d(_0x3d6d0c);},'error':function(_0x2ca4d2,_0x2d864b,_0x42df5f){if(__['hasOwnProperty']('$onRedirectError')){if(typeof __[_0x3441('0xf2')]=='function')__['$onRedirectError'][_0x3441('0x3d')](__,_0x436777,_0x2ca4d2[_0x3441('0xf3')],_0x284b68);}if(__[_0x3441('0x25')](_0x3441('0xa9'))){if(typeof __['$onRedirectFinish']==_0x3441('0x3c')){__['$onRedirectFinish'][_0x3441('0x3d')](__,_0x436777);}}console[_0x3441('0x6')]('controller/action\x20HTTP\x20request\x20failed\x20:\x20'+_0x5187c9);_0x40bda6=_0x2ca4d2[_0x3441('0xf4')];},'complete':function(){Hi['$nav']['active']=![];if(typeof _0x40bda6==_0x3441('0x3b'))_0x16b75d(_0x40bda6);}});if(_0x3654b7){Hi[_0x3441('0xa')][_0x3441('0xd6')]=_0x284b68;}}};Hi[_0x3441('0xa')][_0x3441('0xf5')]={};Hi[_0x3441('0xa')][_0x3441('0xf6')]=function(_0x43940d,_0x156db6){Hi[_0x3441('0xa')][_0x3441('0xf5')]={'controller':_0x43940d,'action':_0x156db6};};Hi[_0x3441('0xa')][_0x3441('0x1f')]=function(_0x50908b){if(typeof _0x50908b===_0x3441('0x3b')){if(_0x50908b[_0x3441('0x62')]('/')!==-0x1){var _0x2395e5=_0x50908b[_0x3441('0x53')]-0x1;var _0x54f9a7=-0x1;var _0x1cd59b=![];var _0xf31f19=![];var _0x4af094='';var _0x147191='';for(var _0x583892 in _0x50908b){var _0x4177bb=_0x50908b[_0x583892];if(_0x4177bb!=='/'&&_0x4177bb!=='?'){_0x4af094=_0x4af094+_0x4177bb;}else{if(_0x54f9a7==-0x1){throw new Error(_0x3441('0xf7')+_0x50908b);}if(!_0x1cd59b&&!_0xf31f19){_0x1cd59b=_0x4af094;_0x4af094='';}else if(_0x1cd59b&&!_0xf31f19){_0xf31f19=_0x4af094;_0x4af094='';}else if(_0x1cd59b&&_0xf31f19){_0x4af094=_0x4af094+_0x4177bb;}}if(_0x583892==_0x2395e5){if(!_0xf31f19&&_0x1cd59b){_0xf31f19=_0x4af094;}else if(_0x1cd59b&&_0xf31f19){_0x147191=_0x4af094;}}_0x54f9a7=_0x583892;}if(!(_0x1cd59b&&_0xf31f19))throw new Error(_0x3441('0xf7')+_0x50908b);var _0x43b0ce={};_0x43b0ce[_0x3441('0x23')]=_0x1cd59b;_0x43b0ce[_0x3441('0x29')]=_0xf31f19;if(_0x147191){_0x43b0ce[_0x3441('0x81')]=_0x147191;}return _0x43b0ce;}return Hi['$nav'][_0x3441('0x7e')](_0x50908b);}else{if(_0x50908b[_0x3441('0x25')](_0x3441('0x23'))||_0x50908b[_0x3441('0x25')](_0x3441('0xe2'))){var _0x2cd97c=JSON[_0x3441('0x87')](JSON[_0x3441('0x7d')](_0x50908b));if(_0x50908b[_0x3441('0x25')](_0x3441('0x23'))){_0x2cd97c[_0x3441('0x23')]=_0x50908b[_0x3441('0x23')];delete _0x2cd97c[_0x3441('0x23')];}if(_0x50908b[_0x3441('0x25')](_0x3441('0xe2'))){_0x2cd97c[_0x3441('0x29')]=_0x50908b['view'];delete _0x2cd97c['view'];}return _0x2cd97c;}return _0x50908b;}};Hi[_0x3441('0xa')][_0x3441('0xf8')]=function(_0x4dead6){return Hi[_0x3441('0xa')][_0x3441('0x80')](_0x4dead6);};Hi['$frontiers']={};Hi[_0x3441('0x18')][_0x3441('0x14')]=function(){var _0x5a6397={'obj':![],'prop':![],'callback':![]};var _0x50f96b=undefined;var _0x3d97d3=undefined;var _0x21581d=undefined;var _0x3e83f3=undefined;var _0x264d47=undefined;var _0x570ba9=undefined;var _0x3f644e=undefined;var _0x3d69c1=undefined;var _0x1b3ce4=function(_0x5ef4cd){if(__[_0x3441('0x25')](_0x3441('0x18'))){if(__[_0x3441('0x18')][_0x3441('0x25')](_0x5ef4cd))return __[_0x3441('0x18')][_0x5ef4cd];}return undefined;};var _0x3af9b9=function(){if(__[_0x3441('0x25')](_0x3441('0x18'))){return __['$frontiers'];}return undefined;};this[_0x3441('0xf9')]=function(_0x50f186){_0x3d69c1=_0x50f186;};this['_setResult']=function(_0x3322fa){if(typeof _0x5a6397[_0x3441('0xfa')]==_0x3441('0x3c'))_0x5a6397['callback'][_0x3441('0x3d')](this,_0x3322fa);this[_0x3441('0xfb')]();};this[_0x3441('0xfb')]=function(){if(typeof _0x3f644e==_0x3441('0x3c'))_0x3f644e[_0x3441('0x3d')](this);else{var _0x3c8a43=_0x1b3ce4(_0x3441('0xfc'));if(typeof _0x3c8a43!=_0x3441('0x12')){_0x3c8a43[_0x3441('0x3d')](_0x3af9b9(),this);}}};this[_0x3441('0xfd')]=function(_0x197e59){if(typeof _0x570ba9==_0x3441('0x3c')){_0x570ba9['call'](this,_0x197e59);}else{var _0x2e3534=_0x1b3ce4(_0x3441('0xfe'));if(typeof _0x2e3534!=_0x3441('0x12')){_0x2e3534[_0x3441('0x3d')](_0x3af9b9(),this,_0x197e59);}}this[_0x3441('0xfb')]();};this[_0x3441('0xff')]=function(){var _0x1ea8e6=_0x1b3ce4(_0x3441('0x16'));var _0x588e5f=_0x1b3ce4('catch');if(typeof _0x3d97d3=='function'){_0x3d97d3[_0x3441('0x3d')](this);}else if(_0x1ea8e6==_0x3441('0x3c')){_0x1ea8e6['call'](_0x3af9b9(),this);}else if(typeof _0x570ba9=='function'){this[_0x3441('0xfd')](0x198);}else if(typeof _0x588e5f=='function'){_0x588e5f[_0x3441('0x3d')](_0x3af9b9(),this,0x198);}this[_0x3441('0xfb')]();};this[_0x3441('0x100')]=function(){var _0x82ec8f=_0x1b3ce4('expired');var _0x144392=_0x1b3ce4(_0x3441('0xfe'));if(typeof _0x82ec8f==_0x3441('0x3c')){_0x82ec8f[_0x3441('0x3d')](_0x3af9b9(),this);}else if(typeof _0x144392==_0x3441('0x3c')){_0x144392[_0x3441('0x3d')](_0x3af9b9(),0x1a3);}this[_0x3441('0xfb')]();};this[_0x3441('0x19')]=function(){var _0x47a488=_0x1b3ce4('forbidden');var _0x36a000=_0x1b3ce4('catch');if(typeof _0x50f96b=='function'){_0x50f96b[_0x3441('0x3d')](this);}else if(typeof _0x47a488==_0x3441('0x3c')){_0x47a488['call'](_0x3af9b9(),this);}else if(typeof _0x570ba9==_0x3441('0x3c')){this[_0x3441('0xfd')](0x193);}else if(typeof _0x36a000==_0x3441('0x3c')){_0x36a000[_0x3441('0x3d')](_0x3af9b9(),0x193);}this[_0x3441('0xfb')]();};this[_0x3441('0x101')]=function(){var _0x57b7a8=_0x1b3ce4(_0x3441('0x102'));var _0x23c2a6=_0x1b3ce4(_0x3441('0xfe'));if(typeof _0x3e83f3==_0x3441('0x3c')){_0x3e83f3[_0x3441('0x3d')](this);}else if(typeof _0x57b7a8==_0x3441('0x3c')){_0x57b7a8['call'](_0x3af9b9(),this);}else if(typeof _0x570ba9==_0x3441('0x3c')){this['_setHttpError'](0x1c4);}else if(typeof _0x23c2a6=='function'){_0x23c2a6[_0x3441('0x3d')](_0x3af9b9(),this,0x1c4);}this[_0x3441('0xfb')]();};this[_0x3441('0x103')]=function(){var _0x1d7aa1=_0x1b3ce4(_0x3441('0x1a'));var _0x37a37b=_0x1b3ce4(_0x3441('0xfe'));if(typeof _0x264d47==_0x3441('0x3c')){_0x264d47[_0x3441('0x3d')](this);}else if(typeof _0x1d7aa1==_0x3441('0x3c')){_0x1d7aa1[_0x3441('0x3d')](_0x3af9b9(),this);}else if(typeof _0x570ba9=='function'){this[_0x3441('0xfd')](0x1ad);}else if(typeof _0x37a37b==_0x3441('0x3c')){_0x570ba9['call'](_0x3af9b9(),this,0x1ad);}this[_0x3441('0xfb')]();};this[_0x3441('0x104')]=function(_0x215a51){var _0x200d37=_0x1b3ce4(_0x3441('0xfe'));if(typeof _0x570ba9==_0x3441('0x3c')){_0x570ba9[_0x3441('0x3d')](this,_0x215a51);}else if(typeof _0x200d37==_0x3441('0x3c')){_0x200d37['call'](_0x3af9b9(),this,_0x215a51);}this[_0x3441('0xfb')]();};this[_0x3441('0x105')]=function(_0xf7bd12){if(typeof _0xf7bd12==_0x3441('0x3c')){_0x5a6397['callback']=_0xf7bd12;}else{throw new Error('Wrong\x20parameters');}return this;};this[_0x3441('0xfc')]=function(_0xcdbd22){if(typeof _0xcdbd22==_0x3441('0x3c')){_0x3f644e=_0xcdbd22;}else{throw new Error(_0x3441('0x106'));}return this;};this['run']=function(){};this['do']=function(){this[_0x3441('0x5b')]();};this['forbidden']=function(_0x30a806){if(typeof _0x30a806!=_0x3441('0x3c'))throw new Error(_0x3441('0x106'));_0x50f96b=_0x30a806;return this;};this[_0x3441('0x16')]=function(_0x5d79c4){if(typeof _0x5d79c4!='function')throw new Error(_0x3441('0x106'));_0x3d97d3=_0x5d79c4;return this;};this[_0x3441('0x102')]=function(_0x3e0af0){if(typeof _0x3e0af0!=_0x3441('0x3c'))throw new Error(_0x3441('0x106'));_0x3e83f3=_0x3e0af0;return this;};this[_0x3441('0x1a')]=function(_0x384bbc){if(typeof _0x384bbc!=_0x3441('0x3c'))throw new Error('Wrong\x20parameters');_0x264d47=_0x384bbc;return this;};this[_0x3441('0xfe')]=function(_0x573587){if(typeof _0x573587!='function')throw new Error(_0x3441('0x106'));_0x570ba9=_0x573587;return this;};this[_0x3441('0x107')]=function(){return _0x3d69c1;};};var Upload=function(_0x269613,_0x387f75){if(typeof _0x269613!==_0x3441('0x3b')||typeof _0x387f75!=='object')throw new Error(_0x3441('0x108'));this[_0x3441('0x37')]=_0x269613;this['files']=_0x387f75;this[_0x3441('0x109')]=function(){return this['name'];};this[_0x3441('0x10a')]=function(){return this[_0x3441('0x10b')];};this[_0x3441('0x53')]=function(){return this[_0x3441('0x10b')][_0x3441('0x53')];};};Hi[_0x3441('0x10c')]=function(_0xd38ce2){Hi['$ui']['js'][_0x3441('0x73')]=_0xd38ce2;};Hi[_0x3441('0x1c')]=function(_0x4902c3){jQuery[_0x3441('0x10d')](_0x4902c3,Hi[_0x3441('0x8')]['js'][_0x3441('0x73')]);Hi['$ui']['js'][_0x3441('0x73')]=_0x4902c3;};Hi[_0x3441('0xb9')]=Hi[_0x3441('0xa')][_0x3441('0xce')];Hi[_0x3441('0xb4')]=function(_0x39d505,_0x2045d0){if(typeof _0x2045d0!='undefined'){var _0x2f2627=Hi[_0x3441('0xa')][_0x3441('0x1f')](_0x39d505);_0x2f2627[_0x3441('0x81')]=_0x2045d0;var _0x39d505=Hi['$nav'][_0x3441('0x80')](_0x2f2627);document['location'][_0x3441('0xb3')](_0x39d505);}else{document[_0x3441('0xb2')]['replace'](App[_0x3441('0xe5')]+_0x39d505);}};Hi[_0x3441('0x44')]=Hi['$nav']['navigateTo'];Hi[_0x3441('0xe2')]=function(_0x4ccab4){var _0x282e78=Hi[_0x3441('0xa')][_0x3441('0xf5')];var _0xf33e1f=Hi[_0x3441('0xa')][_0x3441('0x1f')](_0x282e78);_0x4ccab4['$route']=_0xf33e1f;Hi[_0x3441('0x8')]['js'][_0x3441('0x97')](_0x282e78[_0x3441('0x23')],_0x282e78[_0x3441('0x29')],_0x4ccab4);};String[_0x3441('0x10e')]['startsWith']=function(_0x5dfdae){return this[_0x3441('0x62')](_0x5dfdae)===0x0;};Array[_0x3441('0x10e')][_0x3441('0xd5')]=function(_0x3f8be0){var _0x5b1735=this;var _0x4ea3d8=_0x5b1735[_0x3441('0x62')](_0x3f8be0);if(_0x4ea3d8>-0x1){_0x5b1735[_0x3441('0x10f')](_0x4ea3d8,0x1);}};window[_0x3441('0x110')]=function(_0x372256){if(typeof App==_0x3441('0x12'))return;var _0x5ee971=App[_0x3441('0xe5')];var _0x188a84=window['location'][_0x3441('0x111')]();if(_0x188a84[_0x3441('0x112')](_0x5ee971)){var _0x585ed4=_0x188a84['charAt'](_0x188a84['length']-0x1);if(_0x585ed4=='#'){return;}var _0x383ddd=_0x188a84[_0x3441('0xb3')](App[_0x3441('0xe5')],'');Hi[_0x3441('0xa')][_0x3441('0xcd')](_0x383ddd);}};Hi['i18n']={};Hi['i18n'][_0x3441('0x113')]={};Hi[_0x3441('0x6e')][_0x3441('0x114')]=function(){delete Hi[_0x3441('0x6e')][_0x3441('0x113')];Hi[_0x3441('0x6e')][_0x3441('0x113')]={};if(typeof $i18nTemplateBundle!=_0x3441('0x12')){Hi[_0x3441('0x6e')][_0x3441('0xbc')]($i18nTemplateBundle);}if(typeof $i18nBundle!=_0x3441('0x12')){Hi[_0x3441('0x6e')][_0x3441('0xbc')]($i18nBundle);}};Hi[_0x3441('0x6e')][_0x3441('0xbc')]=function(_0x4a8b66){for(var _0x2e5135 in _0x4a8b66){if(_0x4a8b66[_0x3441('0x25')](_0x2e5135)){Hi['i18n'][_0x3441('0x113')][_0x2e5135]=_0x4a8b66[_0x2e5135];}}};Hi[_0x3441('0x6e')][_0x3441('0x6f')]=function(){Hi[_0x3441('0x6e')][_0x3441('0x114')]();};Hi[_0x3441('0x6e')][_0x3441('0x81')]=function(_0x598766){if(!Hi[_0x3441('0x6e')][_0x3441('0x113')][_0x3441('0x25')](_0x598766))return![];return Hi[_0x3441('0x6e')][_0x3441('0x113')][_0x598766];};Hi[_0x3441('0x6e')][_0x3441('0x115')]=function(_0x4b022b,_0x170d81){for(var _0x740ef0 in _0x170d81){var _0x2fdd8a='{{'+_0x740ef0+'}}';var _0x1972b7=_0x170d81[_0x740ef0];_0x4b022b=_0x4b022b[_0x3441('0xc2')](_0x2fdd8a)[_0x3441('0x116')](_0x1972b7);}return _0x4b022b;};Hi[_0x3441('0x6e')]['ExpressionPromise']=function(_0x1c0bb6){this[_0x3441('0x117')]=function(_0x4049d7){return Hi[_0x3441('0x6e')][_0x3441('0x115')](_0x1c0bb6,_0x4049d7);};};Hi[_0x3441('0x6e')][_0x3441('0x118')]=function(_0x380935){return _0x380935[_0x3441('0x62')]('{{')!=-0x1&&_0x380935['indexOf']('}}')!=-0x1;};function translate(_0x3da11e,_0x79b2cc){var _0xaa2f80=_0x3da11e;if(typeof _0x79b2cc!=_0x3441('0x12'))_0xaa2f80=_0x79b2cc;var _0xdbab81=Hi[_0x3441('0x6e')][_0x3441('0x81')](_0xaa2f80);if(!_0xdbab81){if(Hi['i18n']['isExpression'](_0x3da11e))return new Hi[(_0x3441('0x6e'))][(_0x3441('0x119'))](_0x3da11e);return _0x3da11e;}if(Hi[_0x3441('0x6e')]['isExpression'](_0xdbab81))return new Hi[(_0x3441('0x6e'))][(_0x3441('0x119'))](_0xdbab81);return _0xdbab81;}function __t(_0x4db417,_0xd7511f){return translate(_0x4db417,_0xd7511f);}var $fiis={};var fMx=function(_0x189e8a,_0x24d09f,_0x447f36,_0x5bcb5e,_0x7fe4cb,_0x5aae7d,_0x253b55,_0x1722c4){var _0x2465f5=![];if(_0x1722c4[_0x3441('0x53')]>0x0){for(var _0xe65404 in _0x1722c4){var _0x394469=_0x1722c4[_0xe65404];if(Upload[_0x3441('0x10e')][_0x3441('0x11a')](_0x394469)){_0x2465f5=!![];break;}}}var _0x35d794=new Hi[(_0x3441('0x18'))]['Promise']();if($fiis[_0x3441('0x25')](_0x5bcb5e)){if(_0x7fe4cb){if(_0x5aae7d){if(_0x253b55){$fiis[_0x5bcb5e][_0x3441('0xd7')]();}else return new Hi[(_0x3441('0x18'))][(_0x3441('0x11b'))]();}else{if(JSON['stringify'](_0x189e8a)==$fiis[_0x5bcb5e][_0x3441('0x11c')]){if(_0x253b55){$fiis[_0x5bcb5e]['abort']();}else return new Hi[(_0x3441('0x18'))][(_0x3441('0x14'))]();}}}}var _0x2e9bf7={'success':function(_0x536552){if(_0x536552[_0x3441('0x25')](_0x3441('0xe1'))){var _0x5144c6=_0x536552[_0x3441('0xe1')];for(var _0x36831c in _0x5144c6){var _0xa933c=_0x5144c6[_0x36831c];Hi['$ui']['js'][_0x3441('0xad')][_0x3441('0x5b')](_0x36831c,_0xa933c);}}if(_0x536552[_0x3441('0x25')](_0x3441('0xba'))){if(typeof __!=_0x3441('0x12')){for(var _0x5c3431 in _0x536552['$root']){__[_0x5c3431]=_0x536552[_0x3441('0xba')][_0x5c3431];}__[_0x3441('0xa7')]();}}_0x35d794[_0x3441('0x15')](_0x536552[_0x3441('0x11')]);},'error':function(_0x434133,_0x4acfd4,_0x37b77d){var _0x54c52a=_0x434133[_0x3441('0xf4')];var _0x4aa1f8=undefined;try{var _0x55adc8=JSON[_0x3441('0x87')](_0x54c52a);if(_0x55adc8[_0x3441('0x25')](_0x3441('0x55'))&&_0x55adc8[_0x3441('0x25')](_0x3441('0x11d'))){_0x35d794[_0x3441('0x104')](_0x55adc8);return;}}catch(_0x153547){}if(_0x4acfd4==_0x3441('0xd7')){_0x35d794[_0x3441('0x101')]();}else if(_0x4acfd4==_0x3441('0x16')){_0x35d794[_0x3441('0xff')]();}else{switch(_0x434133[_0x3441('0xf3')]){case 0x193:_0x35d794[_0x3441('0x19')]();break;case 0x198:_0x35d794[_0x3441('0xff')]();break;case 0x1a3:_0x35d794['_setExpired']();break;case 0x1a5:_0x35d794[_0x3441('0x101')]();break;case 0x1ad:_0x35d794[_0x3441('0x103')]();break;default:_0x35d794['_setException'](0x1f4);break;}}},'complete':function(){delete $fiis[_0x5bcb5e];}};_0x2e9bf7[_0x3441('0x11e')]='POST';_0x2e9bf7[_0x3441('0xb1')]=_0x24d09f;_0x2e9bf7[_0x3441('0x11f')]=_0x3441('0x120');_0x2e9bf7[_0x3441('0x6a')]=![];_0x2e9bf7['timeout']=_0x447f36;if(!_0x2465f5){_0x2e9bf7[_0x3441('0xe0')]=JSON[_0x3441('0x7d')](_0x189e8a);}else{var _0x173421=new FormData();var _0x2b6783={};var _0x2bd8ed={};for(var _0x58562b in _0x1722c4){var _0x394469=_0x1722c4[_0x58562b];if(Upload[_0x3441('0x10e')][_0x3441('0x11a')](_0x394469)){var _0x94ec80=_0x394469['getName']();_0x2bd8ed[_0x94ec80]=_0x394469[_0x3441('0x53')]();_0x2b6783['arg'+_0x58562b]=_0x3441('0x121')+_0x94ec80;var _0x1abd88=_0x394469[_0x3441('0x10a')]();for(var _0x3c6287=0x0;_0x3c6287<_0x1abd88[_0x3441('0x53')];_0x3c6287++)_0x173421['append'](_0x94ec80+_0x3441('0x122')+_0x3c6287,_0x1abd88[_0x3c6287]);}else{if(typeof _0x394469!=_0x3441('0x3c'))_0x2b6783['arg'+_0x58562b]=_0x394469;}}_0x173421[_0x3441('0x42')](_0x3441('0x123'),JSON[_0x3441('0x7d')](_0x2bd8ed));_0x173421[_0x3441('0x42')](_0x3441('0x124'),JSON[_0x3441('0x7d')](_0x2b6783));_0x2e9bf7['processData']=![];_0x2e9bf7[_0x3441('0x125')]=![];_0x2e9bf7[_0x3441('0xe0')]=_0x173421;}var _0x545b3e=$[_0x3441('0xf1')](_0x2e9bf7);_0x35d794['_setRequest'](_0x545b3e);_0x545b3e[_0x3441('0x11c')]=JSON[_0x3441('0x7d')](_0x189e8a);$fiis[_0x5bcb5e]=_0x545b3e;return _0x35d794;}; \ No newline at end of file diff --git a/Web/pom.xml b/Web/pom.xml index 854e5e5..cf14e7e 100755 --- a/Web/pom.xml +++ b/Web/pom.xml @@ -6,7 +6,7 @@ org.emerjoin Hi-Framework - 1.5.0 + 1.6.0 jar @@ -31,7 +31,7 @@ org.emerjoin Hi-Framework-Resources - 1.5.0 + 1.6.0 compile false @@ -109,7 +109,7 @@ org.emerjoin XMLEasy - 1.1.0 + 2.0.0 @@ -118,6 +118,13 @@ 1.1.0 + + io.jsonwebtoken + jjwt + 0.9.1 + + + diff --git a/Web/src/main/java/org/emerjoin/hi/web/ActiveUser.java b/Web/src/main/java/org/emerjoin/hi/web/ActiveUser.java index 3d4e5e1..ca19300 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/ActiveUser.java +++ b/Web/src/main/java/org/emerjoin/hi/web/ActiveUser.java @@ -1,13 +1,15 @@ package org.emerjoin.hi.web; +import org.emerjoin.hi.web.security.CsrfTokenUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; +import javax.xml.bind.DatatypeConverter; import java.io.Serializable; -import java.security.MessageDigest; -import java.security.SecureRandom; import java.util.HashMap; +import java.util.UUID; /** * @author Mário Júnior @@ -18,41 +20,23 @@ public class ActiveUser implements Serializable { private String csrfToken = ""; private HashMap data = new HashMap<>(); - private Logger _log = LoggerFactory.getLogger(ActiveUser.class); + private static final Logger _log = LoggerFactory.getLogger(ActiveUser.class); + private static final CsrfTokenUtil csrfTokeUtil = new CsrfTokenUtil(); - public ActiveUser(){ - - try { - - SecureRandom secureRandom = new SecureRandom(); - byte[] token = new byte[128]; - secureRandom.nextBytes(token); - - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] mdbytes = md.digest(token); - - //convert the byte to hex format method 2 - StringBuffer hexString = new StringBuffer(); - - for (int i = 0; i < mdbytes.length; i++) { - String hex = Integer.toHexString(0xff & mdbytes[i]); - if (hex.length() == 1) hexString.append('0'); - hexString.append(hex); - } - - csrfToken = hexString.toString().toUpperCase(); - - }catch (Exception ex){ - - _log.error("Failed to generate User's CSRF protection token",ex); + @PostConstruct + public void init(){ + _log.debug("Generating User CSRF token..."); + this.csrfToken = csrfTokeUtil.makeJwtToken(); + } - } + public String expireCsrfToken(){ + _log.debug("Expiring current CSRF token..."); + return this.csrfToken = csrfTokeUtil + .makeJwtToken(); } public String getCsrfToken() { - return csrfToken; - } public HashMap getData() { @@ -70,13 +54,10 @@ public Object getProperty(String name){ } public Object getProperty(String name,Object defaultValue){ - Object value = data.get(name); if(value==null) return defaultValue; - return value; - } public void setProperty(String name, Object value){ diff --git a/Web/src/main/java/org/emerjoin/hi/web/AppContext.java b/Web/src/main/java/org/emerjoin/hi/web/AppContext.java index 191c45c..049b91d 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/AppContext.java +++ b/Web/src/main/java/org/emerjoin/hi/web/AppContext.java @@ -44,6 +44,10 @@ public static void setAssetVersionPrefix(String prefix) { private String baseUrl; + private String origin; + + private String domain; + public String getAssetVersionToken(){ return assetVersionPrefix+String.valueOf(getDeployId()); @@ -113,12 +117,41 @@ public String getBaseURL() { public void setBaseURL(String baseUrl) { this.baseUrl = baseUrl; + this.computeOrigin(); + this.computeDomain(); } public boolean isBaseURLSet(){ - return this.baseUrl!=null; + } + + public String getOrigin() { + return this.origin; + } + + public String getDomain() { + return this.domain; + } + + private void computeDomain(){ + int doubleSlashIndex = origin.indexOf("//"); + String withoutDoubleSlash = origin.substring(doubleSlashIndex+2,origin.length()); + int semiColonIndex = withoutDoubleSlash.indexOf(':'); + if(semiColonIndex != -1){ + domain = withoutDoubleSlash.substring(0,semiColonIndex); + }else domain = withoutDoubleSlash; + } + private void computeOrigin(){ + StringBuilder builder = new StringBuilder(); + builder.append(this.baseUrl.substring(0,baseUrl.indexOf("//")+2)); + int doubleSlashIndex = this.baseUrl.indexOf("//"); + String withoutDoubleSlash = this.baseUrl.substring(doubleSlashIndex+2,this.baseUrl.length()); + int nextForwardSlashIndex = withoutDoubleSlash.indexOf('/'); + if(nextForwardSlashIndex != -1) + builder.append(withoutDoubleSlash.substring(0,nextForwardSlashIndex)); + else builder.append(withoutDoubleSlash); + this.origin = builder.toString(); } } diff --git a/Web/src/main/java/org/emerjoin/hi/web/DispatcherServlet.java b/Web/src/main/java/org/emerjoin/hi/web/DispatcherServlet.java index 8eda9c8..8d9c8ad 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/DispatcherServlet.java +++ b/Web/src/main/java/org/emerjoin/hi/web/DispatcherServlet.java @@ -14,10 +14,9 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import java.io.IOException; -import static org.emerjoin.hi.web.uti.Timing.*; +import static org.emerjoin.hi.web.util.Timing.*; /** diff --git a/Web/src/main/java/org/emerjoin/hi/web/boot/BootAgent.java b/Web/src/main/java/org/emerjoin/hi/web/boot/BootAgent.java index 2343104..6b53498 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/boot/BootAgent.java +++ b/Web/src/main/java/org/emerjoin/hi/web/boot/BootAgent.java @@ -81,7 +81,7 @@ private void initBootExtensions() throws HiException { }catch (Exception ex){ - throw new HiException("Failed to initialize boot extension : "+extension.getClass().getCanonicalName(),ex); + throw new HiException("Failed to init boot extension : "+extension.getClass().getCanonicalName(),ex); } diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/AppConfigurations.java b/Web/src/main/java/org/emerjoin/hi/web/config/AppConfigurations.java index 203554b..6926c6e 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/config/AppConfigurations.java +++ b/Web/src/main/java/org/emerjoin/hi/web/config/AppConfigurations.java @@ -27,15 +27,12 @@ public class AppConfigurations { private String baseUrl; private Map testedViews = new HashMap<>(); - private List smartCachingExtensions = new ArrayList<>(); - private DeploymentMode deploymentMode = DeploymentMode.DEVELOPMENT; - + private Frontiers frontiersConfig = new Frontiers(); + private Security securityConfig = new Security(); private Logger _log = LoggerFactory.getLogger(AppConfigurations.class); - - public static enum DeploymentMode { DEVELOPMENT, PRODUCTION @@ -192,4 +189,20 @@ public String getBaseUrl() { public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } + + public Frontiers getFrontiersConfig() { + return frontiersConfig; + } + + public void setFrontiersConfig(Frontiers frontiersConfig) { + this.frontiersConfig = frontiersConfig; + } + + public Security getSecurityConfig() { + return securityConfig; + } + + public void setSecurityConfig(Security securityConfig) { + this.securityConfig = securityConfig; + } } diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/Frontiers.java b/Web/src/main/java/org/emerjoin/hi/web/config/Frontiers.java new file mode 100644 index 0000000..5f8f338 --- /dev/null +++ b/Web/src/main/java/org/emerjoin/hi/web/config/Frontiers.java @@ -0,0 +1,115 @@ +package org.emerjoin.hi.web.config; + +/** + * @author Mario Junior. + */ +public class Frontiers { + + public class Security { + + public class CrossSiteRequestForgery { + + public class Token { + + private String jwtAlgorithm = "H256"; + private String jwtPassphrase = "10045084-f522-4faa-afa4-bdbc955faa47"; + private int secureRandomSize = 64; + + public String getJwtAlgorithm() { + return jwtAlgorithm; + } + + public void setJwtAlgorithm(String jwtAlgorithm) { + this.jwtAlgorithm = jwtAlgorithm; + } + + public String getJwtPassphrase() { + return jwtPassphrase; + } + + public void setJwtPassphrase(String jwtPassphrase) { + this.jwtPassphrase = jwtPassphrase; + } + + public int getSecureRandomSize() { + return secureRandomSize; + } + + public void setSecureRandomSize(int secureRandomSize) { + this.secureRandomSize = secureRandomSize; + } + } + public class Cookie { + + private boolean httpOnly = true; + private boolean secure = false; + public static final String NAME = "_CSRF_"; + + public boolean isHttpOnly() { + return httpOnly; + } + + public void setHttpOnly(boolean httpOnly) { + this.httpOnly = httpOnly; + } + + public boolean isSecure() { + return secure; + } + + public void setSecure(boolean secure) { + this.secure = secure; + } + } + + private Token token = new Token(); + private Cookie cookie = new Cookie(); + + public Token getToken() { + return token; + } + + public void setToken(Token token) { + this.token = token; + } + + public Cookie getCookie() { + return cookie; + } + + public void setCookie(Cookie cookie) { + this.cookie = cookie; + } + } + + private CrossSiteRequestForgery crossSiteRequestForgery = new CrossSiteRequestForgery(); + + public CrossSiteRequestForgery getCrossSiteRequestForgery() { + return crossSiteRequestForgery; + } + + public void setCrossSiteRequestForgery(CrossSiteRequestForgery crossSiteRequestForgery) { + this.crossSiteRequestForgery = crossSiteRequestForgery; + } + + } + + private Security security = new Security(); + private long defaultTimeout = 1500; + + public Security getSecurity() { + return security; + } + + public void setSecurity(Security security) { + this.security = security; + } + + public long getDefaultTimeout() { + return defaultTimeout; + } + + public void setDefaultTimeout(long defaultTimeout) { + this.defaultTimeout = defaultTimeout; + } +} diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/Security.java b/Web/src/main/java/org/emerjoin/hi/web/config/Security.java new file mode 100644 index 0000000..0a7d4af --- /dev/null +++ b/Web/src/main/java/org/emerjoin/hi/web/config/Security.java @@ -0,0 +1,170 @@ +package org.emerjoin.hi.web.config; + +/** + * @author Mario Junior. + */ +public class Security { + + private ContentSecurityPolicy contentPolicy = new ContentSecurityPolicy(); + + public ContentSecurityPolicy getContentPolicy() { + return contentPolicy; + } + + public void setContentPolicy(ContentSecurityPolicy contentPolicy) { + this.contentPolicy = contentPolicy; + } + + public class ContentSecurityPolicy { + + private boolean denyIframeEmbeding = true; + + private boolean blockMixedContent = false; + private String formActionDirective ="'none'"; + private String navigateToDirective ="*"; + + private String reportingUrl=""; + + private String defaultContentSource="* 'unsafe-inline'"; + private String scriptContentSource="* 'unsafe-inline' 'unsafe-eval'"; + private String objectContentSource=""; + private String imageContentSource=""; + private String mediaContentSource=""; + private String styleContentSource=""; + + public boolean isDenyIframeEmbeding() { + return denyIframeEmbeding; + } + + public void setDenyIframeEmbeding(boolean denyIframeEmbeding) { + this.denyIframeEmbeding = denyIframeEmbeding; + } + + public String getReportingUrl() { + return reportingUrl; + } + + public void setReportingUrl(String reportingUrl) { + this.reportingUrl = reportingUrl; + } + + public String getDefaultContentSource() { + return defaultContentSource; + } + + public void setDefaultContentSource(String defaultContentSource) { + this.defaultContentSource = defaultContentSource; + } + + public String getScriptContentSource() { + return scriptContentSource; + } + + public void setScriptContentSource(String scriptContentSource) { + this.scriptContentSource = scriptContentSource; + } + + public String getObjectContentSource() { + return objectContentSource; + } + + public void setObjectContentSource(String objectContentSource) { + this.objectContentSource = objectContentSource; + } + + public String getImageContentSource() { + return imageContentSource; + } + + public void setImageContentSource(String imageContentSource) { + this.imageContentSource = imageContentSource; + } + + public String getMediaContentSource() { + return mediaContentSource; + } + + public void setMediaContentSource(String mediaContentSource) { + this.mediaContentSource = mediaContentSource; + } + + public String getStyleContentSource() { + return styleContentSource; + } + + public void setStyleContentSource(String styleContentSource) { + this.styleContentSource = styleContentSource; + } + + public boolean isBlockMixedContent() { + return blockMixedContent; + } + + public void setBlockMixedContent(boolean blockMixedContent) { + this.blockMixedContent = blockMixedContent; + } + + public String getNavigateToDirective() { + return navigateToDirective; + } + + public void setNavigateToDirective(String navigateToDirective) { + this.navigateToDirective = navigateToDirective; + } + + public String getFormActionDirective() { + return formActionDirective; + } + + public void setFormActionDirective(String formActionDirective) { + this.formActionDirective = formActionDirective; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + String defaultSrc = this.getDefaultContentSource(); + if(!defaultSrc.isEmpty()) { + builder.append("default-src ");builder.append(defaultSrc);builder.append("; "); + } + String scriptSrc = this.getScriptContentSource(); + if(!scriptSrc.isEmpty()){ + builder.append("script-src ");builder.append(scriptSrc);builder.append("; "); + builder.append("script-src-attr ");builder.append(scriptSrc);builder.append("; "); + } + String styleSrc = this.getStyleContentSource(); + if(!styleSrc.isEmpty()){ + builder.append("style-src ");builder.append(styleSrc);builder.append("; "); + } + String imageSrc = this.getImageContentSource(); + if(!imageSrc.isEmpty()){ + builder.append("img-src ");builder.append(imageSrc);builder.append("; "); + } + String objectSrc = this.getObjectContentSource(); + if(!objectSrc.isEmpty()){ + builder.append("object-src ");builder.append(objectSrc);builder.append("; "); + } + String mediaContentSrc = this.getMediaContentSource(); + if(!mediaContentSrc.isEmpty()){ + builder.append("media-src "); builder.append(mediaContentSrc); builder.append("; "); + } + if(this.isBlockMixedContent()) + builder.append("block-all-mixed-content; "); + + String navigateToDirective = this.getNavigateToDirective(); + if(!navigateToDirective.isEmpty()){ + builder.append("navigate-to "); builder.append(navigateToDirective); builder.append("; "); + } + String formActionDirective = this.getFormActionDirective(); + if(!formActionDirective.isEmpty()){ + builder.append("form-action "); builder.append(formActionDirective); builder.append("; "); + } + if(!this.getReportingUrl().isEmpty()){ + builder.append("report-uri ");builder.append(this.getReportingUrl()); + builder.append("; report-to ");builder.append(this.getReportingUrl());builder.append("; "); + } + return builder.toString(); + } + } + +} diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/xml/XMLConfigProvider.java b/Web/src/main/java/org/emerjoin/hi/web/config/xml/XMLConfigProvider.java index b2f4d68..da86c28 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/config/xml/XMLConfigProvider.java +++ b/Web/src/main/java/org/emerjoin/hi/web/config/xml/XMLConfigProvider.java @@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; @@ -51,7 +52,7 @@ private Configurator getConfigurator(Class clazz) throws }catch (Exception ex){ - throw new BadConfiguratorException("Failed to initialize the configurator "+clazz.getCanonicalName(),ex); + throw new BadConfiguratorException("Failed to init the configurator "+clazz.getCanonicalName(),ex); } @@ -94,7 +95,6 @@ private Set> getConfigurators(Set indexSet){ } public void load(ServletContext servletContext, ServletConfig config, Set indexSet) throws HiException{ - Set> configurators = getConfigurators(indexSet); Document document = loadDocument(servletContext); Element docElement = document.getDocumentElement(); @@ -108,15 +108,18 @@ public void load(ServletContext servletContext, ServletConfig config, Set ConfigSection section = (ConfigSection) clazz.getDeclaredAnnotation(ConfigSection.class); HashMap elements = new HashMap<>(); - for(String tag: section.tags()){ - - NodeList nodeList = docElement.getElementsByTagName(tag); - if(nodeList.getLength()==0) - continue; - - elements.put(tag,(Element) nodeList.item(0)); - + NodeList childNodes = docElement.getChildNodes(); + for(int i=0; i continue; } - _log.info("Loading configurator " + clazz.getCanonicalName() + "..."); configurator.doConfig(AppConfigurations.get(),elements,docElement); - } - } diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/FrontiersConfig.java b/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/FrontiersConfig.java index 14f3e02..0f508b5 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/FrontiersConfig.java +++ b/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/FrontiersConfig.java @@ -3,7 +3,9 @@ import org.emerjoin.hi.web.config.AppConfigurations; import org.emerjoin.hi.web.config.BadConfigException; import org.emerjoin.hi.web.config.Configurator; +import org.emerjoin.hi.web.config.Frontiers; import org.emerjoin.hi.web.config.xml.ConfigSection; +import org.emerjoin.xmleasy.XMLEasy; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -12,27 +14,35 @@ /** * @author Mário Júnior */ -@ConfigSection(tags = "frontier-packages") +@ConfigSection(tags = "frontiers") public class FrontiersConfig implements Configurator { - @Override public void doConfig(AppConfigurations configs, Map elements, Element document) throws BadConfigException { - - Element frontiersElement = elements.get("frontier-packages"); - NodeList allFrontiersNodeList = frontiersElement.getElementsByTagName("package"); - - if(allFrontiersNodeList.getLength()>0){ - - for(int i=0;i { + frontiersConfig.setDefaultTimeout(Long.parseLong(defaultTimeoutXml.getContent())); + }).eval(); + + xmlEasy.ifChild("security").then(securityXml -> { + Frontiers.Security.CrossSiteRequestForgery crossSiteRequestForgery = frontiersConfig.getSecurity().getCrossSiteRequestForgery(); + securityXml.ifChild("cross-site-request-forgery").then(crossSiteRequestForgeryXml -> { + Frontiers.Security.CrossSiteRequestForgery.Token token = crossSiteRequestForgery.getToken(); + XMLEasy csrfTokenXml = crossSiteRequestForgeryXml.child("token"); + token.setJwtAlgorithm(csrfTokenXml.child("jwt-algorithm").getContent()); + token.setJwtPassphrase(csrfTokenXml.child("jwt-passphrase").getContent()); + token.setSecureRandomSize(Integer.parseInt(csrfTokenXml.child("secure-random-size") + .getContent())); + + Frontiers.Security.CrossSiteRequestForgery.Cookie cookie = crossSiteRequestForgery.getCookie(); + XMLEasy csrfCookie = crossSiteRequestForgeryXml.child("cookie"); + cookie.setHttpOnly(Boolean.parseBoolean(csrfCookie.child("http-only").getContent())); + cookie.setHttpOnly(Boolean.parseBoolean(csrfCookie.child("secure").getContent())); + }).eval(); + }).eval(); } diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/SecurityConfig.java b/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/SecurityConfig.java new file mode 100644 index 0000000..e87ab6a --- /dev/null +++ b/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/SecurityConfig.java @@ -0,0 +1,58 @@ +package org.emerjoin.hi.web.config.xml.sections; + +import org.emerjoin.hi.web.config.*; +import org.emerjoin.hi.web.config.xml.ConfigSection; +import org.emerjoin.xmleasy.XMLEasy; +import org.w3c.dom.Element; + +import java.util.Map; +import java.util.Optional; + +/** + * @author Mário Júnior + */ +@ConfigSection(tags = "security") +public class SecurityConfig implements Configurator { + + @Override + public void doConfig(AppConfigurations configs, Map elements, Element document) throws BadConfigException { + Security securityConfig = configs.getSecurityConfig(); + Security.ContentSecurityPolicy contentPolicy = securityConfig.getContentPolicy(); + Element xmlElement = elements.get("security"); + XMLEasy xmlEasy = XMLEasy.it(xmlElement); + xmlEasy.ifChild("content-security-policy").then(contentPolicyXml -> { + contentPolicyXml.getContentIfPresent("reporting-url",contentPolicy::setReportingUrl); + contentPolicyXml.ifChild("deny-iframe-embedding",element -> { + contentPolicy.setDenyIframeEmbeding(Boolean.parseBoolean(element. + getContent())); + }); + contentPolicyXml.getContentIfPresent("block-mixed-content", + val -> contentPolicy.setBlockMixedContent(Boolean. + parseBoolean(val))); + contentPolicyXml.ifChild("policy-allow", allowXmlElement -> { + allowXmlElement.ifChild("navigation", element -> { + element.optionalAttribute("to") + .ifPresent(contentPolicy::setNavigateToDirective); + element.getContentIfPresent("form-action",contentPolicy:: + setFormActionDirective); + }); + allowXmlElement.ifChild("content", element -> { + Optional defaultContentSource = element.optionalAttribute("from"); + defaultContentSource.ifPresent(contentSource -> { + contentPolicy.setDefaultContentSource(defaultContentSource.get()); + }); + element.ifChild("images",it -> contentPolicy.setImageContentSource(it.attribute("from"))); + element.ifChild("scripts",it -> contentPolicy.setScriptContentSource(it.attribute("from"))); + element.ifChild("styles",it -> contentPolicy.setStyleContentSource(it.attribute("from"))); + element.ifChild("media",it -> contentPolicy.setMediaContentSource(it.attribute("from"))); + element.ifChild("objects",it -> contentPolicy.setObjectContentSource(it.attribute("from"))); + }); + }); + + }).eval(); + + + + } + +} diff --git a/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/WebConfig.java b/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/WebConfig.java index 459888e..b8421ed 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/WebConfig.java +++ b/Web/src/main/java/org/emerjoin/hi/web/config/xml/sections/WebConfig.java @@ -62,10 +62,9 @@ private void deploymentAndLang(Element docElement, AppConfigurations configs){ @Override public void doConfig(AppConfigurations configs, Map elements, org.w3c.dom.Element docElement) throws BadConfigException { - //Template and MVC Configurations org.w3c.dom.Element webElement = (org.w3c.dom.Element) docElement.getElementsByTagName("web").item(0); - XMLEasy.easy(webElement).ifChild(FRONTIERS_TIMEOUT_ELEMENT) + XMLEasy.it(webElement).ifChild(FRONTIERS_TIMEOUT_ELEMENT) .then((el) -> configs.setFrontiersTimeout(Long.parseLong(el.getContent()))).eval(); NodeList viewsDirectoryNodes = webElement.getElementsByTagName("views-directory"); @@ -91,11 +90,8 @@ public void doConfig(AppConfigurations configs, Map templates(webElement,configs); deploymentAndLang(docElement,configs); - } - - } diff --git a/Web/src/main/java/org/emerjoin/hi/web/events/CSRFAttackAttemptEvent.java b/Web/src/main/java/org/emerjoin/hi/web/events/CSRFAttackAttemptEvent.java new file mode 100644 index 0000000..4dc41d8 --- /dev/null +++ b/Web/src/main/java/org/emerjoin/hi/web/events/CSRFAttackAttemptEvent.java @@ -0,0 +1,10 @@ +package org.emerjoin.hi.web.events; + +/** + * @author Mario Junior. + */ +public class CSRFAttackAttemptEvent extends HiEvent { + + + +} diff --git a/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nStarter.java b/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nStarter.java index b7cd69b..7ff722a 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nStarter.java +++ b/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nStarter.java @@ -118,14 +118,14 @@ private I18nMappingsInfo loadMappings(URL mappingsXML, String lang){ I18nMappingsInfo i18nMappingsInfo = new I18nMappingsInfo(); - XMLEasy xmlEasy = new XMLEasy(mappingsXML).validate(MAPPINGS_XSD).freeze(); + XMLEasy xmlEasy = new XMLEasy(mappingsXML).validate(MAPPINGS_XSD); xmlEasy.ifChild(TEMPLATES_MAPPINGS_TAG).then(templates -> { LOG.info("Loading templates i18n mappings..."); //Load templates mappings templates.streamChildren().forEach((template -> { String templateName = template.getAttribute("for"); LOG.info(String.format("Loading I18n mappings for [%s]",templateName)); - XMLEasy xml = XMLEasy.easy(template); + XMLEasy xml = XMLEasy.it(template); getMappedDictionaries(xml.streamChildren(),lang) .forEach(url -> i18nMappingsInfo.addTemplateMapping(templateName,url)); @@ -138,7 +138,7 @@ private I18nMappingsInfo loadMappings(URL mappingsXML, String lang){ views.streamChildren().forEach(view -> { String path = view.getAttribute("for"); LOG.info(String.format("Loading I18n mappings for [%s]",path)); - XMLEasy xml = XMLEasy.easy(view); + XMLEasy xml = XMLEasy.it(view); getMappedDictionaries(xml.streamChildren(),lang) .forEach(url -> i18nMappingsInfo.addViewMapping("/"+path,url)); diff --git a/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nXmlConfig.java b/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nXmlConfig.java index 796bec0..92e8d66 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nXmlConfig.java +++ b/Web/src/main/java/org/emerjoin/hi/web/i18n/I18nXmlConfig.java @@ -31,13 +31,13 @@ public static Optional getConfiguration(){ @Override public void doConfig(AppConfigurations configs, Map elements, Element document) throws BadConfigException { - XMLEasy i18nXml = new XMLEasy(document).child("i18n").freeze(); + XMLEasy i18nXml = new XMLEasy(document).child("i18n"); I18nConfiguration configuration = new I18nConfiguration(); List languages = new ArrayList<>(); i18nXml.child("languages").streamChildren() .forEach(element -> { - XMLEasy easy = XMLEasy.easy(element); + XMLEasy easy = XMLEasy.it(element); String languageName = element.getTextContent(); languages.add(languageName); Optional defaultLang = easy.optionalAttribute("default"); diff --git a/Web/src/main/java/org/emerjoin/hi/web/internal/Router.java b/Web/src/main/java/org/emerjoin/hi/web/internal/Router.java index 4a4f652..bd94540 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/internal/Router.java +++ b/Web/src/main/java/org/emerjoin/hi/web/internal/Router.java @@ -92,18 +92,19 @@ public int doRoute(RequestContext requestContext, String routeURL, boolean isPos boolean handled = false; if(wasPreviouslyMatched(routeURL)){ ReqHandler reqHandler = ReqHandler.getHandler(getPreviouslyMatchedHandler(routeURL)); + int status = 200; try { if (!reqHandler.handle(requestContext)) { requestContext.getResponse().sendError(404); return 404; - } + } else status = requestContext.getResponse().getStatus(); }catch (ServletException ex){ throw ex; }catch (Throwable ex){ throw new ServletException(ex); } - return 200; + return status; } diff --git a/Web/src/main/java/org/emerjoin/hi/web/mvc/Controller.java b/Web/src/main/java/org/emerjoin/hi/web/mvc/Controller.java index b31af21..63d9bd1 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/mvc/Controller.java +++ b/Web/src/main/java/org/emerjoin/hi/web/mvc/Controller.java @@ -2,6 +2,8 @@ import org.emerjoin.hi.web.*; import org.emerjoin.hi.web.config.AppConfigurations; +import org.emerjoin.hi.web.config.Frontiers; +import org.emerjoin.hi.web.config.Security; import org.emerjoin.hi.web.events.TemplateLoadEvent; import org.emerjoin.hi.web.events.TemplateTransformEvent; import org.emerjoin.hi.web.events.ViewTransformEvent; @@ -16,6 +18,8 @@ import javax.enterprise.event.Event; import javax.enterprise.inject.spi.CDI; import javax.inject.Inject; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.net.URL; import java.util.HashMap; @@ -45,6 +49,12 @@ public class Controller { @Inject private I18nContext i18nContext; + @Inject + private AppContext appContext; + + @Inject + private ActiveUser activeUser; + private static Logger _log = LoggerFactory.getLogger(Controller.class); private void prepareView(RequestContext requestContext, String controllerName, String actionName, @@ -150,6 +160,7 @@ public void callView(Map values) throws NoSuchViewException, Temp TemplateLoadEvent event = null; if(!requestContext.hasAjaxHeader()){ + this.emitSecurityHeaders(requestContext); event = new TemplateLoadEvent(); templateLoadEvent.fire(event); } @@ -182,7 +193,46 @@ public void callView(Map values) throws NoSuchViewException, Temp } + private void emitSecurityHeaders(RequestContext context){ + this.emitCSRFHeaders(context); + this.emitCSPHeaders(context); + } + + private void emitCSRFHeaders(RequestContext context){ + Frontiers frontiersConfig = AppConfigurations.get().getFrontiersConfig(); + Frontiers.Security.CrossSiteRequestForgery crossSiteRequestForgery = frontiersConfig + .getSecurity() + .getCrossSiteRequestForgery(); + Frontiers.Security.CrossSiteRequestForgery.Cookie cookieConfig = crossSiteRequestForgery + .getCookie(); + HttpServletResponse response = context.getResponse(); + String token = activeUser.expireCsrfToken(); + Cookie cookie = new Cookie(Frontiers.Security.CrossSiteRequestForgery.Cookie.NAME,token); + cookie.setHttpOnly(cookieConfig.isHttpOnly()); + cookie.setSecure(cookieConfig.isSecure()); + cookie.setPath(getCookiePath()); + cookie.setDomain(appContext.getDomain()); + response.addCookie(cookie); + } + private String getCookiePath(){ + String baseUrl = appContext.getBaseURL(); + String originUrl = appContext.getOrigin(); + String path = baseUrl.substring(originUrl.length(),baseUrl.length()); + return path; + } + private void emitCSPHeaders(RequestContext context){ + Security securityConfig = AppConfigurations.get().getSecurityConfig(); + Security.ContentSecurityPolicy contentSecurityPolicy = securityConfig.getContentPolicy(); + HttpServletResponse response = context.getResponse(); + if(contentSecurityPolicy.isDenyIframeEmbeding()) + response.setHeader("X-Frame-Options","deny"); + String policyStr = contentSecurityPolicy.toString(); + if(!policyStr.isEmpty()) { + _log.debug("Content-Security-Policy: " + policyStr); + response.setHeader("Content-Security-Policy", policyStr); + } + } } diff --git a/Web/src/main/java/org/emerjoin/hi/web/mvc/HTMLizer.java b/Web/src/main/java/org/emerjoin/hi/web/mvc/HTMLizer.java index 4a45edb..23f61b3 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/mvc/HTMLizer.java +++ b/Web/src/main/java/org/emerjoin/hi/web/mvc/HTMLizer.java @@ -188,7 +188,6 @@ private String getAppData(){ map.put("simple_base_url", appContext.getBaseURL().replace(http,"").replace(https,"")); map.put("deployId",appContext.getDeployId()); map.put("deployMode",appContext.getDeployMode().toString()); - map.put("csrfToken",activeUser.getCsrfToken()); return gson.toJson(map); diff --git a/Web/src/main/java/org/emerjoin/hi/web/req/FrontierSecurityChecklist.java b/Web/src/main/java/org/emerjoin/hi/web/req/FrontierSecurityChecklist.java new file mode 100644 index 0000000..a8aa1e7 --- /dev/null +++ b/Web/src/main/java/org/emerjoin/hi/web/req/FrontierSecurityChecklist.java @@ -0,0 +1,45 @@ +package org.emerjoin.hi.web.req; + +/** + * @author Mario Junior. + */ +public class FrontierSecurityChecklist { + + private boolean originCheck; + private boolean csrfTokenPresent; + private boolean csrfTokenValid; + private boolean csrfTokenExpired; + + public boolean isOriginCheck() { + return originCheck; + } + + public void setOriginCheck(boolean originCheck) { + this.originCheck = originCheck; + } + + public boolean isCsrfTokenPresent() { + return csrfTokenPresent; + } + + public void setCsrfTokenPresent(boolean csrfTokenPresent) { + this.csrfTokenPresent = csrfTokenPresent; + } + + public boolean isCsrfTokenValid() { + return csrfTokenValid; + } + + public void setCsrfTokenValid(boolean csrfTokenValid) { + this.csrfTokenValid = csrfTokenValid; + } + + public boolean isCsrfTokenExpired() { + return csrfTokenExpired; + } + + public void setCsrfTokenExpired(boolean csrfTokenExpired) { + this.csrfTokenExpired = csrfTokenExpired; + } + +} diff --git a/Web/src/main/java/org/emerjoin/hi/web/req/FrontiersReqHandler.java b/Web/src/main/java/org/emerjoin/hi/web/req/FrontiersReqHandler.java index 8537f26..c992499 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/req/FrontiersReqHandler.java +++ b/Web/src/main/java/org/emerjoin/hi/web/req/FrontiersReqHandler.java @@ -5,7 +5,10 @@ import org.emerjoin.hi.web.AppContext; import org.emerjoin.hi.web.FrontEnd; import org.emerjoin.hi.web.RequestContext; +import org.emerjoin.hi.web.config.AppConfigurations; import org.emerjoin.hi.web.config.ConfigProvider; +import org.emerjoin.hi.web.config.Frontiers; +import org.emerjoin.hi.web.events.CSRFAttackAttemptEvent; import org.emerjoin.hi.web.events.FrontierRequestEvent; import org.emerjoin.hi.web.frontier.FileUpload; import org.emerjoin.hi.web.frontier.FrontierInvoker; @@ -17,6 +20,7 @@ import org.emerjoin.hi.web.frontier.model.FrontierMethod; import org.emerjoin.hi.web.frontier.model.MethodParam; import org.emerjoin.hi.web.mvc.HTMLizer; +import org.emerjoin.hi.web.security.CsrfTokenUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,7 +30,9 @@ import javax.inject.Inject; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; @@ -39,6 +45,7 @@ public class FrontiersReqHandler extends ReqHandler { private static Map frontiersMap = new HashMap(); + private static final Logger LOGGER = LoggerFactory.getLogger(FrontiersReqHandler.class); public static void addFrontier(FrontierClass frontierClass){ frontiersMap.put(frontierClass.getSimpleName(),frontierClass); @@ -60,16 +67,23 @@ public static FrontierClass getFrontier(String name){ private ServletContext servletContext; @Inject private RequestContext requestContext; + @Inject private ActiveUser activeUser; + @Inject private Event frontierRequestEvent; + + @Inject + private Event csrfAttackAttemptEventEvent; + @Inject private ConfigProvider configProvider; private Logger log = null; private Gson gson = null; private Base64.Decoder decoder = Base64.getDecoder(); + private CsrfTokenUtil csrfTokenUtil = new CsrfTokenUtil(); private Object getParamValue(String frontier,FrontierMethod frontierMethod, MethodParam methodParam, Map uploadsMap,Map argsMap, @@ -383,21 +397,48 @@ private void okInvocationResult(FrontierInvoker frontierInvoker, } - private boolean isAuthenticRequest(RequestContext requestContext){ - - String token = requestContext.getRequest().getHeader("csrfToken"); - if(token==null) { - log.warn("CSRF Token Header missing on Request"); - return false; + private Optional getCSRFCookie(HttpServletRequest request){ + String cookieName = Frontiers.Security.CrossSiteRequestForgery.Cookie.NAME; + for(Cookie cookie: request.getCookies()){ + if(cookie.getName().equals(cookieName)) + return Optional.of(cookie); } + LOGGER.warn("Cookie not present: "+cookieName); + return Optional.empty(); + } - if(!token.equals(activeUser.getCsrfToken())){ - log.warn("Invalid Request CSRF Token"); - return false; + private FrontierSecurityChecklist checkRequest(RequestContext requestContext){ + FrontierSecurityChecklist checklist = new FrontierSecurityChecklist(); + String requestOrigin = requestContext.getRequest().getHeader("Origin"); + if(requestOrigin!=null&&!requestOrigin.equals(appContext.getOrigin())){ + LOGGER.warn("CSRF Attack attempt detected. Not a valid origin: "+requestOrigin); + csrfAttackAttemptEventEvent.fire(new CSRFAttackAttemptEvent()); + return checklist; } - - return true; - + checklist.setOriginCheck(true); + Optional csrfCookie = getCSRFCookie(requestContext.getRequest()); + if(!csrfCookie.isPresent()){ + LOGGER.warn("CSRF protection Cookie not found"); + return checklist; + } + checklist.setCsrfTokenPresent(true); + if(!activeUser.getCsrfToken().equals(csrfCookie.get().getValue())){ + log.warn("CSRF Token did not match"); + String jwt = csrfCookie.get().getValue(); + if(!csrfTokenUtil.checkJwtToken(jwt)) { + LOGGER.warn("CSRF Attack attempt detected. Not a valid token"); + csrfAttackAttemptEventEvent.fire(new CSRFAttackAttemptEvent()); + checklist.setCsrfTokenExpired(false); + checklist.setCsrfTokenValid(false); + return checklist; + }else { + checklist.setCsrfTokenValid(true); + checklist.setCsrfTokenExpired(true); + return checklist; + } + } + checklist.setCsrfTokenValid(true); + return checklist; } @PostConstruct @@ -408,13 +449,31 @@ private void handlerReady(){ } - @Override - public boolean handle(RequestContext requestContext) throws ServletException, IOException { - if(!isAuthenticRequest(requestContext)) { - log.warn("Not an authentic Request"); + + private void emmitCSPHeaders(RequestContext context){ + HttpServletResponse response = context.getResponse(); + response.setHeader("Access-Control-Allow-Origin",appContext.getOrigin()); + response.setHeader("Vary","Origin"); + } + + private boolean securityCheck(RequestContext context){ + this.emmitCSPHeaders(context); + FrontierSecurityChecklist securityChecklist = checkRequest(requestContext); + HttpServletResponse response = requestContext.getResponse(); + if(!securityChecklist.isOriginCheck()||!securityChecklist.isCsrfTokenPresent()||!securityChecklist.isCsrfTokenValid()) { + response.setStatus(403); + return false; + }else if(securityChecklist.isCsrfTokenExpired()){ + response.setStatus(419); return false; } + return true; + } + @Override + public boolean handle(RequestContext requestContext) throws ServletException, IOException { + if(!securityCheck(requestContext)) + return true; String[] frontierPair = getFrontierPair(requestContext); String invokedClass = frontierPair[0]; String invokedMethod = frontierPair[1]; @@ -423,39 +482,31 @@ public boolean handle(RequestContext requestContext) throws ServletException, IO requestContext.getResponse().sendError(400); return true; } - if(!frontierExists(invokedClass)) { log.warn("Frontier not found"); return false; } - FrontierClass frontierClass = getFrontier(invokedClass); if(!frontierClass.hasMethod(invokedMethod)) { log.warn("Frontier method not found"); return false; } - FrontierMethod frontierMethod = frontierClass.getMethod(invokedMethod); Map params = matchParams(invokedClass,frontierMethod, requestContext); FrontierInvoker frontierInvoker = new FrontierInvoker(frontierClass,frontierMethod,params); boolean invocationOK; - try { - if(!accessGranted(frontierClass.getObject().getClass(),frontierMethod.getMethod())){ log.warn("Access to frontier method denied"); requestContext.getResponse().sendError(403); return true; } invocationOK = executeFrontier(frontierInvoker,frontierMethod,frontierClass); - }catch (Exception ex){ return handleException(ex,invokedClass,invokedMethod); } - if(invocationOK) okInvocationResult(frontierInvoker,frontierClass,frontierMethod); - return invocationOK; } diff --git a/Web/src/main/java/org/emerjoin/hi/web/req/MVCReqHandler.java b/Web/src/main/java/org/emerjoin/hi/web/req/MVCReqHandler.java index 4d61f29..f986c47 100755 --- a/Web/src/main/java/org/emerjoin/hi/web/req/MVCReqHandler.java +++ b/Web/src/main/java/org/emerjoin/hi/web/req/MVCReqHandler.java @@ -315,6 +315,12 @@ public boolean handle(RequestContext requestContext) throws ServletException, IO } + private void renewCsrfToken(){ + + + + } + diff --git a/Web/src/main/java/org/emerjoin/hi/web/security/CsrfTokenUtil.java b/Web/src/main/java/org/emerjoin/hi/web/security/CsrfTokenUtil.java new file mode 100644 index 0000000..728ea6f --- /dev/null +++ b/Web/src/main/java/org/emerjoin/hi/web/security/CsrfTokenUtil.java @@ -0,0 +1,83 @@ +package org.emerjoin.hi.web.security; + +import io.jsonwebtoken.*; +import org.emerjoin.hi.web.config.AppConfigurations; +import org.emerjoin.hi.web.config.Frontiers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.security.SecureRandom; +import java.util.Date; +import java.util.UUID; + +/** + * @author Mario Junior. + */ +public class CsrfTokenUtil { + + private static final Logger LOGGER = LoggerFactory.getLogger(CsrfTokenUtil.class); + + private String makeSecureRandom(){ + AppConfigurations appConfigurations = AppConfigurations.get(); + Frontiers frontiers = appConfigurations.getFrontiersConfig(); + Frontiers.Security frontiersSecurity = frontiers.getSecurity(); + int secureRandomSize = frontiersSecurity.getCrossSiteRequestForgery().getToken().getSecureRandomSize(); + SecureRandom secureRandom = new SecureRandom(); + byte[] randomBuffer = new byte[secureRandomSize]; + secureRandom.nextBytes(randomBuffer); + return DatatypeConverter.printHexBinary(randomBuffer); + } + + public String makeJwtToken(){ + AppConfigurations appConfigurations = AppConfigurations.get(); + Frontiers frontiers = appConfigurations.getFrontiersConfig(); + Frontiers.Security frontiersSecurity = frontiers.getSecurity(); + Frontiers.Security.CrossSiteRequestForgery.Token tokenConfig = frontiersSecurity + .getCrossSiteRequestForgery() + .getToken(); + + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.valueOf(tokenConfig + .getJwtAlgorithm()); + + long nowMillis = System.currentTimeMillis(); + Date now = new Date(nowMillis); + + byte[] secretBytes = DatatypeConverter.parseBase64Binary(tokenConfig.getJwtPassphrase()); + Key signingKey = new SecretKeySpec(secretBytes, signatureAlgorithm.getJcaName()); + + //Let's set the JWT Claims + JwtBuilder builder = Jwts.builder().setId(UUID.randomUUID().toString()) + .setIssuedAt(now) + .setSubject(makeSecureRandom()) + .setIssuer("") + .signWith(signatureAlgorithm, signingKey); + + return builder.compact(); + } + + public boolean checkJwtToken(String jwt){ + AppConfigurations appConfigurations = AppConfigurations.get(); + Frontiers frontiers = appConfigurations.getFrontiersConfig(); + Frontiers.Security frontiersSecurity = frontiers.getSecurity(); + Frontiers.Security.CrossSiteRequestForgery.Token tokenConfig = frontiersSecurity + .getCrossSiteRequestForgery() + .getToken(); + byte[] secretBytes = DatatypeConverter.parseBase64Binary(tokenConfig + .getJwtPassphrase()); + try { + Jwts.parser().setSigningKey(secretBytes).parseClaimsJws(jwt) + .getBody() + .getSubject(); + return true; + }catch (SignatureException ex){ + return false; + }catch (JwtException ex){ + LOGGER.error("Error validating JSON Web Token: "+jwt, ex); + return false; + } + } + +} diff --git a/Web/src/main/java/org/emerjoin/hi/web/uti/Timing.java b/Web/src/main/java/org/emerjoin/hi/web/util/Timing.java similarity index 92% rename from Web/src/main/java/org/emerjoin/hi/web/uti/Timing.java rename to Web/src/main/java/org/emerjoin/hi/web/util/Timing.java index 5b47d94..6122849 100644 --- a/Web/src/main/java/org/emerjoin/hi/web/uti/Timing.java +++ b/Web/src/main/java/org/emerjoin/hi/web/util/Timing.java @@ -1,4 +1,4 @@ -package org.emerjoin.hi.web.uti; +package org.emerjoin.hi.web.util; /** * @author Mário Júnior