diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4a71241238359c855efca5fb05f6344b8e39e8f1..d9e5afa4c83664fda108fe3cdd43ed5d350e095c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<manifest android:hardwareAccelerated="true" android:versionCode="104016" android:versionName="1.4.16" package="fr.duniter.cesium" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
+<manifest android:hardwareAccelerated="true" android:versionCode="104017" android:versionName="1.4.17" package="fr.duniter.cesium" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
     <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
     <uses-permission android:name="android.permission.INTERNET" />
     <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
diff --git a/assets/www/config.js b/assets/www/config.js
index e53945f97b0a8ed4530da6705f6e695696a02cf8..9a099e1c100b9ebf4da8d300634e74db7ebb0885 100644
--- a/assets/www/config.js
+++ b/assets/www/config.js
@@ -86,8 +86,8 @@ angular.module("cesium.config", [])
 			"defaultCountry": "France"
 		}
 	},
-	"version": "1.4.16",
-	"build": "2019-12-27T20:08:42.922Z",
+	"version": "1.4.17",
+	"build": "2019-12-27T20:28:07.912Z",
 	"newIssueUrl": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new"
 })
 
diff --git a/assets/www/dist_js/cesium-346c044447.js b/assets/www/dist_js/cesium-fc8a3b811f.js
similarity index 83%
rename from assets/www/dist_js/cesium-346c044447.js
rename to assets/www/dist_js/cesium-fc8a3b811f.js
index 3a07acd03e9d936735df92556f259df3710d49e6..f6feb792d45779a6aa858705f298fc0549f99835 100644
--- a/assets/www/dist_js/cesium-346c044447.js
+++ b/assets/www/dist_js/cesium-fc8a3b811f.js
@@ -1,4 +1,4 @@
-function Peer(e){var t=this;Object.keys(e).forEach(function(n){t[n]=e[n]}),t.endpoints=t.endpoints||[]}function Block(e,t){"use strict";var n=this;t&&t.length?_.forEach(t,function(t){n[t]=e[t]}):["currency","issuer","medianTime","number","version","powMin","dividend","membersCount","hash","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions","unitbase"].forEach(function(t){n[t]=e[t]}),n.identitiesCount=n.identities?n.identities.length:0,n.joinersCount=n.joiners?n.joiners.length:0,n.activesCount=n.actives?n.actives.length:0,n.leaversCount=n.leavers?n.leavers.length:0,n.revokedCount=n.revoked?n.revoked.length:0,n.excludedCount=n.excluded?n.excluded.length:0,n.certificationsCount=n.certifications?n.certifications.length:0,n.transactionsCount=n.transactions?n.transactions.length:0,n.empty=n.isEmpty()}function exact(e){return new RegExp("^"+e+"$")}function Ws2pMessage(e){var t=this,n=e.split(":");if(n.length<3||!n[0].startsWith("WS2P"))throw Error("Invalid format: "+e);if("HEAD"==n[1]){if(n.length<4)throw Error("Invalid format: "+e);if(4==n.length)t.pubkey=n[2],t.buid=n[3];else{if(n[2]>=1){var i=n[0];if(i.length>4){var a=this.regexp.WS2P_PREFIX.exec(i);if(!a)throw Error("Invalid format: "+e);var o=a[1];if(o){t.private={useTor:o.startsWith("T")};var r=o.substring(1);"A"==r?t.private.mode="all":"M"==r?t.private.mode="mixed":"S"==r&&(t.private.mode="strict")}var s=a[2];s&&(t.public={useTor:s.startsWith("T"),mode:"all"})}t.pubkey=n[3],t.buid=n[4],t.ws2pid=n[5],t.sotfware=n[6],t.version=n[7],t.powPrefix=n[8]}}}}function PluginExtensionPointController(e,t){"ngInject";e.extensionPoint=t.extensions.points.current.get()}function AppController(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,_,f){"ngInject";e.walletData=E.data,e.search={},e.login=E.isLogin(),e.auth=E.isAuth(),e.motion=p.motion.default,e.fullscreen=p.screen.fullscreen.isEnabled(),e.showHome=function(){return r.nextViewOptions({historyRoot:!0}),n.go("app.home").then(p.loading.hide)},e.scanQrCodeAndGo=function(){if(b.barcode.enable)return b.barcode.scan().then(function(e){if(e)return m.uri.parse(e).then(function(e){if(!e||!e.pubkey)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return n.go("app.wot_identity",{pubkey:e.pubkey,node:e.host?e.host:null})}).catch(function(t){return console.debug("[app] Scan data is not an URI (get error: "+(t&&t.message||t)+"). Trying to decode as a WIF or EWIF format..."),d.keyfile.parseData(e).then(function(e){if(!e||!e.signPk||!e.signSk)throw t;var i=u.base58.encode(e.signPk);console.debug("[app] Detected WIF/EWIF format. Will login to wallet {"+i.substring(0,8)+"}");var a=E.isLogin()?E.children.create({store:!1}):E;return a.login({silent:!0,forceAuth:!0,minData:!1,authData:{pubkey:i,keypair:e}}).then(function(){return r.nextViewOptions({historyRoot:!0}),n.go("app.new_transfer",{all:!0,wallet:a.isDefault()?void 0:a.id})})}).catch(p.onError("ERROR.SCAN_UNKNOWN_FORMAT"))})}).catch(p.onError("ERROR.SCAN_FAILED"))},e.createHelptipScope=function(n,i){if(n||!t.tour&&t.settings.helptip.enable&&!p.screen.isSmall()){var a=e.$new();return s(i||"HelpTipCtrl",{$scope:a}),a}},e.startHelpTour=function(n,i){if(t.tour=!0,!i)return r.clearHistory(),r.clearCache().then(function(){e.startHelpTour(n,!0)});var a=e.createHelptipScope(!0,n);return a.startHelpTour().then(function(){a.$destroy(),delete t.tour}).catch(function(e){delete t.tour})},e.isLogin=function(){return e.login},e.loadWalletData=function(e){return console.warn("[app-controller] DEPRECATED  - Please use csWallet.load() instead of $scope.loadWalletData()",new Error),e=e||{},(e.wallet||E).loadData(e).then(function(e){if(!e)throw"CANCELLED";return e})},e.loadWallet=function(t){if(console.warn("[app-controller] DEPRECATED  - Please use csWallet.loginOrLoad() instead of $scope.loadWallet()",new Error),!c.isStarted())return c.ready().then(function(){return e.loadWallet(t)});t=t||{};var n=t.wallet||E;return t.auth&&!n.isAuth()?n.auth(t).then(function(e){if(e)return e;throw"CANCELLED"}):n.isLogin()?n.isDataLoaded(t)?a.when(n.data):e.loadWalletData(t):n.login(t).then(function(e){if(e)return e;throw"CANCELLED"})},e.loginAndGo=function(t,i){e.closeProfilePopover(),i=i||{};var a=i.wallet||E;if(delete i.wallet,t=t||"app.view_wallet",a.isLogin())return n.go(t,i);if(_.httpsMode&&l.location&&"https:"!==l.location.protocol){var o=l.location.href,r=o.indexOf("#"),s=-1!=r?o.substr(0,r):o;if(s="https"+s.substr(4),o=s+n.href(t),!_.httpsModeDebug)return void(l.location.href=o);console.debug("[httpsMode] --- Should redirect to: "+o)}return a.login(i).then(function(){return n.go(t,i)}).then(p.loading.hide)},e.logout=function(t){t=t||{};var n=t.wallet||E;return!t.force&&e.profilePopover?e.profilePopover.hide().then(function(){return t.force=!0,e.logout(t)}):t.askConfirm?p.alert.confirm("CONFIRM.LOGOUT").then(function(n){if(n)return t.askConfirm=!1,e.logout(t)}):(p.loading.show(),n.logout().then(function(){if(i.isOpenLeft()&&i.toggleLeft(),n.isDefault())return r.clearHistory(),r.clearCache().then(function(){return e.showHome()})}).catch(p.onError()))},e.doAuth=function(e){return(e&&e.wallet||E).auth().then(p.loading.hide)},e.isUserPubkey=function(e){return E.isUserPubkey(e)},E.api.data.on.login(e,function(t,n){return e.login=!0,n?n.resolve():a.when()}),E.api.data.on.logout(e,function(){e.login=!1}),E.api.data.on.auth(e,function(t,n){return e.auth=!0,n?n.resolve():a.when()}),E.api.data.on.unauth(e,function(){e.auth=!1}),e.showTransferModal=function(e){return g.showTransfer(e)},e.showAboutModal=function(){return g.showAbout()},e.showJoinModal=function(){return e.closeProfilePopover(),g.showJoin()},e.showSettings=function(){return e.closeProfilePopover(),n.go("app.settings")},e.showHelpModal=function(e){return g.showHelp(e)},e.showProfilePopover=function(t){return p.popover.show(t,{templateUrl:"templates/common/popover_profile.html",scope:e,autoremove:!0,afterShow:function(t){e.profilePopover=t,o(function(){p.ink({selector:"#profile-popover .ink, #profile-popover .ink-dark"})},100)}})},e.closeProfilePopover=function(){e.profilePopover&&e.profilePopover.isShown()&&o(function(){e.profilePopover.hide()})},e.showPeerInfoPopover=function(t){return p.popover.show(t,{templateUrl:"templates/network/popover_peer_info.html",autoremove:!0,scope:e.$new(!0)})},e.openLink=function(e,t,n){return e.stopPropagation(),e.preventDefault(),n=n||{},n.onError=function(){return p.popover.copy(e,t)},f.uri.open(t,n),!1},e.showFab=function(e,t){p.motion.toggleOn({selector:"#"+e+".button-fab"},t)},e.hideFab=function(e,t){p.motion.toggleOff({selector:"#"+e+".button-fab"},t)},e.doMotion=function(t){return e.motion.show(t)},e.askFullscreen=function(){if(!e.fullscreen&&p.screen.isSmall()&&b.isWeb())return p.alert.confirm("CONFIRM.FULLSCREEN",null,{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then(function(t){t&&e.toggleFullscreen()})},e.toggleFullscreen=function(){e.fullscreen=!p.screen.fullscreen.isEnabled(),p.screen.fullscreen.toggleAll()}}function HomeController(e,t,n,i,a,o,r,s,l){"ngInject";e.loading=!0,e.locales=angular.copy(l.locales),e.enter=function(n,a){ionic.Platform.isIOS()&&window.StatusBar&&(StatusBar.overlaysWebView(!1),StatusBar.overlaysWebView(!0)),a&&a.stateParams&&a.stateParams.error?(e.error=a.stateParams.error,e.node=s.data.node,e.loading=!1,i.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),t.go("app.home",{error:void 0},{reload:!1,inherit:!0,notify:!1})):r.ready().then(function(){e.loading=!1}).catch(function(t){e.node=s.data.node,e.loading=!1,e.error=t})},e.$on("$ionicView.enter",e.enter),e.reload=function(){e.loading=!0,delete e.error,n(e.enter,200)},e.doQuickFix=function(e){"settings"==e&&(i.nextViewOptions({historyRoot:!0}),t.go("app.settings"))},e.changeLanguage=function(t){a.use(t),e.hideLocalesPopover(),l.data.locale=_.findWhere(e.locales,{id:t})},e.showLocalesPopover=function(t){o.popover.show(t,{templateUrl:"templates/api/locales_popover.html",scope:e,autoremove:!0,afterShow:function(t){e.localesPopover=t}})},e.hideLocalesPopover=function(){e.localesPopover&&(e.localesPopover.hide(),e.localesPopover=null)}}function JoinController(e,t,n,i,a){"ngInject";angular.extend(this,n("HomeCtrl",{$scope:e})),e.showJoinModal=function(){return e.loading?t(e.showJoinModal,500):a.isLogin()||e.error?void 0:t(i.showJoin,300)},e.$on("$ionicView.enter",e.showJoinModal)}function JoinChooseAccountTypeModalController(e,t,n,i,a){"ngInject";e.formData={},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.loading=!0,e.load=function(){if(e.loading)return a.get().then(function(t){t&&(e.currency=t,e.formData.currency=t.name,e.loading=!1)}).catch(i.onError("ERROR.GET_CURRENCY_FAILED"))},e.$on("modal.shown",e.load),e.$on("$ionicSlides.sliderInitialized",function(e,t){t.slider.lockSwipes()}),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes()},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes()},e.selectAccountTypeAndClose=function(t){e.formData.accountType=t,e.closeModal(e.formData)},e.doQuickFix=function(n){"settings"==n&&(e.closeModal(),t.go("app.settings"))},e.showHelpModal=function(e){n.showHelp({anchor:e})}}function JoinModalController(e,t,n,i,a,o,r,s,l,c,u,d,p){"ngInject";e.formData={pseudo:p.uid||"",pubkey:p.pubkey||void 0},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500,pager:!1,showPager:!1}},e.slideBehavior={},e.loading=!0,e.isLicenseRead=o.isIOS(),e.showUsername=!1,e.showPassword=!1,e.formData.computing=!1,e.smallscreen=r.screen.isSmall(),e.userIdPattern=d.constants.regexp.USER_ID,e.accountAvailable=!!p.pubkey,e.currency=p.currency,e.accountType=p.accountType||"member";var m;e.load=function(){if(e.loading){if(!(m=p.walletId&&u.children.get(p.walletId)||p.pubkey&&u.children.getByPubkey(p.pubkey)||(!p.pubkey||u.isUserPubkey(p.pubkey))&&u))throw new Error("Cannot found the corresponding wallet, from parameters.pubkey or parameters.walletId");console.debug("[join] Starting join modal on wallet {0}".format(m.id)),"member"===e.accountType&&(e.licenseFileUrl=l.getLicenseUrl(),e.licenseFileUrl&&(".txt"!=e.licenseFileUrl.substring(e.licenseFileUrl.length-3)&&(e.licenseFileUrl=e.licenseFileUrl+".html"),e.isLicenseRead||a(function(){e.isLicenseRead||(e.isLicenseRead=!0)},5e3))),e.slideBehavior=e.computeSlideBehavior(),e.loading=!1}},e.$on("modal.shown",e.load),e.$on("$ionicSlides.sliderInitialized",function(e,t){t.slider.lockSwipes()}),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes()},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes()},e.showAccountPubkey=function(){if(p.pubkey&&p.pseudo===e.formData.pseudo)return e.formData.pubkey=p.pubkey,void(e.formData.computing=!1);e.formData.computing=!0,s.scryptKeypair(e.formData.username,e.formData.password).then(function(t){return e.formData.pubkey=s.util.encode_base58(t.signPk),e.checkAccountAvailable()}).then(function(){return a(function(){e.formData.computing=!1},400)}).catch(function(t){e.formData.pubkey=void 0,e.formData.computing=!1,r.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(t)})},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.getCurrentFormName=function(){var t=e.slides.slider.activeIndex;if("member"===e.accountType){if(t+=e.licenseFileUrl?0:1,0===(t+=p.pubkey&&t>=2?2:0))return"licenseForm";if(1===t)return"pseudoForm";if(2===t)return"saltForm";if(3===t)return"passwordForm";if(4===t)return"confirmForm"}else{if(0===t)return"saltForm";if(1===t)return"passwordForm";if(2===t)return"confirmForm"}},e.computeSlideBehavior=function(){var t=e.getCurrentFormName();return"licenseForm"===t?{hasPreviousButton:!1,hasNextButton:!1,hasAcceptButton:!0}:"pseudoForm"===t?{helpAnchor:"join-pseudo",hasPreviousButton:e.licenseFileUrl&&!0,hasNextButton:!0,focus:"pseudo"}:"saltForm"===t?{helpAnchor:"join-salt",hasPreviousButton:"member"===e.accountType,hasNextButton:!0,focus:"salt"}:"passwordForm"===t?{helpAnchor:"join-password",hasPreviousButton:!0,hasNextButton:!0,focus:"password"}:"confirmForm"===t?{hasPreviousButton:!0,hasNextButton:!1,hasSendButton:!0,helpAnchor:"join-pubkey"}:{hasPreviousButton:!1,hasNextButton:!0}},e.doNext=function(){var t=e.getCurrentFormName();if(t&&e[t]){if(e[t].$submitted=!0,!e[t].$valid)return;if("pseudoForm"===t&&e.uiAlreadyUsed)return;"passwordForm"===t&&e.showAccountPubkey()}e.slideNext(),e.slideBehavior=e.computeSlideBehavior()},e.doPrev=function(){e.slidePrev(),e.slideBehavior=e.computeSlideBehavior()},e.doNewAccount=function(n){if(!n){var o="member"===e.accountType?"ACCOUNT.NEW.CONFIRMATION_MEMBER_ACCOUNT":"ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT";return r.alert.confirm(o,void 0,{cssClass:"warning",okText:"member"==e.accountType?"COMMON.BTN_SEND":"COMMON.BTN_CONTINUE",okType:"button-assertive"}).then(function(t){t&&e.doNewAccount(!0)})}var s=function(e){return function(t){throw parameter.uid?m.unauth().then(function(){r.onError(e)(t)}):m.logout().then(function(){r.onError(e)(t)}),new Error("CANCELLED")}};return r.loading.show(),m.login({auth:!0,isNew:!0,method:"SCRYPT_DEFAULT",expectedPubkey:e.formData.pubkey,showMethods:!1}).then(function(){if("member"===e.accountType){e.closeModal(),l.data.wallet=l.data.wallet||{},l.data.wallet.alertIfUnusedWallet=!1;var n=angular.isUndefined(p.uid)||angular.isUndefined(p.blockUid)||p.uid.toUpperCase()!==e.formData.pseudo.toUpperCase();n||m.setSelf(p.uid,p.blockUid);return(n?m.self(e.formData.pseudo,!1).catch(s("ERROR.SEND_IDENTITY_FAILED")):i.when()).then(function(){return m.membership.inside().catch(function(e){e&&e.ucode!=d.errorCodes.MEMBERSHIP_ALREADY_SEND||s("ERROR.SEND_MEMBERSHIP_IN_FAILED")(e)})}).then(function(){return e.closeModal(),m.isDefault()?t.go("app.view_wallet"):t.go("app.view_wallet_by_id",{id:m.id})}).then(function(){return a(function(){return m.isDataLoaded({requirements:!0})&&r.loading.hide(),e.downloadRevocationRegistration()},2e3)})}e.closeModal(),m.isDefault()?t.go("app.view_wallet"):t.go("app.view_wallet_by_id",{id:m.id})}).catch(function(e){if(r.loading.hide(),"CANCELLED"!==e)return e&&e.ucode!=d.errorCodes.MEMBERSHIP_ALREADY_SEND?void console.error("[wallet] Node: already membership",e):void r.alert.error("ERROR.UNKNOWN_ERROR")})},e.downloadRevocationRegistration=function(){return r.alert.confirm("DOWNLOAD.POPUP_REVOKE_MESSAGE","DOWNLOAD.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_DOWNLOAD",okType:"button-assertive",cancelText:"COMMON.BTN_LATER"}).then(function(e){if(e)return m.downloadRevocation()})},e.showHelpModal=function(e){c.showHelp({anchor:e})},e.startListenLicenseBottom=function(){var t=angular.element(document.querySelector(".modal #iframe-license"));if(!(t=t&&t.length?t[0]:void 0)||!t.contentWindow)return console.debug("[join] Waiting license frame to be load..."),a(e.startListenLicenseBottom,1e3);e.licenseBottomInterval=n(function(){var n=t.contentWindow.document.body.scrollTop;t.contentWindow.document.body.scrollHeight-t.contentWindow.document.body.clientHeight===n&&(e.isLicenseRead=!0,e.stopListenLicenseBottom())},1e3)},e.stopListenLicenseBottom=function(){e.licenseBottomInterval&&(n.cancel(e.licenseBottomInterval),delete e.licenseBottomInterval)},e.$on("modal.hidden",e.stopListenLicenseBottom),e.checkUid=function(){if(!e.formData.pseudo||e.formData.pseudo.length<3)return e.formData.computing=!1,void delete e.uiAlreadyUsed;var t=e.formData.pseudo.toUpperCase();if(e.formData.computing=!0,p.uid&&t===p.uid.toUpperCase())return e.formData.computing=!1,void(e.uiAlreadyUsed=!1);d.wot.lookup({search:t}).then(function(n){e.uiAlreadyUsed=(n.results||[]).some(function(e){return(e.uids||[]).some(function(e){return e.uid.toUpperCase()===t})}),e.formData.computing=!1}).catch(function(t){console.error(t),e.formData.computing=!1,e.uiAlreadyUsed=!1})},e.$watch("formData.pseudo",e.checkUid,!0),e.checkAccountAvailable=function(){return p.pubkey?void(e.accountAvailable=!0):(delete e.accountAvailable,d.tx.sources({pubkey:e.formData.pubkey}).then(function(t){e.accountAvailable=!t||!t.sources.length}).catch(function(t){console.error(t),e.accountAvailable=!1}))},e.identifierRecovery=function(){e.slides.slider.unlockSwipes();for(var t=0;t<2;t++)e.slides.slider.slidePrev();e.slides.slider.lockSwipes(),e.slideBehavior=e.computeSlideBehavior()}}function LoginController(e,t,n,i){"ngInject";angular.extend(this,n("HomeCtrl",{$scope:e})),e.showLoginModal=function(){return e.loading?t(e.showLoginModal,500):i.isLogin()||e.error?void 0:t(i.login,300)},e.$on("$ionicView.enter",e.showLoginModal)}function LoginModalController(e,t,n,i,a,o,r,s,l,c,u,d,p){"ngInject";p=p||{},e.computing=!1,e.pubkey=null,e.formData={},e.showPubkey=!1,e.showComputePubkeyButton=!1,e.autoComputePubkey=!1,e.pubkeyPattern="^(:?{0}|{1})$".format(l.constants.regexp.PUBKEY,l.constants.regexp.PUBKEY_WITH_CHECKSUM),e.isAuth=p.auth,e.okText=p.okText,e.title=p.title||(e.isAuth?"AUTH.TITLE":"LOGIN.TITLE"),e.showMethods=!angular.isDefined(p.showMethods)||p.showMethods,e.showNewAccountLink=!angular.isDefined(p.showNewAccountLink)||p.showNewAccountLink,e.expectedPubkey=p.expectedPubkey,e.expectedUid=p.uid,e.scryptParamsValues=_.keys(a.constants.SCRYPT_PARAMS).reduce(function(e,t){return e.concat({id:t,label:"LOGIN.SCRYPT."+t,params:a.constants.SCRYPT_PARAMS[t]})},[{id:"USER",label:"LOGIN.SCRYPT.USER",params:{}}]),e.init=function(){r().then(function(){e.autoComputePubkey="a"===ionic.Platform.grade.toLowerCase()&&!s.screen.isSmall()}),e.formData.rememberMe=u.data.rememberMe,e.formData.keepAuthIdle=u.data.keepAuthIdle,e.formData.keepAuth=e.formData.keepAuthIdle==u.constants.KEEP_AUTH_IDLE_SESSION;var t=p.method||u.data.login&&u.data.login.method||"SCRYPT_DEFAULT",n=u.data.login&&u.data.login.params;(e.isAuth&&"PUBKEY"===t||"SCAN"===t||"default"===t)&&(t="SCRYPT_DEFAULT"),e.changeMethod(t,n)},e.enter=function(){s.loading.hide(),s.ink({selector:".modal-login .ink"})},e.$on("modal.shown",e.enter),e.leave=function(){e.formData={},e.computing=!1,e.pubkey=null,e.methods=[]},e.$on("modal.hide",e.leave),e.doLogin=function(n){var i=e.formData.method;if(e.form.$valid||"SCAN"===i){d.keyboard.close();var r,c=e.formData.keepAuthIdle;if("SCRYPT_DEFAULT"===i||"SCRYPT_ADVANCED"===i){if(!e.formData.username||!e.formData.password)return;var m=e.formData.scrypt&&e.formData.scrypt.params;s.loading.show(),r=a.scryptKeypair(e.formData.username,e.formData.password,m).then(function(t){if(!t)return s.loading.hide(10);var n=a.util.encode_base58(t.signPk);return p.expectedPubkey&&p.expectedPubkey!=n?(e.pubkey=n,e.showPubkey=!0,e.pubkeyError=!0,s.loading.hide(10)):(e.pubkeyError=!1,{pubkey:n,keypair:t,params:e.formData.scrypt&&"SCRYPT_DEFAULT"!=e.formData.scrypt.id?m:void 0})}).catch(s.onError("ERROR.CRYPTO_UNKNOWN_ERROR"))}else if("FILE"===i){if(!e.formData.file||!e.formData.file.valid||!e.formData.file.pubkey)return;c=e.formData.keepAuth&&u.constants.KEEP_AUTH_IDLE_SESSION||c,r=s.loading.show().then(function(){return e.readKeyFile(e.formData.file,{withSecret:e.isAuth||e.formData.keepAuth})}).then(function(t){if(!t)return s.loading.hide(10);var n=a.util.encode_base58(t.signPk);return p.expectedPubkey&&p.expectedPubkey!=n?(e.formData.file.valid=!1,s.loading.hide(10)):(e.pubkeyError=!1,{pubkey:n,keypair:t})}).catch(s.onError("ERROR.AUTH_FILE_ERROR"))}else if("PUBKEY"===i){var E=e.formData.pubkey&&e.formData.pubkey.trim(),b=e.formData.uid&&e.formData.uid.trim()||void 0;if(!E)return;var g=l.regexp.PUBKEY.exec(E);if(g)r=s.loading.show().then(function(){return{pubkey:E,uid:b}});else{if(!(g=l.regexp.PUBKEY_WITH_CHECKSUM.exec(E)))return e.showWotLookupModal(E);E=g[1];var _=g[2],f=o.util.pkChecksum(E);_!=f?e.form.pubkey.$error={checksum:!0}:r=s.loading.show().then(function(){return{pubkey:E,uid:b}})}}else if("SCAN"===i){var T=e.formData.pubkey&&(!e.isAuth||!!e.formData.keypair);if(!T)return;r=s.loading.show().then(function(){return{pubkey:e.formData.pubkey,keypair:e.formData.keypair}})}return r?r.then(function(n){if(n){var a=!angular.equals(u.data.rememberMe,e.formData.rememberMe),o=!angular.equals(u.data.keepAuthIdle,c),r=!angular.equals(u.data.login&&u.data.login.method,i),l=!angular.equals(u.data.login&&u.data.login.params,n.params);return(a||o||r||l)&&(u.data.rememberMe=e.formData.rememberMe,u.data.keepAuthIdle=c,u.data.useLocalStorage=!!u.data.rememberMe||u.data.useLocalStorage,u.data.login=u.data.login||{},u.data.login.method=i,u.data.login.params=n.params,t(u.store,500)),p.success&&p.success(e.formData),p.silent&&s.loading.hide(),e.closeModal(n)}}):void console.warn("[login] unknown method: ",i)}},e.onScryptFormChanged=function(){e.computing||(e.pubkey=null,e.pubkeyError=!1,e.showPubkey=!!e.formData.username&&!!e.formData.password,e.autoComputePubkey&&e.showPubkey?(e.computePubkey(),e.showComputePubkeyButton=!1):e.showComputePubkeyButton=!e.autoComputePubkey&&e.showPubkey)},e.$watch("formData.username + formData.password",e.onScryptFormChanged,!0),e.computePubkey=function(){return e.showComputePubkeyButton=!1,e.computing=!0,e.pubkey=null,t(function(){var t=e.formData.username,n=e.formData.password,i=e.formData.scrypt&&e.formData.scrypt.params;return a.scryptSignPk(t,n,i).then(function(i){if(t!==e.formData.username||n!==e.formData.password)return e.computePubkey();e.pubkey=a.util.encode_base58(i),e.expectedPubkey&&e.expectedPubkey!=e.pubkey&&(e.pubkeyError=!0),e.computing=!1}).catch(function(t){s.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(t),e.computing=!1,e.autoComputePubkey=!1,e.onScryptFormChanged()})},100)},e.showJoinModal=function(){e.closeModal(),t(function(){c.showJoin()},300)},e.showAccountSecurityModal=function(){e.closeModal(),t(function(){c.showAccountSecurity()},300)},e.showHelpModal=function(e){return c.showHelp(e)},e.doScan=function(){if(!e.computing)return e.computing=!0,e.formData.pubkey=null,e.formData.keypair=null,d.barcode.scan().then(function(t){if(t)return e.isAuth?n.when(t):l.uri.parse(t).then(function(e){if(!e||!e.pubkey)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return e}).catch(function(e){return console.debug("[login] Error while parsing as URI: "+(e&&e.message||e)),t})}).then(function(e){if(e)return e&&e.pubkey?e:o.keyfile.parseData(e,{silent:!0}).then(function(e){if(!e||!e.signPk||!e.signSk)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return{pubkey:a.base58.encode(e.signPk),keypair:e}}).catch(s.onError("ERROR.SCAN_UNKNOWN_FORMAT"))}).then(function(t){t&&t.pubkey&&(e.pubkeyError=e.expectedPubkey&&e.expectedPubkey!=t.pubkey,e.formData.pubkey=t.pubkey,e.formData.keypair=t.keypair)}).then(function(){e.computing=!1,s.loading.hide(10)}).catch(function(t){e.computing=!1,s.onError("ERROR.SCAN_FAILED")(t)})},e.changeMethod=function(t,n){if(e.hideMethodsPopover(),t&&t!=e.formData.method)if(console.debug("[login] method is: "+t),e.formData.method=t,e.formData.uid=null,e.form&&delete e.form.$submitted,"SCRYPT_DEFAULT"==t||"SCRYPT_ADVANCED"==t){e.pubkey=null;var i;n?(i=_.find(e.scryptParamsValues,function(e){return e.params&&angular.equals(e.params,n)}))||(i=_.findWhere(e.scryptParamsValues,{id:"USER"})||{},i.params=n):i=_.findWhere(e.scryptParamsValues,{id:"DEFAULT"}),e.changeScrypt(i),e.autoComputePubkey=e.autoComputePubkey&&"SCRYPT_DEFAULT"==t}else{if("SCAN"==t)return e.doScan();e.formData.username=null,e.formData.password=null,e.formData.pubkey=null,e.pubkey=null,e.computing=!1}},e.changeScrypt=function(t){e.formData.scrypt=angular.copy(t||{}),e.onScryptFormChanged()},e.readKeyFile=function(n,i){return i=i||{},i.password=i.password||e.formData.file.password||function(){return e.formData.file.password=void 0,c.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP",error:i.error,scope:e}).then(function(n){return e.formData.file.password=n,t(function(){return n},150)})},o.keyfile.read(e.formData.file,i).catch(function(t){if(e.formData.file.password=void 0,"CANCELLED"===t&&s.loading.hide(10),t&&t.ucode==o.errorCodes.BAD_PASSWORD)return e.readKeyFile(e.formData.file,{withSecret:i.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw t})},e.fileChanged=function(n){if(e.validatingFile=!0,e.formData.file=n&&n.target&&n.target.files&&n.target.files.length&&n.target.files[0],!e.formData.file)return void(e.validatingFile=!1);t(function(){return console.debug("[login] key file changed: ",e.formData.file),e.validatingFile=!0,e.readKeyFile(e.formData.file,{withSecret:!1,password:e.formData.file.password}).then(function(t){t&&t.signPk?(e.formData.file.pubkey=a.util.encode_base58(t.signPk),e.formData.file.valid=!e.expectedPubkey||e.expectedPubkey==e.formData.file.pubkey,e.validatingFile=!1):(e.formData.file.valid=!1,e.formData.file.pubkey=void 0)}).catch(function(t){if(t&&"CANCELLED"===t)return void e.removeKeyFile();e.validatingFile=!1,e.formData.file.valid=!1,e.formData.file.pubkey=void 0,s.onError("ERROR.AUTH_FILE_ERROR")(t)})})},e.onKeyFileDrop=function(n){n&&n.fileData&&(e.formData.file={name:n.fileData.name,size:n.fileData.size,content:n.fileContent},e.validatingFile=!0,t(function(){return e.readKeyFile(e.formData.file,{withSecret:!1}).then(function(t){t&&t.signPk?(e.formData.file.pubkey=a.util.encode_base58(t.signPk),e.formData.file.valid=!e.expectedPubkey||e.expectedPubkey==e.formData.file.pubkey,e.validatingFile=!1):(e.formData.file.valid=!1,e.formData.file.pubkey=void 0)}).catch(function(t){e.validatingFile=!1,e.formData.file.valid=!1,e.formData.file.pubkey=void 0,s.onError("ERROR.AUTH_FILE_ERROR")(t)})}))},e.removeKeyFile=function(){e.formData.file=void 0},e.showWotLookupModal=function(n){return c.showWotLookup({q:n}).then(function(n){if(n&&n.pubkey)return e.formData.pubkey=n.pubkey,e.formData.uid=n.uid||void 0,t(e.doLogin,300)})},e.showMethodsPopover=function(t){t.defaultPrevented||s.popover.show(t,{templateUrl:"templates/login/popover_methods.html",scope:e,autoremove:!0,afterShow:function(t){e.methodsPopover=t,s.ink({selector:".popover-login-methods .item"})}})},e.hideMethodsPopover=function(){e.methodsPopover&&(e.methodsPopover.hide(),e.methodsPopover=null)},e.init()}function AuthController(e,t){angular.extend(this,t("LoginModalCtrl",{$scope:e,parameters:{auth:!0}})),e.setForm=function(t){e.form=t}}function HelpController(e,t,n,i,a){"ngInject";e.$on("$ionicView.enter",function(o){e.locale=a.data.locale.id,t.stateParams&&t.stateParams.anchor&&(e.anchor=t.stateParams.anchor,n(function(){i(t.stateParams.anchor)},100))})}function HelpModalController(e,t,n,i,a){"ngInject";e.itemsClass={},e.locale=i.data.locale.id,a=a||{},a&&"string"==typeof a&&(a={anchor:a}),a.anchor&&(t(function(){n(a.anchor)},100),e.itemsClass={},e.itemsClass[a.anchor]="selected",e.listClass="selection")}function HelpTipController(e,t,n,i,a,o,r,s,l,c,u,d,p,m){e.tour=!1,e.continue=!0,e.executeStep=function(t,n,i){if((i=angular.isDefined(i)?i:0)>=n.length)return o.when(!0);var a=n[i];if("function"!=typeof a)throw new Error("[helptip] Invalid step at index {0} of '{1}' tour: step must be a function".format(i,t));var r=a();return"boolean"==typeof r&&(r=o.when(r)),r.then(function(a){return angular.isUndefined(a)?(e.continue=!1,i):a&&i!==n.length-1?e.executeStep(t,n,i+1):a?-1:i+1}).catch(function(n){return n&&"transition prevented"==n.message?console.error("ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error".format(t,i)):console.error("ERROR: in help tour  [{0}], in step [{1}] : {2}".format(t,i,n)),e.continue=!1,i})},e.showHelpTip=function(t,n){return n=n||{},n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||"",n.bindings.hasNext=!angular.isDefined(n.bindings.hasNext)||n.bindings.hasNext,n.timeout=n.timeout||(p.enable?900:500),n.autoremove=!0,n.bindings.tour=e.tour,n.backdropClickToClose=!e.tour,s.popover.helptip(t,n)},e.showHelpModal=function(e){Modals.showHelp({anchor:e})},e.startHelpTour=function(){return e.tour=!0,e.continue=!0,e.startCurrencyTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.currency=t,c.store(),e.continue)}).then(function(t){return!!t&&e.startNetworkTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.network=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWotLookupTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.wotLookup=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWotTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.wot=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWotCertTour(0,!0).then(function(t){return!!t&&(c.data.helptip.wotCerts=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWalletNoLoginTour(0,!0)}).then(function(t){return!!t&&(!m.isLogin()||e.startWalletTour(0,!0).then(function(t){return!!t&&(c.data.helptip.wallet=t,c.store(),e.continue)}))}).then(function(t){return!!t&&(!m.isLogin()||e.startWalletCertTour(0,!0).then(function(t){return!!t&&(c.data.helptip.walletCerts=t,c.store(),e.continue)}))}).then(function(t){return!!t&&(!m.isLogin()||e.startTxTour(0,!0).then(function(t){return!!t&&(c.data.helptip.tx=t,c.store(),e.continue)}))}).then(function(t){return!!t&&e.startHeaderTour(0,!0)}).then(function(t){return!!t&&e.startSettingsTour(0,!0)}).then(function(t){return!!t&&e.finishTour()})},e.startCurrencyTour=function(n,a){var o,l=function(){t.is("app.currency.tab_parameters")&&t.go("app.currency.tab_wot")},d=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-currency",{bindings:{content:"HELP.TIP.MENU_BTN_CURRENCY",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.currency":"app.currency_lg").then(function(){return e.showHelpTip("helptip-currency-mass-member",{bindings:{content:"HELP.TIP.CURRENCY_MASS",icon:{position:"center"}}})})},function(){return!c.data.useRelative||e.showHelpTip("helptip-currency-mass-member-unit",{bindings:{content:"HELP.TIP.CURRENCY_UNIT_RELATIVE",contentParams:o,icon:{position:s.screen.isSmall()?"right":"center"}}})},function(){return r("helptip-currency-rules-anchor"),e.showHelpTip("helptip-currency-rules",{bindings:{content:"HELP.TIP.CURRENCY_RULES",icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return l(),r("helptip-currency-newcomers-anchor"),e.showHelpTip("helptip-currency-newcomers",{bindings:{content:"HELP.TIP.CURRENCY_WOT",icon:{position:"center"},hasNext:a},timeout:1200})}];return u.get().then(function(t){return o=t.parameters,e.executeStep("currency",d,n)})},e.startNetworkTour=function(o,r){var d,p=function(){t.is("app.currency")&&a(function(){var e=n.document.querySelectorAll("ion-tabs .tabs a");e&&3==e.length&&angular.element(e[2]).triggerHandler("click")},100)},m=[function(){return!!s.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-network",{bindings:{content:"HELP.TIP.MENU_BTN_NETWORK",icon:{position:"left"}}}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.currency.tab_network":"app.network").then(function(){return p(),e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_BLOCKCHAIN",icon:{position:"center",glyph:"ion-information-circled"}},timeout:1200})})},function(){return p(),e.showHelpTip("helptip-network-peer-0",{bindings:{content:"HELP.TIP.NETWORK_PEERS",icon:{position:s.screen.isSmall()?void 0:"center"}},timeout:1e3,retry:20})},function(){return p(),e.showHelpTip("helptip-network-peer-0-block",{bindings:{content:"HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER",icon:{position:s.screen.isSmall()?void 0:"center"}}})},function(){p();var t=c.data.locale.id;return e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_PEERS_PARTICIPATE",contentParams:{installDocUrl:l.helptip&&l.helptip.installDocUrl?l.helptip.installDocUrl[t]?l.helptip.installDocUrl[t]:l.helptip.installDocUrl:"http://duniter.org"},icon:{position:"center",glyph:"ion-information-circled"},hasNext:r}})}];return u.parameters().then(function(t){return d=t,
+function Peer(e){var t=this;Object.keys(e).forEach(function(n){t[n]=e[n]}),t.endpoints=t.endpoints||[]}function Block(e,t){"use strict";var n=this;t&&t.length?_.forEach(t,function(t){n[t]=e[t]}):["currency","issuer","medianTime","number","version","powMin","dividend","membersCount","hash","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions","unitbase"].forEach(function(t){n[t]=e[t]}),n.identitiesCount=n.identities?n.identities.length:0,n.joinersCount=n.joiners?n.joiners.length:0,n.activesCount=n.actives?n.actives.length:0,n.leaversCount=n.leavers?n.leavers.length:0,n.revokedCount=n.revoked?n.revoked.length:0,n.excludedCount=n.excluded?n.excluded.length:0,n.certificationsCount=n.certifications?n.certifications.length:0,n.transactionsCount=n.transactions?n.transactions.length:0,n.empty=n.isEmpty()}function exact(e){return new RegExp("^"+e+"$")}function Ws2pMessage(e){var t=this,n=e.split(":");if(n.length<3||!n[0].startsWith("WS2P"))throw Error("Invalid format: "+e);if("HEAD"==n[1]){if(n.length<4)throw Error("Invalid format: "+e);if(4==n.length)t.pubkey=n[2],t.buid=n[3];else{if(n[2]>=1){var i=n[0];if(i.length>4){var a=this.regexp.WS2P_PREFIX.exec(i);if(!a)throw Error("Invalid format: "+e);var o=a[1];if(o){t.private={useTor:o.startsWith("T")};var r=o.substring(1);"A"==r?t.private.mode="all":"M"==r?t.private.mode="mixed":"S"==r&&(t.private.mode="strict")}var s=a[2];s&&(t.public={useTor:s.startsWith("T"),mode:"all"})}t.pubkey=n[3],t.buid=n[4],t.ws2pid=n[5],t.software=n[6],t.version=n[7],t.powPrefix=n[8]}}}}function PluginExtensionPointController(e,t){"ngInject";e.extensionPoint=t.extensions.points.current.get()}function AppController(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,_,f){"ngInject";e.walletData=E.data,e.search={},e.login=E.isLogin(),e.auth=E.isAuth(),e.motion=p.motion.default,e.fullscreen=p.screen.fullscreen.isEnabled(),e.showHome=function(){return r.nextViewOptions({historyRoot:!0}),n.go("app.home").then(p.loading.hide)},e.scanQrCodeAndGo=function(){if(b.barcode.enable)return b.barcode.scan().then(function(e){if(e)return m.uri.parse(e).then(function(e){if(!e||!e.pubkey)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return n.go("app.wot_identity",{pubkey:e.pubkey,node:e.host?e.host:null})}).catch(function(t){return console.debug("[app] Scan data is not an URI (get error: "+(t&&t.message||t)+"). Trying to decode as a WIF or EWIF format..."),d.keyfile.parseData(e).then(function(e){if(!e||!e.signPk||!e.signSk)throw t;var i=u.base58.encode(e.signPk);console.debug("[app] Detected WIF/EWIF format. Will login to wallet {"+i.substring(0,8)+"}");var a=E.isLogin()?E.children.create({store:!1}):E;return a.login({silent:!0,forceAuth:!0,minData:!1,authData:{pubkey:i,keypair:e}}).then(function(){return r.nextViewOptions({historyRoot:!0}),n.go("app.new_transfer",{all:!0,wallet:a.isDefault()?void 0:a.id})})}).catch(p.onError("ERROR.SCAN_UNKNOWN_FORMAT"))})}).catch(p.onError("ERROR.SCAN_FAILED"))},e.createHelptipScope=function(n,i){if(n||!t.tour&&t.settings.helptip.enable&&!p.screen.isSmall()){var a=e.$new();return s(i||"HelpTipCtrl",{$scope:a}),a}},e.startHelpTour=function(n,i){if(t.tour=!0,!i)return r.clearHistory(),r.clearCache().then(function(){e.startHelpTour(n,!0)});var a=e.createHelptipScope(!0,n);return a.startHelpTour().then(function(){a.$destroy(),delete t.tour}).catch(function(e){delete t.tour})},e.isLogin=function(){return e.login},e.loadWalletData=function(e){return console.warn("[app-controller] DEPRECATED  - Please use csWallet.load() instead of $scope.loadWalletData()",new Error),e=e||{},(e.wallet||E).loadData(e).then(function(e){if(!e)throw"CANCELLED";return e})},e.loadWallet=function(t){if(console.warn("[app-controller] DEPRECATED  - Please use csWallet.loginOrLoad() instead of $scope.loadWallet()",new Error),!c.isStarted())return c.ready().then(function(){return e.loadWallet(t)});t=t||{};var n=t.wallet||E;return t.auth&&!n.isAuth()?n.auth(t).then(function(e){if(e)return e;throw"CANCELLED"}):n.isLogin()?n.isDataLoaded(t)?a.when(n.data):e.loadWalletData(t):n.login(t).then(function(e){if(e)return e;throw"CANCELLED"})},e.loginAndGo=function(t,i){e.closeProfilePopover(),i=i||{};var a=i.wallet||E;if(delete i.wallet,t=t||"app.view_wallet",a.isLogin())return n.go(t,i);if(_.httpsMode&&l.location&&"https:"!==l.location.protocol){var o=l.location.href,r=o.indexOf("#"),s=-1!=r?o.substr(0,r):o;if(s="https"+s.substr(4),o=s+n.href(t),!_.httpsModeDebug)return void(l.location.href=o);console.debug("[httpsMode] --- Should redirect to: "+o)}return a.login(i).then(function(){return n.go(t,i)}).then(p.loading.hide)},e.logout=function(t){t=t||{};var n=t.wallet||E;return!t.force&&e.profilePopover?e.profilePopover.hide().then(function(){return t.force=!0,e.logout(t)}):t.askConfirm?p.alert.confirm("CONFIRM.LOGOUT").then(function(n){if(n)return t.askConfirm=!1,e.logout(t)}):(p.loading.show(),n.logout().then(function(){if(i.isOpenLeft()&&i.toggleLeft(),n.isDefault())return r.clearHistory(),r.clearCache().then(function(){return e.showHome()})}).catch(p.onError()))},e.doAuth=function(e){return(e&&e.wallet||E).auth().then(p.loading.hide)},e.isUserPubkey=function(e){return E.isUserPubkey(e)},E.api.data.on.login(e,function(t,n){return e.login=!0,n?n.resolve():a.when()}),E.api.data.on.logout(e,function(){e.login=!1}),E.api.data.on.auth(e,function(t,n){return e.auth=!0,n?n.resolve():a.when()}),E.api.data.on.unauth(e,function(){e.auth=!1}),e.showTransferModal=function(e){return g.showTransfer(e)},e.showAboutModal=function(){return g.showAbout()},e.showJoinModal=function(){return e.closeProfilePopover(),g.showJoin()},e.showSettings=function(){return e.closeProfilePopover(),n.go("app.settings")},e.showHelpModal=function(e){return g.showHelp(e)},e.showProfilePopover=function(t){return p.popover.show(t,{templateUrl:"templates/common/popover_profile.html",scope:e,autoremove:!0,afterShow:function(t){e.profilePopover=t,o(function(){p.ink({selector:"#profile-popover .ink, #profile-popover .ink-dark"})},100)}})},e.closeProfilePopover=function(){e.profilePopover&&e.profilePopover.isShown()&&o(function(){e.profilePopover.hide()})},e.showPeerInfoPopover=function(t){return p.popover.show(t,{templateUrl:"templates/network/popover_peer_info.html",autoremove:!0,scope:e.$new(!0)})},e.openLink=function(e,t,n){return e.stopPropagation(),e.preventDefault(),n=n||{},n.onError=function(){return p.popover.copy(e,t)},f.uri.open(t,n),!1},e.showFab=function(e,t){p.motion.toggleOn({selector:"#"+e+".button-fab"},t)},e.hideFab=function(e,t){p.motion.toggleOff({selector:"#"+e+".button-fab"},t)},e.doMotion=function(t){return e.motion.show(t)},e.askFullscreen=function(){if(!e.fullscreen&&p.screen.isSmall()&&b.isWeb())return p.alert.confirm("CONFIRM.FULLSCREEN",null,{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then(function(t){t&&e.toggleFullscreen()})},e.toggleFullscreen=function(){e.fullscreen=!p.screen.fullscreen.isEnabled(),p.screen.fullscreen.toggleAll()}}function HomeController(e,t,n,i,a,o,r,s,l){"ngInject";e.loading=!0,e.locales=angular.copy(l.locales),e.enter=function(n,a){ionic.Platform.isIOS()&&window.StatusBar&&(StatusBar.overlaysWebView(!1),StatusBar.overlaysWebView(!0)),a&&a.stateParams&&a.stateParams.error?(e.error=a.stateParams.error,e.node=s.data.node,e.loading=!1,i.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),t.go("app.home",{error:void 0},{reload:!1,inherit:!0,notify:!1})):r.ready().then(function(){e.loading=!1}).catch(function(t){e.node=s.data.node,e.loading=!1,e.error=t})},e.$on("$ionicView.enter",e.enter),e.reload=function(){e.loading=!0,delete e.error,n(e.enter,200)},e.doQuickFix=function(e){"settings"==e&&(i.nextViewOptions({historyRoot:!0}),t.go("app.settings"))},e.changeLanguage=function(t){a.use(t),e.hideLocalesPopover(),l.data.locale=_.findWhere(e.locales,{id:t})},e.showLocalesPopover=function(t){o.popover.show(t,{templateUrl:"templates/api/locales_popover.html",scope:e,autoremove:!0,afterShow:function(t){e.localesPopover=t}})},e.hideLocalesPopover=function(){e.localesPopover&&(e.localesPopover.hide(),e.localesPopover=null)}}function JoinController(e,t,n,i,a){"ngInject";angular.extend(this,n("HomeCtrl",{$scope:e})),e.showJoinModal=function(){return e.loading?t(e.showJoinModal,500):a.isLogin()||e.error?void 0:t(i.showJoin,300)},e.$on("$ionicView.enter",e.showJoinModal)}function JoinChooseAccountTypeModalController(e,t,n,i,a){"ngInject";e.formData={},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.loading=!0,e.load=function(){if(e.loading)return a.get().then(function(t){t&&(e.currency=t,e.formData.currency=t.name,e.loading=!1)}).catch(i.onError("ERROR.GET_CURRENCY_FAILED"))},e.$on("modal.shown",e.load),e.$on("$ionicSlides.sliderInitialized",function(e,t){t.slider.lockSwipes()}),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes()},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes()},e.selectAccountTypeAndClose=function(t){e.formData.accountType=t,e.closeModal(e.formData)},e.doQuickFix=function(n){"settings"==n&&(e.closeModal(),t.go("app.settings"))},e.showHelpModal=function(e){n.showHelp({anchor:e})}}function JoinModalController(e,t,n,i,a,o,r,s,l,c,u,d,p){"ngInject";e.formData={pseudo:p.uid||"",pubkey:p.pubkey||void 0},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500,pager:!1,showPager:!1}},e.slideBehavior={},e.loading=!0,e.isLicenseRead=o.isIOS(),e.showUsername=!1,e.showPassword=!1,e.formData.computing=!1,e.smallscreen=r.screen.isSmall(),e.userIdPattern=d.constants.regexp.USER_ID,e.accountAvailable=!!p.pubkey,e.currency=p.currency,e.accountType=p.accountType||"member";var m;e.load=function(){if(e.loading){if(!(m=p.walletId&&u.children.get(p.walletId)||p.pubkey&&u.children.getByPubkey(p.pubkey)||(!p.pubkey||u.isUserPubkey(p.pubkey))&&u))throw new Error("Cannot found the corresponding wallet, from parameters.pubkey or parameters.walletId");console.debug("[join] Starting join modal on wallet {0}".format(m.id)),"member"===e.accountType&&(e.licenseFileUrl=l.getLicenseUrl(),e.licenseFileUrl&&(".txt"!=e.licenseFileUrl.substring(e.licenseFileUrl.length-3)&&(e.licenseFileUrl=e.licenseFileUrl+".html"),e.isLicenseRead||a(function(){e.isLicenseRead||(e.isLicenseRead=!0)},5e3))),e.slideBehavior=e.computeSlideBehavior(),e.loading=!1}},e.$on("modal.shown",e.load),e.$on("$ionicSlides.sliderInitialized",function(e,t){t.slider.lockSwipes()}),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes()},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes()},e.showAccountPubkey=function(){if(p.pubkey&&p.pseudo===e.formData.pseudo)return e.formData.pubkey=p.pubkey,void(e.formData.computing=!1);e.formData.computing=!0,s.scryptKeypair(e.formData.username,e.formData.password).then(function(t){return e.formData.pubkey=s.util.encode_base58(t.signPk),e.checkAccountAvailable()}).then(function(){return a(function(){e.formData.computing=!1},400)}).catch(function(t){e.formData.pubkey=void 0,e.formData.computing=!1,r.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(t)})},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.getCurrentFormName=function(){var t=e.slides.slider.activeIndex;if("member"===e.accountType){if(t+=e.licenseFileUrl?0:1,0===(t+=p.pubkey&&t>=2?2:0))return"licenseForm";if(1===t)return"pseudoForm";if(2===t)return"saltForm";if(3===t)return"passwordForm";if(4===t)return"confirmForm"}else{if(0===t)return"saltForm";if(1===t)return"passwordForm";if(2===t)return"confirmForm"}},e.computeSlideBehavior=function(){var t=e.getCurrentFormName();return"licenseForm"===t?{hasPreviousButton:!1,hasNextButton:!1,hasAcceptButton:!0}:"pseudoForm"===t?{helpAnchor:"join-pseudo",hasPreviousButton:e.licenseFileUrl&&!0,hasNextButton:!0,focus:"pseudo"}:"saltForm"===t?{helpAnchor:"join-salt",hasPreviousButton:"member"===e.accountType,hasNextButton:!0,focus:"salt"}:"passwordForm"===t?{helpAnchor:"join-password",hasPreviousButton:!0,hasNextButton:!0,focus:"password"}:"confirmForm"===t?{hasPreviousButton:!0,hasNextButton:!1,hasSendButton:!0,helpAnchor:"join-pubkey"}:{hasPreviousButton:!1,hasNextButton:!0}},e.doNext=function(){var t=e.getCurrentFormName();if(t&&e[t]){if(e[t].$submitted=!0,!e[t].$valid)return;if("pseudoForm"===t&&e.uiAlreadyUsed)return;"passwordForm"===t&&e.showAccountPubkey()}e.slideNext(),e.slideBehavior=e.computeSlideBehavior()},e.doPrev=function(){e.slidePrev(),e.slideBehavior=e.computeSlideBehavior()},e.doNewAccount=function(n){if(!n){var o="member"===e.accountType?"ACCOUNT.NEW.CONFIRMATION_MEMBER_ACCOUNT":"ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT";return r.alert.confirm(o,void 0,{cssClass:"warning",okText:"member"==e.accountType?"COMMON.BTN_SEND":"COMMON.BTN_CONTINUE",okType:"button-assertive"}).then(function(t){t&&e.doNewAccount(!0)})}var s=function(e){return function(t){throw parameter.uid?m.unauth().then(function(){r.onError(e)(t)}):m.logout().then(function(){r.onError(e)(t)}),new Error("CANCELLED")}};return r.loading.show(),m.login({auth:!0,isNew:!0,method:"SCRYPT_DEFAULT",expectedPubkey:e.formData.pubkey,showMethods:!1}).then(function(){if("member"===e.accountType){e.closeModal(),l.data.wallet=l.data.wallet||{},l.data.wallet.alertIfUnusedWallet=!1;var n=angular.isUndefined(p.uid)||angular.isUndefined(p.blockUid)||p.uid.toUpperCase()!==e.formData.pseudo.toUpperCase();n||m.setSelf(p.uid,p.blockUid);return(n?m.self(e.formData.pseudo,!1).catch(s("ERROR.SEND_IDENTITY_FAILED")):i.when()).then(function(){return m.membership.inside().catch(function(e){e&&e.ucode!=d.errorCodes.MEMBERSHIP_ALREADY_SEND||s("ERROR.SEND_MEMBERSHIP_IN_FAILED")(e)})}).then(function(){return e.closeModal(),m.isDefault()?t.go("app.view_wallet"):t.go("app.view_wallet_by_id",{id:m.id})}).then(function(){return a(function(){return m.isDataLoaded({requirements:!0})&&r.loading.hide(),e.downloadRevocationRegistration()},2e3)})}e.closeModal(),m.isDefault()?t.go("app.view_wallet"):t.go("app.view_wallet_by_id",{id:m.id})}).catch(function(e){if(r.loading.hide(),"CANCELLED"!==e)return e&&e.ucode!=d.errorCodes.MEMBERSHIP_ALREADY_SEND?void console.error("[wallet] Node: already membership",e):void r.alert.error("ERROR.UNKNOWN_ERROR")})},e.downloadRevocationRegistration=function(){return r.alert.confirm("DOWNLOAD.POPUP_REVOKE_MESSAGE","DOWNLOAD.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_DOWNLOAD",okType:"button-assertive",cancelText:"COMMON.BTN_LATER"}).then(function(e){if(e)return m.downloadRevocation()})},e.showHelpModal=function(e){c.showHelp({anchor:e})},e.startListenLicenseBottom=function(){var t=angular.element(document.querySelector(".modal #iframe-license"));if(!(t=t&&t.length?t[0]:void 0)||!t.contentWindow)return console.debug("[join] Waiting license frame to be load..."),a(e.startListenLicenseBottom,1e3);e.licenseBottomInterval=n(function(){var n=t.contentWindow.document.body.scrollTop;t.contentWindow.document.body.scrollHeight-t.contentWindow.document.body.clientHeight===n&&(e.isLicenseRead=!0,e.stopListenLicenseBottom())},1e3)},e.stopListenLicenseBottom=function(){e.licenseBottomInterval&&(n.cancel(e.licenseBottomInterval),delete e.licenseBottomInterval)},e.$on("modal.hidden",e.stopListenLicenseBottom),e.checkUid=function(){if(!e.formData.pseudo||e.formData.pseudo.length<3)return e.formData.computing=!1,void delete e.uiAlreadyUsed;var t=e.formData.pseudo.toUpperCase();if(e.formData.computing=!0,p.uid&&t===p.uid.toUpperCase())return e.formData.computing=!1,void(e.uiAlreadyUsed=!1);d.wot.lookup({search:t}).then(function(n){e.uiAlreadyUsed=(n.results||[]).some(function(e){return(e.uids||[]).some(function(e){return e.uid.toUpperCase()===t})}),e.formData.computing=!1}).catch(function(t){console.error(t),e.formData.computing=!1,e.uiAlreadyUsed=!1})},e.$watch("formData.pseudo",e.checkUid,!0),e.checkAccountAvailable=function(){return p.pubkey?void(e.accountAvailable=!0):(delete e.accountAvailable,d.tx.sources({pubkey:e.formData.pubkey}).then(function(t){e.accountAvailable=!t||!t.sources.length}).catch(function(t){console.error(t),e.accountAvailable=!1}))},e.identifierRecovery=function(){e.slides.slider.unlockSwipes();for(var t=0;t<2;t++)e.slides.slider.slidePrev();e.slides.slider.lockSwipes(),e.slideBehavior=e.computeSlideBehavior()}}function LoginController(e,t,n,i){"ngInject";angular.extend(this,n("HomeCtrl",{$scope:e})),e.showLoginModal=function(){return e.loading?t(e.showLoginModal,500):i.isLogin()||e.error?void 0:t(i.login,300)},e.$on("$ionicView.enter",e.showLoginModal)}function LoginModalController(e,t,n,i,a,o,r,s,l,c,u,d,p){"ngInject";p=p||{},e.computing=!1,e.pubkey=null,e.formData={},e.showPubkey=!1,e.showComputePubkeyButton=!1,e.autoComputePubkey=!1,e.pubkeyPattern="^(:?{0}|{1})$".format(l.constants.regexp.PUBKEY,l.constants.regexp.PUBKEY_WITH_CHECKSUM),e.isAuth=p.auth,e.okText=p.okText,e.title=p.title||(e.isAuth?"AUTH.TITLE":"LOGIN.TITLE"),e.showMethods=!angular.isDefined(p.showMethods)||p.showMethods,e.showNewAccountLink=!angular.isDefined(p.showNewAccountLink)||p.showNewAccountLink,e.expectedPubkey=p.expectedPubkey,e.expectedUid=p.uid,e.scryptParamsValues=_.keys(a.constants.SCRYPT_PARAMS).reduce(function(e,t){return e.concat({id:t,label:"LOGIN.SCRYPT."+t,params:a.constants.SCRYPT_PARAMS[t]})},[{id:"USER",label:"LOGIN.SCRYPT.USER",params:{}}]),e.init=function(){r().then(function(){e.autoComputePubkey="a"===ionic.Platform.grade.toLowerCase()&&!s.screen.isSmall()}),e.formData.rememberMe=u.data.rememberMe,e.formData.keepAuthIdle=u.data.keepAuthIdle,e.formData.keepAuth=e.formData.keepAuthIdle==u.constants.KEEP_AUTH_IDLE_SESSION;var t=p.method||u.data.login&&u.data.login.method||"SCRYPT_DEFAULT",n=u.data.login&&u.data.login.params;(e.isAuth&&"PUBKEY"===t||"SCAN"===t||"default"===t)&&(t="SCRYPT_DEFAULT"),e.changeMethod(t,n)},e.enter=function(){s.loading.hide(),s.ink({selector:".modal-login .ink"})},e.$on("modal.shown",e.enter),e.leave=function(){e.formData={},e.computing=!1,e.pubkey=null,e.methods=[]},e.$on("modal.hide",e.leave),e.doLogin=function(n){var i=e.formData.method;if(e.form.$valid||"SCAN"===i){d.keyboard.close();var r,c=e.formData.keepAuthIdle;if("SCRYPT_DEFAULT"===i||"SCRYPT_ADVANCED"===i){if(!e.formData.username||!e.formData.password)return;var m=e.formData.scrypt&&e.formData.scrypt.params;s.loading.show(),r=a.scryptKeypair(e.formData.username,e.formData.password,m).then(function(t){if(!t)return s.loading.hide(10);var n=a.util.encode_base58(t.signPk);return p.expectedPubkey&&p.expectedPubkey!=n?(e.pubkey=n,e.showPubkey=!0,e.pubkeyError=!0,s.loading.hide(10)):(e.pubkeyError=!1,{pubkey:n,keypair:t,params:e.formData.scrypt&&"SCRYPT_DEFAULT"!=e.formData.scrypt.id?m:void 0})}).catch(s.onError("ERROR.CRYPTO_UNKNOWN_ERROR"))}else if("FILE"===i){if(!e.formData.file||!e.formData.file.valid||!e.formData.file.pubkey)return;c=e.formData.keepAuth&&u.constants.KEEP_AUTH_IDLE_SESSION||c,r=s.loading.show().then(function(){return e.readKeyFile(e.formData.file,{withSecret:e.isAuth||e.formData.keepAuth})}).then(function(t){if(!t)return s.loading.hide(10);var n=a.util.encode_base58(t.signPk);return p.expectedPubkey&&p.expectedPubkey!=n?(e.formData.file.valid=!1,s.loading.hide(10)):(e.pubkeyError=!1,{pubkey:n,keypair:t})}).catch(s.onError("ERROR.AUTH_FILE_ERROR"))}else if("PUBKEY"===i){var E=e.formData.pubkey&&e.formData.pubkey.trim(),b=e.formData.uid&&e.formData.uid.trim()||void 0;if(!E)return;var g=l.regexp.PUBKEY.exec(E);if(g)r=s.loading.show().then(function(){return{pubkey:E,uid:b}});else{if(!(g=l.regexp.PUBKEY_WITH_CHECKSUM.exec(E)))return e.showWotLookupModal(E);E=g[1];var _=g[2],f=o.util.pkChecksum(E);_!=f?e.form.pubkey.$error={checksum:!0}:r=s.loading.show().then(function(){return{pubkey:E,uid:b}})}}else if("SCAN"===i){var T=e.formData.pubkey&&(!e.isAuth||!!e.formData.keypair);if(!T)return;r=s.loading.show().then(function(){return{pubkey:e.formData.pubkey,keypair:e.formData.keypair}})}return r?r.then(function(n){if(n){var a=!angular.equals(u.data.rememberMe,e.formData.rememberMe),o=!angular.equals(u.data.keepAuthIdle,c),r=!angular.equals(u.data.login&&u.data.login.method,i),l=!angular.equals(u.data.login&&u.data.login.params,n.params);return(a||o||r||l)&&(u.data.rememberMe=e.formData.rememberMe,u.data.keepAuthIdle=c,u.data.useLocalStorage=!!u.data.rememberMe||u.data.useLocalStorage,u.data.login=u.data.login||{},u.data.login.method=i,u.data.login.params=n.params,t(u.store,500)),p.success&&p.success(e.formData),p.silent&&s.loading.hide(),e.closeModal(n)}}):void console.warn("[login] unknown method: ",i)}},e.onScryptFormChanged=function(){e.computing||(e.pubkey=null,e.pubkeyError=!1,e.showPubkey=!!e.formData.username&&!!e.formData.password,e.autoComputePubkey&&e.showPubkey?(e.computePubkey(),e.showComputePubkeyButton=!1):e.showComputePubkeyButton=!e.autoComputePubkey&&e.showPubkey)},e.$watch("formData.username + formData.password",e.onScryptFormChanged,!0),e.computePubkey=function(){return e.showComputePubkeyButton=!1,e.computing=!0,e.pubkey=null,t(function(){var t=e.formData.username,n=e.formData.password,i=e.formData.scrypt&&e.formData.scrypt.params;return a.scryptSignPk(t,n,i).then(function(i){if(t!==e.formData.username||n!==e.formData.password)return e.computePubkey();e.pubkey=a.util.encode_base58(i),e.expectedPubkey&&e.expectedPubkey!=e.pubkey&&(e.pubkeyError=!0),e.computing=!1}).catch(function(t){s.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(t),e.computing=!1,e.autoComputePubkey=!1,e.onScryptFormChanged()})},100)},e.showJoinModal=function(){e.closeModal(),t(function(){c.showJoin()},300)},e.showAccountSecurityModal=function(){e.closeModal(),t(function(){c.showAccountSecurity()},300)},e.showHelpModal=function(e){return c.showHelp(e)},e.doScan=function(){if(!e.computing)return e.computing=!0,e.formData.pubkey=null,e.formData.keypair=null,d.barcode.scan().then(function(t){if(t)return e.isAuth?n.when(t):l.uri.parse(t).then(function(e){if(!e||!e.pubkey)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return e}).catch(function(e){return console.debug("[login] Error while parsing as URI: "+(e&&e.message||e)),t})}).then(function(e){if(e)return e&&e.pubkey?e:o.keyfile.parseData(e,{silent:!0}).then(function(e){if(!e||!e.signPk||!e.signSk)throw{message:"ERROR.SCAN_UNKNOWN_FORMAT"};return{pubkey:a.base58.encode(e.signPk),keypair:e}}).catch(s.onError("ERROR.SCAN_UNKNOWN_FORMAT"))}).then(function(t){t&&t.pubkey&&(e.pubkeyError=e.expectedPubkey&&e.expectedPubkey!=t.pubkey,e.formData.pubkey=t.pubkey,e.formData.keypair=t.keypair)}).then(function(){e.computing=!1,s.loading.hide(10)}).catch(function(t){e.computing=!1,s.onError("ERROR.SCAN_FAILED")(t)})},e.changeMethod=function(t,n){if(e.hideMethodsPopover(),t&&t!=e.formData.method)if(console.debug("[login] method is: "+t),e.formData.method=t,e.formData.uid=null,e.form&&delete e.form.$submitted,"SCRYPT_DEFAULT"==t||"SCRYPT_ADVANCED"==t){e.pubkey=null;var i;n?(i=_.find(e.scryptParamsValues,function(e){return e.params&&angular.equals(e.params,n)}))||(i=_.findWhere(e.scryptParamsValues,{id:"USER"})||{},i.params=n):i=_.findWhere(e.scryptParamsValues,{id:"DEFAULT"}),e.changeScrypt(i),e.autoComputePubkey=e.autoComputePubkey&&"SCRYPT_DEFAULT"==t}else{if("SCAN"==t)return e.doScan();e.formData.username=null,e.formData.password=null,e.formData.pubkey=null,e.pubkey=null,e.computing=!1}},e.changeScrypt=function(t){e.formData.scrypt=angular.copy(t||{}),e.onScryptFormChanged()},e.readKeyFile=function(n,i){return i=i||{},i.password=i.password||e.formData.file.password||function(){return e.formData.file.password=void 0,c.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP",error:i.error,scope:e}).then(function(n){return e.formData.file.password=n,t(function(){return n},150)})},o.keyfile.read(e.formData.file,i).catch(function(t){if(e.formData.file.password=void 0,"CANCELLED"===t&&s.loading.hide(10),t&&t.ucode==o.errorCodes.BAD_PASSWORD)return e.readKeyFile(e.formData.file,{withSecret:i.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw t})},e.fileChanged=function(n){if(e.validatingFile=!0,e.formData.file=n&&n.target&&n.target.files&&n.target.files.length&&n.target.files[0],!e.formData.file)return void(e.validatingFile=!1);t(function(){return console.debug("[login] key file changed: ",e.formData.file),e.validatingFile=!0,e.readKeyFile(e.formData.file,{withSecret:!1,password:e.formData.file.password}).then(function(t){t&&t.signPk?(e.formData.file.pubkey=a.util.encode_base58(t.signPk),e.formData.file.valid=!e.expectedPubkey||e.expectedPubkey==e.formData.file.pubkey,e.validatingFile=!1):(e.formData.file.valid=!1,e.formData.file.pubkey=void 0)}).catch(function(t){if(t&&"CANCELLED"===t)return void e.removeKeyFile();e.validatingFile=!1,e.formData.file.valid=!1,e.formData.file.pubkey=void 0,s.onError("ERROR.AUTH_FILE_ERROR")(t)})})},e.onKeyFileDrop=function(n){n&&n.fileData&&(e.formData.file={name:n.fileData.name,size:n.fileData.size,content:n.fileContent},e.validatingFile=!0,t(function(){return e.readKeyFile(e.formData.file,{withSecret:!1}).then(function(t){t&&t.signPk?(e.formData.file.pubkey=a.util.encode_base58(t.signPk),e.formData.file.valid=!e.expectedPubkey||e.expectedPubkey==e.formData.file.pubkey,e.validatingFile=!1):(e.formData.file.valid=!1,e.formData.file.pubkey=void 0)}).catch(function(t){e.validatingFile=!1,e.formData.file.valid=!1,e.formData.file.pubkey=void 0,s.onError("ERROR.AUTH_FILE_ERROR")(t)})}))},e.removeKeyFile=function(){e.formData.file=void 0},e.showWotLookupModal=function(n){return c.showWotLookup({q:n}).then(function(n){if(n&&n.pubkey)return e.formData.pubkey=n.pubkey,e.formData.uid=n.uid||void 0,t(e.doLogin,300)})},e.showMethodsPopover=function(t){t.defaultPrevented||s.popover.show(t,{templateUrl:"templates/login/popover_methods.html",scope:e,autoremove:!0,afterShow:function(t){e.methodsPopover=t,s.ink({selector:".popover-login-methods .item"})}})},e.hideMethodsPopover=function(){e.methodsPopover&&(e.methodsPopover.hide(),e.methodsPopover=null)},e.init()}function AuthController(e,t){angular.extend(this,t("LoginModalCtrl",{$scope:e,parameters:{auth:!0}})),e.setForm=function(t){e.form=t}}function HelpController(e,t,n,i,a){"ngInject";e.$on("$ionicView.enter",function(o){e.locale=a.data.locale.id,t.stateParams&&t.stateParams.anchor&&(e.anchor=t.stateParams.anchor,n(function(){i(t.stateParams.anchor)},100))})}function HelpModalController(e,t,n,i,a){"ngInject";e.itemsClass={},e.locale=i.data.locale.id,a=a||{},a&&"string"==typeof a&&(a={anchor:a}),a.anchor&&(t(function(){n(a.anchor)},100),e.itemsClass={},e.itemsClass[a.anchor]="selected",e.listClass="selection")}function HelpTipController(e,t,n,i,a,o,r,s,l,c,u,d,p,m){e.tour=!1,e.continue=!0,e.executeStep=function(t,n,i){if((i=angular.isDefined(i)?i:0)>=n.length)return o.when(!0);var a=n[i];if("function"!=typeof a)throw new Error("[helptip] Invalid step at index {0} of '{1}' tour: step must be a function".format(i,t));var r=a();return"boolean"==typeof r&&(r=o.when(r)),r.then(function(a){return angular.isUndefined(a)?(e.continue=!1,i):a&&i!==n.length-1?e.executeStep(t,n,i+1):a?-1:i+1}).catch(function(n){return n&&"transition prevented"==n.message?console.error("ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error".format(t,i)):console.error("ERROR: in help tour  [{0}], in step [{1}] : {2}".format(t,i,n)),e.continue=!1,i})},e.showHelpTip=function(t,n){return n=n||{},n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||"",n.bindings.hasNext=!angular.isDefined(n.bindings.hasNext)||n.bindings.hasNext,n.timeout=n.timeout||(p.enable?900:500),n.autoremove=!0,n.bindings.tour=e.tour,n.backdropClickToClose=!e.tour,s.popover.helptip(t,n)},e.showHelpModal=function(e){Modals.showHelp({anchor:e})},e.startHelpTour=function(){return e.tour=!0,e.continue=!0,e.startCurrencyTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.currency=t,c.store(),e.continue)}).then(function(t){return!!t&&e.startNetworkTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.network=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWotLookupTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.wotLookup=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWotTour(0,!0).then(function(t){return!(!t||e.cancelled)&&(c.data.helptip.wot=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWotCertTour(0,!0).then(function(t){return!!t&&(c.data.helptip.wotCerts=t,c.store(),e.continue)})}).then(function(t){return!!t&&e.startWalletNoLoginTour(0,!0)}).then(function(t){return!!t&&(!m.isLogin()||e.startWalletTour(0,!0).then(function(t){return!!t&&(c.data.helptip.wallet=t,c.store(),e.continue)}))}).then(function(t){return!!t&&(!m.isLogin()||e.startWalletCertTour(0,!0).then(function(t){return!!t&&(c.data.helptip.walletCerts=t,c.store(),e.continue)}))}).then(function(t){return!!t&&(!m.isLogin()||e.startTxTour(0,!0).then(function(t){return!!t&&(c.data.helptip.tx=t,c.store(),e.continue)}))}).then(function(t){return!!t&&e.startHeaderTour(0,!0)}).then(function(t){return!!t&&e.startSettingsTour(0,!0)}).then(function(t){return!!t&&e.finishTour()})},e.startCurrencyTour=function(n,a){var o,l=function(){t.is("app.currency.tab_parameters")&&t.go("app.currency.tab_wot")},d=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-currency",{bindings:{content:"HELP.TIP.MENU_BTN_CURRENCY",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.currency":"app.currency_lg").then(function(){return e.showHelpTip("helptip-currency-mass-member",{bindings:{content:"HELP.TIP.CURRENCY_MASS",icon:{position:"center"}}})})},function(){return!c.data.useRelative||e.showHelpTip("helptip-currency-mass-member-unit",{bindings:{content:"HELP.TIP.CURRENCY_UNIT_RELATIVE",contentParams:o,icon:{position:s.screen.isSmall()?"right":"center"}}})},function(){return r("helptip-currency-rules-anchor"),e.showHelpTip("helptip-currency-rules",{bindings:{content:"HELP.TIP.CURRENCY_RULES",icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return l(),r("helptip-currency-newcomers-anchor"),e.showHelpTip("helptip-currency-newcomers",{bindings:{content:"HELP.TIP.CURRENCY_WOT",icon:{position:"center"},hasNext:a},timeout:1200})}];return u.get().then(function(t){return o=t.parameters,e.executeStep("currency",d,n)})},e.startNetworkTour=function(o,r){var d,p=function(){t.is("app.currency")&&a(function(){var e=n.document.querySelectorAll("ion-tabs .tabs a");e&&3==e.length&&angular.element(e[2]).triggerHandler("click")},100)},m=[function(){return!!s.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-network",{bindings:{content:"HELP.TIP.MENU_BTN_NETWORK",icon:{position:"left"}}}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.currency.tab_network":"app.network").then(function(){return p(),e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_BLOCKCHAIN",icon:{position:"center",glyph:"ion-information-circled"}},timeout:1200})})},function(){return p(),e.showHelpTip("helptip-network-peer-0",{bindings:{content:"HELP.TIP.NETWORK_PEERS",icon:{position:s.screen.isSmall()?void 0:"center"}},timeout:1e3,retry:20})},function(){return p(),e.showHelpTip("helptip-network-peer-0-block",{bindings:{content:"HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER",icon:{position:s.screen.isSmall()?void 0:"center"}}})},function(){p();var t=c.data.locale.id;return e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_PEERS_PARTICIPATE",contentParams:{installDocUrl:l.helptip&&l.helptip.installDocUrl?l.helptip.installDocUrl[t]?l.helptip.installDocUrl[t]:l.helptip.installDocUrl:"http://duniter.org"},icon:{position:"center",glyph:"ion-information-circled"},hasNext:r}})}];return u.parameters().then(function(t){return d=t,
 e.executeStep("network",m,o)})},e.startWotLookupTour=function(o,r){var l=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wot",{bindings:{content:"HELP.TIP.MENU_BTN_WOT",icon:{position:"left"}},onError:"continue"})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(s.screen.isSmall()?"app.wot_lookup.tab_search":"app.wot_lookup_lg").then(function(){return e.showHelpTip("helptip-wot-search-text",{bindings:{content:s.screen.isSmall()?"HELP.TIP.WOT_SEARCH_TEXT_XS":"HELP.TIP.WOT_SEARCH_TEXT",icon:{position:"center"}}})})},function(){return e.showHelpTip("helptip-wot-search-result-0",{bindings:{content:"HELP.TIP.WOT_SEARCH_RESULT",icon:{position:"center"}},timeout:700,retry:15})},function(){var t=n.document.getElementById("helptip-wot-search-result-0");return!t||(a(function(){angular.element(t).triggerHandler("click")}),e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS",hasNext:r},timeout:2500}))}];return e.executeStep("wotLookup",l,o)},e.startWotTour=function(t,n){var i,a=[function(){return e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT",contentParams:i,icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return e.showHelpTip("helptip-wot-view-certifications-count",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK",icon:{position:"center"},hasNext:n}})}];return u.get().then(function(n){return i=n.parameters,i.currentUD=n.currentUD,e.executeStep("wot",a,t)})},e.startWotCertTour=function(i,o){var r=[function(){if(t.is("app.wot_identity")){var i=n.document.getElementById("helptip-wot-view-certifications");if(!i)return!0;a(function(){angular.element(i).triggerHandler("click")})}return e.showHelpTip(s.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFY",icon:{position:s.screen.isSmall()?"bottom-right":"center"}},timeout:s.screen.isSmall()?2e3:1e3,retry:10})},function(){return e.showHelpTip(s.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:o}})}];return e.executeStep("certs",r,i)},e.startWalletNoLoginTour=function(t,n){if(m.isLogin())return o.when(!0);var a=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"},hasNext:n}})}];return e.executeStep("wallet-no-login",a,t)},e.startWalletTour=function(n,a){if(!m.isLogin())return o.when(!0);var l,c=m.data.isMember||m.data.requirements&&m.data.requirements.pendingMembership,p=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:m.data.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet").then(function(){return e.showHelpTip(s.screen.isSmall()?"helptip-wallet-options-xs":"helptip-wallet-options",{bindings:{content:"HELP.TIP.WALLET_OPTIONS",icon:{position:s.screen.isSmall()?"right":"center"}}})})},function(){return r("helptip-wallet-pubkey"),e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.WALLET_PUBKEY",icon:{position:"center"},hasNext:!c&&a},timeout:s.screen.isSmall()?2e3:500,retry:10})},function(){return c?(r("helptip-wallet-certifications"),e.showHelpTip("helptip-wallet-certifications",{bindings:{content:s.screen.isSmall()?"HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS":"HELP.TIP.WALLET_CERTIFICATIONS",icon:{position:"center"},hasNext:a},timeout:500,onError:"continue"})):a}];return p.length!=d.wallet.stepCount&&console.error("[help] Invalid value of 'csHelpConstants.wallet.stepCount'. Please update to {0}".format(p.length)),u.get().then(function(t){return l=t.parameters,l.currentUD=t.currentUD,e.executeStep("wallet",p,n)})},e.startWalletCertTour=function(i,r){if(!m.isLogin())return o.when(!0);var l,c=!1,d=[function(){if(t.is("app.view_wallet")){var i=n.document.getElementById("helptip-wallet-certifications");if(!i)return c=!0,!0;a(function(){angular.element(i).triggerHandler("click")})}return!s.screen.isSmall()||e.showHelpTip("helptip-received-certs",{bindings:{content:"HELP.TIP.WALLET_RECEIVED_CERTS"}})},function(){return!(!c&&s.screen.isSmall())||t.go("app.view_wallet").then(function(){return e.showHelpTip("helptip-wallet-given-certifications",{bindings:{content:"HELP.TIP.WALLET_GIVEN_CERTIFICATIONS",icon:{position:"center"}},timeout:500})})},function(){if(c)return!0;if(t.is("app.view_wallet")){var i=n.document.getElementById("helptip-wallet-given-certifications");if(!i)return c=!0,!0;a(function(){angular.element(i).triggerHandler("click")},500)}return e.showHelpTip(s.screen.isSmall()?"fab-select-certify":"helptip-certs-select-certify",{bindings:{content:"HELP.TIP.WALLET_CERTIFY",icon:{position:s.screen.isSmall()?"bottom-right":"center"}},timeout:s.screen.isSmall()?2e3:500,retry:10})},function(){return e.tour||c?r:e.showHelpTip("helptip-certs-stock",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:r}})}];return u.parameters().then(function(t){return l=t,e.executeStep("certs",d,i)})},e.startTxTour=function(n,a){if(!m.isLogin())return o.when(!0);var r,s=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-tx",{bindings:{content:m.data.isMember?"HELP.TIP.MENU_BTN_TX_MEMBER":"HELP.TIP.MENU_BTN_TX",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet_tx").then(function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:c.data.useRelative?"HELP.TIP.WALLET_BALANCE_RELATIVE":"HELP.TIP.WALLET_BALANCE",contentParams:r,icon:{position:"center"}},retry:20})})},function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:"HELP.TIP.WALLET_BALANCE_CHANGE_UNIT",contentParams:r,icon:{position:"center",glyph:"ion-information-circled"}}})}];return u.get().then(function(t){return r=t.parameters,r.currentUD=t.currentUD,e.executeStep("tx",s,n)})},e.startHeaderTour=function(t,r){function l(){var e=n.document.querySelectorAll("#helptip-header-bar-btn-profile");return e&&e.length?_.find(e,function(e){return e.offsetWidth>0}):null}if(s.screen.isSmall())return o.when(!0);var c=[function(){if(s.screen.isSmall())return!0;var t=l();return!t||e.showHelpTip(t,{bindings:{content:"HELP.TIP.HEADER_BAR_BTN_PROFILE",icon:{position:"right"}}})},function(){if(s.screen.isSmall())return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"},hasNext:r},timeout:1e3});var t=l();return!t||(a(function(){angular.element(t).triggerHandler("click")}),e.showHelpTip("helptip-popover-profile-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"center"},hasNext:r},timeout:1e3}).then(function(t){return e.closeProfilePopover(),t}))}];return e.executeStep("header",c,t)},e.startSettingsTour=function(n,a){var o,r=[function(){return!s.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"}},timeout:1e3}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.settings").then(function(){return e.showHelpTip("helptip-settings-btn-unit-relative",{bindings:{content:"HELP.TIP.SETTINGS_CHANGE_UNIT",contentParams:o,icon:s.screen.isSmall()?{position:"right",style:"margin-right: 60px"}:{position:"center"},hasNext:a},timeout:1e3})})}];return u.parameters().then(function(t){return o=t,e.executeStep("settings",r,n)})},e.finishTour=function(){if(i.isOpen()&&i.toggleLeft(!1),m.isLogin())return t.go("app.view_wallet").then(function(){return e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.END_LOGIN",hasNext:!1},timeout:1200})});var n;return o.all([e.showHome(),u.parameters().then(function(e){n=e})]).then(function(){return e.showHelpTip("helptip-home-logo",{bindings:{content:"HELP.TIP.END_NOT_LOGIN",contentParams:n,hasNext:!1}})})}}function HelpTourController(e){e.$on("$ionicView.enter",function(t,n){e.startHelpTour()})}function WalletController(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,f){"ngInject";e.loading=!0,e.settings=b.data,e.qrcodeId="qrcode-wallet-"+e.$id,e.toggleQRCode=!1;var T;e.enter=function(t,n){if(e.loading=e.loading||n.stateParams&&n.stateParams.refresh,e.enableSelectWallet=g.children.count()>0,e.loading)return(T=n.stateParams&&n.stateParams.id?g.children.get(n.stateParams.id):g)?(e.isDefaultWallet=T.isDefault(),e.walletId=T.id,e.cleanLocationHref(n),e.load()):(c.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome());c.loading.hide(),a(e.updateView,300)},e.$on("$ionicView.enter",e.enter),e.load=function(){if(T)return T.login().then(function(t){e.formData=t,e.loading=!1,e.updateView(),e.showQRCode(),T.isDefault()&&e.showHelpTip(),e.addListeners(),c.loading.hide()}).catch(function(t){"CANCELLED"===t&&e.showHome()})},e.updateView=function(){e.motion.show({selector:"#wallet .item"}),e.$broadcast("$$rebind::rebind")},e.setRegisterForm=function(t){e.registerForm=t},e.onWalletLogout=function(){e.hideQRCode(),e.removeListeners(),delete e.formData,T=null,e.loading=!0},e.addListeners=function(){e.listeners=[T.api.data.on.logout(e,e.onWalletLogout),e.$watchCollection("formData.events",function(t,n){!n||e.loading||angular.equals(t,n)||e.updateView()})]},e.removeListeners=function(){_.forEach(e.listeners,function(e){e()}),e.listeners=[]},e.showUidPopup=function(){return n(function(t,n){r(["ACCOUNT.NEW.TITLE","ACCOUNT.POPUP_REGISTER.TITLE","ACCOUNT.POPUP_REGISTER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then(function(n){e.formData.newUid=e.formData.uid?""+e.formData.uid:"",i.show({templateUrl:"templates/wallet/popup_register.html",title:n["ACCOUNT.POPUP_REGISTER.TITLE"],subTitle:n["ACCOUNT.POPUP_REGISTER.HELP"],scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"]},{text:n["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.registerForm.$submitted=!0,e.registerForm.$valid&&e.formData.newUid)return e.formData.newUid;t.preventDefault()}}]}).then(function(n){if(!n)return delete e.formData.uid,void c.loading.hide();t(n)})})})},e.self=function(){return e.hideActionsPopover(),e.showUidPopup().then(function(t){return c.loading.show(),T.self(t).then(function(){e.updateView(),c.loading.hide()}).catch(function(t){c.onError("ERROR.SEND_IDENTITY_FAILED")(t).then(function(){e.self()})})})},e.doMembershipIn=function(t){return T.membership.inside().then(function(){e.updateView(),c.loading.hide()}).catch(function(n){if("CANCELLED"===n)throw n;if(n&&n.ucode!=m.errorCodes.MEMBERSHIP_ALREADY_SEND)return console.error("[wallet] Node: already membership",n),void c.loading.hide();if(!t||t<=2)return a(function(){return e.doMembershipIn((t||0)+1)},1e3);throw n})},e.membershipIn=function(t){if(e.hideActionsPopover(),T.isMember())return c.alert.info("INFO.NOT_NEED_MEMBERSHIP");var n=angular.isDefined(e.formData.blockUid)&&e.formData.uid||void 0;return d.showJoinMember({uid:n,blockUid:n&&e.formData.blockUid,pubkey:e.formData.pubkey}).catch(function(e){"CANCELLED"!==e&&(T.data.uid?c.onError("ERROR.SEND_MEMBERSHIP_IN_FAILED")(e):c.onError("ERROR.SEND_IDENTITY_FAILED")(e))})},e.membershipOut=function(t,n){return e.hideActionsPopover(),t?n?(c.loading.show(),T.membership.out().then(function(){c.loading.hide(),c.toast.show("INFO.MEMBERSHIP_OUT_SENT")}).catch(c.onError("ERROR.SEND_MEMBERSHIP_OUT_FAILED"))):c.alert.confirm("CONFIRM.MEMBERSHIP_OUT_2","CONFIRM.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then(function(t){t&&e.membershipOut(!0,!0)}):c.alert.confirm("CONFIRM.MEMBERSHIP_OUT","CONFIRM.POPUP_WARNING_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then(function(t){t&&e.membershipOut(!0)})},e.doUpdate=function(t){return console.debug("[wallet] Refreshing data..."),(t?T.refreshData():c.loading.show().then(T.refreshData).then(c.loading.hide)).then(e.updateView).catch(c.onError("ERROR.REFRESH_WALLET_DATA"))},e.renewMembership=function(t){return T.isMember()||e.formData.requirements.wasMember?t||e.formData.requirements.needRenew?T.auth({minData:!0}).then(function(){return c.loading.hide(),c.alert.confirm("CONFIRM.RENEW_MEMBERSHIP")}).then(function(t){if(t)return c.loading.show(),e.doMembershipIn()}).catch(function(e){"CANCELLED"!==e&&(c.loading.hide(),c.alert.error(e))}):r("CONFIRM.NOT_NEED_RENEW_MEMBERSHIP",{membershipExpiresIn:e.formData.requirements.membershipExpiresIn}).then(function(e){return c.alert.confirm(e)}).then(function(t){if(t)return e.renewMembership(!0)}):c.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")},e.fixIdentity=function(){if(e.formData.uid)return n.all([T.auth(),r("CONFIRM.FIX_IDENTITY",{uid:e.formData.uid})]).then(function(e){return c.alert.confirm(e[1])}).then(function(t){if(t)return c.loading.show(),e.formData.blockUid=null,e.formData.sigDate=null,T.self(e.formData.uid)}).then(e.doMembershipIn).catch(function(e){"CANCELLED"!==e&&(c.loading.hide(),c.alert.error(e))})},e.fixMembership=function(){if(e.formData.uid)return T.isMember()?c.alert.info("INFO.NOT_NEED_MEMBERSHIP"):(e.hideActionsPopover(),T.auth({silent:!0}).then(function(){c.alert.confirm("CONFIRM.FIX_MEMBERSHIP")}).then(function(t){if(t)return c.loading.show(),e.formData.blockUid=null,e.formData.sigDate=null,T.self(e.formData.uid,!1)}).then(e.doMembershipIn).catch(function(e){"CANCELLED"!==e&&(c.loading.hide(),c.alert.error(e))}))},e.doQuickFix=function(t){"renew"===t?e.renewMembership():"membership"===t?e.membershipIn(!0):"fixMembership"===t?e.fixMembership(!1):"fixIdentity"===t&&e.fixIdentity()};var h=e.logout;e.logout=function(t){if(e.isDefaultWallet)return h(t)},e.startWalletTour=function(){return e.hideActionsPopover(),f.wallet.tour()},e.showHelpTip=function(){return f.wallet.helptip()},e.showQRCode=function(t){e.qrcode?(e.qrcode.clear(),e.qrcode.makeCode(e.formData.pubkey),c.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100)):(e.qrcode=new QRCode(e.qrcodeId,{text:e.formData.pubkey,width:180,height:180,correctLevel:QRCode.CorrectLevel.L}),c.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100))},e.hideQRCode=function(){e.qrcode&&(e.qrcode.clear(),c.motion.toggleOff({selector:"#"+e.qrcodeId}))},e.showCertifications=function(){e.isDefaultWallet?o.go(c.screen.isSmall()?"app.wallet_cert":"app.wallet_cert_lg",{type:"received"}):o.go(c.screen.isSmall()?"app.wallet_cert_by_id":"app.wallet_cert_by_id_lg",{id:e.walletId,type:"received"})},e.showGivenCertifications=function(){e.isDefaultWallet?o.go(c.screen.isSmall()?"app.wallet_cert":"app.wallet_cert_lg",{type:"given"}):o.go(c.screen.isSmall()?"app.wallet_cert_by_id":"app.wallet_cert_by_id_lg",{id:e.walletId,type:"given"})},e.showTxHistory=function(){o.go(e.isDefaultWallet?"app.view_wallet_tx":"app.view_wallet_tx_by_id",{id:e.walletId})},e.showLicenseModal=function(){return u.show("templates/currency/modal_license.html","CurrencyLicenseModalCtrl")},e.showTransferModal=function(){return!!e.formData.balance&&e.formData.balance>0||g.children.count()?d.showTransfer({wallet:T.id}).then(function(t){t&&(c.toast.show("INFO.TRANSFER_SENT"),e.$broadcast("$$rebind::balance"),e.motion.show({selector:".item-pending"}))}):void c.alert.info("INFO.NOT_ENOUGH_CREDIT")},e.showSecurityModal=function(){return e.hideActionsPopover(),d.showAccountSecurity({wallet:T}).then(function(t){if(t)return"self"===t?e.self():"membershipIn"===t?e.membershipIn():void 0})},e.showSelectIdentitiesModal=function(){return e.hideActionsPopover(),d.showSelectPubkeyIdentity({identities:[e.formData.requirements].concat(e.formData.requirements.alternatives)}).then(function(t){if(t&&t.uid)return e.loading=!0,T.setSelf(t.uid,t.blockUid).then(function(){e.loading=!1,e.updateView(),c.loading.hide()})})},e.showSelectWalletModal=function(){if(g.children.count())return d.showSelectWallet({parameters:{showDefault:!0,showBalance:!1,excludedWalletId:e.walletId}}).then(function(t){if(t&&(!T||t.id!==T.id))return e.removeListeners(),e.loading=!0,T=t,console.debug("[transfer] Using wallet {"+T.id+"}"),e.formData={},e.load()})},e.showActionsPopover=function(t){c.popover.show(t,{templateUrl:"templates/wallet/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showSharePopover=function(n){e.hideActionsPopover();var i=e.formData.name||e.formData.uid||e.formData.pubkey,a=(E.shareBaseUrl||t.rootPath)+o.href("app.wot_identity",{pubkey:e.formData.pubkey,uid:e.formData.uid});c.screen.isSmall()&&(n=angular.element(document.querySelector("#wallet-share-anchor"))||n),c.popover.share(n,{bindings:{url:a,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:i},postMessage:i}})},e.showSelectWalletPopover=function(t){return p.showSelectWallet(t,{parameters:{excludedWalletId:e.walletId}}).then(function(t){if(t&&t.id!==e.walletId)return t.isDefault()?o.go("app.view_wallet"):o.go("app.view_wallet_by_id",{id:t.id})})},e.cleanLocationHref=function(e){e&&e.stateParams&&e.stateParams.refresh&&a(function(){var t=angular.copy(e.stateParams);delete t.refresh,delete t.id,l.search(t).replace()},300)}}function WalletTxController(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";e.loading=!0,e.settings=u.data,e.listeners=[];var E;e.enter=function(t,n){if(e.loading=e.loading||n.stateParams&&n.stateParams.refresh,e.enableSelectWallet=p.children.count()>0,e.loading)return(E=n.stateParams&&n.stateParams.id?p.children.get(n.stateParams.id):p)?(e.walletId=E.id,e.cleanLocationHref(n),e.load()):(o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome());e.addListeners(),i(e.updateView,300)},e.$on("$ionicView.enter",e.enter),e.leave=function(){e.removeListeners()},e.$on("$ionicView.leave",e.leave),e.load=function(){if(E){var t=E.isDataLoaded({minData:!0}),n={requirements:!t,minData:!t,sources:!0,tx:{enable:!0}};return E.login(n).then(function(t){e.formData=t,e.loading=!1,e.updateView(),e.showFab("fab-transfer"),E.isDefault()&&e.showHelpTip(),e.addListeners(),o.loading.hide()}).catch(function(t){"CANCELLED"===t&&e.showHome()})}},e.cleanLocationHref=function(e){e&&e.stateParams&&e.stateParams.refresh&&i(function(){var t=angular.copy(e.stateParams);delete t.refresh,delete t.id,a.search(t).replace()},300)},e.updateView=function(){e.formData&&!e.loading&&(e.$broadcast("$$rebind::balance"),e.$broadcast("$$rebind::rebind"),e.motion.show({selector:".view-wallet-tx .item",ink:!1}))},e.downloadHistoryFile=function(t){t=t||{},t.fromTime=t.fromTime||-1;var n=e.formData.pubkey;m.downloadHistoryFile(n,t)},e.doUpdate=function(t){console.debug("[wallet] TX history reloading...");var n=e.formData&&e.formData.tx&&e.formData.tx.fromTime||void 0,i={sources:!0,tx:{enable:!0,fromTime:n},api:!1};return(t?E.refreshData(i):o.loading.show().then(function(){return E.refreshData(i)}).then(o.loading.hide)).then(e.updateView).catch(o.onError("ERROR.REFRESH_WALLET_DATA"))},e.addListeners=function(){e.listeners=[E.api.data.on.balanceChanged(e,e.updateView),e.$watch("settings.useRelative",e.updateView,!0),e.$watch("settings.showUDHistory",function(t,n){e.formData&&!e.loading&&t!==n&&e.doUpdate()},!0)],e.settings.walletHistoryAutoRefresh&&e.listeners.push(d.api.data.on.newBlock(e,function(t){e.loading||(console.debug("[wallet] Received new block. Will reload history."),i(function(){e.doUpdate(!0)},500))}))},e.removeListeners=function(){_.forEach(e.listeners,function(e){e()}),e.listeners=[]},e.showTransferModal=function(){return!!e.formData.balance&&e.formData.balance>0||p.children.count()?r.showTransfer({wallet:E.id}).then(function(t){t&&(o.toast.show("INFO.TRANSFER_SENT"),e.$broadcast("$$rebind::balance"),e.motion.show({selector:".item-pending"}))}):void o.alert.info("INFO.NOT_ENOUGH_CREDIT")},e.showHelpTip=function(e,t){},e.showTxErrors=function(t){return E.isDefault()?e.goState("app.view_wallet_tx_errors"):e.goState("app.view_wallet_tx_errors_by_id",{id:E.id})},e.showMoreTx=function(t){return t=t||e.formData.tx.fromTime-u.data.walletHistoryTimeSecond||c.date.now()-2*u.data.walletHistoryTimeSecond,o.loading.show(),E.refreshData({tx:{enable:!0,fromTime:t}}).then(function(){e.updateView(),o.loading.hide()}).catch(function(n){n.ucode==l.errorCodes.HTTP_LIMITATION?i(function(){return e.showMoreTx(t)},2e3):o.onError("ERROR.REFRESH_WALLET_DATA")(n)})},e.showSelectWalletModal=function(){if(p.children.count())return r.showSelectWallet({parameters:{showDefault:!0,showBalance:!1,excludedWalletId:e.walletId}}).then(function(t){if(t&&(!E||t.id!==E.id))return e.removeListeners(),e.loading=!0,E=t,console.debug("[transfer] Using wallet {"+E.id+"}"),e.formData={},e.load()})};e.toUnlockUIArray=function(t,n,i){return n=n||0,!t.children||"AND"!=t.type&&"OR"!=t.type?{style:{"padding-left":n+"px"},operator:i,type:t.type,value:t.value}:t.children.reduce(function(i,a,o){return a.children&&o>0?(i=i.concat({style:{"padding-left":n+"px","padding-top":"10px","padding-bottom":"10px"},operator:t.type}),i.concat(e.toUnlockUIArray(a,n+10))):i.concat(e.toUnlockUIArray(a,n+10,o&&t.type))},[])},e.showLockedOutputsPopover=function(t,n){t.lockedOutputs&&(e.popoverData=e.popoverData||{},e.popoverData.lockedOuputs=t.lockedOutputs.reduce(function(t,n){return t.concat({amount:n.amount,unlockFunctions:n.unlockFunctions,unlockConditions:e.toUnlockUIArray(n.unlockTree)})},[]),o.popover.show(n,{templateUrl:"templates/wallet/tx_locked_outputs_popover.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}}))},e.hideLockedOutputsPopover=function(){e.lockedOutputsPopover&&(e.lockedOutputsPopover.hide(),e.popoverData&&delete e.popoverData.unlockConditions,e.lockedOutputsPopover=null)},e.showSelectWalletPopover=function(t){return s.showSelectWallet(t,{scope:e}).then(function(t){if(t&&t.id!==E.id)return t.isDefault()?e.goState("app.view_wallet_tx"):e.goState("app.view_wallet_tx_by_id",{id:t.id})})},e.goState=function(t,i){return e.hideLockedOutputsPopover(),n.go(t,i)}}function WalletTxErrorController(e,t,n,i){"ngInject";var a;e.settings=n.data,e.loading=!0,e.formData={},e.$on("$ionicView.enter",function(n,o){return a=o.stateParams&&o.stateParams.id?i.children.get(o.stateParams.id):i,a?e.load():(t.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome())}),e.load=function(){if(a)return a.login().then(function(n){e.formData=n,e.loading=!1,e.doMotion(),t.loading.hide()})},e.doUpdate=function(n){return e.loading=!0,(n?a.refreshData():t.loading.show().then(i.refreshData).then(t.loading.hide)).then(function(){e.doMotion(),e.loading=!1}).catch(function(n){t.onError("ERROR.REFRESH_WALLET_DATA")(n),e.loading=!1})},e.filterReceivedTx=function(e){return e.amount&&e.amount>0},e.filterSentTx=function(e){return e.amount&&e.amount<0},e.hasReceivedTx=function(){return e.formData.tx&&_(e.formData.tx.errors||[]).find(e.filterReceivedTx)&&!0},e.hasSentTx=function(){return e.formData.tx&&_(e.formData.tx.errors||[]).find(e.filterSentTx)&&!0}}function WalletSecurityModalController(e,t,n,i,a){var o=a&&a.wallet||n;e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.smallscreen=t.screen.isSmall(),e.recover={},e.isValidFile=!1,e.login=o.isLogin(),e.hasSelf=o.hasSelf(),e.needSelf=e.login&&o.data.requirements.needSelf,e.canRevoke=e.login&&e.hasSelf&&!o.data.requirements.revoked,e.needMembership=e.login&&o.data.requirements.needMembership,e.option=e.login?"saveID":"recoverID",e.formData={addQuestion:"",level:"4",questions:[]};for(var r=[],s=1;s<20;s++)r.push("ACCOUNT.SECURITY.QUESTION_"+s.toString());i(r).then(function(t){_.each(t,function(t){e.formData.questions.push({value:t,checked:!1})})}),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=3===e.slides.slider.activeIndex&&("saveID"==e.option||"recoverID"==e.option)||2===e.slides.slider.activeIndex&&"revocation"==e.option},e.doNext=function(n){if(!n)switch(e.slides.slider.activeIndex){case 1:switch(e.option){case"saveID":n="questionsForm";break;case"recoverID":e.isValidFile?(e.slideNext(),e.hasContent=!1,e.fileData=""):t.alert.error("ERROR.NOT_VALID_SAVE_ID_FILE","ERROR.LOAD_FILE_FAILED")}break;case 2:switch(e.option){case"recoverID":n="recoverForm";break;case"saveID":n="answersForm"}}if(n){if(e[n].$submitted=!0,!e[n].$valid)return;switch(n){case"recoverForm":e.recoverId();break;case"answersForm":e.downloadSaveIDFile();break;default:e.slideNext()}}},e.selectOption=function(t){e.option=t,e.slideNext()},e.restore=function(){1===e.slides.slider.activeIndex&&"saveID"===e.option?(e.formData={addQuestion:"",level:"4",questions:[]},i(r).then(function(t){_.each(t,function(t){e.formData.questions.push({value:t,checked:!1})})})):2===e.slides.slider.activeIndex&&"saveID"===e.option?_.each(e.formData.questions,function(e){e.answer=void 0}):1===e.slides.slider.activeIndex&&"recoverID"===e.option?(e.hasContent=!1,e.recover={},e.fileData="",e.isValidFile=!1):2===e.slides.slider.activeIndex&&"recoverID"===e.option?_.each(e.recover.questions,function(e){e.answer=void 0}):2===e.slides.slider.activeIndex&&"revocation"===e.option&&(e.isValidFile=!1,e.hasContent=!1,e.revocation=void 0)},e.recoverContent=function(t){if(e.hasContent=angular.isDefined(t)&&""!==t,e.fileData=t.fileData?t.fileData:"",e.isValidFile=""!==e.fileData&&"text/plain"==e.fileData.type,e.isValidFile&&"recoverID"===e.option){e.content=t.fileContent.split("\n");var n=_.indexOf(e.content,"Questions: "),i=-1;_.each(e.content,function(t,n){/^Issuer:/.test(t)?i=n:/^Crypted-Nonce:/.test(t)?e.recover.cypherNonce=t.split(" ")[1]:/^Crypted-Pubkey:/.test(t)?e.recover.cypherPubkey=t.split(" ")[1]:/^Crypted-Salt:/.test(t)?e.recover.cypherSalt=t.split(" ")[1]:/^Crypted-Pwd:/.test(t)&&(e.recover.cypherPwd=t.split(" ")[1])}),e.recover.questions=[];for(var a=n+1;a<i;a++)e.recover.questions.push({value:e.content[a]})}else e.isValidFile&&"revocation"===e.option&&(e.revocation=t.fileContent)},e.recoverId=function(){if(e.recoverForm.$valid)return e.recover.answer="",_.each(e.recover.questions,function(t){e.recover.answer+=t.answer}),o.recoverId(e.recover).then(function(n){angular.isDefined(n)?(e.recover=n,e.slideNext()):t.alert.error("ERROR.RECOVER_ID_FAILED")})},e.addQuestion=function(){""!==e.formData.addQuestion&&(e.formData.questions.push({value:e.formData.addQuestion,checked:!0}),e.formData.addQuestion="")},e.downloadSaveIDFile=function(){var n;return o.auth({forceAuth:!0,expectedPubkey:e.pubkey,silent:!0,success:function(e){n=e}}).catch(function(e){e&&"CANCELLED"===e||t.alert.error("ERROR.SALT_OR_PASSWORD_NOT_CONFIRMED","ERROR.LOGIN_FAILED")}).then(function(t){if(t){var i={file:_.filter(e.formData.questions,function(e){return e.checked})},a={salt:n.username,pwd:n.password,questions:"",answer:""};return _.each(i.file,function(e){a.questions+=e.value+"\n",a.answer+=e.answer}),o.getCryptedId(a).then(function(t){o.downloadSaveId(t),e.closeModal()})}})},e.isRequired=function(){return _.filter(e.formData.questions,function(e){return e.checked}).length<e.formData.level},e.revokeWithFile=function(){e.isValidFile?e.revokeIdentity():t.alert.error("ERROR.NOT_VALID_REVOCATION_FILE","ERROR.LOAD_FILE_FAILED")},e.downloadRevokeFile=function(){return o.auth({forceAuth:!0}).then(function(){return o.downloadRevocation()}).then(function(){t.loading.hide()}).catch(function(e){e&&"CANCELLED"===e||t.onError("ERROR.DOWNLOAD_REVOCATION_FAILED")(e)})},e.revokeWalletIdentity=function(){return e.hasSelf?o.auth({forceAuth:!0}).then(function(n){if(t.loading.hide(),n)return e.revokeIdentity()}).catch(function(e){"CANCELLED"!==e&&t.onError("ERROR.REVOCATION_FAILED")(e)}):t.alert.error("ERROR.ONLY_SELF_CAN_EXECUTE_THIS_ACTION")},e.revokeIdentity=function(n){return n?t.loading.show().then(function(){return e.revocation?o.revokeWithFile(e.revocation):o.revoke()}).then(function(){return t.toast.show("INFO.REVOCATION_SENT"),e.closeModal(),t.loading.hide()}).catch(t.onError("ERROR.REVOCATION_FAILED")):t.alert.confirm("CONFIRM.REVOKE_IDENTITY","CONFIRM.POPUP_WARNING_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"}).then(function(e){if(e)return t.alert.confirm("CONFIRM.REVOKE_IDENTITY_2","CONFIRM.POPUP_TITLE",{cssClass:"warning",okText:"COMMON.BTN_YES",okType:"button-assertive"})}).then(function(t){t&&e.revokeIdentity(!0,!0)})},e.self=function(){return e.closeModal("self")},e.membershipIn=function(){return e.closeModal("membershipIn")},e.downloadKeyFile=function(n){return o.auth({forceAuth:!0}).then(function(){return o.downloadKeyFile(n)}).then(function(){return t.loading.hide(),e.closeModal()}).catch(function(e){if(e&&"CANCELLED"===e)return void t.loading.hide();t.onError("ERROR.DOWNLOAD_KEYFILE_FAILED")(e)})}}function WalletListAbstractController(e,t,n,i,a,o,r,s){"ngInject";e.loading=!0,e.wallets=null,e.formData={useRelative:o.data.useRelative,showDefault:!0,showBalance:!1,balance:void 0,updatingWalletId:void 0,stopped:!1,minData:!0},e.motion=null,e.setParameters=function(t){t=t||{},e.formData.useRelative=angular.isDefined(t.useRelative)?t.useRelative:e.formData.useRelative,e.formData.showBalance=angular.isDefined(t.showBalance)?t.showBalance:e.formData.showBalance,e.formData.minData=angular.isDefined(t.minData)?t.minData:e.formData.minData,e.formData.excludedWalletId=t.excludedWalletId,e.formData.showDefault=(angular.isDefined(t.showDefault)?t.showDefault:e.formData.showDefault)&&"default"!==e.formData.excludedWalletId},e.load=function(n){n=n||{},e.loading=!1!==n.silent,e.formData.balance=void 0,e.formData.updatingWalletId=void 0,e.formData.stopped=!1;var o=[];o.push(r.name().then(function(t){return e.currency=t,a.ready()})),e.defaultWallet=e.formData.showDefault?s:void 0,e.wallets||o.push(s.children.all().then(function(t){e.wallets=t,i.loading.hide()}));var l={silent:!0,minData:e.formData.minData,sources:e.formData.showBalance,tx:{enable:!1},api:!0},c=!1,u=0,d=Date.now(),p=0;return(o.length?t.all(o):t.when()).then(function(){var i=e.formData.showDefault?[s].concat(e.wallets):e.wallets;if(i.length)return console.debug("[wallets] Loading {0} wallets...".format(i.length)),i.reduce(function(t,i){return!n.refresh&&i.isDataLoaded(l)?(console.debug("[wallets] Wallet #{0} already loaded. Skipping".format(i.id)),t.then(function(){p+=i.data.balance,e.updateWalletView(i.id)})):(u++,t.then(function(){if(!e.formData.stopped){e.formData.updatingWalletId=i.id;var t;if(n.refresh&&i.data.loaded){var a=angular.merge({requirements:!i.data.requirements.loaded||i.data.requirements.isMember||i.data.requirements.wasMember||i.data.requirements.pendingMembership},l);t=i.refreshData(a)}else t=i.loadData(l);return t.then(function(t){p+=t.balance,e.updateWalletView(i.id)}).catch(function(e){console.error("[wallets] Error while loading data of wallet #{0}".format(i.id),e),c=!0}),t}}))},t.when())}).then(function(){if(c)return i.alert.error("ERROR.LOAD_WALLET_LIST_FAILED").then(function(){e.resetData(),e.cancel()});e.formData.stopped||(u&&console.debug("[wallets] Loaded data of {0} wallet(s) in {1}ms".format(u,Date.now()-d)),e.formData.balance=p,e.formData.updatingWalletId=void 0,e.loading=!1,i.loading.hide(),e.updateView())}).catch(function(t){if(e.resetData(),t&&"CANCELLED"===t)throw e.cancel(),t;return i.onError("ERROR.LOAD_WALLET_LIST_FAILED")(t)})},e.filterFn=function(e){return function(t){return!e||t.id!==e.excludedWalletId}},e.resetData=function(){console.debug("[wallets] Cleaning wallet list"),e.wallets=null,e.loading=!0,e.entered=!1,e.formData.balance=void 0,e.formData.updatingWalletId=void 0},e.updateView=function(t){if(e.wallets&&e.wallets.length){var n=t&&" #wallet-"+t||"";e.motion?e.motion.show({selector:".list .item.item-wallet"+n,ink:!0}):i.ink({selector:".list .item.item-wallet"+n})}},e.updateWalletView=function(t){e.motion?e.motion.show({selector:".list #wallet-"+t,ink:!0}):i.ink({
 selector:".list #wallet-"+t})},e.doUpdate=function(i){return e.loading||!e.wallets||!e.wallets.length||e.formData.updatingWalletId?t.when():(e.selectPrevented=!0,n(function(){e.selectPrevented=!1},1e3),e.load({silent:i,refresh:!0}).then(function(){e.loading=!1,e.selectPrevented=!1,i&&e.$broadcast("$$rebind::rebind"),e.updateView()}))},e.addNewWallet=function(n){return n?o.data.useLocalStorageEncryption&&!s.isAuth()?s.auth({minData:!0}).then(function(){return e.addNewWallet(n)}).catch(function(e){if("CANCELLED"===e)return i.loading.hide();i.onError("ERROR.ADD_SECONDARY_WALLET_FAILED")(e)}):s.api.data.raisePromise.load(n.data).catch(console.error).then(function(){e.addListenersOnWallet(n),s.children.add(n)}):t.reject("Missing 'wallet' argument")},e.showNewWalletModal=function(){var t=s.children.instance();return t.login({showNewAccountLink:!1,title:"ACCOUNT.WALLET_LIST.BTN_NEW",okText:"COMMON.BTN_ADD",minData:!0,sources:!0,api:!1,success:i.loading.show,method:"PUBKEY"}).then(function(n){return n?s.isUserPubkey(n.pubkey)?(i.loading.hide(),void i.alert.error("ERROR.COULD_NOT_ADD_MAIN_WALLET")):s.children.hasPubkey(n.pubkey)?(i.loading.hide(),void i.alert.error("ERROR.COULD_NOT_ADD_EXISTING_WALLET")):(console.debug("[wallet] Adding secondary wallet {"+n.pubkey.substring(0,8)+"}"),e.addNewWallet(t).then(function(){i.loading.hide(),e.updateView()})):void i.loading.hide(100)}).catch(function(e){"CANCELLED"===e&&i.loading.hide()})},e.addListenersOnWallet=function(e){},e.cancel=function(){console.warn("cancel() must be implement by subclass")},e.select=function(e,t){console.warn("select() must be implement by subclass")}}function WalletSelectModalController(e,t,n){"ngInject";angular.extend(this,t("WalletListAbstractCtrl",{$scope:e})),e.$on("modal.shown",function(){e.setParameters(n),e.load()}),e.cancel=function(){e.closeModal()},e.select=function(t,n){t.isDefaultPrevented()||!n||e.selectPrevented||e.closeModal(n)},n&&e.setParameters(n)}function WalletListViewController(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";e.settings=p.data,e.listeners=[],angular.extend(this,t("WalletListAbstractCtrl",{$scope:e,parameters:{}})),e.formData.name=void 0,e.motion=c.motion.default,e.entered=!1,e.enter=function(t,n){if(!e.entered)return e.entered=!0,e.setParameters({showDefault:!0,showBalance:!0,minData:!1}),e.load().then(function(){c.loading.hide(),e.wallets&&(e.addListeners(),e.showFab("fab-add-wallet"))});e.addListeners(),e.formData.stopped&&(e.loading=!1,e.formData.stopped=!1,e.formData.updatingWalletId=void 0,e.updateView())},e.$on("$ionicView.enter",e.enter),e.leave=function(){e.formData.stopped=!0,e.formData.updatingWalletId=void 0,e.loading=!1,e.removeListeners()},e.$on("$ionicView.leave",e.leave),e.cancel=function(){e.showHome()},e.select=function(t,i){t.isDefaultPrevented()||!i||e.selectPrevented||(i.isDefault()?n.go("app.view_wallet"):n.go("app.view_wallet_by_id",{id:i.id}),t.preventDefault())},e.editWallet=function(t,n){return t.preventDefault(),e.showEditPopup(n).then(function(t){if(t)return(p.data.useLocalStorageEncryption?m.auth({minData:!0}):a.when()).then(function(){n.data.localName=t,m.storeData(),c.loading.hide(),e.updateView()}).catch(function(e){if("CANCELLED"===e)return c.loading.hide();c.onError("ERROR.SAVE_WALLET_LIST_FAILED")(e)})})},e.downloadAsFile=function(){if(e.wallets)return m.children.downloadFile()},e.selectAndRemoveWallet=function(){return e.hideActionsPopover(),u.showSelectWallet({wallets:e.wallets,showDefault:!1}).then(function(t){if(t&&t.id)return(p.data.useLocalStorageEncryption?m.auth({minData:!0}):a.when()).then(function(){m.children.remove(t.id),c.loading.hide(),e.updateView()}).catch(function(e){if("CANCELLED"===e)return c.loading.hide();c.onError("ERROR.ADD_SECONDARY_WALLET_FAILED")(e)})})},e.showImportFileModal=function(){e.hideActionsPopover();var t=function(t){console.debug("[wallet] Adding secondary wallet {"+t.pubkey.substring(0,8)+"}");var n=m.children.instance();return n.login({authData:t,minData:!0,sources:!0,api:!1,success:c.loading.show}).then(function(i){return i.localName=t.localName,e.addNewWallet(n)})};return l.show("templates/wallet/list/modal_import_file.html","WalletListImportModalCtrl").then(function(n){if(n&&n.length)return c.loading.show(),(p.data.useLocalStorageEncryption?m.auth({minData:!0}):a.when()).then(function(){return n.reduce(function(e,n){return e.then(function(){return t(n)})},a.when())}).then(function(){c.loading.hide(),e.updateView()}).catch(function(e){if("CANCELLED"===e)return c.loading.hide();c.onError("ERROR.ADD_SECONDARY_WALLET_FAILED")(e)})})},e.setEditForm=function(t){e.editForm=t},e.showEditPopup=function(t){return a(function(n,i){o(["ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE","ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then(function(i){e.formData.name=t.data.localName||t.data.name||t.data.uid||t.data.pubkey.substring(0,8),s.show({templateUrl:"templates/wallet/list/popup_edit_name.html",title:i["ACCOUNT.WALLET_LIST.EDIT_POPOVER.TITLE"],subTitle:i["ACCOUNT.WALLET_LIST.EDIT_POPOVER.HELP"],scope:e,buttons:[{text:i["COMMON.BTN_CANCEL"]},{text:i["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.editForm.$submitted=!0,e.editForm.$valid&&e.formData.name)return e.formData.name;t.preventDefault()}}]}).then(function(t){if(!t)return delete e.formData.name,void c.loading.hide();n(t)})})})},e.showActionsPopover=function(t){c.popover.show(t,{templateUrl:"templates/wallet/list/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.onWalletLogout=function(){e.resetData(),e.removeListeners()},e.addListeners=function(){e.removeListeners(),e.listeners=[m.api.data.on.logout(e,e.onWalletLogout)],p.data.walletHistoryAutoRefresh&&e.listeners.push(d.api.data.on.newBlock(e,function(t){e.loading||(console.debug("[wallet-list] Received new block. Will reload list."),i(function(){e.doUpdate(!0)},300))})),_.forEach(e.wallets||[],e.addListenersOnWallet)},e.addListenersOnWallet=function(t){t&&(e.listeners.push(t.api.data.on.unauth(e,e.updateView)),e.listeners.push(t.api.data.on.auth(e,function(t,n){return i(e.updateView),n?n.resolve():a.when()})))},e.removeListeners=function(){_.forEach(e.listeners,function(e){e()}),e.listeners=[]};var E=e.updateView;e.updateView=function(){E(),e.$broadcast("$$rebind::rebind")};var b=e.updateWalletView;e.updateWalletView=function(t){b(t),e.$broadcast("$$rebind::rebind")},e.$watch("settings.useRelative",function(t,n){e.formData&&!e.loading&&t!==n&&(e.formData.useRelative=p.data.useRelative,e.updateView())},!0)}function WalletSelectPopoverController(e,t,n,i){"ngInject";angular.extend(this,t("WalletListAbstractCtrl",{$scope:e})),e.motion=null,e.$on("popover.shown",function(){e.loading&&(e.setParameters(i),e.load())}),e.updateView=function(){e.wallets&&e.wallets.length&&(n.ink({selector:".popover-wallets .list .item"}),e.$broadcast("$$rebind::rebind"))},e.select=function(t,n){t.isDefaultPrevented()||!n||e.selectPrevented||e.closePopover(n)}}function WalletListImportModalController(e,t,n,i){"ngInject";e.hasContent=!1,e.content=null,e.fileData="",e.isValidFile=!1,e.validatingFile=!1,e.importFromFile=function(a){e.validatingFile=!0,e.hasContent=angular.isDefined(a)&&""!==a,e.fileData=a.fileData?a.fileData:"";var o=""!==e.fileData&&("text/csv"==e.fileData.type||"text/plain"==e.fileData.type||"application/vnd.ms-excel");if(!o)return console.error("[wallet] Import failed. Invalid file type: "+e.fileData.type),e.isValidFile=!1,void(e.validatingFile=!1);console.debug("[wallet] Parsing file to import...");var r=a.fileContent.split("\n");e.content=r.reduce(function(e,t){if(!t||!t.trim().length)return e;var a=t.split("\t",3)||void 0;if(a&&3!=a.length)return console.debug("[wallet] Import: skip invalid row: "+t),o=!1,e;var r={pubkey:a[0],uid:a[1],localName:a[2]};return n.regexp.PUBKEY.test(r.pubkey)?i.isUserPubkey(r.pubkey)?(console.debug("[wallet] Pubkey equals to main wallet. Skip this row: ",t),e):i.children.hasPubkey(r.pubkey)?(console.debug("[wallet] Pubkey already in wallet list. Skip this row",t),e):e.concat(r):(console.debug("[wallet] Invalid pubkey, found in this row: ",t),o=!1,e)},[]),e.isValidFile=o,t(function(){e.validatingFile=!1},250)},e.removeFile=function(){e.hasContent=!1,e.content=null,e.fileData="",e.isValidFile=!1,e.validatingFile=!1}}function WotLookupController(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b){"ngInject";e.search={text:"",loading:!0,type:null,results:[]},e.entered=!1,e.wotSearchTextId="wotSearchText",e.enableFilter=!0,e.enableWallets=!1,e.allowMultiple=!1,e.selection=[],e.showResultLabel=!0,e.parameters={},e.enter=function(t,n){if(e.entered)e.updateLocationHref(),e.search.results&&e.search.results.length&&e.motion.show({selector:".lookupForm .list .item",ink:!0});else{var a=angular.merge({},e.parameters,n&&n.stateParams);a&&a.q?(e.search.text=a.q,i(function(){e.doSearch()},100)):a&&a.hash?(e.search.text="#"+a.hash,i(function(){e.doSearch()},100)):i(function(){u.data.initPhase&&!a.type?e.doGetPending(0,void 0,!0):"newcomers"==a.type||!c.initPhase&&!a.type?e.doGetNewcomers(0,void 0,!0):"pending"==a.type?e.doGetPending(0,void 0,!0):"wallets"==a.type&&e.doGetWallets(0,void 0,!0)},100),e.entered=!0,i(l.ink,100),e.showHelpTip()}},e.$on("$ionicView.enter",e.enter),e.resetWotSearch=function(){e.search={text:null,loading:!1,type:"newcomers",results:[]}},e.updateLocationHref=function(){},e.doSearchText=function(){e.doSearch(),e.updateLocationHref(),p.keyboard.close()},e.doSearch=function(){e.search.loading=!0;var t=e.search.text.trim();return l.screen.isSmall()&&t.length<3||!t.length?(e.search.results=void 0,e.search.loading=!1,e.search.type="none",e.search.total=void 0,n.when()):(e.search.type="text",b.search(t).then(function(n){if("text"==e.search.type&&e.search.text.trim()===t){if(!(n&&n.length||!m.regexp.PUBKEY.test(t)&&!m.regexp.PUBKEY_WITH_CHECKSUM.test(t)))return m.uri.parse(t).then(function(t){e.doDisplayResult([t])});e.doDisplayResult(n);var i=_.countBy(n,function(e){return e.divider&&"divider"||"results"});e.search.total=i&&i.results||0}}).catch(l.onError("ERROR.WOT_LOOKUP_FAILED")))},e.doGetNewcomers=function(t,n,i){return t=t||0,n=n||10,n<10&&(n=10),e.hideActionsPopover(),e.search.loading=0===t,e.search.type="newcomers",t||i||e.updateLocationHref(),b.newcomers(t,n).then(function(i){return"newcomers"===e.search.type&&(e.doDisplayResult(i&&i.hits,t,n,i&&i.total),!0)}).catch(function(n){e.search.loading=!1,e.search.results=t>0?e.search.results:[],e.search.hasMore=!1,e.search.total=void 0,l.onError("ERROR.LOAD_NEWCOMERS_FAILED")(n)})},e.doGetPending=function(t,n,i){t=t||0,n=n||10,n<10&&(n=10),e.hideActionsPopover(),e.search.loading=0===t,e.search.type="pending";var a=u.data.initPhase?b.all:b.pending;return t||i||e.updateLocationHref(),a(t,n).then(function(i){return"pending"==e.search.type&&(e.doDisplayResult(i&&i.hits,t,n,i&&i.total),e.search.hasMore=!u.data.initPhase&&e.search.hasMore,!0)}).catch(function(n){e.search.loading=!1,e.search.results=t>0?e.search.results:[],e.search.total=void 0,e.search.hasMore=!1,l.onError("ERROR.LOAD_PENDING_FAILED")(n)})},e.doGetWallets=function(t,n,i){return t=t||0,n=n||10,n<10&&(n=10),e.hideActionsPopover(),e.search.loading=0===t,e.search.type="wallets",t||i||e.updateLocationHref(),E.children.all().then(function(i){if(!i||"wallets"!=e.search.type)return!1;var a=[E].concat(i).reduce(function(e,t,n){var i={id:n,pubkey:t.data.pubkey,uid:t.data.uid,name:t.data.localName||t.data.name,avatar:t.data.avatar};return e.concat(i)},[]);return e.doDisplayResult(a,t,n,a.length),e.search.hasMore=!1,!0})},e.showMore=function(){var t=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,("newcomers"==e.search.type?e.doGetNewcomers:e.doGetPending)(t).then(function(t){t&&(e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete"))}).catch(function(t){console.error(t),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})},e.select=function(e){var n=e.state;!n&&e.pubkey&&(n=E.isUserPubkey(e.pubkey)?"app.view_wallet":"app.wot_identity"),n&&(s.nextViewOptions({historyRoot:!1,disableAnimate:!1,expire:300}),t.go(n,e.stateParams||e))},e.next=function(){console.warn("Selected identities (should be override):",e.selection)},e.toggleCheck=function(t,n){var i=e.search.results[t];i.checked?e.addToSelection(i):e.removeSelection(i,n)},e.toggleSelect=function(e){e.selected=!e.selected},e.addToSelection=function(t){var n=angular.copy(t);n.name&&(n.name=n.name.replace("<em>","").replace("</em>","")),e.selection.push(n)},e.removeSelection=function(t,n){var i=_.findWhere(e.selection,{id:t.id});if(i&&e.selection.splice(e.selection.indexOf(i),1),!e.search.loading){var a=_.findWhere(e.search.results,{id:t.id});a&&a.checked&&(a.checked=!1)}},e.scanQrCode=function(){p.barcode.enable&&p.barcode.scan().then(function(t){t&&m.uri.parse(t).then(function(n){n.pubkey?e.search.text=n.pubkey:t.uid?e.search.text=n.uid:e.search.text=t,e.doSearch()})}).catch(l.onError("ERROR.SCAN_FAILED"))},e.showHelpTip=function(t){if(e.isLogin()&&!((t=angular.isDefined(t)?t:d.data.helptip.wotLookup)<0)){0===t&&(t=1);var n=e.createHelptipScope();if(n)return n.startWotLookupTour(t,!1).then(function(e){n.$destroy(),d.data.helptip.wotLookup=e,d.store()})}},e.doDisplayResult=function(t,n,i,a){t=t||[],e.allowMultiple&&t.length&&e.selection.length&&_.forEach(e.selection,function(e){var n=_.findWhere(t,{id:e.id});n&&(n.checked=!0)}),e.search.results=n?e.search.results.concat(t):t||[],e.search.total=angular.isDefined(a)?a:void 0,e.search.loading=!1,e.search.hasMore=e.search.results.length>=n+i,e.smallscreen=l.screen.isSmall(),e.search.results.length&&t.length>0&&e.motion&&e.motion.show({selector:".lookupForm .list .item",ink:!0})},e.showActionsPopover=function(t){l.popover.show(t,{templateUrl:"templates/wot/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function WotLookupModalController(e,t,n,i,a){"ngInject";angular.extend(this,t("WotLookupCtrl",{$scope:e})),a=a||{},e.search.loading=!1,e.enableFilter=!!angular.isDefined(a.enableFilter)&&a.enableFilter,e.enableWallets=!!angular.isDefined(a.enableWallets)&&(i.isLogin()&&i.children.count()&&a.enableWallets),e.allowMultiple=!!angular.isDefined(a.allowMultiple)&&a.allowMultiple,e.parameters=a,e.showResultLabel=!1,e.wotSearchTextId="wotSearchTextModal",e.allowMultiple&&a.selection&&(e.selection=a.selection);var o=e.enter;e.enter=function(t){e.parameters&&e.parameters.q&&(e.search.text=e.parameters.q,e.parameters.q.trim().length>2&&o(t))},e.$on("modal.shown",e.enter),e.cancel=function(){e.closeModal()},e.select=function(t){e.closeModal({pubkey:t.pubkey,uid:t.uid,name:t.name&&t.name.replace(/<\/?em>/gi,"")})},e.next=function(){e.closeModal(e.selection)},e.updateLocationHref=function(){},e.showHelpTip=function(){}}function WotIdentityAbstractController(e,t,n,i,a,o,r,s,l,c,u,d,p){"ngInject";e.formData={hasSelf:!0},e.disableCertifyButton=!0,e.loading=!0,e.$on("$ionicView.beforeEnter",function(e,t){t.enableBack=!!r.screen.isSmall()||t.enableBack}),e.load=function(t,n,i){return d.load(t,n,i).then(function(n){if(!n)return r.onError("ERROR.IDENTITY_NOT_FOUND")().then(e.showHome);e.formData=n;var i=p.isLogin();e.revoked=n.requirements&&(n.requirements.revoked||n.requirements.pendingRevocation),e.canCertify=n.hasSelf&&!e.revoked&&(!i||!p.isUserPubkey(t)||p.children.count()>0),e.canSelectAndCertify=n.hasSelf&&(p.isUserPubkey(t)||p.children.hasPubkey(t));var a=i&&_.find((n.received_cert||[]).concat(n.received_cert_pending||[]),function(e){return e.pubkey===p.data.pubkey&&e.valid&&e.expiresIn>c.data.timeWarningExpire});e.alreadyCertified=!(!e.canCertify||!i||p.children.count()>0)&&!!a,e.disableCertifyButton=e.alreadyCertified||e.revoked,e.loading=!1}).catch(function(t){e.loading=!1,r.onError("ERROR.LOAD_IDENTITY_FAILED")(t)})},e.doUpdate=function(t){t||(e.loading=!0,r.loading.show());var n={cache:!1,blockUid:e.formData.blockUid||void 0};return e.load(e.formData.pubkey,e.formData.uid,n).then(r.loading.hide)},e.certify=function(){return(p.children.count()?s.showSelectWallet({displayBalance:!1}):o.when(p)).then(function(t){if(t)return t.auth({minData:!0}).then(function(n){if(r.loading.hide(),!u.data.initPhase&&!n.isMember)return void r.alert.error(n.requirements.needSelf?"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY":"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF");if(!u.data.initPhase&&!e.formData.hasSelf)return void r.alert.error("ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF");if(e.formData.requirements.expired)return void r.alert.error("ERROR.IDENTITY_EXPIRED");var a=_.find(e.formData.received_cert,function(e){return e.pubkey===t.data.pubkey&&e.valid&&e.expiresIn>c.data.timeWarningExpire});return a?void i("ERROR.IDENTITY_ALREADY_CERTIFY",a).then(function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")}):(a=_.findWhere(e.formData.received_cert_pending,{pubkey:t.data.pubkey,valid:!0}))?void i("ERROR.IDENTITY_ALREADY_CERTIFY_PENDING",a).then(function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")}):void r.alert.confirm("CONFIRM.CERTIFY_RULES","CONFIRM.POPUP_SECURITY_WARNING_TITLE",{cssClass:"warning",okText:"WOT.BTN_YES_CERTIFY",okType:"button-assertive"}).then(function(n){n&&(r.loading.show(),t.certify(e.formData.uid,e.formData.pubkey,e.formData.blockUid||e.formData.requirements&&e.formData.requirements.meta&&e.formData.requirements.meta.timestamp,e.formData.requirements&&e.formData.requirements.meta&&e.formData.requirements.meta.sig,e.formData.isMember,e.formData.wasMember).then(function(n){r.loading.hide(),n&&(e.prepareNewCert(t,n),e.alreadyCertified=!0,r.toast.show("INFO.CERTIFICATION_DONE"),e.formData.received_cert_pending.unshift(n),e.formData.requirements.pendingCertificationCount++,e.doMotion())}).catch(r.onError("ERROR.SEND_CERTIFICATION_FAILED")))})}).catch(function(e){"CANCELLED"!==e&&r.onError("ERROR.LOGIN_FAILED")(e)})})},e.selectAndCertify=function(){return(p.children.count()?s.showSelectWallet({displayBalance:!1}):o.when(p)).then(function(t){return t.auth({minData:!0}).then(function(e){return u.data.initPhase||e.isMember?(r.loading.hide(),s.showWotLookup()):void r.alert.error(e.requirements.needSelf||e.requirements.needMembership?"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY":"ERROR.NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF")}).then(function(e){if(e&&e.pubkey){if(!e.uid)return void r.alert.error("ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF");r.loading.show();var t={cache:!1,blockUid:e.blockUid};return d.load(e.pubkey,e.uid,t)}}).then(function(n){if(n){if(r.loading.hide(),!n||!n.hasSelf)return void r.alert.error("ERROR.IDENTITY_TO_CERTIFY_HAS_NO_SELF");if(n.requirements.expired)return void r.alert.error("ERROR.IDENTITY_EXPIRED");var a=_.findWhere(n.received_cert,{pubkey:t.data.pubkey,valid:!0});if(a)return void i("ERROR.IDENTITY_ALREADY_CERTIFY",a).then(function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")});if(a=_.findWhere(n.received_cert_pending,{pubkey:t.data.pubkey,valid:!0}))return void i("ERROR.IDENTITY_ALREADY_CERTIFY_PENDING",a).then(function(e){r.alert.error(e,"ERROR.UNABLE_TO_CERTIFY_TITLE")});i("CONFIRM.CERTIFY_RULES_TITLE_UID",{uid:n.uid}).then(function(e){return r.alert.confirm("CONFIRM.CERTIFY_RULES",e)}).then(function(i){i&&(r.loading.show(),t.certify(n.uid,n.pubkey,n.blockUid||n.requirements&&n.requirements.meta&&n.requirements.meta.timestamp,n.requirements&&n.requirements.meta&&n.requirements.meta.sig,n.isMember,n.wasMember).then(function(t){if(r.loading.hide(),t)return d.extendAll([t],"pubkey").then(function(){r.toast.show("INFO.CERTIFICATION_DONE"),e.formData.given_cert_pending.unshift(t),e.doMotion()})}).catch(r.onError("ERROR.SEND_CERTIFICATION_FAILED")))})}}).catch(function(e){"CANCELLED"!==e&&r.onError("ERROR.LOAD_IDENTITY_FAILED")(e)})})},e.prepareNewCert=function(e,t){t.uid=e.data.uid,t.pubkey=e.data.pubkey,t.isMember=e.data.isMember,t.avatar=e.data.avatar,t.name=e.data.name},e.removeActionParamInLocationHref=function(e){if(e&&e.stateParams&&e.stateParams.action){var t=angular.copy(e.stateParams);t.action=null,a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),n.go(e.stateName,t,{reload:!1,inherit:!0,notify:!1})}},e.doAction=function(t,n){if("certify"==t)return e.certify();"transfer"==t&&e.showTransferModal(n)},e.showCertifications=function(){var t=e.formData.requirements&&e.formData.requirements.alternatives&&e.formData.blockUid||void 0;r.screen.isSmall()?n.go("app.wot_cert",{pubkey:e.formData.pubkey,uid:e.formData.uid,type:"received",block:t}):n.go("app.wot_cert_lg",{pubkey:e.formData.pubkey,uid:e.formData.uid,block:t})},e.showGivenCertifications=function(){var t=e.formData.requirements&&e.formData.requirements.alternatives&&e.formData.blockUid||void 0;r.screen.isSmall()?n.go("app.wot_cert",{pubkey:e.formData.pubkey,uid:e.formData.uid,type:"given",block:t}):n.go("app.wot_cert_lg",{pubkey:e.formData.pubkey,uid:e.formData.uid,block:t})},e.showSharePopover=function(i){var a=e.formData.name||e.formData.uid||e.formData.pubkey,o=(l.shareBaseUrl||t.rootPath)+n.href("app.wot_identity",{pubkey:e.formData.pubkey,uid:e.formData.uid});r.screen.isSmall()&&(i=angular.element(document.querySelector("#wot-share-anchor-"+e.formData.pubkey))||i),r.popover.share(i,{bindings:{url:o,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:a},postMessage:a}})}}function WotIdentityViewController(e,t,n,i,a,o,r,s){"ngInject";angular.extend(this,n("WotIdentityAbstractCtrl",{$scope:e})),e.motion=o.motion.fadeSlideInRight,e.qrcodeId="qrcode-wot-"+e.$id,e.$on("$ionicView.enter",function(t,n){var a=function(){e.doMotion(),n.stateParams&&n.stateParams.action&&(i(function(){e.doAction(n.stateParams.action.trim())},100),e.removeActionParamInLocationHref(n)),e.showQRCode()},o={cache:!0,blockUid:n.stateParams&&n.stateParams.block||void 0};if(n.stateParams&&n.stateParams.pubkey&&n.stateParams.pubkey.trim().length>0){if(e.loading)return e.load(n.stateParams.pubkey.trim(),n.stateParams.uid,o).then(a)}else if(n.stateParams&&n.stateParams.uid&&n.stateParams.uid.trim().length>0){if(e.loading)return e.load(null,n.stateParams.uid,o).then(a)}else e.showHome()}),e.doMotion=function(){e.motion.show({selector:".view-identity .list .item"}),e.showFab("fab-transfer"),(e.canCertify&&!e.alreadyCertified||t.tour)&&e.showFab("fab-certify-"+e.formData.uid),e.$broadcast("$csExtension.motion")},e.doQuickFix=function(t){if("showSelectIdentities"===t)return e.showSelectIdentities()},e.showSelectIdentities=function(){if(e.formData.requirements&&e.formData.requirements.alternatives)return r.showSelectPubkeyIdentity({identities:[e.formData.requirements].concat(e.formData.requirements.alternatives)}).then(function(e){if(e&&e.pubkey)return a.go("app.wot_identity",{pubkey:e.pubkey,uid:e.uid,block:e.meta&&e.meta.timestamp||e.blockUid})})},e.showQRCode=function(t){e.qrcode?(e.qrcode.clear(),e.qrcode.makeCode(e.formData.pubkey),o.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100)):(e.qrcode=new QRCode(e.qrcodeId,{text:e.formData.pubkey,width:180,height:180,correctLevel:QRCode.CorrectLevel.L}),o.motion.toggleOn({selector:"#"+e.qrcodeId},t||1100))},e.hideQRCode=function(){e.qrcode&&(e.qrcode.clear(),o.motion.toggleOff({selector:"#"+e.qrcodeId}))}}function WotIdentityTxViewController(e,t,n,i,a,o,r,s){"ngInject";e.formData={},e.loading=!0,e.motion=s.motion.fadeSlideInRight,e.$on("$ionicView.enter",function(t,n){e.loading?(e.pubkey=n.stateParams.pubkey,e.uid=n.stateParams.uid,e.load()):e.updateView()}),e.load=function(t){return n.all([o.extend({pubkey:e.pubkey}),r.load(e.pubkey,t)]).then(function(t){e.formData=angular.merge(t[0],t[1]),e.loading=!1,e.updateView()})},e.doUpdate=function(t){return console.debug("[wot] TX history reloading..."),e.formData={},(t?e.load():s.loading.show().then(e.load).then(s.loading.hide)).then(e.updateView).catch(s.onError("ERROR.IDENTITY_TX_FAILED"))},e.updateView=function(){e.$broadcast("$$rebind::balance"),e.$broadcast("$$rebind::rebind"),e.motion.show()},e.downloadHistoryFile=function(t){t=t||{},t.fromTime=t.fromTime||-1,r.downloadHistoryFile(e.pubkey,t)},e.showMoreTx=function(n){return n=n||e.formData.tx.fromTime-a.data.walletHistoryTimeSecond||moment().utc().unix()-2*a.data.walletHistoryTimeSecond,s.loading.show(),r.load(e.pubkey,n).then(function(t){angular.merge(e.formData,t),e.updateView(),s.loading.hide()}).catch(function(a){a.ucode==i.errorCodes.HTTP_LIMITATION?t(function(){return e.showMoreTx(n)},2e3):s.onError("ERROR.IDENTITY_TX_FAILED")(a)})}}function WotCertificationsViewController(e,t,n,i,a,o){"ngInject";var r;angular.extend(this,n("WotIdentityAbstractCtrl",{$scope:e})),e.motions={receivedCertifications:angular.copy(o.motion.fadeSlideIn),givenCertifications:angular.copy(o.motion.fadeSlideInRight),avatar:angular.copy(o.motion.fadeIn)},e.motions.receivedCertifications.enable=!0,e.motions.givenCertifications.enable=!0,e.motions.avatar.enable=!0,e.$on("$ionicView.enter",function(t,n){if(n.stateParams&&n.stateParams.type&&(e.motions.receivedCertifications.enable="given"!=n.stateParams.type,e.motions.givenCertifications.enable="given"==n.stateParams.type,e.motions.avatar.enable=!1),e.loading){var i={cache:!0,blockUid:n.stateParams&&n.stateParams.block||void 0};return n.stateParams&&n.stateParams.pubkey&&n.stateParams.pubkey.trim().length>0?e.load(n.stateParams.pubkey.trim(),n.stateParams.uid,i).then(function(){e.doMotion(),e.showHelpTip()}):(r=n.stateParams&&n.stateParams.id?a.children.get(n.stateParams.id):a,r?r.isLogin()?e.load(r.data.pubkey,r.data.uid,i).then(function(){e.doMotion(),e.showHelpTip()}):e.showHome():(o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome()))}e.doMotion()}),e.$on("$ionicView.leave",function(){e.loading=!0}),e.doUpdate=function(){var t={cache:!1,blockUid:e.formData.blockUid||void 0};return e.load(e.formData.pubkey,e.formData.uid,t).then(function(){e.doMotion(),e.showHelpTip()})},e.doMotion=function(t){e.doMotionReceivedCertifications(0,t),e.motions.avatar.enable&&e.motions.avatar.show({selector:".col-avatar ."+e.motions.avatar.ionListClass}),e.doMotionGivenCertifications(e.motions.receivedCertifications.enable?100:10,t)},e.doMotionReceivedCertifications=function(n,i){e.motions.receivedCertifications.enable?(i||e.motions.receivedCertifications.show({selector:".list.certifications .item",timeout:n}),(e.canCertify&&!e.alreadyCertified||t.tour)&&e.showFab("fab-certify",n)):(e.canCertify||t.tour)&&e.hideFab("fab-certify",0)},e.doMotionGivenCertifications=function(n,i){e.motions.givenCertifications.enable?(i||e.motions.givenCertifications.show({selector:".list.given-certifications .item",timeout:n}),(e.canSelectAndCertify||t.tour)&&e.showFab("fab-select-certify")):(e.canSelectAndCertify||t.tour)&&e.hideFab("fab-select-certify",0)},e.showHelpTip=function(){if(e.isLogin()&&i.data.helptip.enable){var t=e.createHelptipScope();if(t){var n=a.isUserPubkey(e.formData.pubkey),o=n?i.data.helptip.walletCerts:i.data.helptip.wotCerts;if(!(o<0)){return(n?t.startWalletCertTour(o,!1):t.startWotCertTour(o,!1)).then(function(e){t.$destroy(),n?i.data.helptip.walletCerts=e:i.data.helptip.wotCerts=e,i.store()})}}}}}function WotSelectPubkeyIdentityModalController(e,t,n,i){e.loading=!0,e.load=function(){return i&&i.identities?(e.identities=i.identities,e.pubkey=e.identities[0].pubkey,e.loading=!1,t.when()):(e.pubkey=i&&i.pubkey,pubkey?n.loadRequirements({pubkey:pubkey,uid:uid}).then(function(t){t&&t.requirements&&(e.identities=t.requirements,t.requirements.alternatives?e.identities=[t.requirements].concat(t.requirements.alternatives):e.identities=[t.requirements]),e.loading=!1}):t.reject("Missing parameters: [pubkey] or [identities]"))},e.$on("modal.shown",e.load)}function NetworkLookupController(e,t,n,i,a,o,r,s,l,c,u,d,p){"ngInject";e.networkStarted=!1,e.ionItemClass="",e.expertMode=c.data.expertMode&&!s.screen.isSmall(),e.isHttps="https:"===a.location.protocol,e.search={text:"",loading:!0,type:void 0,results:[],endpoint:null,bma:void 0,ssl:void 0,ws2p:void 0,sort:void 0,asc:!0},e.compactMode=!0,e.listeners=[],e.helptipPrefix="helptip-network",e.enableLocationHref=!0,e.removeListeners=function(){e.listeners.length&&(console.debug("[network] Closing listeners"),_.forEach(e.listeners,function(e){e()}),e.listeners=[])},e.enter=function(t,n){e.networkStarted||(e.networkStarted=!0,e.search.loading=!0,u.get().then(function(t){t&&(e.node=r.node.same(t.node.host,t.node.port)?r:r.instance(t.node.host,t.node.port),n&&n.stateParams&&(n.stateParams.type&&-1!=["mirror","member","offline"].indexOf(n.stateParams.type)&&(e.search.type=n.stateParams.type),n.stateParams.expert&&(e.expertMode="true"==n.stateParams.expert)),e.load())}).catch(function(t){s.onError("ERROR.GET_CURRENCY_FAILED")(t),e.networkStarted=!1}))},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.networkStarted&&(e.removeListeners(),d.close(),e.networkStarted=!1,e.search.loading=!0)},e.$on("$ionicView.beforeLeave",e.leave),e.$on("$ionicParentView.beforeLeave",e.leave),e.$on("$destroy",e.leave),e.computeOptions=function(){return{filter:{member:!e.search.type||"member"===e.search.type,mirror:!e.search.type||"mirror"===e.search.type,endpoint:angular.isDefined(e.search.endpoint)?e.search.endpoint:null,bma:e.search.bma,ssl:e.search.ssl,ws2p:e.search.ws2p,online:!(e.search.type&&"offline"===e.search.type)},sort:{type:e.search.sort,asc:e.search.asc},expertMode:e.expertMode,timeout:l.timeout&&(e.expertMode?l.timeout/10:l.timeout/100)}},e.load=function(){e.search.loading&&(d.start(e.node,e.computeOptions()),e.refreshing=!1,e.listeners.push(d.api.data.on.changed(e,function(t){e.refreshing||(e.refreshing=!0,p.extendAll(t.peers).then(function(){e.networkStarted&&e.updateView(t),e.refreshing=!1}))}))),e.showHelpTip()},e.updateView=function(t){console.debug("[peers] Updating UI"),e.$broadcast("$$rebind::rebind"),e.search.results=t.peers,e.search.memberPeersCount=t.memberPeersCount,e.search.loading=!e.networkStarted||d.isBusy(),e.loading||e.$broadcast("$$rebind::rebind"),e.motion&&e.search.results&&e.search.results.length>0&&e.motion.show({selector:".item-peer"})},e.refresh=function(){e.search.loading=!0,d.loadPeers()},e.sort=function(){e.search.loading=!0,e.refreshing=!0,d.sort(e.computeOptions()),e.updateView(d.data)},e.toggleSearchType=function(t){e.hideActionsPopover(),e.search.type===t||"none"===t?e.search.type=void 0:e.search.type=t,d.close(),e.search.loading=!0,e.load(),e.enableLocationHref&&n.search({type:e.search.type}).replace()},e.toggleSearchEndpoint=function(t){e.hideActionsPopover(),e.search.endpoint===t||null===t?e.search.endpoint=null:e.search.endpoint=t,e.sort()},e.toggleSort=function(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(e.search.asc=void 0,e.search.sort=void 0),e.sort()},e.toggleCompactMode=function(){e.compactMode=!e.compactMode,e.$broadcast("$$rebind::rebind")},e.selectPeer=function(n){if(n.compacted&&e.compactMode)return void e.toggleCompactMode();if(n.online&&n.hasBma()){var i={server:n.getServer()};n.isSsl()&&(i.ssl=!0),n.isTor()&&(i.tor=!0),t.go("app.view_peer",i)}},e.$on("csView.action.refresh",function(t,n){"peers"===n&&e.refresh()}),e.$on("csView.action.showActionsPopover",function(t,n){e.showActionsPopover(n)}),e.showActionsPopover=function(t){s.popover.show(t,{templateUrl:"templates/network/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showEndpointsPopover=function(e,t,n){e.preventDefault(),e.stopPropagation();var i=t.getEndpoints(n);i=(i||[]).reduce(function(e,i){var a=r.node.parseEndPoint(i)||r.node.parseEndPoint(i,n);return e.concat({label:"NETWORK.VIEW.NODE_ADDRESS",value:t.getServer(a)+(a&&a.path||"")})},[]),i.length&&s.popover.show(e,{
 templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS."+n,items:i}})},e.showWs2pPopover=function(e,t){return e.stopPropagation(),o("NETWORK.VIEW.PRIVATE_ACCESS").then(function(n){s.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS.WS2P",valueKey:"NETWORK.VIEW.NODE_ADDRESS",items:[{label:"NETWORK.VIEW.NODE_ADDRESS",value:t.bma.private?n:t.getServer()+(t.bma.path||"")},{label:"NETWORK.VIEW.WS2PID",value:t.bma.ws2pid},{label:"NETWORK.VIEW.POW_PREFIX",value:t.powPrefix}]}})})},e.showHelpTip=function(t,n){if(t=angular.isDefined(t)?t:c.data.helptip.network,n=!!angular.isDefined(n)&&n,!(t<0)){var i=e.createHelptipScope();if(i)return i.tour=n,i.startNetworkTour(t,!1).then(function(e){i.$destroy(),n||(c.data.helptip.network=e,c.store())})}}}function NetworkLookupModalController(e,t,n){"ngInject";angular.extend(this,t("NetworkLookupCtrl",{$scope:e})),n=n||{},e.enableFilter=!angular.isDefined(n.enableFilter)||n.enableFilter,e.search.type=angular.isDefined(n.type)?n.type:e.search.type,e.search.endpoint=angular.isDefined(n.endpoint)?n.endpoint:e.search.endpoint,e.search.bma=angular.isDefined(n.bma)?n.bma:e.search.bma,e.search.ssl=angular.isDefined(n.ssl)?n.ssl:e.search.ssl,e.search.ws2p=angular.isDefined(n.ws2p)?n.ws2p:e.search.ws2p,e.expertMode=angular.isDefined(n.expertMode)?n.expertMode:e.expertMode,e.ionItemClass=n.ionItemClass||"item-border-large",e.enableLocationHref=!1,e.helptipPrefix="",e.selectPeer=function(t){e.closeModal(t)},e.$on("modal.hidden",function(){e.leave()}),e.showHelpTip=function(){},e.enter()}function NetworkLookupPopoverController(e,t){"ngInject";angular.extend(this,t("NetworkLookupCtrl",{$scope:e}));var n=n||{};e.enableFilter=!angular.isDefined(n.enableFilter)||n.enableFilter,e.search.type=angular.isDefined(n.type)?n.type:e.search.type,e.search.endpoint=angular.isDefined(n.endpoint)?n.endpoint:e.search.endpoint,e.expertMode=angular.isDefined(n.expertMode)?n.expertMode:e.expertMode,e.ionItemClass=n.ionItemClass||"item-border-large",e.helptipPrefix="",e.selectPeer=function(t){e.closePopover(t)},e.$on("popover.hidden",function(){e.leave()}),e.showHelpTip=function(){},e.enter()}function PeerInfoPopoverController(e,t,n,i,a,o){"ngInject";e.loading=!0,e.formData={},e.load=function(){return e.loading=!0,e.formData={},t.all([i.blockchain.current().then(function(t){e.formData.number=t.number,e.formData.medianTime=t.medianTime,e.formData.powMin=t.powMin,e.formData.useSsl=o.useSsl}).catch(function(){delete e.formData.number,delete e.formData.medianTime,delete e.formData.powMin,delete e.formData.useSsl}),o.node.summary().then(function(t){e.formData.version=t&&t.duniter&&t.duniter.version,e.formData.software=t&&t.duniter&&t.duniter.software}).catch(function(){delete e.formData.version,delete e.formData.software}),o.version.latest().then(function(t){e.formData.latestRelease=t}).catch(function(){delete e.formData.latestRelease})]).then(function(){if(e.formData.latestRelease&&"duniter"==e.formData.software){var t=a.version.compare(e.formData.version,e.formData.latestRelease.version);e.formData.isPreRelease=t>0,e.formData.hasNewRelease=t<0}else e.formData.isPreRelease=!1,e.formData.hasNewRelease=!1;e.loading=!1,e.$broadcast("$$rebind::rebind")})},i.api.data.on.newBlock(e,function(t){e.loading||(console.debug("[peer info] Received new block. Reload content"),e.load())}),n.api.data.on.changed(e,function(t){e.loading||(console.debug("[peer info] Peer settings changed. Reload content"),e.load())}),e.load()}function PeerViewController(e,t,n,i,a,o,r){"ngInject";e.node={},e.loading=!0,e.isHttps="https:"===n.location.protocol,e.isReachable=!0,e.$on("$ionicView.beforeEnter",function(e,t){t.enableBack=!!a.screen.isSmall()||t.enableBack}),e.$on("$ionicView.enter",function(t,n){var i=!n.stateParams||!n.stateParams.server,a=n.stateParams&&n.stateParams.server||r.server,o=n.stateParams&&"true"==n.stateParams.ssl||!!i&&r.useSsl,s="true"==n.stateParams.tor||!!i&&r.useTor;return e.load(a,o,s).then(function(){return e.$broadcast("$csExtension.enter",t,n)}).then(function(){e.loading=!1}).catch(function(){e.loading=!1})}),e.load=function(n,i,s){var l={server:n,host:n,useSsl:i,useTor:s},c=n.split(":");return 2==c.length&&(l.host=c[0],l.port=c[1]),angular.merge(e.node,s?r.lightInstance(l.host+".to",443,!0,6e4):r.lightInstance(l.host,l.port,l.useSsl),l),e.isReachable=!e.isHttps||i,e.isReachable?t.all([e.node.network.peering.self().then(function(t){e.node.pubkey=t.pubkey,e.node.currency=t.currency}).catch(function(e){console.error(e&&e.message||e)}),e.node.network.peers().then(function(t){var n=(t&&t.peers||[]).map(function(e){var t=new Peer(e);return t.online="UP"===e.status,t.buid=t.block,t.blockNumber=t.buid&&t.buid.split("-")[0],t.dns=t.getDns(),t.id=t.keyID(),t.server=t.getServer(),t});return o.extendAll([e.node].concat(n)).then(function(){e.peers=_.sortBy(n,function(e){var t=1;return t+=1e4*(e.online?1:0),t+=1e3*(e.hasMainConsensusBlock?1:0),-(t+=100*(e.uid?1:0))}),e.motion.show({selector:".item-peer"})})}),e.node.blockchain.current().then(function(t){e.current=t})]).catch(function(e){throw console.error(e&&e.message||e),a.onError(s?"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR":"PEER.VIEW.ERROR.LOADING_NODE_ERROR")(e),e}):r.network.peers().then(function(t){var n=(t&&t.peers||[]).reduce(function(e,t){var n=new Peer(t);return(n.getEndpoints("BASIC_MERKLED_API")||[]).reduce(function(e,t){var i=r.node.parseEndPoint(t);return i.dns!=l.host&&i.ipv4!=l.host&&i.ipv6!=l.host||i.port!=l.port?e:(n.bma=i,e.concat(n))},e)},[]),i=n.length&&n[0];if(i)return e.node.pubkey=i.pubkey,e.node.currency=i.currency,o.extend(e.node);console.warn("Could not get peer from /network/peers")})},e.selectPeer=function(e){if(e.online&&!e.isWs2p()){var t={server:e.getServer()};e.isSsl()&&(t.ssl=!0),e.isTor()&&(t.tor=!0),i.go("app.view_peer",t)}},e.openRawPeering=function(t){return e.openLink(t,e.node.url+"/network/peering")},e.openRawCurrentBlock=function(t){return e.openLink(t,e.node.url+"/blockchain/current")}}function CurrencyViewController(e,t,n,i,a,o,r,s,l,c,u){"ngInject";e.formData={useRelative:!1,currency:"",M:0,MoverN:0,UD:0,cactual:0,c:0,dt:0,sigQty:0,sigStock:0,msWindow:0,msValidity:0,sigWindow:0,sigValidity:0,sigPeriod:0,medianTime:0,difficulty:0,Nprev:0,stepMax:0,sentries:0,xpercent:0,durationFromLastUD:0,blockUid:null,dtReeval:0,udReevalTime0:0,allRules:angular.isDefined(s.data.currency&&s.data.currency.allRules)?s.data.currency.allRules:s.data.expertMode,allWotRules:angular.isDefined(s.data.currency&&s.data.currency.allWotRules)?s.data.currency.allWotRules:s.data.expertMode,licenseUrl:s.getLicenseUrl()},e.loading=!0,e.screen=r.screen,e.enter=function(t,i){e.loading&&(e.formData.useRelative=s.data.useRelative,l.get().then(e.load).then(function(){e.isLogin()&&e.showHelpTip()}).catch(r.onError("ERROR.GET_CURRENCY_FAILED")),c.api.data.on.mainBlockChanged(e,function(t){e.loading||e.formData.blockUid!==t.buid&&(console.debug("[currency] Updating parameters UI (new main block detected)"),n(e.load,1e3))})),e.$broadcast("$csExtension.enter",i)},e.$on("$ionicView.enter",e.enter),e.load=function(){var n,i,a={},s=Date.now();return t.all([o.blockchain.parameters().then(function(e){a.currency=e.currency,a.c=e.c,a.dt=e.dt,a.sigQty=e.sigQty,a.sigStock=e.sigStock,a.msWindow=e.msWindow,a.msValidity=e.msValidity,a.sigWindow=e.sigWindow,a.sigValidity=e.sigValidity,a.sigPeriod=e.sigPeriod,a.stepMax=e.stepMax,a.xpercent=e.xpercent,a.avgGenTime=e.avgGenTime,a.dtReeval=e.dtReeval,a.udTime0=e.udTime0,a.udReevalTime0=e.udReevalTime0,a.dtReeval||(a.dtReeval=a.dt)}),o.blockchain.current().then(function(e){n=e.monetaryMass,a.N=e.membersCount,a.medianTime=e.medianTime,a.difficulty=e.powMin,a.blockUid=[e.number,e.hash].join("-")}).catch(function(e){if(e&&e.ucode==o.errorCodes.NO_CURRENT_BLOCK)return n=0,a.N=0,a.medianTime=moment().utc().unix(),a.difficulty=0,void(a.blockUid=null);throw e}),o.blockchain.stats.ud().then(function(e){if(e.result.blocks.length){var t=e.result.blocks[e.result.blocks.length-1];return o.blockchain.block({block:t}).then(function(e){a.currentUD=e.unitbase>0?e.dividend*Math.pow(10,e.unitbase):e.dividend,i=e.medianTime,a.Nprev=e.membersCount})}return i=0,a.Nprev=0,o.blockchain.parameters().then(function(e){a.currentUD=e.ud0})})]).then(function(){var t=n-a.currentUD*a.Nprev,o=a.Nprev?t/a.Nprev:0;return a.cactual=o?100*a.currentUD/o:0,a.M=n,a.MoverN=a.Nprev?(t||n)/a.Nprev:0,a.UD=a.currentUD,a.durationFromLastUD=i?a.medianTime-i:0,a.sentries=Math.ceil(Math.pow(a.N,1/a.stepMax)),angular.extend(e.formData,a),console.debug("[currency] Parameters loaded in "+(Date.now()-s)+"ms"),e.loading=!1,e.$broadcast("$$rebind::rebind"),r.ink(),r.loading.hide()}).catch(function(t){e.loading=!1,r.onError("ERROR.LOAD_PEER_DATA_FAILED")(t)})},e.refresh=function(){if(!e.loading)return e.loading=!0,r.loading.show(),e.load().then(function(){e.$broadcast("csView.action.refresh","currency")})},e.refreshPeers=function(){return e.$broadcast("csView.action.refresh","peers"),t.when()},e.showExtendActionsPopover=function(t){e.$broadcast("csView.action.showActionsPopover",t)},e.onAllRulesChange=function(){s.data.currency=s.data.currency||{},s.data.currency.allRules!==e.formData.allRules&&(s.data.currency.allRules=e.formData.allRules,s.store())},e.$watch("formData.allRules",e.onAllRulesChange),e.onAllWotRulesChange=function(){s.data.currency=s.data.currency||{},s.data.currency.allWotRules!==e.formData.allWotRules&&(s.data.currency.allWotRules=e.formData.allWotRules,s.store())},e.$watch("formData.allWotRules",e.onAllWotRulesChange),e.startCurrencyTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(t,n){if(t=angular.isDefined(t)?t:s.data.helptip.currency,n=!!angular.isDefined(n)&&n,!(t<0)){var i=e.createHelptipScope(n);if(i)return i.tour=n,i.startCurrencyTour(t,!1).then(function(e){i.$destroy(),s.data.helptip.currency=e,s.store()})}},e.showLicenseModal=function(){return u.show("templates/currency/modal_license.html","CurrencyLicenseModalCtrl")},e.showHelpModal=function(e){a.showHelp({anchor:e})},e.showActionsPopover=function(t){r.popover.show(t,{templateUrl:"templates/currency/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function CurrencyLicenseModalController(e,t,n,i,a){"ngInject";e.loading=!0,e.load=function(){e.loading&&(e.licenseUrl=i.getLicenseUrl(),e.licenseUrl&&".txt"!=e.licenseUrl.substring(e.licenseUrl.length-3)&&(e.licenseUrlHtml=e.licenseUrl+".html",e.licenseUrl=e.licenseUrl+".txt"),e.loading=!1)},e.$on("modal.shown",e.load),e.downloadFile=function(){if(e.licenseUrl)return t.get(e.licenseUrl).success(function(e){var t=new Blob([e],{type:"text/plain; charset=utf-8"});a.saveAs(t,"license.txt")}).error(function(){n.onError("ERROR.GET_LICENSE_FILE_FAILED")()})}}function TransferController(e,t,n){"ngInject";angular.extend(this,t("TransferModalCtrl",{$scope:e,parameters:{}})),e.enter=function(t,i){return i&&i.stateParams&&e.setParameters(i.stateParams),e.load().then(n.loading.hide)},e.$on("$ionicView.enter",e.enter),e.setForm=function(t){e.form=t},e.closeModal=function(){return e.showHome()}}function TransferModalController(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E){"ngInject";var b;e.convertedBalance=0,e.formData={destPub:null,amount:null,comment:null,useRelative:m.data.useRelative,useComment:!1,all:!1,restPub:null,restAmount:null,walletId:null},e.udAmount=null,e.minAmount=.01,e.commentPattern=s.regexp.COMMENT,e.currency=p.data.name,e.loading=!0,e.commentInputId="transferComment-"+e.$id,e.enableSelectWallet=!0,e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:l.screen.isSmall(),(e.smallscreen||r.enable)&&(e.digitKeyboardSettings=e.digitKeyboardSettings||r.keyboard.digit.settings.bindModel(e,"formData.amount",{decimal:!0,decimalSeparator:".",resizeContent:!1}),e.digitKeyboardVisible=!1),e.setParameters=function(t){t&&(t.pubkey&&(e.formData.destPub=t.pubkey),t.uid?(e.destUid=t.uid,e.destPub=""):(e.destUid="",e.destPub=t.pubkey),t.amount?(e.formData.amount=t.amount,e.formData.useRelative=!1):t.udAmount&&(e.formData.amount=t.udAmount,e.formData.useRelative=!0),t.comment&&(e.formData.useComment=!0,e.formData.comment=t.comment),t.restPub||t.all?(e.restUid="",e.restPub=t.restPub,e.formData.restPub=t.restPub,e.formData.all=!0):e.formData.all=!1,t.wallet&&"default"!==t.wallet?e.formData.walletId=t.wallet:e.formData.walletId=u.id)},e.setParameters(E),e.load=function(){return e.enableSelectWallet=u.children.count()>0,b=e.enableSelectWallet&&(e.formData.walletId?u.children.get(e.formData.walletId):u)||u,b.isDefault()||console.debug("[transfer] Using wallet {"+b.id+"}"),b.login({sources:!0,silent:!0}).then(function(t){if(b&&!e.$$destroyed){if(e.walletData=t,e.formData.walletId=b.id,e.onUseRelativeChanged(),e.onAmountChanged(),e.$watch("walletData.balance",e.onAmountChanged,!0),e.$watch("formData.amount",e.onAmountChanged,!0),e.$watch("formData.useRelative",e.onUseRelativeChanged,!0),e.$watch("walletData.balance",e.onUseRelativeChanged,!0),l.ink({selector:".modal-transfer .ink"}),e.destPub&&!e.destUid)return d.extend({pubkey:e.destPub}).then(function(t){e.destUid=t&&(t.name||t.uid),e.destUid&&(e.destPub=""),e.loading=!1});e.loading=!1}}).catch(function(t){if("CANCELLED"===t)return e.cancel();l.onError("ERROR.LOGIN_FAILED")(t)})},e.$on("modal.shown",e.load),e.cancel=function(){e.closeModal(),b=null},e.onUseRelativeChanged=function(){e.currency=p.data.name,e.formData.useRelative?(e.convertedBalance=e.walletData.balance/p.data.currentUD,e.minAmount=.01/(p.data.currentUD/100)):(e.convertedBalance=e.walletData.balance/100,e.minAmount=.01),e.form&&!e.loading&&e.form.$setPristine(!0)},e.onAmountChanged=function(){if(!e.sending){var t=e.formData.amount;t&&"string"==typeof t&&(t=parseFloat(t.replace(new RegExp("[.,]"),".")));var n=!0;t&&t<e.minAmount?(n=!1,e.form.amount.$error=e.form.amount.$error||{},e.form.amount.$error.min=!0):e.form.amount&&e.form.amount.$error&&e.form.amount.$error.min&&delete e.form.amount.$error.min,t&&t>e.convertedBalance?(e.form.$valid=!1,e.form.amount.$invalid=!0,e.form.amount.$error=e.form.amount.$error||{},e.form.amount.$error={max:!0}):e.form.amount&&e.form.amount.$error&&e.form.amount.$error.max&&delete e.form.amount.$error.max,e.form.$valid=n,e.form.amount&&(e.form.amount.$invalid=!n),n&&e.formData.all&&t?e.formData.useRelative?(e.formData.restAmount=e.walletData.balance-t*p.data.currentUD,e.formData.restAmount<.01&&(e.formData.restAmount=0)):e.formData.restAmount=e.walletData.balance-100*t:e.formData.restAmount=void 0}},e.doTransfer=function(){if(e.form.$submitted=!0,e.form.$valid&&e.formData.destPub&&e.formData.amount){var n=e.formData.amount;if("string"==typeof n&&(n=parseFloat(n.replace(new RegExp("[.,]"),"."))),!e.sending){e.sending=!0;var a;return t.all([b.auth({silent:!0}),p.currentUD().then(function(e){a=e}),e.hideDigitKeyboard(300)]).then(e.askTransferConfirm).then(function(t){return t?l.loading.show().then(function(){e.formData.useRelative?n*=a:n=100*n.toFixed(2);var t=e.formData.comment&&e.formData.comment.trim();return t&&!t.length&&(t=null),e.formData.all&&e.formData.restAmount>0?b.transferAll(e.formData.destPub,n,t,e.formData.useRelative,e.formData.restPub):b.transfer(e.formData.destPub,n,t,e.formData.useRelative)}).then(function(){return l.loading.hide(),e.closeModal(!0)}).then(function(t){return i(function(){e.sending=!1,l.toast.show("INFO.TRANSFER_SENT")},500),t}):void(e.sending=!1)}).catch(function(t){e.sending=!1,"CANCELLED"!==t&&l.onError("ERROR.SEND_TX_FAILED")(t)})}}},e.askTransferConfirm=function(){return n(["COMMON.UD","COMMON.EMPTY_PARENTHESIS"]).then(function(t){var i=e.formData.all&&e.formData.restAmount>0;return n(i?"CONFIRM.TRANSFER_ALL":"CONFIRM.TRANSFER",{from:e.walletData.isMember?e.walletData.uid:a("formatPubkey")(e.walletData.pubkey),to:e.destUid||e.destPub,amount:e.formData.amount,unit:e.formData.useRelative?t["COMMON.UD"]:a("abbreviate")(e.currency),comment:e.formData.comment&&0!==e.formData.comment.trim().length?e.formData.comment:t["COMMON.EMPTY_PARENTHESIS"],restAmount:i&&a("formatAmount")(e.formData.restAmount,{useRelative:e.formData.useRelative}),restTo:i&&(e.restUid||e.restPub)})}).then(l.alert.confirm)},e.addComment=function(){e.formData.useComment=!0},e.showWotLookupModal=function(t){return t=t||"destPub",e.hideDigitKeyboard(0),c.showWotLookup({enableWallets:!0}).then(function(n){n&&("destPub"==t?(e.destUid=n.uid,e.destPub=n.uid?"":n.pubkey,e.formData.destPub=n.pubkey):"restPub"==t&&(e.restUid=n.uid,e.restPub=n.uid?"":n.pubkey,e.formData.restPub=n.pubkey))})},e.showSelectWalletModal=function(){if(e.enableSelectWallet)return c.showSelectWallet({useRelative:e.formData.useRelative,showDefault:!0,showBalance:!0}).then(function(t){!t||b&&b.id===t.id||(b=t,e.walletData=b.data,console.debug("[transfer] Using wallet {"+b.id+"}"),e.onAmountChanged())})},e.showUnitPopover=function(t){l.popover.show(t,{templateUrl:"templates/wallet/popover_unit.html",scope:e}).then(function(t){e.formData.useRelative=t})},e.showDigitKeyboard=function(){if(e.digitKeyboardSettings&&!e.digitKeyboardVisible)return r.enable?(r.keyboard.close(),i(function(){e.digitKeyboardVisible=!0},200)):(e.digitKeyboardVisible=!0,t.when())},e.hideDigitKeyboard=function(n){return e.digitKeyboardVisible?(e.digitKeyboardVisible=!1,i(function(){},n||200)):t.when()}}function SettingsController(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b){"ngInject";e.formData=angular.copy(E.data),e.popupData={},e.loading=!0,e.nodePopup={},e.bma=u,e.keepAuthIdleLabels={10:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.SECONDS",labelParams:{value:10}},30:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.SECONDS",labelParams:{value:30}},60:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.MINUTE",labelParams:{value:1}},600:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.MINUTES",labelParams:{value:10}},3600:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.HOUR",labelParams:{value:1}},9999:{labelKey:"SETTINGS.KEEP_AUTH_OPTION.ALWAYS"}},e.keepAuthIdles=_.keys(e.keepAuthIdleLabels),e.blockValidityWindowLabels={0:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.NONE"},6:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.N",labelParams:{count:6,time:void 0}},12:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.N",labelParams:{count:12,time:void 0}},24:{labelKey:"SETTINGS.BLOCK_VALIDITY_OPTION.N",labelParams:{count:24,time:void 0}}},e.blockValidityWindows=_.keys(e.blockValidityWindowLabels),e.$on("$ionicView.enter",function(){t.all([E.ready(),m.parameters().then(function(e){return e&&e.avgGenTime}).catch(function(e){return console.error("[settings] Could not not currency parameters. Using default 'avgGenTime' (300)",e),{avgGenTime:300}}).then(function(t){_.each(e.blockValidityWindows,function(n){n>0&&(e.blockValidityWindowLabels[n].labelParams.time=t.avgGenTime*n)})})]).then(e.load)}),e.setPopupForm=function(t){e.popupForm=t},e.load=function(){return e.loading=!0,e.locales=angular.copy(E.locales),angular.merge(e.formData,E.data),e.formData.locale=E.data.locale&&E.data.locale.id&&_.findWhere(e.locales,{id:E.data.locale.id})||_.findWhere(e.locales,{id:E.defaultSettings.locale.id}),o(function(){e.loading=!1,l.ink({selector:".item"}),e.showHelpTip()},100)},e.reset=function(){e.actionsPopover&&e.actionsPopover.hide(),e.pendingSaving=!0,E.reset().then(b.restart).then(function(){e.load(),e.pendingSaving=!1})},e.changeLanguage=function(e){r.use(e)},e.changeNode=function(t){var n=e.formData.node.port&&80!=e.formData.node.port&&443!=e.formData.node.port?e.formData.node.port:void 0;t=t||{host:e.formData.node.host,port:n,useSsl:angular.isDefined(e.formData.node.useSsl)?e.formData.node.useSsl:443==e.formData.node.port},e.showNodePopup(t).then(function(t){if(t.host!==e.formData.node.host||t.port!==e.formData.node.port||t.useSsl!==e.formData.node.useSsl||e.formData.node.temporary){l.loading.show();var n=u.instance(t.host,t.port,t.useSsl,!0);n.isAlive().then(function(a){return a?(l.loading.hide(),angular.merge(e.formData.node,t),delete e.formData.node.temporary,u.copy(n),e.bma=u,b.restart(),i.clearCache()):(l.loading.hide(),l.alert.error("ERROR.INVALID_NODE_SUMMARY").then(function(){e.changeNode(t)}))})}})},e.showNodeList=function(){var t=!!("true"===p.httpsMode||!0===p.httpsMode||"force"===p.httpsMode||n.location&&"https:"===n.location.protocol);return a._popupStack[0].responseDeferred.promise.close(),c.showNetworkLookup({enableFilter:!0,bma:!0,ssl:!!t||void 0}).then(function(e){if(e){var t=e.getBMA();return{host:t.dns?t.dns:e.hasValid4(t)?t.ipv4:t.ipv6,port:t.port||80,useSsl:t.useSsl||443==t.port}}}).then(function(t){e.changeNode(t)})},e.showNodePopup=function(n){return t(function(t,i){e.popupData.newNode=n.port?[n.host,n.port].join(":"):n.host,e.popupData.useSsl=n.useSsl,e.popupForm&&e.popupForm.$setPristine(),r(["SETTINGS.POPUP_PEER.TITLE","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then(function(n){a.show({templateUrl:"templates/settings/popup_node.html",title:n["SETTINGS.POPUP_PEER.TITLE"],scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"]},{text:n["COMMON.BTN_OK"],type:"button-positive",onTap:function(t){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};t.preventDefault()}}]}).then(function(e){if(!e)return void l.loading.hide();var n=e.server.split(":");n[1]=n[1]?n[1]:80,t({host:n[0],port:n[1],useSsl:e.useSsl})})})})},e.save=function(){return e.loading||e.pendingSaving?t.when():e.saving?(e.pendingSaving=!0,o(function(){return e.pendingSaving=!1,e.save()},500)):(e.saving=!0,o(function(){return e.cleanupHelpTip(),E.apply(e.formData),E.store()},100).then(function(){e.saving=!1}))},e.onDataChanged=function(n,i,a){return e.loading||e.pendingSaving?t.when():e.saving?(e.pendingSaving=!0,o(function(){return e.pendingSaving=!1,e.onDataChanged(n,i,a)},500)):void(a!==e||angular.equals(n,i)||e.save())},e.$watch("formData",e.onDataChanged,!0),E.api.data.on.changed(e,function(t){if(!(e.loading||e.saving||e.pendingSaving)){!angular.equals(t.useLocalStorageEncryption,e.formData.useLocalStorageEncryption)&&(console.debug("[settings] Settings changed (outside the settings page). Reloading..."),e.load())}}),e.getServer=function(){return e.formData.node&&e.formData.node.host?d.getServer(e.formData.node.host,e.formData.node.port):""},e.cleanupHelpTip=function(){if(e.formData.helptip.enable!==E.data.helptip.enable){var t=e.formData.helptip.enable;e.formData.helptip=angular.merge({},E.defaultSettings.helptip),e.formData.helptip.enable=t}},e.showActionsPopover=function(t){l.popover.show(t,{templateUrl:"templates/settings/popover_actions.html",scope:e,autoremove:!0,afterShow:function(t){e.actionsPopover=t}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.startSettingsTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(t,n){if((e.isLogin()||n)&&!((t=angular.isDefined(t)?t:E.data.helptip.settings)<0)){0===t&&(t=1);var i=e.createHelptipScope(n);if(i)return i.startSettingsTour(t,!1).then(function(e){i.$destroy(),E.data.helptip.settings=e,E.store()})}}}function BlockLookupController(e,t,n,i,a,o,r,s,l,c,u){"ngInject";e.search={result:[],total:0,loading:!0,loadingMore:!1,hasMore:!1,type:"last"},e.node={},e.currency=!1,e.entered=!1,e.searchTextId=null,e.ionItemClass="item-border-large",e.defaultSizeLimit=r.screen.isSmall()?50:100,e.helptipPrefix="helptip-network",e.listeners=[],e.enter=function(t,n){if(e.entered)e.addListeners();else{if(n&&n.stateParams&&n.stateParams.q&&(e.search.text=n.stateParams.q,e.search.text&&e.search.text.trim().length&&(e.search.type="text")),n&&n.stateParams&&n.stateParams.server){var i="true"==n.stateParams.ssl,a="true"==n.stateParams.tor,o={server:n.stateParams.server,host:n.stateParams.server,useSsl:i,useTor:a},c=n.stateParams.server.split(":");if(2==c.length&&(o.host=c[0],o.port=c[1]),!s.node.same(o.host,o.port))return e.node=a?s.instance(o.host+".to",443,!0,6e5):s.instance(o.host,o.port,o.useSsl),e.node.blockchain.parameters().then(function(t){e.currency=t.currency,e.enter()});e.node=s}if(!e.currency)return l.get().then(function(t){if(e.currency=t?t.name:null,e.node=t.node?t.node:s,!e.currency)return void r.alert.error("ERROR.GET_CURRENCY_FAILED");e.enter()}).catch(r.onError("ERROR.GET_CURRENCY_FAILED"));e.compactMode=!angular.isDefined(e.compactMode)||e.compactMode,e.expertMode=angular.isDefined(e.expertMode)?e.expertMode:!r.screen.isSmall()&&u.data.expertMode,e.doSearch(),e.addListeners(),e.entered=!0,e.showHelpTip()}},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.removeListeners()},e.$on("$ionicParentView.leave",e.leave),e.$on("$destroy",e.leave),e.doSearchLast=function(){return e.search.type="last",e.doSearch()},e.doSearch=function(t){t=angular.isDefined(t)?t:0,e.search.loading=0===t,e.search.hasMore=!1;var n;if(0===t)n=e.node.blockchain.current().then(function(t){var n=t.number<e.defaultSizeLimit?t.number:e.defaultSizeLimit;return e.node.blockchain.blocksSlice({count:n,from:t.number-n}).then(function(e){return e&&e.splice(0,0,t),e})}).catch(function(e){if(e&&e.ucode==s.errorCodes.NO_CURRENT_BLOCK)return[];throw e});else{var i=e.search.results[e.search.results.length-1].number,a=i<e.defaultSizeLimit?i:e.defaultSizeLimit;n=e.node.blockchain.blocksSlice({count:a,from:i-a})}return n.then(function(n){if(!n||!n.length)return e.doDisplayResult([],t,0),void(e.search.loading=!1);n=n.reduce(function(e,t){var n=new Block(t);return n.cleanData(),e.concat(n)},[]),n=_.sortBy(n,function(e){return-1*e.number});var i=(0===t?n[0].number:e.search.results[0].number)+1;return e.doPrepareResult(n,t).then(function(){e.doDisplayResult(n,t,i),e.search.loading=!1})}).catch(function(t){r.onError("BLOCKCHAIN.ERROR.SEARCH_BLOCKS_FAILED")(t),e.search.loading=!1})};var d=i("formatDateShort");e.doPrepareResult=function(t,n){if(n=angular.isDefined(n)?n:0,"last"==e.search.type){var i;if(n>0&&e.search.results.length){var a=e.search.results[e.search.results.length-1];i=a.empty?a.day:void 0}_.forEach(t,function(e,t){if(e.empty){var a=d(e.medianTime),o=0!==t||0!==n,r=!i||i==a;e.compacted=o&&r,i=a}else i=void 0})}return c.extendAll(t,"issuer")},e.doDisplayResult=function(t,n,i){e.search.results=n?e.search.results.concat(t):t||[],e.search.hasMore=i&&e.search.results.length<i,e.search.total=i||e.search.total,e.smallscreen=r.screen.isSmall(),e.$broadcast("$$rebind::rebind"),t&&t.length&&e.motion.show({selector:".list-blocks .item-block"})},e.showMore=function(){var t=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,e.doSearch(t).then(function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}).catch(function(t){console.error(t),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})},e.removeListeners=function(){e.listeners.length&&(console.debug("[block] Closing listeners"),_.forEach(e.listeners,function(e){e()}),e.listeners=[])},e.addListeners=function(){e.listeners.length||(console.debug("[block] Starting listeners"),e.node===s?e.listeners=[l.api.data.on.newBlock(e,e.onBlock)]:e.listeners=[e.node.websocket.block().onListener(function(t){if(t){var n=new Block(t);n.cleanData(),e.onBlock(n)}})])},e.onBlock=function(t){if(!(e.search.loading||"last"!=e.search.type||e.search.sort&&"desc"!=e.search.sort))if(e.search.results=e.search.results||[],e.search.results.length){var n=_.findWhere(e.search.results,{number:t.number});n?n.hash!=t.hash&&(console.debug("[ES] [blockchain] block #{0} updated (by websocket)".format(t.number)),angular.copy(t,n),e.doPrepareResult([t,e.search.results[1]]).then(function(){return e.showBlock(n)})):(console.debug("[ES] [blockchain] new block #{0} received (by websocket)".format(t.number)),e.search.total++,e.search.results.splice(0,0,t),e.doPrepareResult([t,e.search.results[1]]).then(function(){return e.showBlock(t)}))}else console.debug("[ES] [blockchain] new block #{0} received (by websocket)".format(t.number)),e.search.total++,e.search.results.push(t),e.doPrepareResult([t]).then(function(){return e.showBlock(t)})},e.showBlock=function(t){e.$broadcast("$$rebind::rebind"),e.motion.show({selector:"#block-"+t.number})},e.selectBlock=function(n){n.compacted&&e.compactMode?(e.toggleCompactMode(),t(function(){o("block-"+n.number)},900)):s.node.same(e.node.host,e.node.port)?a.go("app.view_block_hash",{number:n.number,hash:n.hash}):a.go("app.view_server_block_hash",{server:e.node.server,ssl:e.node.useSsl,number:n.number,hash:n.hash})},e.toggleCompactMode=function(){if(e.compactMode=!e.compactMode,e.doDisplayResult(e.search.results,0,e.search.total),!e.search.hasMore&&e.search.results.length&&"last"==e.search.type){var n=e.search.results[e.search.results.length-1];n&&n.number>0&&t(function(){e.search.hasMore=!0},500)}},e.toggleSort=function(t){e.search.sort!==t||e.search.asc?(e.search.asc=e.search.sort!==t||!e.search.asc,e.search.sort=t):(e.search.asc=void 0,e.search.sort=void 0),e.doSearch()},e.showHelpTip=function(){}}function BlockViewController(e,t,n,i,a,o,r){"ngInject";e.loading=!0,e.formData={},e.compactMode=!0,e.$on("$ionicView.beforeEnter",function(e,t){t.enableBack=!!i.screen.isSmall()||t.enableBack}),e.enter=function(t,n){if(e.loading){if(n&&(e.number=n.stateParams&&angular.isDefined(n.stateParams.number)?n.stateParams.number:"current",e.hash=n.stateParams&&n.stateParams.hash?n.stateParams.hash:void 0,n.stateParams&&n.stateParams.server)){var r="true"==n.stateParams.ssl,s="true"==n.stateParams.tor,l={server:n.stateParams.server,host:n.stateParams.server,useSsl:r,useTor:s},c=n.stateParams.server.split(":");if(2==c.length&&(l.host=c[0],l.port=c[1]),!a.node.same(l.host,l.port))return e.node=s?a.instance(l.host+".to",443,!0,6e5):a.instance(l.host,l.port,l.useSsl),e.node.blockchain.parameters().then(function(t){e.currency=t.currency,e.enter()});e.node=a}e.currency&&e.node?e.load():o.get().then(function(t){t&&(e.currency=t.name,e.node=t.node,e.load())}).catch(i.onError("ERROR.GET_CURRENCY_FAILED"))}},e.$on("$ionicView.enter",e.enter),e.leave=function(){},e.$on("$ionicParentView.beforeLeave",e.leave),e.load=function(){if(e.number){return("current"==e.number?e.node.blockchain.current():e.node.blockchain.block({block:e.number})).then(function(t){var n=new Block(t);if(n.parseData(),!n||!angular.isDefined(n.number)||!n.hash)return e.loading=!1,void i.alert.error("ERROR.GET_BLOCK_FAILED");if(e.hash&&n.hash!=e.hash)return e.loading=!1,void i.alert.error("ERROR.INVALID_BLOCK_HASH");var o=[];n.joiners.length&&(o=o.concat(n.joiners)),n.certifications.length&&(o=n.certifications.reduce(function(e,t){return t.to={pubkey:t.to},t.from={pubkey:t.from},e.concat(t.to,t.from)},o),n.certifications=_.groupBy(n.certifications,function(e){return e.to.pubkey})),n.transactions.length&&(o=n.transactions.reduce(function(e,t){return t.issuers=t.issuers.reduce(function(e,t){return e.concat({pubkey:t})},[]),_.forEach(t.outputs||[],function(e){e.unlockCondition&&angular.merge(e,a.tx.parseUnlockCondition(e.unlockCondition))}),e.concat(t.issuers.concat(t.outputs||[]))},o));var s={pubkey:n.issuer};return o.push(s),r.extendAll(o).then(function(){e.updateView({block:n,issuer:s})})}).catch(function(t){e.loading=!1,i.onError("ERROR.GET_BLOCK_FAILED")(t)})}},e.updateView=function(t){e.formData=t.block,e.issuer=t.issuer,e.loading=!1},e.toggleCompactMode=function(){e.compactMode=!e.compactMode};e.toUnlockUIArray=function(t,n,i){return n=n||10,!t.children||"AND"!=t.type&&"OR"!=t.type?{style:{"padding-left":n+"px"},operator:i,type:t.type,value:t.value}:t.children.reduce(function(i,a,o){return a.children&&o>0?(i=i.concat({style:{"padding-left":n+"px","padding-top":"10px","padding-bottom":"10px"},operator:t.type}),i.concat(e.toUnlockUIArray(a,n+10))):i.concat(e.toUnlockUIArray(a,n+10,o&&t.type))},[])},e.showUnlockConditionPopover=function(t,n){t.unlockTree&&(e.popoverData=e.popoverData||{},
@@ -35,15 +35,15 @@ SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while
 CERT_SENT:"Your <b>certification</b> to <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.",CERT_RECEIVED:"You  have <b>received a certification</b> from <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the data node <b>{{new}}</b>?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Cesium will continue to work, <b>without the Cesium+</b> extension (user profiles, private messages, maps and graphics).<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">extension settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("eo-EO",{COMMON:{CATEGORY:"Kategorio",CATEGORIES:"Kategorioj",CATEGORY_SEARCH_HELP:"Serĉado",LAST_MODIFICATION_DATE:"Ĝisdatigita la",SUBMIT_BY:"Submetita de",BTN_PUBLISH:"Publikigi",BTN_PICTURE_DELETE:"Forigi",BTN_PICTURE_FAVORISE:"Precipa",BTN_PICTURE_ROTATE:"Turni",BTN_ADD_PICTURE:"Aldoni foton",NOTIFICATION:{TITLE:"Nova avizo | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n"},NOTIFICATIONS:{TITLE:"Avizoj",MARK_ALL_AS_READ:"Ĉion marki legita",NO_RESULT:"Neniu avizo",SHOW_ALL:"Vidi ĉion",LOAD_NOTIFICATIONS_FAILED:"Malsukceso por ŝarĝi la avizojn"}},MENU:{REGISTRY:"Paĝoj",USER_PROFILE:"Mia profilo",MESSAGES:"Mesaĝoj",NOTIFICATIONS:"Avizoj",INVITATIONS:"Invitoj"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Konto por organizaĵo",ORGANIZATION_ACCOUNT_HELP:"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vi povas <a ui-sref="app.edit_profile">tajpi vian profilon Cesium+</a> (kromebleco) por disponi pli bonan videblecon por via konto.'},ERROR:{WS_CONNECTION_FAILED:"Cesium ne povas ricevi la avizojn pro teknika eraro (konekto al la daten-nodo Cesium+).<br/><br/>Se la problemo daŭradas, bonvolu <b>elekti alian daten-nodon</b> ĉe la parametroj Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugesti identecojn atestotajn...",BTN_ASK_CERTIFICATIONS_DOTS:"Peti membrojn atesti min...",BTN_ASK_CERTIFICATION:"Peti atestaĵon",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugesti atestadojn",HELP:"Elekti viajn sugestojn"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Peti atestaĵojn",HELP:"Elekti la ricevontojn"},SEARCH:{DIVIDER_PROFILE:"Kontoj",DIVIDER_PAGE:"Paĝoj",DIVIDER_GROUP:"Grupoj"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Ĉu vi certas, ke vi volas <b>sendi tiujn sugestojn por atestado</b>?",ASK_CERTIFICATION:"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b>?",ASK_CERTIFICATIONS:"Ĉu vi certas, ke vi volas <b>sendi atesto-peton</b> al tiuj personoj?"}},INVITATION:{TITLE:"Invitoj",NO_RESULT:"Neniu invito atendanta",BTN_DELETE_ALL:"Forigi ĉiujn invitojn",BTN_DELETE:"Forigi la inviton",BTN_NEW_INVITATION:"Nova invito",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> petas vian atestadon',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> estas sugestita al vi por atestado',SUGGESTED_BY:'Sugesto sendita de <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitoj"},LIST:{TITLE:"Invitoj"},NEW:{TITLE:"Nova invito",RECIPIENTS:"Al",RECIPIENTS_HELP:"Ricevontoj de la invito",RECIPIENTS_MODAL_TITLE:"Ricevontoj",RECIPIENTS_MODAL_HELP:"Bonvolu elekti la ricevontojn:",SUGGESTION_IDENTITIES:"Sugestoj por atestado",SUGGESTION_IDENTITIES_HELP:"Atestadoj sugestotaj",SUGGESTION_IDENTITIES_MODAL_TITLE:"Sugestoj",SUGGESTION_IDENTITIES_MODAL_HELP:"Bonvolu elekti viajn sugestojn:"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La forigo de la invitoj estas <b>neinversigebla ago</b>.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi?",SEND_INVITATIONS_TO_CERTIFY:"Ĉu vi certas, ke vi volas <b>sendi tiun inviton atestotan</b>?"},INFO:{INVITATION_SENT:"Invito sendita"},ERROR:{LOAD_INVITATIONS_FAILED:"Malsukceso por ŝarĝi la invitojn",REMOVE_INVITATION_FAILED:"Eraro dum la forigo de la invito",REMOVE_ALL_INVITATIONS_FAILED:"Eraro dum la forigo de la invitoj",SEND_INVITATION_FAILED:"Eraro dum la sendo de la invito",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invito nelegebla (strukturo nekonata)</span> - sendita de <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Komentoj",SHOW_MORE_COMMENTS:"Afiŝi la antaŭajn komentojn",COMMENT_HELP:"Via komento, demando, ktp.",COMMENT_HELP_REPLY_TO:"Via respondo...",BTN_SEND:"Sendi",POPOVER_SHARE_TITLE:"Mesaĝo #{{number}}",REPLY:"Respondi",REPLY_TO:"Respondo al:",REPLY_TO_LINK:"Responde al ",REPLY_TO_DELETED_COMMENT:"Responde al forigita komento",REPLY_COUNT:"{{replyCount}} respondoj",DELETED_COMMENT:"Komento forigita",ERROR:{FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento"}},MESSAGE:{REPLY_TITLE_PREFIX:"Resp: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Respondi",BTN_COMPOSE:"Nova mesaĝo",BTN_WRITE:"Skribi",NO_MESSAGE_INBOX:"Neniu mesaĝo ricevita",NO_MESSAGE_OUTBOX:"Neniu mesaĝo sendita",NOTIFICATIONS:{TITLE:"Mesaĝoj",MESSAGE_RECEIVED:"Vi <b>ricevis mesaĝon</b><br/>de"},LIST:{INBOX:"Ricevujo",OUTBOX:"Senditaj mesaĝoj",LAST_INBOX:"Novaj mesaĝoj",LAST_OUTBOX:"Senditaj mesaĝoj",BTN_LAST_MESSAGES:"Freŝdataj mesaĝoj",TITLE:"Mesaĝoj",SEARCH_HELP:"Serĉado en la mesaĝoj",POPOVER_ACTIONS:{TITLE:"Kromaĵoj",DELETE_ALL:"Forigi ĉiujn mesaĝojn"}},COMPOSE:{TITLE:"Nova mesaĝo",TITLE_REPLY:"Respondi",SUB_TITLE:"Nova mesaĝo",TO:"Al",OBJECT:"Temo",OBJECT_HELP:"Temo",ENCRYPTED_HELP:"Bonvolu noti, ke tiu ĉi mesaĝo estos ĉifrita antaŭ sendo, tiel ke nur la adresato povos legi ĝin, kaj ke li estos certa, ke vi ja estas ties aŭtoro.",MESSAGE:"Mesaĝo",MESSAGE_HELP:"Enhavo de la mesaĝo",CONTENT_CONFIRMATION:"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?"},VIEW:{TITLE:"Mesaĝo",SENDER:"Sendita de",RECIPIENT:"Sendita al",NO_CONTENT:"Mesaĝo malplena",DELETE:"Forigi la mesaĝon"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.",MARK_ALL_AS_READ:"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?",USER_HAS_NO_PROFILE:"Tiu identeco havas neniun profilon Cesium+. Eblas ke ĝi ne uzas la krom-programon Cesium+, kaj <b>do ne legos vian mesaĝon</b>.<br/><br/>Ĉu vi certas, ke vi volas tamen <b>daŭrigi</b>?"},INFO:{MESSAGE_REMOVED:"Mesaĝo forigita",All_MESSAGE_REMOVED:"Ĉiuj mesaĝoj estis forigitaj",MESSAGE_SENT:"Mesaĝo sendita"},ERROR:{SEND_MSG_FAILED:"Eraro dum la sendo de la mesaĝo.",LOAD_MESSAGES_FAILED:"Eraro dum la ricevo de la mesaĝoj.",LOAD_MESSAGE_FAILED:"Eraro dum la ricevo de la mesaĝo.",MESSAGE_NOT_READABLE:"Legado de la mesaĝo neebla.",USER_NOT_RECIPIENT:"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.",NOT_AUTHENTICATED_MESSAGE:"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.",REMOVE_MESSAGE_FAILED:"Malsukceso por forigi la mesaĝon",MESSAGE_CONTENT_TOO_LONG:"Signaro tro longa ({{maxLength}} signoj maksimume).",MARK_AS_READ_FAILED:"Neeblas marki la mesaĝon 'legita'.",LOAD_NOTIFICATIONS_FAILED:"Eraro dum la ricevo de la mesaĝo-avizoj.",REMOVE_All_MESSAGES_FAILED:"Eraro dum la forigo de ĉiuj mesaĝoj.",MARK_ALL_AS_READ_FAILED:"Eraro por marki la mesaĝojn legitaj.",RECIPIENT_IS_MANDATORY:"La adresato estas deviga."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Numero de bloko, haketo, publika ŝlosilo, ktp.",POPOVER_FILTER_TITLE:"Filtriloj",HEADER_MEDIAN_TIME:"Dato / Horo",HEADER_BLOCK:"Bloko #",HEADER_ISSUER:"Nodo elsendinta",BTN_LAST:"Lastaj blokoj",DISPLAY_QUERY:"Afiŝi la informpeton",HIDE_QUERY:"Kaŝi la informpeton",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Eniroj/eliroj de membroj',EXISTING_TRANSACTION:'<b class="ion-card"></b> Kun spezoj',PERIOD:'<b class="ion-clock"></b> Inter <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) kaj <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Kalkulita de <b class="ion-key"></b> {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Spezoj koncernantaj <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Eraro dum la serĉado de la blokoj."}},GROUP:{GENERAL_DIVIDER:"Ĝeneralaj informoj",LOCATION_DIVIDER:"Adreso",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj kaj retejo",TECHNICAL_DIVIDER:"Teknikaj informoj",CREATED_TIME:"Kreita {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Invitoj"},LOOKUP:{TITLE:"Grupoj",SEARCH_HELP:"Nomo de grupo, vortoj, loko, ktp.",LAST_RESULTS_LIST:"Novaj grupoj:",OPEN_RESULTS_LIST:"Malfermitaj grupoj:",MANAGED_RESULTS_LIST:"Fermitaj grupoj:",BTN_LAST:"Novaj grupoj",BTN_NEW:"Mi aldonas grupon"},TYPE:{TITLE:"Nova grupo",SELECT_TYPE:"Tipo de grupo:",OPEN_GROUP:"Malfermita grupo",OPEN_GROUP_HELP:"Malfermita grupo estas alirebla de iu ajn membro de la mono.",MANAGED_GROUP:"Administrita grupo",MANAGED_GROUP_HELP:"Administrita grupo estas mastrumata de administrantoj kaj moderigantoj, kiuj povas akcepti, rifuzi aŭ eksigi membron.",ENUM:{OPEN:"Malfermita grupo",MANAGED:"Administrita grupo"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Kromaĵoj",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi grupon?<br/><br/>Tiu ago estas neinversigebla."},EDIT:{TITLE:"Grupo",TITLE_NEW:"Nova grupo",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo"},ERROR:{SEARCH_GROUPS_FAILED:"Malsukceso por traserĉi grupojn",REMOVE_RECORD_FAILED:"Malsukceso por forigi la grupon"},INFO:{RECORD_REMOVED:"Grupo forigita"}},REGISTRY:{CATEGORY:"Ĉefa agado",GENERAL_DIVIDER:"Ĝeneralaj informoj",LOCATION_DIVIDER:"Adreso",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj kaj retejo",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_SHOW_WOT:"Personoj",BTN_SHOW_WOT_HELP:"Traserĉi personojn",BTN_SHOW_PAGES:"Paĝoj",BTN_SHOW_PAGES_HELP:"Traserĉi paĝojn",BTN_NEW:"Krei paĝon",MY_PAGES:"Miaj paĝoj",NO_PAGE:"Neniu paĝo",SEARCH:{TITLE:"Paĝoj",SEARCH_HELP:"Kio, Kiu: restoracio, Ĉe Marcelo, ...",BTN_ADD:"Nova",BTN_LAST_RECORDS:"Freŝdataj paĝoj",BTN_ADVANCED_SEARCH:"Sperta serĉado",BTN_OPTIONS:"Sperta serĉado",TYPE:"Tipo de paĝo",LOCATION_HELP:"Kie: Poŝto-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Freŝdataj paĝoj",LAST_RECORD_COUNT_LOCATION:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Spertaj kromaĵoj?"}},VIEW:{TITLE:"Adresaro",CATEGORY:"Ĉefa agado:",LOCATION:"Adreso:",MENU_TITLE:"Kromaĵoj",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla."},TYPE:{TITLE:"Tipoj",SELECT_TYPE:"Tipo de paĝo:",ENUM:{SHOP:"Loka komerco",COMPANY:"Entrepreno",ASSOCIATION:"Asocio",INSTITUTION:"Institucio"}},EDIT:{TITLE:"Redaktado",TITLE_NEW:"Nova paĝo",RECORD_TYPE:"Tipo de paĝo",RECORD_TITLE:"Nomo",RECORD_TITLE_HELP:"Nomo",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo de la agado",RECORD_ADDRESS:"Strato",RECORD_ADDRESS_HELP:"Strato, konstruaĵo...",RECORD_CITY:"Urbo",RECORD_CITY_HELP:"Urbo",RECORD_SOCIAL_NETWORKS:"Sociaj retoj kaj retejo",RECORD_PUBKEY:"Publika ŝlosilo",RECORD_PUBKEY_HELP:"Publika ŝlosilo por ricevi la pagojn"},WALLET:{REGISTRY_DIVIDER:"Paĝoj",REGISTRY_HELP:"La paĝoj listigas agadojn, kiuj akceptas la liberan monon aŭ helpas ĝin: komercoj, entreprenoj, asocioj, institucioj."},ERROR:{LOAD_CATEGORY_FAILED:"Malsukceso por ŝarĝi la liston de la agadoj",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝado de la paĝo",LOOKUP_RECORDS_FAILED:"Eraro dum la serĉado",REMOVE_RECORD_FAILED:"Malsukceso por forigi la paĝon",SAVE_RECORD_FAILED:"Eraro dum la konservado",RECORD_NOT_EXISTS:"Paĝo neekzistanta",GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝto-kodo ne trovita"},INFO:{RECORD_REMOVED:"Paĝo forigita",RECORD_SAVED:"Paĝo konservita"}},PROFILE:{PROFILE_DIVIDER:"Profilo Cesium+",PROFILE_DIVIDER_HELP:"Temas pri kromaj datenoj, stokitaj ekster la mon-reto.",NO_PROFILE_DEFINED:"Neniu profilo tajpita",BTN_ADD:"Tajpi mian profilon",BTN_EDIT:"Redakti mian profilon",BTN_DELETE:"Forigi mian profilon",BTN_REORDER:"Reordigi",UID:"Pseŭdonimo",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Pri mi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Ĝeneralaj informoj",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj, retejoj",TECHNICAL_DIVIDER:"Teknikaj informoj",MODAL_AVATAR:{TITLE:"Profil-foto",SELECT_FILE_HELP:"Bonvolu <b>elekti bildo-dosieron</b>, alklakante la ĉi-suban butonon:",BTN_SELECT_FILE:"Elekti foton",RESIZE_HELP:"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.",RESULT_HELP:"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:"},CONFIRM:{DELETE:"Ĉu vi certas, ke vi volas <b>forigi vian profilon Cesium+ ?</b><br/><br/>Tiu ago estas neinversigebla."},ERROR:{REMOVE_PROFILE_FAILED:"Malsukceso por forigi la profilon",LOAD_PROFILE_FAILED:"Malsukceso por ŝarĝi la profilon de la uzanto.",SAVE_PROFILE_FAILED:"Eraro dum la konservado",INVALID_SOCIAL_NETWORK_FORMAT:"Strukturo ne rekonata: bonvolu tajpi validan adreson.<br/><br/>Ezemploj:<ul><li>- Facebook-paĝo (https://www.facebook.com/uzanto)</li><li>- Retpaĝo (http://www.miaretejo.net)</li><li>- Retadreso (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Eraro dum la reformatigo de la bildo"},INFO:{PROFILE_REMOVED:"Profilo forigita",PROFILE_SAVED:"Profilo konservita"},HELP:{WARNING_PUBLIC_DATA:"La informoj afiŝitaj en via profilo <b>estas publikaj</b>: videblaj inkluzive de la personoj <b>ne konektitaj</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trovi mian adreson surmape",USE_GEO_POINT:"Aperi sur la mapoj {{'COMMON.APP_NAME'|translate}}?",LOADING_LOCATION:"Serĉado de la adreso...",LOCATION_DIVIDER:"Adreso",ADDRESS:"Strato",ADDRESS_HELP:"Strato, adres-aldonaĵo...",CITY:"Urbo",CITY_HELP:"Poŝto-kodo, Urbo, Lando",DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Poŝto-kodo, Urbo",PROFILE_POSITION:"Loko de la profilo",MODAL:{TITLE:"Serĉado de la adreso",SEARCH_HELP:"Urbo, Poŝto-kodo, Lando",ALTERNATIVE_RESULT_DIVIDER:"Alternativaj rezultoj por <b>{{address}}</b>:",POSITION:"Lat/Lon: {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Deviga kampo (ĉar strato estas tajpita)",REQUIRED_FOR_LOCATION:"Deviga kampo por aperi sur la mapo",INVALID_FOR_LOCATION:"Adreso nekonata",GEO_LOCATION_FAILED:"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.",ADDRESS_LOCATION_FAILED:"Neeblas ricevi la lokon per la adreso"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Retaj servoj",SUBSCRIPTION_DIVIDER_HELP:"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.",BTN_ADD:"Aldoni servon",BTN_EDIT:"Mastrumi miajn servojn",NO_SUBSCRIPTION:"Neniu servo uzata",SUBSCRIPTION_COUNT:"Servoj / Abonoj",EDIT:{TITLE:"Retaj servoj",HELP_TEXT:"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn",PROVIDER:"Provizanto:"},TYPE:{ENUM:{EMAIL:"Ricevi la avizojn per retmesaĝo"}},CONFIRM:{DELETE_SUBSCRIPTION:"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Eraro dum la ŝarĝo de la retaj servoj",ADD_SUBSCRIPTION_FAILED:"Malsukceso por sendi la abonon",UPDATE_SUBSCRIPTION_FAILED:"Malsukceso por ĝisdatigi la abonon",DELETE_SUBSCRIPTION_FAILED:"Eraro dum la forigo de la abono"},MODAL_EMAIL:{TITLE:"Avizo per retmesaĝo",HELP:"Plenigu tiun ĉi formularon por <b>esti avizita per retmesaĝo</b> pri la okazaĵoj ĉe via konto.<br/>Via retadreso estos ĉifrita por esti videbla nur de la servo-provizanto.",EMAIL_LABEL:"Via retadreso:",EMAIL_HELP:"johano.stelaro@esperanto.org",FREQUENCY_LABEL:"Periodo de la avizoj:",FREQUENCY_DAILY:"Ĉiutaga",FREQUENCY_WEEKLY:"Ĉiusemajna",PROVIDER:"Servo-provizanto:"}},DOCUMENT:{HASH:"Haketo: ",LOOKUP:{TITLE:"Serĉado de dokumentoj",BTN_ACTIONS:"Agoj",SEARCH_HELP:"Sendanto:AAA*, tempo:1508406169",LAST_DOCUMENTS:"Lastaj dokumentoj",SHOW_QUERY:"Vidi la informpeton",HIDE_QUERY:"Kaŝi la informpeton",HEADER_TIME:"Dato/Horo",HEADER_ISSUER:"Sendanto",HEADER_RECIPIENT:"Ricevonto",READ:"Legita",BTN_REMOVE:"Forigi tiun ĉi dokumenton",POPOVER_ACTIONS:{TITLE:"Agoj",REMOVE_ALL:"Forigi tiujn ĉi dokumentojn..."}},INFO:{REMOVED:"Dokumento forigita"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Eraro dum la serĉado de dokumentoj",REMOVE_FAILED:"Eraro dum la forigo de la dokumento",REMOVE_ALL_FAILED:"Eraro dum la forigo de la dokumentoj"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Profiloj, avizoj, privataj mesaĝoj",ENABLE_TOGGLE:"Aktivigi la krom-programon?",ENABLE_REMOTE_STORAGE:"Aktivigi la foran stokadon?",ENABLE_REMOTE_STORAGE_HELP:"Ebligas stoki (ĉifrite) viajn parametrojn ĉe la nodoj Cesium+",ENABLE_MESSAGE_TOGGLE:"Aktivigi la privatajn mesaĝojn?",PEER:"Adreso de la daten-nodo",POPUP_PEER:{TITLE:"Daten-nodo",HELP:"Tajpu la adreson de la nodo, kiun vi volas uzi:",PEER_HELP:"servo.domajno.com:port"},NOTIFICATIONS:{DIVIDER:"Avizoj",HELP_TEXT:"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:",ENABLE_TX_SENT:"Avizi pri la <b>senditaj pagoj</b>?",ENABLE_TX_RECEIVED:"Avizi pri la <b>ricevitaj pagoj</b>?",ENABLE_CERT_SENT:"Avizi pri la <b>senditaj atestaĵoj</b>?",ENABLE_CERT_RECEIVED:"Avizi pri <b>la ricevitaj atestaĵoj</b>?",ENABLE_HTML5_NOTIFICATION:"Anonci ĉiun novan avizon?",ENABLE_HTML5_NOTIFICATION_HELP:"Malfermas fenestreton por ĉiu nova avizo."},CONFIRM:{ASK_ENABLE_TITLE:"Kromaj funkcioj",ASK_ENABLE:'La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profiloj Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Avizoj</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privataj mesaĝoj</b>.<li>&nbsp;&nbsp;<b><i class="icon ion-location"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Adresito estas deviga por la ĉifrado."}},EVENT:{NODE_STARTED:"Via nodo ES API <b>{{params[0]}}</b> ekis",NODE_BMA_DOWN:"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.",NODE_BMA_UP:"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.",MEMBER_JOIN:"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>, pro ne revalidiĝo aŭ pro manko da atestaĵoj.",MEMBER_REVOKE:"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.",TX_SENT:"Via <b>pago</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.",TX_SENT_MULTI:"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.",TX_RECEIVED:"Vi <b>ricevis pagon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Via <b>atestado</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.",CERT_RECEIVED:"Vi <b>ricevis atestaĵon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> modifis sian komenton pri via anonco: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> respondis al via komento pri la anonco: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> modifis sian respondon al via komento pri la anonco: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Daten-nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la daten-nodon <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Daten-nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Cesium daŭrigos funkcii, <b>sen la krom-programo Cesium+</b> (uzanto-profiloj, privataj mesaĝoj, mapoj kaj grafikoj)<br/><br/>Kontrolu vian ret-konekton, aŭ ŝanĝu daten-nodon ĉe la <a class="positive" ng-click="doQuickFix(\'settings\')">parametroj de la krom-programo</a>.',ES_MAX_UPLOAD_BODY_SIZE:"La kvanto de datenoj sendotaj superas la limon fiksitan de la servilo.<br/>Bonvolu reprovi post, ekzemple, forigo de fotoj."}}),e.translations("es-ES",{COMMON:{CATEGORY:"Categoría",CATEGORIES:"Categorías",CATEGORY_SEARCH_HELP:"Búsqueda",LAST_MODIFICATION_DATE:"Actualización el",SUBMIT_BY:"Sometido por",BTN_PUBLISH:"Publicar",BTN_PICTURE_DELETE:"Suprimir",BTN_PICTURE_FAVORISE:"Principal",BTN_PICTURE_ROTATE:"Girar",BTN_ADD_PICTURE:"Añadir una foto",NOTIFICATIONS:{TITLE:"Notificaciónes",MARK_ALL_AS_READ:"Marcar todo como leído",NO_RESULT:"Ningúna notificación",SHOW_ALL:"Ver todo",LOAD_NOTIFICATIONS_FAILED:"Fracaso en la carga de las notificaciónes"}},MENU:{REGISTRY:"Profesionales",USER_PROFILE:"Mi perfil",MESSAGES:"Mensajes",NOTIFICATIONS:"Notificaciónes",INVITATIONS:"Invitaciónes"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Cuenta para una organización",ORGANIZATION_ACCOUNT_HELP:"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta."},EVENT:{MEMBER_WITHOUT_PROFILE:'Para obtener sus certificaciónes más rapidamente, completa <a ui-sref="app.edit_profile">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable.'},ERROR:{WS_CONNECTION_FAILED:"Cesium no puede recibir las notificaciónes, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en las configuraciónes Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugerir identidad a certificar...",BTN_ASK_CERTIFICATIONS_DOTS:"Solicitar otros miembros a certificarme…",BTN_ASK_CERTIFICATION:"Solicitar una certificación",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugerir certificaciónes",HELP:"Selectionar sus sugerencias"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Solicitar certificaciónes",HELP:"Selectionar los destinatarios"},SEARCH:{DIVIDER_PROFILE:"Cuentas",DIVIDER_PAGE:"Páginas",DIVIDER_GROUP:"Grupos"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Está usted segura/o querer <b>mandar estas sugerencia de certificatión</b> ?",ASK_CERTIFICATION:"Está usted segura/o querer <b>mandar una solicitud de certificación</b> ?",ASK_CERTIFICATIONS:"Está usted segura/o querer <b>mandar una solicitud de certificación</b> a estas personas ?"}},INVITATION:{TITLE:"Invitaciónes",NO_RESULT:"Ningúna invitación en espera",BTN_DELETE_ALL:"Suprimir todas las invitaciónes",BTN_DELETE:"Suprimir la invitación",BTN_NEW_INVITATION:"Nueva invitación",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> solicita su certificación',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> él es sugerido por certificación',SUGGESTED_BY:'Sugerencia mandada por <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitaciónes"},LIST:{TITLE:"Invitaciónes"},NEW:{TITLE:"Nueva invitación",RECIPIENTS:"A",RECIPIENTS_HELP:"Destinatarios de la invitación",RECIPIENTS_MODAL_TITLE:"Destinatarios",RECIPIENTS_MODAL_HELP:"Por favor, elige los destinatarios :",SUGGESTION_IDENTITIES:"Sugerencia de certificación",SUGGESTION_IDENTITIES_HELP:"Certificaciónes a sugerir",SUGGESTION_IDENTITIES_MODAL_TITLE:"Sugerencias",SUGGESTION_IDENTITIES_MODAL_HELP:"Por favor, elige sus sugerencias :"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La supresión de las invitaciónes es una <b>operación ireversible</b>.<br/><br/><b>Está usted segura/o </b> querer continuar ?",SEND_INVITATIONS_TO_CERTIFY:"Está usted segura/o querer <b>mandar esta invitación a certificar</b> ?"},INFO:{INVITATION_SENT:"Invitación mandada"},ERROR:{LOAD_INVITATIONS_FAILED:"Fracaso en la carga de las invitaciónes",REMOVE_INVITATION_FAILED:"Fracaso durante la supresión de la invitación",REMOVE_ALL_INVITATIONS_FAILED:"Fracaso durante la supresión de las invitaciónes",SEND_INVITATION_FAILED:"Fracaso durante el envío de la invitación",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Comentarios",SHOW_MORE_COMMENTS:"Visualizar los comentarios anteriores",COMMENT_HELP:"Su comentario, preguntas, etc.",COMMENT_HELP_REPLY_TO:"Su repuesta…",BTN_SEND:"Mandar",POPOVER_SHARE_TITLE:"Mensaje #{{number}}",REPLY:"Responder",REPLY_TO:"Repuesta a :",REPLY_TO_LINK:"En repuesta a ",REPLY_TO_DELETED_COMMENT:"En repuesta a un comentario suprimido",REPLY_COUNT:"{{replyCount}} repuestas",DELETED_COMMENT:"Comentario suprimido",ERROR:{FAILED_SAVE_COMMENT:"Fracaso durante el respaldo del comentario",FAILED_REMOVE_COMMENT:"Fracaso durante la supresión del comentario"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Responder",BTN_COMPOSE:"Nuevo mensaje",BTN_WRITE:"Escribir",NO_MESSAGE_INBOX:"Ningun mensaje recibido",NO_MESSAGE_OUTBOX:"Ningun mensaje mandado",NOTIFICATIONS:{TITLE:"Mensajes",MESSAGE_RECEIVED:"Ha <b>recibido un mensaje</b><br/>de"},LIST:{INBOX:"Bandeja de entrada",OUTBOX:"Mensajes mandados",LAST_INBOX:"Nuevos mensajes",LAST_OUTBOX:"Mensajes enviados",BTN_LAST_MESSAGES:"Mensajes recientes",TITLE:"Mensajes",SEARCH_HELP:"Buscar en mensajes",POPOVER_ACTIONS:{TITLE:"Opciónes",DELETE_ALL:"Suprimir todos los mensajes"}},COMPOSE:{TITLE:"Nuevo mensaje",TITLE_REPLY:"Responder",SUB_TITLE:"Nuevo mensaje",TO:"A",OBJECT:"Objeto",OBJECT_HELP:"Objeto",ENCRYPTED_HELP:"Por favor, nota que este mensaje será cifrado antes envío, a fin que solo el destinatario pueda leerlo, y que esté asegurado que usted esté bien su autor.",MESSAGE:"Mensaje",MESSAGE_HELP:"Contenido del mensaje",CONTENT_CONFIRMATION:"El contenido del mensaje es vacío.<br/><br/>Sin embargo, quiere mandar el mensaje ?"},VIEW:{TITLE:"Mensaje",SENDER:"Mandado por",RECIPIENT:"Mandado a",NO_CONTENT:"Mensaje vacío",DELETE:"Eliminar el mensaje"},CONFIRM:{REMOVE:"Está usted segura/o querer <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",REMOVE_ALL:"Está usted segura/o querer <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",MARK_ALL_AS_READ:"Está usted segura/o querer <b>marcar todos los mensajes como leído</b> ?",USER_HAS_NO_PROFILE:"Esta identidad no tiene ningún perfil Cesium+. Se puede que no utilice la extensión Cesium+, y <b>así no consultará su mensaje</b>.<br/><br/>Está usted segura/o querer <b>continuar</b> a pesar de todo ?"},INFO:{MESSAGE_REMOVED:"Mensaje suprimido",All_MESSAGE_REMOVED:"Todos los mensajes fueron suprimido",MESSAGE_SENT:"Mensaje mandado"},ERROR:{SEND_MSG_FAILED:"Fracaso durante el envío del mensaje.",LOAD_MESSAGES_FAILED:"Fracaso durante la recuperación de los mensajes.",LOAD_MESSAGE_FAILED:"Fracaso durante la recuperación del mensaje.",MESSAGE_NOT_READABLE:"Lectura del mensaje imposible.",USER_NOT_RECIPIENT:"No esta el destinatario de este mensaje : deciframiento imposible.",NOT_AUTHENTICATED_MESSAGE:"La autenticidad del mensaje es dudosa o su contenido es corrupto.",REMOVE_MESSAGE_FAILED:"Fracaso en la supresión del mensaje",MESSAGE_CONTENT_TOO_LONG:"Valor demasiado largo ({{maxLength}} carácteres max).",MARK_AS_READ_FAILED:"Imposible marcar el mensaje como 'leído'.",LOAD_NOTIFICATIONS_FAILED:"Fracaso durante la recuperación de las notificaciónes de mensajes.",REMOVE_All_MESSAGES_FAILED:"Fracaso durante la supresión de todos los mensajes.",MARK_ALL_AS_READ_FAILED:"Fracaso durante el marcaje de los mensajes como leído.",RECIPIENT_IS_MANDATORY:"El destinatario es obligatorio."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Número de bloque, hash, llave pública, etc.",POPOVER_FILTER_TITLE:"Filtros",HEADER_MEDIAN_TIME:"Fecha / Hora",HEADER_BLOCK:"Bloque #",HEADER_ISSUER:"Nodo emisor",
 BTN_LAST:"últimos bloques",DISPLAY_QUERY:"Mostrar la consulta",HIDE_QUERY:"Ocultar la consulta",TX_SEARCH_FILTER:{MEMBER_FLOWS:"Entradas/salidas de miembros",EXISTING_TRANSACTION:"Con transacciones",PERIOD:'<b class="ion-clock"></b> Entre el <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) y el <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Calculado por <b class="ion-key"></b> {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transacciones que implican <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Fracaso en la búsqueda de los bloques."}},GROUP:{GENERAL_DIVIDER:"Informaciónes generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y sitio web",TECHNICAL_DIVIDER:"Informaciónes técnicas",CREATED_TIME:"Creada {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Invitaciónes"},LOOKUP:{TITLE:"Grupos",SEARCH_HELP:"Nombre de grupo, palabras , lugar, etc.",LAST_RESULTS_LIST:"Nuevos grupos :",OPEN_RESULTS_LIST:"Grupos abiertos :",MANAGED_RESULTS_LIST:"Grupos cerrados :",BTN_LAST:"Nuevos grupos",BTN_NEW:"Añado un grupo"},TYPE:{TITLE:"Nuevo grupo",SELECT_TYPE:"Tipo de grupo :",OPEN_GROUP:"Grupo abierto",OPEN_GROUP_HELP:"Un grupo abierto es accesible por cualquier miembro de la moneda.",MANAGED_GROUP:"Grupo administrado",MANAGED_GROUP_HELP:"un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.",ENUM:{OPEN:"Grupo abierto",MANAGED:"Grupo administrado"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Opciones",REMOVE_CONFIRMATION:"Seguro que quieres eliminar este grupo?<br/><br/>Esta operación es irreversible."},EDIT:{TITLE:"Grupo",TITLE_NEW:"Nuevo grupo",RECORD_TITLE:"Título",RECORD_TITLE_HELP:"Título",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción"},ERROR:{SEARCH_GROUPS_FAILED:"Fracaso en la búsqueda de grupos",REMOVE_RECORD_FAILED:"Error al eliminar el grupo"},INFO:{RECORD_REMOVED:"Grupo eliminado"}},REGISTRY:{CATEGORY:"Actividad principal",GENERAL_DIVIDER:"Informaciónes generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y sitio web",TECHNICAL_DIVIDER:"Informaciónes técnicas",BTN_SHOW_WOT:"Personas",BTN_SHOW_WOT_HELP:"Buscar personas",BTN_SHOW_PAGES:"Páginas",BTN_SHOW_PAGES_HELP:"Búsqueda de páginas",BTN_NEW:"Creer una página",MY_PAGES:"Mis páginas",NO_PAGE:"Sin página",SEARCH:{TITLE:"Páginas",SEARCH_HELP:"Qué, Quién : restaurante, Con Marcel, ...",BTN_ADD:"Nuevo",BTN_LAST_RECORDS:"Páginas recientes",BTN_ADVANCED_SEARCH:"búsqueda avanzada",BTN_OPTIONS:"Búsqueda avanzada",TYPE:"Tipo de página",LOCATION_HELP:"Ciudad",RESULTS:"Resultados",RESULT_COUNT_LOCATION:"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}",RESULT_COUNT:"{{count}} resultado{{count>0?'s':''}}",LAST_RECORDS:"Páginas recientes",LAST_RECORD_COUNT_LOCATION:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}",LAST_RECORD_COUNT:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Opciones avanzadas?"}},VIEW:{TITLE:"Anuario",CATEGORY:"Actividad principal :",LOCATION:"Dirección :",MENU_TITLE:"Opciónes",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Está usted segura/o querer suprimir esta página ?<br/><br/>Esta operación es ireversible."},TYPE:{TITLE:"Nueva página",SELECT_TYPE:"Tipo de página :",ENUM:{SHOP:"Comercio local",COMPANY:"Empresa",ASSOCIATION:"Asociación",INSTITUTION:"Institución"}},EDIT:{TITLE:"Edición",TITLE_NEW:"Nueva página",RECORD_TYPE:"Tipo de página",RECORD_TITLE:"Nombre",RECORD_TITLE_HELP:"Nombre",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción de la actividad",RECORD_ADDRESS:"Calle",RECORD_ADDRESS_HELP:"Calle, edificio...",RECORD_CITY:"Ciudad",RECORD_CITY_HELP:"Ciudad",RECORD_SOCIAL_NETWORKS:"Redes sociales y sitio web",RECORD_PUBKEY:"Llave pública",RECORD_PUBKEY_HELP:"Llave pública de recepción de los pagos"},WALLET:{REGISTRY_DIVIDER:"Páginas",REGISTRY_HELP:"Las páginas se refieren a actividades que aceptan dinero o lo favorecen: empresas, negocios, asociaciones, instituciones."},ERROR:{LOAD_CATEGORY_FAILED:"Fracaso en la carga de la lista de actividades",LOAD_RECORD_FAILED:"Fracaso durante la carga de la página",LOOKUP_RECORDS_FAILED:"Fracaso durante la ejecución de la búsqueda.",REMOVE_RECORD_FAILED:"Fracaso en la supresión de la página",SAVE_RECORD_FAILED:"Fracaso durante el respaldo",RECORD_NOT_EXISTS:"Página inexistente",GEO_LOCATION_NOT_FOUND:"Ciudad o código postal no encontrado"},INFO:{RECORD_REMOVED:"Página suprimida",RECORD_SAVED:"Página guardada"}},PROFILE:{PROFILE_DIVIDER:"Perfil Cesium+",PROFILE_DIVIDER_HELP:"Estos son datos auxiliares, almacenados fuera de la red monetaria.",NO_PROFILE_DEFINED:"Ningún perfil Cesium+",BTN_ADD:"Ingresar mi perfil",BTN_EDIT:"Editar mi perfil",BTN_DELETE:"Eliminar mi perfil",BTN_REORDER:"Reordenar",UID:"Seudónimo",TITLE:"Nombre, Apellido",TITLE_HELP:"Nombre, Apellido",DESCRIPTION:"A propósito de yo",DESCRIPTION_HELP:"A propósito de yo...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informaciónes generales",SOCIAL_NETWORKS_DIVIDER:"Redes sociales, sitios web",TECHNICAL_DIVIDER:"Informaciónes técnicas",MODAL_AVATAR:{TITLE:"Foto de perfil",SELECT_FILE_HELP:"Por favor, <b>elige un fichero imagen</b>, haciendo un clic sobre el botón por debajo :",BTN_SELECT_FILE:"Eligir una foto",RESIZE_HELP:"<b>Encuadra la imagen</b>, si es necesario. Un clic mantenido sobre la imagen permite desplazarla. Hace un clic sobre la zona abajo a la izquierda para hacer zoom.",RESULT_HELP:"<b>Aquí está el resultado</b> tal como está visible sobre su perfil :"},CONFIRM:{DELETE:"¿Estás seguro de que quieres <b>eliminar tu perfil Cesium+?</b><br/><br/>Esta operación es irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Error de eliminación de perfil",LOAD_PROFILE_FAILED:"Fracaso en la carga del perfil usuario.",SAVE_PROFILE_FAILED:"Fracaso durante el respaldo",INVALID_SOCIAL_NETWORK_FORMAT:"Formato no tomado en cuenta : por favor, indica una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección email (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fracaso durante el redimensionamiento de la imagen"},INFO:{PROFILE_REMOVED:"Perfil eliminado",PROFILE_SAVED:"Perfil respaldado"},HELP:{WARNING_PUBLIC_DATA:"Las informaciónes informadas en su perfil <b>están públicas</b> : visibles también por personas <b>no conectadas</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Actualizar desde la dirección",USE_GEO_POINT:"Aparecer en la tarjeta {{'COMMON.APP_NAME'|translate}} ?",LOADING_LOCATION:"Encontrar la dirección ...",LOCATION_DIVIDER:"Dirección",ADDRESS:"Calle",ADDRESS_HELP:"Calle, complemento de dirección...",CITY:"Ciudad",CITY_HELP:"Ciudad, País",DISTANCE:"Distancia máxima alrededor de la ciudad",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Ciudad, País",PROFILE_POSITION:"Posición del perfil",MODAL:{TITLE:"Búsqueda de dirección",SEARCH_HELP:"Ciudad, País",ALTERNATIVE_RESULT_DIVIDER:"Resultados alternativos para <b>{{address}}</b> :",POSITION:"Latitud/Longitud : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Requerido si una calle ha sido llenada",REQUIRED_FOR_LOCATION:"Campo obligatorio para aparecer en el mapa",INVALID_FOR_LOCATION:"Dirección desconocida",GEO_LOCATION_FAILED:"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.",ADDRESS_LOCATION_FAILED:"No se puede recuperar la posición de la dirección."}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Servicios en línea",SUBSCRIPTION_DIVIDER_HELP:"Los servicios en línea ofrecen servicios adicionales opcionales, delegados a un tercero.",BTN_ADD:"Agregar un servicio",BTN_EDIT:"Administrar mis servicios",NO_SUBSCRIPTION:"Ningún servicio definido",SUBSCRIPTION_COUNT:"Servicios / Suscripción",EDIT:{TITLE:"Servicios en línea",HELP_TEXT:"Gestione sus suscripciones y otros servicios en línea aquí",PROVIDER:"Proveedor:"},TYPE:{ENUM:{EMAIL:"Recibir notificaciones por correo electrónico"}},CONFIRM:{DELETE_SUBSCRIPTION:"Deseas <b>eliminar</b> esta suscripción ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error al cargar servicios en línea",ADD_SUBSCRIPTION_FAILED:"Error al agregar suscripción",UPDATE_SUBSCRIPTION_FAILED:"Error durante la actualización de la suscripción",DELETE_SUBSCRIPTION_FAILED:"Error al eliminar la suscripción"},MODAL_EMAIL:{TITLE:"Notificación por correo electrónico",HELP:"Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará únicamente para que sea visible para el proveedor de servicios.",EMAIL_LABEL:"Tu correo electrónico :",EMAIL_HELP:"carlos@dominio.com",FREQUENCY_LABEL:"Frecuencia de las notificaciones :",FREQUENCY_DAILY:"Diariamente",FREQUENCY_WEEKLY:"Semanal",PROVIDER:"Proveedor de servicio :"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Perfiles, notificaciónes, mensajes privados",ENABLE_TOGGLE:"Activar la extensión ?",ENABLE_MESSAGE_TOGGLE:"Activar los mensajes privados ?",ENABLE_SETTINGS_TOGGLE:"Activar el almacenamiento a distancia de las configuraciónes ?",PEER:"Dirección del nodo de datos",POPUP_PEER:{TITLE:"Nodo de datos",HELP:"Ingresa la dirección del nodo que quiere utilizar :",PEER_HELP:"servidor.dominio.com:puerto"},NOTIFICATIONS:{DIVIDER:"Notificaciónes",HELP_TEXT:"Activa los tipos de notificaciónes que usted desea recibir :",ENABLE_TX_SENT:"Notificar la validación de los <b>pagos emitidos</b> ?",ENABLE_TX_RECEIVED:"Notificar la validación de los <b>pagos recibidos</b> ?",ENABLE_CERT_SENT:"Notificar la validación de las <b>certificaciónes emitidas</b> ?",ENABLE_CERT_RECEIVED:"Notificar la validación de las <b>certificaciónes recibidas</b> ?"},CONFIRM:{ASK_ENABLE_TITLE:"Nuevas funcionalidades",ASK_ENABLE:'Nuevas funcionalidades son disponibles : <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Perfiles Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notificaciónes</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Mensajes privados</b>.</ul><br/>Fueron <b>desactivadas</b> en sus configuraciones.<br/><br/><b>Quiere usted activarlas</b> ?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinatario es obligatorio para el cifrado."}},EVENT:{NODE_STARTED:"Su nodo ES API <b>{{params[0]}}</b> es comenzado",NODE_BMA_DOWN:"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.",NODE_BMA_UP:"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.",MEMBER_JOIN:"Ahora usted está <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",MEMBER_LEAVE:"No está <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Usted ya no es un miembro de la moneda <b>{{params[0]}}</b>, la falta de no renovación o la falta de certificaciones.",MEMBER_REVOKE:"La revocación de su cuenta se ha hecho. Puede que no sea un miembro de la cuenta en moneda <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Su renovación de adhesión a la moneda <b>{{params[0]}}</b> fue <b>tomado en cuenta</b>.",TX_SENT:"Su <b>pago</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuado.",TX_SENT_MULTI:"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.",TX_RECEIVED:"Ha <b>recibido un pago</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Su <b>certificación</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuada.",CERT_RECEIVED:"Ha <b>recibido una certificación</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha contestado a su comentario sobre el referencia : <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre el referencia : <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo de datos <b> {{old}} </ b> dirección inalcanzable o no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?"},ERROR:{ES_CONNECTION_ERROR:'Nodo de datos <b>{{server}}</b> dirección inalcanzable o no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class="positive" ng-click="doQuickFix(\'settings\')"> configuración de extensión </a>.',ES_MAX_UPLOAD_BODY_SIZE:"El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos."}}),e.translations("fr-FR",{COMMON:{CATEGORY:"Catégorie",CATEGORIES:"Catégories",CATEGORY_SEARCH_HELP:"Recherche",LAST_MODIFICATION_DATE:"Mise à jour le",SUBMIT_BY:"Soumis par",BTN_PUBLISH:"Publier",BTN_PICTURE_DELETE:"Supprimer",BTN_PICTURE_FAVORISE:"Principale",BTN_PICTURE_ROTATE:"Tourner",BTN_ADD_PICTURE:"Ajouter une photo",NOTIFICATION:{TITLE:"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Tout marquer comme lu",NO_RESULT:"Aucune notification",SHOW_ALL:"Voir tout",LOAD_NOTIFICATIONS_FAILED:"Erreur de chargement des notifications"}},MENU:{REGISTRY:"Pages",USER_PROFILE:"Mon profil",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Compte pour une organisation",ORGANIZATION_ACCOUNT_HELP:"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vous pouvez <a ui-sref="app.edit_profile">saisir votre profil Cesium+</a> (optionnel) pour offrir une meilleure visibilité de votre compte. Ce profil sera stocké dans <b>un annuaire indépendant</b> de la monnaie, mais décentralisé.'},ERROR:{WS_CONNECTION_FAILED:"Cesium ne peut pas recevoir les notifications, à cause d'une erreur technique (connexion au noeud de données Cesium+).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggérer des identités à certifier...",BTN_ASK_CERTIFICATIONS_DOTS:"Demander à des membres de me certifier...",BTN_ASK_CERTIFICATION:"Demander une certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggérer des certifications",HELP:"Sélectionner vos suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Demander des certifications",HELP:"Sélectionner les destinataires"},SEARCH:{DIVIDER_PROFILE:"Comptes",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groupes"},CONFIRM:{SUGGEST_CERTIFICATIONS:"Êtes-vous sûr de vouloir <b>envoyer ces suggestions de certification</b> ?",ASK_CERTIFICATION:"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> ?",ASK_CERTIFICATIONS:"Êtes-vous sûr de vouloir <b>envoyer une demande de certification</b> à ces personnes ?"}},INVITATION:{TITLE:"Invitations",NO_RESULT:"Aucune invitation en attente",BTN_DELETE_ALL:"Supprimer toutes les invitations",BTN_DELETE:"Supprimer l'invitation",BTN_NEW_INVITATION:"Nouvelle invitation",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> demande votre certification',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> vous est suggéré pour certification',SUGGESTED_BY:'Suggestion envoyée par <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitations"},LIST:{TITLE:"Invitations"},NEW:{TITLE:"Nouvelle invitation",RECIPIENTS:"A",RECIPIENTS_HELP:"Destinataires de l'invitation",RECIPIENTS_MODAL_TITLE:"Destinataires",RECIPIENTS_MODAL_HELP:"Veuillez choisir les destinataires :",SUGGESTION_IDENTITIES:"Suggestions de certification",SUGGESTION_IDENTITIES_HELP:"Certifications à suggérer",SUGGESTION_IDENTITIES_MODAL_TITLE:"Suggestions",SUGGESTION_IDENTITIES_MODAL_HELP:"Veuillez choisir vos suggestions :"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La suppression des invitations est une <b>opération irréversible</b>.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer ?",SEND_INVITATIONS_TO_CERTIFY:"Êtes-vous sûr de vouloir <b>envoyer cette invitation à certifier</b> ?"},INFO:{INVITATION_SENT:"Invitation envoyée"},ERROR:{LOAD_INVITATIONS_FAILED:"Échec du chargement des invitations",REMOVE_INVITATION_FAILED:"Erreur lors de la suppression de l'invitation",REMOVE_ALL_INVITATIONS_FAILED:"Erreur lors de la suppression des invitations",SEND_INVITATION_FAILED:"Erreur lors de l'envoi de l'invitation",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitation illisible (format inconnu)</span> - envoyée par <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Commentaires",SHOW_MORE_COMMENTS:"Afficher les commentaires précédents",COMMENT_HELP:"Votre commentaire, question, etc.",COMMENT_HELP_REPLY_TO:"Votre réponse...",BTN_SEND:"Envoyer",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Répondre",REPLY_TO:"Réponse à :",REPLY_TO_LINK:"En réponse à ",REPLY_TO_DELETED_COMMENT:"En réponse à un commentaire supprimé",REPLY_COUNT:"{{replyCount}} réponses",DELETED_COMMENT:"Commentaire supprimé",ERROR:{FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Répondre",BTN_COMPOSE:"Nouveau message",BTN_WRITE:"Ecrire",NO_MESSAGE_INBOX:"Aucun message reçu",NO_MESSAGE_OUTBOX:"Aucun message envoyé",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"Vous avez <b>reçu un message</b><br/>de"},LIST:{INBOX:"Boite de réception",OUTBOX:"Messages envoyés",LAST_INBOX:"Nouveaux messages",LAST_OUTBOX:"Messages envoyés",BTN_LAST_MESSAGES:"Messages récents",TITLE:"Messages",SEARCH_HELP:"Recherche dans les messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Supprimer tous les messages"}},COMPOSE:{TITLE:"Nouveau message",TITLE_REPLY:"Répondre",SUB_TITLE:"Nouveau message",TO:"A",OBJECT:"Objet",OBJECT_HELP:"Objet",ENCRYPTED_HELP:"Veuillez noter que ce message sera chiffré avant envoi, afin que seul le destinataire puisse le lire, et qu'il soit assuré que vous soyez bien son auteur.",MESSAGE:"Message",MESSAGE_HELP:"Contenu du message",CONTENT_CONFIRMATION:"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?"},VIEW:{TITLE:"Message",SENDER:"Envoyé par",RECIPIENT:"Envoyé à",NO_CONTENT:"Message vide",DELETE:"Supprimer le message"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.",MARK_ALL_AS_READ:"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lus</b> ?",USER_HAS_NO_PROFILE:"Cette identité n'a aucun profil Cesium+. Il se peut qu'elle n'utilise pas l'extension Cesium+, et <b>ne consultera donc pas votre message</b>.<br/><br/>Êtes-vous sûr de vouloir <b>continuer</b> malgré tout ?"},INFO:{MESSAGE_REMOVED:"Message supprimé",All_MESSAGE_REMOVED:"Tous les messages ont été supprimés",MESSAGE_SENT:"Message envoyé"},ERROR:{SEND_MSG_FAILED:"Erreur lors de l'envoi du message.",LOAD_MESSAGES_FAILED:"Erreur lors de la récupération des messages.",LOAD_MESSAGE_FAILED:"Erreur lors de la récupération du message.",MESSAGE_NOT_READABLE:"Lecture du message impossible.",USER_NOT_RECIPIENT:"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.",NOT_AUTHENTICATED_MESSAGE:"L'authenticité du message est douteuse ou son contenu est corrompu.",REMOVE_MESSAGE_FAILED:"Erreur de suppression du message",MESSAGE_CONTENT_TOO_LONG:"Valeur trop longue ({{maxLength}} caractères max).",MARK_AS_READ_FAILED:"Impossible de marquer le message comme 'lu'.",LOAD_NOTIFICATIONS_FAILED:"Erreur lors de la récupération des notifications de messages.",REMOVE_All_MESSAGES_FAILED:"Erreur lors de la suppression de tous les messages.",MARK_ALL_AS_READ_FAILED:"Erreur lors du marquage des messages comme lus.",RECIPIENT_IS_MANDATORY:"Le destinataire est obligatoire."}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Numéro de bloc, hash, clé publique, etc.",POPOVER_FILTER_TITLE:"Filtres",HEADER_MEDIAN_TIME:"Date / Heure",HEADER_BLOCK:"Bloc #",HEADER_ISSUER:"Noeud émetteur",BTN_LAST:"Derniers blocs",DISPLAY_QUERY:"Afficher la requête",HIDE_QUERY:"Masquer la requête",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Entrées/sorties de membres',EXISTING_TRANSACTION:'<b class="ion-card"></b> Avec transactions',PERIOD:'<b class="ion-clock"></b> Entre <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) et <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Calculé par <b class="ion-key"></b> {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transactions concernant <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Erreur de la recherche des blocs."}},GROUP:{GENERAL_DIVIDER:"Informations générales",LOCATION_DIVIDER:"Adresse",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux et site web",TECHNICAL_DIVIDER:"Informations techniques",CREATED_TIME:"Créé {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Invitations"},LOOKUP:{TITLE:"Groupes",SEARCH_HELP:"Nom de groupe, mots, lieu, etc.",LAST_RESULTS_LIST:"Nouveaux groupes :",OPEN_RESULTS_LIST:"Groupes ouverts :",MANAGED_RESULTS_LIST:"Groupes fermés :",BTN_LAST:"Nouveaux groupes",BTN_NEW:"J'ajoute un groupe"},TYPE:{TITLE:"Nouveau groupe",SELECT_TYPE:"Type de groupe :",OPEN_GROUP:"Groupe ouvert",OPEN_GROUP_HELP:"Un groupe ouvert est accessible par n'importe quel membre de la monnaie.",MANAGED_GROUP:"Groupe administré",MANAGED_GROUP_HELP:"un groupe administré est géré par des administrateurs et des modérateurs, qui peuvent accepter, refuser ou exclure un membre en son sein.",ENUM:{OPEN:"Groupe ouvert",MANAGED:"Groupe administré"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Options",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer ce groupe ?<br/><br/>Cette opération est irréversible."},EDIT:{TITLE:"Groupe",TITLE_NEW:"Nouveau groupe",RECORD_TITLE:"Titre",RECORD_TITLE_HELP:"Titre",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description"},ERROR:{SEARCH_GROUPS_FAILED:"Échec de la recherche de groupes",REMOVE_RECORD_FAILED:"Erreur de la suppression du groupe"},INFO:{RECORD_REMOVED:"Groupe supprimé"}},REGISTRY:{CATEGORY:"Activité principale",GENERAL_DIVIDER:"Informations générales",LOCATION_DIVIDER:"Adresse",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux et site web",TECHNICAL_DIVIDER:"Informations techniques",BTN_SHOW_WOT:"Personnes",BTN_SHOW_WOT_HELP:"Rechercher des personnes",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Rechercher des pages",BTN_NEW:"Créer une page",MY_PAGES:"Mes pages",NO_PAGE:"Aucune page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"Quoi, Qui : restaurant, Chez Marcel, ...",BTN_ADD:"Nouveau",BTN_LAST_RECORDS:"Pages récentes",BTN_ADVANCED_SEARCH:"Recherche avancée",BTN_OPTIONS:"Recherche avancée",TYPE:"Type de page",LOCATION_HELP:"Où : Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Pages récentes",LAST_RECORD_COUNT_LOCATION:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Options avancées ?"}},VIEW:{TITLE:"Annuaire",CATEGORY:"Activité principale :",LOCATION:"Adresse :",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible."},TYPE:{TITLE:"Types",SELECT_TYPE:"Type de page :",ENUM:{SHOP:"Commerce local",COMPANY:"Entreprise",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edition",TITLE_NEW:"Nouvelle page",RECORD_TYPE:"Type de page",RECORD_TITLE:"Nom",RECORD_TITLE_HELP:"Nom",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description de l'activité",RECORD_ADDRESS:"Rue",RECORD_ADDRESS_HELP:"Rue, bâtiment...",RECORD_CITY:"Ville",RECORD_CITY_HELP:"Ville",RECORD_SOCIAL_NETWORKS:"Réseaux sociaux et site web",RECORD_PUBKEY:"Clé publique",RECORD_PUBKEY_HELP:"Clé publique de réception des paiements"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Erreur de chargement de la liste des activités",LOAD_RECORD_FAILED:"Erreur lors du chargement de la page",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",REMOVE_RECORD_FAILED:"Erreur de la suppression de la page",SAVE_RECORD_FAILED:"Erreur lors de la sauvegarde",RECORD_NOT_EXISTS:"Page inexistante",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Page supprimée",RECORD_SAVED:"Page sauvegardée"}},PROFILE:{PROFILE_DIVIDER:"Profil Cesium+",PROFILE_DIVIDER_HELP:"Il s'agit de données annexes, stockées en dehors du réseau de la monnaie.",NO_PROFILE_DEFINED:"Aucun profil saisi",BTN_ADD:"Saisir mon profil",BTN_EDIT:"Editer mon profil",BTN_DELETE:"Supprimer mon profil",BTN_REORDER:"Réordonner",UID:"Pseudonyme",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"A propos de moi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informations générales",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux, sites web",TECHNICAL_DIVIDER:"Informations techniques",MODAL_AVATAR:{TITLE:"Photo de profil",SELECT_FILE_HELP:"Veuillez <b>choisir un fichier image</b>, en cliquant sur le bouton ci-dessous :",BTN_SELECT_FILE:"Choisir une photo",RESIZE_HELP:"<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.",RESULT_HELP:"<b>Voici le résultat</b> tel que visible sur votre profil :"},CONFIRM:{DELETE:"Êtes-vous sûr de vouloir <b>supprimer votre profil Cesium+ ?</b><br/><br/>Cette opération est irréversible."},ERROR:{REMOVE_PROFILE_FAILED:"Erreur de suppression du profil",LOAD_PROFILE_FAILED:"Erreur de chargement du profil utilisateur",SAVE_PROFILE_FAILED:"Erreur lors de la sauvegarde",INVALID_SOCIAL_NETWORK_FORMAT:"Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Erreur lors du redimensionnement de l'image"},INFO:{PROFILE_REMOVED:"Profil supprimé",PROFILE_SAVED:"Profil sauvegardé"},HELP:{WARNING_PUBLIC_DATA:"Les informations renseignées dans votre profil <b>sont publiques</b> : visibles y compris par des personnes <b>non connectées</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trouver mon adresse sur la carte",USE_GEO_POINT:"Apparaître sur les cartes {{'COMMON.APP_NAME'|translate}} ?",LOADING_LOCATION:"Recherche de l'adresse...",LOCATION_DIVIDER:"Adresse",ADDRESS:"Rue",ADDRESS_HELP:"Rue, complément d'adresse...",CITY:"Ville",CITY_HELP:"Code postal, Ville, Pays",DISTANCE:"Distance maximale autour de la ville",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Code postal, Ville",PROFILE_POSITION:"Position du profil",MODAL:{TITLE:"Recherche de l'adresse",SEARCH_HELP:"Ville, Code postal, Pays",ALTERNATIVE_RESULT_DIVIDER:"Résultats alternatifs pour <b>{{address}}</b> :",POSITION:"Lat/Lon : {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Champ obligatoire (car une rue est saisie)",REQUIRED_FOR_LOCATION:"Champ obligatoire pour apparaître sur la carte",INVALID_FOR_LOCATION:"Adresse inconnue",GEO_LOCATION_FAILED:"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.",ADDRESS_LOCATION_FAILED:"Impossible de récupérer la position à partir de l'adresse"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Services en ligne",SUBSCRIPTION_DIVIDER_HELP:"Les services en ligne offrent des services supplémentaires optionnels, délégués à un tiers.",BTN_ADD:"Ajouter un service",BTN_EDIT:"Gérer mes services",NO_SUBSCRIPTION:"Aucun service utilisé",SUBSCRIPTION_COUNT:"Services / Abonnements",EDIT:{TITLE:"Services en ligne",HELP_TEXT:"Gérez ici vos abonnements et autres services en ligne",PROVIDER:"Prestataire :"},TYPE:{ENUM:{EMAIL:"Recevoir les notifications par email"}},CONFIRM:{DELETE_SUBSCRIPTION:"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Erreur lors du chargement des services en ligne",ADD_SUBSCRIPTION_FAILED:"Erreur de l'envoi de l'abonnement",UPDATE_SUBSCRIPTION_FAILED:"Erreur de la mise à jour de l'abonnement",DELETE_SUBSCRIPTION_FAILED:"Erreur lors de la suppression de l'abonnement"},MODAL_EMAIL:{TITLE:"Notification par email",HELP:"Remplissez ce formulaire pour <b>être notifié par email</b> des événements de votre compte.<br/>Votre adresse email sera chiffrée pour n'être visible que par le prestataire de service.",EMAIL_LABEL:"Votre email :",EMAIL_HELP:"jean.dupond@domaine.com",FREQUENCY_LABEL:"Fréquence des notifications :",FREQUENCY_DAILY:"Journalier",FREQUENCY_WEEKLY:"Hebdomadaire",PROVIDER:"Prestataire du service :"}},DOCUMENT:{HASH:"Hash : ",LOOKUP:{TITLE:"Recherche de documents",BTN_ACTIONS:"Actions",SEARCH_HELP:"Emetteur:AAA*, temps:1508406169",LAST_DOCUMENTS:"Derniers documents",SHOW_QUERY:"Voir la requête",HIDE_QUERY:"Masquer la requête",HEADER_TIME:"Date/Heure",HEADER_ISSUER:"Emetteur",HEADER_RECIPIENT:"Destinataire",READ:"Lu",BTN_REMOVE:"Supprimer ce document",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Supprimer ces documents..."}},INFO:{REMOVED:"Document supprimé"},CONFIRM:{
 REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Erreur lors de la recherche de documents",REMOVE_FAILED:"Erreur lors de la suppression du document",REMOVE_ALL_FAILED:"Erreur lors de la suppression des documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Profils, notifications, messages privés",ENABLE_TOGGLE:"Activer l'extension ?",ENABLE_REMOTE_STORAGE:"Activer le stockage distant ?",ENABLE_REMOTE_STORAGE_HELP:"Permet de stockage (chiffré) de vos paramètres sur les noeuds Cesium+",ENABLE_MESSAGE_TOGGLE:"Activer les messages privés ?",PEER:"Adresse du nœud de données",POPUP_PEER:{TITLE:"Nœud de données",HELP:"Saisissez l'adresse du nœud que vous voulez utiliser :",PEER_HELP:"serveur.domaine.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Activez les types de notifications que vous souhaitez recevoir :",ENABLE_TX_SENT:"Notifier les <b>paiements émis</b> ?",ENABLE_TX_RECEIVED:"Notifier les <b>paiements reçus</b> ?",ENABLE_CERT_SENT:"Notifier les <b>certifications émises</b> ?",ENABLE_CERT_RECEIVED:"Notifier les <b>certifications reçues</b> ?",ENABLE_HTML5_NOTIFICATION:"Avertir à chaque nouvelle notification ?",ENABLE_HTML5_NOTIFICATION_HELP:"Ouvre une petite fenêtre à chaque nouvelle notification."},CONFIRM:{ASK_ENABLE_TITLE:"Fonctionnalités optionnelles",ASK_ENABLE:'L\'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Profils Cesium+</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Messages privés</b>.<li>&nbsp;&nbsp;<b><i class="icon ion-location"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l\'extension ?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinataire est obligatoire pour le chiffrement."}},EVENT:{NODE_STARTED:"Votre noeud ES API <b>{{params[0]}}</b> est démarré",NODE_BMA_DOWN:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.",NODE_BMA_UP:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.",MEMBER_JOIN:"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_LEAVE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_EXCLUDE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b>, faute de non renouvellement ou par manque de certifications.",MEMBER_REVOKE:"La révocation de votre compte a été effectuée. Il ne pourra plus être un compte membre de la monnaie <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.",TX_SENT:"Votre <b>paiement</b> à <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectué.",TX_SENT_MULTI:"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.",TX_RECEIVED:"Vous avez <b>reçu un paiement</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Votre <b>certification</b> à <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectuée.",CERT_RECEIVED:"Vous avez <b>reçu une certification</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> a commenté votre référencement : <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> a modifié son commentaire sur votre référencement : <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> a répondu à votre commentaire sur le référencement : <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> a modifié sa réponse à votre commentaire sur le référencement : <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nœud de données <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud de données <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:"Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Cesium va continuer à fonctionner, <b>sans l'extension Cesium+</b> (profils utilisateur, messages privés, cartes et graphiques)<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud de données dans les <a class=\"positive\" ng-click=\"doQuickFix('settings')\">paramètres de l'extension</a>.",ES_MAX_UPLOAD_BODY_SIZE:"Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos."}}),e.translations("it-IT",{COMMON:{CATEGORY:"Categoria",CATEGORIES:"Categorie",CATEGORY_SEARCH_HELP:"Ricerca",LAST_MODIFICATION_DATE:"Aggiornato il ",SUBMIT_BY:"Inviato da",BTN_PUBLISH:"Pubblicare",BTN_PICTURE_DELETE:"Eliminare",BTN_PICTURE_FAVORISE:"Predefinito",BTN_PICTURE_ROTATE:"Girare",BTN_ADD_PICTURE:"Aggiungere foto",NOTIFICATIONS:{TITLE:"Notifiche",MARK_ALL_AS_READ:"Segna tutte come lette",NO_RESULT:"Nessuna notifica",SHOW_ALL:"Mostrare tutte",LOAD_NOTIFICATIONS_FAILED:"Impossibile caricare le notifiche"}},MENU:{REGISTRY:"Pagine",USER_PROFILE:"Mio profilo",MESSAGES:"Messaggi",NOTIFICATIONS:"Notifiche",INVITATIONS:"Inviti"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Conto per enti",ORGANIZATION_ACCOUNT_HELP:"Se rappresenta un'azienda, un'associazione, etc.<br/>Questo conto non potrà creare il Dividendo Universale."},EVENT:{MEMBER_WITHOUT_PROFILE:'Per ottenere sue certificazioni più velocemente, riempire le informazioni<a ui-sref="app.edit_profile">del suo profilo</a>. I membri della rete si fidano più volontieri di profili verificabili.'},ERROR:{WS_CONNECTION_FAILED:"Cesium non può ricevere notifiche a causa di un problema tecnico (di conessione al data node Cesium+).<br/><br/>Se il problema persiste, le chiediamo di <b>scegliere un'altro data node</b> nelle impostazioni di Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggerire delle identità da certificare..",BTN_ASK_CERTIFICATIONS_DOTS:"Chiedere una certificazione ai membri...",BTN_ASK_CERTIFICATION:"Chiedere una certificazione",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggerire delle certificazioni",HELP:"Scegliere i suoi suggerimenti, aiuti"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Chiedere delle certificazioni",HELP:"Selezionare un ricevente"},SEARCH:{DIVIDER_PROFILE:"Conti",DIVIDER_PAGE:"Pagine",DIVIDER_GROUP:"Gruppi"},CONFIRM:{SUGGEST_CERTIFICATIONS:"E’ sicuro(a) di voler <b>suggerire queste certificazioni</b> ?",ASK_CERTIFICATION:" E’ sicuro(a) di voler  <b>chiedere una certificazione</b> ?",ASK_CERTIFICATIONS:" E’ sicuro(a) di voler <b>chiedere una certificazione</b> a questi membri ?"}},INVITATION:{TITLE:"Invitazioni",NO_RESULT:"Nessun invito ricevuto",BTN_DELETE_ALL:"Cancellare tutti gli inviti",BTN_DELETE:"Cancellare l'invito",BTN_NEW_INVITATION:"Nuovo invito",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> ti ha chiesto una certificazione',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> è proposto per ricevere una certificazione',SUGGESTED_BY:'Suggerimento inviato da by <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Inviti"},LIST:{TITLE:"Inviti"},NEW:{TITLE:"Nuovo invito",RECIPIENTS:"A",RECIPIENTS_HELP:"Riceventi dell'invito",RECIPIENTS_MODAL_TITLE:"Riceventi",RECIPIENTS_MODAL_HELP:"Scegliere riceventi:",SUGGESTION_IDENTITIES:"Suggerimenti di identità da certificare",SUGGESTION_IDENTITIES_HELP:"Suggerimenti di certificazioni",SUGGESTION_IDENTITIES_MODAL_TITLE:"Suggerimenti",SUGGESTION_IDENTITIES_MODAL_HELP:"Scegli tuoi sugerimenti:"},CONFIRM:{DELETE_ALL_CONFIRMATION:"Cancellare degli inviti è <b>una operazione irreversibile</b>.<br/><br/><b>Sei sicuro/a</b> di voler proseguire",SEND_INVITATIONS_TO_CERTIFY:"<b>Sei sicuro/a</b> di voler <b>inviare questo suggerimento di certificazione</b> ?"},INFO:{INVITATION_SENT:"Invito inviato"},ERROR:{LOAD_INVITATIONS_FAILED:"Errore nel caricare gli inviti",REMOVE_INVITATION_FAILED:"Errore nel cancellare gli inviti",REMOVE_ALL_INVITATIONS_FAILED:"Errore nel cancellare inviti",SEND_INVITATION_FAILED:"Errore nel invio degli inviti",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invito illegibile (formatto sconosciuto)</span> - inviato da <a ui-sref="app.wot_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Commenti",SHOW_MORE_COMMENTS:"Mostrare commenti precedenti",COMMENT_HELP:"Suo commento o domanda...",COMMENT_HELP_REPLY_TO:"Sua risposta...",BTN_SEND:"Inviare",POPOVER_SHARE_TITLE:"Messaggio #{{number}}",REPLY:"Rispondere",REPLY_TO:"Rispondere a:",REPLY_TO_LINK:"In risposta a",REPLY_TO_DELETED_COMMENT:"In risposta ad un commento cancellato",REPLY_COUNT:"{{replyCount}} risposte",DELETED_COMMENT:"Commento cancellato",ERROR:{FAILED_SAVE_COMMENT:"Salvare il commento cancellato",FAILED_REMOVE_COMMENT:"Cancellazione del commento fallita"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Rispondere",BTN_COMPOSE:"Nuovo messaggio",BTN_WRITE:"Scrivere",NO_MESSAGE_INBOX:"Nessun messaggio ricevuto",NO_MESSAGE_OUTBOX:"Nessun messaggio inviato",NOTIFICATIONS:{TITLE:"Messaggi",MESSAGE_RECEIVED:"Hai <b>ricevuto un messaggio/b><br/>da"},LIST:{INBOX:"In entrata",OUTBOX:"In uscita",TITLE:"Messaggi privati",POPOVER_ACTIONS:{TITLE:"Opzioni",DELETE_ALL:"Eliminare tutti i messaggi"}},COMPOSE:{TITLE:"Nuovo messaggio",TITLE_REPLY:"Rispondere",SUB_TITLE:"Nuovo messaggio",TO:"A",OBJECT:"Oggetto",OBJECT_HELP:"Oggetto",ENCRYPTED_HELP:"La informiamo che questo messaggio verrà criptato prima della sua spedizione in modo che solo il destinatario lo possa leggere e essere sicuro che ne sia Lei l'autore.",MESSAGE:"Messaggio",MESSAGE_HELP:"Contenuto del messaggio",CONTENT_CONFIRMATION:"Nessun contenuto. <br/><br/>E’ sicura di voler inviare questo messaggio?"},VIEW:{TITLE:"Messaggio",SENDER:"Inviato da",RECIPIENT:"Inviato a",NO_CONTENT:"Messaggio vuoto",DELETE:"Cancellare il messaggio"},CONFIRM:{REMOVE:"E’ sicuro/a di voler <b>eliminare il messaggio</b>?<br/><br/> Questa operazione è irreversibile.",REMOVE_ALL:"E’ sicuro/a di voler <b>eliminare tutti i messaggi</b>?<br/><br/> Questa operazione è irreversibile.",MARK_ALL_AS_READ:"E’ sicuro/a di voler <b>segnare tutti i messaggi come letti/b>?",USER_HAS_NO_PROFILE:"Questa identità non ha un profilo Cesium+. Pertanto non può <b>leggere il suo messaggio</b>.<br/><br/>E’ sicuro/a di voler <b>continuare</b>?"},INFO:{MESSAGE_REMOVED:"Messaggio eliminato correttamente",All_MESSAGE_REMOVED:"Messaggi eliminati correttamente",MESSAGE_SENT:"Messaggio inviato"},ERROR:{SEND_MSG_FAILED:"Errore nella spedizione del messaggio.",LOAD_MESSAGES_FAILED:"Errore durante il caricamento dei messaggi.",LOAD_MESSAGE_FAILED:"Errore durante il caricamento del messaggio.",MESSAGE_NOT_READABLE:"Impossibile leggere il messaggio.",USER_NOT_RECIPIENT:"Lei non è il destinatario del messaggio: impossibile leggerlo.",NOT_AUTHENTICATED_MESSAGE:"Impossibile verificare l'autenticità del messaggio o contenuto corrotto.",REMOVE_MESSAGE_FAILED:"Errore avvenuto durante l'eliminazione del messaggio",MESSAGE_CONTENT_TOO_LONG:"Il contenuto supera il limite ({{maxLength}} caratteri ammessi).",MARK_AS_READ_FAILED:"Impossibile segnare il messaggio come 'letto'.",LOAD_NOTIFICATIONS_FAILED:"Errore nel caricare le notifiche.",REMOVE_All_MESSAGES_FAILED:"Errore avvenuto durante l'eliminazione dei messaggi.",MARK_ALL_AS_READ_FAILED:"Errore avvenuto nel segnare i messaggi come 'letti",RECIPIENT_IS_MANDATORY:"Destinatario obbligatorio"}},BLOCKCHAIN:{LOOKUP:{SEARCH_HELP:"Numero di blocco, hash...",POPOVER_FILTER_TITLE:"Filtro",HEADER_MEDIAN_TIME:"Data / Ora",HEADER_BLOCK:"Blocco #",HEADER_ISSUER:"Peer proprietario",BTN_LAST:"Ultimi blocchi",DISPLAY_QUERY:"Visualizzare query",HIDE_QUERY:"Nascondere query",TX_SEARCH_FILTER:{MEMBER_FLOWS:'<b class="ion-person"></b> Input/output Membri',EXISTING_TRANSACTION:'<b class="ion-card"></b> hanno transazioni',PERIOD:'<b class="ion-clock"></b> Tra <b class="gray">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) e <b class="gray">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})',ISSUER:'<b class="ion-android-desktop"></b> Calcolato da {{params[1]|formatPubkey}}',TX_PUBKEY:'<b class="ion-card"></b> Transazioni legate a  <b class="ion-key"></b> {{params[1]|formatPubkey}}'}},ERROR:{SEARCH_BLOCKS_FAILED:"Errore durante la ricerca dei blocchi."}},GROUP:{GENERAL_DIVIDER:"Informazioni generali",LOCATION_DIVIDER:"Indirizzo",SOCIAL_NETWORKS_DIVIDER:"Presenza sui social e/o sito web",TECHNICAL_DIVIDER:"Dati tecnici",CREATED_TIME:"Creato {{creationTime|formatFromNow}}",NOTIFICATIONS:{TITLE:"Inviti"},LOOKUP:{TITLE:"Gruppi",SEARCH_HELP:"Nome del grupo, parole chiavi, luogo, etc.",LAST_RESULTS_LIST:"Nuovi gruppi :",OPEN_RESULTS_LIST:"Gruppi aperti :",MANAGED_RESULTS_LIST:"Gruppi chiusi :",BTN_LAST:"Nuovi gruppi",BTN_NEW:"Aggiungo un grupo!"},TYPE:{TITLE:"Nuovo gruppo",SELECT_TYPE:"Tipo di gruppo :",OPEN_GROUP:"Gruppo aperto",OPEN_GROUP_HELP:"Un gruppo aperto è accessibile da qualsiasi membro della moneta.",MANAGED_GROUP:"Gruppo amministrato",MANAGED_GROUP_HELP:"un gruppo amministrato è gestito da amministratori e moderatori, che possono accetare, rifiutare o escludere membri del gruppo.",ENUM:{OPEN:"Gruppo aperto",MANAGED:"Gruppo amministrato"}},VIEW:{POPOVER_SHARE_TITLE:"{{title}}",MENU_TITLE:"Opzioni",REMOVE_CONFIRMATION:"Sei sicuro/a di voler chiudere questo gruppo ?<br/><br/>Questa operazione è irreversibile."},EDIT:{TITLE:"Gruppo",TITLE_NEW:"Nuovo gruppo",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo",RECORD_DESCRIPTION:"Descrizione",RECORD_DESCRIPTION_HELP:"Descrizione"},ERROR:{SEARCH_GROUPS_FAILED:"Errore nella ricerca di gruppi",REMOVE_RECORD_FAILED:"Errore nel chiudere il gruppo"},INFO:{RECORD_REMOVED:"Gruppo eliminato"}},REGISTRY:{CATEGORY:"Attività principale",GENERAL_DIVIDER:"Informazioni di base",LOCATION_DIVIDER:"Indirizzo",SOCIAL_NETWORKS_DIVIDER:"Presenza sui social, sito web",TECHNICAL_DIVIDER:"Dati tecnici",BTN_SHOW_WOT:"Persone",BTN_SHOW_WOT_HELP:"Cercare persone",BTN_SHOW_PAGES:"Pagine",BTN_SHOW_PAGES_HELP:"Cercare pagine",BTN_NEW:"Aggiungere",MY_PAGES:"Mie pagine",NO_PAGE:"Nessuna pagina",SEARCH:{TITLE:"Pagine",SEARCH_HELP:"Che, chi: parrucchiere, Pizza Efisio, ...",BTN_ADD:"Nuovo",BTN_LAST_RECORDS:"Pagine recenti",BTN_ADVANCED_SEARCH:"Ricerca avanzata",BTN_OPTIONS:"Ricerca avanzata",TYPE:"Tipo di ente",LOCATION_HELP:"Città",RESULTS:"Risultati",RESULT_COUNT_LOCATION:"{{count}} risultato{{count>0?'i':''}}, vicino a {{location}}",RESULT_COUNT:"{{count}} risultato{{count>0?'i':''}}",LAST_RECORDS:"Pagine recenti:",LAST_RECORD_COUNT_LOCATION:"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}, vicino a{{location}}",LAST_RECORD_COUNT:"{{count}} pagina{{count>0?'e':''}} recente{{count>0?'i':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Opzioni avanzate ?"}},VIEW:{TITLE:"Annuario",CATEGORY:"Attività principale:",LOCATION:"Indirizzo:",MENU_TITLE:"Impostazioni",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"E’ sicuro/a di voler eliminare questo riferimento?<br/><br/>Questa operazione è irreversibile."},TYPE:{TITLE:"Nuovo riferimento",SELECT_TYPE:"Tipo di ente/organismo:",ENUM:{SHOP:"Negozi locali",COMPANY:"Azienda",ASSOCIATION:"Associazione",INSTITUTION:"Istituto"}},EDIT:{TITLE:"Modificare",TITLE_NEW:"Nuovo riferimento",RECORD_TYPE:"Tipo di ente",RECORD_TITLE:"Nome",RECORD_TITLE_HELP:"Nome",RECORD_DESCRIPTION:"Descrizione",RECORD_DESCRIPTION_HELP:"Descrivere l'attività",RECORD_ADDRESS:"Indirizzo",RECORD_ADDRESS_HELP:"Indirizzo: Strada, numero civico...",RECORD_CITY:"Città",RECORD_CITY_HELP:"Città, Paese",RECORD_SOCIAL_NETWORKS:"Presenza sui social e/o sito web",RECORD_PUBKEY:"Chiave pubblica",RECORD_PUBKEY_HELP:"Chiave pubblica per ricevere pagamenti"},WALLET:{REGISTRY_DIVIDER:"Pagine",REGISTRY_HELP:"Le pagine sono un elenco dei profesionisti che accettano o favoriscono: negozi, aziende, associazioni, istituti..."},ERROR:{LOAD_CATEGORY_FAILED:"Errore nel caricamento delle attività principali",LOAD_RECORD_FAILED:"Caricamento fallito",LOOKUP_RECORDS_FAILED:"Errore nel caricare i dati",REMOVE_RECORD_FAILED:"Errore nella cancellazione",SAVE_RECORD_FAILED:"Impossibile salvare",RECORD_NOT_EXISTS:"Inesistente",GEO_LOCATION_NOT_FOUND:"Città o CAP inesistente"},INFO:{RECORD_REMOVED:"Pagina eliminata con successo.",RECORD_SAVED:"Pagina salvata"}},PROFILE:{PROFILE_DIVIDER:"Profilo Cesium+",PROFILE_DIVIDER_HELP:"Si tratta qui di data esterni, salvati fuori della rete della moneta.",NO_PROFILE_DEFINED:"Nessun profilo Cesium+",BTN_ADD:"Creare mio profilo",BTN_EDIT:"Modificare mio profilo",UID:"Pseudonimo",TITLE:"Cognome, Nome",TITLE_HELP:"Nome",DESCRIPTION:"A proposito di me",DESCRIPTION_HELP:"A proposito di me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informazioni generali",SOCIAL_NETWORKS_DIVIDER:"Presenza sui social e sito/i web",TECHNICAL_DIVIDER:"Dati tecnici",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Scegliere un'immagine</b>, cliccando sul bottone qui sotto:",BTN_SELECT_FILE:"Scegliere un'immagine",RESIZE_HELP:"<b>Ritagliare l'immagine</b> se necessario. Cliccare sull'immagine permette di spostarla. Cliccando nella zona a basso sinistra permette di fare uno zoom-in.",RESULT_HELP:"<b>Questo è il risultato</b> come visibile sul suo profilo:"},ERROR:{LOAD_PROFILE_FAILED:"Impossibile caricare il profilo dell’utente.",SAVE_PROFILE_FAILED:"Impossibile salvare il profilo",INVALID_SOCIAL_NETWORK_FORMAT:"Formatto scorretto: URL sbagliato.<br/><br/>Esempi: :<ul><li>- Una pagina Facebook (https://www.facebook.com/user)</li><li>- Un sito: (http://www.domain.com)</li><li>- Un indirizzo mail: (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Errore nel ritagliare l'immagine"},INFO:{PROFILE_SAVED:"Profilo salvato"},HELP:{WARNING_PUBLIC_DATA:"La informiamo che le informazioni qui pubblicate <b>sono pubbliche</b>: sono anche visibili <b>da gente non registrata/b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trovare mio indirizzo sulla mappa",USE_GEO_POINT:"Geo-localizzare (raccomandato)?",LOADING_LOCATION:"Cercando indirizzo...",LOCATION_DIVIDER:"Posizione",ADDRESS:"Indirizzo",ADDRESS_HELP:"Indirizzo (opzionale)",CITY:"Città",CITY_HELP:"Città, Paese",DISTANCE:"Distanza massimale intorno alla città",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Città, CAP",MODAL:{TITLE:"Cercare indirizzo",SEARCH_HELP:"Città, Paese",ALTERNATIVE_RESULT_DIVIDER:"Risultati alternativi <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} {{lon}}"},ERROR:{REQUIRED_FOR_LOCATION:"Campo obbligatorio per apparire sulla mappa",INVALID_FOR_LOCATION:"Indirizzo sconosciuto",GEO_LOCATION_FAILED:"Impossibile trovare sua posizione. Utilizzi il bottone di ricerca.",ADDRESS_LOCATION_FAILED:"Indirizzo non trovato"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Servizi online",SUBSCRIPTION_DIVIDER_HELP:"I servizi online offrono servizi addizionali opzionali, delegati ad terzi.",BTN_ADD:"Aggiungere un servizio",BTN_EDIT:"Gestire miei servizi",NO_SUBSCRIPTION:"Nessun servizio utilizzato",SUBSCRIPTION_COUNT:"Servizi/ Abbonamenti",EDIT:{TITLE:"Servizi online",HELP_TEXT:"Qui si possono gestire gli abbonamenti e/o altri servizi online",PROVIDER:"Prestatore :"},TYPE:{ENUM:{EMAIL:"Ricevere notifiche per posta elettronica"}},CONFIRM:{DELETE_SUBSCRIPTION:"Sei sicuro/a di voler <b>cancellare questo abbonamento</b> ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Errore nel caricamento dei servizi online",ADD_SUBSCRIPTION_FAILED:"Errore nel invio dell' abbonamento",UPDATE_SUBSCRIPTION_FAILED:"Errore nel aggiornamento dell' abbonamento",DELETE_SUBSCRIPTION_FAILED:"Errore nella cancellazine dell' abbonamento"},MODAL_EMAIL:{TITLE:"Notifiche per posta elettronica",HELP:"Riempi questo formulario per <b>essere notificato/a per e-mail</b> degli eventi che avvengono sul tuo conto.<br/>Tuo indizzo mail sarà cifrato e solo il prestatore del servizio lo potrà vedere.",EMAIL_LABEL:"Tuo indirizzo mail :",EMAIL_HELP:"cristiana.leonardi@dominio.com",FREQUENCY_LABEL:"Frequenza delle notifiche :",FREQUENCY_DAILY:"Quotidiano",FREQUENCY_WEEKLY:"Settimanale",PROVIDER:"Prestatore del servizio :"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Ricerca di documenti",BTN_ACTIONS:"Azioni",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS:"Ultimi documenti",SHOW_QUERY:"Visualizzare la richiesta",HIDE_QUERY:"Nacondere la richiesta",HEADER_TIME:"Data/Ora",HEADER_ISSUER:"Emittente",HEADER_RECIPIENT:"Destinatario",READ:"Letto",BTN_REMOVE:"Eliminare questo documento",POPOVER_ACTIONS:{TITLE:"Azioni",REMOVE_ALL:"Eliminare questi documenti..."}},INFO:{REMOVED:"Documento eliminato"},CONFIRM:{REMOVE:"Sei sicuro/a di voler <b>eliminare questo documento</b> ?",REMOVE_ALL:"Si sicuro/a di voler <b>eliminare questi documenti</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Errore nella ricerca dei documenti",REMOVE_FAILED:"Errore nell'eliminazione del documento",REMOVE_ALL_FAILED:"Errore nell'eliminazione dei documenti"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Profili di utenti, notifiche, messaggi privati",ENABLE_TOGGLE:"Abilitare l'estensione ?",ENABLE_MESSAGE_TOGGLE:"Abilitare i messaggi? privati",ENABLE_SETTINGS_TOGGLE:"Abilitare stoccaggio su dispositivi esterni per le impostazioni?",PEER:"Indirizzo di data peers",POPUP_PEER:{TITLE:"Data peer",HELP:"Definire l'indirizzo da usare per il peer:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifiche",HELP_TEXT:"Scegliere le notifiche che accetta ricevere:",ENABLE_TX_SENT:"Notificarmi di <b>pagamenti inviati</b> con successo?",ENABLE_TX_RECEIVED:"Notificarmi di <b>pagamenti in entrata</b>?",ENABLE_CERT_SENT:"Notificarmi delle <b>certificazioni inviate</b>?",ENABLE_CERT_RECEIVED:"Notificarmi di <b>certificazioni ricevute</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Nuove funzionalità",ASK_ENABLE:'Sono disponibili nuove funzionalità: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i>Profili di utenti</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifications"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Messaggi privati/b>.</ul><br/>Sono state <b>disabilitate</b> nelle sue impostazioni.<br/><br/><b>Desidera abilitare</b> queste funzionalità?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinatario è necessario per il criptaggio."}},EVENT:{NODE_STARTED:"Suo nodo ES API <b>{{params[0]}}</b> è UP",NODE_BMA_DOWN:"Nodo<b>{{params[0]}}:{{params[1]}}</b> (utilizzato dal suo ES API) è <b>indisponibile</b>.",NODE_BMA_UP:"Nodo <b>{{params[0]}}:{{params[1]}}</b> è di nuovo attivo.",MEMBER_JOIN:"E diventato <b>membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Non <b>è più membro/a</b> della WoT della moneta <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Non è <b>più membro/a</b> della WoT della moneta<b>{{params[0]}}</b>, a causa di certificazioni non rinnovate o soglia di certificazioni non raggiunta.",MEMBER_REVOKE:"Il suo conto è stato revocato. Da ora in poi non farà più parte della WoT. <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"La sua presenza nella WoT <b>{{params[0]}}</b> è stata <b>rinnovata correttamente</b>.",TX_SENT:"Il suo pagamento <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> è stato eseguito.",TX_SENT_MULTI:"Il suo pagamento <b>{{params[1]}}</b> è stato eseguito.",TX_RECEIVED:"Ha ricevuto un pagamento da <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Ha ricevuto un pagamento da <b>{{params[1]}}</b>.",CERT_SENT:"Sua <b>certificazione</b> a favore di <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> è stata eseguita.",CERT_RECEIVED:"Ha ricevuto <b>una certificazione</b> da parte di <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha scritto un commento sul suo riferimento: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificato il suo commento sul suo riferimento: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha risposto al suo commento sul riferimento: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificato sua risposta sul suo commento a proposito del riferimento: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo<b>{{old}}</b> irraggiungibile o indirizzo sbagliato.<br/><br/>Vuoi utilizzare temporaneamente il nodo di dati <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:"Nodo di dati<b>{{server}}</b>  irraggiungibile o indirizzo sbagliato.<br/><br/>Cesium continuerà a funzionare <b>senza l'estensione Cesium+</b> (profili utenti, messaggi privati, mappe e grafici)<br/><br/>Verifica tua connessione o cambia nodo <a class=\"positive\" ng-click=\"doQuickFix('settings')\">impostazioni dell'estensione</a>.",ES_MAX_UPLOAD_BODY_SIZE:"Il volume di data da inviare supera il limite imposto dal server.<br/><br/>Suggeriamo di riprovare dopo aver eliminato delle foto, per esempio."}}),e.translations("nl-NL",{COMMON:{CATEGORY:"Categorie",CATEGORIES:"Categorieën",CATEGORY_SEARCH_HELP:"Zoeken",LAST_MODIFICATION_DATE:"Vernieuwd op ",SUBMIT_BY:"Ingediend door",BTN_PUBLISH:"Publiceren",BTN_PICTURE_DELETE:"Wissen",BTN_PICTURE_FAVORISE:"Default",BTN_ADD_PICTURE:"Afbeelding toevoegen",NOTIFICATIONS:{TITLE:"Notificaties",MARK_ALL_AS_READ:"Markeer alles als gelezen",NO_RESULT:"Geen berichten",SHOW_ALL:"Toon alles",LOAD_NOTIFICATIONS_FAILED:"Kan berichten niet laden"}},MENU:{REGISTRY:"Pagina's",USER_PROFILE:"Mijn profiel",MESSAGES:"Berichten"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Ondernemingsrekening",ORGANIZATION_ACCOUNT_HELP:"Als je een onderneming, vereniging etc. vertegenwoordigt.<br/>Deze rekening zal geen dividend créeren."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vul <a ui-sref="app.edit_profile"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen.'}},COMMENTS:{DIVIDER:"Commentaren",SHOW_MORE_COMMENTS:"Toon eerdere commentaren",COMMENT_HELP:"Jouw commentaar, vraag...",COMMENT_HELP_REPLY_TO:"Jouw antwoord...",BTN_SEND:"Verzenden",POPOVER_SHARE_TITLE:"Bericht #{{number}}",REPLY:"Antwoord",REPLY_TO:"Antwoorden op:",REPLY_TO_LINK:"In antwoord op ",REPLY_TO_DELETED_COMMENT:"In antwoord op een gewist bericht",REPLY_COUNT:"{{replyCount}} antwoorden",DELETED_COMMENT:"Bericht gewist"},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Antwoord",BTN_COMPOSE:"Nieuw bericht",BTN_WRITE:"Schrijven",NO_MESSAGE_INBOX:"Geen bericht ontvangen",NO_MESSAGE_OUTBOX:"Geen bericht verzonden",NOTIFICATIONS:{TITLE:"Berichten",MESSAGE_RECEIVED:"Je hebt een <b>bericht ontvangen</b><br/>van"},LIST:{INBOX:"Inbox",OUTBOX:"Verzonden",TITLE:"Privé",POPOVER_ACTIONS:{TITLE:"Opties",DELETE_ALL:"Alle berichten wissen"}},COMPOSE:{TITLE:"Nieuw bericht",TITLE_REPLY:"Antwoord",SUB_TITLE:"Nieuw bericht",TO:"Aan",OBJECT:"Onderwerp",OBJECT_HELP:"Onderwerp",ENCRYPTED_HELP:"Please note this message will by encrypt before sending zodat alleen de ontvanger het kan lezen en zeker kan zijn dat jij de auteur bent.",MESSAGE:"Bericht",MESSAGE_HELP:"Berichtinhoud",CONTENT_CONFIRMATION:"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?"},VIEW:{TITLE:"Bericht",SENDER:"Verzonden door",RECIPIENT:"Verzonden aan",NO_CONTENT:"Leeg bericht"},CONFIRM:{REMOVE:"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",REMOVE_ALL:"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",MARK_ALL_AS_READ:"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?"},INFO:{MESSAGE_REMOVED:"Bericht succesvol gewist",All_MESSAGE_REMOVED:"Berichten succesvol gewist",MESSAGE_SENT:"Bericht verzonden"},ERROR:{SEND_MSG_FAILED:"Fout tijdens verzending.",LOAD_MESSAGES_FAILED:"Kan berichten niet laden.",LOAD_MESSAGE_FAILED:"Kan bericht niet laden.",MESSAGE_NOT_READABLE:"Kan bericht niet lezen.",USER_NOT_RECIPIENT:"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.",NOT_AUTHENTICATED_MESSAGE:"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.",REMOVE_MESSAGE_FAILED:"Kan bericht niet wissen.",MESSAGE_CONTENT_TOO_LONG:"Waarde te lang (max {{maxLength}} characters).",MARK_AS_READ_FAILED:"Kan bericht niet als gelezen markeren.",LOAD_NOTIFICATIONS_FAILED:"Kan niet alle berichtnotificaties laden.",REMOVE_All_MESSAGES_FAILED:"Kan niet alle berichten wissen.",MARK_ALL_AS_READ_FAILED:"Kan berichten niet als gelezen markeren."}},REGISTRY:{CATEGORY:"Hoofdactiviteit",GENERAL_DIVIDER:"Basisinformatie",LOCATION_DIVIDER:"Adres",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",BTN_NEW:"Toevoegen",SEARCH:{TITLE:"Bedrijfsregister",TITLE_SMALL_DEVICE:"Bedrijfsregister",SEARCH_HELP:"Wie, Wat: kapper, Lili's restaurant, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",TYPE:"Soort organisatie",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste referenties:",RESULTS:"Resultaten:"},VIEW:{
-TITLE:"Register",CATEGORY:"Hoofdactiviteit:",LOCATION:"Adres:",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe referentie",SELECT_TYPE:"Soort organizatie:",ENUM:{SHOP:"Locale winkel",COMPANY:"Onderneming",ASSOCIATION:"Stichting",INSTITUTION:"Instituut"}},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe referentie",RECORD_TYPE:"Soort organizatie",RECORD_TITLE:"Naam",RECORD_TITLE_HELP:"Naam",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Omschrijf activiteit",RECORD_ADDRESS:"Straat",RECORD_ADDRESS_HELP:"Straat, gebouw...",RECORD_CITY:"Plaats",RECORD_CITY_HELP:"Plaats",RECORD_SOCIAL_NETWORKS:"Sociale media en website",RECORD_PUBKEY:"Publieke sleutel",RECORD_PUBKEY_HELP:"Publieke sleutel om betalingen te ontvangen"},ERROR:{LOAD_CATEGORY_FAILED:"Laden hoofdactiveiten mislukt",LOAD_RECORD_FAILED:"Laden datasheet mislukt",LOOKUP_RECORDS_FAILED:"Opzoeken datasheets is mislukt.",REMOVE_RECORD_FAILED:"Verwijderen datasheet mislukt",SAVE_RECORD_FAILED:"Opslaan datasheet mislukt",RECORD_NOT_EXISTS:"Datasheet niet gevonden"},INFO:{RECORD_REMOVED:"Datasheet succesvol verwijderd"}},PROFILE:{UID:"Pseudoniem",TITLE:"Naam",TITLE_HELP:"Naam",DESCRIPTION:"Over mij",DESCRIPTION_HELP:"Over mij...",ADDRESS:"Adres",ADDRESS_HELP:"Adres (optioneel)",CITY:"Plaats",CITY_HELP:"Plaats (optioneel)",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Algemene informatie",LOCATION_DIVIDER:"Localisatie",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",ERROR:{LOAD_PROFILE_FAILED:"Kon gebruikersprofiel niet laden.",SAVE_PROFILE_FAILED:"Opslaan profiel mislukt",INVALID_SOCIAL_NETWORK_FORMAT:"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fout tijdens afbeelding schalen"},INFO:{PROFILE_SAVED:"Profiel opgeslagen"},HELP:{WARNING_PUBLIC_DATA:"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>."}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",ENABLE_TOGGLE:"Uitbreiding inschakelen?",ENABLE_MESSAGE_TOGGLE:"Berichten inschakelen?",ENABLE_SETTINGS_TOGGLE:"Globale opslag voor instellingen inschakelen?",PEER:"Adres dataknooppunt",POPUP_PEER:{TITLE:"Dataknoop",HELP:"Stel het te gebruiken adres in:",PEER_HELP:"server.domein.com:poort"},NOTIFICATIONS:{DIVIDER:"Notificaties",HELP_TEXT:"Schakel het type notificatie dat je wil ontvangen in:",ENABLE_TX_SENT:"Bericht bij validatie van <b>verzonden betalingen</b>?",ENABLE_TX_RECEIVED:"Bericht bij validatie van <b>ontvangen betalingen</b>?",ENABLE_CERT_SENT:"Bericht bij validatie van <b>verzonden certificaties</b>?",ENABLE_CERT_RECEIVED:"Bericht bij validatie van <b>ontvangen certificaties</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Optionele functies",ASK_ENABLE:'Cesium+ is <b>uitgeschakeld</b> waardoor deze functies niet beschikbaar zijn: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Gebruikersprofielen</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifcaitions"></i> Notificaties</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privéberichten</b>.</ul><br/><br/>Wil je deze functies <b>inschakelen</b>?'}},EVENT:{NODE_STARTED:"Je knoop ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.",NODE_BMA_UP:"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer bereikbaar.",MEMBER_JOIN:"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!",MEMBER_ACTIVE:"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.",TX_SENT:"Je <b>betaling</b> aan <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.",TX_SENT_MULTI:"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.",TX_RECEIVED:"Je hebt een <b>betaling ontvangen</b> van <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.",CERT_SENT:"Je <b>certificatie</b> van <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.",CERT_RECEIVED:"Je hebt een <b>certificatie ontvangen</b> van <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Knooppunt <b>{{old}}</b> onbereikbaar of ongeldig adres.<br/><br/>Tijdelijk knooppunt <b>{{new}}</b> gebruiken?"},ERROR:{ES_CONNECTION_ERROR:'Knooppunt <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Cesium zal verder weken, <b>zonder de Cesium+ uitbreiding</b> (gebruikersprofielens, privéberichten, kaarten en grafieken).<br/><br/>Controleer je internetverbinding, of verander je knooppunt in <a class="positive" ng-click="doQuickFix(\'settings\')">instellingen</a>.',ES_MAX_UPLOAD_BODY_SIZE:"De hoveelheid te verzenden gegevens is overschrijdt de serverlimiet.<br/><br/>Probeer het nogmaals na, bijvoorbeeld, het wissen foto's."}}),e.translations("en-GB",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},ACCOUNT:{TITLE:"Statistics",BTN_SHOW_STATS:"View account Statistics",BALANCE_DIVIDER:"Account status",BALANCE_TITLE:"Evolution of the account {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Receipts",TX_SENT_LABEL:"Spending",UD_LABEL:"UD",BALANCE_LABEL:"Balance",INPUT_CHART_TITLE:"Sum of incoming flows, per transmitter:",OUTPUT_CHART_TITLE:"Sum of outgoing flows, per recipient:"},BLOCKCHAIN:{TITLE:"Statistics",BLOCKS_ISSUERS_DIVIDER:"Written blocks by members",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Number of blocks calculated per member",BLOCKS_ISSUERS_LABEL:"Number of blocks",TX_DIVIDER:"Analysis of transactions",TX_AMOUNT_TITLE:"Transaction volume",TX_AMOUNT_PUBKEY_TITLE:"Volume of transactions calculated by {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Exchange volume",TX_COUNT_TITLE:"Number of written transactions",TX_COUNT_LABEL:"Number of transactions",TX_AVG_BY_BLOCK:"Average per block"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution of the monetary mass",MONETARY_MASS_LABEL:"Monetary mass",MONETARY_MASS_SHARE_LABEL:"Average per member",UD_TITLE:"Evolution of the universal dividend",MEMBERS_COUNT_TITLE:"Evolution of the number of members",MEMBERS_COUNT_LABEL:"Number of members"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics (Cesium+)",USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},USER_DELTA:{TITLE:"Delta / Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("en",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},ACCOUNT:{TITLE:"Statistics",BTN_SHOW_STATS:"View account Statistics",BALANCE_DIVIDER:"Account status",BALANCE_TITLE:"Evolution of the account {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Receipts",TX_SENT_LABEL:"Spending",UD_LABEL:"UD",BALANCE_LABEL:"Balance",INPUT_CHART_TITLE:"Sum of incoming flows, per transmitter:",OUTPUT_CHART_TITLE:"Sum of outgoing flows, per recipient:"},BLOCKCHAIN:{TITLE:"Statistics",BLOCKS_ISSUERS_DIVIDER:"Written blocks by members",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Number of blocks calculated per member",BLOCKS_ISSUERS_LABEL:"Number of blocks",TX_DIVIDER:"Analysis of transactions",TX_AMOUNT_TITLE:"Transaction volume",TX_AMOUNT_PUBKEY_TITLE:"Volume of transactions calculated by {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Exchange volume",TX_COUNT_TITLE:"Number of written transactions",TX_COUNT_LABEL:"Number of transactions",TX_AVG_BY_BLOCK:"Average per block"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution of the monetary mass",MONETARY_MASS_LABEL:"Monetary mass",MONETARY_MASS_SHARE_LABEL:"Average per member",UD_TITLE:"Evolution of the universal dividend",MEMBERS_COUNT_TITLE:"Evolution of the number of members",MEMBERS_COUNT_LABEL:"Number of members"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics (Cesium+)",USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},USER_DELTA:{TITLE:"Delta / Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("eo-EO",{NETWORK:{VIEW:{BTN_GRAPH:"Statistikoj"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineara skalo",LOGARITHMIC_SCALE:"Logaritma skalo",BTN_SHOW_STATS:"Vidi la statistikojn",BTN_SHOW_DETAILED_STATS:"Detalaj statistikoj",RANGE_DURATION_DIVIDER:"Tempo-unuo:",RANGE_DURATION:{HOUR:"Horo",DAY:"Tago",MONTH:"Monato"}},ACCOUNT:{TITLE:"Statistikoj",BTN_SHOW_STATS:"Vidi la statistikojn de la konto",BALANCE_DIVIDER:"Stato de la konto",BALANCE_TITLE:"Evoluo de la konto {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Enspezoj",TX_SENT_LABEL:"Elspezoj",TX_ACCUMULATION_LABEL:"Bilanco de la spezoj",UD_LABEL:"UD",UD_ACCUMULATION_LABEL:"Bilanco de la UD",BALANCE_LABEL:"Saldo",WOT_DIVIDER:"Reto de fido",CERTIFICATION_TITLE:"Nombro de atestaĵoj - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Tuto pri la ricevitaj",RECEIVED_CERT_DELTA_LABEL:"Vario pri la ricevitaj",GIVEN_CERT_LABEL:"Tuto pri la senditaj",GIVEN_CERT_DELTA_LABEL:"Vario pri la senditaj",INPUT_CHART_TITLE:"Sumo de la enirantaj fluoj, por ĉiu sendinto:",OUTPUT_CHART_TITLE:"Sumo de la elirantaj fluoj, por ĉiu ricevinto:"},BLOCKCHAIN:{TITLE:"Statistikoj",BLOCKS_ISSUERS_DIVIDER:"Analizo de la kalkul-distribuo",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membroj</b> kalkulis <b>{{blockCount|formatInteger}} blokojn</b>",BLOCKS_ISSUERS_TITLE:"Nombro de blokoj kalkulitaj por membro",BLOCKS_ISSUERS_LABEL:"Nombro de blokoj",TX_DIVIDER:"Analizo de la spezoj",TX_AMOUNT_TITLE:"Kvanto de la spezoj",TX_AMOUNT_PUBKEY_TITLE:"Kvanto de spezoj kalkulitaj de {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Kvanto interŝanĝita",TX_COUNT_TITLE:"Nombro de spezoj skribitaj",TX_COUNT_LABEL:"Nombro de spezoj",TX_AVG_BY_BLOCK:"Meza nombro de spezoj / bloko"},CURRENCY:{MONETARY_MASS_TITLE:"Evoluo de la mona maso",MONETARY_MASS_LABEL:"Mona maso",MONETARY_MASS_SHARE_LABEL:"Mezumo por membro",UD_TITLE:"Evoluo de la universala dividendo",MEMBERS_COUNT_TITLE:"Evoluo de la nombro de membroj",MEMBERS_COUNT_LABEL:"Nombro de membroj"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombro de blokoj kalkulitaj",BLOCK_COUNT:"{{count}} blokoj",NO_BLOCK:"Neniu bloko"}},DOC_STATS:{TITLE:"Statistikoj pri stokado",USER:{TITLE:"Nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},MESSAGE:{TITLE:"Nombro de dokumentoj ligitaj al komunikado",MESSAGE_INBOX:"Mesaĝoj en ricevujo",MESSAGE_OUTBOX:"Senditaj mesaĝoj konservitaj",INVITATION_CERTIFICATION:"Invitoj atestotaj"},SOCIAL:{TITLE:"Nombro de paĝoj aŭ grupoj",PAGE_COMMENT:"Komentoj",PAGE_RECORD:"Paĝoj",GROUP_RECORD:"Grupoj"},OTHER:{TITLE:"Aliaj dokumentoj",HISTORY_DELETE:"Forigoj de dokumentoj"}},SYNCHRO:{TITLE:"Statistikoj pri sinkronigoj",COUNT:{TITLE:"Kvanto sinkronigita",INSERTS:"Enmetoj",UPDATES:"Ĝisdatigoj",DELETES:"Forigoj"},PEER:{TITLE:"Nodoj informpetitaj",ES_USER_API:"Nodoj pri datenoj de uzantoj",ES_SUBSCRIPTION_API:"Nodoj pri retaj servoj"},PERFORMANCE:{TITLE:"Efikecoj pri efektiviĝo",DURATION:"Tempo por efektiviĝo (ms)"}}}}),e.translations("es-ES",{NETWORK:{VIEW:{BTN_GRAPH:"Estadística"}},GRAPH:{COMMON:{LINEAR_SCALE:"Escala lineal",LOGARITHMIC_SCALE:"Escala logarítmica",BTN_SHOW_STATS:"Ver estadísticas",BTN_SHOW_DETAILED_STATS:"Estadísticas detalladas",RANGE_DURATION_DIVIDER:"Unidad de paso:",RANGE_DURATION:{HOUR:"Grupo por <b>hora</b>",DAY:"Grupo por <b>día</b>",MONTH:"Grupo por <b>mes</b>"}},ACCOUNT:{INPUT_CHART_TITLE:"Suma del flujo entrante, por el transmisor:",OUTPUT_CHART_TITLE:"Suma de las salidas por destino:"},BLOCKCHAIN:{TITLE:"Estadística",BLOCKS_ISSUERS_DIVIDER:"Bloques escritos por los miembros",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> has computed <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Número de bloques miembro calculado",BLOCKS_ISSUERS_LABEL:"Número de bloques",TX_DIVIDER:"Análisis de transacciones",TX_AMOUNT_TITLE:"El volumen de operaciones",TX_AMOUNT_PUBKEY_TITLE:"El volumen de operaciones calculado por {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volumen negociado",TX_COUNT_TITLE:"Número de transacciones escritas",TX_COUNT_LABEL:"Número de transacciones",TX_AVG_BY_BLOCK:"Promedio por bloque"},CURRENCY:{MONETARY_MASS_TITLE:"Evolución de la masa monetaria",MONETARY_MASS_LABEL:"Masa monetaria",MONETARY_MASS_SHARE_LABEL:"Promedio miembro",UD_TITLE:"Evolución del dividendo universales",MEMBERS_COUNT_TITLE:"Evolución del número de miembros",MEMBERS_COUNT_LABEL:"Número de miembros"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Número de bloques calculados",BLOCK_COUNT:"{{count}} bloques",NO_BLOCK:"Ningún bloque"}}}}),e.translations("fr-FR",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiques"}},GRAPH:{COMMON:{LINEAR_SCALE:"Echelle linéaire",LOGARITHMIC_SCALE:"Echelle logarithmique",BTN_SHOW_STATS:"Voir les statistiques",BTN_SHOW_DETAILED_STATS:"Statistiques détaillées",RANGE_DURATION_DIVIDER:"Unité de temps :",RANGE_DURATION:{HOUR:"Heure",DAY:"Jour",MONTH:"Mois"}},ACCOUNT:{TITLE:"Statistiques",BTN_SHOW_STATS:"Voir les statistiques du compte",BALANCE_DIVIDER:"Situation du compte",BALANCE_TITLE:"Evolution du compte {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Recettes",TX_SENT_LABEL:"Dépenses",TX_ACCUMULATION_LABEL:"Bilan des transactions",UD_LABEL:"DU",UD_ACCUMULATION_LABEL:"Bilan des DU",BALANCE_LABEL:"Solde",WOT_DIVIDER:"Toile de confiance",CERTIFICATION_TITLE:"Nombre de certifications - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Total reçues",RECEIVED_CERT_DELTA_LABEL:"Variation reçues",GIVEN_CERT_LABEL:"Total envoyées",GIVEN_CERT_DELTA_LABEL:"Variation envoyées",INPUT_CHART_TITLE:"Somme des flux entrants, par émetteur :",OUTPUT_CHART_TITLE:"Somme des flux sortants, par destinaire :"},BLOCKCHAIN:{TITLE:"Statistiques",BLOCKS_ISSUERS_DIVIDER:"Analyse de la répartition du calcul",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membres</b> ont calculé <b>{{blockCount|formatInteger}} blocs</b>",BLOCKS_ISSUERS_TITLE:"Nombre de blocs calculés par membre",BLOCKS_ISSUERS_LABEL:"Nombre de blocs",TX_DIVIDER:"Analyse des transactions",TX_AMOUNT_TITLE:"Volume des transactions",TX_AMOUNT_PUBKEY_TITLE:"Volume des transactions calculées par {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volume échangé",TX_COUNT_TITLE:"Nombre de transactions écrites",TX_COUNT_LABEL:"Nombre de transactions",TX_AVG_BY_BLOCK:"Nombre moyen de transactions / bloc"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution de la masse monétaire",MONETARY_MASS_LABEL:"Masse monétaire",MONETARY_MASS_SHARE_LABEL:"Moyenne par membre",UD_TITLE:"Evolution du dividende universel",MEMBERS_COUNT_TITLE:"Evolution du nombre de membres",MEMBERS_COUNT_LABEL:"Nombre de membres"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombre de blocs calculés",BLOCK_COUNT:"{{count}} blocs",NO_BLOCK:"Aucun bloc"}},DOC_STATS:{TITLE:"Statistiques de stockage (Cesium+)",USER:{TITLE:"Nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},USER_DELTA:{TITLE:"Variation du nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},MESSAGE:{TITLE:"Nombre de documents liés à la communication",MESSAGE_INBOX:"Messages en boîte de réception",MESSAGE_OUTBOX:"Messages envoyés sauvegardés",INVITATION_CERTIFICATION:"Invitations à certifier"},SOCIAL:{TITLE:"Nombre de pages ou groupes",PAGE_COMMENT:"Commentaires",PAGE_RECORD:"Pages",GROUP_RECORD:"Groupes"},OTHER:{TITLE:"Autres documents",HISTORY_DELETE:"Suppressions de documents"}},SYNCHRO:{TITLE:"Statistiques de synchronisations",COUNT:{TITLE:"Volume synchronisé",INSERTS:"Insertions",UPDATES:"Mises à jour",DELETES:"Suppressions"},PEER:{TITLE:"Noeuds requêtés",ES_USER_API:"Noeuds données utilisateurs",ES_SUBSCRIPTION_API:"Noeuds services en ligne"},PERFORMANCE:{TITLE:"Performances d'exécution",DURATION:"Temps d'exécution (ms)"}}}}),e.translations("it-IT",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiche"}},GRAPH:{COMMON:{LINEAR_SCALE:"Scala lineare",LOGARITHMIC_SCALE:"Scala logaritmica",BTN_SHOW_STATS:"Vedere le statistiche",BTN_SHOW_DETAILED_STATS:"Statistiche dettagliate",RANGE_DURATION_DIVIDER:"Unità di tempo :",RANGE_DURATION:{HOUR:"Ora",DAY:"Giorno",MONTH:"Mese"}},ACCOUNT:{TITLE:"Statistiche",BTN_SHOW_STATS:"Visualizzare le statistiche del conto",BALANCE_DIVIDER:"Situazione del conto",BALANCE_TITLE:"Evoluzione del conto {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Incassi",TX_SENT_LABEL:"Spese",TX_ACCUMULATION_LABEL:"Bilancio delle transazioni",UD_LABEL:"DU",UD_ACCUMULATION_LABEL:"Bilancio dei DU",BALANCE_LABEL:"Saldo",WOT_DIVIDER:"Tela di fiducia",CERTIFICATION_TITLE:"Numero di certificazioni - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Totale ricevute",RECEIVED_CERT_DELTA_LABEL:"Variazione ricevute",GIVEN_CERT_LABEL:"Totale inviate",GIVEN_CERT_DELTA_LABEL:"Variazione inviate",INPUT_CHART_TITLE:"Somma dei flussi in entrata, par emittente :",OUTPUT_CHART_TITLE:"Somma dei flussi in uscita, per destinatario :"},BLOCKCHAIN:{TITLE:"Statistiche",BLOCKS_ISSUERS_DIVIDER:"Analisi della ripartizione del calcolo",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membri</b> hanno calcolato <b>{{blockCount|formatInteger}} blocchi</b>",BLOCKS_ISSUERS_TITLE:"Numero di blocchi calcolati a membro",BLOCKS_ISSUERS_LABEL:"Numero di blocchi",TX_DIVIDER:"Analisi delle transazioni",TX_AMOUNT_TITLE:"Volume delle transazioni",TX_AMOUNT_PUBKEY_TITLE:"Volume delle transazioni calcolato da {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volume scambiato",TX_COUNT_TITLE:"Numero di transazioni scritte",TX_COUNT_LABEL:"Numero di transazioni",TX_AVG_BY_BLOCK:"Numero medio di transazioni / blocco"},CURRENCY:{MONETARY_MASS_TITLE:"Evoluzione della massa monetaria",MONETARY_MASS_LABEL:"Massa monetaria",MONETARY_MASS_SHARE_LABEL:"Media a membro",UD_TITLE:"Evoluzione del Dividendo Universale",MEMBERS_COUNT_TITLE:"Evoluzione del numero di membri",MEMBERS_COUNT_LABEL:"Numero di membri"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Numero di blocchi calcolati",BLOCK_COUNT:"{{count}} blocchi",NO_BLOCK:"Nessun blocco"}},DOC_STATS:{TITLE:"Statistiche di stoccaggio",USER:{TITLE:"Numero di documenti legati ad un conto",USER_PROFILE:"Profili dell'utente",USER_SETTINGS:"Impostazioni salvate"},MESSAGE:{TITLE:"Numero di documenti legati alla conversazione",MESSAGE_INBOX:"Messaggi in arrivo",MESSAGE_OUTBOX:"Messaggi inviati salvati",INVITATION_CERTIFICATION:"Invitazioni da certificare"},SOCIAL:{TITLE:"Numero di pagine o gruppi",PAGE_COMMENT:"Commenti",PAGE_RECORD:"Pagine",GROUP_RECORD:"Gruppi"},OTHER:{TITLE:"Altri documenti",HISTORY_DELETE:"Cronologia eliminazione documenti"}},SYNCHRO:{TITLE:"Statistiche di sincronizzazioni",COUNT:{TITLE:"Volume sincronizzato",INSERTS:"Inserimenti",UPDATES:"Aggiornamenti",DELETES:"Eliminazioni"},PEER:{TITLE:"Nodi interrogati",ES_USER_API:"Nodi dati utenti",ES_SUBSCRIPTION_API:"Noeuds servizi online"},PERFORMANCE:{TITLE:"Prestazioni (performance) di esecuzione",DURATION:"Tempo di esecuzione (ms)"}}}}),e.translations("nl-NL",{NETWORK:{VIEW:{BTN_GRAPH:"Statistieken"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineaire schaal",LOGARITHMIC_SCALE:"Logaritmische schaal",BTN_SHOW_STATS:"Zie statistieken",BTN_SHOW_DETAILED_STATS:"Gedetailleerde statistieken",RANGE_DURATION_DIVIDER:"Stap eenheid:",RANGE_DURATION:{HOUR:"Groep per <b>uur</b>",DAY:"Groep per <b>dag</b>",MONTH:"Groep per <b>maand</b>"}},ACCOUNT:{INPUT_CHART_TITLE:"Som van de binnenkomende stroom, door de zender:",OUTPUT_CHART_TITLE:"Som van de uitstroom per bestemming:"},BLOCKCHAIN:{TITLE:"Statistieken",BLOCKS_ISSUERS_DIVIDER:"Schriftelijke blokken door leden",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} leden</b> berekend <b>{{blockCount|formatInteger}} blokken</b>",BLOCKS_ISSUERS_TITLE:"Aantal blokken berekend per lid",BLOCKS_ISSUERS_LABEL:"Aantal blokken",TX_DIVIDER:"Analyse van transacties",TX_AMOUNT_TITLE:"Trading volume",TX_AMOUNT_PUBKEY_TITLE:"Trading volume dat wordt berekend door {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Verhandeld volume",TX_COUNT_TITLE:"Aantal schriftelijke transacties",TX_COUNT_LABEL:"Aantal transacties",TX_AVG_BY_BLOCK:"Gemiddeld aantal transacties / blok"},CURRENCY:{MONETARY_MASS_TITLE:"Evolutie van de monetaire massa",MONETARY_MASS_LABEL:"Monetaire massa",MONETARY_MASS_SHARE_LABEL:"Gemiddelde leden",UD_TITLE:"Ontwikkeling van de universele dividend",MEMBERS_COUNT_TITLE:"Evolutie van het aantal leden",MEMBERS_COUNT_LABEL:"Aantal leden"}}}),e.translations("en-GB",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_LOCALIZE_ME:"Localize me"},NETWORK:{LOOKUP:{BTN_MAP:"Peers map",BTN_MAP_HELP:"Open peers map"},VIEW:{TITLE:"Peers map",LAYER:{MEMBER:"Member peers",MIRROR:"Mirror peers",OFFLINE:"Offline peers"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Members',PENDING:'<i class="icon ion-clock energized"></i> Pending registrations',WALLET:'<i class="icon ion-card gray"></i> Simple wallets'}},ERROR:{LOAD_POSITION_FAILED:"Can not retrieve the positions to display."}},REGISTRY:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open the map of the pages"},VIEW:{TITLE:"Map of pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Local shops',COMPANY:'<i class="icon ion-page-company positive"></i> Companies',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"},SETTINGS:{MAP_DIVIDER:"Maps",ENABLE_GOOGLE_API:"Enable Google API services?",ENABLE_GOOGLE_API_HELP:"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.",GOOGLE_API_KEY:"Google API key",BTN_GOOGLE_API:"Getting a key",BTN_GOOGLE_API_WARNING:"requires a Google account",GOOGLE_API_KEY_PLACEHOLDER:"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.",WOT_BTN_LAYERS:"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.",WOT_BTN_SEARCH:"You can <b>search</b> by name, public key, or member pseudonym."}}}}),e.translations("en",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_LOCALIZE_ME:"Localize me"},NETWORK:{LOOKUP:{BTN_MAP:"Peers map",BTN_MAP_HELP:"Open peers map"},VIEW:{TITLE:"Peers map",LAYER:{MEMBER:"Member peers",MIRROR:"Mirror peers",OFFLINE:"Offline peers"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Members',PENDING:'<i class="icon ion-clock energized"></i> Pending registrations',WALLET:'<i class="icon ion-card gray"></i> Simple wallets'}},ERROR:{LOAD_POSITION_FAILED:"Can not retrieve the positions to display."}},REGISTRY:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open the map of the pages"},VIEW:{TITLE:"Map of pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Local shops',COMPANY:'<i class="icon ion-page-company positive"></i> Companies',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"},SETTINGS:{MAP_DIVIDER:"Maps",ENABLE_GOOGLE_API:"Enable Google API services?",ENABLE_GOOGLE_API_HELP:"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.",GOOGLE_API_KEY:"Google API key",BTN_GOOGLE_API:"Getting a key",BTN_GOOGLE_API_WARNING:"requires a Google account",GOOGLE_API_KEY_PLACEHOLDER:"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.",WOT_BTN_LAYERS:"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.",WOT_BTN_SEARCH:"You can <b>search</b> by name, public key, or member pseudonym."}}}}),e.translations("eo-EO",{MAP:{COMMON:{SEARCH_DOTS:"Traserĉi...",BTN_LOCALIZE_ME:"Lokalizi min"},NETWORK:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri nodoj"},VIEW:{TITLE:"Mapo pri nodoj",LAYER:{MEMBER:"Membro-nodoj",MIRROR:"Spegul-nodoj",OFFLINE:"Nekonektitaj nodoj"}}},WOT:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri membroj"},VIEW:{TITLE:"Mapo pri membroj",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membroj',PENDING:'<i class="icon ion-clock energized"></i> Aliĝoj atendantaj',WALLET:'<i class="icon ion-card gray"></i> Simplaj monujoj'}},ERROR:{LOAD_POSITION_FAILED:"Neeblas ricevi la lokojn afiŝotajn."}},REGISTRY:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri paĝoj"},VIEW:{TITLE:"Mapo pri paĝoj",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Lokaj komercoj',COMPANY:'<i class="icon ion-page-company positive"></i> Entreprenoj',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Asocioj',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institucioj'}}},PROFILE:{MARKER_HELP:"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo."},ERROR:{LOCALIZE_ME_FAILED:"Neeblas ricevi vian nunan lokon"},SETTINGS:{MAP_DIVIDER:"Mapoj",ENABLE_GOOGLE_API:"Aktivigi la Google-API-servojn?",ENABLE_GOOGLE_API_HELP:"Ebligas afiŝi sur la <b>mapo pri membroj</b> kontojn kun adreso sed sen iu GPS-lokalizo.",GOOGLE_API_KEY:"Google-API-ŝlosilo",BTN_GOOGLE_API:"Ekhavi ŝlosilon",BTN_GOOGLE_API_WARNING:"Necesigas havi Google-konton",GOOGLE_API_KEY_PLACEHOLDER:"Ekzemple: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Tiu ĉi mapo afiŝas <b>la profilojn kun loko</b>, ĉu ili rilatas al membro-kontoj aŭ ne.<br/><br/>Nur videblas la profiloj, kies kromaĵo &quot;aperi sur la mapo&quot; estis aktivigita.",WOT_BTN_LAYERS:"<b>Filtru ĉi tie la afiŝitajn datenojn</b>: membroj, aliĝoj atendantaj, simplaj monujoj, ktp.",WOT_BTN_SEARCH:"Vi povas <b>efektivigi serĉadon</b> laŭ nomo, publika ŝlosilo aŭ membro-pseŭdonimo."}}}}),e.translations("fr-FR",{MAP:{COMMON:{SEARCH_DOTS:"Rechercher...",BTN_LOCALIZE_ME:"Me localiser"},NETWORK:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des noeuds"},VIEW:{TITLE:"Carte des noeuds",LAYER:{MEMBER:"Nœuds membre",MIRROR:"Nœuds miroir",OFFLINE:"Nœuds hors ligne"}}},WOT:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des membres"},VIEW:{TITLE:"Carte des membres",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membres',PENDING:'<i class="icon ion-clock energized"></i> Inscriptions en attente',WALLET:'<i class="icon ion-card gray"></i> Simples portefeuilles'}},ERROR:{LOAD_POSITION_FAILED:"Impossible de récupérer les positions à afficher."}},REGISTRY:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des pages"},VIEW:{TITLE:"Carte des pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Commerces locaux',COMPANY:'<i class="icon ion-page-company positive"></i> Entreprises',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{MARKER_HELP:"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b> sur la carte, ou utilisez le bouton<br/>de recherche au-dessus de la carte."},ERROR:{LOCALIZE_ME_FAILED:"Impossible de récupérer votre position actuelle"},SETTINGS:{MAP_DIVIDER:"Cartes",ENABLE_GOOGLE_API:"Activer les services Google API ?",ENABLE_GOOGLE_API_HELP:"Permet l'affichage dans la <b>carte des membres</b> des comptes ayant une adresse mais aucun positionnement GPS.",GOOGLE_API_KEY:"Clé d'API Google",BTN_GOOGLE_API:"Obtenir une clé",BTN_GOOGLE_API_WARNING:"Nécessite d'avoir un compte Google",
-GOOGLE_API_KEY_PLACEHOLDER:"Exemple : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Cette carte affiche <b>les profils ayant une position</b>, qu'ils correspondent à des comptes membre ou non.<br/><br/>Seuls sont visibles les profils dont l'option &quot;apparaître sur la carte&quot; a été activée.",WOT_BTN_LAYERS:"<b>Filtrez ici les données affichées</b> : membres, inscriptions en attente, simples portefeuilles, etc.",WOT_BTN_SEARCH:"Vous pouvez <b>effectuer une recherche</b> par nom, clef publique ou pseudonyme de membre."}}}}),e.translations("it-IT",{MAP:{COMMON:{SEARCH_DOTS:"Ricerca...",BTN_LOCALIZE_ME:"Trovami"},NETWORK:{LOOKUP:{BTN_MAP:"Mappa dei peers",BTN_MAP_HELP:"Aprire mappa dei peers"},VIEW:{TITLE:"Mappa dei peers",LAYER:{MEMBER:"Peers membri",MIRROR:"Peers specchi",OFFLINE:"Peers offline"}}},WOT:{LOOKUP:{BTN_MAP:"Mappa dei membri",BTN_MAP_HELP:"Aprire mappa dei membri"},VIEW:{TITLE:"Mappa membri",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membri',PENDING:'<i class="icon ion-clock energized"></i> Registrazione pendenti',WALLET:'<i class="icon ion-card gray"></i> Portafogli osservatori'}},ERROR:{LOAD_POSITION_FAILED:"Errore nel caricamento delle posizioni."}},REGISTRY:{LOOKUP:{BTN_MAP:"Mappa",BTN_MAP_HELP:"Aprire la mappa delle pagine pro"},VIEW:{TITLE:"Mappa delle pagine pro",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Negozi locali',COMPANY:'<i class="icon ion-page-company positive"></i> Aziende',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associazioni',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Instituti'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> questo indicatore per <b>aggiornare<br/>tua posizione</b>, o usa i bottoni <br/>sopra la mappa."},ERROR:{LOCALIZE_ME_FAILED:"Impossible trovare tua posizione attuale"},SETTINGS:{MAP_DIVIDER:"Mappe",ENABLE_GOOGLE_API:"Abilitare i servizi Google API ?",ENABLE_GOOGLE_API_HELP:"Sulla <b>mappa dei membri</b>, ti permette di visualizzare i conti con un indirizzo ma senza geolocalizzazione.",GOOGLE_API_KEY:"Chiave Google API",BTN_GOOGLE_API:"Ottenere una chiave",BTN_GOOGLE_API_WARNING:"necessita un conto Google",GOOGLE_API_KEY_PLACEHOLDER:"per es. : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Questa mappa mostra <b>profili che hanno fornito una posizione</b>, che siano conti membri o no.<br/><br/>Solo i profili che hanno attivato l'opzione &quot;apparire sulla mappa&quot; sono stati attivati.",WOT_BTN_LAYERS:"<b>Filtrare i dati visibili</b>: membri, registrazioni pendenti, portafogli osservatori, etc.",WOT_BTN_SEARCH:"Puoi <b>cercare</b> per nome, chiave pubblica, o pseudonimo del membro."}}}}),e.translations("fr-FR",{RML9:{BTN_EXPORT:"Télécharger",BTN_OPEN:"Ouvrir la page RML9",BTN_SWOW_TX:"Voir les transactions",FILE_NAME:"relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Montant",COMMENT:"Commentaire"},VIEW:{TITLE:"RML9",DIVIDER:"Dernières transactions :",BALANCE:"Solde du compte"},CHART:{INPUT_CHART_TITLE:"Somme des flux entrants, par émetteur :",OUTPUT_CHART_TITLE:"Somme des flux sortants, par destinaire :"},SETTINGS:{ENABLE_TOGGLE:"Activer le plugin RML9 ?"}}})}]),angular.module("cesium.plugins.templates",[]).run(["$templateCache",function(e){e.put("plugins/es/templates/menu_extend.html",'<div ng-if=":state:enable && extensionPoint === \'menu-user\'" class="visible-xs visible-sm"><a menu-close="" class="item item-icon-left" active-link="active" ng-if="login && walletData.isMember" active-link-path-prefix="#/app/invitations" ui-sref="app.view_invitations"><i class="icon ion-person-stalker"></i> <span translate="">MENU.INVITATIONS</span> <span class="badge badge-positive" ng-if="walletData.invitations.unreadCount">{{walletData.invitations.unreadCount}}</span> </a><a menu-close="" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/user/message" ng-class="{\'item-menu-disable\': !login}" ui-sref="app.user_message.tab_inbox"><i class="icon ion-email"></i> <span translate="">MENU.MESSAGES</span> <span class="badge badge-positive" ng-if="walletData.messages.unreadCount">{{walletData.messages.unreadCount}}</span> </a><a menu-close="" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/notifications" ng-class="{\'item-menu-disable\': !login}" ui-sref="app.view_notifications"><i class="icon ion-android-notifications"></i> <span translate="">MENU.NOTIFICATIONS</span> <span class="badge badge-positive" ng-if="walletData.notifications.unreadCount">{{walletData.notifications.unreadCount}}</span></a></div>'),e.put("plugins/rml9/templates/01-button.html",'\x3c!-- Button that call a function of the controller --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive"\n        ng-click="onButtonClick()"\n        title="{{\'RML9.BTN_OPEN\' | translate}}">\n</button>\n\n\x3c!-- Button: Open a view, using `ui-sref` attribute\n<button class="button button-balanced button-small-padding icon ion-plus-circled"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_OPEN\' | translate}}">\n</button> --\x3e\n\n'),e.put("plugins/rml9/templates/02-view.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n      \x3c!-- iterate on each TX --\x3e\n      <div class="item" ng-repeat="item in items">\n        <h3>{{item.time|formatDate}}</h3>\n        <h4>{{item.pubkey|formatPubkey}}</h4>\n        <div class="badge">{{item.amount|formatAmount}}</div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/03-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/03-view_with_button.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- buttons bar --\x3e\n      <div class="center padding">\n        <div class="buttons">\n          <button class="button button-balanced icon-left icon ion-archive"\n                  ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n          </button>\n        </div>\n      </div>\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- the balance --\x3e\n      <div class="item">\n        {{\'RML9.VIEW.BALANCE\'|translate}}\n        <div class="badge badge-calm">\n          {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n      \x3c!-- iterate on each TX --\x3e\n      <div class="item item-text-wrap" ng-repeat="item in items">\n\n        <h3>\n          {{item.time|formatDate}}\n          <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n        </h3>\n\n        <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n        <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n        <div class="badge"\n             ng-class="{\'badge-balanced\': item.amount > 0}">\n          {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/04-view_chart.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- buttons bar --\x3e\n      <div class="center padding">\n        <div class="buttons">\n          <button class="button button-balanced icon-left icon ion-archive"\n                  ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n          </button>\n        </div>\n      </div>\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- the balance --\x3e\n      <div class="item">\n        {{\'RML9.VIEW.BALANCE\'|translate}}\n        <div class="badge badge-calm">\n          {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n\n      <div class="row">\n        <div class="col col-75">\n          \x3c!-- iterate on each TX --\x3e\n          <div class="item item-text-wrap" ng-repeat="item in items">\n\n            <h3>\n              {{item.time|formatDate}}\n              <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n            </h3>\n\n            <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n            <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n            <div class="badge"\n                 ng-class="{\'badge-balanced\': item.amount > 0}">\n              {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n            </div>\n          </div>\n        </div>\n\n        <div class="col col-25">\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.INPUT_CHART_TITLE</p>\n          <canvas id="chart-received-pie" class="chart-pie"\n                  chart-data="inputChart.data"\n                  chart-labels="inputChart.labels"\n                  chart-colors="inputChart.colors">\n          </canvas>\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\n          <canvas id="chart-sent-pie" class="chart-pie"\n                  chart-data="outputChart.data"\n                  chart-labels="outputChart.labels"\n                  chart-colors="outputChart.colors">\n          </canvas>\n        </div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/06-button.html",'\x3c!-- [NEW] Display only if plugin is enable --\x3e\n\n  \x3c!-- Button: call a method from the state controller --\x3e\n  <button ng-if="enable" class="button button-balanced button-small-padding icon ion-android-archive"\n          ng-click="onButtonClick()"\n          title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n  </button>\n\n\n'),e.put("plugins/rml9/templates/06-settings_item.html",'\n<div class="item item-toggle dark">\n  <div class="input-label" translate>RML9.SETTINGS.ENABLE_TOGGLE</div>\n  <label class="toggle toggle-royal">\n    <input type="checkbox" ng-model="formData.plugins.rml9.enable" >\n    <div class="track">\n      <div class="handle"></div>\n    </div>\n  </label>\n</div>\n'),e.put("plugins/rml9/templates/07-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/07-view.html",'<leaflet id="map-geojson" center="map.center" geojson="map.geojson"></leaflet>\n'),e.put("plugins/rml9/templates/final-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button ng-if class="button button-balanced button-small-padding icon ion-android-archive"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/final-view.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- buttons bar --\x3e\n      <div class="center padding">\n        <div class="buttons">\n          <button class="button button-balanced icon-left icon ion-archive"\n                  ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n          </button>\n        </div>\n      </div>\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- the balance --\x3e\n      <div class="item">\n        {{\'RML9.VIEW.BALANCE\'|translate}}\n        <div class="badge badge-calm">\n          {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n      \x3c!-- iterate on each TX --\x3e\n      <div class="row">\n        <div class="col col-75">\n          <div class="item item-text-wrap" ng-repeat="item in items">\n\n            <h3>\n              {{item.time|formatDate}}\n              <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n            </h3>\n\n            <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n            <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n            <div class="badge"\n                 ng-class="{\'badge-balanced\': item.amount > 0}">\n              {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n            </div>\n          </div>\n\n        </div>\n\n        <div class="col col-25">\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.INPUT_CHART_TITLE</p>\n          <canvas id="chart-received-pie" class="chart-pie"\n                  chart-data="inputChart.data"\n                  chart-labels="inputChart.labels">\n          </canvas>\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\n          <canvas id="chart-sent-pie" class="chart-pie"\n                  chart-data="outputChart.data"\n                  chart-labels="outputChart.labels">\n          </canvas>\n        </div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/blockchain/items_blocks.html",'<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate="">COMMON.SEARCH_NO_RESULT</div><ng-if ng-if=":rebind:!smallscreen"><ng-repeat ng-repeat="block in :rebind:search.results track by block.number" ng-include="!block.empty ? \'templates/blockchain/item_block_lg.html\' : \'templates/blockchain/item_block_empty_lg.html\'"></ng-repeat></ng-if><ng-if ng-if=":rebind:smallscreen"><ng-repeat ng-repeat="block in :rebind:search.results track by block.number" ng-include="\'templates/blockchain/item_block.html\'"></ng-repeat></ng-if>'),e.put("plugins/es/templates/blockchain/lookup.html",'<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-navicon visible-xs visible-sm" ng-click="toggleCompactMode()"><b class="icon-secondary" ng-class="{\'ion-arrow-down-b\': !compactMode, \'ion-arrow-up-b\': compactMode}" style="top: -12px; left: 11px; font-size: 10px"></b> <b class="icon-secondary" ng-class="{\'ion-arrow-up-b\': !compactMode,\'ion-arrow-down-b\': compactMode}" style="top: 12px; left: 11px; font-size: 10px"></b></button> <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="\'plugins/es/templates/blockchain/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/es/templates/blockchain/lookup_form.html",'<div class="lookupForm"><div class="item no-padding"><div class="button button-small button-text button-stable button-icon-event padding no-padding-right ink" ng-repeat="filter in search.filters" ng-if="filter"><span ng-bind-html="\'BLOCKCHAIN.LOOKUP.TX_SEARCH_FILTER.\'+filter.type|translate:filter"></span> <i class="icon ion-close" ng-click="itemRemove($index)"></i></div><label class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()"><div class="helptip-anchor-center"><a id="helptip-blockchain-search-text"></a></div></label></div><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left"><h4 ng-if="search.type==\'last\'" translate="">BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><h4 ng-if="search.type==\'text\'">{{\'COMMON.RESULTS_LIST\'|translate}}</h4><h5 class="dark" ng-if="!search.loading && search.total"><span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span> <small class="gray" ng-if=":rebind:search.took && expertMode">- {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }} </small><small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">- <a ng-click="toggleShowQuery()" ng-if="!showQuery">{{\'DOCUMENT.LOOKUP.SHOW_QUERY\'|translate }} <i class="icon ion-arrow-down-b gray"></i> </a><a ng-click="toggleShowQuery()" ng-if="showQuery">{{\'DOCUMENT.LOOKUP.HIDE_QUERY\'|translate }} <i class="icon ion-arrow-up-b gray"></i></a></small></h5><h5 class="gray" ng-if="search.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner><span translate="">COMMON.SEARCHING</span><br></h5></div></div><div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode"><small class="no-padding no-margin" ng-if="showQuery"><span class="gray text-wrap dark">{{:rebind:search.query}}</span></small></div><ion-list class="list list-blocks" ng-class="::motion.ionListClass"><ng-include src="\'plugins/es/templates/blockchain/items_blocks.html\'"></ng-include></ion-list><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll></div>'),e.put("plugins/es/templates/blockchain/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>BLOCKCHAIN.LOOKUP.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a ng-if="enableFilter" class="item item-icon-left item-icon-right ink" ng-click="doSearchLast()"><i class="icon ion-clock"></i> {{\'BLOCKCHAIN.LOOKUP.BTN_LAST\' | translate}} <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'last\'"></i></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/common/edit_pictures.html",'<div class="gallery" ng-controller="ESPicturesEditCtrl as ctrl"><div ng-repeat="picture in pictures" class="item card card-gallery stable-bg" ng-class="{\'in done\': picture.isnew}"><div><h2 ng-if="picture.title">{{picture.title}}</h2><img ng-src="{{picture.src}}"></div><div class="item done in tabs tabs-secondary tabs-icon-left"><a class="tab-item stable-bg assertive" ng-click="removePicture($index)" title="{{\'COMMON.BTN_PICTURE_DELETE\' | translate}}"><i class="icon ion-trash-a"></i>{{\'COMMON.BTN_PICTURE_DELETE\'|translate}}</a> <a class="tab-item stable-bg dark" ng-click="rotatePicture($index)" title="{{\'COMMON.BTN_PICTURE_ROTATE\' | translate}}"><i class="icon ion-forward"></i>{{\'COMMON.BTN_PICTURE_ROTATE\'|translate}}</a> <a class="tab-item stable-bg" ng-click="favoritePicture($index)" ng-class="{\'gray\': $index !== 0, \'positive\': $index === 0}" title="{{\'COMMON.BTN_PICTURE_FAVORISE\' | translate}}"><i class="icon ion-star"></i>{{\'COMMON.BTN_PICTURE_FAVORISE\'|translate}}</a></div></div><div class="item card card-gallery card-gallery-new text-center padding ink" ng-click="selectNewPicture(\'#pictureFile\')"><i class="ion-image stable" style="font-size:150px"></i> <b class="ion-plus gray" style="font-size:80px; position:absolute; top:25px; right: 5px"></b><p translate>COMMON.BTN_ADD_PICTURE</p></div><input type="file" id="pictureFile" accept="image/*" onchange="angular.element(this).scope().fileChanged(event)" style="visibility:hidden; position:absolute"></div>'),e.put("plugins/es/templates/common/edit_position.html",'<div class="item item-divider" translate>LOCATION.LOCATION_DIVIDER</div><ion-item class="item-input item-floating-label item-button-right"><span class="input-label">{{\'LOCATION.ADDRESS\' | translate}}</span><textarea placeholder="{{\'LOCATION.ADDRESS_HELP\' | translate}}" ng-model="formData.address" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n              </textarea></ion-item><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.geoPoint.$invalid}"><span class="input-label" translate>LOCATION.CITY</span> <input type="text" placeholder="{{\'LOCATION.CITY_HELP\'|translate}}" ng-model="formData.city" ng-model-options="{ updateOn: \'blur\' }" required-if="formData.address" ng-change="onCityChanged()"></div><input type="hidden" name="geoPoint" ng-model="formData.geoPoint" required-if="formPosition.enable" geo-point><div class="form-errors" ng-show="form.$submitted && form.city.$error" ng-messages="form.city.$error"><div class="form-error" ng-message="required"><span translate="LOCATION.ERROR.CITY_REQUIRED_IF_STREET"></span></div></div><div class="form-errors" ng-show="form.$submitted && form.geoPoint.$error" ng-messages="form.geoPoint.$error"><div class="form-error" ng-message="required"><span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span> <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span></div><div class="form-error" ng-message="geoPoint"><span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span> <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span></div></div><div class="item row item-text-wrap no-padding"><div class="col no-padding"><ion-checkbox ng-model="formPosition.enable" ng-change="onUseGeopointChanged()" class="item item-border-large done in"><div class="item-content"><span translate>LOCATION.USE_GEO_POINT</span><h4 class="gray" ng-if="formPosition.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>{{\'LOCATION.LOADING_LOCATION\'|translate}}</h4></div></ion-checkbox></div><div class="col col-10 no-padding" style="min-width: 60px"><div class="row text-center"><a class="button button-stable button-small-padding" title="{{\'LOCATION.BTN_GEOLOC_ADDRESS\'|translate}}" ng-disabled="!formPosition.enable" ng-click="openSearchLocationModal()"><i class="icon ion-home" style="left: 15px"></i> <b class="icon-secondary ion-search" style="top: -9px; left:32px; font-size: 18px"></b></a></div></div></div><cs-extension-point name="after-position"></cs-extension-point>'),e.put("plugins/es/templates/common/edit_socials.html",'<ion-list class="no-padding"><div class="item item-divider"><span>{{\'PROFILE.SOCIAL_NETWORKS_DIVIDER\' | translate}} </span><a class="badge button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': socialData.reorder}" ng-if="formData.socials && formData.socials.length &gt; 1" ng-click="socialData.reorder=!socialData.reorder"><span translate="">PROFILE.BTN_REORDER</span></a></div></ion-list><ion-list show-reorder="socialData.reorder"><ion-item class="item-remove-animate item-icon-left" type="no-padding item-text-wrap" ng-if="formData.socials && formData.socials.length" ng-repeat="social in formData.socials | filter:filterFn track by social.url" id="social-{{social.url|formatSlug}}"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}} <i class="ion-locked" ng-if="social.recipient"></i></p><h2><a href="{{social.url}}" ng-if="social.type != \'email\' && social.type != \'phone\'" target="_blank">{{social.url}}</a> <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a> <a href="tel:{{social.url}}" ng-if="social.type == \'phone\'">{{social.url}}</a></h2><ion-option-button class="button-assertive" ng-if="!social.recipient" ng-click="formData.socials.splice($index, 1); dirty = true;">{{\'COMMON.BTN_DELETE\'|translate}}</ion-option-button><ion-option-button class="button-info" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">{{\'COMMON.BTN_EDIT\'|translate}}</ion-option-button><ion-reorder-button class="ion-drag" on-reorder="reorderSocialNetwork(social, $fromIndex, $toIndex)"></ion-reorder-button></ion-item></ion-list><ion-list class="no-padding"><div class="item item-complex item-input-inset"><label class="item-input-wrapper"><input type="text" style="width:100%" placeholder="{{\'PROFILE.SOCIAL_HELP\'|translate}}" id="socialUrl" on-return="addSocialNetwork($event);" ng-model="socialData.url"></label><button class="button button-small hidden-xs" type="button" ng-click="addSocialNetwork($event)">{{\'COMMON.BTN_ADD\'|translate}}</button> <button class="button button-small button-icon icon ion-android-add visible-xs" type="button" ng-click="addSocialNetwork($event)"></button></div></ion-list>'),e.put("plugins/es/templates/common/item_comment.html",'<ng-init ng-init="level = level + 1"><a name="{{::comment.id|formatHash}}"></a><ion-item id="comment-{{::comment.id|formatHash}}" class="card card-comment card-avatar stable-900-bg item-text-wrap no-padding" ng-class="::{\'in done\': comment.isnew}"><div class="card-header padding-left" ng-if="comment.parent && !hideParent"><h5 class="gray underline"><ng-if ng-if="!comment.parent.issuer">{{\'COMMENTS.REPLY_TO_DELETED_COMMENT\'|translate}}</ng-if><ng-if ng-if="comment.parent.issuer"><a ng-click="toggleExpandedParent(comment, $index)">{{\'COMMENTS.REPLY_TO_LINK\'|translate}}<ng-if ng-if="::comment.parent.uid">{{::comment.parent.name||comment.parent.uid}}</ng-if><ng-if ng-if="::!comment.parent.uid"><i class="ion-key"></i> {{::comment.parent.name|| (comment.parent.issuer|formatPubkey) }}</ng-if></a><i ng-class="{\'ion-arrow-down-b\': !comment.expandedParent[$index], \'ion-arrow-up-b\': comment.expandedParent[$index]}"></i></ng-if></h5><div class="padding-left" ng-if="comment.expandedParent[$index]"><div class="card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done"><ng-include ng-init="comment = comment.parent" src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include></div></div></div><ng-include src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include><div class="card-footer gray"><small class="underline"><a ng-click="share($event, comment, $index)">{{comment.creationTime | formatFromNow}}</a><ng-if ng-if="comment.replyCount">| <a class="dark" ng-click="toggleExpandedReplies(comment, $index)">{{\'COMMENTS.REPLY_COUNT\'|translate:comment}}</a> <i ng-class="{\'ion-arrow-down-b\': !comment.showReplies, \'ion-arrow-up-b\': comment.showReplies}"></i></ng-if></small><div class="pull-right"><a class="ion-android-share-alt" ng-click="share($event, comment)"></a> <a class="ion-edit" ng-if="isUserPubkey(comment.issuer)" ng-click="edit(comment)"></a> <a class="ion-trash-a" ng-if="isUserPubkey(comment.issuer)" ng-click="remove(comment, $index)"></a> <a class="ion-reply" ng-click="reply(comment)">{{::\'COMMENTS.REPLY\'|translate}}</a></div></div></ion-item><div ng-if="comment.expandedReplies[$index]" class="padding-left card-avatar-small expanded" ng-init="hideParent=true"><ng-include ng-repeat="comment in comment.replies track by comment.id" src="\'plugins/es/templates/common/item_comment.html\'"></ng-include></div></ng-init>'),e.put("plugins/es/templates/common/item_comment_content.html",'<div class="item item-avatar done in"><span class="avatar" ng-if="::!comment.avatar" ng-class="::{\'avatar-member\': comment.uid, \'avatar-wallet\': !comment.uid}"></span> <span class="avatar" ng-if="::comment.avatar" style="background-image: url({{::comment.avatar.src}})"></span> <a class="pull-left" ui-sref="app.wot_identity({pubkey:comment.issuer, uid: comment.uid})"><span class="positive" ng-if="::comment.uid">{{::comment.name||comment.uid}} </span><span ng-if="::!comment.uid" class="gray"><i class="icon ion-key gray"></i> {{::comment.name || (comment.issuer|formatPubkey)}} </span></a>&nbsp; <span trust-as-html="comment.html"></span></div>'),e.put("plugins/es/templates/common/item_location_search.html",'<div class="item no-padding"><div class="item-input"><i class="icon ion-location placeholder-icon"></i> <input type="text" placeholder="{{(options.location.help||\'LOCATION.SEARCH_HELP\')|translate}}" ng-model-options="{ debounce: 350 }" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()"></div></div><ul class="item no-padding list dropdown-list" ng-if="locations" scroll="true"><div ng-if="!locations.length" class="item padding assertive"><span translate>COMMON.SEARCH_NO_RESULT</span></div><a ng-repeat="res in locations" class="item item-border-large item-text-wrap ink done in {{res.selected && \'active\' || \'\'}}" ng-class="::{\'item-divider\': !res.address, \'item-icon-left\': res.address}" ng-click="::res.address ? selectLocation(res) : false"><h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4><ng-if ng-if="::res.address"><i class="icon ion-location"></i><h3 ng-if="res.address.road">{{::res.address.road}}</h3><h3><span ng-if="res.address.postcode">{{::res.address.postcode}}</span> {{::res.address.city||res.address.village}} <span class="gray">| {{::res.address.country}}</span></h3><h5 class="gray">{{\'LOCATION.MODAL.POSITION\'|translate:res }}</h5></ng-if></a></ul>'),
-e.put("plugins/es/templates/common/modal_category.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title">{{ (ctrl.title || \'COMMON.CATEGORIES\') | translate}}</h1></ion-header-bar><ion-content class="categoryModal"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list"><label class="item item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" placeholder="{{\'COMMON.CATEGORY_SEARCH_HELP\'|translate}}" ng-model="ctrl.searchText" ng-model-options="{ debounce: 350 }" ng-change="ctrl.doSearch()"></label><div ng-repeat="cat in categories" class="item item-category item-text-wrap" ng-class="{\'item-divider\': !cat.parent}" ng-click="cat.parent ? closeModal(cat) : false"><h2 ng-bind-html="cat.name"></h2></div></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/common/modal_edit_avatar.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs visible-sm" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>PROFILE.MODAL_AVATAR.TITLE</h1><button class="button button-clear icon-right visible-xs" ng-click="doCrop()" ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-clear icon-right visible-xs" ng-click="closeModal(formData.result)" ng-if="formData.imageCropStep == 3"><i class="icon ion-android-done"></i></button></ion-header-bar><ion-content class="modal-avatar padding"><div ng-show="formData.imageCropStep == 1"><p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p><div class="item card text-center padding ink" ng-click="openFileSelector()"><i class="ion-image stable" style="font-size:150px"></i> <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px"></b><p translate>PROFILE.MODAL_AVATAR.BTN_SELECT_FILE</p></div><input type="file" name="fileInput" accept="image/*" id="fileInput" onchange="angular.element(this).scope().fileChanged(event)" style="visibility:hidden; position:absolute"></div><div ng-show="formData.imageCropStep == 2"><p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p><div class="item card text-center padding ink"><image-crop data-height="200" data-width="200" data-shape="circle" data-step="formData.imageCropStep" src="formData.imgSrc" data-result="formData.result" data-result-blob="formData.resultBlob" crop="formData.initCrop" padding="150" max-size="1024"></image-crop></div></div><div ng-show="formData.imageCropStep == 3"><p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p><div class="item card padding hero" style="height: 110px"><div class="content"><img class="avatar" ng-src="{{formData.result}}" style="height: 88px; width: 88px"></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doCrop()" translate ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2">COMMON.BTN_NEXT</button> <button class="button button-positive ink" ng-click="closeModal(formData.result)" translate ng-if="formData.imageCropStep == 3">COMMON.BTN_CONTINUE</button></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/common/modal_location.html",'<ion-modal-view class="modal-full-height modal-search-location"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate="">COMMON.BTN_CANCEL</button><h1 class="title" translate="">LOCATION.MODAL.TITLE</h1></ion-header-bar><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><div class="item item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()"></div><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left" ng-if="!search.loading && search.results"><h4 translate="">COMMON.RESULTS_LIST</h4></div></div><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div ng-if="!search.loading && search.results && (!search.results.length || !search.results[0].address)" class="assertive padding"><span translate="">COMMON.SEARCH_NO_RESULT</span></div><ion-list ng-if="!search.loading" class="padding-top {{::motion.ionListClass}}"><div ng-repeat="res in search.results" class="item item-border-large item-text-wrap ink" ng-class="::{\'item-divider\': !res.address, \'item-icon-left item-icon-right\': res.address}" ng-click="res.address ? closeModal(res) : false"><h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4><ng-if ng-if="::res.address"><i class="icon ion-location"></i><h2 ng-if="res.address.road">{{::res.address.road}}</h2><h3><span ng-if="res.address.postcode">{{::res.address.postcode}}</span> {{::res.address.city||res.address.village}} <span class="gray">| {{::res.address.country}}</span></h3><h5 class="gray">{{\'LOCATION.MODAL.POSITION\'|translate:res }}</h5><i class="icon ion-ios-arrow-right"></i></ng-if></div></ion-list></ion-content><ion-footer-bar class="stable-bg padding-left padding-right block" ng-if="license"><div class="pull-right copyright"><span class="dark">© </span><a class="positive" href="{{license.url}}" target="_blank">{{license.name}}</a></div></ion-footer-bar></ion-modal-view>'),e.put("plugins/es/templates/common/popover_profile_extend.html",'<button ng-if=":state:enable && auth" class="button button-positive button-small ink" ng-click="showEditUserProfile()">{{\'PROFILE.BTN_EDIT\' | translate}}</button>'),e.put("plugins/es/templates/common/view_comments.html",'<form class="comments" ng-controller="ESCommentsCtrl" ng-submit="save()"><div class="item item-divider"><i class="icon ion-chatboxes"></i> <span translate="">COMMENTS.DIVIDER</span> <span class="gray" ng-if="comments.total">({{comments.total}})</span></div><span class="item item-more-comments" ng-if="comments.hasMore"><small><a ng-click="showMore()" translate="">COMMENTS.SHOW_MORE_COMMENTS</a></small></span><div class="padding-right"><ng-repeat ng-repeat="comment in comments.result track by comment.id" ng-include="\'plugins/es/templates/common/item_comment.html\'"></ng-repeat></div><div class="visible-xs visible-sm" style="margin-bottom"><div class="block"><div class="item item-input-inset done in" ng-if="formData.parent"><div class="padding text-right pull-left" translate="">COMMENTS.REPLY_TO</div><br><div class="padding-left expanded"><div class="card card-comment stable-900-bg item-text-wrap no-padding in done"><ng-include ng-if="::formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include><span ng-if="::!formData.parent.message" translate="">COMMENTS.DELETED_COMMENT</span><div class="card-footer text-right gray"><div class="pull-right"><a class="ion-close" ng-click="removeParentLink()">{{::\'COMMON.BTN_CANCEL\'|translate}}</a></div></div></div></div></div><div class="item item-input-inset"><div class="item-input-wrapper"><input type="text" id="comment-form-input" style="width: 100%" placeholder="{{\'COMMENTS.COMMENT_HELP\'|translate}}" on-return="save();" ng-model="formData.message"> <button type="submit" class="button button-small button-small-padding button-icon button-dark button-icon gray"><i class="icon ion-android-send"></i></button></div></div></div></div></form>'),e.put("plugins/es/templates/common/view_pictures.html",'<div class="item gallery done in" ng-if="pictures && pictures.length>0"><div ng-repeat="picture in pictures" class="item card card-gallery"><div class="ink"><h2 ng-if="picture.title">{{::picture.title}}</h2><img ng-src="{{picture.src}}"></div></div></div>'),e.put("plugins/es/templates/currency/tab_blocks_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'nav-buttons\'"><button class="button button-icon button-clear icon ion-android-search visible-xs visible-sm" ui-sref="app.blockchain_search"></button></ng-if>'),e.put("plugins/es/templates/document/item_document.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-click="selectDocument($event, doc)"><i class="icon ion-document stable" ng-if=":rebind:!doc.avatar"></i> <i class="avatar" ng-if=":rebind:doc.avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i><div class="row no-padding"><div class="col"><h3 class="dark"><i class="ion-locked" ng-if=":rebind:doc.nonce"></i> {{:rebind:doc.time|formatDate}}</h3><h4 class="gray">{{:rebind:\'DOCUMENT.HASH\'|translate}} {{:rebind:doc.hash|formatHash}}</h4></div><div class="col"><h3><a ui-sref="app.wot_identity({pubkey: doc.pubkey, uid: doc.uid})"><span class="gray"><i class="ion-key"></i> {{:rebind:doc.pubkey|formatPubkey}} </span><span class="positive" ng-if=":rebind:doc.uid"><i class="ion-person"></i> {{:rebind:doc.name||doc.uid}}</span></a></h3></div><div class="col"><a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}"><i class="ion-trash-a"></i></a><h3 ng-if=":rebind:doc.recipient"><a ui-sref="app.wot_identity({pubkey: doc.recipient.pubkey, uid: doc.recipient.uid})"><span class="gray"><i class="ion-key"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}} </span><span class="positive" ng-if=":rebind:doc.recipient.uid"><i class="ion-person"></i> {{:rebind:doc.recipient.name||doc.recipient.uid}}</span></a></h3><h4 class="gray" ng-if=":rebind:doc.read_signature"><i class="ion-checkmark"></i> <span translate>DOCUMENT.LOOKUP.READ</span></h4></div></div></ion-item>'),e.put("plugins/es/templates/document/items_documents.html",'<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate="">COMMON.SEARCH_NO_RESULT</div><ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-include="\'plugins/es/templates/document/item_document.html\'"></ng-repeat>'),e.put("plugins/es/templates/document/lookup.html",'<ion-view><ion-nav-title><span translate>DOCUMENT.LOOKUP.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="\'plugins/es/templates/document/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/es/templates/document/lookup_form.html",'<div class="lookupForm"><div class="item no-padding"><label class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()"><div class="helptip-anchor-center"><a id="{{helptipPrefix}}-search-text"></a></div></label></div><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left"><h4 ng-if="search.last" translate="">DOCUMENT.LOOKUP.LAST_DOCUMENTS</h4><h4 ng-if="!search.last">{{\'COMMON.RESULTS_LIST\'|translate}}</h4><h5 class="dark" ng-if="!search.loading && search.total"><span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span> <small class="gray" ng-if=":rebind:search.took && expertMode">- {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }} </small><small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">- <a ng-click="toggleShowQuery()" ng-if="!showQuery"><span translate="">DOCUMENT.LOOKUP.SHOW_QUERY</span> <i class="icon ion-arrow-down-b gray"></i> </a><a ng-click="toggleShowQuery()" ng-if="showQuery"><span translate="">DOCUMENT.LOOKUP.HIDE_QUERY</span> <i class="icon ion-arrow-up-b gray"></i></a></small></h5><h5 class="gray" ng-if="search.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner><span translate="">COMMON.SEARCHING</span><br></h5></div></div><div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode"><small class="no-padding no-margin" ng-if="showQuery"><span class="gray text-wrap dark">{{:rebind:search.query}}</span></small></div><ion-list class="list" ng-class="::motion.ionListClass"><ng-include src="\'plugins/es/templates/document/items_documents.html\'"></ng-include></ion-list><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll></div>'),e.put("plugins/es/templates/document/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left assertive ink" ng-class="{\'gray\': !search.total}" ng-click="removeAll()"><i class="icon ion-trash-a"></i> {{\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/group/edit_group.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span> <span class="visible-xs" ng-if="!loading && !id" translate="">GROUP.EDIT.TITLE_NEW</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()"></button></ion-nav-buttons><ion-content scroll="true"><div class="row no-padding"><div class="col"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><form name="recordForm" novalidate="" ng-submit="save()"><div class="list" ng-class="motion.ionListClass" ng-init="setForm(recordForm)"><div class="item hidden-xs"><h1 ng-if="id" ng-bind-html="formData.title"></h1><h1 ng-if="!id" translate="">GROUP.EDIT.TITLE_NEW</h1><h2 class="balanced" ng-if="!id"><i class="icon ion-android-people"></i> <i class="icon ion-android-lock" ng-if="formData.type==\'managed\'"></i> {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}</h2></div><div class="item" ng-if="id"><h4 class="gray"><i class="icon ion-calendar"></i> {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}}&nbsp;{{formData.time | formatDate}}</h4><div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">{{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}</div></div><ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include><div class="item item-divider" translate="">GROUP.GENERAL_DIVIDER</div><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}"><span class="input-label" translate="">GROUP.EDIT.RECORD_TITLE</span> <input type="text" placeholder="{{\'GROUP.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="group-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true"></div><div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div><div class="item item-input item-floating-label"><span class="input-label" translate="">GROUP.EDIT.RECORD_DESCRIPTION</span><textarea placeholder="{{\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n                </textarea></div><ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include></div></form></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/group/item_group.html",'<a name="group-{{:rebind:group.hash}}"></a><div id="group-{{:rebind:group.hash}}" class="item item-icon-right item-avatar {{::ionItemClass}} ink" ng-click="select(group)"><i class="item-image avatar" style="background-image: url({{::group.avatar.src}})" ng-if="group.avatar"></i> <i class="item-image icon ion-android-people" ng-if="!group.avatar"></i> <i class="item-image icon-secondary ion-android-lock" ng-if="!group.avatar" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9"></i><h2 ng-bind-html=":rebind:group.title"></h2><h4 class="gray pull-right"><i class="ion-clock"></i> {{:rebind:\'GROUP.CREATED_TIME\'|translate: group }}</h4><h4 class="dark pull-left" ng-if=":rebind:group.membersCount"><i class="dark ion-person"></i> <span class="dark">+{{:rebind:group.membersCount}}</span></h4><i class="icon ion-ios-arrow-right"></i></div>'),e.put("plugins/es/templates/group/items_groups.html",'<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate="">COMMON.SEARCH_NO_RESULT</div><ng-repeat ng-repeat="group in :rebind:search.results" ng-include="\'plugins/es/templates/group/item_group.html\'"></ng-repeat>'),e.put("plugins/es/templates/group/list.html",'<ion-list class="{{::motion.ionListClass}}"><ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)"><i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i> <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i><h3 trust-as-html="notification.message | translate:notification"></h3><h4><i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.time|formatFromNow}}</span> <span class="gray">| {{notification.time|formatDate}}</span></h4></ion-item></ion-list><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("plugins/es/templates/group/lookup.html",'<ion-view class="view-group"><ion-nav-title><span translate>GROUP.LOOKUP.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="\'plugins/es/templates/group/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/es/templates/group/lookup_form.html",'<div class="lookupForm"><label class="item item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()"><div class="helptip-anchor-center"><a id="helptip-group-search-text"></a></div></label><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left"><h4 ng-if="search.type==\'open\'" translate="">GROUP.LOOKUP.OPEN_RESULTS_LIST</h4><h4 ng-if="search.type==\'last\'" translate="">GROUP.LOOKUP.LAST_RESULTS_LIST</h4><h4 ng-if="search.type==\'managed\'" translate="">GROUP.LOOKUP.MANAGED_RESULTS_LIST</h4><h4 ng-if="search.type==\'text\'">{{\'COMMON.RESULTS_LIST\'|translate}}</h4><h5 class="dark" ng-if="!search.loading && search.total"><span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span> <small class="gray" ng-if=":rebind:search.took && expertMode">- {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}</small></h5><h5 class="gray" ng-if="search.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner><span translate="">COMMON.SEARCHING</span><br></h5></div></div><div class="list {{::motion.ionListClass}}" ng-if="!$scope.search.loading"><ng-include src="\'plugins/es/templates/group/items_groups.html\'"></ng-include></div><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll></div>'),e.put("plugins/es/templates/group/lookup_item.html",'<i class="item-image avatar" style="background-image: url({{::item.avatar.src}})" ng-if="item.avatar"></i> <i class="item-image icon ion-android-people" ng-if="!item.avatar"></i> <i class="item-image icon-secondary ion-android-lock" ng-if="!item.avatar" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9"></i><h2 ng-bind-html=":rebind:item.title"></h2><h4 class="gray pull-right"><i class="ion-clock"></i> {{:rebind:\'GROUP.CREATED_TIME\'|translate: item }}</h4><h4 class="dark pull-left" ng-if=":rebind:item.membersCount"><i class="dark ion-person"></i> <span class="dark">+{{:rebind:item.membersCount}}</span></h4>'),e.put("plugins/es/templates/group/modal_record_type.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>GROUP.TYPE.TITLE</h1></ion-header-bar><ion-content class="lookupForm padding"><h3 translate>GROUP.TYPE.SELECT_TYPE</h3><div class="list"><div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'open\')"><div class="item-content item-text-wrap"><i class="item-image icon ion-android-people dark"></i><h2 translate>GROUP.TYPE.OPEN_GROUP</h2><h4 class="gray" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4></div></div><div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'managed\')"><div class="item-content item-text-wrap"><i class="item-image icon ion-android-people dark"></i> <i class="icon-secondary ion-android-lock dark" style="left: 10px; top: -8px"></i><h2 translate>GROUP.TYPE.MANAGED_GROUP</h2><h4 class="gray" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4></div></div></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/group/view_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>GROUP.VIEW.MENU_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="showSharePopover($event)"><i class="icon ion-android-share-alt"></i> {{\'COMMON.BTN_SHARE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/group/view_record.html",'<ion-view left-buttons="leftButtons"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit"><i class="icon ion-android-create"></i></button> <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true"><div class="positive-900-bg hero"><div class="content" ng-if="!loading"><i class="avatar cion-registry-{{formData.type}}" ng-if="!formData.avatar"></i> <i class="avatar" style="background-image: url({{::formData.avatar.src}})" ng-if="formData.avatar"></i><h3 ng-bind-html="formData.title"></h3><h4>&nbsp;</h4></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><div class="row no-padding-xs no-padding-sm"><div class="col list item-text-wrap no-padding-xs no-padding-sm" ng-class="::motion.ionListClass"><div class="item"><h2 class="gray"><a ng-if="formData.city" ui-sref="app.groups({location:formData.city})"><i class="icon ion-location"></i> <span ng-bind-html="formData.city"></span> </a><span ng-if="formData.city && formData.type">&nbsp;|&nbsp;</span> <a ng-if="formData.type" ui-sref="app.groups({type:formData.type})"><i class="icon ion-flag"></i> {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}</a></h2><h4><i class="icon ion-clock" ng-if="formData.time"></i> <span translate="">COMMON.SUBMIT_BY</span> <a ng-class="{\'positive\': issuer.uid, \'gray\': !issuer.uid}" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})"><ng-if ng-if="issuer.uid"><i class="icon ion-person"></i> {{::issuer.name||issuer.uid}}</ng-if><span ng-if="!issuer.uid"><i class="icon ion-key"></i> {{issuer.pubkey|formatPubkey}} </span></a><span>{{formData.time|formatFromNow}}<h4 class="gray hidden-xs">| {{formData.time | formatDate}}</h4></span></h4></div><a id="group-share-anchor-{{id}}"></a><ion-item><h2><span trust-as-html="formData.description"></span></h2></ion-item><ion-item><h4 ng-if="formData.address"><span class="gray" translate="">REGISTRY.VIEW.LOCATION</span> <a class="positive" target="_blank" href="https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}"><span ng-bind-html="formData.address"></span> <span ng-if="formData.city">- </span><span ng-bind-html="formData.city"></span></a></h4></ion-item><ng-if ng-if="formData.socials && formData.socials.length>0"><ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}}</p><h2><a href="{{social.url}}" ng-if="social.type != \'email\'" target="_blank">{{social.url}}</a> <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a></h2></ion-item></ng-if><div class="lazy-load"><ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include><span class="item item-divider" ng-if="formData.pubkey"><span translate="">REGISTRY.TECHNICAL_DIVIDER</span></span><div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}"><i class="icon ion-key"></i> <span translate="">REGISTRY.EDIT.RECORD_PUBKEY</span><h4 class="dark">{{::formData.pubkey}}</h4></div><ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include></div></div></div></ion-content><button class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey: formData.pubkey, uid: formData.title})"></button></ion-view>'),e.put("plugins/es/templates/invitation/list_invitation.html",'<ion-list class="{{::motion.ionListClass}}"><ion-item ng-repeat="invitation in search.results" class="item-border-large item-text-wrap item-avatar"><i ng-if="::!invitation.avatar" class="item-image icon {{::invitation.avatarIcon}}"></i> <i ng-if="::invitation.avatar" class="item-image avatar" style="background-image: url({{::invitation.avatar.src}})"></i><h3 trust-as-html="invitation.message | translate:invitation"></h3><h3 class="dark text-italic" ng-if="invitation.comment"><i class="icon ion-quote"></i> <span ng-bind-html="invitation.comment"></span></h3><h4><i class="icon {{::invitation.icon}}"></i> <span class="dark" ng-if="::invitation.issuer" trust-as-html="\'INVITATION.SUGGESTED_BY\' | translate:invitation"></span> <span class="dark">{{::invitation.time|formatFromNow}}</span> <span class="gray">| {{::invitation.time|formatDate}}</span></h4><div class="block text-right"><button class="button button-positive button-small button-small-padding" ng-click="accept(invitation)" ng-if="::invitation.state" translate>{{::(invitation.okText||\'COMMON.BTN_SHOW\') |translate}}</button> <button class="button button-stable button-small button-small-padding" ng-click="delete($index)" translate>INVITATION.BTN_DELETE</button></div></ion-item></ion-list><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("plugins/es/templates/invitation/modal_new_invitation.html",'<ion-modal-view id="transfer" class="modal-invitation modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>INVITATION.NEW.TITLE</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()"></button></ion-header-bar><ion-content scroll="true"><ng-include src="\'plugins/es/templates/invitation/new_invitation_form.html\'"></ng-include></ion-content></ion-modal-view>'),
+TITLE:"Register",CATEGORY:"Hoofdactiviteit:",LOCATION:"Adres:",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe referentie",SELECT_TYPE:"Soort organizatie:",ENUM:{SHOP:"Locale winkel",COMPANY:"Onderneming",ASSOCIATION:"Stichting",INSTITUTION:"Instituut"}},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe referentie",RECORD_TYPE:"Soort organizatie",RECORD_TITLE:"Naam",RECORD_TITLE_HELP:"Naam",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Omschrijf activiteit",RECORD_ADDRESS:"Straat",RECORD_ADDRESS_HELP:"Straat, gebouw...",RECORD_CITY:"Plaats",RECORD_CITY_HELP:"Plaats",RECORD_SOCIAL_NETWORKS:"Sociale media en website",RECORD_PUBKEY:"Publieke sleutel",RECORD_PUBKEY_HELP:"Publieke sleutel om betalingen te ontvangen"},ERROR:{LOAD_CATEGORY_FAILED:"Laden hoofdactiveiten mislukt",LOAD_RECORD_FAILED:"Laden datasheet mislukt",LOOKUP_RECORDS_FAILED:"Opzoeken datasheets is mislukt.",REMOVE_RECORD_FAILED:"Verwijderen datasheet mislukt",SAVE_RECORD_FAILED:"Opslaan datasheet mislukt",RECORD_NOT_EXISTS:"Datasheet niet gevonden"},INFO:{RECORD_REMOVED:"Datasheet succesvol verwijderd"}},PROFILE:{UID:"Pseudoniem",TITLE:"Naam",TITLE_HELP:"Naam",DESCRIPTION:"Over mij",DESCRIPTION_HELP:"Over mij...",ADDRESS:"Adres",ADDRESS_HELP:"Adres (optioneel)",CITY:"Plaats",CITY_HELP:"Plaats (optioneel)",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Algemene informatie",LOCATION_DIVIDER:"Localisatie",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",ERROR:{LOAD_PROFILE_FAILED:"Kon gebruikersprofiel niet laden.",SAVE_PROFILE_FAILED:"Opslaan profiel mislukt",INVALID_SOCIAL_NETWORK_FORMAT:"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fout tijdens afbeelding schalen"},INFO:{PROFILE_SAVED:"Profiel opgeslagen"},HELP:{WARNING_PUBLIC_DATA:"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>."}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",ENABLE_TOGGLE:"Uitbreiding inschakelen?",ENABLE_MESSAGE_TOGGLE:"Berichten inschakelen?",ENABLE_SETTINGS_TOGGLE:"Globale opslag voor instellingen inschakelen?",PEER:"Adres dataknooppunt",POPUP_PEER:{TITLE:"Dataknoop",HELP:"Stel het te gebruiken adres in:",PEER_HELP:"server.domein.com:poort"},NOTIFICATIONS:{DIVIDER:"Notificaties",HELP_TEXT:"Schakel het type notificatie dat je wil ontvangen in:",ENABLE_TX_SENT:"Bericht bij validatie van <b>verzonden betalingen</b>?",ENABLE_TX_RECEIVED:"Bericht bij validatie van <b>ontvangen betalingen</b>?",ENABLE_CERT_SENT:"Bericht bij validatie van <b>verzonden certificaties</b>?",ENABLE_CERT_RECEIVED:"Bericht bij validatie van <b>ontvangen certificaties</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Optionele functies",ASK_ENABLE:'Cesium+ is <b>uitgeschakeld</b> waardoor deze functies niet beschikbaar zijn: <ul><li>&nbsp;&nbsp;<b><i class="icon ion-person"></i> Gebruikersprofielen</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-android-notifcaitions"></i> Notificaties</b>;<li>&nbsp;&nbsp;<b><i class="icon ion-email"></i> Privéberichten</b>.</ul><br/><br/>Wil je deze functies <b>inschakelen</b>?'}},EVENT:{NODE_STARTED:"Je knoop ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.",NODE_BMA_UP:"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer bereikbaar.",MEMBER_JOIN:"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!",MEMBER_ACTIVE:"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.",TX_SENT:"Je <b>betaling</b> aan <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.",TX_SENT_MULTI:"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.",TX_RECEIVED:"Je hebt een <b>betaling ontvangen</b> van <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.",CERT_SENT:"Je <b>certificatie</b> van <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.",CERT_RECEIVED:"Je hebt een <b>certificatie ontvangen</b> van <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Knooppunt <b>{{old}}</b> onbereikbaar of ongeldig adres.<br/><br/>Tijdelijk knooppunt <b>{{new}}</b> gebruiken?"},ERROR:{ES_CONNECTION_ERROR:'Knooppunt <b>{{server}}</b> onbereikbaar of ongeldig adres.<br/><br/>Cesium zal verder weken, <b>zonder de Cesium+ uitbreiding</b> (gebruikersprofielens, privéberichten, kaarten en grafieken).<br/><br/>Controleer je internetverbinding, of verander je knooppunt in <a class="positive" ng-click="doQuickFix(\'settings\')">instellingen</a>.',ES_MAX_UPLOAD_BODY_SIZE:"De hoveelheid te verzenden gegevens is overschrijdt de serverlimiet.<br/><br/>Probeer het nogmaals na, bijvoorbeeld, het wissen foto's."}}),e.translations("en-GB",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},ACCOUNT:{TITLE:"Statistics",BTN_SHOW_STATS:"View account Statistics",BALANCE_DIVIDER:"Account status",BALANCE_TITLE:"Evolution of the account {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Receipts",TX_SENT_LABEL:"Spending",UD_LABEL:"UD",BALANCE_LABEL:"Balance",INPUT_CHART_TITLE:"Sum of incoming flows, per transmitter:",OUTPUT_CHART_TITLE:"Sum of outgoing flows, per recipient:"},BLOCKCHAIN:{TITLE:"Statistics",BLOCKS_ISSUERS_DIVIDER:"Written blocks by members",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Number of blocks calculated per member",BLOCKS_ISSUERS_LABEL:"Number of blocks",TX_DIVIDER:"Analysis of transactions",TX_AMOUNT_TITLE:"Transaction volume",TX_AMOUNT_PUBKEY_TITLE:"Volume of transactions calculated by {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Exchange volume",TX_COUNT_TITLE:"Number of written transactions",TX_COUNT_LABEL:"Number of transactions",TX_AVG_BY_BLOCK:"Average per block"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution of the monetary mass",MONETARY_MASS_LABEL:"Monetary mass",MONETARY_MASS_SHARE_LABEL:"Average per member",UD_TITLE:"Evolution of the universal dividend",MEMBERS_COUNT_TITLE:"Evolution of the number of members",MEMBERS_COUNT_LABEL:"Number of members"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics (Cesium+)",USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},USER_DELTA:{TITLE:"Delta / Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("en",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},ACCOUNT:{TITLE:"Statistics",BTN_SHOW_STATS:"View account Statistics",BALANCE_DIVIDER:"Account status",BALANCE_TITLE:"Evolution of the account {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Receipts",TX_SENT_LABEL:"Spending",UD_LABEL:"UD",BALANCE_LABEL:"Balance",INPUT_CHART_TITLE:"Sum of incoming flows, per transmitter:",OUTPUT_CHART_TITLE:"Sum of outgoing flows, per recipient:"},BLOCKCHAIN:{TITLE:"Statistics",BLOCKS_ISSUERS_DIVIDER:"Written blocks by members",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> calculated <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Number of blocks calculated per member",BLOCKS_ISSUERS_LABEL:"Number of blocks",TX_DIVIDER:"Analysis of transactions",TX_AMOUNT_TITLE:"Transaction volume",TX_AMOUNT_PUBKEY_TITLE:"Volume of transactions calculated by {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Exchange volume",TX_COUNT_TITLE:"Number of written transactions",TX_COUNT_LABEL:"Number of transactions",TX_AVG_BY_BLOCK:"Average per block"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution of the monetary mass",MONETARY_MASS_LABEL:"Monetary mass",MONETARY_MASS_SHARE_LABEL:"Average per member",UD_TITLE:"Evolution of the universal dividend",MEMBERS_COUNT_TITLE:"Evolution of the number of members",MEMBERS_COUNT_LABEL:"Number of members"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics (Cesium+)",USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},USER_DELTA:{TITLE:"Delta / Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("eo-EO",{NETWORK:{VIEW:{BTN_GRAPH:"Statistikoj"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineara skalo",LOGARITHMIC_SCALE:"Logaritma skalo",BTN_SHOW_STATS:"Vidi la statistikojn",BTN_SHOW_DETAILED_STATS:"Detalaj statistikoj",RANGE_DURATION_DIVIDER:"Tempo-unuo:",RANGE_DURATION:{HOUR:"Horo",DAY:"Tago",MONTH:"Monato"}},ACCOUNT:{TITLE:"Statistikoj",BTN_SHOW_STATS:"Vidi la statistikojn de la konto",BALANCE_DIVIDER:"Stato de la konto",BALANCE_TITLE:"Evoluo de la konto {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Enspezoj",TX_SENT_LABEL:"Elspezoj",TX_ACCUMULATION_LABEL:"Bilanco de la spezoj",UD_LABEL:"UD",UD_ACCUMULATION_LABEL:"Bilanco de la UD",BALANCE_LABEL:"Saldo",WOT_DIVIDER:"Reto de fido",CERTIFICATION_TITLE:"Nombro de atestaĵoj - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Tuto pri la ricevitaj",RECEIVED_CERT_DELTA_LABEL:"Vario pri la ricevitaj",GIVEN_CERT_LABEL:"Tuto pri la senditaj",GIVEN_CERT_DELTA_LABEL:"Vario pri la senditaj",INPUT_CHART_TITLE:"Sumo de la enirantaj fluoj, por ĉiu sendinto:",OUTPUT_CHART_TITLE:"Sumo de la elirantaj fluoj, por ĉiu ricevinto:"},BLOCKCHAIN:{TITLE:"Statistikoj",BLOCKS_ISSUERS_DIVIDER:"Analizo de la kalkul-distribuo",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membroj</b> kalkulis <b>{{blockCount|formatInteger}} blokojn</b>",BLOCKS_ISSUERS_TITLE:"Nombro de blokoj kalkulitaj por membro",BLOCKS_ISSUERS_LABEL:"Nombro de blokoj",TX_DIVIDER:"Analizo de la spezoj",TX_AMOUNT_TITLE:"Kvanto de la spezoj",TX_AMOUNT_PUBKEY_TITLE:"Kvanto de spezoj kalkulitaj de {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Kvanto interŝanĝita",TX_COUNT_TITLE:"Nombro de spezoj skribitaj",TX_COUNT_LABEL:"Nombro de spezoj",TX_AVG_BY_BLOCK:"Meza nombro de spezoj / bloko"},CURRENCY:{MONETARY_MASS_TITLE:"Evoluo de la mona maso",MONETARY_MASS_LABEL:"Mona maso",MONETARY_MASS_SHARE_LABEL:"Mezumo por membro",UD_TITLE:"Evoluo de la universala dividendo",MEMBERS_COUNT_TITLE:"Evoluo de la nombro de membroj",MEMBERS_COUNT_LABEL:"Nombro de membroj"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombro de blokoj kalkulitaj",BLOCK_COUNT:"{{count}} blokoj",NO_BLOCK:"Neniu bloko"}},DOC_STATS:{TITLE:"Statistikoj pri stokado",USER:{TITLE:"Nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},MESSAGE:{TITLE:"Nombro de dokumentoj ligitaj al komunikado",MESSAGE_INBOX:"Mesaĝoj en ricevujo",MESSAGE_OUTBOX:"Senditaj mesaĝoj konservitaj",INVITATION_CERTIFICATION:"Invitoj atestotaj"},SOCIAL:{TITLE:"Nombro de paĝoj aŭ grupoj",PAGE_COMMENT:"Komentoj",PAGE_RECORD:"Paĝoj",GROUP_RECORD:"Grupoj"},OTHER:{TITLE:"Aliaj dokumentoj",HISTORY_DELETE:"Forigoj de dokumentoj"}},SYNCHRO:{TITLE:"Statistikoj pri sinkronigoj",COUNT:{TITLE:"Kvanto sinkronigita",INSERTS:"Enmetoj",UPDATES:"Ĝisdatigoj",DELETES:"Forigoj"},PEER:{TITLE:"Nodoj informpetitaj",ES_USER_API:"Nodoj pri datenoj de uzantoj",ES_SUBSCRIPTION_API:"Nodoj pri retaj servoj"},PERFORMANCE:{TITLE:"Efikecoj pri efektiviĝo",DURATION:"Tempo por efektiviĝo (ms)"}}}}),e.translations("es-ES",{NETWORK:{VIEW:{BTN_GRAPH:"Estadística"}},GRAPH:{COMMON:{LINEAR_SCALE:"Escala lineal",LOGARITHMIC_SCALE:"Escala logarítmica",BTN_SHOW_STATS:"Ver estadísticas",BTN_SHOW_DETAILED_STATS:"Estadísticas detalladas",RANGE_DURATION_DIVIDER:"Unidad de paso:",RANGE_DURATION:{HOUR:"Grupo por <b>hora</b>",DAY:"Grupo por <b>día</b>",MONTH:"Grupo por <b>mes</b>"}},ACCOUNT:{INPUT_CHART_TITLE:"Suma del flujo entrante, por el transmisor:",OUTPUT_CHART_TITLE:"Suma de las salidas por destino:"},BLOCKCHAIN:{TITLE:"Estadística",BLOCKS_ISSUERS_DIVIDER:"Bloques escritos por los miembros",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} members</b> has computed <b>{{blockCount|formatInteger}} blocks</b>",BLOCKS_ISSUERS_TITLE:"Número de bloques miembro calculado",BLOCKS_ISSUERS_LABEL:"Número de bloques",TX_DIVIDER:"Análisis de transacciones",TX_AMOUNT_TITLE:"El volumen de operaciones",TX_AMOUNT_PUBKEY_TITLE:"El volumen de operaciones calculado por {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volumen negociado",TX_COUNT_TITLE:"Número de transacciones escritas",TX_COUNT_LABEL:"Número de transacciones",TX_AVG_BY_BLOCK:"Promedio por bloque"},CURRENCY:{MONETARY_MASS_TITLE:"Evolución de la masa monetaria",MONETARY_MASS_LABEL:"Masa monetaria",MONETARY_MASS_SHARE_LABEL:"Promedio miembro",UD_TITLE:"Evolución del dividendo universales",MEMBERS_COUNT_TITLE:"Evolución del número de miembros",MEMBERS_COUNT_LABEL:"Número de miembros"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Número de bloques calculados",BLOCK_COUNT:"{{count}} bloques",NO_BLOCK:"Ningún bloque"}}}}),e.translations("fr-FR",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiques"}},GRAPH:{COMMON:{LINEAR_SCALE:"Echelle linéaire",LOGARITHMIC_SCALE:"Echelle logarithmique",BTN_SHOW_STATS:"Voir les statistiques",BTN_SHOW_DETAILED_STATS:"Statistiques détaillées",RANGE_DURATION_DIVIDER:"Unité de temps :",RANGE_DURATION:{HOUR:"Heure",DAY:"Jour",MONTH:"Mois"}},ACCOUNT:{TITLE:"Statistiques",BTN_SHOW_STATS:"Voir les statistiques du compte",BALANCE_DIVIDER:"Situation du compte",BALANCE_TITLE:"Evolution du compte {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Recettes",TX_SENT_LABEL:"Dépenses",TX_ACCUMULATION_LABEL:"Bilan des transactions",UD_LABEL:"DU",UD_ACCUMULATION_LABEL:"Bilan des DU",BALANCE_LABEL:"Solde",WOT_DIVIDER:"Toile de confiance",CERTIFICATION_TITLE:"Nombre de certifications - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Total reçues",RECEIVED_CERT_DELTA_LABEL:"Variation reçues",GIVEN_CERT_LABEL:"Total envoyées",GIVEN_CERT_DELTA_LABEL:"Variation envoyées",INPUT_CHART_TITLE:"Somme des flux entrants, par émetteur :",OUTPUT_CHART_TITLE:"Somme des flux sortants, par destinaire :"},BLOCKCHAIN:{TITLE:"Statistiques",BLOCKS_ISSUERS_DIVIDER:"Analyse de la répartition du calcul",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membres</b> ont calculé <b>{{blockCount|formatInteger}} blocs</b>",BLOCKS_ISSUERS_TITLE:"Nombre de blocs calculés par membre",BLOCKS_ISSUERS_LABEL:"Nombre de blocs",TX_DIVIDER:"Analyse des transactions",TX_AMOUNT_TITLE:"Volume des transactions",TX_AMOUNT_PUBKEY_TITLE:"Volume des transactions calculées par {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volume échangé",TX_COUNT_TITLE:"Nombre de transactions écrites",TX_COUNT_LABEL:"Nombre de transactions",TX_AVG_BY_BLOCK:"Nombre moyen de transactions / bloc"},CURRENCY:{MONETARY_MASS_TITLE:"Evolution de la masse monétaire",MONETARY_MASS_LABEL:"Masse monétaire",MONETARY_MASS_SHARE_LABEL:"Moyenne par membre",UD_TITLE:"Evolution du dividende universel",MEMBERS_COUNT_TITLE:"Evolution du nombre de membres",MEMBERS_COUNT_LABEL:"Nombre de membres"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombre de blocs calculés",BLOCK_COUNT:"{{count}} blocs",NO_BLOCK:"Aucun bloc"}},DOC_STATS:{TITLE:"Statistiques de stockage (Cesium+)",USER:{TITLE:"Nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},USER_DELTA:{TITLE:"Variation du nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},MESSAGE:{TITLE:"Nombre de documents liés à la communication",MESSAGE_INBOX:"Messages en boîte de réception",MESSAGE_OUTBOX:"Messages envoyés sauvegardés",INVITATION_CERTIFICATION:"Invitations à certifier"},SOCIAL:{TITLE:"Nombre de pages ou groupes",PAGE_COMMENT:"Commentaires",PAGE_RECORD:"Pages",GROUP_RECORD:"Groupes"},OTHER:{TITLE:"Autres documents",HISTORY_DELETE:"Suppressions de documents"}},SYNCHRO:{TITLE:"Statistiques de synchronisations",COUNT:{TITLE:"Volume synchronisé",INSERTS:"Insertions",UPDATES:"Mises à jour",DELETES:"Suppressions"},PEER:{TITLE:"Noeuds requêtés",ES_USER_API:"Noeuds données utilisateurs",ES_SUBSCRIPTION_API:"Noeuds services en ligne"},PERFORMANCE:{TITLE:"Performances d'exécution",DURATION:"Temps d'exécution (ms)"}}}}),e.translations("it-IT",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiche"}},GRAPH:{COMMON:{LINEAR_SCALE:"Scala lineare",LOGARITHMIC_SCALE:"Scala logaritmica",BTN_SHOW_STATS:"Vedere le statistiche",BTN_SHOW_DETAILED_STATS:"Statistiche dettagliate",RANGE_DURATION_DIVIDER:"Unità di tempo :",RANGE_DURATION:{HOUR:"Ora",DAY:"Giorno",MONTH:"Mese"}},ACCOUNT:{TITLE:"Statistiche",BTN_SHOW_STATS:"Visualizzare le statistiche del conto",BALANCE_DIVIDER:"Situazione del conto",BALANCE_TITLE:"Evoluzione del conto {{pubkey|formatPubkey}}",TX_RECEIVED_LABEL:"Incassi",TX_SENT_LABEL:"Spese",TX_ACCUMULATION_LABEL:"Bilancio delle transazioni",UD_LABEL:"DU",UD_ACCUMULATION_LABEL:"Bilancio dei DU",BALANCE_LABEL:"Saldo",WOT_DIVIDER:"Tela di fiducia",CERTIFICATION_TITLE:"Numero di certificazioni - {{pubkey|formatPubkey}}",RECEIVED_CERT_LABEL:"Totale ricevute",RECEIVED_CERT_DELTA_LABEL:"Variazione ricevute",GIVEN_CERT_LABEL:"Totale inviate",GIVEN_CERT_DELTA_LABEL:"Variazione inviate",INPUT_CHART_TITLE:"Somma dei flussi in entrata, par emittente :",OUTPUT_CHART_TITLE:"Somma dei flussi in uscita, per destinatario :"},BLOCKCHAIN:{TITLE:"Statistiche",BLOCKS_ISSUERS_DIVIDER:"Analisi della ripartizione del calcolo",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} membri</b> hanno calcolato <b>{{blockCount|formatInteger}} blocchi</b>",BLOCKS_ISSUERS_TITLE:"Numero di blocchi calcolati a membro",BLOCKS_ISSUERS_LABEL:"Numero di blocchi",TX_DIVIDER:"Analisi delle transazioni",TX_AMOUNT_TITLE:"Volume delle transazioni",TX_AMOUNT_PUBKEY_TITLE:"Volume delle transazioni calcolato da {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Volume scambiato",TX_COUNT_TITLE:"Numero di transazioni scritte",TX_COUNT_LABEL:"Numero di transazioni",TX_AVG_BY_BLOCK:"Numero medio di transazioni / blocco"},CURRENCY:{MONETARY_MASS_TITLE:"Evoluzione della massa monetaria",MONETARY_MASS_LABEL:"Massa monetaria",MONETARY_MASS_SHARE_LABEL:"Media a membro",UD_TITLE:"Evoluzione del Dividendo Universale",MEMBERS_COUNT_TITLE:"Evoluzione del numero di membri",MEMBERS_COUNT_LABEL:"Numero di membri"},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Numero di blocchi calcolati",BLOCK_COUNT:"{{count}} blocchi",NO_BLOCK:"Nessun blocco"}},DOC_STATS:{TITLE:"Statistiche di stoccaggio",USER:{TITLE:"Numero di documenti legati ad un conto",USER_PROFILE:"Profili dell'utente",USER_SETTINGS:"Impostazioni salvate"},MESSAGE:{TITLE:"Numero di documenti legati alla conversazione",MESSAGE_INBOX:"Messaggi in arrivo",MESSAGE_OUTBOX:"Messaggi inviati salvati",INVITATION_CERTIFICATION:"Invitazioni da certificare"},SOCIAL:{TITLE:"Numero di pagine o gruppi",PAGE_COMMENT:"Commenti",PAGE_RECORD:"Pagine",GROUP_RECORD:"Gruppi"},OTHER:{TITLE:"Altri documenti",HISTORY_DELETE:"Cronologia eliminazione documenti"}},SYNCHRO:{TITLE:"Statistiche di sincronizzazioni",COUNT:{TITLE:"Volume sincronizzato",INSERTS:"Inserimenti",UPDATES:"Aggiornamenti",DELETES:"Eliminazioni"},PEER:{TITLE:"Nodi interrogati",ES_USER_API:"Nodi dati utenti",ES_SUBSCRIPTION_API:"Noeuds servizi online"},PERFORMANCE:{TITLE:"Prestazioni (performance) di esecuzione",DURATION:"Tempo di esecuzione (ms)"}}}}),e.translations("nl-NL",{NETWORK:{VIEW:{BTN_GRAPH:"Statistieken"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineaire schaal",LOGARITHMIC_SCALE:"Logaritmische schaal",BTN_SHOW_STATS:"Zie statistieken",BTN_SHOW_DETAILED_STATS:"Gedetailleerde statistieken",RANGE_DURATION_DIVIDER:"Stap eenheid:",RANGE_DURATION:{HOUR:"Groep per <b>uur</b>",DAY:"Groep per <b>dag</b>",MONTH:"Groep per <b>maand</b>"}},ACCOUNT:{INPUT_CHART_TITLE:"Som van de binnenkomende stroom, door de zender:",OUTPUT_CHART_TITLE:"Som van de uitstroom per bestemming:"},BLOCKCHAIN:{TITLE:"Statistieken",BLOCKS_ISSUERS_DIVIDER:"Schriftelijke blokken door leden",BLOCKS_ISSUERS_HELP:"<b>{{issuerCount|formatInteger}} leden</b> berekend <b>{{blockCount|formatInteger}} blokken</b>",BLOCKS_ISSUERS_TITLE:"Aantal blokken berekend per lid",BLOCKS_ISSUERS_LABEL:"Aantal blokken",TX_DIVIDER:"Analyse van transacties",TX_AMOUNT_TITLE:"Trading volume",TX_AMOUNT_PUBKEY_TITLE:"Trading volume dat wordt berekend door {{issuer | formatPubkey}}",TX_AMOUNT_LABEL:"Verhandeld volume",TX_COUNT_TITLE:"Aantal schriftelijke transacties",TX_COUNT_LABEL:"Aantal transacties",TX_AVG_BY_BLOCK:"Gemiddeld aantal transacties / blok"},CURRENCY:{MONETARY_MASS_TITLE:"Evolutie van de monetaire massa",MONETARY_MASS_LABEL:"Monetaire massa",MONETARY_MASS_SHARE_LABEL:"Gemiddelde leden",UD_TITLE:"Ontwikkeling van de universele dividend",MEMBERS_COUNT_TITLE:"Evolutie van het aantal leden",MEMBERS_COUNT_LABEL:"Aantal leden"}}}),e.translations("fr-FR",{RML9:{BTN_EXPORT:"Télécharger",BTN_OPEN:"Ouvrir la page RML9",BTN_SWOW_TX:"Voir les transactions",FILE_NAME:"relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Date",AMOUNT:"Montant",COMMENT:"Commentaire"},VIEW:{TITLE:"RML9",DIVIDER:"Dernières transactions :",BALANCE:"Solde du compte"},CHART:{INPUT_CHART_TITLE:"Somme des flux entrants, par émetteur :",OUTPUT_CHART_TITLE:"Somme des flux sortants, par destinaire :"},SETTINGS:{ENABLE_TOGGLE:"Activer le plugin RML9 ?"}}}),e.translations("en-GB",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_LOCALIZE_ME:"Localize me"},NETWORK:{LOOKUP:{BTN_MAP:"Peers map",BTN_MAP_HELP:"Open peers map"},VIEW:{TITLE:"Peers map",LAYER:{MEMBER:"Member peers",MIRROR:"Mirror peers",OFFLINE:"Offline peers"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Members',PENDING:'<i class="icon ion-clock energized"></i> Pending registrations',WALLET:'<i class="icon ion-card gray"></i> Simple wallets'}},ERROR:{LOAD_POSITION_FAILED:"Can not retrieve the positions to display."}},REGISTRY:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open the map of the pages"},VIEW:{TITLE:"Map of pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Local shops',COMPANY:'<i class="icon ion-page-company positive"></i> Companies',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"},SETTINGS:{MAP_DIVIDER:"Maps",ENABLE_GOOGLE_API:"Enable Google API services?",ENABLE_GOOGLE_API_HELP:"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.",GOOGLE_API_KEY:"Google API key",BTN_GOOGLE_API:"Getting a key",BTN_GOOGLE_API_WARNING:"requires a Google account",GOOGLE_API_KEY_PLACEHOLDER:"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.",WOT_BTN_LAYERS:"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.",WOT_BTN_SEARCH:"You can <b>search</b> by name, public key, or member pseudonym."}}}}),e.translations("en",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_LOCALIZE_ME:"Localize me"},NETWORK:{LOOKUP:{BTN_MAP:"Peers map",BTN_MAP_HELP:"Open peers map"},VIEW:{TITLE:"Peers map",LAYER:{MEMBER:"Member peers",MIRROR:"Mirror peers",OFFLINE:"Offline peers"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open members map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Members',PENDING:'<i class="icon ion-clock energized"></i> Pending registrations',WALLET:'<i class="icon ion-card gray"></i> Simple wallets'}},ERROR:{LOAD_POSITION_FAILED:"Can not retrieve the positions to display."}},REGISTRY:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open the map of the pages"},VIEW:{TITLE:"Map of pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Local shops',COMPANY:'<i class="icon ion-page-company positive"></i> Companies',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"},SETTINGS:{MAP_DIVIDER:"Maps",ENABLE_GOOGLE_API:"Enable Google API services?",ENABLE_GOOGLE_API_HELP:"In the <b>members map</b>, allows you to display accounts with an address but without geolocation.",GOOGLE_API_KEY:"Google API key",BTN_GOOGLE_API:"Getting a key",BTN_GOOGLE_API_WARNING:"requires a Google account",GOOGLE_API_KEY_PLACEHOLDER:"eg: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"This map displays <b>profiles with a position</b>, whether they are member accounts or not.<br/><br/>Only profiles with the option &quot;appear on the map&quot; has been activated.",WOT_BTN_LAYERS:"<b>Filter the displayed data</b>: members, pending registrations, simple portfolios, etc.",WOT_BTN_SEARCH:"You can <b>search</b> by name, public key, or member pseudonym."}}}}),e.translations("eo-EO",{MAP:{COMMON:{SEARCH_DOTS:"Traserĉi...",BTN_LOCALIZE_ME:"Lokalizi min"},NETWORK:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri nodoj"},VIEW:{TITLE:"Mapo pri nodoj",LAYER:{MEMBER:"Membro-nodoj",MIRROR:"Spegul-nodoj",OFFLINE:"Nekonektitaj nodoj"}}},WOT:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri membroj"},VIEW:{TITLE:"Mapo pri membroj",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membroj',PENDING:'<i class="icon ion-clock energized"></i> Aliĝoj atendantaj',WALLET:'<i class="icon ion-card gray"></i> Simplaj monujoj'}},ERROR:{LOAD_POSITION_FAILED:"Neeblas ricevi la lokojn afiŝotajn."}},REGISTRY:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri paĝoj"},VIEW:{TITLE:"Mapo pri paĝoj",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Lokaj komercoj',COMPANY:'<i class="icon ion-page-company positive"></i> Entreprenoj',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Asocioj',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institucioj'}}},PROFILE:{MARKER_HELP:"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo."},ERROR:{LOCALIZE_ME_FAILED:"Neeblas ricevi vian nunan lokon"},SETTINGS:{MAP_DIVIDER:"Mapoj",ENABLE_GOOGLE_API:"Aktivigi la Google-API-servojn?",ENABLE_GOOGLE_API_HELP:"Ebligas afiŝi sur la <b>mapo pri membroj</b> kontojn kun adreso sed sen iu GPS-lokalizo.",GOOGLE_API_KEY:"Google-API-ŝlosilo",BTN_GOOGLE_API:"Ekhavi ŝlosilon",BTN_GOOGLE_API_WARNING:"Necesigas havi Google-konton",GOOGLE_API_KEY_PLACEHOLDER:"Ekzemple: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Tiu ĉi mapo afiŝas <b>la profilojn kun loko</b>, ĉu ili rilatas al membro-kontoj aŭ ne.<br/><br/>Nur videblas la profiloj, kies kromaĵo &quot;aperi sur la mapo&quot; estis aktivigita.",WOT_BTN_LAYERS:"<b>Filtru ĉi tie la afiŝitajn datenojn</b>: membroj, aliĝoj atendantaj, simplaj monujoj, ktp.",WOT_BTN_SEARCH:"Vi povas <b>efektivigi serĉadon</b> laŭ nomo, publika ŝlosilo aŭ membro-pseŭdonimo."}}}}),e.translations("fr-FR",{MAP:{COMMON:{SEARCH_DOTS:"Rechercher...",BTN_LOCALIZE_ME:"Me localiser"},NETWORK:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des noeuds"},VIEW:{TITLE:"Carte des noeuds",LAYER:{MEMBER:"Nœuds membre",MIRROR:"Nœuds miroir",OFFLINE:"Nœuds hors ligne"}}},WOT:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des membres"},VIEW:{TITLE:"Carte des membres",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membres',PENDING:'<i class="icon ion-clock energized"></i> Inscriptions en attente',WALLET:'<i class="icon ion-card gray"></i> Simples portefeuilles'}},ERROR:{LOAD_POSITION_FAILED:"Impossible de récupérer les positions à afficher."}},REGISTRY:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des pages"},VIEW:{TITLE:"Carte des pages",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Commerces locaux',COMPANY:'<i class="icon ion-page-company positive"></i> Entreprises',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associations',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Institutions'}}},PROFILE:{
+MARKER_HELP:"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b> sur la carte, ou utilisez le bouton<br/>de recherche au-dessus de la carte."},ERROR:{LOCALIZE_ME_FAILED:"Impossible de récupérer votre position actuelle"},SETTINGS:{MAP_DIVIDER:"Cartes",ENABLE_GOOGLE_API:"Activer les services Google API ?",ENABLE_GOOGLE_API_HELP:"Permet l'affichage dans la <b>carte des membres</b> des comptes ayant une adresse mais aucun positionnement GPS.",GOOGLE_API_KEY:"Clé d'API Google",BTN_GOOGLE_API:"Obtenir une clé",BTN_GOOGLE_API_WARNING:"Nécessite d'avoir un compte Google",GOOGLE_API_KEY_PLACEHOLDER:"Exemple : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Cette carte affiche <b>les profils ayant une position</b>, qu'ils correspondent à des comptes membre ou non.<br/><br/>Seuls sont visibles les profils dont l'option &quot;apparaître sur la carte&quot; a été activée.",WOT_BTN_LAYERS:"<b>Filtrez ici les données affichées</b> : membres, inscriptions en attente, simples portefeuilles, etc.",WOT_BTN_SEARCH:"Vous pouvez <b>effectuer une recherche</b> par nom, clef publique ou pseudonyme de membre."}}}}),e.translations("it-IT",{MAP:{COMMON:{SEARCH_DOTS:"Ricerca...",BTN_LOCALIZE_ME:"Trovami"},NETWORK:{LOOKUP:{BTN_MAP:"Mappa dei peers",BTN_MAP_HELP:"Aprire mappa dei peers"},VIEW:{TITLE:"Mappa dei peers",LAYER:{MEMBER:"Peers membri",MIRROR:"Peers specchi",OFFLINE:"Peers offline"}}},WOT:{LOOKUP:{BTN_MAP:"Mappa dei membri",BTN_MAP_HELP:"Aprire mappa dei membri"},VIEW:{TITLE:"Mappa membri",LAYER:{MEMBER:'<i class="icon ion-person positive"></i> Membri',PENDING:'<i class="icon ion-clock energized"></i> Registrazione pendenti',WALLET:'<i class="icon ion-card gray"></i> Portafogli osservatori'}},ERROR:{LOAD_POSITION_FAILED:"Errore nel caricamento delle posizioni."}},REGISTRY:{LOOKUP:{BTN_MAP:"Mappa",BTN_MAP_HELP:"Aprire la mappa delle pagine pro"},VIEW:{TITLE:"Mappa delle pagine pro",LAYER:{SHOP:'<i class="icon ion-page-shop positive"></i> Negozi locali',COMPANY:'<i class="icon ion-page-company positive"></i> Aziende',ASSOCIATION:'<i class="icon ion-page-association energized"></i> Associazioni',INSTITUTION:'<i class="icon ion-page-institution gray"></i> Instituti'}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> questo indicatore per <b>aggiornare<br/>tua posizione</b>, o usa i bottoni <br/>sopra la mappa."},ERROR:{LOCALIZE_ME_FAILED:"Impossible trovare tua posizione attuale"},SETTINGS:{MAP_DIVIDER:"Mappe",ENABLE_GOOGLE_API:"Abilitare i servizi Google API ?",ENABLE_GOOGLE_API_HELP:"Sulla <b>mappa dei membri</b>, ti permette di visualizzare i conti con un indirizzo ma senza geolocalizzazione.",GOOGLE_API_KEY:"Chiave Google API",BTN_GOOGLE_API:"Ottenere una chiave",BTN_GOOGLE_API_WARNING:"necessita un conto Google",GOOGLE_API_KEY_PLACEHOLDER:"per es. : AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"},HELP:{TIP:{WOT:"Questa mappa mostra <b>profili che hanno fornito una posizione</b>, che siano conti membri o no.<br/><br/>Solo i profili che hanno attivato l'opzione &quot;apparire sulla mappa&quot; sono stati attivati.",WOT_BTN_LAYERS:"<b>Filtrare i dati visibili</b>: membri, registrazioni pendenti, portafogli osservatori, etc.",WOT_BTN_SEARCH:"Puoi <b>cercare</b> per nome, chiave pubblica, o pseudonimo del membro."}}}})}]),angular.module("cesium.plugins.templates",[]).run(["$templateCache",function(e){e.put("plugins/es/templates/menu_extend.html",'<div ng-if=":state:enable && extensionPoint === \'menu-user\'" class="visible-xs visible-sm"><a menu-close="" class="item item-icon-left" active-link="active" ng-if="login && walletData.isMember" active-link-path-prefix="#/app/invitations" ui-sref="app.view_invitations"><i class="icon ion-person-stalker"></i> <span translate="">MENU.INVITATIONS</span> <span class="badge badge-positive" ng-if="walletData.invitations.unreadCount">{{walletData.invitations.unreadCount}}</span> </a><a menu-close="" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/user/message" ng-class="{\'item-menu-disable\': !login}" ui-sref="app.user_message.tab_inbox"><i class="icon ion-email"></i> <span translate="">MENU.MESSAGES</span> <span class="badge badge-positive" ng-if="walletData.messages.unreadCount">{{walletData.messages.unreadCount}}</span> </a><a menu-close="" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/notifications" ng-class="{\'item-menu-disable\': !login}" ui-sref="app.view_notifications"><i class="icon ion-android-notifications"></i> <span translate="">MENU.NOTIFICATIONS</span> <span class="badge badge-positive" ng-if="walletData.notifications.unreadCount">{{walletData.notifications.unreadCount}}</span></a></div>'),e.put("plugins/rml9/templates/01-button.html",'\x3c!-- Button that call a function of the controller --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive"\n        ng-click="onButtonClick()"\n        title="{{\'RML9.BTN_OPEN\' | translate}}">\n</button>\n\n\x3c!-- Button: Open a view, using `ui-sref` attribute\n<button class="button button-balanced button-small-padding icon ion-plus-circled"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_OPEN\' | translate}}">\n</button> --\x3e\n\n'),e.put("plugins/rml9/templates/02-view.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n      \x3c!-- iterate on each TX --\x3e\n      <div class="item" ng-repeat="item in items">\n        <h3>{{item.time|formatDate}}</h3>\n        <h4>{{item.pubkey|formatPubkey}}</h4>\n        <div class="badge">{{item.amount|formatAmount}}</div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/03-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/03-view_with_button.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- buttons bar --\x3e\n      <div class="center padding">\n        <div class="buttons">\n          <button class="button button-balanced icon-left icon ion-archive"\n                  ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n          </button>\n        </div>\n      </div>\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- the balance --\x3e\n      <div class="item">\n        {{\'RML9.VIEW.BALANCE\'|translate}}\n        <div class="badge badge-calm">\n          {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n      \x3c!-- iterate on each TX --\x3e\n      <div class="item item-text-wrap" ng-repeat="item in items">\n\n        <h3>\n          {{item.time|formatDate}}\n          <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n        </h3>\n\n        <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n        <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n        <div class="badge"\n             ng-class="{\'badge-balanced\': item.amount > 0}">\n          {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/04-view_chart.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- buttons bar --\x3e\n      <div class="center padding">\n        <div class="buttons">\n          <button class="button button-balanced icon-left icon ion-archive"\n                  ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n          </button>\n        </div>\n      </div>\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- the balance --\x3e\n      <div class="item">\n        {{\'RML9.VIEW.BALANCE\'|translate}}\n        <div class="badge badge-calm">\n          {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n\n      <div class="row">\n        <div class="col col-75">\n          \x3c!-- iterate on each TX --\x3e\n          <div class="item item-text-wrap" ng-repeat="item in items">\n\n            <h3>\n              {{item.time|formatDate}}\n              <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n            </h3>\n\n            <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n            <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n            <div class="badge"\n                 ng-class="{\'badge-balanced\': item.amount > 0}">\n              {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n            </div>\n          </div>\n        </div>\n\n        <div class="col col-25">\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.INPUT_CHART_TITLE</p>\n          <canvas id="chart-received-pie" class="chart-pie"\n                  chart-data="inputChart.data"\n                  chart-labels="inputChart.labels"\n                  chart-colors="inputChart.colors">\n          </canvas>\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\n          <canvas id="chart-sent-pie" class="chart-pie"\n                  chart-data="outputChart.data"\n                  chart-labels="outputChart.labels"\n                  chart-colors="outputChart.colors">\n          </canvas>\n        </div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/rml9/templates/06-button.html",'\x3c!-- [NEW] Display only if plugin is enable --\x3e\n\n  \x3c!-- Button: call a method from the state controller --\x3e\n  <button ng-if="enable" class="button button-balanced button-small-padding icon ion-android-archive"\n          ng-click="onButtonClick()"\n          title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n  </button>\n\n\n'),e.put("plugins/rml9/templates/06-settings_item.html",'\n<div class="item item-toggle dark">\n  <div class="input-label" translate>RML9.SETTINGS.ENABLE_TOGGLE</div>\n  <label class="toggle toggle-royal">\n    <input type="checkbox" ng-model="formData.plugins.rml9.enable" >\n    <div class="track">\n      <div class="handle"></div>\n    </div>\n  </label>\n</div>\n'),e.put("plugins/rml9/templates/07-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button class="button button-balanced button-small-padding icon ion-android-archive"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/07-view.html",'<leaflet id="map-geojson" center="map.center" geojson="map.geojson"></leaflet>\n'),e.put("plugins/rml9/templates/final-button.html",'\x3c!-- Button: Open a view, using `ui-sref` attribute --\x3e\n<button ng-if class="button button-balanced button-small-padding icon ion-android-archive"\n        ui-sref="app.rml9({pubkey: formData.pubkey})"\n        title="{{\'RML9.BTN_SWOW_TX\' | translate}}">\n</button>\n\n'),e.put("plugins/rml9/templates/final-view.html",'<ion-view left-buttons="leftButtons">\n  <ion-nav-title>\n    {{\'RML9.VIEW.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content>\n    <div class="list">\n\n      \x3c!-- buttons bar --\x3e\n      <div class="center padding">\n        <div class="buttons">\n          <button class="button button-balanced icon-left icon ion-archive"\n                  ng-click="onExportButtonClick()">{{\'RML9.BTN_EXPORT\' | translate}}\n          </button>\n        </div>\n      </div>\n\n      \x3c!-- the pubkey --\x3e\n      <div class="item">\n        {{\'COMMON.PUBKEY\'|translate}}\n        <div class="badge">{{pubkey|formatPubkey}}</div>\n      </div>\n\n      \x3c!-- the balance --\x3e\n      <div class="item">\n        {{\'RML9.VIEW.BALANCE\'|translate}}\n        <div class="badge badge-calm">\n          {{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n        </div>\n      </div>\n\n      \x3c!-- a text divider--\x3e\n      <div class="item item-divider">{{\'RML9.VIEW.DIVIDER\'|translate:{pubkey: pubkey} }}</div>\n\n      \x3c!-- iterate on each TX --\x3e\n      <div class="row">\n        <div class="col col-75">\n          <div class="item item-text-wrap" ng-repeat="item in items">\n\n            <h3>\n              {{item.time|formatDate}}\n              <span ng-if="item.comment" class="gray"> | {{item.comment}}</span>\n            </h3>\n\n            <h4 ng-if="item.uid" class="positive"><i class="icon ion-person"></i> {{item.name||item.uid}}</h4>\n            <h4 ng-if="!item.uid" class="gray"><i class="icon ion-key"></i> {{item.pubkey|formatPubkey}}</h4>\n\n            <div class="badge"\n                 ng-class="{\'badge-balanced\': item.amount > 0}">\n              {{item.amount|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span>\n            </div>\n          </div>\n\n        </div>\n\n        <div class="col col-25">\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.INPUT_CHART_TITLE</p>\n          <canvas id="chart-received-pie" class="chart-pie"\n                  chart-data="inputChart.data"\n                  chart-labels="inputChart.labels">\n          </canvas>\n\n          \x3c!-- [NEW] TX input chart --\x3e\n          <p class="gray" translate>RML9.CHART.OUTPUT_CHART_TITLE</p>\n          <canvas id="chart-sent-pie" class="chart-pie"\n                  chart-data="outputChart.data"\n                  chart-labels="outputChart.labels">\n          </canvas>\n        </div>\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/blockchain/items_blocks.html",'<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate="">COMMON.SEARCH_NO_RESULT</div><ng-if ng-if=":rebind:!smallscreen"><ng-repeat ng-repeat="block in :rebind:search.results track by block.number" ng-include="!block.empty ? \'templates/blockchain/item_block_lg.html\' : \'templates/blockchain/item_block_empty_lg.html\'"></ng-repeat></ng-if><ng-if ng-if=":rebind:smallscreen"><ng-repeat ng-repeat="block in :rebind:search.results track by block.number" ng-include="\'templates/blockchain/item_block.html\'"></ng-repeat></ng-if>'),e.put("plugins/es/templates/blockchain/lookup.html",'<ion-view><ion-nav-title><span translate>BLOCKCHAIN.LOOKUP.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-navicon visible-xs visible-sm" ng-click="toggleCompactMode()"><b class="icon-secondary" ng-class="{\'ion-arrow-down-b\': !compactMode, \'ion-arrow-up-b\': compactMode}" style="top: -12px; left: 11px; font-size: 10px"></b> <b class="icon-secondary" ng-class="{\'ion-arrow-up-b\': !compactMode,\'ion-arrow-down-b\': compactMode}" style="top: 12px; left: 11px; font-size: 10px"></b></button> <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="\'plugins/es/templates/blockchain/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/es/templates/blockchain/lookup_form.html",'<div class="lookupForm"><div class="item no-padding"><div class="button button-small button-text button-stable button-icon-event padding no-padding-right ink" ng-repeat="filter in search.filters" ng-if="filter"><span ng-bind-html="\'BLOCKCHAIN.LOOKUP.TX_SEARCH_FILTER.\'+filter.type|translate:filter"></span> <i class="icon ion-close" ng-click="itemRemove($index)"></i></div><label class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'BLOCKCHAIN.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()"><div class="helptip-anchor-center"><a id="helptip-blockchain-search-text"></a></div></label></div><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left"><h4 ng-if="search.type==\'last\'" translate="">BLOCKCHAIN.LOOKUP.LAST_BLOCKS</h4><h4 ng-if="search.type==\'text\'">{{\'COMMON.RESULTS_LIST\'|translate}}</h4><h5 class="dark" ng-if="!search.loading && search.total"><span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span> <small class="gray" ng-if=":rebind:search.took && expertMode">- {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }} </small><small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">- <a ng-click="toggleShowQuery()" ng-if="!showQuery">{{\'DOCUMENT.LOOKUP.SHOW_QUERY\'|translate }} <i class="icon ion-arrow-down-b gray"></i> </a><a ng-click="toggleShowQuery()" ng-if="showQuery">{{\'DOCUMENT.LOOKUP.HIDE_QUERY\'|translate }} <i class="icon ion-arrow-up-b gray"></i></a></small></h5><h5 class="gray" ng-if="search.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner><span translate="">COMMON.SEARCHING</span><br></h5></div></div><div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode"><small class="no-padding no-margin" ng-if="showQuery"><span class="gray text-wrap dark">{{:rebind:search.query}}</span></small></div><ion-list class="list list-blocks" ng-class="::motion.ionListClass"><ng-include src="\'plugins/es/templates/blockchain/items_blocks.html\'"></ng-include></ion-list><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll></div>'),e.put("plugins/es/templates/blockchain/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>BLOCKCHAIN.LOOKUP.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a ng-if="enableFilter" class="item item-icon-left item-icon-right ink" ng-click="doSearchLast()"><i class="icon ion-clock"></i> {{\'BLOCKCHAIN.LOOKUP.BTN_LAST\' | translate}} <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'last\'"></i></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/currency/tab_blocks_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'nav-buttons\'"><button class="button button-icon button-clear icon ion-android-search visible-xs visible-sm" ui-sref="app.blockchain_search"></button></ng-if>'),e.put("plugins/es/templates/common/edit_pictures.html",'<div class="gallery" ng-controller="ESPicturesEditCtrl as ctrl"><div ng-repeat="picture in pictures" class="item card card-gallery stable-bg" ng-class="{\'in done\': picture.isnew}"><div><h2 ng-if="picture.title">{{picture.title}}</h2><img ng-src="{{picture.src}}"></div><div class="item done in tabs tabs-secondary tabs-icon-left"><a class="tab-item stable-bg assertive" ng-click="removePicture($index)" title="{{\'COMMON.BTN_PICTURE_DELETE\' | translate}}"><i class="icon ion-trash-a"></i>{{\'COMMON.BTN_PICTURE_DELETE\'|translate}}</a> <a class="tab-item stable-bg dark" ng-click="rotatePicture($index)" title="{{\'COMMON.BTN_PICTURE_ROTATE\' | translate}}"><i class="icon ion-forward"></i>{{\'COMMON.BTN_PICTURE_ROTATE\'|translate}}</a> <a class="tab-item stable-bg" ng-click="favoritePicture($index)" ng-class="{\'gray\': $index !== 0, \'positive\': $index === 0}" title="{{\'COMMON.BTN_PICTURE_FAVORISE\' | translate}}"><i class="icon ion-star"></i>{{\'COMMON.BTN_PICTURE_FAVORISE\'|translate}}</a></div></div><div class="item card card-gallery card-gallery-new text-center padding ink" ng-click="selectNewPicture(\'#pictureFile\')"><i class="ion-image stable" style="font-size:150px"></i> <b class="ion-plus gray" style="font-size:80px; position:absolute; top:25px; right: 5px"></b><p translate>COMMON.BTN_ADD_PICTURE</p></div><input type="file" id="pictureFile" accept="image/*" onchange="angular.element(this).scope().fileChanged(event)" style="visibility:hidden; position:absolute"></div>'),e.put("plugins/es/templates/common/edit_position.html",'<div class="item item-divider" translate>LOCATION.LOCATION_DIVIDER</div><ion-item class="item-input item-floating-label item-button-right"><span class="input-label">{{\'LOCATION.ADDRESS\' | translate}}</span><textarea placeholder="{{\'LOCATION.ADDRESS_HELP\' | translate}}" ng-model="formData.address" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n              </textarea></ion-item><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.geoPoint.$invalid}"><span class="input-label" translate>LOCATION.CITY</span> <input type="text" placeholder="{{\'LOCATION.CITY_HELP\'|translate}}" ng-model="formData.city" ng-model-options="{ updateOn: \'blur\' }" required-if="formData.address" ng-change="onCityChanged()"></div><input type="hidden" name="geoPoint" ng-model="formData.geoPoint" required-if="formPosition.enable" geo-point><div class="form-errors" ng-show="form.$submitted && form.city.$error" ng-messages="form.city.$error"><div class="form-error" ng-message="required"><span translate="LOCATION.ERROR.CITY_REQUIRED_IF_STREET"></span></div></div><div class="form-errors" ng-show="form.$submitted && form.geoPoint.$error" ng-messages="form.geoPoint.$error"><div class="form-error" ng-message="required"><span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span> <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span></div><div class="form-error" ng-message="geoPoint"><span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span> <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span></div></div><div class="item row item-text-wrap no-padding"><div class="col no-padding"><ion-checkbox ng-model="formPosition.enable" ng-change="onUseGeopointChanged()" class="item item-border-large done in"><div class="item-content"><span translate>LOCATION.USE_GEO_POINT</span><h4 class="gray" ng-if="formPosition.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>{{\'LOCATION.LOADING_LOCATION\'|translate}}</h4></div></ion-checkbox></div><div class="col col-10 no-padding" style="min-width: 60px"><div class="row text-center"><a class="button button-stable button-small-padding" title="{{\'LOCATION.BTN_GEOLOC_ADDRESS\'|translate}}" ng-disabled="!formPosition.enable" ng-click="openSearchLocationModal()"><i class="icon ion-home" style="left: 15px"></i> <b class="icon-secondary ion-search" style="top: -9px; left:32px; font-size: 18px"></b></a></div></div></div><cs-extension-point name="after-position"></cs-extension-point>'),e.put("plugins/es/templates/common/edit_socials.html",'<ion-list class="no-padding"><div class="item item-divider"><span>{{\'PROFILE.SOCIAL_NETWORKS_DIVIDER\' | translate}} </span><a class="badge button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': socialData.reorder}" ng-if="formData.socials && formData.socials.length &gt; 1" ng-click="socialData.reorder=!socialData.reorder"><span translate="">PROFILE.BTN_REORDER</span></a></div></ion-list><ion-list show-reorder="socialData.reorder"><ion-item class="item-remove-animate item-icon-left" type="no-padding item-text-wrap" ng-if="formData.socials && formData.socials.length" ng-repeat="social in formData.socials | filter:filterFn track by social.url" id="social-{{social.url|formatSlug}}"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}} <i class="ion-locked" ng-if="social.recipient"></i></p><h2><a href="{{social.url}}" ng-if="social.type != \'email\' && social.type != \'phone\'" target="_blank">{{social.url}}</a> <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a> <a href="tel:{{social.url}}" ng-if="social.type == \'phone\'">{{social.url}}</a></h2><ion-option-button class="button-assertive" ng-if="!social.recipient" ng-click="formData.socials.splice($index, 1); dirty = true;">{{\'COMMON.BTN_DELETE\'|translate}}</ion-option-button><ion-option-button class="button-info" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">{{\'COMMON.BTN_EDIT\'|translate}}</ion-option-button><ion-reorder-button class="ion-drag" on-reorder="reorderSocialNetwork(social, $fromIndex, $toIndex)"></ion-reorder-button></ion-item></ion-list><ion-list class="no-padding"><div class="item item-complex item-input-inset"><label class="item-input-wrapper"><input type="text" style="width:100%" placeholder="{{\'PROFILE.SOCIAL_HELP\'|translate}}" id="socialUrl" on-return="addSocialNetwork($event);" ng-model="socialData.url"></label><button class="button button-small hidden-xs" type="button" ng-click="addSocialNetwork($event)">{{\'COMMON.BTN_ADD\'|translate}}</button> <button class="button button-small button-icon icon ion-android-add visible-xs" type="button" ng-click="addSocialNetwork($event)"></button></div></ion-list>'),e.put("plugins/es/templates/common/item_comment.html",'<ng-init ng-init="level = level + 1"><a name="{{::comment.id|formatHash}}"></a><ion-item id="comment-{{::comment.id|formatHash}}" class="card card-comment card-avatar stable-900-bg item-text-wrap no-padding" ng-class="::{\'in done\': comment.isnew}"><div class="card-header padding-left" ng-if="comment.parent && !hideParent"><h5 class="gray underline"><ng-if ng-if="!comment.parent.issuer">{{\'COMMENTS.REPLY_TO_DELETED_COMMENT\'|translate}}</ng-if><ng-if ng-if="comment.parent.issuer"><a ng-click="toggleExpandedParent(comment, $index)">{{\'COMMENTS.REPLY_TO_LINK\'|translate}}<ng-if ng-if="::comment.parent.uid">{{::comment.parent.name||comment.parent.uid}}</ng-if><ng-if ng-if="::!comment.parent.uid"><i class="ion-key"></i> {{::comment.parent.name|| (comment.parent.issuer|formatPubkey) }}</ng-if></a><i ng-class="{\'ion-arrow-down-b\': !comment.expandedParent[$index], \'ion-arrow-up-b\': comment.expandedParent[$index]}"></i></ng-if></h5><div class="padding-left" ng-if="comment.expandedParent[$index]"><div class="card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done"><ng-include ng-init="comment = comment.parent" src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include></div></div></div><ng-include src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include><div class="card-footer gray"><small class="underline"><a ng-click="share($event, comment, $index)">{{comment.creationTime | formatFromNow}}</a><ng-if ng-if="comment.replyCount">| <a class="dark" ng-click="toggleExpandedReplies(comment, $index)">{{\'COMMENTS.REPLY_COUNT\'|translate:comment}}</a> <i ng-class="{\'ion-arrow-down-b\': !comment.showReplies, \'ion-arrow-up-b\': comment.showReplies}"></i></ng-if></small><div class="pull-right"><a class="ion-android-share-alt" ng-click="share($event, comment)"></a> <a class="ion-edit" ng-if="isUserPubkey(comment.issuer)" ng-click="edit(comment)"></a> <a class="ion-trash-a" ng-if="isUserPubkey(comment.issuer)" ng-click="remove(comment, $index)"></a> <a class="ion-reply" ng-click="reply(comment)">{{::\'COMMENTS.REPLY\'|translate}}</a></div></div></ion-item><div ng-if="comment.expandedReplies[$index]" class="padding-left card-avatar-small expanded" ng-init="hideParent=true"><ng-include ng-repeat="comment in comment.replies track by comment.id" src="\'plugins/es/templates/common/item_comment.html\'"></ng-include></div></ng-init>'),e.put("plugins/es/templates/common/item_comment_content.html",'<div class="item item-avatar done in"><span class="avatar" ng-if="::!comment.avatar" ng-class="::{\'avatar-member\': comment.uid, \'avatar-wallet\': !comment.uid}"></span> <span class="avatar" ng-if="::comment.avatar" style="background-image: url({{::comment.avatar.src}})"></span> <a class="pull-left" ui-sref="app.wot_identity({pubkey:comment.issuer, uid: comment.uid})"><span class="positive" ng-if="::comment.uid">{{::comment.name||comment.uid}} </span><span ng-if="::!comment.uid" class="gray"><i class="icon ion-key gray"></i> {{::comment.name || (comment.issuer|formatPubkey)}} </span></a>&nbsp; <span trust-as-html="comment.html"></span></div>'),e.put("plugins/es/templates/common/item_location_search.html",'<div class="item no-padding"><div class="item-input"><i class="icon ion-location placeholder-icon"></i> <input type="text" placeholder="{{(options.location.help||\'LOCATION.SEARCH_HELP\')|translate}}" ng-model-options="{ debounce: 350 }" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()"></div></div><ul class="item no-padding list dropdown-list" ng-if="locations" scroll="true"><div ng-if="!locations.length" class="item padding assertive"><span translate>COMMON.SEARCH_NO_RESULT</span></div><a ng-repeat="res in locations" class="item item-border-large item-text-wrap ink done in {{res.selected && \'active\' || \'\'}}" ng-class="::{\'item-divider\': !res.address, \'item-icon-left\': res.address}" ng-click="::res.address ? selectLocation(res) : false"><h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4><ng-if ng-if="::res.address"><i class="icon ion-location"></i><h3 ng-if="res.address.road">{{::res.address.road}}</h3><h3><span ng-if="res.address.postcode">{{::res.address.postcode}}</span> {{::res.address.city||res.address.village}} <span class="gray">| {{::res.address.country}}</span></h3><h5 class="gray">{{\'LOCATION.MODAL.POSITION\'|translate:res }}</h5></ng-if></a></ul>'),
+e.put("plugins/es/templates/common/modal_category.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title">{{ (ctrl.title || \'COMMON.CATEGORIES\') | translate}}</h1></ion-header-bar><ion-content class="categoryModal"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list"><label class="item item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" placeholder="{{\'COMMON.CATEGORY_SEARCH_HELP\'|translate}}" ng-model="ctrl.searchText" ng-model-options="{ debounce: 350 }" ng-change="ctrl.doSearch()"></label><div ng-repeat="cat in categories" class="item item-category item-text-wrap" ng-class="{\'item-divider\': !cat.parent}" ng-click="cat.parent ? closeModal(cat) : false"><h2 ng-bind-html="cat.name"></h2></div></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/common/modal_edit_avatar.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs visible-sm" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>PROFILE.MODAL_AVATAR.TITLE</h1><button class="button button-clear icon-right visible-xs" ng-click="doCrop()" ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-clear icon-right visible-xs" ng-click="closeModal(formData.result)" ng-if="formData.imageCropStep == 3"><i class="icon ion-android-done"></i></button></ion-header-bar><ion-content class="modal-avatar padding"><div ng-show="formData.imageCropStep == 1"><p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p><div class="item card text-center padding ink" ng-click="openFileSelector()"><i class="ion-image stable" style="font-size:150px"></i> <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px"></b><p translate>PROFILE.MODAL_AVATAR.BTN_SELECT_FILE</p></div><input type="file" name="fileInput" accept="image/*" id="fileInput" onchange="angular.element(this).scope().fileChanged(event)" style="visibility:hidden; position:absolute"></div><div ng-show="formData.imageCropStep == 2"><p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p><div class="item card text-center padding ink"><image-crop data-height="200" data-width="200" data-shape="circle" data-step="formData.imageCropStep" src="formData.imgSrc" data-result="formData.result" data-result-blob="formData.resultBlob" crop="formData.initCrop" padding="150" max-size="1024"></image-crop></div></div><div ng-show="formData.imageCropStep == 3"><p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p><div class="item card padding hero" style="height: 110px"><div class="content"><img class="avatar" ng-src="{{formData.result}}" style="height: 88px; width: 88px"></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doCrop()" translate ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2">COMMON.BTN_NEXT</button> <button class="button button-positive ink" ng-click="closeModal(formData.result)" translate ng-if="formData.imageCropStep == 3">COMMON.BTN_CONTINUE</button></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/common/modal_location.html",'<ion-modal-view class="modal-full-height modal-search-location"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate="">COMMON.BTN_CANCEL</button><h1 class="title" translate="">LOCATION.MODAL.TITLE</h1></ion-header-bar><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><div class="item item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()"></div><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left" ng-if="!search.loading && search.results"><h4 translate="">COMMON.RESULTS_LIST</h4></div></div><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div ng-if="!search.loading && search.results && (!search.results.length || !search.results[0].address)" class="assertive padding"><span translate="">COMMON.SEARCH_NO_RESULT</span></div><ion-list ng-if="!search.loading" class="padding-top {{::motion.ionListClass}}"><div ng-repeat="res in search.results" class="item item-border-large item-text-wrap ink" ng-class="::{\'item-divider\': !res.address, \'item-icon-left item-icon-right\': res.address}" ng-click="res.address ? closeModal(res) : false"><h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4><ng-if ng-if="::res.address"><i class="icon ion-location"></i><h2 ng-if="res.address.road">{{::res.address.road}}</h2><h3><span ng-if="res.address.postcode">{{::res.address.postcode}}</span> {{::res.address.city||res.address.village}} <span class="gray">| {{::res.address.country}}</span></h3><h5 class="gray">{{\'LOCATION.MODAL.POSITION\'|translate:res }}</h5><i class="icon ion-ios-arrow-right"></i></ng-if></div></ion-list></ion-content><ion-footer-bar class="stable-bg padding-left padding-right block" ng-if="license"><div class="pull-right copyright"><span class="dark">© </span><a class="positive" href="{{license.url}}" target="_blank">{{license.name}}</a></div></ion-footer-bar></ion-modal-view>'),e.put("plugins/es/templates/common/popover_profile_extend.html",'<button ng-if=":state:enable && auth" class="button button-positive button-small ink" ng-click="showEditUserProfile()">{{\'PROFILE.BTN_EDIT\' | translate}}</button>'),e.put("plugins/es/templates/common/view_comments.html",'<form class="comments" ng-controller="ESCommentsCtrl" ng-submit="save()"><div class="item item-divider"><i class="icon ion-chatboxes"></i> <span translate="">COMMENTS.DIVIDER</span> <span class="gray" ng-if="comments.total">({{comments.total}})</span></div><span class="item item-more-comments" ng-if="comments.hasMore"><small><a ng-click="showMore()" translate="">COMMENTS.SHOW_MORE_COMMENTS</a></small></span><div class="padding-right"><ng-repeat ng-repeat="comment in comments.result track by comment.id" ng-include="\'plugins/es/templates/common/item_comment.html\'"></ng-repeat></div><div class="visible-xs visible-sm" style="margin-bottom"><div class="block"><div class="item item-input-inset done in" ng-if="formData.parent"><div class="padding text-right pull-left" translate="">COMMENTS.REPLY_TO</div><br><div class="padding-left expanded"><div class="card card-comment stable-900-bg item-text-wrap no-padding in done"><ng-include ng-if="::formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include><span ng-if="::!formData.parent.message" translate="">COMMENTS.DELETED_COMMENT</span><div class="card-footer text-right gray"><div class="pull-right"><a class="ion-close" ng-click="removeParentLink()">{{::\'COMMON.BTN_CANCEL\'|translate}}</a></div></div></div></div></div><div class="item item-input-inset"><div class="item-input-wrapper"><input type="text" id="comment-form-input" style="width: 100%" placeholder="{{\'COMMENTS.COMMENT_HELP\'|translate}}" on-return="save();" ng-model="formData.message"> <button type="submit" class="button button-small button-small-padding button-icon button-dark button-icon gray"><i class="icon ion-android-send"></i></button></div></div></div></div></form>'),e.put("plugins/es/templates/common/view_pictures.html",'<div class="item gallery done in" ng-if="pictures && pictures.length>0"><div ng-repeat="picture in pictures" class="item card card-gallery"><div class="ink"><h2 ng-if="picture.title">{{::picture.title}}</h2><img ng-src="{{picture.src}}"></div></div></div>'),e.put("plugins/es/templates/document/item_document.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-click="selectDocument($event, doc)"><i class="icon ion-document stable" ng-if=":rebind:!doc.avatar"></i> <i class="avatar" ng-if=":rebind:doc.avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i><div class="row no-padding"><div class="col"><h3 class="dark"><i class="ion-locked" ng-if=":rebind:doc.nonce"></i> {{:rebind:doc.time|formatDate}}</h3><h4 class="gray">{{:rebind:\'DOCUMENT.HASH\'|translate}} {{:rebind:doc.hash|formatHash}}</h4></div><div class="col"><h3><a ui-sref="app.wot_identity({pubkey: doc.pubkey, uid: doc.uid})"><span class="gray"><i class="ion-key"></i> {{:rebind:doc.pubkey|formatPubkey}} </span><span class="positive" ng-if=":rebind:doc.uid"><i class="ion-person"></i> {{:rebind:doc.name||doc.uid}}</span></a></h3></div><div class="col"><a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}"><i class="ion-trash-a"></i></a><h3 ng-if=":rebind:doc.recipient"><a ui-sref="app.wot_identity({pubkey: doc.recipient.pubkey, uid: doc.recipient.uid})"><span class="gray"><i class="ion-key"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}} </span><span class="positive" ng-if=":rebind:doc.recipient.uid"><i class="ion-person"></i> {{:rebind:doc.recipient.name||doc.recipient.uid}}</span></a></h3><h4 class="gray" ng-if=":rebind:doc.read_signature"><i class="ion-checkmark"></i> <span translate>DOCUMENT.LOOKUP.READ</span></h4></div></div></ion-item>'),e.put("plugins/es/templates/document/items_documents.html",'<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate="">COMMON.SEARCH_NO_RESULT</div><ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-include="\'plugins/es/templates/document/item_document.html\'"></ng-repeat>'),e.put("plugins/es/templates/document/lookup.html",'<ion-view><ion-nav-title><span translate>DOCUMENT.LOOKUP.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="\'plugins/es/templates/document/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/es/templates/document/lookup_form.html",'<div class="lookupForm"><div class="item no-padding"><label class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()"><div class="helptip-anchor-center"><a id="{{helptipPrefix}}-search-text"></a></div></label></div><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left"><h4 ng-if="search.last" translate="">DOCUMENT.LOOKUP.LAST_DOCUMENTS</h4><h4 ng-if="!search.last">{{\'COMMON.RESULTS_LIST\'|translate}}</h4><h5 class="dark" ng-if="!search.loading && search.total"><span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span> <small class="gray" ng-if=":rebind:search.took && expertMode">- {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }} </small><small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">- <a ng-click="toggleShowQuery()" ng-if="!showQuery"><span translate="">DOCUMENT.LOOKUP.SHOW_QUERY</span> <i class="icon ion-arrow-down-b gray"></i> </a><a ng-click="toggleShowQuery()" ng-if="showQuery"><span translate="">DOCUMENT.LOOKUP.HIDE_QUERY</span> <i class="icon ion-arrow-up-b gray"></i></a></small></h5><h5 class="gray" ng-if="search.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner><span translate="">COMMON.SEARCHING</span><br></h5></div></div><div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode"><small class="no-padding no-margin" ng-if="showQuery"><span class="gray text-wrap dark">{{:rebind:search.query}}</span></small></div><ion-list class="list" ng-class="::motion.ionListClass"><ng-include src="\'plugins/es/templates/document/items_documents.html\'"></ng-include></ion-list><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll></div>'),e.put("plugins/es/templates/document/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left assertive ink" ng-class="{\'gray\': !search.total}" ng-click="removeAll()"><i class="icon ion-trash-a"></i> {{\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/group/edit_group.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span> <span class="visible-xs" ng-if="!loading && !id" translate="">GROUP.EDIT.TITLE_NEW</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()"></button></ion-nav-buttons><ion-content scroll="true"><div class="row no-padding"><div class="col"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><form name="recordForm" novalidate="" ng-submit="save()"><div class="list" ng-class="motion.ionListClass" ng-init="setForm(recordForm)"><div class="item hidden-xs"><h1 ng-if="id" ng-bind-html="formData.title"></h1><h1 ng-if="!id" translate="">GROUP.EDIT.TITLE_NEW</h1><h2 class="balanced" ng-if="!id"><i class="icon ion-android-people"></i> <i class="icon ion-android-lock" ng-if="formData.type==\'managed\'"></i> {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}</h2></div><div class="item" ng-if="id"><h4 class="gray"><i class="icon ion-calendar"></i> {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}}&nbsp;{{formData.time | formatDate}}</h4><div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">{{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}</div></div><ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include><div class="item item-divider" translate="">GROUP.GENERAL_DIVIDER</div><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}"><span class="input-label" translate="">GROUP.EDIT.RECORD_TITLE</span> <input type="text" placeholder="{{\'GROUP.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="group-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true"></div><div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div><div class="item item-input item-floating-label"><span class="input-label" translate="">GROUP.EDIT.RECORD_DESCRIPTION</span><textarea placeholder="{{\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n                </textarea></div><ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include></div></form></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/group/item_group.html",'<a name="group-{{:rebind:group.hash}}"></a><div id="group-{{:rebind:group.hash}}" class="item item-icon-right item-avatar {{::ionItemClass}} ink" ng-click="select(group)"><i class="item-image avatar" style="background-image: url({{::group.avatar.src}})" ng-if="group.avatar"></i> <i class="item-image icon ion-android-people" ng-if="!group.avatar"></i> <i class="item-image icon-secondary ion-android-lock" ng-if="!group.avatar" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9"></i><h2 ng-bind-html=":rebind:group.title"></h2><h4 class="gray pull-right"><i class="ion-clock"></i> {{:rebind:\'GROUP.CREATED_TIME\'|translate: group }}</h4><h4 class="dark pull-left" ng-if=":rebind:group.membersCount"><i class="dark ion-person"></i> <span class="dark">+{{:rebind:group.membersCount}}</span></h4><i class="icon ion-ios-arrow-right"></i></div>'),e.put("plugins/es/templates/group/items_groups.html",'<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate="">COMMON.SEARCH_NO_RESULT</div><ng-repeat ng-repeat="group in :rebind:search.results" ng-include="\'plugins/es/templates/group/item_group.html\'"></ng-repeat>'),e.put("plugins/es/templates/group/list.html",'<ion-list class="{{::motion.ionListClass}}"><ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)"><i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i> <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i><h3 trust-as-html="notification.message | translate:notification"></h3><h4><i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.time|formatFromNow}}</span> <span class="gray">| {{notification.time|formatDate}}</span></h4></ion-item></ion-list><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("plugins/es/templates/group/lookup.html",'<ion-view class="view-group"><ion-nav-title><span translate>GROUP.LOOKUP.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ng-include src="\'plugins/es/templates/group/lookup_form.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/es/templates/group/lookup_form.html",'<div class="lookupForm"><label class="item item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()"><div class="helptip-anchor-center"><a id="helptip-group-search-text"></a></div></label><div class="padding-top padding-xs" style="display: block; height: 60px"><div class="pull-left"><h4 ng-if="search.type==\'open\'" translate="">GROUP.LOOKUP.OPEN_RESULTS_LIST</h4><h4 ng-if="search.type==\'last\'" translate="">GROUP.LOOKUP.LAST_RESULTS_LIST</h4><h4 ng-if="search.type==\'managed\'" translate="">GROUP.LOOKUP.MANAGED_RESULTS_LIST</h4><h4 ng-if="search.type==\'text\'">{{\'COMMON.RESULTS_LIST\'|translate}}</h4><h5 class="dark" ng-if="!search.loading && search.total"><span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span> <small class="gray" ng-if=":rebind:search.took && expertMode">- {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}</small></h5><h5 class="gray" ng-if="search.loading"><ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner><span translate="">COMMON.SEARCHING</span><br></h5></div></div><div class="list {{::motion.ionListClass}}" ng-if="!$scope.search.loading"><ng-include src="\'plugins/es/templates/group/items_groups.html\'"></ng-include></div><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll></div>'),e.put("plugins/es/templates/group/lookup_item.html",'<i class="item-image avatar" style="background-image: url({{::item.avatar.src}})" ng-if="item.avatar"></i> <i class="item-image icon ion-android-people" ng-if="!item.avatar"></i> <i class="item-image icon-secondary ion-android-lock" ng-if="!item.avatar" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9"></i><h2 ng-bind-html=":rebind:item.title"></h2><h4 class="gray pull-right"><i class="ion-clock"></i> {{:rebind:\'GROUP.CREATED_TIME\'|translate: item }}</h4><h4 class="dark pull-left" ng-if=":rebind:item.membersCount"><i class="dark ion-person"></i> <span class="dark">+{{:rebind:item.membersCount}}</span></h4>'),e.put("plugins/es/templates/group/modal_record_type.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>GROUP.TYPE.TITLE</h1></ion-header-bar><ion-content class="lookupForm padding"><h3 translate>GROUP.TYPE.SELECT_TYPE</h3><div class="list"><div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'open\')"><div class="item-content item-text-wrap"><i class="item-image icon ion-android-people dark"></i><h2 translate>GROUP.TYPE.OPEN_GROUP</h2><h4 class="gray" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4></div></div><div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'managed\')"><div class="item-content item-text-wrap"><i class="item-image icon ion-android-people dark"></i> <i class="icon-secondary ion-android-lock dark" style="left: 10px; top: -8px"></i><h2 translate>GROUP.TYPE.MANAGED_GROUP</h2><h4 class="gray" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4></div></div></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/group/view_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>GROUP.VIEW.MENU_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="showSharePopover($event)"><i class="icon ion-android-share-alt"></i> {{\'COMMON.BTN_SHARE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/group/view_record.html",'<ion-view left-buttons="leftButtons"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit"><i class="icon ion-android-create"></i></button> <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true"><div class="positive-900-bg hero"><div class="content" ng-if="!loading"><i class="avatar cion-registry-{{formData.type}}" ng-if="!formData.avatar"></i> <i class="avatar" style="background-image: url({{::formData.avatar.src}})" ng-if="formData.avatar"></i><h3 ng-bind-html="formData.title"></h3><h4>&nbsp;</h4></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><div class="row no-padding-xs no-padding-sm"><div class="col list item-text-wrap no-padding-xs no-padding-sm" ng-class="::motion.ionListClass"><div class="item"><h2 class="gray"><a ng-if="formData.city" ui-sref="app.groups({location:formData.city})"><i class="icon ion-location"></i> <span ng-bind-html="formData.city"></span> </a><span ng-if="formData.city && formData.type">&nbsp;|&nbsp;</span> <a ng-if="formData.type" ui-sref="app.groups({type:formData.type})"><i class="icon ion-flag"></i> {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}</a></h2><h4><i class="icon ion-clock" ng-if="formData.time"></i> <span translate="">COMMON.SUBMIT_BY</span> <a ng-class="{\'positive\': issuer.uid, \'gray\': !issuer.uid}" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})"><ng-if ng-if="issuer.uid"><i class="icon ion-person"></i> {{::issuer.name||issuer.uid}}</ng-if><span ng-if="!issuer.uid"><i class="icon ion-key"></i> {{issuer.pubkey|formatPubkey}} </span></a><span>{{formData.time|formatFromNow}}<h4 class="gray hidden-xs">| {{formData.time | formatDate}}</h4></span></h4></div><a id="group-share-anchor-{{id}}"></a><ion-item><h2><span trust-as-html="formData.description"></span></h2></ion-item><ion-item><h4 ng-if="formData.address"><span class="gray" translate="">REGISTRY.VIEW.LOCATION</span> <a class="positive" target="_blank" href="https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}"><span ng-bind-html="formData.address"></span> <span ng-if="formData.city">- </span><span ng-bind-html="formData.city"></span></a></h4></ion-item><ng-if ng-if="formData.socials && formData.socials.length>0"><ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}}</p><h2><a href="{{social.url}}" ng-if="social.type != \'email\'" target="_blank">{{social.url}}</a> <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a></h2></ion-item></ng-if><div class="lazy-load"><ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include><span class="item item-divider" ng-if="formData.pubkey"><span translate="">REGISTRY.TECHNICAL_DIVIDER</span></span><div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}"><i class="icon ion-key"></i> <span translate="">REGISTRY.EDIT.RECORD_PUBKEY</span><h4 class="dark">{{::formData.pubkey}}</h4></div><ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include></div></div></div></ion-content><button class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey: formData.pubkey, uid: formData.title})"></button></ion-view>'),e.put("plugins/es/templates/invitation/list_invitation.html",'<ion-list class="{{::motion.ionListClass}}"><ion-item ng-repeat="invitation in search.results" class="item-border-large item-text-wrap item-avatar"><i ng-if="::!invitation.avatar" class="item-image icon {{::invitation.avatarIcon}}"></i> <i ng-if="::invitation.avatar" class="item-image avatar" style="background-image: url({{::invitation.avatar.src}})"></i><h3 trust-as-html="invitation.message | translate:invitation"></h3><h3 class="dark text-italic" ng-if="invitation.comment"><i class="icon ion-quote"></i> <span ng-bind-html="invitation.comment"></span></h3><h4><i class="icon {{::invitation.icon}}"></i> <span class="dark" ng-if="::invitation.issuer" trust-as-html="\'INVITATION.SUGGESTED_BY\' | translate:invitation"></span> <span class="dark">{{::invitation.time|formatFromNow}}</span> <span class="gray">| {{::invitation.time|formatDate}}</span></h4><div class="block text-right"><button class="button button-positive button-small button-small-padding" ng-click="accept(invitation)" ng-if="::invitation.state" translate>{{::(invitation.okText||\'COMMON.BTN_SHOW\') |translate}}</button> <button class="button button-stable button-small button-small-padding" ng-click="delete($index)" translate>INVITATION.BTN_DELETE</button></div></ion-item></ion-list><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("plugins/es/templates/invitation/modal_new_invitation.html",'<ion-modal-view id="transfer" class="modal-invitation modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>INVITATION.NEW.TITLE</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()"></button></ion-header-bar><ion-content scroll="true"><ng-include src="\'plugins/es/templates/invitation/new_invitation_form.html\'"></ng-include></ion-content></ion-modal-view>'),
 e.put("plugins/es/templates/invitation/new_invitation_form.html",'<form name="invitationForm" novalidate="" ng-submit="doSend()"><div class="list" ng-init="setForm(invitationForm)"><a class="item item-icon-right gray ink" ng-class="{\'disable-pointer-events\': recipients.length, \'item-input-error\': form.$submitted && !recipients.length}" ng-click="showSelectRecipientModal($event)"><span class="gray" translate="">INVITATION.NEW.RECIPIENTS</span> <span class="item-note"><span class="hidden-xs" ng-if="!recipients.length" translate="">INVITATION.NEW.RECIPIENTS_HELP</span><ng-repeat ng-repeat="identity in recipients track by identity.id" class="button button-small button-text button-stable button-icon-event ink" ng-class="{\'button-text-positive\': identity.selected}"><ng-bind-html ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></ng-bind-html><b class="enable-pointer-events ion-close" ng-click="removeRecipient($index, $event)">&nbsp;&nbsp;</b></ng-repeat></span><i class="gray icon enable-pointer-events ion-ios-arrow-right"></i></a><div class="form-errors" ng-if="form.$submitted && !recipients.length"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><a class="item item-icon-right gray ink" ng-class="{\'disable-pointer-events\': suggestions.length, \'item-input-error\': form.$submitted && !suggestions.length}" ng-click="showSelectSuggestionModal($event)"><span class="gray enable-pointer-events" translate="">INVITATION.NEW.SUGGESTION_IDENTITIES</span> <span class="item-note"><span class="hidden-xs" ng-if="!suggestions.length" translate="">INVITATION.NEW.SUGGESTION_IDENTITIES_HELP</span><ng-repeat ng-repeat="identity in suggestions track by identity.id" class="button button-small button-text button-stable button-icon-event ink" ng-class="{\'button-text-positive\': identity.selected}"><ng-bind-html ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></ng-bind-html><b class="enable-pointer-events ion-close" ng-click="removeSuggestion($index, $event)">&nbsp;&nbsp;</b></ng-repeat></span><i class="gray icon enable-pointer-events ion-ios-arrow-right"></i></a><div class="form-errors" ng-if="form.$submitted && !suggestions.length"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-content item-toggle dark visible-xs visible-sm"><span class="input-label gray">{{\'TRANSFER.BTN_ADD_COMMENT\' | translate}}</span><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.useComment"><div class="track"><div class="handle"></div></div></label></div><label class="item item-input item-floating-label visible-xs visible-sm" ng-if="formData.useComment" ng-class="{\'item-input-error\': form.$submitted && form.comment.$invalid}"><span class="input-label">{{\'TRANSFER.COMMENT\' | translate}}</span><textarea placeholder="{{\'TRANSFER.COMMENT_HELP\' | translate}}" name="comment" ng-model="formData.comment" ng-maxlength="255">\n        </textarea></label><div class="form-errors" ng-show="form.$submitted && form.comment.$error" ng-messages="form.comment.$error"><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG"></span></div><div class="form-error" ng-message="pattern"><span translate="ERROR.FIELD_ACCENT"></span></div></div></div><div class="padding hidden-xs text-right"><button class="button button-small button-clear button-dark ink" ng-click="cancel()" type="button" translate="">COMMON.BTN_CANCEL</button> <button class="button button-small button-positive ink" type="submit">{{\'COMMON.BTN_SEND\' | translate}}</button></div></form>'),e.put("plugins/es/templates/invitation/popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-class="{\'gray\': !search.results.length, \'assertive\': search.results.length}" ng-click="deleteAll()"><i class="icon ion-trash-a"></i> <span translate>INVITATION.BTN_DELETE_ALL</span></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/invitation/popover_invitation.html",""),e.put("plugins/es/templates/invitation/view_invitations.html",'<ion-view left-buttons="leftButtons" class="view-invitation"><ion-nav-title>{{\'INVITATION.LIST.TITLE\' | translate}}</ion-nav-title><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><div class="row no-padding"><div class="col no-padding-xs no-padding-sm"><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="padding gray" ng-if="!search.loading && !search.results.length" translate="">INVITATION.NO_RESULT</div><ng-include src="\'plugins/es/templates/invitation/list_invitation.html\'"></ng-include></div></div></ion-content><button id="fab-new-invitation" class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm spin" ng-click="showNewInvitationModal()"></button></ion-view>'),e.put("plugins/es/templates/join/modal_join_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'select-account-type\'"><div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-class="{ activated: accountTypeMember != null && !accountTypeMember }" ng-click="selectAccountType(\'organization\')"><div class="item-content item-text-wrap"><i class="item-image icon dark cion-registry-association"></i><h2 translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT</h2><h4 class="gray" translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT_HELP</h4><i class="icon dark ion-ios-arrow-right"></i></div></div></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'last-slide\'"><ion-slide-page><ion-content class="has-header" scroll="false"><p>TOTO</p></ion-content></ion-slide-page></ng-if>'),e.put("plugins/es/templates/message/compose.html",'<ion-view left-buttons="leftButtons" id="composeMessage"><ion-nav-title><span class="visible-xs visible-sm" nf-if="!isReply" translate="">MESSAGE.COMPOSE.TITLE</span> <span class="visible-xs visible-sm" nf-if="isReply" translate="">MESSAGE.COMPOSE.TITLE_REPLY</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()"></button></ion-nav-buttons><ion-content scroll="true"><div class="row"><div class="col"><ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/message/compose_form.html",'<form name="messageForm" novalidate="" ng-submit="doSend()"><div class="list no-margin" ng-init="setForm(messageForm)"><a class="item item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.destPub}" ng-click="showWotLookupModal()"><span class="gray" translate>MESSAGE.COMPOSE.TO</span> <span class="badge badge-royal" ng-if="destUid"><i class="ion-person"></i> {{destName||destUid}}</span>&nbsp; <span class="badge badge-stable" ng-if="!destUid && destPub">{{destName}} <span ng-if="!destName"><i class="ion-key"></i>{{destPub | formatPubkey}}</span> </span>&nbsp; <i class="gray icon ion-ios-arrow-right"></i></a><div class="form-errors" ng-if="form.$submitted && !formData.destPub"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><ion-item class="item-text-wrap ink" ng-class="{\'item-icon-right\': enableSelectWallet}" ng-click="showSelectWalletModal()"><span class="gray" translate>TRANSFER.FROM</span> <span class="badge badge-balanced animate-fade-in animate-show-hide" ng-show="!loading"><ion-spinner icon="android" ng-if="!walletData.pubkey"></ion-spinner><span ng-if="walletData.pubkey && !walletData.isMember"><i class="ion-key"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp; </span><span ng-if="walletData.isMember"><i class="ion-person"></i> {{walletData.name||walletData.uid}} </span></span><i class="gray icon ion-ios-arrow-right" ng-if="enableSelectWallet"></i></ion-item><div class="item item-input" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}"><input type="text" autocomplete="off" placeholder="{{\'MESSAGE.COMPOSE.OBJECT_HELP\' | translate}}" name="title" ng-model="formData.title" ng-maxlength="256" required> <span class="badge item-note" ng-if="isReply">({{\'MESSAGE.COMPOSE.OBJECT\' | translate}})</span></div><div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error"><div class="form-error" ng-message="maxlength"><span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 256}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.content.$invalid}"><span class="input-label">{{\'MESSAGE.COMPOSE.MESSAGE\' | translate}}</span><textarea placeholder="{{\'MESSAGE.COMPOSE.MESSAGE_HELP\' | translate}}" autocomplete="off" name="content" ng-model="formData.content" rows="8" ng-maxlength="5000">\n        </textarea></div><div class="form-errors" ng-show="form.$submitted && form.content.$error" ng-messages="form.content.$error"><div class="form-error" ng-message="maxlength"><span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 5000}"></span></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" type="submit" ng-disabled="sending" translate>TRANSFER.BTN_SEND</button></div><div class="list no-margin"><div class="item item-icon-left item-text-wrap"><i class="icon ion-ios-information-outline positive"></i><h4 class="positive" translate>MESSAGE.COMPOSE.ENCRYPTED_HELP</h4></div></div></form>'),e.put("plugins/es/templates/message/list.html",'<div class="padding gray" ng-if="!search.loading && !search.results.length"><span ng-if="search.type==\'last\'">{{ (\'MESSAGE.NO_MESSAGE_\' + type) | upper | translate }}</span> <span ng-if="search.type==\'text\'" translate="">COMMON.SEARCH_NO_RESULT</span></div><ion-list class="{{::motion.ionListClass}}" can-swipe="$root.device.enable"><ion-item class="item item-border-large item-avatar item-icon-right ink" ng-repeat="msg in :rebind:search.results track by msg.id" ng-click="select(msg, $event)"><i ng-if="::!msg.avatar" class="item-image icon" ng-class="{\'ion-person\': msg.uid, \'ion-email\': !msg.uid}"></i> <i ng-if="::msg.avatar" class="item-image avatar" style="background-image: url({{::msg.avatar.src}})"></i><h4 class="pull-right visible-xs visible-sm dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</h4><h3><a class="positive" ng-if="::msg.name||msg.uid" ui-sref="app.wot_identity({pubkey:msg.issuer, uid:msg.name||msg.uid})"><i class="ion-person"></i> {{::msg.name||msg.uid}} </a><a class="gray" ng-if="::!msg.name && !msg.uid" ui-sref="app.wot_identity({pubkey:msg.issuer})"><i class="ion-key"></i> {{::msg.issuer|formatPubkey}}</a></h3><h2 ng-class="{\'unread\': !msg.read}" ng-bind-html="::msg.title"></h2><p ng-bind-html="::msg.summary||msg.content"></p><i class="icon ion-ios-arrow-right"></i><ion-option-button class="button-stable" ng-click="showReplyModal($index)" translate="">MESSAGE.BTN_REPLY</ion-option-button><ion-option-button class="button-assertive" ng-click="delete($index)" translate="">COMMON.BTN_DELETE</ion-option-button></ion-item></ion-list><ion-infinite-scroll ng-if="!search.loading && search.hasMore" icon="ion-loading-c" on-infinite="showMore()" distance="10%"></ion-infinite-scroll>'),e.put("plugins/es/templates/message/lookup.html",'<ion-view left-buttons="leftButtons" class="view-messages"><ion-tabs class="tabs-positive tabs-icon-top"><ion-tab title="{{\'MESSAGE.LIST.INBOX\'|translate}}" icon="ion-archive" ui-sref="app.user_message.tab_inbox"><ion-nav-view name="tab_inbox"></ion-nav-view></ion-tab><ion-tab title="{{\'MESSAGE.LIST.OUTBOX\'|translate}}" icon="ion-paper-airplane" ui-sref="app.user_message.tab_outbox"><ion-nav-view name="tab_outbox"></ion-nav-view></ion-tab></ion-tabs></ion-view>'),e.put("plugins/es/templates/message/lookup_by_id.html",'<ion-view left-buttons="leftButtons" class="view-messages"><ion-tabs class="tabs-positive tabs-icon-top"><ion-tab title="{{\'MESSAGE.LIST.INBOX\'|translate}}" icon="ion-archive" ui-sref="app.user_messages_by_id.tab_inbox"><ion-nav-view name="tab_inbox"></ion-nav-view></ion-tab><ion-tab title="{{\'MESSAGE.LIST.OUTBOX\'|translate}}" icon="ion-paper-airplane" ui-sref="app.user_messages_by_id.tab_outbox"><ion-nav-view name="tab_outbox"></ion-nav-view></ion-tab></ion-tabs></ion-view>'),e.put("plugins/es/templates/message/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="view-messages"><ion-nav-title><span translate="">MESSAGE.LIST.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)"><i class="icon ion-android-more-vertical"></i></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true, $event)"></ion-refresher><div class="item no-padding"><div class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'MESSAGE.LIST.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" on-return="doSearch()" select-on-click=""><div class="helptip-anchor-center"><a id="helptip-message-search-text"></a></div></div></div><div class="padding-top hidden-xs" style="display: block; height: 60px"><div class="pull-left" ng-if="!search.loading"><ng-if ng-if="search.type==\'last\'"><h4>{{ (\'MESSAGE.LIST.LAST_\' + type) | upper | translate}}</h4></ng-if><ng-if ng-if="search.type==\'text\'"><h4 translate="">COMMON.RESULTS_LIST</h4></ng-if></div></div><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><ng-include src="\'plugins/es/templates/message/list.html\'"></ng-include></ion-content><button id="fab-add-message-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin" ng-click="showNewMessageModal()"></button></ion-view>'),e.put("plugins/es/templates/message/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>MESSAGE.LIST.POPOVER_ACTIONS.TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-class="{\'gray\': (type != \'inbox\' && !messages.length)}" ng-click="markAllAsRead()"><i class="icon ion-android-checkmark-circle"></i> {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}} </a><a class="item item-icon-left assertive ink" ng-class="{\'gray\': !messages.length}" ng-click="deleteAll()"><i class="icon ion-trash-a"></i> {{\'MESSAGE.LIST.POPOVER_ACTIONS.DELETE_ALL\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/message/modal_compose.html",'<ion-modal-view id="composeMessage" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" ng-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</h1><h1 class="title" ng-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()"></button></ion-header-bar><ion-content scroll="true"><ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include></ion-content></ion-modal-view>'),e.put("plugins/es/templates/message/popover_message.html",""),e.put("plugins/es/templates/message/view_message.html",'<ion-view left-buttons="leftButtons" class="view-message"><ion-nav-title><span translate="">MESSAGE.VIEW.TITLE</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true"><div class="row no-padding"><div class="col no-padding"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list animate-fade-slide-in item-text-wrap"><div class="item item-avatar" ng-class="{\'item-avatar\': formData.avatar}"><i ng-if="!formData.avatar" class="item-image" ng-class="{\'ion-person\': formData.uid, \'ion-email\': !formData.uid}"></i> <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i><h4>{{type == \'inbox\' ? \'MESSAGE.VIEW.SENDER\': \'MESSAGE.VIEW.RECIPIENT\'|translate}} <a class="positive" ui-sref="app.wot_identity({pubkey: (type == \'inbox\') ? formData.issuer : formData.recipient, uid: formData.name||formData.uid})"><span ng-if="formData.uid"><i class="ion-person"></i> {{formData.name||formData.uid}} </span><span ng-if="!formData.uid" class="gray"><i class="ion-key gray"></i> {{formData.name||(formData.issuer|formatPubkey)}}</span></a></h4><h5 class="gray visible-xs visible-sm"><i class="ion-clock"></i> {{formData.time | formatDate}}</h5></div><ion-item class="visible-xs visible-sm"><h1 class="title" ng-bind-html="formData.title"></h1></ion-item><ion-item><p ng-bind-html="formData.html"></p><div class="padding gray" ng-if="!formData.content" translate="">MESSAGE.VIEW.NO_CONTENT</div></ion-item></div></div></div></ion-content><button id="fab-view-message-reply" class="button button-fab button-fab-bottom-right button-calm icon ion-reply visible-xs visible-sm spin" ng-click="showReplyModal()"></button></ion-view>'),e.put("plugins/es/templates/message/view_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left assertive ink" ng-click="delete()"><i class="icon ion-trash-a"></i> {{\'MESSAGE.VIEW.DELETE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/network/view_network_extend.html",'<ng-if ng-if=":state:enable"><a class="button button-text button-small ink" ui-sref="app.blockchain_search"><i class="icon ion-android-search"></i> <span>{{\'COMMON.BTN_SEARCH\'|translate}}</span></a></ng-if>'),e.put("plugins/es/templates/notification/list_notification.html",'<ion-list class="{{::motion.ionListClass}}"><ion-item ng-repeat="notification in search.results track by notification.id" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select($event, notification)"><i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i> <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i><h3 trust-as-html="notification.message | translate:(notification.messageParams||notification)"></h3><h4 ng-if="!notification.medianTime"><i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.time|formatFromNow}}</span> <span class="gray">| {{notification.time|formatDate}}</span></h4><h4 ng-if="notification.medianTime"><i class="icon {{notification.icon}}"></i>&thinsp;<span class="dark">{{notification.medianTime|medianFromNow}}</span> <span class="gray">| {{notification.medianTime|medianDate}}</span></h4></ion-item></ion-list><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%"></ion-infinite-scroll>'),e.put("plugins/es/templates/notification/popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-disabled="!search.results.length" ng-click="markAllAsRead()"><i class="icon ion-android-checkmark-circle"></i> {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/notification/popover_notification.html",""),e.put("plugins/es/templates/notification/view_notifications.html",'<ion-view left-buttons="leftButtons" class="view-notification"><ion-nav-title>{{\'COMMON.NOTIFICATIONS.TITLE\' | translate}}</ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true)"></ion-refresher><div class="row no-padding"><div class="col no-padding-xs no-padding-sm"><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="padding gray" ng-if="!search.loading && !search.results.length" translate="">COMMON.NOTIFICATIONS.NO_RESULT</div><ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/registry/edit_record.html",'<ion-view left-buttons="leftButtons" class="view-page"><ion-nav-title><span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span> <span class="visible-xs" ng-if="!loading && !id" translate="">REGISTRY.EDIT.TITLE_NEW</span></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()"></button></ion-nav-buttons><ion-content scroll="true"><div class="hero"><div class="content"><i class="avatar" ng-class="avatarClass" ng-style="avatarStyle"><button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block" ng-click="showAvatarModal()"></button> <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px" ng-click="rotateAvatar()"><i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px"></i> <i class="icon-secondary ion-forward" style="left: 26px; top: -13px"></i></button></i><h3 class="dark"><span ng-if="!loading && formData.title">{{formData.title}}</span> <span ng-if="!loading && !id && !formData.title" translate="">REGISTRY.EDIT.TITLE_NEW</span></h3><h4 class="dark"><ion-spinner ng-if="loading" icon="android"></ion-spinner></h4></div></div><div class="row no-padding"><div class="col no-padding-xs no-padding-sm"><form name="recordForm" novalidate="" ng-submit="save()"><div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)"><div class="item" ng-if="id"><h4 class="gray"><i class="icon ion-calendar"></i> {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}}&nbsp;{{formData.time | formatDate}}</h4><div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">{{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}</div></div><ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include><div class="item item-divider" translate="">REGISTRY.GENERAL_DIVIDER</div><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}"><span class="input-label" translate="">REGISTRY.EDIT.RECORD_TITLE</span> <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="registry-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true"></div><div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div><div class="item item-input item-floating-label"><span class="input-label" translate="">REGISTRY.EDIT.RECORD_DESCRIPTION</span><textarea placeholder="{{\'REGISTRY.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n                </textarea></div><div class="item item-icon-right ink" ng-if="loading || formData.type===\'company\' || formData.type===\'shop\'" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id, \'done in\': !loading}" ng-click="showCategoryModal()"><span translate="">REGISTRY.CATEGORY</span> <span class="badge badge-royal">{{formData.category.name | formatCategory}}</span>&nbsp; <i class="gray icon ion-ios-arrow-right"></i></div><input type="hidden" name="category" ng-model="formData.category.id" required-if="formData.type==\'company\' || formData.type==\'shop\'"><div class="form-errors" ng-if="form.$submitted && form.category.$error" ng-messages="form.category.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><ng-include src="\'plugins/es/templates/common/edit_position.html\'"></ng-include><ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include><div class="item item-divider" translate="">REGISTRY.TECHNICAL_DIVIDER</div><div class="item item-input item-floating-label"><span class="input-label" translate="">REGISTRY.EDIT.RECORD_PUBKEY</span> <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey"></div></div></form></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/registry/lookup_form.html",'<form ng-submit="doSearch()"><div class="item no-padding"><div class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" on-return="doSearchText()" select-on-click=""></div></div><ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-if="entered && options.location.show && (!search.geoPoint || smallscreen)" ng-controller="ESSearchPositionItemCtrl"></ng-include><ng-include src="::\'plugins/es/templates/registry/lookup_form_options.html\'"></ng-include></form><div class="padding-top padding-xs padding-sm" style="display: block; height: 60px"><div class="pull-left ng-hide" ng-show="!search.loading && search.results"><ng-if ng-if="search.lastRecords"><h4 translate="">REGISTRY.SEARCH.LAST_RECORDS</h4><small class="gray no-padding" ng-if="search.total"><span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span> <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span></small></ng-if><ng-if ng-if="!search.lastRecords"><h4 translate="">COMMON.RESULTS_LIST</h4><small class="gray no-padding" ng-if="search.total"><span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span> <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span></small></ng-if></div></div><div class="center" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="padding assertive" ng-if="!search.loading && search.results.length===0" translate="">COMMON.SEARCH_NO_RESULT</div>'),e.put("plugins/es/templates/registry/lookup_form_options.html",'<div class="item item-icon-left item-input item-select stable-bg" ng-if="search.advanced && options.location.show"><i class="icon ion-arrow-resize gray"></i> <span class="input-label item-icon-left-padding" translate="">LOCATION.DISTANCE</span><label><select ng-model="search.geoDistance" class="col-border-left" ng-options="i as (geoDistanceLabels[i].labelKey | translate:geoDistanceLabels[i].labelParams ) for i in geoDistances track by i"></select></label></div>'),e.put("plugins/es/templates/registry/lookup_lg.html",'<ion-view left-buttons="leftButtons"><ion-nav-title>{{\'REGISTRY.SEARCH.TITLE\' | translate}}</ion-nav-title><ion-content class="lookupForm padding no-padding-xs no-padding-sm"><ng-include src="::\'plugins/es/templates/wot/lookup_lg_extend.html\'" ng-init="enable= true; showNewPageButton=true;"></ng-include><ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include><ng-include src="::\'plugins/es/templates/registry/lookup_list_lg.html\'"></ng-include></ion-content><button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()"></button></ion-view>'),e.put("plugins/es/templates/registry/lookup_list.html",'<ion-list class="{{::motion.ionListClass}}" ng-if="!search.loading && search.results"><div class="item item-avatar item-icon-right item-border-large ink" ng-repeat="item in search.results" ui-sref="app.view_page({id: item.id, title: item.urlTitle})"><i ng-if="::!item.avatar" class="item-image icon cion-page-{{::item.type}}"></i> <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i><h2 ng-bind-html="::item.title"></h2><h4><span class="dark" ng-if="::item.city"><b class="ion-location"></b> <span ng-bind-html="::item.city"></span> </span><span class="gray" ng-if="::item.distance">({{::item.distance|formatDecimal}} {{::geoUnit}})</span></h4><h4 class="gray" ng-if="::item.time && search.lastRecords"><i class="ion-clock"></i> {{::item.time | formatFromNow}}</h4><h4 class="gray" ng-if="!search.lastRecords"><i class="cion-page-{{::item.type}}"></i> <span ng-if="item.category">{{::item.category.name}}</span> <span ng-if="!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</span></h4><i class="icon ion-ios-arrow-right"></i></div></ion-list>'),
-e.put("plugins/es/templates/registry/lookup_list_lg.html",'<div class="list {{::motion.ionListClass}}" ng-if="!search.loading && search.results && search.results.length > 0"><a ng-repeat="item in search.results" class="item item-record item-border-large ink padding-xs" ui-sref="app.view_page({id: item.id, title: item.urlTitle})"><div class="row row-record"><div class="col item-text-wrap item-avatar-left-padding" ng-class="::{\'item-avatar\': item.avatar || item.type}"><i class="item-image icon cion-page-{{::item.type}}" ng-if="::!item.avatar"></i> <i class="item-image avatar" style="background-image: url({{::item.avatar.src}})" ng-if="::item.avatar"></i><h2 ng-bind-html="::item.title"></h2><h4><span class="dark" ng-if="::item.city"><b class="ion-location"></b> <span ng-bind-html="::item.city"></span> </span><span class="gray" ng-if="::item.distance">({{::item.distance|formatDecimal}} {{::geoUnit}})</span></h4><h4><span class="gray" ng-if="::item.time && search.lastRecords"><b class="ion-clock"></b> {{::item.time | formatFromNow}} </span><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4><span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count">{{::item.picturesCount}}&nbsp;<i class="icon ion-camera"></i></span></div><div class="col hidden-xs"><h4 class="text-wrap"><span class="visible-sm"><b class="ion-flag"></b><ng-if ng-if="::item.category">{{::item.category.name|truncText:50}}</ng-if><ng-if ng-if="::!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</ng-if></span><span class="gray text-italic" ng-if="::item.description"><b class="ion-quote"></b> <span ng-bind-html="::item.description|truncText:500" ng-if="::item.description"></span></span></h4></div></div></a></div><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%"></ion-infinite-scroll>'),e.put("plugins/es/templates/registry/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="showNewPageModal();"><i class="icon ion-plus"></i> <span translate>REGISTRY.BTN_NEW</span></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/registry/lookup_popover_filters.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="doGetLastRecords()"><i class="icon ion-clock"></i> {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}} </a><a class="item item-icon-left ink" ng-click="toggleAdvanced();"><i class="icon ion-android-checkbox-outline-blank" ng-show="!search.advanced"></i> <i class="icon ion-android-checkbox-outline" ng-show="search.advanced"></i> <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/registry/modal_record_type.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>{{getParameters().title||\'REGISTRY.TYPE.TITLE\'|translate}}</h1></ion-header-bar><ion-content class="lookupForm"><div class="list padding"><h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3><button class="button button-block button-stable icon-left cion-page-shop" ng-click="closeModal(\'shop\')" translate>REGISTRY.TYPE.ENUM.SHOP</button> <button class="button button-block button-stable icon-left cion-page-association" ng-click="closeModal(\'association\')" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button> <button class="button button-block button-stable icon-left cion-page-company" ng-click="closeModal(\'company\')" translate>REGISTRY.TYPE.ENUM.COMPANY</button> <button class="button button-block button-stable icon-left cion-page-institution" ng-click="closeModal(\'institution\')" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/registry/view_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>REGISTRY.VIEW.MENU_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="showSharePopover($event)"><i class="icon ion-android-share-alt"></i> {{\'COMMON.BTN_SHARE\' | translate}} </a><a class="item item-icon-left assertive ink" ng-if="canEdit" ng-click="delete()"><i class="icon ion-trash-a"></i> {{\'COMMON.BTN_DELETE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/registry/view_record.html",'<ion-view left-buttons="leftButtons" class="view-page"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit"><i class="icon ion-android-create"></i></button> <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true" class="refresher-top-bg"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()"></ion-refresher><div class="hero"><div class="content" ng-if="!loading"><i class="avatar cion-page-{{formData.type}}" ng-if="!formData.avatar"></i> <i class="avatar" ng-style="{{avatarStyle}}" ng-if="formData.avatar"></i><h3><span class="dark" ng-bind-html="formData.title"></span></h3><h4>&nbsp;</h4></div><h4 class="content dark" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><div class="row no-padding-xs no-padding-sm"><div class="col list animate-fade-slide-in item-text-wrap no-padding-xs no-padding-sm"><div class="item"><h2 class="gray"><a ng-if="formData.city" ui-sref="app.wot_lookup.tab_registry({location:formData.city})"><i class="icon ion-location"></i> <span ng-bind-html="formData.city"></span> </a><span ng-if="formData.city && formData.type">&nbsp;|&nbsp;</span> <a ng-if="formData.type" ui-sref="app.wot_lookup.tab_registry({type:formData.type})"><i class="cion-page-{{formData.type}}"></i> {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}</a></h2><h4><i class="icon ion-clock" ng-if="formData.time"></i> <span translate="">COMMON.SUBMIT_BY</span> <a ng-class="{\'positive\': issuer.uid, \'gray\': !issuer.uid}" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})"><ng-if ng-if="issuer.uid"><i class="icon ion-person"></i> {{::issuer.name||issuer.uid}}</ng-if><span ng-if="!issuer.uid"><i class="icon ion-key"></i> {{issuer.pubkey|formatPubkey}} </span></a><span>{{formData.time|formatFromNow}}<h4 class="gray hidden-xs">| {{formData.time | formatDate}}</h4></span></h4></div><a id="registry-share-anchor-{{id}}"></a><div class="item"><h2 trust-as-html="formData.description"></h2></div><div class="item" ng-if="formData.category || formData.address"><h4 ng-if="formData.category"><span class="gray" translate="">REGISTRY.VIEW.CATEGORY</span> <a class="positive" ng-if="formData.category" ui-sref="app.wot_lookup.tab_registry({category:formData.category.id})"><span ng-bind-html="formData.category.name"></span></a></h4><h4 ng-if="formData.address"><span class="gray" translate="">REGISTRY.VIEW.LOCATION</span> <a class="positive" target="_system" href="https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}"><span ng-bind-html="formData.address"></span> <span ng-if="formData.city">- </span><span ng-bind-html="formData.city"></span></a></h4></div><ng-if ng-if="formData.socials && formData.socials.length>0"><div class="item item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}}</p><h2><a ng-click="openLink($event, social.url, social.type)">{{social.url}}</a></h2></div></ng-if><div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}"><i class="icon ion-key"></i> <span translate="">REGISTRY.EDIT.RECORD_PUBKEY</span><h4 class="dark">{{::formData.pubkey}}</h4></div><div class="lazy-load"><ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include><ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include></div></div></div></ion-content><button class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey: formData.pubkey, uid: formData.title})"></button></ion-view>'),e.put("plugins/es/templates/registry/view_wallet_pages.html",'<ion-view left-buttons="leftButtons" class="view-notification"><ion-nav-title>{{\'REGISTRY.MY_PAGES\' | translate}}</ion-nav-title><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate()"></ion-refresher><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding gray" ng-if="!search.loading && !search.results.length" translate="">REGISTRY.NO_PAGE</div><ng-include src="\'plugins/es/templates/registry/lookup_list.html\'"></ng-include></ion-content><button id="fab-wallet-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin" ng-click="showNewPageModal()"><i class="icon ion-plus"></i></button></ion-view>'),e.put("plugins/es/templates/settings/plugin_settings.html",'<ion-view left-buttons="leftButtons" class="settings"><ion-nav-title translate="">ES_SETTINGS.PLUGIN_NAME</ion-nav-title><ion-content scroll="true"><div class="item item-toggle dark"><div class="input-label" translate="">ES_SETTINGS.ENABLE_TOGGLE</div><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.enable"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider" translate="">SETTINGS.STORAGE_DIVIDER</span><div class="item item-toggle item-text-wrap dark"><div class="input-label" ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.ENABLE_REMOTE_STORAGE</div><h4 class="gray text-wrap" ng-bind-html="\'ES_SETTINGS.ENABLE_REMOTE_STORAGE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.useRemoteStorage" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider" translate="">SETTINGS.NETWORK_SETTINGS</span><ion-item class="ink item-icon-right item-text-wrap visible-xs visible-sm" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable"><div class="input-label" ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.PEER</div><ng-if ng-if="isFallbackNode"><h4 class="gray text-wrap assertive"><b class="ion-alert-circled"></b> <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span></h4><div class="badge badge-assertive">{{server}}</div></ng-if><div class="badge" ng-class="{\'badge-balanced\': formData.enable, \'badge-stable\': !formData.enable}" ng-if="!isFallbackNode">{{server}}</div><i class="icon ion-ios-arrow-right"></i></ion-item><span class="item item-divider" translate="">ES_SETTINGS.NOTIFICATIONS.DIVIDER</span><span class="item gray item-text-wrap" translate="">ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</span><div class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.txSent" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></div></label><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</span><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.txReceived" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></label></label><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</span><div class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.certSent" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></div></label><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</span><div class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.certReceived" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></div></label><cs-extension-point name="common"></cs-extension-point></ion-content></ion-view>'),e.put("plugins/es/templates/settings/settings_extend.html",'<div class="item item-text-wrap item-icon-right ink" ui-sref="app.es_settings"><div class="input-label ng-binding" translate>ES_SETTINGS.PLUGIN_NAME</div><h4 class="gray" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4><i class="icon ion-ios-arrow-right"></i></div>'),e.put("plugins/es/templates/subscription/edit_subscriptions.html",'<ion-view left-buttons="leftButtons" class="view-notification"><ion-nav-title>{{\'SUBSCRIPTION.EDIT.TITLE\' | translate}}</ion-nav-title><ion-nav-buttons side="secondary"></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()"></ion-refresher><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding gray" ng-if="!search.loading && !search.results.length" translate="">SUBSCRIPTION.NO_SUBSCRIPTION</div><div class="row no-padding"><div class="col list {{::motion.ionListClass}} item-border-large"><ng-repeat ng-repeat="subscriptions in search.results | filter: { type: \'email\' }" ng-include="\'plugins/es/templates/subscription/item_\' + subscriptions.type.toLowerCase() + \'_subscription.html\'">></ng-repeat></div></div></ion-content><button id="fab-add-subscription-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="addSubscription()"></button></ion-view>'),e.put("plugins/es/templates/subscription/item_email_subscription.html",'<div class="item item-avatar"><i class="item-image icon ion-email"></i><h3>{{\'SUBSCRIPTION.TYPE.ENUM.\' + subscriptions.type.toUpperCase() | translate}}</h3><h4 class="gray">{{\'SUBSCRIPTION.EDIT.PROVIDER\'|translate}} <a ui-sref="app.wot_identity({pubkey: subscriptions.recipient, uid: subscriptions.uid})"><span ng-class="{\'positive\': subscriptions.uid, \'dark\': !subscriptions.uid}" ng-if="subscriptions.name||subscriptions.uid"><i class="ion-person" ng-if="subscriptions.uid"></i> {{subscriptions.name||subscriptions.uid}} </span><span class="gray" ng-if="!subscriptions.uid"><i class="ion-key"></i> {{subscriptions.recipient | formatPubkey}}</span></a></h4><div class="item-note text-right"><span ng-repeat="item in subscriptions.items">{{item.content.email}} <a class="ion-trash-a gray padding-left" ng-click="deleteSubscription(item)"></a> <a class="ion-edit gray padding-left" ng-click="editSubscription(item)"></a><br></span></div></div>'),e.put("plugins/es/templates/subscription/modal_email.html",'<ion-modal-view id="composeMessage" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSubmit()"></button></ion-header-bar><ion-content scroll="true"><div class="item item-icon-left item-text-wrap"><i class="icon ion-ios-information-outline positive"></i><h4 class="positive" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4></div><form name="subscriptionForm" novalidate="" ng-submit="doSubmit()"><div class="list" ng-init="setForm(subscriptionForm)"><label class="item item-input" ng-class="{\'item-input-error\': form.$submitted && (form.email.$invalid || form.email.$error)}"><span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span> <input name="email" type="text" placeholder="{{\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\' | translate}}" ng-model="formData.content.email" ng-minlength="3" required email></label><div class="form-errors" ng-if="form.$submitted && (form.email.$invalid || form.email.$error)" ng-messages="form.email.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div><div class="form-error" ng-message="email"><span translate="ERROR.FIELD_NOT_EMAIL"></span></div></div><label class="item item-input item-select" ng-class="{\'item-input-error\': form.$submitted && !formData.content.frequency}"><span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span><select name="frequency" ng-model="formData.content.frequency" style="height: 46px;margin-top: 1px"><option value="weekly" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option><option value="daily" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option></select></label><div class="form-errors" ng-if="form.$submitted && !formData.content.frequency"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><a class="item item-input item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.recipient}" ng-click="showNetworkLookup()" style="height: 67px"><span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span> <span class="badge animate-fade-in animate-show-hide ng-hide" ng-class="{\'badge-royal\': recipient.uid, \'badge-stable\': !recipient.uid}" ng-show="recipient && (recipient.name||recipient.uid)"><i class="ion-person" ng-if="recipient.uid"></i> {{recipient.name||recipient.uid}} </span><span class="badge badge-secondary animate-fade-in animate-show-hide ng-hide" ng-show="formData.recipient"><i class="ion-key"></i> {{formData.recipient | formatPubkey}} </span><i class="gray icon ion-ios-arrow-right"></i></a><div class="form-errors" ng-if="form.$submitted && !formData.recipient"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" type="submit">{{\'COMMON.BTN_ADD\' | translate}}</button></div></form></ion-content></ion-modal-view>'),e.put("plugins/es/templates/wallet/item_wallet_extend.html",'<h4 class="dark" ng-if=":state:enable && wallet.id!=\'default\'"><a ng-if="walletData.invitations.unreadCount"><i class="dark ion-person-stalker"></i> {{walletData.invitations.unreadCount}} </a><a ng-if="walletData.messages.unreadCount" ui-sref="app.user_messages_by_id.tab_inbox({id: wallet.id})"><i class="dark ion-email"></i> {{walletData.messages.unreadCount}} </a><a ng-if="walletData.notifications.unreadCount" ui-sref="app.view_notifications_by_id({id: wallet.id})"><i class="dark ion-android-notifications"></i> {{walletData.notifications.unreadCount}}</a></h4>'),e.put("plugins/es/templates/wallet/view_wallet_extend.html",'<ng-if ng-if=":state:enable"><div class="item item-divider item-divider-top-border"><span>{{\'PROFILE.PROFILE_DIVIDER\' | translate}} <i style="font-size: 12pt; cursor: pointer" ng-click="showProfileHelp=!showProfileHelp" class="icon positive ion-ios-help-outline" title="{{\'PROFILE.PROFILE_DIVIDER_HELP\' | translate}}"></i> </span><a class="badge button button-text button-small button-small-padding" ng-if="isDefaultWallet" ui-sref="app.edit_profile"><i class="icon ion-edit"></i> <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span> <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span> </a><a class="badge button button-text button-small button-small-padding" ng-if="!isDefaultWallet" ui-sref="app.edit_profile_by_id({id: walletId})"><i class="icon ion-edit"></i> <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span> <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span></a></div><div class="item item-text-wrap positive item-small-height" ng-show="showProfileHelp"><small translate>PROFILE.PROFILE_DIVIDER_HELP</small></div><ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=true"></ng-include><div class="item item-divider item-divider-top-border"><span>{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\' | translate}} <i style="font-size: 12pt; cursor: pointer" ng-click="showSubscriptionHelp=!showSubscriptionHelp" class="icon positive ion-ios-help-outline" title="{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\' | translate}}"></i> <span><a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count && isDefaultWallet" ui-sref="app.edit_subscriptions"><i class="icon ion-edit"></i> <span translate>SUBSCRIPTION.BTN_ADD</span> </a><a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count && !isDefaultWallet" ui-sref="app.edit_subscriptions_by_id({id: walletId})"><i class="icon ion-edit"></i> <span translate>SUBSCRIPTION.BTN_ADD</span></a></span></span></div><div class="item item-text-wrap positive item-small-height" ng-show="showSubscriptionHelp"><small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small></div><div ng-if="!formData.subscriptions.count" class="item gray" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count && isDefaultWallet" ui-sref="app.edit_subscriptions"><i class="icon ion-gear-a"></i> <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span> <span class="badge badge-calm">{{formData.subscriptions.count}}</span> <i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count && !isDefaultWallet" ui-sref="app.edit_subscriptions_by_id({id: walletId})"><i class="icon ion-gear-a"></i> <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span> <span class="badge badge-calm">{{formData.subscriptions.count}}</span> <i class="gray icon ion-ios-arrow-right"></i></a><div class="item item-divider item-divider-top-border"><span>{{\'REGISTRY.WALLET.REGISTRY_DIVIDER\' | translate}} <i style="font-size: 12pt; cursor: pointer" ng-click="showPagesHelp=!showPagesHelp" class="icon positive ion-ios-help-outline" title="{{\'REGISTRY.WALLET.REGISTRY_HELP\' | translate}}"></i> <span><a class="badge button button-text button-small button-small-padding" ng-if="!formData.pages.count" ng-click="showNewPageModal()"><i class="icon ion-edit"></i> <span translate>REGISTRY.BTN_NEW</span></a></span></span></div><div class="item item-text-wrap positive item-small-height" ng-show="showPagesHelp"><small translate>REGISTRY.WALLET.REGISTRY_HELP</small></div><div ng-if="!formData.pages.count" class="item gray" translate>REGISTRY.NO_PAGE</div><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count && isDefaultWallet" ui-sref="app.wallet_pages"><i class="icon ion-social-buffer"></i> <span translate>REGISTRY.MY_PAGES</span> <span class="badge badge-calm">{{formData.pages.count}}</span> <i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count && !isDefaultWallet" ui-sref="app.wallet_pages_by_id({id: walletId})"><i class="icon ion-social-buffer"></i> <span translate>REGISTRY.MY_PAGES</span> <span class="badge badge-calm">{{formData.pages.count}}</span> <i class="gray icon ion-ios-arrow-right"></i></a></ng-if>'),e.put("plugins/es/templates/user/edit_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left assertive ink" ng-click="removeProfile()"><i class="icon ion-trash-a"></i> {{\'PROFILE.BTN_DELETE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/user/edit_profile.html",'<ion-view left-buttons="leftButtons"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm" ng-click="removeProfile()" ng-if="existing"></button> <button class="button button-icon button-clear ion-android-done visible-xs visible-sm" ng-click="submitAndSaveAndClose()"></button></ion-nav-buttons><ion-content scroll="true"><div class="positive-900-bg hero"><div class="content"><i class="avatar" ng-style="avatarStyle" ng-class="{\'avatar-wallet\': !loading && !avatar && walletData && !walletData.isMember, \'avatar-member\': !loading && !avatar && walletData.isMember}"><button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block" ng-click="showAvatarModal()"></button> <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px" ng-click="rotateAvatar()"><i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px"></i> <i class="icon-secondary ion-forward" style="left: 26px; top: -13px"></i></button></i><h3 class="light"><ng-if ng-if="!loading && !formData.title && walletData && walletData.isMember">{{walletData.uid}}</ng-if><ng-if ng-if="!loading && !formData.title && walletData && !walletData.isMember">{{::walletData.pubkey | formatPubkey}}</ng-if><ng-if ng-if="!loading && formData.title">{{formData.title}}</ng-if></h3><h4 class="light"><ion-spinner ng-if="loading" icon="android"></ion-spinner></h4></div></div><div class="row no-padding"><div class="col"><form name="profileForm" novalidate="" ng-submit="saveAndClose()"><div class="list item-text-wrap {{::motion.ionListClass}}" ng-init="setForm(profileForm)"><div class="item item-icon-left item-text-wrap"><i class="icon ion-ios-information-outline positive"></i><h4 class="positive" translate="">PROFILE.HELP.WARNING_PUBLIC_DATA</h4></div><div class="item item-divider">{{\'PROFILE.GENERAL_DIVIDER\' | translate}}</div><ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}"><span class="input-label">{{\'PROFILE.TITLE\' | translate}}</span> <input type="text" name="title" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" id="profile-name" ng-model="formData.title" ng-model-options="{ debounce: 350 }" ng-maxlength="50" required></ion-item><div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span></div></div><ion-item class="item-input item-floating-label item-button-right"><span class="input-label" style="width: 100%">{{\'PROFILE.DESCRIPTION\' | translate}}</span><textarea placeholder="{{\'PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n              </textarea></ion-item><ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl as ctrl"></ng-include></div><ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include><div class="list item-text-wrap {{::motion.ionListClass}}"><div class="item item-divider">{{\'PROFILE.TECHNICAL_DIVIDER\' | translate}}</div><ion-item class="item-icon-left" ng-if="walletData && walletData.uid"><span translate="">COMMON.UID</span> <span class="badge badge-stable">{{::walletData.uid}}</span></ion-item><ion-item class="item-icon-left item-icon-right item-text-wrap ink" on-hold="copy(formData.pubkey)" copy-on-click=""><i class="icon ion-key"></i> <span translate="">COMMON.PUBKEY</span><p class="gray">{{walletData.pubkey}}</p></ion-item></div></form></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/user/items_profile.html",'<div ng-if="!formData.profile" class="item gray" translate>PROFILE.NO_PROFILE_DEFINED</div><div class="item" ng-if="formData.profile && formData.name && showName"><span class="gray" translate>PROFILE.TITLE</span><h3>{{formData.name}}</h3></div><div class="item item-text-wrap" ng-if="formData.profile.description"><span class="gray" translate>PROFILE.DESCRIPTION</span><h3 trust-as-html="formData.profile.description"></h3></div><div class="item" ng-if="formData.profile.address || formData.profile.city" copy-on-click="{{formData.profile.address ? formData.profile.address + \'&#10;\' : \'\'}}{{formData.profile.city}}"><span class="gray" translate>LOCATION.LOCATION_DIVIDER</span><h3><span class="text-keep-lines" ng-if="formData.profile.address">{{formData.profile.address}}<br></span>{{formData.profile.city}}</h3></div><div class="item" ng-if="formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl"><span class="gray" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span><div class="list no-padding"><ion-item ng-repeat="social in formData.profile.socials | filter:filterFn track by social.url " id="social-{{::social.url|formatSlug}}" class="item-icon-left item-text-wrap no-padding-bottom ink" on-tap="openSocial($event, social)"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}} <i class="ion-locked" ng-if="social.recipient"></i></p><h4><a on-tap="openSocial($event, social)" href="{{::social.url}}" target="_blank">{{::social.url}}</a></h4></ion-item></div></div>'),e.put("plugins/es/templates/wot/lookup_extend.html",'<ion-tab ng-if=":state:enable" title="{{\'MENU.REGISTRY\'|translate}}" icon="ion-social-buffer" ui-sref="app.wot_lookup.tab_registry"><ion-nav-view name="tab_registry"></ion-nav-view></ion-tab>'),
-e.put("plugins/es/templates/wot/lookup_item_group.html",'<i ng-if="::!item.avatar" class="item-image icon ion-android-people"></i> <i ng-if="::!item.avatar" class="item-image icon-secondary ion-android-lock" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9"></i> <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i><h2 ng-bind-html=":rebind:item.name"></h2><h4 class="gray"><i class="ion-clock"></i> {{:rebind:\'GROUP.CREATED_TIME\'|translate: item }}</h4><h4 class="dark pull-left" ng-if=":rebind:item.membersCount"><i class="dark ion-person"></i> <span class="dark">+{{:rebind:item.membersCount}}</span></h4><h4 class="dark"><span class="dark" ng-if="::item.description"><i class="ion-quote"></i> {{::item.description|truncText}}</span></h4><h4 ng-if="::item.tags"><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),e.put("plugins/es/templates/wot/lookup_item_page.html",'<i ng-if="::!item.avatar" class="item-image icon cion-page-{{item.type}}"></i> <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i><h2 ng-bind-html=":rebind:item.name"></h2><h4 class="gray"><span class="gray" ng-if="::item.city"><i class="ion-location"></i> {{::item.city|truncText}} </span><span ng-if="::item.city && item.type">|</span> <span ng-if="item.type"><i class="cion-page-{{item.type}}"></i> {{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</span></h4><h4 class="dark"><span class="dark" ng-if="::item.description"><i class="ion-quote"></i> {{::item.description|truncText}}</span></h4><h4 ng-if="::item.tags"><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),e.put("plugins/es/templates/wot/lookup_lg_extend.html",'<div class="buttons-tabs" ng-if=":state:enable"><div class="pull-right"><div class="button button-tab dark" title="{{\'REGISTRY.BTN_SHOW_WOT_HELP\' | translate}}" nav-transition="none" active-link="active" active-link-path-prefix="#/app/wot/lg" ui-sref="app.wot_lookup_lg"><i class="icon ion-person-stalker"></i> {{\'REGISTRY.BTN_SHOW_WOT\' | translate}}</div><a class="button button-tab ink dark" title="{{\'REGISTRY.BTN_SHOW_PAGES_HELP\' | translate}}" nav-transition="none" active-link="active" active-link-path-prefix="#/app/wot/page" ui-sref="app.registry_lookup_lg"><i class="icon ion-social-buffer"></i> {{\'REGISTRY.BTN_SHOW_PAGES\' | translate}}</a></div><div class="pull-right" ng-if="showNewPageButton">&nbsp;</div></div>'),e.put("plugins/es/templates/wot/popover_certification_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-if="canCertify" ng-click="certify()"><i class="icon ion-ribbon-b"></i> {{\'WOT.BTN_CERTIFY\' | translate}} </a><a class="item item-icon-left ink" ng-if="!isUserPubkey(formData.pubkey) && formData.isMember" ng-click="askCertification()"><i class="icon-secondary ion-ribbon-b" style="left: 16px; top: 0px; font-size: 25px"></i> <b class="icon-secondary ion-help" style="left: 35px; top: 0px"></b> {{\'WOT.BTN_ASK_CERTIFICATION\' | translate}} </a><a class="item item-icon-left ink" ng-if="isUserPubkey(formData.pubkey)" ng-click="showAskCertificationModal()"><i class="icon-secondary ion-ribbon-b" style="left: 16px; top: 0px; font-size: 25px"></i> <b class="icon-secondary ion-help" style="left: 35px; top: 0px"></b> {{\'WOT.BTN_ASK_CERTIFICATIONS_DOTS\' | translate}} </a><a class="item item-icon-left ink" ng-if="!isUserPubkey(formData.pubkey)" ng-click="showSuggestCertificationModal()"><i class="icon-secondary ion-person-stalker" style="left: 16px; top: 0px; font-size: 25px"></i> <b class="icon-secondary ion-help" style="left: 37px; top: -4px"></b> {{\'WOT.BTN_SUGGEST_CERTIFICATIONS_DOTS\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/wot/view_certifications_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'nav-buttons\'"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showCertificationActionsPopover($event)"></button></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'buttons\'"><button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showCertificationActionsPopover($event)" title="{{\'COMMON.POPOVER_ACTIONS_TITLE\' | translate}}"></button></ng-if>'),e.put("plugins/es/templates/wot/view_identity_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'"><button class="button button-stable button-small-padding icon ion-compose" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}"></button></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'buttons-top-fab\'"><button id="fab-compose-{{:rebind:formData.uid}}" class="button button-fab button-fab-top-left button-fab-hero mini button-stable spin" style="left: 88px" ng-click="showNewMessageModal()"><i class="icon ion-compose"></i></button></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'after-general\'"><span class="item item-divider item-divider-top-border"><span>{{\'PROFILE.PROFILE_DIVIDER\' | translate}} <a style="font-size: 12pt; cursor: pointer" ng-click="showProfileHelp=!showProfileHelp" class="icon positive ion-ios-help-outline ink" title="{{\'PROFILE.PROFILE_DIVIDER_HELP\' | translate}}"></a></span></span><div class="item item-text-wrap positive item-small-height" ng-show="showProfileHelp"><small translate>PROFILE.PROFILE_DIVIDER_HELP</small></div><ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=false;"></ng-include></ng-if>'),e.put("plugins/map/templates/network/item_search_tooltip.html","<a href=\"#\">\n  {{peer.dns || peer.server}}\n  <span class=\"{{peer.uid ? 'positive' : 'gray'}}\">\n    <i class=\"icon {{peer.uid ? 'ion-person' : 'ion-key'}}\"></i>\n    {{peer.uid ? (peer.name||peer.uid) : (peer.pubkey|formatPubkey) }}\n  </span>\n  <span class=\"gray\">{{peer.ipv4 ? (peer.ipv4 + ':' + peer.port) : ''}}</span>\n  <span class=\"{{peer.bma.useSsl  ? '' : 'ng-hide'}}\"><i class=\"ion-locked\"></i> <small>SSL</small></span>\n</a>\n"),e.put("plugins/map/templates/network/lookup_extend.html",'\x3c!-- FIXME issue #755 - https://git.duniter.org/clients/cesium-grp/cesium/issues/755\n<a ng-if="enable"\n   class="button button-text button-small ink hidden-sm hidden-xs"\n   title="{{\'MAP.NETWORK.LOOKUP.BTN_MAP_HELP\' | translate}}"\n        ui-sref="app.view_network_map">\n  <i class="icon ion-ios-location"></i>\n  {{\'MAP.NETWORK.LOOKUP.BTN_MAP\' | translate}}\n</a>\n --\x3e\n'),e.put("plugins/map/templates/network/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-network">\n  <ion-nav-title>\n    <span class="hidden-xs" translate>MAP.NETWORK.VIEW.TITLE</span>\n  </ion-nav-title>\n\n  <ion-nav-buttons side="secondary">\n  </ion-nav-buttons>\n\n  <ion-content data-tap-disabled="true">\n    <leaflet id="{{::mapId}}"\n             height="100%"\n             center="map.center"\n             markers="map.markers"\n             layers="map.layers">\n    </leaflet>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/map/templates/registry/item_search_tooltip.html","<a href=\"#\" class=\"{{type}}\">\n  <i class=\"{{'cion-page-' + type}}\"></i>\n  {{name != uid ? name +' ' : ''}}\n  <span class=\"gray\">\n    {{pubkey ? (pubkey|formatPubkey) : ''}}\n  </span>\n</a>\n"),e.put("plugins/map/templates/registry/lookup_lg_extend.html",'<a class="button button-text button-small ink hidden-sm hidden-xs"\n   title="{{\'MAP.REGISTRY.LOOKUP.BTN_MAP_HELP\' | translate}}"\n   ui-sref="app.view_registry_map">\n  <i class="icon ion-ios-location"></i>\n  {{\'MAP.REGISTRY.LOOKUP.BTN_MAP\' | translate}}\n</a>\n'),e.put("plugins/map/templates/registry/popup_marker.html",'<div class="item no-border no-padding item-avatar "\n     ng-if="loadingMarker">\n\n  <i class="item-image icon ion-person"></i>\n\n  <div class="item-content item-avatar-left-padding padding-top" >\n    <h2 class="stable-bg">\n      &nbsp;\n    </h2>\n    <h4 class="stable-bg col-75">\n      &nbsp;\n    </h4>\n    <h4 class="stable-bg col-50">\n      &nbsp;\n    </h4>\n  </div>\n</div>\n\n<a class="item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide"\n     ng-show="!loadingMarker"\n     ui-sref="app.view_page({id: formData.id, title: formData.name})">\n  <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}}"></i>\n  <i ng-if="!formData.avatar" class="item-image icon cion-page-{{::formData.type}}"></i>\n  <div class="item-content item-avatar-left-padding padding-top">\n    <h2 class="dark">\n      {{::formData.name}}\n    </h2>\n    <h4 ng-if="::formData.category" class="gray" title="{{::formData.category.name}}">\n      <b class="ion-flag"></b> {{::formData.category.name}}\n    </h4>\n    <h4 ng-if="::formData.city" class="gray" title="{{::formData.city}}">\n      <b class="ion-location"></b> {{::formData.city}}\n    </h4>\n  </div>\n</a>\n\x3c!-- buttons --\x3e\n<div class="item no-border no-padding">\n  <div class="pull-left gray">\n    \x3c!-- show description --\x3e\n    <a class="animate-fade-in animate-show-hide gray ng-hide"\n       ng-class="{\'ion-arrow-down-b\': !showDescription, \'ion-arrow-up-b\': showDescription}"\n       ng-click="showDescription=!showDescription;"\n       title="{{\'PROFILE.DESCRIPTION\'|translate}}"\n       ng-show="!loadingMarker && formData.description">\n      &nbsp;\n    </a>\n  </div>\n</div>\n<div class="item no-border no-padding item-text-wrap hidden-xs ng-hide" ng-show="showDescription">\n  <small trust-as-html="::formData.description|truncText:500"></small>\n</div>\n'),e.put("plugins/map/templates/registry/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-registry">\n  <ion-nav-title>\n    <span class="hidden-xs" translate>MAP.REGISTRY.VIEW.TITLE</span>\n  </ion-nav-title>\n\n  <ion-nav-buttons side="secondary">\n    <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n    </button>\n  </ion-nav-buttons>\n\n  <ion-content data-tap-disabled="true">\n    <a id="helptip-map-registry" style="left: 150px; top: 50px; position: relative;"></a>\n    <leaflet id="{{::mapId}}"\n             height="100%"\n             layers="map.layers"\n             markers="map.markers"\n             lf-center="map.center"\n             bounds="map.bounds">\n    </leaflet>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/map/templates/settings/es_settings_extend.html",'\n\x3c!--<span class="item item-divider" translate>MAP.SETTINGS.MAP_DIVIDER</span>\n\n<label class="item item-toggle dark item-text-wrap">\n  <span translate>MAP.SETTINGS.ENABLE_GOOGLE_API</span>\n  <h4 class="gray" translate>MAP.SETTINGS.ENABLE_GOOGLE_API_HELP</h4>\n  <div class="toggle toggle-royal">\n    <input type="checkbox" ng-model="formData.enableGoogleApi">\n    <div class="track">\n      <div class="handle"></div>\n    </div>\n  </div>\n</label>\n\n<ion-item class="item-input"\n          ng-if="!$root.config.plugins.es.googleApiKey"\n          ng-class="{\'item-input-error\': formData.enableGoogleApi && !formData.googleApiKey}">\n  <div class="input-label col-33">\n    <span class="" ng-class="{\'gray\': !formData.enableGoogleApi}"translate>MAP.SETTINGS.GOOGLE_API_KEY</span>\n    <h4>\n      <a ng-click="openLink($event, \'https://console.developers.google.com/apis/credentials/key\')" translate>MAP.SETTINGS.BTN_GOOGLE_API</a>\n      <span class="gray"> ({{\'MAP.SETTINGS.BTN_GOOGLE_API_WARNING\'|translate}})</span>\n    </h4>\n  </div>\n  <input type="text"\n         placeholder="{{\'MAP.SETTINGS.GOOGLE_API_KEY_PLACEHOLDER\' | translate}}"\n         ng-model="formData.googleApiKey"\n         ng-if="formData.enableGoogleApi">\n</ion-item>\n<div class="form-errors"\n     ng-show="formData.enableGoogleApi && !formData.googleApiKey">\n  <div class="form-error">\n    <span translate="ERROR.FIELD_REQUIRED"></span>\n  </div>\n</div>--\x3e\n'),e.put("plugins/map/templates/user/edit_profile_extend.html",'<div class="item no-padding hidden-xs hidden-sm {{ionItemClass}}" ng-if="formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon">\n  <leaflet id="{{::mapId}}"\n           height="250px"\n           center="map.center"\n           markers="map.markers"\n           defaults="map.defaults">\n  </leaflet>\n</div>\n'),e.put("plugins/map/templates/wot/item_search_tooltip.html","<a href=\"#\" class=\"{{type}}\">\n  <i class=\"{{pending ? 'ion-clock': (type ? 'cion-page-' + type : '')}}\"></i>\n  {{name != uid ? name +' ' : ''}}\n  <span class=\"{{uid ? 'positive' : 'gray'}}\">\n    <i class=\"{{uid ? 'ion-person' : 'ion-key'}}\"></i>\n    {{uid ? uid : (pubkey|formatPubkey) }}\n  </span>\n</a>\n"),e.put("plugins/map/templates/wot/lookup_lg_extend.html",'<a ng-if="enable"\n   class="button button-text button-small ink hidden-sm hidden-xs"\n   title="{{\'MAP.WOT.LOOKUP.BTN_MAP_HELP\' | translate}}"\n   ui-sref="app.view_wot_map">\n  <i class="icon ion-ios-location"></i>\n  {{\'MAP.WOT.LOOKUP.BTN_MAP\' | translate}}\n</a>\n'),e.put("plugins/map/templates/wot/popup_marker.html",'\n<div class="item no-border no-padding item-avatar "\n     ng-if="loadingMarker">\n\n  <i class="item-image icon ion-person"></i>\n\n  <div class="item-content item-avatar-left-padding padding-top" >\n    <h2 class="stable-bg">\n      &nbsp;\n    </h2>\n    <h4 class="stable-bg col-75">\n      &nbsp;\n    </h4>\n    <h4 class="stable-bg col-50">\n      &nbsp;\n    </h4>\n  </div>\n</div>\n\n<a class="item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide"\n   ng-show="!loadingMarker"\n   ui-sref="app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})">\n\n  <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n  <i ng-if="!formData.avatar && formData.uid" class="item-image icon ion-person"></i>\n  <i ng-if="!formData.avatar && !formData.uid" class="item-image icon ion-card"></i>\n\n  <div class="item-content item-avatar-left-padding padding-top">\n    <h2 class="dark">\n      {{formData.name}}\n    </h2>\n    <h4>\n      <span ng-if="formData.uid" class="positive">\n        <b class="ion-person"></b>\n        {{formData.uid}}\n      </span>\n      <span class="gray" title="{{formData.pubkey}}"><b class="ion-key"></b> {{formData.pubkey|formatPubkey}}</span>\n      <span class="assertive" ng-if="!formData.isMember">\n        {{::\'WOT.NOT_MEMBER_PARENTHESIS\'|translate}}\n      </span>\n    </h4>\n    <h4 ng-if="formData.profile.city" class="gray" title="{{formData.profile.city}}">\n      <b class="ion-location"></b> {{formData.profile.city}}\n    </h4>\n  </div>\n</a>\n\x3c!-- buttons --\x3e\n<div class="item no-border no-padding">\n  <div class="pull-left gray">\n    \x3c!-- show description --\x3e\n    <a class="animate-fade-in animate-show-hide gray ng-hide"\n       ng-class="{\'ion-arrow-down-b\': !showDescription, \'ion-arrow-up-b\': showDescription}"\n       ng-click="showDescription=!showDescription;"\n       title="{{\'PROFILE.DESCRIPTION\'|translate}}"\n       ng-show="!loadingMarker && formData.profile.description">\n      &nbsp;\n    </a>\n  </div>\n  <div style="font-size: 18px;" class="pull-right gray">\n    \x3c!-- share --\x3e\n    <a class="icon ion-android-share-alt "\n       ng-click="showSharePopover($event)"\n       title="{{\'COMMON.BTN_SHARE\' | translate}}">&nbsp;</a>\n    \x3c!-- certify --\x3e\n    <a class="icon ion-ribbon-b"\n       ng-click="certify()"\n       title="{{\'WOT.BTN_CERTIFY\' | translate}}"\n       ng-hide="!canCertify">&nbsp;</a>\n    \x3c!-- compose message --\x3e\n    <a class="icon ion-compose"\n       ng-click="showNewMessageModal()"\n       title="{{\'MESSAGE.BTN_WRITE\' | translate}}">&nbsp;</a>\n    \x3c!-- transfer --\x3e\n    <a class="icon ion-card"\n       ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})"\n       title="{{\'COMMON.BTN_SEND_MONEY\' | translate}}">&nbsp;</a>\n\n  </div>\n</div>\n<div class="item no-border no-padding item-text-wrap hidden-xs ng-hide" ng-show="showDescription">\n  <small trust-as-html="formData.profile.description|truncText:500"></small>\n</div>\n'),e.put("plugins/map/templates/wot/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-wot">\n  <ion-nav-title>\n    <span class="hidden-xs" translate>MAP.WOT.VIEW.TITLE</span>\n  </ion-nav-title>\n\n  <ion-nav-buttons side="secondary">\n    <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n    </button>\n  </ion-nav-buttons>\n\n  <ion-content data-tap-disabled="true">\n    <a id="helptip-map-wot" style="left: 150px; top: 50px; position: relative;"></a>\n    <leaflet id="{{::mapId}}"\n             height="100%"\n             layers="map.layers"\n             markers="map.markers"\n             lf-center="map.center"\n             bounds="map.bounds">\n    </leaflet>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/account/graph_balance.html",'\n    \x3c!-- button bar --\x3e\n    <div class="button-bar-inline "\n         style="top: 33px; margin-top:-33px; position: relative;">\n      <button\n        class="button button-stable button-clear no-padding-xs pull-right"\n        ng-click="showActionsPopover($event)">\n        <i class="icon ion-navicon-round"></i>\n      </button>\n    </div>\n\n    <div class="padding-left padding-right">\n      <canvas id="account-balance" class="chart-bar"\n              height="{{height}}" width="{{width}}"\n              chart-data="data"\n              chart-dataset-override="datasetOverride"\n              chart-colors="colors"\n              chart-options="options"\n              chart-labels="labels"\n              chart-click="onChartClick">\n      </canvas>\n    </div>\n\n    <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/account/graph_certifications.html",'\n    <div class="padding-left padding-right">\n      <canvas id="account-certifications" class="chart-bar"\n              height="{{height}}" width="{{width}}"\n              chart-data="data"\n              chart-dataset-override="datasetOverride"\n              chart-colors="colors"\n              chart-options="options"\n              chart-labels="labels"\n              chart-click="onChartClick">\n      </canvas>\n    </div>\n'),e.put("plugins/graph/templates/account/graph_sum_tx.html",'<div class="row responsive-sm" ng-if="!loading">\n\n  <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n  <div class="col text-center">\n\n    \x3c!-- TX input chart --\x3e\n    <p class="gray padding text-wrap"\n       ng-if="inputChart.data.length"\n       translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\n    <canvas id="chart-received-pie" class="chart-pie"\n            chart-data="inputChart.data"\n            chart-labels="inputChart.labels"\n            chart-colors="inputChart.colors"\n            chart-click="onInputChartClick">\n    </canvas>\n\n  </div>\n\n  <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n  <div class="col text-center">\n\n    \x3c!-- TX output chart --\x3e\n    <p class="gray padding text-wrap"\n       ng-if="outputChart.data.length"\n       translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\n    <canvas id="chart-sent-pie" class="chart-pie"\n            chart-data="outputChart.data"\n            chart-labels="outputChart.labels"\n            chart-colors="outputChart.colors"\n            chart-click="onOutputChartClick">\n    </canvas>\n\n  </div>\n\n  <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n</div>\n'),e.put("plugins/graph/templates/account/view_identity_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="extensionPoint === \'buttons\'">\n\n  <button class="button button-stable button-small-padding icon ion-stats-bars"\n          ng-click="showIdentityStats()"\n          title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n  </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/account/view_identity_tx_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="extensionPoint === \'buttons\'">\n\n  <button class="button button-stable button-small-padding icon ion-stats-bars"\n          ng-click="showIdentityStats()"\n          title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n  </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/account/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.ACCOUNT.TITLE\' | translate}}{{id}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="no-padding">\n\n\n\n    <div class="list" >\n\n      \x3c!--  - - - - Balance - - - - --\x3e\n      <ng-controller ng-controller="GpAccountBalanceCtrl">\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        <div class="item item-divider" ng-if="!loading" >\n          {{\'GRAPH.ACCOUNT.BALANCE_DIVIDER\'|translate}}\n          <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n        </div>\n\n        <div class="item no-padding-xs"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/account/graph_balance.html\'"\n             ng-init="setSize(350, 1000)">\n        </div>\n      </ng-controller>\n\n    </div>\n\n    <div class="item no-padding-xs"\n         ng-include="\'plugins/graph/templates/account/graph_sum_tx.html\'"\n         ng-controller="GpAccountSumTxCtrl">\n    </div>\n\n    \x3c!--  - - - - WOT - - - -\n    <div class="item item-divider" translate>\n      GRAPH.ACCOUNT.WOT_DIVIDER\n    </div>\n\n    <div class="item no-padding-xs"\n         ng-include="\'plugins/graph/templates/account/graph_certifications.html\'"\n         ng-controller="GpAccountCertificationCtrl"\n         ng-init="setSize(350, 1000)">\n    </div>--\x3e\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/account/view_wallet_tx_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="extensionPoint === \'buttons\'">\n\n  <button class="button button-stable button-small-padding icon ion-stats-bars"\n          ng-click="showWalletStats()"\n          title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n  </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/blockchain/graph_block_issuers.html",'\n    <div class="row responsive-lg">\n\n      \x3c!-- bar --\x3e\n      <div class="col col-75">\n        <canvas id="bar" class="chart-bar"\n                height="{{height}}" width="{{width}}"\n                chart-data="data"\n                chart-labels="labels"\n                chart-colors="colors"\n                chart-options="barOptions"\n                chart-click="onChartClick">\n        </canvas>\n      </div>\n\n      \x3c!-- pie --\x3e\n      <div class="col col-25 padding-top">\n        <canvas id="blocksByIssuer-pie" class="chart-pie"\n                chart-data="data"\n                chart-labels="labels"\n                chart-colors="colors"\n                chart-click="onChartClick">\n        </canvas>\n\n        <div class="gray padding-top text-center">\n          <small ng-bind-html="\'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_HELP\'| translate:{issuerCount: data.length, blockCount: blockCount }"></small>\n        </div>\n      </div>\n    </div>\n'),e.put("plugins/graph/templates/blockchain/graph_tx_count.html",'\n    \x3c!-- button bar --\x3e\n    <div class="button-bar-inline "\n         style="top: 33px; margin-top:-33px; position: relative;">\n      <button\n        class="button button-stable button-clear no-padding-xs pull-right"\n        ng-click="showActionsPopover($event)">\n        <i class="icon ion-navicon-round"></i>\n      </button>\n    </div>\n\n    <div class="padding-left padding-right">\n      <canvas id="tx-line" class="chart-bar"\n              height="{{height}}" width="{{width}}"\n              chart-data="data"\n              chart-dataset-override="datasetOverride"\n              chart-colors="colors"\n              chart-options="options"\n              chart-labels="labels"\n              chart-click="onChartClick">\n      </canvas>\n    </div>\n\n    <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/blockchain/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}{{id}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="no-padding">\n\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <div class="list" ng-if="!loading">\n\n\n      \x3c!-- TX count --\x3e\n      <ng-controller ng-controller="GpBlockchainTxCountCtrl">\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        <div class="item item-divider" ng-if="!loading" >\n          {{\'GRAPH.BLOCKCHAIN.TX_DIVIDER\'|translate}}\n          <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n        </div>\n\n        <div class="item no-padding-xs no-padding-sm"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/blockchain/graph_tx_count.html\'"\n             ng-init="setSize(350, 1000)">\n        </div>\n      </ng-controller>\n\n\n      \x3c!-- Blocks issuer --\x3e\n      <ng-controller ng-controller="GpBlockchainIssuersCtrl">\n\n        <div class="item item-divider" ng-if="!loading" translate>GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_DIVIDER</div>\n\n        <div class="item no-padding-xs no-padding-sm"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/blockchain/graph_block_issuers.html\'"\n             ng-init="setSize(300, 750)">\n        </div>\n\n      </ng-controller>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/common/graph_range_bar.html",'\n  <div class="range range-positive no-padding-left no-padding-right">\n    <a\n      class="button button-stable button-clear no-padding pull-left"\n      ng-click="goPreviousRange($event)">\n      <i class="icon ion-chevron-left"></i>\n    </a>\n    <input type="range"\n           ng-model="formData.timePct"\n           name="timePct"\n           min="0" max="100"\n           value="{{formData.timePct}}"\n           ng-change="onRangeChanged();"\n           ng-model-options="{ debounce: 250 }">\n    <a\n      class="button button-stable button-clear no-padding pull-right"\n      ng-click="goNextRange($event)">\n      <i class="icon ion-chevron-right"></i>\n    </a>\n  </div>\n'),e.put("plugins/graph/templates/common/popover_range_actions.html",'<ion-popover-view class="has-header popover-graph-currency">\n  <ion-header-bar>\n    <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n  </ion-header-bar>\n  <ion-content scroll="false">\n    <div class="list item-text-wrap">\n\n      \x3c!-- scale --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="toggleScale()">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.scale==\'logarithmic\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.LOGARITHMIC_SCALE\' | translate"></span>\n      </a>\n\n      \x3c!-- duration divider --\x3e\n      <div class="item item-divider">\n        {{\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\'|translate}}\n      </div>\n\n      \x3c!-- duration: hour --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="setRangeDuration(\'hour\')">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'hour\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.HOUR\' | translate"></span>\n      </a>\n\n      \x3c!-- duration: day --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="setRangeDuration(\'day\')">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'day\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.DAY\' | translate"></span>\n      </a>\n\n      \x3c!-- duration: month --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="setRangeDuration(\'month\')">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'month\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.MONTH\' | translate"></span>\n      </a>\n\n    </div>\n  </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/currency/graph_du.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs no-padding-sm pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="monetaryMass-bar" class="chart-bar"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="data"\n          chart-labels="labels"\n          chart-colors="colors"\n          chart-dataset-override="datasetOverride"\n          chart-options="options"\n          chart-click="showBlock">\n  </canvas>\n'),e.put("plugins/graph/templates/currency/graph_members_count.html",'  <canvas id="membersCount-bar" class="chart-line"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="data"\n          chart-labels="labels"\n          chart-colors="colors"\n          chart-options="options"\n          chart-dataset-override="datasetOverride"\n          chart-click="onChartClick">\n  </canvas>\n'),e.put("plugins/graph/templates/currency/graph_monetary_mass.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="monetaryMass-bar"\n          class="chart-bar"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="data"\n          chart-labels="labels"\n          chart-colors="colors"\n          chart-dataset-override="datasetOverride"\n          chart-options="options"\n          chart-click="onChartClick">\n  </canvas>\n'),e.put("plugins/graph/templates/currency/popover_monetary_mass_actions.html",'<ion-popover-view class="fit has-header">\n  <ion-header-bar>\n    <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n  </ion-header-bar>\n  <ion-content scroll="false">\n    <div class="list item-text-wrap">\n\n      <a class="item item-icon-left ink"\n         ng-click="toggleScale()">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.scale==\'logarithmic\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.LOGARITHMIC_SCALE\' | translate"></span>\n      </a>\n\n    </div>\n  </ion-content>\n</ion-popover-view>\n'),
-e.put("plugins/graph/templates/currency/tab_blocks_extend.html",'\x3c!-- buttons --\x3e\n<ng-if ng-if="enable && extensionPoint === \'buttons\'">\n  <div class="item item-divider">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_blocks_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n'),e.put("plugins/graph/templates/currency/view_currency_extend.html",'\n\x3c!-- section actual parameters --\x3e\n<ng-if ng-if="enable && extensionPoint === \'parameters-actual\'" >\n\n  <ng-if ng-if="!smallscreen">\n    <div class="item padding-left padding-right no-padding-xs no-padding-sm"\n         ng-include="\'plugins/graph/templates/currency/graph_monetary_mass.html\'"\n         ng-controller="GpCurrencyMonetaryMassCtrl"\n         ng-init="displayShareAxis=false;">\n    </div>\n    <div class="item buttons no-padding-top ">\n      <a class="pull-right button button-text button-small button-small-padding ink" ui-sref="app.currency_stats_lg">\n        <i class="icon ion-stats-bars"></i>\n        <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\n      </a>\n    </div>\n  </ng-if>\n\n  <div class="item item-divider"\n       ng-if="smallscreen">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_parameters_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n\n\x3c!-- section Wot --\x3e\n<ng-if ng-if="enable && extensionPoint === \'wot-actual\'" >\n\n  <ng-if ng-if="!smallscreen">\n    <div class="item padding-left padding-right no-padding-xs no-padding-sm"\n         ng-include="\'plugins/graph/templates/currency/graph_members_count.html\'"\n         ng-controller="GpCurrencyMembersCountCtrl">\n    </div>\n    <div class="item buttons no-padding-top ">\n      <a class="pull-right button button-text button-small button-small-padding ink" ui-sref="app.currency_stats_lg">\n        <i class="icon ion-stats-bars"></i>\n        <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\n      </a>\n    </div>\n  </ng-if>\n\n  <div class="item item-divider"\n       ng-if="smallscreen">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_wot_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n\n\x3c!-- section Wot --\x3e\n<ng-if ng-if="enable && extensionPoint === \'network-actual\'" >\n\n  <div class="item padding-left padding-right no-padding-xs no-padding-sm"\n       ng-if="!smallscreen"\n       ng-include="\'plugins/graph/templates/blockchain/graph_block_issuers.html\'"\n       ng-controller="GpBlockchainIssuersCtrl">\n  </div>\n\n  <div class="item item-divider"\n       ng-if="smallscreen">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_network_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n\n'),e.put("plugins/graph/templates/currency/view_stats_lg.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="padding" >\n\n\n\n    <div class="list" >\n\n      \x3c!-- Monetary mass --\x3e\n      <ng-controller ng-controller="GpCurrencyMonetaryMassCtrl" >\n\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        <div class="item no-padding-xs" ng-if="!loading"\n             ng-include="\'plugins/graph/templates/currency/graph_monetary_mass.html\'"\n             ng-init="setSize(250, 1000)">\n        </div>\n\n        <div ng-if="!loading"\n             class="item item-toggle dark no-border text-right">\n          <span class="" translate>COMMON.BTN_RELATIVE_UNIT</span>\n          <label class="toggle toggle-royal" id="helptip-currency-change-unit">\n            <input type="checkbox" ng-model="formData.useRelative">\n            <div class="track">\n              <div class="handle"></div>\n            </div>\n          </label>\n        </div>\n      </ng-controller>\n\n      \x3c!-- DU --\x3e\n      <ng-controller ng-controller="GpCurrencyDUCtrl" >\n        <div class="item no-padding-xs"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/currency/graph_du.html\'"\n             ng-init="setSize(250, 1000)">\n        </div>\n      </ng-controller>\n\n      \x3c!-- Member count  --\x3e\n      <ng-controller ng-controller="GpCurrencyMembersCountCtrl" >\n      <div class="item no-padding-xs"\n           ng-if="!loading"\n           ng-include="\'plugins/graph/templates/currency/graph_members_count.html\'"\n           ng-init="setSize(250, 1000)">\n      </div>\n\n\n    </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/currency/view_wot_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n\n  <ion-content scroll="true" >\n\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <ng-include\n      ng-if="!loading"\n      src="\'plugins/graph/templates/currency/graph_members_count.html\'" ></ng-include>\n  </ion-content>\n  </ion-view>\n'),e.put("plugins/graph/templates/docstats/graph.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs no-padding-sm pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="{{::chartIdPrefix}}{{chart.id}}"\n          class="chart-line"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="chart.data"\n          chart-labels="labels"\n          chart-dataset-override="chart.datasetOverride"\n          chart-options="chart.options"\n          chart-click="onChartClick">\n  </canvas>\n\n  <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/docstats/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.DOC_STATS.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="padding" >\n\n    <div class="list" >\n\n      \x3c!-- Doc stat --\x3e\n      <div class="center padding" ng-if="loading">\n        <ion-spinner icon="android"></ion-spinner>\n      </div>\n\n      <div class="item no-padding-xs no-padding-sm" ng-if="!loading"\n           ng-repeat="chart in charts"\n           ng-include="\'plugins/graph/templates/docstats/graph.html\'"\n           ng-init="setSize(250, 1000)">\n      </div>\n\n    </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/network/view_network_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="enable && extensionPoint === \'buttons\'">\n  <a class="button button-text button-small ink"\n     ui-sref="app.blockchain_stats" >\n    <i class="icon ion-stats-bars"></i>\n    <span>{{\'NETWORK.VIEW.BTN_GRAPH\'|translate}}</span>\n  </a>\n</ng-if>\n'),e.put("plugins/graph/templates/network/view_peer_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="enable && extensionPoint === \'general\'">\n\n  <a class="item item-icon-left item-icon-right item-text-wrap ink"\n    ui-sref="app.view_peer_stats({pubkey: node.pubkey})">\n    <i class="icon ion-stats-bars"></i>\n    <span translate>GRAPH.PEER.VIEW.BLOCK_COUNT_LABEL</span>\n    <span class="badge"\n          ng-if="!loading"\n          ng-class="{\'badge-stable\': blockCount > 0, \'badge-assertive\': !blockCount}">\n      {{!blockCount ? \'GRAPH.PEER.VIEW.NO_BLOCK\' : \'GRAPH.PEER.VIEW.BLOCK_COUNT\' | translate:{count: blockCount} }}\n    </span>\n    <ion-spinner class="badge" icon="android" ng-if="loading"></ion-spinner>\n    <i class="gray icon ion-ios-arrow-right"></i>\n  </a>\n</ng-if>\n\n'),e.put("plugins/graph/templates/network/view_peer_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}{{id}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="no-padding">\n\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <div class="list" ng-if="!loading">\n\n      \x3c!--  - - - - TX divider - - - - --\x3e\n      <div class="item item-divider hidden-xs hidden-sm" translate>\n        GRAPH.BLOCKCHAIN.TX_DIVIDER\n      </div>\n\n      <div class="item no-padding-xs"\n           ng-include="\'plugins/graph/templates/blockchain/graph_tx_count.html\'"\n           ng-init="setSize(350, 1000)">\n      </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/synchro/graph.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="synchro-chart-{{chart.id}}"\n          class="chart-bar"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="chart.data"\n          chart-labels="labels"\n          chart-dataset-override="chart.datasetOverride"\n          chart-options="chart.options">\n  </canvas>\n\n  <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/synchro/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.SYNCHRO.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="padding" >\n\n    <div class="list" >\n\n      <div class="center padding" ng-if="loading">\n        <ion-spinner icon="android"></ion-spinner>\n      </div>\n\n      <div class="item no-padding-xs" ng-if="!loading"\n           ng-repeat="chart in charts"\n           ng-include="\'plugins/graph/templates/synchro/graph.html\'"\n           ng-init="setSize(250, 1000)">\n      </div>\n\n    </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/message/tabs/tab_list.html",'<ion-view><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear icon ion-android-more-vertical" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()"></ion-refresher><cs-extension-point name="buttons"></cs-extension-point><ng-include src="\'plugins/es/templates/message/list.html\'"></ng-include></ion-content><div class="visible-xs visible-sm"><button ng-if="fabButtonNewMessageId" id="{{::fabButtonNewMessageId}}" class="button button-fab button-fab-bottom-right button-assertive spin has-footer" ng-click="showNewMessageModal()"><i class="icon ion-compose"></i></button></div></ion-view>'),e.put("plugins/es/templates/registry/tabs/tab_registry.html",'<ion-view><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear" ng-click="showFiltersPopover($event)"><i class="icon ion-android-funnel"></i></button> <button class="button button-icon button-clear icon ion-android-more-vertical" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doSearch()"></ion-refresher><cs-extension-point name="buttons"></cs-extension-point><ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include><ng-include src="::\'plugins/es/templates/registry/lookup_list.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/graph/templates/currency/tabs/tab_blocks_stats.html",'<ion-view>\n  <ion-content>\n    <div\n       ng-include="\'plugins/graph/templates/blockchain/graph_tx_count.html\'"\n       ng-controller="GpBlockchainTxCountCtrl"\n       ng-init="setSize(500,700,false)">\n      </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_network_stats.html",'<ion-view>\n  <ion-content>\n\n    <div class="list">\n      <div class="item"\n         ng-include="\'plugins/graph/templates/blockchain/graph_block_issuers.html\'"\n         ng-controller="GpBlockchainIssuersCtrl"\n           ng-init="setSize(500,700,true)">\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_parameters_stats.html",'<ion-view>\n  <ion-content>\n    <div class="list no-padding-xs no-padding-sm">\n\n      <ng-container ng-controller="GpCurrencyMonetaryMassCtrl">\n\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        \x3c!-- Monetary mass --\x3e\n        <div class="item"\n             ng-include="\'plugins/graph/templates/currency/graph_monetary_mass.html\'"\n             ng-init="setSize(500,700,true)">\n        </div>\n      </ng-container>\n\n      \x3c!-- DU --\x3e\n      <ng-container ng-controller="GpCurrencyDUCtrl">\n        <div class="item"\n             ng-include="\'plugins/graph/templates/currency/graph_du.html\'"\n             ng-init="setSize(500,700,true)">\n        </div>\n      </ng-container>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_wot_stats.html",'<ion-view>\n  <ion-content>\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <div class="list no-padding">\n      <div class="item no-padding-top"\n           ng-include="\'plugins/graph/templates/currency/graph_members_count.html\'"\n           ng-init="setSize(600,700,false)">\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n')}]),angular.module("cesium.es.plugin",["cesium.es.services","cesium.es.app.controllers","cesium.es.common.controllers","cesium.es.settings.controllers","cesium.es.currency.controllers","cesium.es.wot.controllers","cesium.es.wallet.controllers","cesium.es.profile.controllers","cesium.es.message.controllers","cesium.es.notification.controllers","cesium.es.blockchain.controllers","cesium.es.network.controllers","cesium.es.registry.controllers","cesium.es.group.controllers","cesium.es.invitation.controllers","cesium.es.subscription.controllers","cesium.es.document.controllers"]),angular.module("cesium.es.services",["cesium.es.http.services","cesium.es.comment.services","cesium.es.social.services","cesium.es.settings.services","cesium.es.crypto.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.message.services","cesium.es.modal.services","cesium.es.blockchain.services","cesium.es.registry.services","cesium.es.group.services","cesium.es.wallet.services","cesium.es.invitation.services","cesium.es.subscription.services","cesium.es.wot.services","cesium.es.tx.services","cesium.es.geo.services","cesium.es.document.services"]),angular.module("cesium.es.comment.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.profile.services"]).factory("esComment",["$rootScope","$q","UIUtils","BMA","esHttp","csWallet","csWot",function(e,t,n,i,a,o,r){"ngInject";function s(n){var i={commons:["issuer","creationTime","time","message","reply_to"]},s={index:n,fields:{commons:i.commons},raw:{search:a.post("/"+n+"/comment/_search"),remove:a.record.remove(n,"comment"),wsChanges:a.ws("/ws/_changes"),add:new a.record.post("/"+n+"/comment",{creationTime:!0}),update:new a.record.post("/"+n+"/comment/:id/_update",{creationTime:!0})}};return s.raw.refreshTreeLinks=function(e){return s.raw.addTreeLinks(e,!0)},s.raw.addTreeLinks=function(e,n){e=e||{},e.result=e.result||[],e.mapById=e.mapById||{};var o={};if(_.forEach(_.values(e.mapById),function(t){if(t.reply_to&&!t.parent){var i=e.mapById[t.reply_to];i||(i=new Comment(t.reply_to),o[i.id]=t.id,e.mapById[i.id]=i),n&&i.containsReply(t)||i.addReply(t)}}),!_.size(o)){var r=t.defer();return r.resolve(e),r.promise}var l={query:{terms:{_id:_.keys(o)}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:0,size:1e3,_source:i.commons};return console.debug("[ES] [comment] Getting missing comments in tree"),s.raw.search(l).then(function(t){return t.hits.total?(_.forEach(t.hits.hits,function(t){var n=e.mapById[t._id];n.copyFromJson(t._source),n.html=a.util.parseAsHtml(n.message),delete o[n.id]}),_.size(o)&&console.error("Comments has invalid [reply_to]: "+_.values(o).join(",")),s.raw.addTreeLinks(e)):(console.error("[ES] [comment] Comments has invalid [reply_to]: "+_.values(o).join(",")),e)})},s.raw.loadDataByRecordId=function(e,t){t=t||{},t.from=t.from||0,t.size=t.size||20,t.loadAvatar=!angular.isDefined(t.loadAvatar)||t.loadAvatar,t.loadAvatarAllParent=!!angular.isDefined(t.loadAvatarAllParent)&&(t.loadAvatar&&t.loadAvatarAllParent),t.size<0&&(t.size=20);var n={query:{term:{record:e}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:t.from,size:t.size,_source:i.commons},o={total:0,mapById:{},result:[],pendings:{}};return s.raw.search(n).then(function(e){return e.hits.total?(o.total=e.hits.total,o.result=e.hits.hits.reduce(function(e,t){var n=new Comment(t._id,t._source);return n.html=a.util.parseAsHtml(n.message),o.mapById[n.id]=n,e.concat(n)},o.result),s.raw.addTreeLinks(o)):o}).then(function(){if(t.loadAvatar)return t.loadAvatarAllParent?r.extendAll(_.values(o.mapById),"issuer"):r.extendAll(o.result,"issuer")}).then(function(){return o.result=o.result.sort(function(e,t){return e.creationTime-t.creationTime}),o})},s.raw.createOnDeleteListener=function(e){return function(n){var i=_.findIndex(e.result,{id:n.id});if(-1!==i){e.result.splice(i,1),delete e.mapById[n.id];return(o.isUserPubkey(n.issuer)?o:o.children.getByPubkey(n.issuer))?s.raw.remove(n.id).catch(function(e){throw console.error(e),new Error("COMMENTS.ERROR.FAILED_REMOVE_COMMENT")}):t.reject("No wallet found corresponding to the comment issuer")}}},s.raw.startListenChanges=function(t,i,l){i=i||{},i.result=i.result||[],i.mapById=i.mapById||{},i.pendings=i.pendings||{},l=l||e;var c=s.raw.createOnDeleteListener(i);_.forEach(i.result,function(e){e.addOnRemoveListener(c)});var u=Date.now();console.info("[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]".format(n,t.substr(0,8)));var d=s.raw.wsChanges();return d.open().then(function(e){return e.send(n+"/comment")}).then(function(){console.debug("[ES] [comment] Websocket opened in {0} ms".format(Date.now()-u)),d.on(function(e){e&&l.$applyAsync(function(){var n=i.mapById[e._id];"DELETE"===e._operation?n&&n.remove():e._source&&e._source.record===t&&(n?(n.copyFromJson(e._source),n.html=a.util.parseAsHtml(n.message),s.raw.refreshTreeLinks(i)):i.pendings&&i.pendings[e._source.creationTime]||e._source.issuer==o.data.pubkey?console.debug("Skip comment received by WS (already in pending)"):(n=new Comment(e._id,e._source),n.addOnRemoveListener(c),n.isnew=!0,n.html=a.util.parseAsHtml(n.message),i.mapById[e._id]=n,s.raw.refreshTreeLinks(i).then(function(){return r.extend(n,"issuer")}).then(function(){i.result.push(n)})))})})})},s.raw.save=function(e,t,n){t=t||{},t.result=t.result||[],t.mapById=t.mapById||{},t.pendings=t.pendings||{};var i=n.id,r={creationTime:i?n.creationTime||n.time:moment().utc().unix(),message:n.message,record:e,issuer:o.data.pubkey};n.reply_to||n.parent?r.reply_to=n.reply_to||n.parent.id:r.reply_to=null;var l;return i?(l=t.mapById[i],l.copy(n)):(l=new Comment(null,r),l.addOnRemoveListener(s.raw.createOnDeleteListener(t)),l.uid=o.data.uid,l.name=o.data.name,l.avatar=o.data.avatar,l.isnew=!0,n.parent&&n.parent.addReply(l),t.result.push(l)),l.html=a.util.parseAsHtml(l.message),i?s.raw.update(r,{id:i}).then(function(){return l}):(t.pendings=t.pendings||{},t.pendings[r.creationTime]=r,s.raw.add(r).then(function(e){return l.id=e,t.mapById[e]=l,delete t.pendings[r.creationTime],l}))},s.raw.stopListenChanges=function(e){console.debug("[ES] [comment] Stopping websocket on comments"),_.forEach(e.result,function(e){e.cleanAllListeners()}),s.raw.wsChanges().close()},s.load=s.raw.loadDataByRecordId,s.save=s.raw.save,s.changes={start:s.raw.startListenChanges,stop:s.raw.stopListenChanges},s}return{instance:s}}]),angular.module("cesium.es.http.services",["ngResource","ngApi","cesium.services","cesium.config"]).factory("esHttp",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csHttp","csConfig","csSettings","csCache","BMA","csWallet","csPlatform","Api",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,f){"ngInject";function T(i,a,r,T){function I(e,t,n,i){!e&&p.data&&(e=e||(p.data.plugins&&p.data.plugins.es?p.data.plugins.es.host:null),t=t||(e?p.data.plugins.es.port:null),n=angular.isDefined(n)?n:443==t||p.data.plugins.es.useSsl||h),K.alive=!1,K.host=e,K.port=t||(n||h?443:80),K.useSsl=angular.isDefined(n)?n:443==K.port||h,K.server=u.getServer(e,t)}function v(e){if(e=e||p.data,!e.plugins||!e.plugins.es)return!1;var t=e.plugins.es.host,n=443==e.plugins.es.port||e.plugins.es.useSsl||h;return N(t,e.plugins.es.port||(n?443:80),n)}function N(e,t,n){return K.host==e&&K.port==t&&(angular.isUndefined(n)||n==K.useSsl)}function O(){return K.data.isFallback}function R(e){K.data.isFallback=e}function A(e){return new RegExp("^"+e+"$")}function S(e){return new RegExp(e)}function C(){return{getByPath:{},postByPath:{},wsByPath:{}}}function L(t,n){return n=n||e.defer(),K.data.isFallback&&K.started&&K.stop(),K.data.isFallback=!1,j=null,n.resolve(t),n.promise}function D(e,t){t=t||"#";for(var n="@"===t?q.USER_TAG:q.HASH_TAG,i=e&&n.exec(e),a=i&&[];i;){var o=i[1];_.contains(a,o)||a.push(o),e=e.substr(i.index+i[1].length+1),i=e.length>0&&n.exec(e)}return a}function y(e){for(var t=e&&q.URL.exec(e),n=t&&[];t;){var i=t[0];_.contains(n,i)||n.push(i),e=e.substr(t.index+t[0].length+1),t=e&&q.URL.exec(e)}return n}function P(e){return e?e.replace(/</g,"&lt;").replace(/>/g,"&gt;"):e}function k(e,t){var n=e?P(e.trim()):void 0;if(n){t=t||{},t.tagState=t.tagState||"app.wot_lookup.tab_search",t.uidState=t.uidState||"app.wot_identity_uid",!t.newLine&&angular.isDefined(t.newLine)||(n=n.replace(/\n/g,"<br>\n"));var i=y(n);_.forEach(i,function(e){var t=e.startsWith("http://")||e.startsWith("https://")?e:"http://"+e,i='<a on-tap="openLink($event, \'{0}\')" href="{1}" target="_blank">{2}</a>'.format(t,t,Q(e));n=n.replace(e,i)});var a=D(n);_.forEach(a,function(e){var i="<a ui-sref=\"{0}({hash: '{1}'})\">#{2}</a>".format(t.tagState,e,e);n=n.replace("#"+e,i)});var o=D(n,"@");_.forEach(o,function(e){var i="<a ui-sref=\"{0}({uid: '{1}'})\">@{2}</a>".format(t.uidState,e,e);n=n.replace("@"+e,i)})}return n}function M(e,t){t=t||["title","description"],e.tags=t.reduce(function(t,n){var i=e[n],a=i&&D(i);return a?t.concat(a):t},[])}function w(e,t){if(e)return e[t]?e[t]:Array.isArray(e)?e.reduce(function(e,n){return e||w(n,t)},!1):"object"==typeof e?_.reduce(_.keys(e),function(n,i){return n||w(e[i],t)},!1):void 0}function U(t,n){n=n||{};var i=K.post(t);return function(t,n){n=n||{};var a=n.wallet||n.walletId&&b.children.get(n.walletId)||(!n.pubkey||b.isUserPubkey(n.pubkey))&&b||n.pubkey&&b.children.getByPubkey(n.pubkey),o=n.keypair||a&&a.data&&a.data.keypair;if(!o&&!a)throw new Error("Missing wallet or keypair, to sign record");delete n.wallet,delete n.walletId,delete n.keypair;var r=angular.copy(n);return r.pubkey=r.pubkey||a.data.pubkey,(a.isAuth()?e.when(a.data):a.auth({silent:!0,minData:!0})).then(function(){n.creationTime&&!t.creationTime&&(t.creationTime=moment().utc().unix());var e=moment().utc().unix();t.time=!t.time||t.time<e?e:t.time+1;var a=angular.copy(t);delete a.signature,delete a.hash,a.issuer=r.pubkey,a.version||(a.version=2),n.tagFields&&M(a,n.tagFields);var s=JSON.stringify(a);return l.util.hash(s).then(function(e){return l.sign(e,o).then(function(t){return s='{"hash":"{0}","signature":"{1}",'.format(e,t)+s.substring(1),i(s,r).then(function(e){return m.clear(z),e}).catch(function(e){var t=K.byteCount(a);if(t>$.MAX_UPLOAD_BODY_SIZE)throw{message:"ERROR.ES_MAX_UPLOAD_BODY_SIZE",length:t};throw e})})})})}}function B(t,n){return function(i,a){a=a||{};var o=a.wallet||a.walletId&&b.children.get(a.walletId)||b;return(o.isAuth()?e.when(o.data):o.auth({silent:!0,minData:!0})).then(function(e){var a={version:2,index:t,type:n,id:i,issuer:e.pubkey,time:moment().utc().unix()},o=JSON.stringify(a);return l.util.hash(o).then(function(t){return l.sign(t,e.keypair).then(function(e){return o='{"hash":"{0}","signature":"{1}",'.format(t,e)+o.substring(1),K.post("/history/delete")(o).then(function(e){return e})})})})}}function x(e){if(!e||!e._content_type||!e._content||0===e._content.length)return null;var t={src:"data:"+e._content_type+";base64,"+e._content};return e._title&&(t.title=e._title),e._name&&(t.name=e._name),t}function F(e){if(!e||!e.src)return null;var t=q.IMAGE_SRC.exec(e.src);if(!t)return null;var n={_content_type:t[1],_content:t[2]};return e.title&&(n._title=e.title),e.name&&(n._name=e.name),n}function H(e){var t=q.ES_USER_API_ENDPOINT.exec(e);if(t){var n=t[8]||80;return{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:n,useSsl:80!=n&&443==n}}}function W(){return{_id:null,_index:null,_type:null,_version:null,_source:{}}}function V(){Y=[p.api.data.on.reset(n,L,K)]}function G(){_.forEach(Y,function(e){e()}),Y=[]}var Y,j,K=this,z="esHttp-",$={ES_USER_API_ENDPOINT:"ES_USER_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))",MAX_UPLOAD_BODY_SIZE:d.plugins&&d.plugins.es&&d.plugins.es.maxUploadBodySize||2097152},q={IMAGE_SRC:A("data:([A-Za-z//]+);base64,(.+)"),URL:S("(www\\.|https?://(www\\.)?)[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)"),HASH_TAG:S("(?:^|[\t\n\rs ])#([\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)"),USER_TAG:S("(?:^|[\t\n\rs ])@("+E.constants.regexp.USER_ID+")"),ES_USER_API_ENDPOINT:A($.ES_USER_API_ENDPOINT)},X=0,Q=s("truncUrl");K.data={isFallback:!1},K.cache=C(),K.api=new f(this,"esHttp"),K.started=!1,K.init=I,I(i,a,r,T),K.useCache=!!angular.isDefined(T)&&T,K.cleanCache=function(){console.debug("[ES] [http] Cleaning requests cache..."),_.keys(K.cache.wsByPath).forEach(function(e){K.cache.wsByPath[e].close()}),K.cache=C(),m.clear(z)},K.copy=function(e){return K.started&&K.stop(),K.init(e.host,e.port,e.useSsl||443==e.port),K.data.isTemporary=!1,K.start(!0)},K.byteCount=function(e){return e="string"==typeof e?e:JSON.stringify(e),encodeURI(e).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1},K.getUrl=function(e){return u.getUrl(K.host,K.port,e,K.useSsl)},K.get=function(t,n){n=K.useCache&&n;var i=t+(n?"#"+n:""),a=function(o){if(!K.started)return K._startPromise||console.error("[ES] [http] Trying to get [{0}] before start(). Waiting...".format(t)),K.ready().then(function(t){return t?a(o):e.reject("ERROR.ES_CONNECTION_ERROR")});var r=K.cache.getByPath[i];return r||(r=n?u.getWithCache(K.host,K.port,t,K.useSsl,n,null,null,z):u.get(K.host,K.port,t,K.useSsl),K.cache.getByPath[i]=r),r(o)};return a},K.post=function(t){var n=function(i,a){if(!K.started)return K._startPromise||console.error("[ES] [http] Trying to post [{0}] before start()...".format(t)),K.ready().then(function(t){return t?n(i,a):e.reject("ERROR.ES_CONNECTION_ERROR")});var o=K.cache.postByPath[t];return o||(o=u.post(K.host,K.port,t,K.useSsl),K.cache.postByPath[t]=o),o(i,a)};return n},K.ws=function(e){return function(){var t=K.cache.wsByPath[e];return t||(t=u.ws(K.host,K.port,e,K.useSsl),K.cache.wsByPath[e]=t),t}},K.isAlive=function(){return u.get(K.host,K.port,"/node/summary",K.useSsl)().then(function(e){var t=e&&e.duniter&&e.duniter.software||"unknown";return"cesium-plus-pod"===t||"duniter4j-elasticsearch"===t||(console.error("[ES] [http] Not a Cesium+ Pod, but a {0} node. Please check '/node/summary'".format(t)),!1)}).catch(function(){return!1})},K.checkNodeAlive=function(e){if(e)return R(!v()),!0;if(angular.isUndefined(e))return K.isAlive().then(K.checkNodeAlive);var t=p.data.plugins&&p.data.plugins.es||{};j=j||{host:t.host,port:t.port};var n=t.fallbackNodes&&X<t.fallbackNodes.length&&t.fallbackNodes[X++];if(!n)return o("ERROR.ES_CONNECTION_ERROR",{server:K.server}).then(c.alert.info),!1;var i=u.getServer(n.host,n.port);return c.loading.hide(),o("CONFIRM.ES_USE_FALLBACK_NODE",{old:K.server,new:i}).then(c.alert.confirm).then(function(e){return!!e&&(K.cleanCache(),K.init(n.host,n.port,n.useSsl||443==n.port),K.isAlive().then(K.checkNodeAlive))})},K.isStarted=function(){return K.started},K.ready=function(){return K.started?e.when(!0):K._startPromise||K.start()},K.start=function(t){return K._startPromise?K._startPromise:K.started?e.when(K.alive):(K._startPromise=g.ready().then(function(){t||K.init()}).then(function(){console.debug("[ES] [http] Starting on [{0}]{1}...".format(K.server,K.useSsl?" (SSL on)":""));var e=Date.now();return K.checkNodeAlive().then(function(t){return K.alive=t,t?(V(),console.debug("[ES] [http] Started in "+(Date.now()-e)+"ms"),K.api.node.raise.start(),K.started=!0,delete K._startPromise,X=0,!0):(console.error("[ES] [http] Could not start [{0}]: node unreachable".format(K.server)),K.started=!0,delete K._startPromise,X=0,!1)})}),K._startPromise)},K.stop=function(){return console.debug("[ES] [http] Stopping..."),G(),R(!1),delete K._startPromise,K.alive?(K.cleanCache(),K.alive=!1,K.started=!1,K.api.node.raise.stop()):K.started=!1,e.when()},K.restart=function(){return K.stop(),t(K.start,200)},K.image={},K.image.fromHit=function(e,t){if(e&&e._source){var n=e._source[t];if(n&&n._content_type&&n._content_type.startsWith("image/")){var i={};if(n._content)i.src="data:"+n._content_type+";base64,"+n._content;else{var a=n._content_type.substr(6),o=[e._index,e._type,e._id,"_image",t].join("/");o="/"+o+"."+a,i.src=K.getUrl(o)}return n._title&&(i.title=n._title),n._name&&(i.name=n._name),i}}},K.api.registerEvent("node","start"),K.api.registerEvent("node","stop");var J={getServer:u.getServer,node:{summary:K.get("/node/summary"),parseEndPoint:H,same:N,sameAsSettings:v,isFallback:O},network:{peering:K.get("/network/peering"),peers:K.get("/network/peers")},record:{post:U,remove:B},image:{fromAttachment:x,toAttachment:F},hit:{empty:W},util:{parseTags:D,parseAsHtml:k,findObjectInTree:w},cache:u.cache,constants:$};J.constants.regexp=q,angular.merge(K,J)}var h=!!("true"===d.httpsMode||!0===d.httpsMode||"force"===d.httpsMode||r.location&&"https:"===r.location.protocol);h&&console.debug("[ES] [https] Enable SSL (forced by config or detected in URL)");var I=new T(void 0,void 0,void 0,!0);return I.instance=function(e,t,n,i){return new T(e,t,n,i)},I}]),angular.module("cesium.es.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esSettings")}]).factory("esSettings",["$rootScope","$q","$timeout","Api","esHttp","csConfig","csSettings","CryptoUtils","Device","UIUtils","csWallet",function(e,t,n,i,a,o,r,s,l,c,u){"ngInject";function d(e,t){var n={};return t.includes&&_.forEach(_.keys(t),function(e){"includes"!=e&&"excludes"!=e&&t.includes.push(e)}),_.forEach(_.keys(e),function(i){t.includes&&!_.contains(t.includes,i)||t.excludes&&_.contains(t.excludes,i)||(e[i]&&"object"==typeof e[i]&&t[i]&&"object"==typeof t[i]?n[i]=d(e[i],t[i]):n[i]=e[i])}),n}function p(e,t){var n=Date.now();return S.get({id:e
-}).catch(function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}).then(function(e){if(e&&e._source){var i=e._source;if(i.time===r.data.time)return void console.debug("[ES] [settings] Loaded in "+(Date.now()-n)+"ms, but already up to date");var a=s.util.decode_base58(i.nonce);return s.box.open(i.content,a,t.boxPk,t.boxSk).then(function(e){var t=JSON.parse(e||"{}");return t.time=i.time,console.debug("[ES] [settings] Loaded and decrypted in "+(Date.now()-n)+"ms"),t}).catch(function(e){return console.error("[ES] [settings] Could not load remote settings: "+(e&&e.message||"decryption error")),delete r.data.time,null})}})}function m(e,n){return n=n||t.defer(),angular.merge(e,A),D=!1,n.resolve(e),n.promise}function E(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair&&e.keypair.signSk&&e.keypair.boxSk?(console.debug("[ES] [settings] Loading user settings..."),p(e.pubkey,e.keypair).then(function(e){if(e)return angular.merge(r.data,e),N=e,console.debug("[ES] [settings] Applied"),g()}).then(function(){n.resolve(e)}).catch(function(e){n.reject(e)}),n.promise):(n.resolve(),n.promise)}function b(e){if(!L){var t=O&&O.length>0;!a.isStarted()||a.node.isFallback()||a.node.sameAsSettings(e)||I(),v();S.isEnable()&&u.isAuth()&&(t?f(e):E(u.data))}}function g(){return L?t.when():(L=!0,r.store().then(function(){L=!1}).catch(function(e){throw L=!1,e}))}function f(e){var n=d(e,R);if(N&&angular.equals(n,N))return t.when();if(!r.data.plugins.es.useRemoteStorage)return g();var i=moment().utc().unix();return console.debug("[ES] [settings] Saving user settings remotely..."),t.all([u.getKeypair(),s.util.random_nonce()]).then(function(t){var a=t[0],o=t[1];if(a.boxPk&&a.boxSk){var r={issuer:u.data.pubkey,nonce:s.util.encode_base58(o),time:i},l=JSON.stringify(n);return s.box.pack(l,o,a.boxPk,a.boxSk).then(function(t){return r.content=t,angular.isUndefined(e.time)?S.add(r):S.update(r,{id:r.issuer}).catch(function(e){if(e&&404==e.ucode)return S.add(r);throw e})}).then(function(){return!0})}}).then(function(t){if(t)return e.time=i,N=n,console.debug("[ES] [settings] Saved user settings remotely in "+(moment().utc().unix()-i)+"ms"),g()}).catch(function(e){throw console.error(e),e})}function T(){_.forEach(O,function(e){e()}),O=[]}function h(){O=[r.api.data.on.reset(e,m,this),u.api.data.on.auth(e,E,this)]}function I(){T(),a.stop()}function v(){var e=S.isEnable();return!e&&O&&O.length>0?(console.debug("[ES] [settings] Disable"),T(),a.stop().then(function(){C.state.raise.changed(e)})):!e||O&&0!==O.length&&a.isStarted()?void 0:a.start().then(function(t){return t?(console.debug("[ES] [settings] Enable"),h(),u.isAuth()?E(u.data).then(function(){C.state.raise.changed(e)}):void C.state.raise.changed(e)):(r.data.plugins.es.enable=!1,r.data.plugins.es.askEnable=!0,D=!0,C.state.raise.changed(!1),void console.error("[ES] [settings] Disable, has ES node could not be started"))})}var N,O,R={includes:["locale","showUDHistory","useRelative","useLocalStorage","useLocalStorageEncryption","expertMode","logoutIdle","blockValidityWindow"],excludes:["timeout","cacheTimeMs","version","build","minVersion","fallbackLanguage"],plugins:{es:{excludes:["enable","host","port","fallbackNodes","enableGoogleApi","googleApiKey"],notifications:{}}},wallet:{includes:["alertIfUnusedWallet"],excludes:["notificationReadTime"]},helptip:{excludes:["installDocUrl"]},notifications:{excludes:["time","warnCount","unreadCount"]}},A=angular.merge({plugins:{es:{askEnable:!1,useRemoteStorage:!0,notifications:{txSent:!0,txReceived:!0,certSent:!0,certReceived:!0,emitHtml5:!1},invitations:{readTime:!0},defaultCountry:void 0,enableGoogleApi:!1,googleApiKey:void 0,wot:{enableMixedSearch:!0},registry:{defaultSearch:{location:null,geoPoint:null}},geoDistance:"20km"}}},{plugins:{es:o.plugins&&o.plugins.es||{}}}),S=this,C=new i("esSettings"),L=!1,D=!1;return S.api=C,S.get=a.get("/user/settings/:id"),S.add=a.record.post("/user/settings"),S.update=a.record.post("/user/settings/:id/_update"),S.isEnable=function(){return r.data.plugins&&r.data.plugins.es&&r.data.plugins.es.enable&&!!r.data.plugins.es.host},S.notifications={},S.notifications.isEmitHtml5Enable=function(){return!!(S.isEnable()&&r.data.plugins.es.notifications&&angular.isDefined(r.data.plugins.es.notifications.emitHtml5))&&r.data.plugins.es.notifications.emitHtml5},S.wot={},S.wot.isMixedSearchEnable=function(){return S.isEnable()&&(!angular.isDefined(r.data.plugins.es.wot&&r.data.plugins.es.wot.enableMixedSearch)||r.data.plugins.es.wot.enableMixedSearch)},C.registerEvent("state","changed"),r.ready().then(function(){return r.api.data.on.changed(e,b,this),a.api.node.on.stop(e,function(){N=null},this),v()}).then(function(){if(!D&&o.plugins&&o.plugins.es&&o.plugins.es.askEnable&&!S.isEnable()&&r.data.plugins.es.askEnable)return c.alert.confirm("ES_SETTINGS.CONFIRM.ASK_ENABLE","ES_SETTINGS.CONFIRM.ASK_ENABLE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then(function(e){return e&&(r.data.plugins.es.enable=!0),r.data.plugins.es.askEnable=!1,r.store()})}),S}]),angular.module("cesium.es.registry.services",["ngResource","cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esRegistry")}]).factory("esRegistry",["$rootScope","$q","csPlatform","csSettings","csWallet","csWot","esHttp","esComment","esGeo",function(e,t,n,i,a,o,r,s,l){"ngInject";function c(e){e.pages=null}function u(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [registry] Loading pages count..."),v.raw.count({pubkey:e.pubkey}).then(function(t){e.pages=e.pages||{},e.pages.count=t&&t.hits&&t.hits.total,console.debug("[ES] [registry] Loaded pages count ("+e.pages.count+")"),n.resolve(e)}).catch(function(t){console.error("[ES] [registry] Error while counting page: "+(t.message?t.message:t)),n.resolve(e)}),n.promise):(n.resolve(),n.promise)}function d(){if(v.raw.categories&&v.raw.categories.length){var e=t.defer();return e.resolve(v.raw.categories),e.promise}return v.raw.category.all().then(function(e){if(0===e.hits.total)v.raw.categories=[];else{var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,e.concat(n)},[]);_.forEach(t,function(e){t[e.id]=e}),v.raw.categories=t}return v.raw.categories})}function p(e){return v.raw.category.get(e).then(function(e){var t=e._source;return t.id=e._id,t})}function m(e,t){if(e){var n=e._source;return n.category&&n.category.id&&(n.category=t[n.category.id]),e.highlight&&(e.highlight.title&&(n.title=e.highlight.title[0]),e.highlight.description&&(n.description=e.highlight.description[0]),e.highlight.location&&(n.location=e.highlight.location[0]),e.highlight.tags&&(n.tags=e.highlight.tags.reduce(function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))},[]))),n.avatar=r.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(n.pictures=e._source.pictures.reduce(function(e,t){return e.concat(r.image.fromAttachment(t.file))},[])),n}}function E(e){return e=e||{},e.from=e.from||0,e.size=e.size||20,e._source=e._source||I.commons,e.highlight=e.highlight||{fields:{title:{},description:{}}},t.all([d(),v.raw.search(e)]).then(function(t){var n=t[0];if(!(t=t[1])||!t.hits||!t.hits.total)return{total:0,hits:[]};var i=r.util.findObjectInTree(e.query,"geo_distance"),a=i&&i.geoPoint,o=i&&i.distance&&i.distance.replace(new RegExp("[0-9 ]+","gm"),""),s=t.hits.hits.reduce(function(e,t){var i=m(t,n);return i.id=t._id,a&&i.geoPoint&&o&&(i.distance=l.point.distance(a.lat,a.lon,i.geoPoint.lat,i.geoPoint.lon,o)),e.concat(i)},[]);return{total:t.hits.total,hits:s}})}function b(e,n){return n=n||{},n.raw=!!angular.isDefined(n.raw)&&n.raw,n.fecthPictures=angular.isDefined(n.fetchPictures)?n.fetchPictures:n.raw,t.all([d(),n.fecthPictures?v.raw.get({id:e}):v.raw.getCommons({id:e})]).then(function(e){var t=e[0],i=e[1],a=m(i,t);return n.raw||(a.description=r.util.parseAsHtml(a.description,{tagState:"app.wot_lookup.tab_registry"})),o.extend({pubkey:a.issuer}).then(function(e){return{id:i._id,issuer:e,record:a}})})}function g(){_.forEach(h,function(e){e()}),h=[]}function f(){h=[a.api.data.on.load(e,u,this),a.api.data.on.init(e,c,this),a.api.data.on.reset(e,c,this)]}function T(){var e=r.alive;if(!e&&h&&h.length>0){if(console.debug("[ES] [subscription] Disable"),g(),a.isLogin())return c(a.data)}else if(e&&(!h||0===h.length)&&(console.debug("[ES] [subscription] Enable"),f(),a.isLogin()))return u(a.data)}var h,I={commons:["title","description","issuer","time","address","city","creationTime","avatar._content_type","picturesCount","type","category","socials","pubkey","geoPoint"]},v=this;return v.raw={count:r.get("/page/record/_search?size=0&q=issuer::pubkey"),searchText:r.get("/page/record/_search?q=:search"),search:r.post("/page/record/_search"),get:r.get("/page/record/:id"),getCommons:r.get("/page/record/:id?_source="+I.commons.join(",")),category:{get:r.get("/page/category/:id"),all:r.get("/page/category/_search?sort=order&from=0&size=1000&_source=name,parent")}},n.ready().then(function(){return r.api.node.on.start(e,T,this),r.api.node.on.stop(e,T,this),T()}),v.category={all:d,get:p},v.record={search:E,load:b,add:r.record.post("/page/record",{tagFields:["title","description"],creationTime:!0}),update:r.record.post("/page/record/:id/_update",{tagFields:["title","description"]}),remove:r.record.remove("page","record"),fields:{commons:I.commons},picture:{all:r.get("/page/record/:id?_source=pictures")},comment:s.instance("page")},v.currency={all:r.get("/currency/record/_search?_source=currencyName,peers.host,peers.port"),get:r.get("/currency/record/:id/_source")},v}]),angular.module("cesium.es.social.services",["cesium.es.crypto.services"]).factory("SocialUtils",["$filter","$q","CryptoUtils","BMA","csWallet","esCrypto","$timeout",function(e,t,n,i,a,o,r){"ngInject";function s(){function s(e){return new RegExp("^"+e+"$")}function l(e){var t;if(E.URI.test(e)){var n=E.URI.exec(e)[1],i=e;if("http"==n||"https"==n){var a=e.indexOf("/",n.length+3);a>0&&(i=e.substring(0,a))}_.keys(E.socials).forEach(function(e){if(E.socials[e].test(i))return t=e,!1}),t||(t="web")}else E.EMAIL.test(e)?t="email":E.PHONE.test(e)&&(t="phone");return t||console.warn("[ES] [social] Unable to detect type of social URL: "+e),t}function c(e){if((e=e?e.trim():e)&&e.length>0)return e.startsWith("www.")&&(e="http://"+e),{type:l(e),url:e}}function u(t){if(!t||!t.length)return[];var n={};return t.forEach(function(t){if("curve25519"==t.type?(delete t.issuer,t.valid&&angular.merge(t,c(t.url))):t=c(t.url),t){var i=e("formatSlug")(t.url);n[i]=t}}),_.values(n)}function d(e,t){return{recipient:e,type:"curve25519",url:t}}function p(e,i,s){if(s=s||a.data.pubkey,!n.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),r(function(){return p(e,i,s)},100);var l=_.filter(e||[],function(e){var t=e.url&&"curve25519"==e.type&&E.socials.curve25519.exec(e.url);return!!t&&(e.recipient=t[1],e.nonce=t[2],e.url=t[3],e.issuer=i,e.valid=e.recipient===s,e.valid)});return l.length?o.box.open(l,void 0,"issuer","url").then(function(){return u(e)}):t.when(u(e))}function m(e){if(!n.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),r(function(){return m(e)},100);var i=_.filter(e||[],function(e){return"curve25519"==e.type&&e.url&&e.recipient});return i.length?n.util.random_nonce().then(function(e){return t.all(i.reduce(function(t,n){return t.concat(o.box.pack(n,void 0,"recipient","url",e))},[]))}).then(function(e){return e.reduce(function(e,t){return e.concat({type:"curve25519",url:"curve25519://{0}:{1}@{2}".format(t.recipient,t.nonce,t.url)})},[])}):t.when(e)}var E={URI:"([a-zA−Z0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",EMAIL:"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",PHONE:"[+]?[0-9. ]{9,15}",socials:{facebook:"https?://((fb.me)|((www.)?facebook.com))",twitter:"https?://(www.)?twitter.com",googleplus:"https?://plus.google.com(/u)?",youtube:"https?://(www.)?youtube.com",github:"https?://(www.)?github.com",tumblr:"https?://(www.)?tumblr.com",snapchat:"https?://(www.)?snapchat.com",linkedin:"https?://(www.)?linkedin.com",vimeo:"https?://(www.)?vimeo.com",instagram:"https?://(www.)?instagram.com",wordpress:"https?://([a-z]+)?wordpress.com",diaspora:"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org",duniter:"duniter://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",bitcoin:"bitcoin://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",curve25519:"curve25519://("+i.constants.regexp.PUBKEY+"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)"}};return E.URI=s(E.URI),E.EMAIL=s(E.EMAIL),E.PHONE=s(E.PHONE),_.keys(E.socials).forEach(function(e){E.socials[e]=s(E.socials[e])}),{get:c,reduce:u,createForEncryption:d,open:p,pack:m}}var l=s();return l.instance=s,l}]),angular.module("cesium.es.crypto.services",["ngResource","cesium.services"]).factory("esCrypto",["$q","$rootScope","CryptoUtils",function(e,t,n){"ngInject";function i(t){if(!t)throw new Error("Missing keypair");return t.boxPk&&t.boxSk?e.when(t):e.all([n.box.keypair.skFromSignSk(t.signSk),n.box.keypair.pkFromSignPk(t.signPk)]).then(function(e){return{boxSk:e[0],boxPk:e[1]}})}function a(t,a,o,r,s){if(o=o||"recipient",!t[o])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});r=r||"content","string"==typeof r&&(r=[r]),t=angular.copy(t);var l=n.util.decode_base58(t[o]);return e.all([i(a),n.box.keypair.pkFromSignPk(l),s?e.when(s):n.util.random_nonce()]).then(function(i){var a=i[0],o=a.boxSk,s=i[1],l=i[2];return e.all(r.reduce(function(e,i){return t[i]?e.concat(n.box.pack(t[i],l,s,o)):e},[])).then(function(e){var i=0;return _.forEach(r,function(n){t[n]?t[n]=e[i++]:t[n]=null}),t.nonce=n.util.encode_base58(l),t})})}function o(t,a,o,r){o=o||"issuer","string"==typeof(r=r||"content")&&(r=[r]);var s=Date.now(),l={},c=[i(a)];return e.all(t.reduce(function(e,t){var i=t[o];if(!i)throw"Record has no "+o;return l[i]?res:e.concat(n.box.keypair.pkFromSignPk(n.util.decode_base58(i)).then(function(e){l[i]=e}))},c)).then(function(i){var a=i[0];return e.all(t.reduce(function(e,t){var i=l[t[o]],s=n.util.decode_base58(t.nonce);return t.valid=!0,e.concat(r.reduce(function(e,o){return t[o]?e.concat(n.box.open(t[o],s,i,a.boxSk).then(function(e){t[o]=e}).catch(function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+o),t.valid=!1})):e},[]))},[]))}).then(function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-s)+"ms"),t})}return{box:{getKeypair:i,pack:a,open:o}}}]),angular.module("cesium.es.profile.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esProfile")}]).factory("esProfile",["$rootScope","$q","esHttp","SocialUtils","csWot","csWallet","csPlatform","esSettings",function(e,t,n,i,a,o,r,s){"ngInject";function l(e){return T.raw.getFields({id:e,fields:"title,avatar._content_type"}).then(function(e){var t;return e&&e._source&&(t={name:e._source.title},t.avatar=n.image.fromHit(e,"avatar")),t}).catch(function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e})}function c(e,t){return t=t||{},(t.raw?T.raw.getAll:T.raw.get)({id:e}).then(function(a){if(a&&a.found&&a._source){var r={name:a._source.title,source:a._source};return r.name&&r.name.length>30&&(r.name=r.name.substr(0,27)+"..."),r.avatar=n.image.fromHit(a,"avatar"),t.raw||(r.description=n.util.parseAsHtml(r.source.description)),r.source.socials&&r.source.socials.length&&(r.source.socials=_.uniq(r.source.socials,!1,function(e){return e.url})),o.isLogin()?i.open(r.source.socials,e).then(function(){return r}):(r.source.socials=_.filter(r.source.socials,function(e){return"curve25519"!=e.type}),r)}}).catch(function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e})}function u(e,t){return p(null,e,t)}function d(e,t,i){e.avatar=e.avatar||n.image.fromHit(t,i||"avatar"),e.name=t._source.title,e.name&&e.name.length>30&&(e.name=e.name.substr(0,27)+"..."),e.description=t._source.description||e.description,e.city=t._source.city||e.city,t.highlight&&(t.highlight.title&&(e.name=t.highlight.title[0]),t.highlight.tags&&(e.tags=t.highlight.tags.reduce(function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))},[])))}function p(e,i,a,o){if(o=o||t.defer(),!(e||i&&i.length))return o.resolve(i),o.promise;a=a||"pubkey",e=e?e.toLowerCase().trim():e;var r,l=e?n.util.parseTags(e):void 0,c={query:{},highlight:{fields:{title:{},tags:{}}},from:0,size:100,_source:["title","avatar._content_type"]},u=e&&s.wot.isMixedSearchEnable();if(u&&(c._source=c._source.concat(["description","city","creationTime","membersCount","type"]),console.debug("[ES] [profile] Mixed search: enable")),i.length>0){r={},_.forEach(i,function(e){var t=e[a];if(t){var n=r[t];n?n.push(e):(n=[e],r[t]=n)}});var p=_.keys(r);c.size=p.length<=c.size?c.size:p.length,e?(c.query.bool={should:[{terms:{"_id^4":p}},{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},l&&c.query.bool.should.push({terms:{tags:l}})):(delete c.highlight,c.query.constant_score={filter:{terms:{_id:p}}})}else{if(!e)return o.resolve(i),o.promise;c.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},l&&c.query.bool.should.push({terms:{tags:l}})}e&&u&&(c.indices_boost={user:100,page:1,group:.01});var m;return(u?T.raw.mixedSearch:T.raw.search)(c).then(function(e){if(m=e.hits,m.total>0){var t,s={};_.forEach(m.hits,function(e){var o="avatar";if("user"==e._index){if(!(t=r&&r[e._id])){var l={};l[a]=e._id,t=[l],i.push(l)}}else if("user"!=e._index){s[e._index]||(s[e._index]=!0,i.push({id:"divider-"+e._index,divider:!0,index:e._index}));var c={id:e._index+"-"+e._id,index:e._index,templateUrl:"plugins/es/templates/wot/lookup_item_{0}.html".format(e._index),state:"app.view_{0}".format(e._index),stateParams:{id:e._id,title:e._source.title},creationTime:e._source.creationTime,memberCount:e._source.memberCount,type:e._source.type};t=[c],i.push(c),o="avatar"}var u=n.image.fromHit(e,o);_.forEach(t,function(t){t.avatar=u,d(t,e)})}),_.keys(s).length&&i.splice(0,0,{id:"divider-identities",divider:!0,index:"profile"})}o.resolve(i)}).catch(function(e){e&&e.ucode&&404==e.ucode?o.resolve(i):o.reject(e)}),o.promise}function m(e,n){return n=n||t.defer(),e&&e.pubkey?(t.all([c(e.pubkey).then(function(t){t&&(e.name=t.name,e.avatar=t.avatar,e.profile=t.source,e.profile.description=t.description),n.resolve(e)}),u((e.received_cert||[]).concat(e.received_cert_pending||[]).concat(e.given_cert||[]).concat(e.given_cert_pending||[]))]).catch(function(e){n.reject(e)}),n.promise):(n.resolve(),n.promise)}function E(){_.forEach(f,function(e){e()}),f=[]}function b(){f=[a.api.data.on.load(e,m,this),a.api.data.on.search(e,p,this)]}function g(){var e=n.alive;!e&&f&&f.length>0?(console.debug("[ES] [profile] Disable"),E()):!e||f&&0!==f.length||(console.debug("[ES] [profile] Enable"),b())}var f,T=this;return T.raw={getFields:n.get("/user/profile/:id?&_source_exclude=avatar._content&_source=:fields"),get:n.get("/user/profile/:id?&_source_exclude=avatar._content",n.cache.MEDIUM),getAll:n.get("/user/profile/:id",n.cache.MEDIUM),search:n.post("/user/profile/_search",n.cache.MEDIUM),mixedSearch:n.post("/user,page,group/profile,record/_search",n.cache.MEDIUM)},r.ready().then(function(){return n.api.node.on.start(e,g,this),n.api.node.on.stop(e,g,this),g()}),{getAvatarAndName:l,get:c,add:n.record.post("/user/profile",{tagFields:["title","description"]}),update:n.record.post("/user/profile/:id/_update",{tagFields:["title","description"]}),avatar:n.get("/user/profile/:id?_source=avatar"),fillAvatars:u,remove:n.record.remove("user","profile")}}]),angular.module("cesium.es.notification.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esNotification")}]).factory("esNotification",["$rootScope","$q","$timeout","$translate","$state","csHttp","csConfig","csSettings","esHttp","esSettings","csWallet","csWot","UIUtils","filterTranslations","BMA","CryptoUtils","csPlatform","Api",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,f){"ngInject";function T(e,t){t=t||{},t.codes=t.codes||{},t.codes.excludes=t.codes.excludes||x.EXCLUDED_CODES;var n={bool:{must:[{term:{recipient:e}}]}};if(t.codes&&t.codes.includes)n.bool.must.push({terms:{code:t.codes.includes}});else{var i=[];s.getByPath("plugins.es.notifications.txSent",!1)||i.push("TX_SENT"),s.getByPath("plugins.es.notifications.txReceived",!0)||i.push("TX_RECEIVED"),s.getByPath("plugins.es.notifications.certSent",!1)||i.push("CERT_SENT"),s.getByPath("plugins.es.notifications.certReceived",!0)||i.push("CERT_RECEIVED"),t.codes.excludes&&_.forEach(t.codes.excludes,function(e){i.push(e)}),i.length&&(n.bool.must_not={terms:{code:i}})}return t.readTime&&n.bool.must.push({range:{time:{gt:t.readTime}}}),n}function h(e,n){if(!e)return t.reject("[ES] [notification] Unable to load - missing pubkey");var i={query:T(e,n)};return i.query.bool.must.push({missing:{field:"read_signature"}}),H.raw.postCount(i).then(function(e){return e.count})}function I(e){e=e||{};var t=e.wallet||u;return new Promise(function(e){if(!t.data||!t.data.events||!t.data.events.length)return e([]);var n=o.date.now()-m.MEDIAN_TIME_OFFSET;e((t.data.events||[]).reduce(function(e,i){if("warn"!=i.type&&"error"!=i.type)return e;var a=new EsNotification({},function(e){e.read||(e.read=!0,t.data.notifications&&t.data.notifications.warnCount>0&&t.data.notifications.warnCount--)});return a.id=i.code,a.read=!1,a.state="app.view_wallet",a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled assertive",a.time=n,a.message=i.message,a.messageParams=i.messageParams,e.concat(a)},[]))})}function v(e){if(e=e||{},!e.pubkey)return t.reject("[ES] [notification] Unable to load - missing options.pubkey");e.from=e.from||0,e.size=e.size||x.DEFAULT_LOAD_SIZE;var n={query:T(e.pubkey,e),sort:[{time:{order:"desc"}}],from:e.from,size:e.size,_source:F.commons};return t.all([I(e),H.raw.postSearch(n)]).then(function(e){var t=e[0]||[];if(e=e[1],!e.hits||!e.hits.total)return t;var n=e.hits.hits.reduce(function(e,t){var n=new EsNotification(t._source,C);return n.id=t._id,e.concat(n)},t);return d.extendAll(n)})}function N(t){if(t&&u.isLogin()){if(_.contains(x.INVITATION_CODES,t.code))return void W.event.raise.newInvitation(t);if(_.contains(x.MESSAGE_CODES,t.code))return void W.event.raise.newMessage(t);var n=new EsNotification(t,C);return d.extendAll([n]).then(function(){e.$$phase?O(n):e.$applyAsync(function(){O(n)})}).then(function(){if(c.notifications.isEmitHtml5Enable())return A(n)})}}function O(e){return u.data.notifications=u.data.notifications||{},u.data.notifications.unreadCount++,W.data.raise.new(e),e}function R(e){return e?String(e).replace(/<[^>]*>/gm,"").replace(/&[^;]+;/gm,""):""}function A(n,o){t.all([i(o||"COMMON.NOTIFICATION.TITLE"),i(n.message,n)]).then(function(t){S(R(t[0]),{body:R(t[1]),icon:n.avatar&&n.avatar.src||"./img/logo.png",lang:i.use(),tag:n.id,onclick:function(){e.$applyAsync(function(){"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&a.go(n.state,n.stateParams)})}})})}function S(e,t){if("Notification"in window)if("granted"===Notification.permission){var n=new Notification(e,t);n.onclick=t.onclick||n.onclick}else"denied"!==Notification.permission&&Notification.requestPermission(function(n){"granted"===n&&S(e,t)})}function C(e){if(!e.read&&e.id){if(!e.id)return void console.error("[ES] [notification] Could not mark as read: no 'id' found!",e);if(u.isAuth())return e.read=!0,u.getKeypair().then(function(t){return b.sign(e.hash,t).then(function(t){return H.raw.postReadById(t,{id:e.id})}).catch(function(e){console.error("[ES] [notification] Error while trying to mark event as read.",e)})})}}function L(e){e.notifications=e.notifications||{},e.notifications.unreadCount=null,e.notifications.warnCount=null,e.notifications.time=null,B&&(console.debug("[ES] [notification] Closing websocket..."),B(),B=null)}function D(e,i){if(i=i||t.defer(),!e||!e.pubkey||!e.keypair)return i.resolve(),i.promise;var a=Date.now(),o=Math.trunc(a/1e3);if(e.notifications&&e.notifications.time&&o-e.notifications.time<30)return e.notifications.warnCount=P(e),console.debug("[ES] [notification] Skipping load (loaded "+(o-e.notifications.time)+"s ago)"),i.resolve(),i.promise;var r=u.isUserPubkey(e.pubkey);return console.debug("[ES] [notification] Loading count..."+e.pubkey.substr(0,8)),h(e.pubkey,{readTime:e.notifications&&e.notifications.time||0,excludeCodes:x.EXCLUDED_CODES}).then(function(t){e.notifications=e.notifications||{},e.notifications.unreadCount=t,e.notifications.warnCount=P(e),t>0&&c.notifications.isEmitHtml5Enable()&&r&&n(function(){A({message:"COMMON.NOTIFICATION.HAS_UNREAD",count:t,state:"app.view_notifications"},e.ui||e.name||e.pubkey&&e.pubkey.substr(0,8))},500),console.debug("[ES] [notification] Loaded count ("+t+") in "+(Date.now()-a)+"ms"),i.resolve(e)}).catch(i.reject),i.promise}function y(e,t){return D(e,t).then(function(){console.debug("[ES] [notification] Starting listen user event...");var t=H.raw.ws.getUserEvent();t.on(N,{pubkey:e.pubkey,locale:s.data.locale.id}).catch(function(e){console.error("[ES] [notification] Unable to listen user event",e),p.alert.error("ACCOUNT.ERROR.WS_CONNECTION_FAILED")}),B=function(){t.close()}})}function P(e){return e.events?e.events.reduce(function(e,t){return"warn"==t.type?e+1:e},0):0}function k(){U=[u.api.data.on.login(e,y,this),u.api.data.on.load(e,D,this),u.api.data.on.init(e,L,this),u.api.data.on.reset(e,L,this)]}function M(){_.forEach(U,function(e){e()}),U=[]}function w(){var e=l.alive;if(!e&&U&&U.length>0)console.debug("[ES] [notification] Disable"),M(),u.isLogin()&&L(u.data);else if(e&&(!U||0===U.length)&&(console.debug("[ES] [notification] Enable"),k(),u.isLogin()))return y(u.data)}var U,B,x={MESSAGE_CODES:["MESSAGE_RECEIVED"],INVITATION_CODES:["INVITATION_TO_CERTIFY"],DEFAULT_LOAD_SIZE:20},F={commons:["type","code","params","reference","recipient","time","hash","read_signature"]},H=this,W=new f(this,"esNotification");return x.EXCLUDED_CODES=x.MESSAGE_CODES.concat(x.INVITATION_CODES),H.raw={postCount:l.post("/user/event/_count"),postSearch:l.post("/user/event/_search"),postReadById:l.post("/user/event/:id/_read"),ws:{getUserEvent:l.ws("/ws/event/user/:pubkey/:locale"),getChanges:l.ws("/ws/_changes")}},W.registerEvent("data","new"),W.registerEvent("event","newInvitation"),W.registerEvent("event","newMessage"),g.ready().then(function(){return l.api.node.on.start(e,w,this),l.api.node.on.stop(e,w,this),w()}),H.load=v,H.unreadCount=h,H.html5={emit:S},H.api=W,H.websocket={event:H.raw.ws.getUserEvent,change:H.raw.ws.getChanges},H.constants=x,H}]),angular.module("cesium.es.message.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esMessage")}]).factory("esMessage",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","esHttp","csWallet","esWallet","csWot","esNotification",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";function E(e){e.messages=e.messages||{},e.messages.unreadCount=null,e.messages.time=null}function b(e){e.messages&&delete e.messages}function g(t,n){if(n=n||e.defer(),!t||!t.pubkey)return n.resolve(),n.promise;var i=Date.now(),a=Math.trunc(i/1e3);return t.messages&&t.messages.time&&a-t.messages.time<30?(console.debug("[ES] [message] Skipping load (loaded "+(a-t.messages.time)+"s ago)"),n.resolve(),n.promise):(console.debug("[ES] [message] Loading count..."),f({pubkey:t.pubkey}).then(function(e){t.messages=t.messages||{},t.messages.unreadCount=e,t.messages.time=a,console.debug("[ES] [message] Loaded count ("+e+") in "+(Date.now()-i)+"ms"),n.resolve(t)}).catch(function(e){console.error("Error while counting messages: "+(e.message?e.message:e)),n.resolve(t)}),n.promise)}function f(e){e=e||{};var t=e.wallet||e.walletId&&u.children.get(e.walletId)||u,n=e.pubkey||t&&t.data&&t.data.pubkey;if(!n)throw new Error("no pubkey or wallet found in options, and user not connected.");var i={query:{bool:{must:[{term:{recipient:n}},{missing:{field:"read_signature"}}]}}};return c.post("/message/inbox/_count")(i).then(function(e){return e.count})}function T(e,t){console.debug("[ES] [message] detected new message (from notification service)");var n=new EsNotification(e);if(n.issuer=n.pubkey,delete n.pubkey,n.issuer){if(!(t=t||n.issuer&&u.isUserPubkey(n.issuer)&&u||n.issuer&&u.children.getByPubkey(n.issuer)))throw new Error("No wallet for pubkey: {0}".format(n.issuer.substring(0,6)));p.extend(n,"issuer").then(function(){t.data.messages=t.data.messages||{},t.data.messages.unreadCount++,V.data.raise.new(n)})}}function h(e,t){t=t||{};var n=t.wallet||t.walletId&&u.children.get(t.walletId)||u;return delete t.wallet,e.issuer=e.issuer||n.data.pubkey,n.getKeypair().then(function(t){return I(e,t).then(function(n){return l.data.plugins.es.message&&angular.isDefined(l.data.plugins.es.message.outbox)&&!l.data.plugins.es.message.outbox?n:I(e,t,"/message/outbox","issuer").catch(function(e){return console.error("Failed to store message to outbox: "+e),n})}).then(function(e){return V.data.raise.sent(e),e})})}function I(e,t,n,i){return n=n||"/message/inbox",d.box.record.pack(e,t,i,["title","content"]).then(function(e){return c.record.post(n)(e,{pubkey:e.issuer,keypair:t})})}function v(t){t=t||{},t.from=t.from||0,t.size=t.size||F.DEFAULT_LOAD_SIZE;var n=t.wallet||t.walletId&&u.children.get(t.walletId)||u;if(delete t.wallet,!n.isLogin())return e.when([]);var i={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:n.data.pubkey}}}},from:t.from,size:t.size,_source:H.notifications};return W.postSearch(i).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,n.read=!!n.read_signature,delete n.read_signature,e.concat(n)},[]);return p.extendAll(t,"issuer")})}function N(e,t){e=e||u.data.pubkey,t=t||{},t.type=t.type||"inbox",t.from=t.from||0,t.size=t.size||1e3,t._source=t._source||H.commons;var n={sort:{time:"desc"},from:t.from,size:t.size,_source:t._source};return"inbox"==t.type?n.query={bool:{filter:{term:{recipient:e}}}}:n.query={bool:{filter:{term:{issuer:e}}}},W.postSearchByType(n,{type:t.type}).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce(function(e,n){var i=n._source||{};return i.id=n._id,i.read="outbox"==t.type||!!i.read_signature,delete i.read_signature,e.concat(i)},[]);return console.debug("[ES] [message] Loading {0} {1} messages".format(n.length,t.type)),n})}function O(e){e=e||{},e.type=e.type||"inbox",e._source=H.commons,e.summary=!angular.isDefined(e.summary)||e.summary,e.filter=angular.isDefined(e.filter)?e.filter:void 0,e.from=e.from||0;var t=e.wallet||e.walletId&&u.children.get(e.walletId)||u;delete e.wallet;var n=t.auth().then(function(t){return N(t.pubkey,e).then(function(n){return A(n,t.keypair,e.summary)})}).then(function(t){var n="inbox"==e.type?"issuer":"recipient";return p.extendAll(t,n)}).then(function(n){if(n.length&&e.filter){var i=P(n,e.filter);if(i.length<n.length)return e=angular.copy(e),e.from+=e.size,e.size=n.length-i.length,e.wallet=t,O(e).then(function(e){return i.concat(e)})}return 0!==e.from||e.filter||(t.data.messages=t.data.messages||{},t.data.messages.count=n.length),n});return 0===e.from&&e.filter&&n.then(k),n}function R(e,t,n){return t=t||"inbox",n=n||{},n.summary=!!angular.isDefined(n.summary)&&n.summary,(n.wallet||n.walletId&&u.children.get(n.walletId)||u).auth().then(function(i){return W.getByTypeAndId({id:e,type:t}).then(function(e){if(e.found){var a=e._source;return a.id=e._id,a.read="outbox"==t||!!a.read_signature,delete a.read_signature,
-A([a],i.keypair,n.summary).then(function(){var e="inbox"==t?"issuer":"recipient";return p.extend(a,e)})}})})}function A(t,n,i){var a=Date.now(),r={},s=[d.box.getKeypair(n)];return e.all(t.reduce(function(e,t){return r[t.issuer]?res:e.concat(o.box.keypair.pkFromSignPk(o.util.decode_base58(t.issuer)).then(function(e){r[t.issuer]=e}))},s)).then(function(n){var a=n[0];return e.all(t.reduce(function(e,t){var n=r[t.issuer],s=o.util.decode_base58(t.nonce);return t.valid=!0,e.concat(o.box.open(t.title,s,n,a.boxSk).then(function(e){t.title=e}).catch(function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher title"),t.valid=!1}),o.box.open(t.content,s,n,a.boxSk).then(function(e){t.content=e,i?S(t):e&&(t.html=c.util.parseAsHtml(e))}).catch(function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher content"),t.valid=!1}))},[]))}).then(function(){return console.debug("[ES] [message] All messages decrypted in "+(Date.now()-a)+"ms"),t})}function S(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim(),e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"..."))}function C(e,t,n){t=t||"inbox";var i=n.wallet||n.walletId&&u.children.get(n.walletId)||u;return c.record.remove("message",t)(e,{wallet:i}).then(function(n){return"inbox"===t&&(i.data.messages=i.data.messages||{},i.data.messages.count=i.data.messages.count>0?i.data.messages.count-1:0),i.isDefault()&&V.data.raise.delete(e),n})}function L(t,n){t=t||"inbox";var i=n&&n.walletId&&u.children.get(n.walletId)||u;return i.auth().then(function(n){return N(n.pubkey,{type:t,from:0,size:1e3,_source:!1}).then(function(n){if(n&&n.length){var a=_.pluck(n,"id");return e.all(n.reduce(function(e,n){return e.concat(c.record.remove("message",t)(n.id,{wallet:i}))},[])).then(function(){return a})}}).then(function(e){"inbox"===t&&(i.data.messages=i.data.messages||{},i.data.messages.count=0,i.data.messages.unreadCount=0),i.isDefault()&&_.forEach(e,V.data.raise.delete)})})}function D(t,n){n=n||{};var i=n.wallet||n.walletId&&u.children.get(n.walletId)||u,a=n&&n.type||(i.isUserPubkey(t.recipient)?"inbox":"outbox");if(t.read){var r=e.defer();return r.resolve(),r.promise}return t.read=!0,i.getKeypair().then(function(e){return o.sign(t.hash,e)}).then(function(e){return W.postReadById(e,{id:t.id})}).then(function(){"inbox"===a&&(i.data.messages=i.data.messages||{},i.data.messages.unreadCount=i.data.messages.unreadCount?i.data.messages.unreadCount-1:0)})}function y(t){t=t||{};var n=t.wallet||t.walletId&&u.children.get(t.walletId)||u;return n.auth().then(function(t){return N(t.pubkey,{type:"inbox",from:0,size:1e3,_source:["hash","read_signature"]}).then(function(n){if(n&&n.length)return n=_.filter(n,{read:!1}),e.all(n.reduce(function(e,n){return e.concat(o.sign(n.hash,t.keypair).then(function(e){return W.postReadById(e,{id:n.id})}))},[]))}).then(function(){n.data.messages=n.data.messages||{},n.data.messages.unreadCount=0})})}function P(e,t){return t&&!t.trim().length?e:(e.forEach(function(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim()||"")}),t.trim().split(" ").forEach(function(t){var n=new RegExp(t,"gi");e.forEach(function(e){var i=n.exec(e.title);if(i)for(e.title=e.title.replace(n,"<b>$&</b>"),e.titleMatch=(e.titleMatch||0)+1;(i=n.exec(e.title.substring(i.index+t.length)))&&!(e.titleMatch>=10);)e.titleMatch=e.titleMatch+1;else if(i=n.exec(e.summary)){for(i.index>140&&(e.summary="..."+e.summary.substring(i.index-20)),e.summary=e.summary.replace(n,"<b>$&</b>"),e.contentMatch=(e.contentMatch||0)+1;(i=n.exec(e.summary.substring(i.index+t.length)))&&!(e.contentMatch>=10);)e.contentMatch++;e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"...")}})}),e=_.filter(e,function(e){return e.titleMatch||e.contentMatch}))}function k(e){return _.sortBy(e,function(e){return-1*(1e3*(e.titleMatch||0)+100*(e.contentMatch||0)+e.time/1e10)})}function M(t){var n=s.developers||[{pubkey:"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"}];t&&t.content&&n&&n.length&&(console.info("[ES] [message] Sending logs to developers..."),t.issuer=u.data.pubkey,t.title=t.title||"Sending log",t.time=moment().utc().unix(),u.getKeypair().then(function(i){return e.all(n.reduce(function(e,n){return n.pubkey?e.concat(I(angular.merge({recipient:n.pubkey},t),i)):e},[]))}).then(function(e){console.info("[ES] [message] Logs sent to {0} developers".format(e.length))}))}function w(){_.forEach(x,function(e){e()}),x=[]}function U(){x=[u.api.data.on.init(t,E,this),u.api.data.on.login(t,g,this),u.api.data.on.load(t,g,this),u.api.data.on.reset(t,b,this),m.api.event.on.newMessage(t,T,this),u.api.error.on.send(t,M,this)]}function B(){var e=c.alive;!e&&x&&x.length>0?(console.debug("[ES] [message] Disable"),w(),u.isLogin()&&b(u.data)):!e||x&&0!==x.length||(console.debug("[ES] [message] Enable"),U(),u.isLogin()&&g(u.data))}var x,F={DEFAULT_LOAD_SIZE:10},H={commons:["issuer","recipient","title","content","time","nonce","read_signature"],notifications:["issuer","time","hash","read_signature"]},W={postSearch:c.post("/message/inbox/_search"),postSearchByType:c.post("/message/:type/_search"),getByTypeAndId:c.get("/message/:type/:id"),postReadById:c.post("/message/inbox/:id/_read")},V=new a(this,"esMessage");return V.registerEvent("data","new"),V.registerEvent("data","delete"),V.registerEvent("data","sent"),r.ready().then(function(){return c.api.node.on.start(t,B,this),c.api.node.on.stop(t,B,this),B()}),{api:V,search:W.postSearch,notifications:{load:v},load:O,get:R,send:h,remove:C,removeAll:L,markAsRead:D,markAllAsRead:y,fields:{commons:H.commons}}}]),angular.module("cesium.es.modal.services",["cesium.modal.services","cesium.es.message.services"]).factory("esModals",["$state","ModalUtils","UIUtils","csWallet",function(e,t,n,i){"ngInject";function a(e){return t.show("plugins/es/templates/message/modal_compose.html","ESMessageComposeModalCtrl",e,{focusFirstInput:!0})}function o(t,i){return n.popover.show(i,{templateUrl:"plugins/es/templates/common/popover_notification.html",scope:t,autoremove:!1,afterHidden:t.resetUnreadCount}).then(function(t){t&&(t.onRead&&"function"==typeof t.onRead&&t.onRead(),t.state&&e.go(t.state,t.stateParams))})}function r(e){return i.auth({minData:!0}).then(function(i){return n.loading.hide(),i.isMember?t.show("plugins/es/templates/invitation/modal_new_invitation.html","ESNewInvitationModalCtrl",e):n.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")})}function s(a){var o=a&&a.wallet||i;return o.auth({minData:!0}).then(function(){return n.loading.hide(),t.show("plugins/es/templates/registry/modal_record_type.html",void 0,{title:"REGISTRY.EDIT.TITLE_NEW"}).then(function(t){t&&e.go("app.registry_add_record",{type:t,wallet:o.id})})})}return{showMessageCompose:a,showNotifications:o,showNewInvitation:r,showNewPage:s}}]),angular.module("cesium.es.blockchain.services",["cesium.services","cesium.es.http.services"]).factory("esBlockchain",["$rootScope","$q","$timeout","BMA","esHttp",function(e,t,n,i,a){"ngInject";return function(){var e=i.constants.regexp.PUBKEY,t={DEFAULT_SEARCH_SIZE:40,ES_CORE_API_ENDPOINT:"ES_CORE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))"},n={SEARCH_FILTER:{TX_PUBKEY:new RegExp("\\(transactions\\.issuers:("+e+") OR transactions\\.outputs:\\*("+e+")\\)([ ]+AND)?"),ISSUER:new RegExp("issuer:("+e+")([ ]+AND)?"),MEMBER_FLOWS:new RegExp("\\(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded\\)([ ]+AND)?"),EXISTING_TRANSACTION:new RegExp("_exists_:transactions([ ]+AND)?"),PERIOD:new RegExp("medianTime:>=?([0-9]+)[ ]+AND[ ]+medianTime:<=?([0-9]+)([ ]+AND)?")},LAST_AND:/[ ]+AND$/},o={MINIMAL:["number","hash","medianTime","issuer"],COMMONS:["number","hash","medianTime","issuer","currency","version","powMin","dividend","membersCount","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions"]},r={node:{},block:{},raw:{block:{search:a.post("/:currency/block/_search",a.cache.SHORT),searchText:a.get("/:currency/block/_search?q=:text"),get:a.get("/:currency/block/:number/_source",a.cache.SHORT)}},regexp:{ES_CORE_API_ENDPOINT:function(e){return new RegExp("^"+e+"$")}(t.ES_CORE_API_ENDPOINT)}};return r.regex=r.regexp,r.node.parseEndPoint=function(e){var t=r.regexp.ES_CORE_API_ENDPOINT.exec(e);if(t)return{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80}},r.raw.block.processSearchResult=function(e,t){t=t||{},t.excludeCurrent=!angular.isDefined(t.excludeCurrent)||t.excludeCurrent,t.fillAvatar=!angular.isDefined(t.fillAvatar)||t.fillAvatar,t.cleanData=!angular.isDefined(t.cleanData)||t.cleanData;var n=!1;return{hits:(e&&e.hits&&e.hits.hits||[]).reduce(function(e,i){if("current"==i._id&&t.excludeCurrent)return n=!0,e;if(!i._source)return e;var a=new Block(i._source);return t.cleanData&&a.cleanData(),e.concat(a)},[]),took:e.took,total:e&&e.hits&&e.hits.total?n?e.hits.total-1:e.hits.total:0}},r.block.search=function(e,n){var i=n?angular.copy(n):{};return delete i.excludeCurrent,delete i.fillAvatar,delete i.skipData,i.from=i.from||0,i.size=i.size||t.DEFAULT_SEARCH_SIZE,i._source=n._source||o.COMMONS,n._source&&"*"==n._source&&delete i._source,r.raw.block.search(i,{currency:e}).then(function(e){return r.raw.block.processSearchResult(e,n)})},r.block.searchText=function(e,n,i){i&&angular.isUndefined(i.excludeCurrent)&&(i.excludeCurrent=!0);var a=i?angular.copy(i):{};return delete a.excludeCurrent,delete a.fillAvatar,delete a.skipData,a.from=a.from||0,a.size=a.size||t.DEFAULT_SEARCH_SIZE,a._source=i._source||o.COMMONS.join(","),i._source&&"*"==i._source&&delete a._source,a.currency=e,a.text=n||"",r.raw.block.searchText(a).then(function(e){return r.raw.block.processSearchResult(e,i)})},r.block.parseSearchText=function(e,t){var i=e;return t=_.keys(n.SEARCH_FILTER).reduce(function(e,t){var a=n.SEARCH_FILTER[t].exec(i);if(a){var o=a[0];i=i.replace(o,""),o=o.replace(n.LAST_AND,"");var r={type:t,text:o,params:a};return e.concat(r)}return e},t||[]),{filters:t,text:i.trim()}},r}()}]),angular.module("cesium.es.group.services",["cesium.platform","cesium.es.http.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.comment.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esGroup")}]).factory("esGroup",["$q","$rootScope","csPlatform","BMA","csSettings","esHttp","CryptoUtils","csWot","csWallet","esNotification","esComment",function(e,t,n,i,a,o,r,s,l,c,u){"ngInject";function d(e){e.groups=e.groups||{},e.groups.unreadCount=null}function p(e){e.groups&&delete e.groups}function m(t,n){return n=n||e.defer(),t&&t.pubkey?(c.unreadCount(t.pubkey,{codes:{includes:["GROUP_INVITATION"],excludes:[]}}).then(function(e){t.groups=t.groups||{},t.groups.unreadCount=e,console.debug("[ES] [group] Detecting "+e+" unread notifications"),n.resolve(t)}).catch(function(e){console.error("Error while counting group notifications: "+(e.message?e.message:e)),n.resolve(t)}),n.promise):(n.resolve(),n.promise)}function E(e,t){if(e){var n=e._source;return t&&e.highlight&&(e.highlight.title&&(n.title=e.highlight.title[0]),e.highlight.description&&(n.description=e.highlight.description[0]),e.highlight.location&&(n.location=e.highlight.location[0]),e.highlight.tags&&(data.tags=e.highlight.tags.reduce(function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))},[]))),t&&(n.description=o.util.parseAsHtml(n.description)),n.avatar=o.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(n.pictures=e._source.pictures.reduce(function(e,t){return e.concat(o.image.fromAttachment(t.file))},[])),n}}function b(e){return A._internal.search(e).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce(function(e,t){var n=E(t,!0);return n.id=t._id,n?e.concat(n):e},[]);return console.debug("[ES] [group] Loading {0} groups".format(t.length)),t})}function g(e){return e=e||{},b({sort:{time:"desc"},from:e.from||0,size:e.size||O,_source:e._source||R.list})}function f(e){e=e||{};var t=e.text&&e.text.trim();if(!t)return g(e);var n={from:e.from||0,size:e.size||O,highlight:{fields:{title:{},tags:{}}},_source:e._source||R.list},a=[],o=[];if(i.regexp.PUBKEY.test(t))o.push({term:{issuer:t}}),o.push({term:{pubkey:t}});else{t=t.toLowerCase();var r=["title","description"];a.push({multi_match:{query:t,fields:r,type:"phrase_prefix"}}),a.push({match:{title:t}}),a.push({match:{description:t}})}return n.query={bool:{}},a.length>0&&(n.query.bool.should=a),o.length>0&&(n.query.bool.filter=o),b(n)}function T(e,t){return t=t||{},t.fecthPictures=!!angular.isDefined(t.fetchPictures)&&t.fetchPictures,t.html=!angular.isDefined(t.html)||t.html,(t.fecthPictures?A._internal.get({id:e}):A._internal.getCommons({id:e})).then(function(e){var n=E(e,t.html);return s.extend({pubkey:n.issuer}).then(function(t){return{id:e._id,issuer:t,record:n}})})}function h(){_.forEach(N,function(e){e()}),N=[]}function I(){N=[l.api.data.on.login(t,m,this),l.api.data.on.init(t,d,this),l.api.data.on.reset(t,p,this)]}function v(){var e=o.alive;!e&&N&&N.length>0?(console.debug("[ES] [group] Disable"),h(),l.isLogin()&&p(l.data)):!e||N&&0!==N.length||(console.debug("[ES] [group] Enable"),I(),l.isLogin()&&m(l.data))}var N,O=50,R={list:["issuer","title","description","type","creationTime","avatar._content_type"],commons:["issuer","title","description","creationTime","time","signature"],notifications:["issuer","time","hash","read_signature"]},A={_internal:{}};return A._internal.search=o.post("/group/record/_search"),A._internal.get=o.get("/group/record/:id"),A._internal.getCommons=o.get("/group/record/:id?_source="+R.commons.join(",")),n.ready().then(function(){return o.api.node.on.start(t,v,this),o.api.node.on.stop(t,v,this),v()}),{record:{last:g,search:f,load:T,add:o.record.post("/group/record",{tagFields:["title","description"]}),update:o.record.post("/group/record/:id/_update",{tagFields:["title","description"]}),remove:o.record.remove("group","record"),fields:{commons:R.commons},picture:{all:o.get("/group/record/:id?_source=pictures")},comment:u.instance("group")}}}]),angular.module("cesium.es.invitation.services",["cesium.platform","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esInvitation")}]).factory("esInvitation",["$rootScope","$q","CryptoUtils","csPlatform","Api","esHttp","csWallet","esWallet","csWot","esNotification",function(e,t,n,i,a,o,r,s,l,c){"ngInject";function u(e){e.invitations=e.invitations||{},e.invitations.unreadCount=null,e.invitations.time=null}function d(e){e.invitations&&delete e.invitations}function p(e,n){if(n=n||t.defer(),!e||!e.pubkey)return n.resolve(),n.promise;var i=Date.now(),a=Math.trunc(i/1e3);return e.invitations&&e.invitations.time&&a-e.invitations.time<30?(console.debug("[ES] [invitation] Skipping load (loaded "+(a-e.invitations.time)+"s ago)"),n.resolve(),n.promise):(console.debug("[ES] [invitation] Loading count..."),b(e.pubkey).then(function(t){e.invitations=e.invitations||{},e.invitations.unreadCount=t,e.invitations.time=a,console.debug("[ES] [invitation] Loaded count ("+t+") in "+(Date.now()-i)+"ms"),n.resolve(e)}).catch(function(t){console.error("Error while counting invitation: "+(t.message?t.message:t)),n.resolve(e)}),n.promise)}function m(e){if(r.data.invitations&&r.data.invitations.list){var n=_.where(r.data.invitations.list,{type:"certification",pubkey:e.pubkey});if(n&&n.length)return t.all(n.reduce(function(e,t){return e.concat(h(t))},[]))}}function E(t){if(console.debug("[ES] [invitation] detected new invitation (from notification service)"),!r.isAuth())return void e.$applyAsync(function(){r.data.invitations=r.data.invitations||{},r.data.invitations.unreadCount++});f(t.reference.id,t.reference.type).then(function(e){r.data.invitations=r.data.invitations||{},r.data.invitations.unreadCount++,r.data.invitations.list&&r.data.invitations.list.splice(0,0,e),D.data.raise.new(e)})}function b(e){if(!(e=e||(r.isLogin()?r.data.pubkey:e)))throw new Error("User not connected or no pubkey");var t={query:{bool:{must:[{term:{recipient:e}}]}}};return o.post("/invitation/certification/_count")(t).then(function(e){return e.count})}function g(e,t){t=t||{},t.type=t.type||"certification";var n=t.keypair||t.wallet&&t.wallet.data.keypair;return s.box.record.pack(e,n,"recipient",["content","comment"]).then(function(e){return S.raw[t.type].add(e,t)})}function f(e,n){return n=n||"certification",t.all([s.box.getKeypair(),S.raw[n].get({id:e,fields:L.commons.join(",")})]).then(function(e){var t=e[0],n=e[1],i=n._source;return i.id=n._id,i.type=n._type,s.box.record.open([i],t,"issuer",["content","comment"])}).then(function(e){var t=e[0];if(t&&t.valid){var n=new Invitation(t);return l.extendAll(n.issuer?[n,n.issuer]:[n],"pubkey").then(function(){return n})}})}function T(e,n){if(!r.isLogin())return t.when([]);e=e||{},e.from=e.from||0,e.size=e.size||C.DEFAULT_LOAD_SIZE;var i=e.issuer||r.data.pubkey,a={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:i}}}},from:e.from,size:e.size,_source:L.commons};return e.readTime&&(query.bool.must=[{range:{time:{gt:e.readTime}}}]),S.raw.certification.postSearch(a).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,n.type=t._type,n.read=!!n.read_signature,delete n.read_signature,e.concat(n)},[]);return s.box.record.open(t,n,"issuer",["content","comment"])}).then(function(t){var n=[];return t=t.reduce(function(e,t){if(!t||!t.valid)return e;var i=new Invitation(t);return n.push(i),i.issuer&&n.push(i.issuer),e.concat(i)},[]),l.extendAll(n,"pubkey").then(function(){return r.data.invitations=r.data.invitations||{},r.data.invitations.list?(r.data.invitations.list.length&&r.data.invitations.list.splice(e.from,r.data.invitations.list.length-e.from),_.forEach(t,function(e){r.data.invitations.list.push(e)})):r.data.invitations.list=t,r.data.invitations.list})})}function h(e,t){if(!e||!e.id)throw"Invalid invitation (empty or without id). Could not delete.";var n=e.type||"certification",i=t&&t.walletId&&r.children.get(t.walletId)||r;return S.raw[n].remove(e.id,{wallet:i}).then(function(){i.data.invitations.unreadCount=0,i.data.invitations&&i.data.invitations.list&&i.data.invitations.list.splice(i.data.invitations.list.indexOf(e),1)})}function I(e,n,i){return e&&e.length?(n=n||"certification",t.all(e.reduce(function(e,t){return e.concat(S.raw[n].remove(t,i))},[]))):t.when()}function v(e,t){e=e||"certification";var n=Date.now();console.debug("[ES] [invitation] Deleting all {0} invitations...".format(e));var i=t&&t.pubkey&&r.children.getByPubkey(t.pubkey)||t&&t.walletId&&r.children.getByPubkey(t.walletId)||r,a=i.data.invitations&&i.data.invitations.count||0,o=i.data.invitations&&i.data.invitations.unreadCount||0;return S.raw[e].getIds({pubkey:i.data.pubkey}).then(function(t){if(t&&t.hits&&t.hits.total){return I(t.hits.hits.reduce(function(e,t){return e.concat(t._id)},[]),e,{walletId:i.id}).then(function(){i.data.invitations=i.data.invitations||{},i.data.invitations.count>=a?i.data.invitations.count-=a||0:i.data.invitations.count=0,i.data.invitations.unreadCount>=o?i.data.invitations.unreadCount-=o||0:i.data.invitations.unreadCount=0,console.debug("[ES] [invitation] All {0} invitations deleted in {1}ms".format(e,Date.now()-n))})}})}function N(){_.forEach(A,function(e){e()}),A=[]}function O(){A=[r.api.data.on.init(e,u,this),r.api.data.on.login(e,p,this),r.api.data.on.load(e,p,this),r.api.data.on.reset(e,d,this),r.api.action.on.certify(e,m,this),c.api.event.on.newInvitation(e,E,this)]}function R(){var e=o.alive;!e&&A&&A.length>0?(console.debug("[ES] [invitations] Disable"),N(),r.isLogin()&&d(r.data)):!e||A&&0!==A.length||(console.debug("[ES] [invitations] Enable"),O(),r.isLogin()&&p(r.data))}var A,S=this,C={DEFAULT_LOAD_SIZE:20},L={commons:["issuer","time","hash","content","nonce","comment"]},D=new a(this,"esInvitation");return S.raw={certification:{get:o.get("/invitation/certification/:id?_source:fields"),add:o.record.post("/invitation/certification"),postSearch:o.post("/invitation/certification/_search"),remove:o.record.remove("invitation","certification"),getIds:o.get("/invitation/certification/_search?q=recipient::pubkey&_source=false&size=1000")}},D.registerEvent("data","new"),i.ready().then(function(){return o.api.node.on.start(e,R,this),o.api.node.on.stop(e,R,this),R()}),S.api=D,S.load=T,S.get=f,S.send=g,S.delete=h,S.deleteByIds=I,S.deleteAll=v,S.constants=C,S}]),angular.module("cesium.es.subscription.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esSubscription")}]).factory("esSubscription",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","esSettings","CryptoUtils","UIUtils","csWallet","csWot","BMA","csPlatform","esWallet",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E){"ngInject";function b(e){e.subscriptions=null}function g(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [subscription] Loading subscriptions count..."),C.raw.count({pubkey:e.pubkey}).then(function(t){e.subscriptions=e.subscriptions||{},e.subscriptions.count=t&&t.hits&&t.hits.total,console.debug("[ES] [subscription] Loaded count ("+e.subscriptions.count+")"),n.resolve(e)}).catch(function(t){console.error("[ES] [subscription] Error while counting subscription: "+(t.message?t.message:t)),n.resolve(e)}),n.promise):(n.resolve(),n.promise)}function f(e,t){return C.raw.getAll({issuer:e}).then(function(e){var n=e&&e.hits&&e.hits.total&&e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,e.concat(n)},[])||[];return E.box.record.open(n,t,"issuer","issuerContent").then(function(e){return _.forEach(e,function(e){e.content=JSON.parse(e.issuerContent||"{}"),delete e.issuerContent,delete e.recipientContent}),e})})}function T(e,n){if(!(e&&e.type&&e.content&&e.recipient))return t.reject("Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'");var i=n&&n.wallet||n&&n.walletId&&u.children.get(n.walletId)||u,a=i.data.pubkey,o=JSON.stringify(e.content);return l.util.random_nonce().then(function(n){return t.all([E.box.record.pack({issuer:a,issuerContent:o},i.data.keypair,"issuer","issuerContent",n),E.box.record.pack({recipient:e.recipient,recipientContent:o},i.data.keypair,"recipient","recipientContent",n)])}).then(function(t){var n=angular.merge(t[0],t[1]);return n.type=e.type,C.raw.add(n,{wallet:i}).then(function(t){return e.id=t,e})})}function h(e,n){if(!e||!e.content||!e.recipient)return t.reject("Missing arguments 'record' or 'record.content', or 'record.recipient'");var i=n&&n.wallet||n&&n.walletId&&u.children.get(n.walletId)||u,a=i.data.pubkey,o=JSON.stringify(e.content);return l.util.random_nonce().then(function(n){return t.all([E.box.record.pack({issuer:a,issuerContent:o},i.data.keypair,"issuer","issuerContent",n),E.box.record.pack({recipient:e.recipient,recipientContent:o},i.data.keypair,"recipient","recipientContent",n)])}).then(function(t){var n=angular.merge(t[0],t[1]);return n.type=e.type,C.raw.update(n,{id:e.id,wallet:i}).then(function(){return e})})}function I(){if(C.raw.categories&&C.raw.categories.length){var e=t.defer();return e.resolve(C.raw.categories),e.promise}return C.raw.category.all().then(function(e){if(0===e.hits.total)C.raw.categories=[];else{var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,e.concat(n)},[]);_.forEach(t,function(e){t[e.id]=e}),C.raw.categories=t}return C.raw.categories})}function v(e){return C.raw.category.get(e).then(function(e){var t=e._source;return t.id=e._id,t})}function N(){_.forEach(A,function(e){e()}),A=[]}function O(){A=[u.api.data.on.load(e,g,this),u.api.data.on.init(e,b,this),u.api.data.on.reset(e,b,this)]}function R(){var e=i.alive;if(!e&&A&&A.length>0){if(console.debug("[ES] [subscription] Disable"),N(),u.isLogin())return b(u.data)}else if(e&&(!A||0===A.length)&&(console.debug("[ES] [subscription] Enable"),O(),u.isLogin()))return g(u.data)}var A,S={},C=this;return C.raw={getAll:i.get("/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer"),count:i.get("/subscription/record/_search?size=0&q=issuer::pubkey"),add:i.record.post("/subscription/record"),update:i.record.post("/subscription/record/:id/_update"),category:{get:i.get("/subscription/category/:id"),all:i.get("/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key")}},m.ready().then(function(){return i.api.node.on.start(e,R,this),i.api.node.on.stop(e,R,this),R()}),C.record={load:f,add:T,update:h,remove:i.record.remove("subscription","record")},C.category={all:I,get:v},C.constants=S,C}]),angular.module("cesium.es.wallet.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.crypto.services"]).factory("esWallet",["$q","$rootScope","$timeout","CryptoUtils","csPlatform","csWallet","esCrypto","esProfile","esHttp",function(e,t,n,i,a,o,r,s,l){"ngInject";function c(e){e.avatar=null,e.profile=null,e.name=null,o.events.cleanByContext("esWallet"),e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function u(t,n){return n=n||e.defer(),r.box.getKeypair(t.keypair).then(function(e){t.keypair.boxSk=e.boxSk,t.keypair.boxPk=e.boxPk,console.debug("[ES] [wallet] Box keypair successfully computed"),n.resolve()}),n.promise}function d(e){e=e||o.data,e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function p(t,a){if(a=a||e.defer(),!t||!t.pubkey||!t.keypair)return a.resolve(),a.promise;if(!i.isLoaded())return console.debug("[ES] [wallet] Waiting crypto lib loading..."),n(function(){return p(t,a)},50);console.debug("[ES] [wallet] Loading user avatar+name...");var o=Date.now();return s.getAvatarAndName(t.pubkey).then(function(e){e?(t.name=e.name,t.avatarStyle=e.avatarStyle,t.avatar=e.avatar,console.debug("[ES] [wallet] Loaded user avatar+name in "+(Date.now()-o)+"ms")):console.debug("[ES] [wallet] No user avatar+name found"),a.resolve(t)}).catch(function(e){a.reject(e)}),a.promise}function m(t,n){n=n||e.defer(),o.events.cleanByContext("esWallet"),!t.name&&!t.requirements.revoked&&t.requirements.pendingMembership&&t.requirements.needCertificationCount>0&&o.events.add({type:"info",message:"ACCOUNT.EVENT.MEMBER_WITHOUT_PROFILE",context:"esWallet"}),console.debug("[ES] [wallet] Loading full user profile...");var i=Date.now();return s.get(t.pubkey).then(function(e){e&&(t.name=e.name,t.avatar=e.avatar,t.profile=e.source,t.profile.description=e.description,console.debug("[ES] [wallet] Loaded full user profile in "+(Date.now()-i)+"ms")),n.resolve()}),n.promise}function E(t){if(!t&&!o.isAuth())throw new Error("Unable to get box keypair: user not authenticated !");return(t?e.when(t):o.getKeypair({silent:!0})).then(function(t){return t&&t.boxPk&&t.boxSk?e.when(t):r.box.getKeypair(t).then(function(e){return t.boxSk=e.boxSk,t.boxPk=e.boxPk,console.debug("[ES] [wallet] Box keypair successfully computed"),t})})}function b(){T=[o.api.data.on.login(t,p,this),o.api.data.on.load(t,m,this),o.api.data.on.init(t,c,this),o.api.data.on.reset(t,c,this),o.api.data.on.unauth(t,d,this),o.api.data.on.auth(t,u,this)]}function g(){_.forEach(T,function(e){e()}),T=[]}function f(){var e=l.alive;if(!e&&T&&T.length>0){if(console.debug("[ES] [wallet] Disable"),g(),o.isLogin())return c(o.data)}else if(e&&(!T||0===T.length)&&(console.debug("[ES] [wallet] Enable"),b(),o.isLogin()))return p(o.data)}var T,h=this;return a.ready().then(function(){return l.api.node.on.start(t,f,this),l.api.node.on.stop(t,f,this),f()}),h.box={getKeypair:E,record:{pack:function(e,t,n,i,a){return E(t).then(function(t){return r.box.pack(e,t,n,i,a)})},open:function(e,t,n,i){return E(t).then(function(t){return r.box.open(e,t,n,i)})}}},h}]),angular.module("cesium.es.wot.services",["ngResource","cesium.es.http.services"]).factory("esWot",["$rootScope","$q","esHttp","csCache",function(e,t,n,i){"ngInject";var a=i.get("esWot-memberships-",i.constants.MEDIUM),o={user:{event:n.post("/user/event/_search")}},r=function(e,n){n=n||{};var i=!1!==n.cache?a.get(e):null;if(i)return t.when(i);var r={size:1e3,query:{bool:{filter:[{term:{recipient:e}},{terms:{code:["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"]}}]}},sort:[{time:{order:"asc"}}],_source:["code","time"]};return o.user.event(r).then(function(t){if(t.hits&&t.hits.total){var n,i=t.hits.hits.reduce(function(e,t){var i="MEMBER_JOIN"==t._source.code||"MEMBER_ACTIVE"==t._source.code;return i&&!n?n=t._source.time:!i&&n&&(e=e.concat({joinTime:n,leaveTime:t._source.time}),n=0),e},[]);return n&&i.push({joinTime:n,leaveTime:moment().utc().unix()}),a.put(e,i),i}})},s=function(){console.debug("[ES] [wot] Clean cache..."),i.clear("esWot-")};return n.api.node.on.stop(e,s,this),{memberships:r}}]),angular.module("cesium.es.tx.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.wot.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esTx")}]).factory("esTx",["$q","$rootScope","csPlatform","csCurrency","csTx","esHttp","esWot",function(e,t,n,i,a,o,r){"ngInject";function s(e,t){return t<=0?e:e*Math.pow(10,t)}function l(t,n){return n=n||e.defer(),t=t||{},t.pubkey||n.reject("Missing [pubkey] when calling [loadUDs] extension point"),e.all([i.get(),r.memberships(t.pubkey)]).then(function(n){var i=n[0]&&n[0].name,a=n[1];if(i&&a&&a.length)return-1!==t.fromTime&&(a=a.reduce(function(e,n){return n.leaveTime<t.fromTime?e:(n.joinTime=Math.max(n.joinTime,t.fromTime),e.concat(n))},[])),e.all(a.reduce(function(e,n){var a={query:{filtered:{filter:{bool:{must:[{exists:{field:"dividend"}},{range:{medianTime:{from:n.joinTime+1,to:n.leaveTime}}}]}}}},size:t.size||1e4,from:t.from||0,sort:{medianTime:"desc"},_source:["medianTime","number","dividend","unitbase"]};return e.concat(m.block.search(a,{currency:i}))},[]))}).then(function(e){if(e&&e.length)return e.reduce(function(e,t){return t.hits.total&&t.hits.hits.length?e.concat(t.hits.hits.reduce(function(e,t){var n=t._source;return e.concat({time:n.medianTime,amount:s(n.dividend,n.unitbase),isUD:!0,block_number:n.number})},[])):t},[])}).then(function(e){n.resolve(e)}).catch(function(e){n.reject(e)}),n.promise}function c(){p=[a.api.data.on.loadUDs(t,l,this)]}function u(){_.forEach(p,function(e){e()}),p=[]}function d(){var e=o.alive;!e&&p&&p.length>0?(console.debug("[ES] [tx] Disable"),u()):!e||p&&0!==p.length||(console.debug("[ES] [tx] Enable"),c())}var p,m={block:{search:o.post("/:currency/block/_search")}};return n.ready().then(function(){return o.api.node.on.start(t,d,this),o.api.node.on.stop(t,d,this),d()}),{}}]),angular.module("cesium.es.geo.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esGeo")}]).factory("esGeo",["$rootScope","$q","csConfig","csSettings","csHttp",function(e,t,n,i,a){"ngInject";function o(e){var t=e.trim().replace(/\n/g,",");return t=t.replace(/(?:^|[\t\n\r\s ])([A−Z09-]+)(?:$|[\t\n\r\s ])/g,""),t=t.replace(/,[ ,]+/g,", ")}function r(e){return p.raw.google.search({address:e,key:p.raw.google.apiKey}).then(function(e){if(e&&e.results&&e.results.length)return e.results.reduce(function(e,t){return e.concat({display_name:t.address_components&&t.address_components.reduce(function(e,t){return t.long_name?e.concat(t.long_name):e},[]).join(", "),lat:t.geometry&&t.geometry.location&&t.geometry.location.lat,lon:t.geometry&&t.geometry.location&&t.geometry.location.lng})},[])})}function s(e,t){return console.debug("[ES] [geo] Search position failed on [OSM]. Trying [google] service"),r(t).catch(function(t){
-throw console.debug("[ES] [geo] Search position failed on [google] service"),e||t})}function l(e){"string"==typeof e&&(e={q:e}),e.q&&(e.q=o(e.q)),e.addressdetails=1;var t=Date.now();return p.raw.osm.search(e).then(function(e){if(e)return e=e.reduce(function(e,t){return"waterway"!=t.class&&"railway"!=t.class&&t.address?(t.address.city=t.address.city||t.address.village||t.address.town||t.address.postcode,t.address.road=t.address.road||t.address.suburb||t.address.hamlet,t.address.postcode&&t.address.city==t.address.postcode&&delete t.address.postcode,t.address.city?e.concat({id:t.place_id,name:t.display_name,address:t.address,lat:t.lat,lon:t.lon,class:t.class,license:p.raw.osm.license}):e):e},[]),console.debug("[ES] [geo] Found {0} address position(s)".format(e&&e.length||0,Date.now()-t),e),e.length?e:void 0}).catch(function(t){return s(t,e.q?e.q:(e.street?e.street+", ":"")+e.city+(e.country?", "+e.country:""))})}function c(){var e=t.defer();return navigator.geolocation?navigator.geolocation.getCurrentPosition(function(t){if(!t||!t.coords)return void console.error("[ES] [geo] navigator geolocation > Unknown format:",t);e.resolve({lat:t.coords.latitude,lon:t.coords.longitude})},function(t){e.reject(t)},{timeout:5e3}):e.reject(),e.promise}function u(e){return p.raw.freegeoip.search({ip:e}).then(function(e){return e?{lat:e.latitude,lng:e.longitude}:void 0})}function d(e,t,n,i,a){var o=Math.PI*e/180,r=Math.PI*n/180,s=t-i,l=Math.PI*s/180,c=Math.sin(o)*Math.sin(r)+Math.cos(o)*Math.cos(r)*Math.cos(l);return c=Math.acos(c),c=180*c/Math.PI,c=60*c*1.1515,"km"==a?1.609344*c:"N"==a?.8684*c:c}var p=this;p.raw={osm:{search:a.get("nominatim.openstreetmap.org",443,"/search.php?format=json"),license:{name:"OpenStreetMap",url:"https://www.openstreetmap.org/copyright"}},google:{apiKey:void 0,search:a.get("maps.google.com",443,"/maps/api/geocode/json")},freegeoip:{search:a.get("freegeoip.net",443,"/json/:ip"),license:{name:"freegeoip",url:"https://freegeoip.net"}}},p.raw.google.apiKey=n.plugins&&n.plugins.es&&n.plugins.es.googleApiKey;var m=!!p.raw.google.apiKey;return i.ready().then(function(){function t(e){m||(p.raw.google.apiKey=e.plugins.es.googleApiKey),p.raw.google.enable=p.raw.google.apiKey&&e.plugins&&e.plugins.es&&e.plugins.es.enableGoogleApi}i.api.data.on.changed(e,t,this),t(i.data)}),{point:{current:c,searchByAddress:l,distance:d,ip:{search:u,license:p.raw.freegeoip.license}},google:{isEnable:function(){return p.raw.google.enable&&p.raw.google.apiKey},searchByAddress:r}}}]),angular.module("cesium.es.document.services",["ngResource","cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esDocument")}]).factory("esDocument",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","csWot","csWallet","esHttp",function(e,t,n,i,a,o,r,s,l,c,u,d){"ngInject";function p(e,t){t.issuerField=t.issuerField||"pubkey";var n=(e&&e.hits&&e.hits.hits||[]).reduce(function(e,n){var i=n._source||{};return i.index=n._index,i.type=n._type,i.id=n._id,i.pubkey=i.issuer||t.issuerField&&i[t.issuerField],i.time=i.time||t.getTimeFunction&&t.getTimeFunction(i),e.concat(i)},[]),i=n.reduce(function(e,t){return t.recipient?(t.recipient={pubkey:t.recipient},e.concat(t.recipient)):e},[]);return c.extendAll(n.concat(i)).then(function(){return{hits:n,took:e.took,total:e&&e.hits&&e.hits.total||0}})}function m(e){e=e||{};var t,n;if("movement"==e.type?e.sort?(t=e.sort.split(":"),n=t.length>1?t[1]:"desc",e.sort=[{"stats.medianTime":{nested_path:"stats",order:n}}],e._source=f.peer,e.getTimeFunction=function(e){return e.time=e.stats&&e.stats.medianTime,e.time}):e.sort="stats.medianTime:desc":"movement"==e.type&&(e.sort?(t=e.sort.split(":"),n=t.length>1?t[1]:"desc",e.sort=[{medianTime:{order:n}}],e._source=f.movement,e.getTimeFunction=function(e){return e.time=e.medianTime,e.time}):e.sort="medianTime:desc"),!e||!e.index||!e.type)throw new Error("Missing mandatory options [index, type]");var i={from:e.from||0,size:e.size||_.DEFAULT_LOAD_SIZE,sort:e.sort||{time:"desc"},_source:e._source||f.commons};return e.query&&(i.query=e.query),T.search(i,{index:e.index,type:e.type}).then(function(t){return p(t,e)})}function E(e,t){t=t||{};var n={text:e,index:t.index||"user",type:t.type||"event",from:t.from||0,size:t.size||_.DEFAULT_LOAD_SIZE,sort:t.sort||"time:desc",_source:t._source||f.commons.join(",")};console.debug("[ES] [wallet] [document] [{0}/{1}] Loading documents...".format(t.index,t.type));var i=Date.now();return T.searchText(n).then(function(e){return p(e,t)}).then(function(e){return console.debug("[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms".format(t.index,t.type,e&&e.hits&&e.hits.length||0,Date.now()-i)),e})}function b(t,n){return t&&t.index&&t.type&&t.id?d.record.remove(t.index,t.type)(t.id,n):e.reject("Could not remove document: missing mandatory fields")}function g(t,n){if(t&&t.length){var i=n&&n.walletId&&u.children.get(n.walletId)||u;return i.auth().then(function(){return e.all(t.reduce(function(e,t){return e.concat(d.record.remove(t.index,t.type)(t.id,{wallet:i}))},[]))})}}var _={DEFAULT_LOAD_SIZE:40},f={commons:["issuer","pubkey","hash","time","recipient","nonce","read_signature"],peer:["*"],movement:["*"]},T={search:d.post("/:index/:type/_search"),searchText:d.get("/:index/:type/_search?q=:text")};return{search:m,searchText:E,remove:b,removeAll:g,fields:{commons:f.commons}}}]),ESPicturesEditController.$inject=["$scope","UIUtils","$q","Device"],ESSocialsEditController.$inject=["$scope","$focus","$filter","UIUtils","SocialUtils"],ESSocialsViewController.$inject=["$scope"],ESCommentsController.$inject=["$scope","$filter","$state","$focus","$timeout","$anchorScroll","UIUtils"],ESCategoryModalController.$inject=["$scope","UIUtils","$timeout","parameters"],ESAvatarModalController.$inject=["$scope"],ESPositionEditController.$inject=["$scope","csConfig","esGeo","ModalUtils"],ESLookupPositionController.$inject=["$scope","$q","csConfig","esGeo","ModalUtils"],ESSearchPositionItemController.$inject=["$scope","$timeout","ModalUtils","csConfig","esGeo"],ESSearchPositionModalController.$inject=["$scope","$q","$translate","esGeo","parameters"],angular.module("cesium.es.common.controllers",["ngResource","cesium.es.services"]).controller("ESPicturesEditCtrl",ESPicturesEditController).controller("ESPicturesEditCtrl",ESPicturesEditController).controller("ESSocialsEditCtrl",ESSocialsEditController).controller("ESSocialsViewCtrl",ESSocialsViewController).controller("ESCommentsCtrl",ESCommentsController).controller("ESCategoryModalCtrl",ESCategoryModalController).controller("ESAvatarModalCtrl",ESAvatarModalController).controller("ESPositionEditCtrl",ESPositionEditController).controller("ESLookupPositionCtrl",ESLookupPositionController).controller("ESSearchPositionItemCtrl",ESSearchPositionItemController).controller("ESSearchPositionModalCtrl",ESSearchPositionModalController),ESExtensionController.$inject=["$scope","esSettings","PluginService"],ESMenuExtendController.$inject=["$scope","$state","$controller","UIUtils","csWallet"],ESProfilePopoverExtendController.$inject=["$scope","$q","$state","esSettings","csWallet"],angular.module("cesium.es.app.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&(e.extendState("app",{points:{"nav-buttons-right":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"}}}),e.extendState("app",{points:{"profile-popover-user":{templateUrl:"plugins/es/templates/common/popover_profile_extend.html",controller:"ESProfilePopoverExtendCtrl"}}}))}]).controller("ESExtensionCtrl",ESExtensionController).controller("ESMenuExtendCtrl",ESMenuExtendController).controller("ESProfilePopoverExtendCtrl",ESProfilePopoverExtendController),ESExtendSettingsController.$inject=["$scope","PluginService"],ESPluginSettingsController.$inject=["$scope","$window","$q","$translate","$ionicPopup","UIUtils","Modals","csHttp","csConfig","csSettings","esHttp","esSettings"],angular.module("cesium.es.settings.controllers",["cesium.es.services"]).config(["PluginServiceProvider","$stateProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(e.extendState("app.settings",{points:{plugins:{templateUrl:"plugins/es/templates/settings/settings_extend.html",controller:"ESExtensionCtrl"}}}),t.state("app.es_settings",{url:"/settings/es",views:{menuContent:{templateUrl:"plugins/es/templates/settings/plugin_settings.html",controller:"ESPluginSettingsCtrl"}}}))}]).controller("ESExtendSettingsCtrl",ESExtendSettingsController).controller("ESPluginSettingsCtrl",ESPluginSettingsController),angular.module("cesium.es.currency.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.currency.tab_blocks",{points:{"nav-buttons":{templateUrl:"plugins/es/templates/currency/tab_blocks_extend.html",controller:"ESExtensionCtrl"}}})}]),ESWalletController.$inject=["$scope","$controller","$state","esModals","csWallet"],angular.module("cesium.es.wallet.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendStates(["app.view_wallet","app.view_wallet_by_id"],{points:{"after-general":{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletCtrl"}}}).extendState("app.view_wallets",{points:{"item-wallet":{templateUrl:"plugins/es/templates/wallet/item_wallet_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("ESWalletCtrl",ESWalletController),ESWotLookupExtendController.$inject=["$scope","$controller","$state"],ESWotIdentityViewController.$inject=["$scope","$ionicPopover","$q","$controller","UIUtils","Modals","csWallet","esModals","esWallet","esInvitation"],angular.module("cesium.es.wot.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&t.extendState("app.wot_lookup",{points:{tabs:{templateUrl:"plugins/es/templates/wot/lookup_extend.html",controller:"ESExtensionCtrl"}}}).extendState("app.wot_lookup_lg",{points:{top:{templateUrl:"plugins/es/templates/wot/lookup_lg_extend.html",controller:"ESWotLookupExtendCtrl"}}}).extendStates(["app.wot_identity","app.wot_identity_uid"],{points:{"after-general":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"buttons-top-fab":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"}}}).extendStates(["app.wot_cert","app.wot_cert_lg","app.wallet_cert","app.wallet_cert_lg"],{points:{"nav-buttons":{templateUrl:"plugins/es/templates/wot/view_certifications_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_certifications_extend.html",controller:"ESWotIdentityViewCtrl"}}})}]).controller("ESWotLookupExtendCtrl",ESWotLookupExtendController).controller("ESWotIdentityViewCtrl",ESWotIdentityViewController),ESRegistryLookupController.$inject=["$scope","$focus","$timeout","$filter","$controller","$location","$translate","$ionicPopover","Device","UIUtils","ModalUtils","BMA","csSettings","csWallet","esModals","esRegistry","esHttp"],ESWalletPagesController.$inject=["$scope","$controller","$timeout","UIUtils","esModals","csWallet"],ESRegistryRecordViewController.$inject=["$scope","$rootScope","$state","$q","$timeout","$ionicPopover","$ionicHistory","$translate","$anchorScroll","csConfig","csWallet","esRegistry","UIUtils","esHttp"],ESRegistryRecordEditController.$inject=["$scope","$timeout","$state","$q","$ionicHistory","$focus","$translate","$controller","Device","UIUtils","ModalUtils","csWallet","esHttp","esRegistry"],angular.module("cesium.es.registry.controllers",["cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){"ngInject";e.state("app.wot_lookup.tab_registry",{url:"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{tab_registry:{templateUrl:"plugins/es/templates/registry/tabs/tab_registry.html",controller:"ESRegistryLookupCtrl"}},data:{large:"app.registry_lookup_lg",silentLocationChange:!0}}).state("app.registry_lookup_lg",{url:"/wot/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup_lg.html",controller:"ESRegistryLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.wallet_pages",{url:"/account/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0,silentLocationChange:!0}}).state("app.wallet_pages_by_id",{url:"/wallets/:id/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0,silentLocationChange:!0}}).state("app.view_page",{url:"/page/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.view_page_anchor",{url:"/page/view/:id/:title/:anchor",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.registry_add_record",{cache:!1,url:"/page/add/:type?wallet",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}}).state("app.registry_edit_record",{cache:!1,url:"/page/edit/:id/:title?wallet",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}})}]).controller("ESRegistryLookupCtrl",ESRegistryLookupController).controller("ESWalletPagesCtrl",ESWalletPagesController).controller("ESRegistryRecordViewCtrl",ESRegistryRecordViewController).controller("ESRegistryRecordEditCtrl",ESRegistryRecordEditController),ESViewEditProfileController.$inject=["$scope","$q","$timeout","$state","$focus","$translate","$controller","$ionicHistory","$ionicPopover","UIUtils","csWallet","esHttp","esProfile","ModalUtils","Device"],angular.module("cesium.es.profile.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_profile",{url:"/wallet/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{auth:!0}}).state("app.edit_profile_by_id",{url:"/wallets/:id/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{login:!0}})}]).controller("ESViewEditProfileCtrl",ESViewEditProfileController),ESMessageAbstractListController.$inject=["$scope","$state","$translate","$ionicHistory","$ionicPopover","$timeout","csWallet","esModals","UIUtils","esMessage"],ESMessageInboxListController.$inject=["$scope","$controller"],ESMessageOutboxListController.$inject=["$scope","$controller"],ESMessageComposeController.$inject=["$scope","$controller"],ESMessageComposeModalController.$inject=["$scope","Modals","UIUtils","csWallet","esHttp","esMessage","parameters"],ESMessageViewController.$inject=["$scope","$state","$timeout","$translate","$ionicHistory","$ionicPopover","UIUtils","esModals","esMessage","csWallet"],PopoverMessageController.$inject=["$scope","UIUtils","$state","csWallet","esHttp","esMessage","esModals","$timeout"],angular.module("cesium.es.message.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.user_message",{url:"/user/message",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup.html"}}}).state("app.user_message.tab_inbox",{url:"/inbox",views:{tab_inbox:{controller:"ESMessageInboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{auth:!0,minData:!0,large:"app.user_messages_lg_inbox"}}).state("app.user_message.tab_outbox",{url:"/outbox",views:{tab_outbox:{controller:"ESMessageOutboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{auth:!0,minData:!0,large:"app.user_messages_lg_outbox"}}).state("app.user_messages_lg_inbox",{url:"/user/message/lg/inbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageInboxListCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_messages_by_id",{url:"/wallets/:id/message",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_by_id.html"}}}).state("app.user_messages_by_id.tab_inbox",{url:"/inbox",views:{tab_inbox:{controller:"ESMessageInboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{large:"app.user_messages_lg_inbox_by_id"}}).state("app.user_messages_by_id.tab_outbox",{url:"/outbox",views:{tab_outbox:{controller:"ESMessageOutboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{large:"app.user_messages_lg_outbox_by_id"}}).state("app.user_messages_lg_inbox_by_id",{url:"/wallets/:id/message/lg/inbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageInboxListCtrl"}}}).state("app.user_messages_lg_outbox",{url:"/user/message/lg/outbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageOutboxListCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_messages_lg_outbox_by_id",{url:"/wallets/:id/message/lg/outbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageOutboxListCtrl"}}}).state("app.user_new_message",{cache:!1,url:"/user/message/new?pubkey&uid&title&content&isReply",views:{menuContent:{templateUrl:"plugins/es/templates/message/compose.html",controller:"ESMessageComposeCtrl"}}}).state("app.user_view_message",{cache:!1,url:"/user/message/view/:type/:messageId",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_view_message_by_id",{cache:!1,url:"/wallets/:id/message/view/:type/:messageId",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}}})}]).controller("ESMessageAbstractListCtrl",ESMessageAbstractListController).controller("ESMessageInboxListCtrl",ESMessageInboxListController).controller("ESMessageOutboxListCtrl",ESMessageOutboxListController).controller("ESMessageComposeCtrl",ESMessageComposeController).controller("ESMessageComposeModalCtrl",ESMessageComposeModalController).controller("ESMessageViewCtrl",ESMessageViewController).controller("PopoverMessageCtrl",PopoverMessageController),NotificationsController.$inject=["$scope","$ionicPopover","$state","$timeout","UIUtils","esHttp","csWallet","esNotification"],PopoverNotificationsController.$inject=["$scope","$timeout","$controller","$state","UIUtils","csWallet"],angular.module("cesium.es.notification.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.view_notifications",{url:"/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}},data:{login:!0}}).state("app.view_notifications_by_id",{url:"/wallets/:id/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}},data:{login:!0}})}]).controller("NotificationsCtrl",NotificationsController).controller("PopoverNotificationsCtrl",PopoverNotificationsController),ESBlockLookupController.$inject=["$scope","$controller","$ionicPopover","$location","UIUtils","esBlockchain"],angular.module("cesium.es.blockchain.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.lookup_blocks_currency",{url:"/currencies/:currency/blocks?q",views:{menuContent:{templateUrl:"plugins/es/templates/blockchain/lookup.html",controller:"ESBlockLookupCtrl"}}}).state("app.blockchain_search",{url:"/blockchain/search?q&type",views:{menuContent:{templateUrl:"plugins/es/templates/blockchain/lookup.html",controller:"ESBlockLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESBlockLookupCtrl",ESBlockLookupController),angular.module("cesium.es.network.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.network",{points:{buttons:{templateUrl:"plugins/es/templates/network/view_network_extend.html",controller:"ESExtensionCtrl"}}})}]),ESGroupListController.$inject=["$scope","UIUtils","$state","csWallet","esGroup","ModalUtils"],ESGroupViewController.$inject=["$scope","$state","$ionicPopover","$ionicHistory","$translate","UIUtils","csConfig","esGroup","csWallet"],ESGroupEditController.$inject=["$scope","esGroup","UIUtils","$state","$q","Device","$ionicHistory","ModalUtils","$focus","esHttp"],angular.module("cesium.es.group.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.groups",{url:"/group?type&location",views:{menuContent:{templateUrl:"plugins/es/templates/group/lookup.html",controller:"ESGroupListCtrl"}}}).state("app.add_group",{url:"/group/add/:type",views:{menuContent:{templateUrl:"plugins/es/templates/group/edit_group.html",controller:"ESGroupEditCtrl"}}}).state("app.edit_group",{url:"/group/edit/:id",views:{menuContent:{templateUrl:"plugins/es/templates/group/edit_group.html",controller:"ESGroupEditCtrl"}}}).state("app.view_group",{url:"/group/view/:id",views:{menuContent:{templateUrl:"plugins/es/templates/group/view_record.html",controller:"ESGroupViewCtrl"}}})}]).controller("ESGroupListCtrl",ESGroupListController).controller("ESGroupViewCtrl",ESGroupViewController).controller("ESGroupEditCtrl",ESGroupEditController),InvitationsController.$inject=["$scope","$q","$ionicPopover","$state","$timeout","UIUtils","csWallet","esHttp","esModals","esNotification","esInvitation"],PopoverInvitationController.$inject=["$scope","$controller","csWallet"],NewInvitationModalController.$inject=["$scope","$q","Modals","UIUtils","csWallet","esHttp","esWallet","esInvitation","parameters"],angular.module("cesium.es.invitation.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.view_invitations",{url:"/invitations?id",views:{menuContent:{templateUrl:"plugins/es/templates/invitation/view_invitations.html",controller:"InvitationsCtrl"}},data:{auth:!0}}).state("app.view_invitations_by_id",{url:"/wallets/:id/invitations",views:{menuContent:{templateUrl:"plugins/es/templates/invitation/view_invitations.html",controller:"InvitationsCtrl"}},data:{login:!0}})}]).controller("InvitationsCtrl",InvitationsController).controller("PopoverInvitationCtrl",PopoverInvitationController).controller("ESNewInvitationModalCtrl",NewInvitationModalController),ViewSubscriptionsController.$inject=["$scope","$q","$ionicHistory","csWot","csWallet","UIUtils","ModalUtils","esSubscription"],ModalEmailSubscriptionsController.$inject=["$scope","Modals","csSettings","esHttp","csWot","parameters"],angular.module("cesium.es.subscription.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_subscriptions",{cache:!1,url:"/wallet/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{auth:!0,minData:!0}}).state("app.edit_subscriptions_by_id",{cache:!1,url:"/wallets/:id/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{login:!0,minData:!0}})}]).controller("ViewSubscriptionsCtrl",ViewSubscriptionsController).controller("ModalEmailSubscriptionsCtrl",ModalEmailSubscriptionsController),ESDocumentLookupController.$inject=["$scope","$ionicPopover","$location","$timeout","csSettings","csWallet","UIUtils","esHttp","esDocument"],angular.module("cesium.es.document.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.document_search",{url:"/data/search/:index/:type?q",views:{menuContent:{templateUrl:"plugins/es/templates/document/lookup.html",controller:"ESDocumentLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESDocumentLookupCtrl",ESDocumentLookupController),angular.module("cesium.graph.plugin",["cesium.graph.services","cesium.graph.common.controllers","cesium.graph.blockchain.controllers","cesium.graph.network.controllers","cesium.graph.currency.controllers","cesium.graph.account.controllers","cesium.graph.docstats.controllers","cesium.graph.synchro.controllers"]),angular.module("cesium.graph.services",["cesium.graph.color.services","cesium.graph.data.services"]),angular.module("cesium.graph.data.services",["cesium.wot.services","cesium.es.http.services","cesium.es.wot.services"]).factory("gpData",["$rootScope","$q","$timeout","esHttp","BMA","csWot","csCache","esWot",function(e,t,n,i,a,o,r,s){"ngInject";function l(e,t){return t<=0?e:e*Math.pow(10,t)}function c(e){return e=e||{},e.maxRangeSize=e.maxRangeSize||30,e.defaultTotalRangeCount=e.defaultTotalRangeCount||2*e.maxRangeSize,e.rangeDuration=e.rangeDuration||"day",e.endTime=e.endTime||moment().utc().add(1,e.rangeDuration).unix(),e.startTime=e.startTime||moment.unix(e.endTime).utc().subtract(e.defaultTotalRangeCount,e.rangeDuration).unix(),e.firstBlockTime&&e.startTime<e.firstBlockTime&&(e.startTime=e.firstBlockTime),e}var u=r.get("gpData-currency-",r.constants.SHORT),d={node:{},wot:{},blockchain:{},docstat:{},synchro:{execution:{}},raw:{block:{search:i.post("/:currency/block/_search")},blockstat:{search:i.post("/:currency/blockstat/_search")},movement:{search:i.post("/:currency/movement/_search")},user:{event:i.post("/user/event/_search?pretty")},docstat:{search:i.post("/docstat/record/_search")},synchro:{search:i.post("/:currency/synchro/_search")}},regex:{}};return d.blockchain.countByIssuer=function(e){var t={size:0,aggs:{blocksByIssuer:{terms:{field:"issuer",size:0}}}};return d.raw.block.search(t,{currency:e}).then(function(e){var t=e.aggregations;if(t.blocksByIssuer&&t.blocksByIssuer.buckets&&t.blocksByIssuer.buckets.length){var n={blockCount:e.hits.total};return n.data=(t.blocksByIssuer.buckets||[]).reduce(function(e,t){return e.concat(t.doc_count)},[]),n.issuers=(t.blocksByIssuer.buckets||[]).reduce(function(e,t){return e.concat({pubkey:t.key})},[]),o.extendAll(n.issuers).then(function(){return n.labels=n.issuers.reduce(function(e,t){return e.concat(t.name||t.uid||t.pubkey.substr(0,8))},[]),n})}})},d.blockchain.withDividend=function(e,n){n=n||{};var i=!angular.isDefined(n.withCache)||n.withCache,o=[e,JSON.stringify(n)].join("-");if(i){var r=u.get(o);if(r){if(!r.blocks){var s=t.defer();return r.then(function(e){return s.resolve(e),e}),s.promise}return console.debug("[graph] monetaryMass for ["+e+"] found in cache"),t.when(r)}}var c={query:{filtered:{filter:{bool:{must:[{exists:{field:"dividend"}}]}}}},size:n.size||1e4,from:n.from||0,_source:["medianTime","number","dividend","monetaryMass","membersCount","unitbase"],sort:{medianTime:"asc"}},p=t.all([n.withCurrent?a.blockchain.current().catch(function(e){if(!e||e.ucode!=a.errorCodes.NO_CURRENT_BLOCK)throw e}):t.when(),d.raw.block.search(c,{currency:e})]).then(function(e){var t=e[0];if(e=e[1],e.hits.total&&e.hits.hits.length){var n={};if(n.blocks=e.hits.hits.reduce(function(e,t){var n=t._source;return n.dividend=l(n.dividend,n.unitbase),delete n.unitbase,e.concat(n)},[]),t){var i=n.blocks.length&&t.medianTime-n.blocks[n.blocks.length-1].medianTime;i&&i>=3600&&(t.dividend=l(t.dividend,t.unitbase),delete t.unitbase,n.blocks.push(t))}return n.times=n.blocks.reduce(function(e,t){return e.concat(t.medianTime)},[]),u.put(o,n),n}});return u.put(o,p),p},d.blockchain.txCount=function(e,n){n=c(n);for(var i=[],a=moment.unix(n.startTime).utc().startOf(n.rangeDuration),o=moment.unix(n.endTime).utc().startOf(n.rangeDuration),r=[];a.isBefore(o);){r.push({from:a.unix(),to:a.add(1,n.rangeDuration).unix()});if(r.length===n.maxRangeSize||!a.isBefore(o)){var s={size:0,aggs:{tx:{range:{field:"medianTime",ranges:r},aggs:{txCount:{stats:{field:"txCount"}},txAmount:{stats:{field:"txAmount"}}}}}};n.issuer&&(s.query={bool:{filter:{term:{issuer:n.issuer}}}}),r=[],10==i.length?(console.error("Too many parallel jobs!"),a=moment.unix(n.endTime).utc()):i.push(d.raw.blockstat.search(s,{currency:e}).then(function(e){var t=e.aggregations;if(t.tx&&t.tx.buckets&&t.tx.buckets.length)return(t.tx.buckets||[]).reduce(function(e,t){return e.concat({from:t.from,to:t.to,count:t.txCount.sum||0,amount:t.txAmount.sum||0,avgByBlock:Math.round(100*t.txCount.avg)/100,maxByBlock:t.txCount.max})},[])}))}}return t.all(i).then(function(e){return e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e=_.sortBy(e,"from"),{count:_.pluck(e,"count"),avgByBlock:_.pluck(e,"avgByBlock"),maxByBlock:_.pluck(e,"maxByBlock"),amount:e.reduce(function(e,t){return e.concat(t.amount/100)},[]),times:_.pluck(e,"from")}})},d.node.blockCount=function(e,t){var n={size:0,query:{bool:{filter:{term:{issuer:t}}}}};return d.raw.block.search(n,{currency:e}).then(function(e){return e.hits.total})},d.raw.movement.getByRange=function(e,t,n){if(!t)throw new Error("Missing 'pubkey' argument!");var i={size:0,query:{bool:{should:[{term:{recipient:t}},{term:{issuer:t}}]}},aggs:{tx:{range:{field:"medianTime",ranges:n},aggs:{received:{filter:{term:{recipient:t}},aggs:{received_stats:{stats:{field:"amount"}}}},sent:{filter:{term:{issuer:t}},aggs:{sent_stats:{stats:{field:"amount"}}}}}}}};return d.raw.movement.search(i,{currency:e}).then(function(e){var t=e.aggregations;if(t.tx&&t.tx.buckets&&t.tx.buckets.length)return(t.tx.buckets||[]).reduce(function(e,t){var n=t.sent.sent_stats,i=t.received.received_stats;return e.concat({from:t.from,to:t.to,sent:n.sum?-n.sum/100:0,received:i.sum?i.sum/100:0})},[])})},d.raw.movement.getUds=function(e,t,n){var i={size:0,query:{bool:{should:[{exists:{field:"dividend"}}]}},aggs:{ud:{range:{field:"medianTime",ranges:t},aggs:{ud_stats:{stats:{field:"dividend"}},unitbase_stats:{stats:{field:"unitbase"}}}}}};return d.raw.block.search(i,{currency:e}).then(function(e){var t=e.aggregations;if(t.ud&&t.ud.buckets&&t.ud.buckets.length)return(t.ud.buckets||[]).reduce(function(e,t){return e[n[t.from]]=l(t.ud_stats.sum,t.unitbase_stats.min)/100,e},{})})},d.blockchain.movement=function(e,n){function i(e){if(l.push(e),E&&E.joinTime<e.to){var t={from:Math.max(E.joinTime,e.from),to:Math.min(E.leaveTime,e.to)};for(u.push(t),p[t.from]=e.from;E&&E.leaveTime&&E.leaveTime<e.to;)E=m.pop()}}n=c(n),n.withUD=!angular.isDefined(n.withUD)||n.withUD;var a=[];if(n.withUD&&!n.memberships)return s.memberships(n.pubkey).then(function(t){return n.memberships=t||[],d.blockchain.movement(e,n)});var o=moment.unix(n.startTime).utc().startOf(n.rangeDuration),r=moment.unix(n.endTime).utc().startOf(n.rangeDuration),l=[],u=[],p={},m=angular.copy(n.memberships).reverse(),E=m.pop();for(i({from:0,to:o.unix()});o.isBefore(r);){i({from:o.unix(),to:o.add(1,n.rangeDuration).unix()});(!a.length&&l.length==n.maxRangeSize+1||a.length&&l.length==n.maxRangeSize||!o.isBefore(r))&&(u.length?a.push(t.all([d.raw.movement.getUds(e,u,p),d.raw.movement.getByRange(e,n.pubkey,l)]).then(function(e){var t=e[0];return e=e[1],e.forEach(function(e){e.ud=t[e.from]||0}),e})):a.push(d.raw.movement.getByRange(e,n.pubkey,l).then(function(e){return e.forEach(function(e){e.ud=0}),e})),l=[])}
-return t.all(a).then(function(e){if(e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e.length){e=_.sortBy(e,"from");var t=e.splice(0,1)[0],n=t.received+t.sent+t.ud;return{times:_.pluck(e,"from"),ud:_.pluck(e,"ud"),sent:_.pluck(e,"sent"),received:_.pluck(e,"received"),balance:e.reduce(function(e,t){return n+=t.received+t.sent+t.ud,e.concat(n)},[])}}})},d.wot.certifications=function(e){return e=c(e),o.load(e.pubkey).then(function(t){if(t){var n={};_.forEach(t.given_cert||[],function(t){var i=moment.unix(t.time).utc().startOf(e.rangeDuration).unix();n[i]=n[i]||{time:i,given:0,received:0},n[i].given++}),_.forEach(t.received_cert||[],function(t){var i=moment.unix(t.time).utc().startOf(e.rangeDuration).unix();n[i]=n[i]||{time:i,given:0,received:0},n[i].received++}),n=_.sortBy(_.values(n),"time");var i={times:_.pluck(n,"time"),deltaGiven:_.pluck(n,"given"),deltaReceived:_.pluck(n,"received")},a=0;return i.given=i.deltaGiven.reduce(function(e,t){return a+=t,e.concat(a)},[]),a=0,i.received=i.deltaReceived.reduce(function(e,t){return a+=t,e.concat(a)},[]),i}})},d.wot.memberships=function(e){e=e||{};var t={size:1e3,query:{bool:{filter:[{term:{recipient:e.pubkey}},{terms:{code:["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"]}}]}},sort:[{time:{order:"asc"}}],_source:["code","time"]};return d.raw.user.event(t).then(function(e){if(e.hits&&e.hits.total){var t,n=e.hits.hits.reduce(function(e,n){var i="MEMBER_JOIN"==n._source.code||"MEMBER_ACTIVE"==n._source.code;return i&&!t?t=n._source.time:!i&&t&&(e=e.concat({joinTime:t,leaveTime:n._source.time}),t=0),e},[]);return t&&n.push({joinTime:t,leaveTime:moment().utc().unix()}),n}})},d.docstat.get=function(e){e=c(e);for(var n=[],i=moment.unix(e.startTime).utc().startOf(e.rangeDuration),a=moment.unix(e.endTime).utc().startOf(e.rangeDuration),o=[];i.isBefore(a);){o.push({from:i.unix(),to:i.add(1,e.rangeDuration).unix()});if(o.length===e.maxRangeSize||!i.isBefore(a)){var r={size:0,aggs:{range:{range:{field:"time",ranges:o},aggs:{index:{terms:{field:"index",size:0},aggs:{type:{terms:{field:"indexType",size:0},aggs:{max:{max:{field:"count"}}}}}}}}}};o=[];var s={};10==n.length?(console.error("Too many parallel jobs!"),i=moment.unix(e.endTime).utc()):n.push(d.raw.docstat.search(r).then(function(e){var t=e.aggregations;return(t.range&&t.range.buckets||[]).reduce(function(e,t){var n={from:t.from,to:t.to};return _.forEach(t.index&&t.index.buckets||[],function(e){var t=e.key;_.forEach(e.type&&e.type.buckets||[],function(e){var i=t+"_"+e.key;n[i]=e.max.value,s[i]||(s[i]=!0)})}),e.concat(n)},[])}))}}return t.all(n).then(function(e){return e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e=_.sortBy(e,"from"),_.keys(s).reduce(function(t,n){return t[n]=_.pluck(e,n),t},{times:_.pluck(e,"from")})})},d.synchro.execution.get=function(e){e=c(e);for(var n=[],i=moment.unix(e.startTime).utc().startOf(e.rangeDuration),a=moment.unix(e.endTime).utc().startOf(e.rangeDuration),o=[];i.isBefore(a);){o.push({from:i.unix(),to:i.add(1,e.rangeDuration).unix()});if(o.length===e.maxRangeSize||!i.isBefore(a)){var r={size:0,aggs:{range:{range:{field:"time",ranges:o},aggs:{api:{terms:{field:"api",size:0},aggs:{peer_count:{cardinality:{field:"peer"}}}},duration:{sum:{field:"executionTime"}},result:{nested:{path:"result"},aggs:{inserts:{sum:{field:"result.inserts"}},updates:{sum:{field:"result.updates"}},deletes:{sum:{field:"result.deletes"}}}}}}}};o=[];var s={};10==n.length?(console.error("Too many parallel jobs!"),i=moment.unix(e.endTime).utc()):n.push(d.raw.synchro.search(r,{currency:e.currency}).then(function(e){var t=e.aggregations;return(t.range&&t.range.buckets||[]).reduce(function(e,t){var n={from:t.from,to:t.to,inserts:t.result.inserts.value,updates:t.result.inserts.value,deletes:t.result.deletes.value,duration:t.duration.value};return _.forEach(t.api&&t.api.buckets||[],function(e){n[e.key]=e.peer_count&&e.peer_count.value||0,s[e.key]||(s[e.key]=!0)}),e.concat(n)},[])}))}}return t.all(n).then(function(e){e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e=_.sortBy(e,"from");var t={times:_.pluck(e,"from"),inserts:_.pluck(e,"inserts"),updates:_.pluck(e,"updates"),deletes:_.pluck(e,"deletes"),duration:_.pluck(e,"duration")};return _.keys(s).forEach(function(n){t[n]=_.pluck(e,n)}),t})},d}]),angular.module("cesium.graph.color.services",[]).factory("gpColor",function(){"ngInject";var e={css2Rgb:{white:[255,255,255],assertive:[239,71,58],calm:[17,193,243],positive:[56,126,245],balanced:[51,205,95],energized:[255,201,0],royal:[136,106,234],gray:[150,150,150],stable:[248,248,248]}},t={scale:{}};return t.scale.custom=function(e,t,n,i){function a(e){switch(e){case 0:return 0;case 1:return-1;case 2:return 0;case 3:return 1}}t=t>0&&t||.55;for(var o=Math.round(e/2.5),r=n&&3==n.length?angular.copy(n):[255,0,0],s=i&&3==i.length?angular.copy(i):[0,2,3],l=n?[Math.round(255/o),Math.round(255/o),Math.round(255/o)]:[Math.round((r[0]-50)/o),Math.round((255-r[1])/o),Math.round((255-r[2])/o)],c=[a(s[0]),a(s[1]),a(s[2])],u=[0,0,0],d=[],p=0;p<e;p++){for(var m=0;m<3;m++)r[m]+=c[m]*l[m],u[m]++,((r[m]<=0||r[m]>=255)&&0!==c[m]||0===c[m]&&u[m]==o)&&(r[m]<=0?r[m]=0:r[m]>=255&&(r[m]=255),s[m]=(s[m]+1)%4,c[m]=a(s[m]),u[m]=0);d.push("rgba("+r[0]+","+r[1]+","+r[2]+","+t+")")}return d},t.scale.default=function(){return t.scale.custom(25)},t.scale.fix=function(e,n){return Array.apply(null,Array(e||25)).map(String.prototype.valueOf,n||t.rgba.calm(.5))},t.rgba=_.mapObject(e.css2Rgb,function(e){var t="rgba("+e.join(",")+",";return function(n){return!n||n<0?"rgb("+e.join(",")+")":t+n+")"}}),t.rgba.translucent=function(){return"rgb(0,0,0,0)"},t.constants=e,t}),GpCurrencyAbstractController.$inject=["$scope","$filter","$ionicPopover","$ionicHistory","$state","csSettings","csCurrency","esHttp","UIUtils"],angular.module("cesium.graph.common.controllers",["cesium.services"]).controller("GpCurrencyAbstractCtrl",GpCurrencyAbstractController),GpBlockchainTxCountController.$inject=["$scope","$controller","$q","$state","$filter","$translate","gpData","gpColor"],GpBlockchainIssuersController.$inject=["$scope","$controller","$q","$state","$translate","gpColor","gpData"],angular.module("cesium.graph.blockchain.controllers",["chart.js","cesium.services","cesium.graph.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.blockchain_stats",{url:"/blockchain/stats?currency&stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/blockchain/view_stats.html"}}}).state("app.currency_blockchain_stats",{url:"/:currency/blockchain/stats",views:{menuContent:{templateUrl:"plugins/graph/templates/blockchain/view_stats.html"}}})}]).controller("GpBlockchainTxCountCtrl",GpBlockchainTxCountController).controller("GpBlockchainIssuersCtrl",GpBlockchainIssuersController),GpNetworkViewExtendController.$inject=["$scope","PluginService","esSettings"],GpPeerViewExtendController.$inject=["$scope","$timeout","PluginService","esSettings","csCurrency","gpData"],angular.module("cesium.graph.network.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.network",{points:{buttons:{templateUrl:"plugins/graph/templates/network/view_network_extend.html",controller:"GpNetworkViewExtendCtrl"}}}).extendState("app.view_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_peer_extend.html",controller:"GpPeerViewExtendCtrl"}}}),e.state("app.view_peer_stats",{url:"/network/peer/:pubkey/stats",views:{menuContent:{templateUrl:"plugins/graph/templates/network/view_peer_stats.html",controller:"GpBlockchainTxCountCtrl"}}}))}]).controller("GpNetworkViewExtendCtrl",GpNetworkViewExtendController).controller("GpPeerViewExtendCtrl",GpPeerViewExtendController),GpCurrencyViewExtendController.$inject=["$scope","PluginService","UIUtils","esSettings"],GpCurrencyMonetaryMassController.$inject=["$scope","$controller","$q","$state","$translate","UIUtils","gpColor","gpData","$filter","csSettings"],GpCurrencyDUController.$inject=["$scope","$q","$controller","$translate","gpColor","gpData","$filter","UIUtils"],GpCurrencyMembersCountController.$inject=["$scope","$controller","$q","$state","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.currency.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";e.state("app.currency.tab_parameters_stats",{url:"/parameters/stats",views:{"tab-parameters":{templateUrl:"plugins/graph/templates/currency/tabs/tab_parameters_stats.html"}}}).state("app.currency.tab_wot_stats",{url:"/community/stats",views:{"tab-wot":{templateUrl:"plugins/graph/templates/currency/tabs/tab_wot_stats.html",controller:"GpCurrencyMembersCountCtrl"}}}).state("app.currency.tab_network_stats",{url:"/network/stats",views:{"tab-network":{templateUrl:"plugins/graph/templates/currency/tabs/tab_network_stats.html"}}}).state("app.currency.tab_blocks_stats",{url:"/blocks/stats",views:{"tab-blocks":{templateUrl:"plugins/graph/templates/currency/tabs/tab_blocks_stats.html"}}}).state("app.currency_stats_lg",{url:"/currency/stats/lg?hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/currency/view_stats_lg.html"}}}),n.plugins&&n.plugins.es&&t.extendStates(["app.currency_name","app.currency","app.currency_name_lg","app.currency_lg"],{points:{"parameters-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"},"wot-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"},"network-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"}}}).extendStates(["app.currency.tab_blocks"],{points:{buttons:{templateUrl:"plugins/graph/templates/currency/tab_blocks_extend.html",controller:"GpCurrencyViewExtendCtrl"}}})}]).controller("GpCurrencyViewExtendCtrl",GpCurrencyViewExtendController).controller("GpCurrencyMonetaryMassCtrl",GpCurrencyMonetaryMassController).controller("GpCurrencyDUCtrl",GpCurrencyDUController).controller("GpCurrencyMembersCountCtrl",GpCurrencyMembersCountController),GpExtendController.$inject=["$scope","PluginService","esSettings","$state","csWallet"],GpAccountBalanceController.$inject=["$scope","$controller","$q","$state","$filter","$translate","csWot","gpData","gpColor","csWallet"],GpAccountSumTxController.$inject=["$scope","$controller","$filter","$state","csTx","gpColor"],GpAccountCertificationController.$inject=["$scope","$controller","$q","$state","$filter","$translate","gpData","gpColor","csWallet"],angular.module("cesium.graph.account.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.view_wallet_tx",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_wallet_tx_extend.html",controller:"GpExtendCtrl"}}}).extendState("app.view_wallet_tx_by_id",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_wallet_tx_extend.html",controller:"GpExtendCtrl"}}}).extendState("app.wot_identity",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_identity_extend.html",controller:"GpExtendCtrl"}}}).extendStates(["app.wot_identity_tx_uid","app.wot_identity_tx_uid_lg"],{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_identity_tx_extend.html",controller:"GpExtendCtrl"}}}),e.state("app.view_wallet_stats",{url:"/wallet/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}},data:{auth:!0}}).state("app.view_wallet_stats_by_id",{url:"/wallets/:id/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}},data:{auth:!0}}).state("app.wot_identity_stats",{url:"/wot/:pubkey/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}}}))}]).controller("GpExtendCtrl",GpExtendController).controller("GpAccountBalanceCtrl",GpAccountBalanceController).controller("GpAccountSumTxCtrl",GpAccountSumTxController).controller("GpAccountCertificationCtrl",GpAccountCertificationController),GpDocStatsController.$inject=["$scope","$state","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.docstats.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";e.state("app.doc_stats_lg",{url:"/data/stats?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}});n.plugins&&n.plugins.es}]).controller("GpDocStatsCtrl",GpDocStatsController),GpSynchroController.$inject=["$scope","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.synchro.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";e.state("app.doc_synchro_lg",{url:"/data/synchro?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}});n.plugins&&n.plugins.es}]).controller("GpSynchroCtrl",GpSynchroController),angular.module("cesium.map.plugin",["ui-leaflet","cesium.map.services","cesium.map.wot.controllers","cesium.map.registry.controllers","cesium.map.network.controllers","cesium.map.user.controllers","cesium.map.settings.controllers","cesium.map.help.controllers"]).config(function(){"ngInject";L.AwesomeMarkers.Icon.prototype.options.prefix="ion"}),angular.module("cesium.map.services",["cesium.map.wot.services","cesium.map.registry.services","cesium.map.utils.services"]),angular.module("cesium.map.wot.services",["cesium.services"]).factory("mapWot",["$q","csHttp","esHttp","esSettings","csWot","BMA","esGeo",function(e,t,n,i,a,o,r){"ngInject";function s(e){e=e||{};var t={bool:{}};if(e.searchAddress?t.bool.should=[{exists:{field:"geoPoint"}},{exists:{field:"city"}}]:t.bool.must=[{exists:{field:"geoPoint"}}],e.bounds&&e.bounds.northEast&&e.bounds.southWest){var n={geoPoint:{top_left:{lat:Math.max(Math.min(e.bounds.northEast.lat,90),-90),lon:Math.max(Math.min(e.bounds.southWest.lng,180),-180)},bottom_right:{lat:Math.max(Math.min(e.bounds.southWest.lat,90),-90),lon:Math.max(Math.min(e.bounds.northEast.lng,180),-180)}}};console.debug("[map] [wot] Filtering on bounds: ",e.bounds),t.bool.must=t.bool.must||[],t.bool.must.push({geo_bounding_box:n})}return t}function l(t){t=t||{},t.from=t.from||0,t.size=t.size||d.DEFAULT_LOAD_SIZE,t.searchAddress=r.google.isEnable()&&(!angular.isDefined(t.searchAddress)||t.searchAddress),t.fields=t.fields||{},t.fields.description=!!angular.isDefined(t.fields.description)&&t.fields.description;var n={query:s(t),from:0,size:t.size,_source:t.fields.description?p.profile.concat("description"):p.profile},i=u.raw.profile.search;return e.all([i(n),o.wot.member.uids(),o.wot.member.pending().then(function(e){return e.memberships&&e.memberships.length?e.memberships:[]})]).then(function(a){var o=a[1],r=a[2],a=a[0];if(!a.hits||!a.hits.total)return[];r=r.reduce(function(e,t){if("IN"==t.membership&&!o[t.pubkey]){var n={uid:t.uid,pubkey:t.pubkey,block:t.blockNumber,blockHash:t.blockHash,pending:!0},i=e[t.pubkey];if(i&&n.block>i.block)return e;e[n.pubkey]=n}return e},{});var s=[c(t,o,r,a)];for(n.from+=n.size;n.from<a.hits.total;)s.push(i(angular.copy(n)).then(function(e){return e.hits&&e.hits.hits.length?c(t,o,r,e):[]})),n.from+=n.size;return e.all(s).then(function(e){return e.reduce(function(e,t){return e.concat(t)},[])})})}function c(t,i,a,o){var s=new RegExp("[,]"),l=[],c=o.hits.hits.reduce(function(e,o){var r=o._id,c=i[r],u=c&&{uid:c}||a[r]||{};if(u.pubkey=r,u.index=o._index,u.city=o._source.city,u.address=o._source.address,u.geoPoint=o._source.geoPoint,u.geoPoint&&u.geoPoint.lat&&u.geoPoint.lon)u.geoPoint.lat&&"string"==typeof u.geoPoint.lat&&(u.geoPoint.lat=parseFloat(u.geoPoint.lat.replace(s,"."))),u.geoPoint.lon&&"string"==typeof u.geoPoint.lon&&(u.geoPoint.lon=parseFloat(u.geoPoint.lon.replace(s,".")));else{if(!t.searchAddress||!u.city)return e;u.searchAddress=u.city&&(o._source.address?o._source.address+", ":"")+u.city,l.push(u)}return u.avatar=n.image.fromHit(o,"avatar"),u.name=o._source.title,u.name&&u.name.length>30&&(u.name=u.name.substr(0,27)+"..."),u.description=o._source.description&&n.util.parseAsHtml(o._source.description),u.geoPoint?e.concat(u):e},[]);if(l.length){var u=Date.now();console.debug("[map] [wot] Search positions of {0} addresses...".format(l.length));var d=0;return e.all(l.reduce(function(e,t){return t.city?e.concat(r.google.searchByAddress(t.searchAddress).then(function(e){e&&e.length&&(t.geoPoint=e[0],t.city==t.searchAddress&&(t.geoPoint.lon+=Math.random()/1e3,t.geoPoint.lat+=Math.random()/1e3),delete t.searchAddress,c.push(t),d++)}).catch(function(){})):e},[])).then(function(){return console.debug("[map] [wot] Resolved {0}/{1} addresses in {2}ms".format(d,l.length,Date.now()-u)),c})}return e.when(c)}var u=this,d={DEFAULT_LOAD_SIZE:1e3},p={min:["title","geoPoint"],profile:["title","geoPoint","avatar._content_type","address","city"]};return u.raw={profile:{search:n.post("/user/profile/_search"),mixedSearch:n.post("/user,page,group/profile,record/_search")}},{load:l}}]),angular.module("cesium.map.registry.services",["cesium.services"]).factory("mapRegistry",["$q","csHttp","esHttp","esSettings","csWot","BMA","esGeo",function(e,t,n,i,a,o,r){"ngInject";function s(e){e=e||{};var t={bool:{}};return e.searchAddress?t.bool.should=[{exists:{field:"geoPoint"}},{exists:{field:"city"}}]:t.bool.must=[{exists:{field:"geoPoint"}}],e.bounds&&e.bounds.northEast&&e.bounds.southWest&&(t.bool.should=t.bool.should||{},t.bool.should.geo_bounding_box={geoPoint:{top_left:{lat:Math.max(Math.min(e.bounds.northEast.lat,90),-90),lon:Math.max(Math.min(e.bounds.southWest.lng,180),-180)},bottom_right:{lat:Math.max(Math.min(e.bounds.southWest.lat,90),-90),lon:Math.max(Math.min(e.bounds.northEast.lng,180),-180)}}}),t}function l(t){t=t||{},t.from=t.from||0,t.size=t.size||d.DEFAULT_LOAD_SIZE,t.searchAddress=r.google.isEnable()&&(!angular.isDefined(t.searchAddress)||t.searchAddress),t.fields=t.fields||{},t.fields.description=!angular.isDefined(t.fields.description)||t.fields.description;var n={query:s(t),from:0,size:t.size,_source:t.fields.description?p.record.concat("description"):p.record},i=u.raw.profile.search;return i(n).then(function(a){if(!a.hits||!a.hits.total)return[];var o=[c(t,a)];for(n.from+=n.size;n.from<a.hits.total;)o.push(i(angular.copy(n)).then(function(e){return e.hits&&e.hits.hits.length?c(t,e):[]})),n.from+=n.size;return e.all(o).then(function(e){return e.reduce(function(e,t){return e.concat(t)},[])})})}function c(t,i){var a=new RegExp("[,]"),o=[],s=i.hits.hits.reduce(function(e,i){var r=i._source.issuer,s={};if(s.issuer=r,s.pubkey=i._source.pubkey||s.issuer,s.id=i._id,s.index=i._index,s.type=i._source.type,s.category=i._source.category,s.category&&delete s.category.parent,s.city=i._source.city,s.address=i._source.address,s.geoPoint=i._source.geoPoint,s.geoPoint&&s.geoPoint.lat&&s.geoPoint.lon)s.geoPoint.lat&&"string"==typeof s.geoPoint.lat&&(s.geoPoint.lat=parseFloat(s.geoPoint.lat.replace(a,"."))),s.geoPoint.lon&&"string"==typeof s.geoPoint.lon&&(s.geoPoint.lon=parseFloat(s.geoPoint.lon.replace(a,".")));else{if(!t.searchAddress||!s.city)return e;s.searchAddress=s.city&&(i._source.address?i._source.address+", ":"")+s.city,o.push(s)}return s.avatar=n.image.fromHit(i,"avatar"),s.name=i._source.title,s.name&&s.name.length>30&&(s.name=s.name.substr(0,27)+"..."),s.description=i._source.description&&n.util.parseAsHtml(i._source.description),s.geoPoint?e.concat(s):e},[]);if(o.length){var l=Date.now();console.debug("[map] [registry] Search positions of {0} addresses...".format(o.length));var c=0;return e.all(o.reduce(function(e,t){return t.city?e.concat(r.google.searchByAddress(t.searchAddress).then(function(e){e&&e.length&&(t.geoPoint=e[0],t.city==t.searchAddress&&(t.geoPoint.lon+=Math.random()/1e3,t.geoPoint.lat+=Math.random()/1e3),delete t.searchAddress,s.push(t),c++)}).catch(function(){})):e},[])).then(function(){return console.debug("[map] [registry] Resolved {0}/{1} addresses in {2}ms".format(c,o.length,Date.now()-l)),s})}return e.when(s)}var u=this,d={DEFAULT_LOAD_SIZE:1e3},p={record:["title","geoPoint","avatar._content_type","address","city","type","pubkey","issuer","category"]};return u.raw={profile:{search:n.post("/page/record/_search"),mixedSearch:n.post("/user,page,group/profile,record/_search")}},{load:l}}]),angular.module("cesium.map.utils.services",["cesium.services","ui-leaflet"]).factory("MapUtils",["$timeout","$q","$translate","$window","leafletData","csConfig","csSettings","esGeo","UIUtils","leafletHelpers",function(e,t,n,i,a,o,r,s,l,c){"ngInject";function u(e){e=angular.merge({center:angular.copy(I.DEFAULT_CENTER),cache:!1,defaults:{scrollWheelZoom:!0,tileLayerOptions:{attribution:'© <a target="_blank" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}},layers:{baselayers:{osm:{name:"OpenStreetMap",type:"xyz",url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",layerOptions:{subdomains:["a","b","c"],attribution:'&copy; <a target="_blank" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',continuousWorld:!0}},google:{name:"Google map",type:"xyz",url:"https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key="+h,layerOptions:{subdomains:["mt0","mt1","mt2","mt3"],attribution:'&copy; <a target="_blank"  href="https://www.google.com/intl/fr_fr/help/terms_maps.html">Google</a>',continuousWorld:!0}}}},controls:{custom:[]}},e||{}),e.cache&&v.cache[e.cache]&&(console.debug("[map] Restoring map from cache :",v.cache[e.cache]),e=angular.merge(e,v.cache[e.cache]));var t;return e.layers.overlays&&(t=_.keys(e.layers.overlays).reduce(function(t,n){return t.concat(e.layers.overlays[n].name)},[]),n(t).then(function(t){_.keys(e.layers.overlays||{}).forEach(function(n){e.layers.overlays[n].name=t[e.layers.overlays[n].name]})})),e}function d(n,i){return E(i,n)?t.when():e(function(){n.invalidateSize(),n._resetView(i,i.zoom,!0)},300)}function p(e,t,n){if(n=n||{},!t||!n.layers||!e)throw"Illegal arguments";if(n.cache){if(n.layers.overlays){var o=_.keys(n.layers.overlays);v.cache[n.cache]||(v.cache[n.cache]={center:n.center,bounds:n.bounds,layers:angular.copy(n.layers)}),a.getMap(t).then(function(){_(i.document.querySelectorAll("#{0} .leaflet-control-layers-overlays input[type=checkbox]".format(t))).forEach(function(e,t){var i=o[t],a=n.layers.overlays[i].visible;e.addEventListener("change",function(e){a=!a,v.cache[n.cache].layers.overlays[i].visible=a})})})}e.$on("$ionicView.leave",function(){v.cache[n.cache].center=n.center,v.cache[n.cache].bounds=n.bounds})}}function m(e){if(e){var t;if(e.lat&&(t={},t.lat=parseFloat(e.lat)),(e.lng||e.lon)&&(t=t||{},t.lng=parseFloat(e.lng||e.lon)),e.zoom&&(t=t||{},t.zoom=parseFloat(e.zoom)),t)return c.isValidCenter(t)||(t=angular.merge({},I.DEFAULT_CENTER,t)),t}}function E(e,t){return c.isSameCenterOnMap(e,t)}function b(e){var t=I.DEFAULT_CENTER;return!(!e.lat||!e.lng||t.lat.toFixed(4)!==e.lat.toFixed(4)||t.lng.toFixed(4)!==e.lng.toFixed(4)||t.zoom!==e.zoom)}function g(e,t){if(!e||!t)throw"Illegal arguments";if(e._container)e._container.id=t;else{var n=e.onAdd;e.onAdd=function(e){var i=n.call(this,e);return i.id=t,i}}}function f(e){e=e||{},e.initial=!!angular.isDefined(e.initial)&&e.initial,e.marker=!!angular.isDefined(e.marker)&&e.marker,e.propertyName=angular.isDefined(e.propertyName)?e.propertyName:"title",e.position=angular.isDefined(e.position)?e.position:"topleft",e.zoom=angular.isDefined(e.zoom)?e.zoom:I.LOCALIZE_ZOOM,e.markerLocation=!angular.isDefined(e.markerLocation)||e.markerLocation;var t=n(["MAP.COMMON.SEARCH_DOTS","COMMON.SEARCH_NO_RESULT"]);return{addTo:function(n){t.then(function(t){var i=L.control.search(angular.merge(e,{textPlaceholder:t["MAP.COMMON.SEARCH_DOTS"],textErr:t["COMMON.SEARCH_NO_RESULT"]}));e.id&&g(i,e.id),i.addTo(n)})}}}function T(e){return e=e||{},L.easyButton({position:"topleft",type:"replace",leafletClasses:!0,states:[{stateName:"locate-me",onClick:function(e,t){s.point.current().then(function(e){t.setView({lat:e.lat,lng:e.lon},I.LOCALIZE_ZOOM)}).catch(function(e){console.error(e),l.alert.error("MAP.ERROR.LOCALIZE_ME_FAILED")})},title:e.title,icon:"icon ion-android-locate"}]})}var h=o.plugins&&o.plugins.es&&o.plugins.es.googleApiKey,I={locations:{FRANCE:{lat:46.5588603,lng:4.229736328124999,zoom:6}},LOCALIZE_ZOOM:15},v={cache:{}};return I.DEFAULT_CENTER=r.data&&r.data.plugins&&r.data.plugins.map&&r.data.plugins.map.center||I.locations.FRANCE,{map:u,updateCenter:d,center:{get:m,isSame:E,isDefault:b},control:{search:f,localizeMe:T,setId:g},cache:{bind:p},constants:I}}]),MapWotViewController.$inject=["$scope","$filter","$templateCache","$interpolate","$timeout","$location","$translate","$q","$controller","ionicReady","leafletData","UIUtils","csSettings","csWallet","MapUtils","mapWot"],angular.module("cesium.map.wot.controllers",["cesium.services","cesium.map.services","cesium.map.help.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.wot_lookup.tab_search",{points:{"nav-buttons":{template:'<button class="button button-icon button-clear" ui-sref="app.view_wot_map"><i class="icon ion-ios-location"></i></button>'}}}).extendState("app.wot_lookup_lg",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/wot/lookup_lg_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_wot_map",{url:"/wot/map?c&center",views:{menuContent:{templateUrl:"plugins/map/templates/wot/view_map.html",controller:"MapWotViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapWotViewCtrl",MapWotViewController),MapRegistryViewController.$inject=["$scope","$filter","$templateCache","$interpolate","$timeout","$location","$translate","$q","ionicReady","leafletData","UIUtils","csSettings","csWallet","MapUtils","mapRegistry"],angular.module("cesium.map.registry.controllers",["cesium.services","cesium.map.services","cesium.map.help.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.wot_lookup.tab_registry",{points:{"nav-buttons":{template:'<button class="button button-icon button-clear" ui-sref="app.view_registry_map"><i class="icon ion-ios-location"></i></button>'}}}).extendState("app.registry_lookup_lg",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/registry/lookup_lg_extend.html"}}}),e.state("app.view_registry_map",{url:"/wot/pagemap?c&center",views:{menuContent:{templateUrl:"plugins/map/templates/registry/view_map.html",controller:"MapRegistryViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapRegistryViewCtrl",MapRegistryViewController),angular.module("cesium.map.network.controllers",["cesium.services","cesium.map.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.network",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/network/lookup_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_network_map",{url:"/network/map?c",views:{menuContent:{templateUrl:"plugins/map/templates/network/view_map.html",controller:"MapNetworkViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapNetworkViewCtrl",["$scope","$controller","$q","$interpolate","$translate","$filter","$templateCache","$timeout","$location","esGeo","UIUtils","csNetwork","MapUtils","leafletData",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";angular.extend(this,t("NetworkLookupCtrl",{$scope:e}));var E,b,g=o("formatPubkey"),f={member:{type:"awesomeMarker",icon:"person",markerColor:"green",iconColor:"white"},mirror:{type:"awesomeMarker",icon:"radio-waves",markerColor:"green",iconColor:"white"},offline:{type:"awesomeMarker",icon:"ion-close-circled",markerColor:"red",iconColor:"white"}},T={},h=0;E='<div class="item item-peer item-icon-left no-border" ng-click="selectPeer(peer)">',E+=r.get("templates/network/item_content_peer.html"),E+="</div>",E=E.replace(/[:]rebind[:]|[:][:]/g,""),e.loading=!0,e.mapId="map-network-"+e.$id,e.helptipPrefix="helptip-"+e.mapId,e.map=p.map({cache:"map-network",layers:{overlays:{member:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.MEMBER",visible:!0},mirror:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.MIRROR",visible:!0},offline:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.OFFLINE",visible:!1}}},bounds:{},loading:!0,markers:{}});var I=e.enter;e.enter=function(t,n){if(!e.loading)return e.updateLocationHref(),I(t,n);if(n.stateParams&&n.stateParams.c){var i=n.stateParams.c.split(":");e.map.center.lat=parseFloat(i[0]),e.map.center.lng=parseFloat(i[1]),e.map.center.zoom=parseInt(i[2])}e.$watch("map.center",function(){if(!e.map.loading)return s(function(){e.updateLocationHref()},300)},!0),e.loadMap().then(function(e){return e.fire("dataloading"),I(t,n)})},e.$on("$ionicView.enter",e.enter);var v=e.computeOptions;e.computeOptions=function(){var e=v();return e.filter.online="all",e},e.loadMap=function(){return m.getMap(e.mapId).then(function(t){if(!e.map.loading)return t;L.Control.loading({position:"topright",separate:!0}).addTo(t),b=L.layerGroup({visible:!1});var n=i(r.get("plugins/map/templates/network/item_search_tooltip.html"));p.control.search({layer:b,propertyName:"title",buildTip:function(e,t){return n(t.layer.options)},moveToLocation:function(e,t,n){this.options.zoom?this._map.setView(e,this.options.zoom):this._map.panTo(e);var i=e.layer&&e.layer.options&&e.layer.options.popupMarkerId;i&&s(function(){var e=_.find(n._layers,function(e){return e.options&&e.options.id===i});e&&e.openPopup()},400)},firstTipSubmit:!0,tooltipLimit:50}).addTo(t);var a=function(e){return e.options&&e.options.icon.options.markerColor},o=L.markerClusterGroup({disableClusteringAtZoom:p.constants.LOCALIZE_ZOOM,maxClusterRadius:65,showCoverageOnHover:!1,iconCreateFunction:function(e){var t=_.countBy(e.getAllChildMarkers(),a),n=t.green?"green":t.lightgreen?"lightgreen":t.lightgray?"lightgray":"red",i=e.getChildCount(),o="marker-cluster "+n+" marker-cluster-";return o+=i<10?"small":i<100?"medium":"large",L.divIcon({html:"<div><span>"+i+"</span></div>",className:o,iconSize:new L.Point(40,40)})}});return t.eachLayer(function(e){e.addLayer&&angular.extend(e,L.featureGroup.subGroup(o))}),c.point.ip.license&&(o.getAttribution=function(){return'<a target="_blank" href="{0}">{1}</a>'.format(c.point.ip.license.url,c.point.ip.license.name)}),o.addTo(t),e.map.loading=!1,t})},e.updateView=function(t){console.debug("[map] [peers] Updating UI"),e.search.loading=!e.networkStarted||d.isBusy();var n=angular.copy(T);_.forEach(t.peers||[],function(t){if(!t.isTor()){var i=T[t.id];if(i&&e.map.markers[i])return e.updateMarker(e.map.markers[i],t),void delete n[t.id];var a=t.bma,o=t.hasValid4(a)?a.ipv4:a.dns||a.ipv6;c.point.ip.search(o).then(function(n){i=""+h++;var o=e.updateMarker({position:n,getMessageScope:function(){var n=e.$new();return n.peer=t,n},draggable:!1,focus:!1,message:E,id:i},t);e.map.markers[i]=o,T[t.id]=i;var r,s=t.dns||t.server,l=s+(t.uid?" | "+(t.name||t.uid):"")+" | "+g(t.pubkey);a.ipv4&&!(t.dns||t.server).startsWith(a.ipv4)&&(r=a.ipv4,l+=" | "+a.ipv4),b.addLayer(new L.Marker({lat:n.lat,lng:n.lng},{opacity:0,icon:L.divIcon({className:"ng-hide",iconSize:L.point(0,0)}),title:l,peer:angular.extend({ipv4:r},t),popupMarkerId:i}))}).catch(function(e){
-console.debug("No position found for address ["+o+"]",e)})}}),_.forEach(_.keys(n),function(e){delete T[e]}),_.forEach(_.values(n),function(t){delete e.map.markers[t]}),e.search.loading||m.getMap(e.mapId).then(function(t){e.loading=!1,t.fire("dataload")})},e.updateMarker=function(e,t){return e.layer=t.online?t.uid?"member":"mirror":"offline",e.icon=angular.copy(f[e.layer]),e.opacity=(t.online,1),e.title=t.dns||t.server,t.online&&!t.hasMainConsensusBlock&&(e.icon.markerColor=t.hasConsensusBlock?"lightgreen":"lightgray",e.opacity=t.hasConsensusBlock?.9:.8),e.lng||(e.lng=e.position.lng+Math.random()/1e3,e.lat=e.position.lat+Math.random()/1e3),e},e.updateLocationHref=function(t){(l.search()||{}).c&&p.center.isDefault(e.map.center)||(t=t||"{0}:{1}:{2}".format(e.map.center.lat.toFixed(4),e.map.center.lng.toFixed(4),e.map.center.zoom),l.search({c:t}).replace())},e.$on("centerUrlHash",function(t,n){if(!e.loading)return s(function(){e.updateLocationHref(n)},300)}),e.showHelpTip=function(){}}]),angular.module("cesium.map.user.controllers",["cesium.services","cesium.map.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.edit_profile",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}}).extendState("app.edit_profile_by_id",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}})}]).controller("MapEditProfileViewCtrl",["$scope","$timeout","$q","MapUtils","$translate",function(e,t,n,i,a){"ngInject";var o=[];e.mapId="map-user-profile-"+e.$id,e.map=i.map({markers:{},center:{zoom:13}}),e.loading=!0,e.mapId="map-profile-"+e.$id,e.enter=function(n,i){return e.formData&&(e.formData.title||e.formData.geoPoint)?(e.loading=!0,e.load()):t(e.enter,500)},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.load=function(){return e.formData.geoPoint&&e.formData.geoPoint.lat&&e.formData.geoPoint.lon?e.map.markers.geoPoint?(e.map.markers.geoPoint.lat=e.formData.geoPoint.lat,void(e.map.markers.geoPoint.lng=e.formData.geoPoint.lon)):a("MAP.PROFILE.MARKER_HELP").then(function(t){e.map.markers.geoPoint={message:t,lat:parseFloat(e.formData.geoPoint.lat),lng:parseFloat(e.formData.geoPoint.lon),draggable:!0,focus:!0},angular.extend(e.map.center,{lat:e.map.markers.geoPoint.lat,lng:e.map.markers.geoPoint.lng});var n=e.$watch("map.markers.geoPoint",function(){e.loading||e.map.markers.geoPoint&&e.map.markers.geoPoint.lat&&e.map.markers.geoPoint.lng&&(e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=e.map.markers.geoPoint.lat,e.formData.geoPoint.lon=e.map.markers.geoPoint.lng)},!0);o.push(n),e.ionItemClass||(e.ionItemClass="done in"),e.loading=!1}):(_.forEach(o,function(e){e()}),o=[],delete e.map.markers.geoPoint,e.loading=!1,n.when())},e.$watch("formData.geoPoint",function(){e.loading||e.load()},!0)}]),angular.module("cesium.map.settings.controllers",["cesium.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.es_settings",{points:{common:{templateUrl:"plugins/map/templates/settings/es_settings_extend.html"}}})}]),MapHelpTipController.$inject=["$scope","$controller"],angular.module("cesium.map.help.controllers",["cesium.services"]).controller("MapHelpTipCtrl",MapHelpTipController),angular.module("cesium",["ionic","ionic-material","ngMessages","ngSanitize","pascalprecht.translate","ngApi","angular-cache","angular.screenmatch","angular.bind.notifier","ImageCropper","ion-digit-keyboard","FBAngular","ngCordova","cesium.plugins","cesium.filters","cesium.config","cesium.platform","cesium.controllers","cesium.templates","cesium.translations","cesium.components","cesium.directives"]).config(["$urlRouterProvider",function(e){"ngInject";e.deferIntercept()}]).run(["$rootScope","$translate","$state","$window","$urlRouter","ionicReady","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet",function(e,t,n,i,a,o,r,s,l,c,u,d){"ngInject";u.disableChangeState();var p=!1;e.$on("$stateChangeStart",function(t,i,a,o){if(!t.defaultPrevented){if(!(!i.data||e.tour||t.currentScope.tour)){if(p)return void t.preventDefault();var r,l=a.wallet&&"default"!=a.wallet?d.children.get(a.wallet):d;return a.wallet&&!l&&console.warn("[app] Unable to find the children wallet: "+a.wallet),i.data.auth&&!l.isAuth()?(t.preventDefault(),r=i.data.minData?{minData:!0}:void 0,p=!0,d.auth(r).then(function(){return p=!1,n.go(i.name,a)}).catch(function(e){if(p=!1,"CANCELLED"===e&&!n.current.name)return n.go("app.home")})):i.data.login&&!d.isLogin()?(t.preventDefault(),r=i.data.minData?{minData:!0}:void 0,p=!0,d.login(r).then(function(){return p=!1,n.go(i.name,a)}).catch(function(e){if(p=!1,"CANCELLED"===e&&!n.current.name)return n.go("app.home")})):!i.data.login&&!i.data.auth||(r=i.data.minData?{minData:!0}:void 0,l.isDataLoaded(r))?void 0:(t.preventDefault(),r&&r.minData||s.loading.show(),l.loadData(r).then(function(){return p=!1,n.go(i.name,a)}))}}}),d.api.data.on.unauth(e,function(){n.current&&n.current.data&&n.current.data.auth&&n.go("app.home")}),e.$on("$locationChangeSuccess",function(e,t,i){if(n.current.data&&!0===n.current.data.silentLocationChange){i&&i.split("?")[0]===t.split("?")[0]&&e.preventDefault()}}),a.listen(),c.start(),o().then(function(){ionic.Platform.isIOS()&&window.StatusBar&&StatusBar.styleLightContent()})}]),window.ionic.Platform.ready(function(){angular.bootstrap(document,["cesium"])}),angular.module("cesium.components",[]).component("csBadgeCertification",{bindings:{requirements:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_certification_count.html"}).component("csBadgeGivenCertification",{bindings:{identity:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_given_certification_count.html"}).component("csSortIcon",{bindings:{asc:"=",sort:"=",toggle:"<"},template:'<i class="ion-chevron-up" ng-class="{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: 5px; top:-5px; font-size: 9px;"></i><i class="ion-chevron-down" ng-class="{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: -2.6px; top: 3px; font-size: 9px;"></i>'}),angular.module("cesium.directives",[]).directive("compareTo",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.compareTo&&(i.$validators.compareTo=function(t){return t==e.$eval(n.compareTo)},e.$watch(n.compareTo,function(){i.$validate()}))}}}).directive("differentTo",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.differentTo&&(i.$validators.differentTo=function(t){return t!=e.$eval(n.differentTo)},e.$watch(n.differentTo,function(){i.$validate()}))}}}).directive("numberFloat",function(){var e=new RegExp("^[0-9]+([.,][0-9]+)?$");return{require:"?ngModel",link:function(t,n,i,a){a&&(a.$validators.numberFloat=function(t){return a.$isEmpty(t)||e.test(t)})}}}).directive("numberInt",function(){var e=new RegExp("^[0-9]+$");return{require:"ngModel",link:function(t,n,i,a){a&&(a.$validators.numberInt=function(t){return a.$isEmpty(t)||e.test(t)})}}}).directive("email",function(){var e=new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");return{require:"ngModel",link:function(t,n,i,a){a&&(a.$validators.email=function(t){return a.$isEmpty(t)||e.test(t)})}}}).directive("requiredIf",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.requiredIf&&(i.$validators.required=function(t){return!e.$eval(n.requiredIf)||!i.$isEmpty(t)},e.$watch(n.requiredIf,function(){i.$validate()}))}}}).directive("geoPoint",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&(i.$validators.geoPoint=function(e){return i.$isEmpty(e)||angular.isDefined(e.lat)&&angular.isDefined(e.lon)||angular.isUndefined(e.lat)&&angular.isUndefined(e.lon)})}}}).directive("copyOnClick",["$window","Device","UIUtils",function(e,t,n){"ngInject";return{restrict:"A",link:function(e,i,a){var o=function(i){var o=a.copyOnClick;if(o&&t.clipboard.enable)t.clipboard.copy(o).then(function(){n.toast.show("INFO.COPY_TO_CLIPBOARD_DONE")}).catch(n.onError("ERROR.COPY_CLIPBOARD"));else if(o){var r=o&&o.indexOf("\n")>=0?o.split("\n").length:1;n.popover.show(i,{scope:e,templateUrl:"templates/common/popover_copy.html",bindings:{value:a.copyOnClick,rows:r},autoselect:".popover-copy "+(r<=1?"input":"textarea")})}};i.bind("click",o),i.bind("hold",o)}}}]).directive("selectOnClick",["$window",function(e){"ngInject";return{restrict:"A",link:function(t,n,i){n.bind("click",function(){e.getSelection&&!e.getSelection().toString()&&this.value&&this.setSelectionRange(0,this.value.length)})}}}]).directive("activeLink",["$location",function(e){"ngInject";return{restrict:"A",link:function(t,n,i,a){var o,r=i.activeLink;i.activeLinkPathPrefix?(o=i.activeLinkPathPrefix.substring(1),t.location=e,t.$watch("location.path()",function(e){e&&0===e.indexOf(o)?n.addClass(r):n.removeClass(r)})):i.href&&(o=i.href.substring(1),t.location=e,t.$watch("location.path()",function(e){e&&e==o?n.addClass(r):n.removeClass(r)}))}}}]).directive("input",["$timeout",function(e){return{restrict:"E",scope:{returnClose:"=",onReturn:"&",onFocus:"&",onBlur:"&"},link:function(t,n,i){n.bind("focus",function(n){t.onFocus&&e(function(){t.onFocus()})}),n.bind("blur",function(n){t.onBlur&&e(function(){t.onBlur()})}),n.bind("keydown",function(i){13==i.which&&(t.returnClose&&n[0].blur(),t.onReturn&&e(function(){t.onReturn()}))})}}}]).directive("trustAsHtml",["$sce","$compile","$parse",function(e,t,n){return{restrict:"A",compile:function(i,a){var o=n(a.trustAsHtml),r=n(a.trustAsHtml,function(e){return(e||"").toString()});return t.$$addBindingClass(i),function(n,i,a){t.$$addBindingInfo(i,a.trustAsHtml),n.$watch(r,function(){i.html(e.getTrustedHtml(e.trustAsHtml(o(n)))||""),t(i.contents())(n)})}}}}]).directive("modalClose",["$ionicHistory","$timeout",function(e,t){return{restrict:"AC",link:function(n,i){i.bind("click",function(){n.closeModal&&(e.nextViewOptions({historyRoot:!0,disableAnimate:!0,expire:300}),t(function(){e.nextViewOptions({historyRoot:!1,disableAnimate:!1})},300),n.closeModal())})}}}]).directive("csExtensionPoint",["$state","$compile","$controller","$templateCache","PluginService",function(e,t,n,i,a){var o=function(e){var t=e.templateUrl?i.get(e.templateUrl):e.template;return t?(e.controller&&(t='<ng-controller ng-controller="'+e.controller+'">'+t+"</div>"),t):(console.error("[plugin] Could not found template for extension :"+(e.templateUrl?e.templateUrl:e.template)),"")};return{restrict:"E",compile:function(e,t){if(angular.isDefined(t.name)){var n=a.extensions.points.getActivesByName(t.name);n.length>0&&(e.html(""),_.forEach(n,function(t){e.append(o(t))}))}return{pre:function(e,t,n){a.extensions.points.current.set(n.name)},post:function(){a.extensions.points.current.set()}}},scope:{content:"="}}}]).directive("onReadFile",["$parse",function(e){return{restrict:"A",scope:!1,link:function(t,n,i){var a=e(i.onReadFile);n.on("change",function(e){var n=new FileReader,i={name:this.files[0].name,size:this.files[0].size,type:this.files[0].type};n.onload=function(e){t.$applyAsync(function(){a(t,{file:{fileContent:e.target.result,fileData:i}})})},n.readAsText((e.srcElement||e.target).files[0])})}}}]).directive("dropzone",["$parse",function(e){return{restrict:"A",scope:!1,link:function(t,n,i){var a=e(i.dropzone);n.bind("dragover",function(e){e.stopPropagation(),e.preventDefault()}),n.bind("dragenter",function(e){e.stopPropagation(),e.preventDefault()}),n.bind("dragleave",function(e){e.stopPropagation(),e.preventDefault()}),n.bind("drop",function(e){e.stopPropagation(),e.preventDefault();var n={name:e.dataTransfer.files[0].name,size:e.dataTransfer.files[0].size,type:e.dataTransfer.files[0].type},i=new FileReader;i.onload=function(e){t.$apply(function(){a(t,{file:{fileContent:e.target.result,fileData:n}})})},i.readAsText(e.dataTransfer.files[0])})}}}]).directive("windowExitUnauth",["$window","csSettings","csWallet",function(e,t,n){return{restrict:"AE",link:function(i,a){(e.attachEvent||e.addEventListener)(e.attachEvent?"onunload":"unload",function(e){if(t.data&&t.data.keepAuthIdle!=t.constants.KEEP_AUTH_IDLE_SESSION)return n.unauth()})}}}]),angular.module("cesium.filters",["cesium.config","cesium.platform","pascalprecht.translate","cesium.translations"]).factory("filterTranslations",["$rootScope","$q","csPlatform","csSettings","csCurrency","$translate","$timeout",function(e,t,n,i,a,o,r){"ngInject";function s(){return console.debug("[filter] Loading translations for locale [{0}]".format(o.use())),o(["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.UD","COMMON.DAYS"]).then(function(e){d.DATE_PATTERN=e["COMMON.DATE_PATTERN"],"COMMON.DATE_PATTERN"===d.DATE_PATTERN&&(d.DATE_PATTERN="YYYY-MM-DD HH:mm"),d.DATE_SHORT_PATTERN=e["COMMON.DATE_SHORT_PATTERN"],"COMMON.DATE_SHORT_PATTERN"===d.DATE_SHORT_PATTERN&&(d.DATE_SHORT_PATTERN="YYYY-MM-DD"),d.DATE_MONTH_YEAR_PATTERN=e["COMMON.DATE_MONTH_YEAR_PATTERN"],"COMMON.DATE_MONTH_YEAR_PATTERN"===d.DATE_MONTH_YEAR_PATTERN&&(d.DATE_MONTH_YEAR_PATTERN="MMM YY"),d.DAYS=e["COMMON.DAYS"],"COMMON.DAYS"===d.DAYS&&(d.DAYS="days"),d.UD=e["COMMON.UD"],"COMMON.UD"===d.UD&&(d.UD="UD")})}function l(){console.debug("[filter] Computing constants from currency parameters"),d.MEDIAN_TIME_OFFSET=a.data.medianTimeOffset||d.MEDIAN_TIME_OFFSET}var c,u=!1,d=this;return d.MEDIAN_TIME_OFFSET=3600,d.ready=function(){return u?t.when():c||d.start()},d.start=function(){return c=n.ready().then(s).then(function(){l(),u=!0,i.api.locale.on.changed(e,s,this),a.api.data.on.ready(e,l,this)})},r(function(){d.start()}),d}]).filter("formatInteger",function(){return function(e){return e?e<1e7?numeral(e).format("0,0"):numeral(e).format("0,0.000 a"):"0"}}).filter("formatAmount",["csConfig","csSettings","csCurrency","$filter",function(e,t,n,i){function a(e,t){var i=t&&t.currentUD?t.currentUD:n.data.currentUD;if(!i)return void console.warn("formatAmount: currentUD not defined");var a=e/i;return a=Math.abs(e)<u&&0!==e?"~ 0":numeral(a).format(c),t&&t.currency?a+" "+l(t.currency,!0):a}function o(e,t){var n=numeral(e/100).format(e<-1e9||e>1e9?s:r);return t&&t.currency?n+" "+l(t.currency,!1):n}var r="0,0.0"+Array(e.decimalCount||4).join("0"),s="0,0.000 a",l=i("currencySymbol"),c=r+"0",u=1/Math.pow(10,(e.decimalCount||4)+1);return function(e,n){if(void 0!==e)return(n&&angular.isDefined(n.useRelative)?n.useRelative:t.data.useRelative)?a(e,n):o(e,n)}}]).filter("formatAmountNoHtml",["csConfig","csSettings","csCurrency","$filter",function(e,t,n,i){function a(e,t){var i=t&&t.currentUD?t.currentUD:n.data.currentUD;if(!i)return void console.warn("formatAmount: currentUD not defined");var a=e/i;return a=Math.abs(a)<r&&0!==e?"~ 0":numeral(a).format(s),t&&t.currency?a+" "+l(t.currency,!0):a}function o(e,t){var n=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return t&&t.currency?n+" "+l(t.currency,!1):n}var r=1/Math.pow(10,e.decimalCount||4),s="0,0.0"+Array(e.decimalCount||4).join("0"),l=i("currencySymbolNoHtml");return function(e,n){if(void 0!==e)return(n&&angular.isDefined(n.useRelative)?n.useRelative:t.data.useRelative)?a(e,n):o(e,n)}}]).filter("currencySymbol",["filterTranslations","$filter","csSettings",function(e,t,n){return function(i,a){return i?(angular.isDefined(a)?a:n.data.useRelative)?e.UD+"<sub>"+t("abbreviate")(i)+"</sub>":t("abbreviate")(i):""}}]).filter("currencySymbolNoHtml",["filterTranslations","$filter","csSettings",function(e,t,n){return function(i,a){return i?(angular.isDefined(a)?a:n.data.useRelative)?e.UD+" "+t("abbreviate")(i):t("abbreviate")(i):""}}]).filter("formatDecimal",["csConfig","csCurrency",function(e,t){var n=1/Math.pow(10,e.decimalCount||4),i="0,0.0"+Array(e.decimalCount||4).join("0");return function(e){return void 0===e?"0":e===1/0||e===-1/0?(console.warn("formatDecimal: division by zero ? (is currentUD defined ?) = "+t.data.currentUD),"error"):Math.abs(e)<n?"~ 0":numeral(e).format(i)}}]).filter("formatNumeral",function(){return function(e,t){return void 0===e?"0":Math.abs(e)<1e-4?"~ 0":numeral(e).format(t)}}).filter("formatDate",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("formatDateShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatDateMonth",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_MONTH_YEAR_PATTERN||"MMM YY"):""}}]).filter("formatDateForFile",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_FILE_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatTime",function(){return function(e){return e?moment.unix(parseInt(e)).local().format("HH:mm"):""}}).filter("formatFromNow",function(){return function(e){return e?moment.unix(parseInt(e)).fromNow():""}}).filter("formatFromNowAndDate",["filterTranslations",function(e){return function(t,n){var i=t&&moment.unix(parseInt(t));return i&&i.fromNow()+(n&&n.separator||" | ")+i.local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm")||""}}]).filter("formatDurationTo",function(){return function(e){return e?moment.unix(moment().utc().unix()+parseInt(e)).fromNow():""}}).filter("formatDuration",function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0):""}}).filter("formatDurationTime",["filterTranslations",function(e){return function(t){if(!t)return"";var n=t&&t<0?"-":"+";t=Math.abs(t);var i=Math.trunc(t/3600/24),a=Math.trunc(t/3600-24*i),o=Math.trunc(t/60-24*i*60-60*a);return i>0?n+i+" "+e.DAYS+" "+a+"h "+o+"m":a>0?n+a+"h "+o+"m":n+o+"m"}}]).filter("formatDurationMs",function(){return function(e){return e?e<1e3?e+"ms":e/1e3+"s":""}}).filter("formatPeriod",function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0).split(" ").slice(-1)[0]:null}}).filter("formatFromNowShort",function(){return function(e){return e?moment.unix(parseInt(e)+offset).fromNow(!0):""}}).filter("medianDate",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("medianDateShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("medianTime",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format("HH:mm"):""}}]).filter("medianFromNow",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).fromNow():""}}]).filter("medianFromNowShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).fromNow(!0):""}}]).filter("medianFromNowAndDate",["filterTranslations",function(e){return function(t,n){var i=t&&moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET);return i&&i.fromNow()+(n&&n.separator||" | ")+i.local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm")||""}}]).filter("capitalize",function(){return function(e){return e?(e=e.toLowerCase(),e.substring(0,1).toUpperCase()+e.substring(1)):""}}).filter("abbreviate",function(){var e={};return function(t){var n=t||"";if(e[n])return e[n];if(n.length>3){for(var i="",a=["-","_"," "],o=0;o<n.length;o++){var r=n[o];0===o?i="g"===r||"G"===r?"Äž":r:o>0&&-1!=a.indexOf(n[o-1])&&(i+=r)}n=i.toUpperCase()}else n=n.toUpperCase(),"G"===n.charAt(0)&&(n="Äž"+(n.length>1?n.substr(1):""));return e[t]=n,n}}).filter("upper",function(){return function(e){return e?e.toUpperCase():""}}).filter("formatPubkey",function(){return function(e){return e?e.substr(0,8):""}}).filter("formatHash",function(){return function(e){return e?e.substr(0,4)+e.substr(e.length-4):""}}).filter("formatCategory",function(){return function(e){return e&&e.length>28?e.substr(0,25)+"...":e}}).filter("formatSlug",function(){return function(e){return e?encodeURIComponent(e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\w ]+/g,"").replace(/ +/g,"-")):""}}).filter("formatEncodeURI",function(){return function(e){return e?encodeURIComponent(e):""}}).filter("truncText",function(){return function(e,t){return t=t||500,!e||e.length<=t?e:e.substr(0,t)+"..."}}).filter("truncUrl",function(){return function(e,t){t=t||25;var n=e.startsWith("http://")?7:e.startsWith("https://")?8:0;return n=e.startsWith("www.",n)?n+4:n,!e||e.length-n<=t?e.substr(n):e.substr(n,t)+"..."}}).filter("trustAsHtml",["$sce",function(e){return function(t){return e.trustAsHtml(t)}}]),angular.module("cesium.platform",["ngIdle","cesium.config","cesium.services"]).config(["$translateProvider","csConfig",function(e,t){"ngInject";e.uniformLanguageTag("bcp47").determinePreferredLanguage().useSanitizeValueStrategy(null).fallbackLanguage([t.fallbackLanguage?t.fallbackLanguage:"en"]).useLoaderCache(!0)}]).config(["$httpProvider","csConfig",function(e,t){"ngInject";e.defaults.timeout=t.timeout?t.timeout:3e5,e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"],e.useApplyAsync(!0)}]).config(["$compileProvider","csConfig",function(e,t){"ngInject";e.debugInfoEnabled(!!t.debug)}]).config(["$animateProvider",function(e){"ngInject";e.classNameFilter(/\banimate-/)}]).config(["CacheFactoryProvider","csConfig",function(e,t){"ngInject";angular.extend(e.defaults,{maxAge:t.cacheTimeMs||6e4})}]).config(["screenmatchConfigProvider",function(e){"ngInject";e.config.rules="bootstrap"}]).config(["$ionicConfigProvider",function(e){"ngInject";var t=ionic.Platform.isIOS();e.scrolling.jsScrolling(t),e.views.maxCache(5)}]).config(["IdleProvider","csConfig",function(e,t){"ngInject";e.idle(t.logoutIdle||600),e.timeout(t.logoutTimeout||15)}]).factory("$exceptionHandler",["$log",function(e){"ngInject";return function(t,n){n?e.error(t,n):e.error(t)}}]).factory("csPlatform",["ionicReady","$rootScope","$q","$state","$translate","$timeout","UIUtils","BMA","Device","csHttp","csConfig","csSettings","csCurrency","csWallet",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";function E(){if(!L){var e=t.$on("$stateChangeStart",function(e,t,n,a){e.defaultPrevented||"app.home"===t.name||"app.settings"===t.name||(e.preventDefault(),S?S.then(function(){i.go(t.name,n)}):r.loading.hide())});L=e}}function b(){L&&L(),L=null}function g(e){if(e)return!0;A=A||d.data.node;var t=d.data.fallbackNodes&&D<d.data.fallbackNodes.length&&d.data.fallbackNodes[D++];if(!t)throw"ERROR.CHECK_NETWORK_CONNECTION";var n=t.host+(t.port||80==t.port||443==t.port?"":":"+t.port);return s.node.same(t.host,t.port)?(console.debug("[platform] Skipping fallback node [{0}]: same as actual node".format(n)),g()):c.get(t.host,t.port,"/node/summary",443==t.port||s.node.forceUseSsl)().catch(function(e){console.error("[platform] Could not reach fallback node [{0}]: skipping".format(n))}).then(function(e){if(!e)return g();var i={old:s.server,new:n};return i.old===i.new&&(s.port!=t.port?i.new+=":"+t.port:0!=s.useSsl||!t.useSsl&&443!=t.port||(i.new+=" (SSL)")),a("CONFIRM.USE_FALLBACK_NODE",i).then(function(e){return r.alert.confirm(e)}).then(function(e){if(e)return d.data.node=t,d.data.node.temporary=!0,c.cache.clear(),s.copy(t).then(g)})})}function f(){return y}function T(){var e=d.data.latestReleaseUrl&&c.uri.parse(d.data.latestReleaseUrl);return e?c.get(e.host,"https:"==e.protocol?443:e.port,"/"+e.pathname)().then(function(e){if(e&&e.name&&e.tag_name&&e.html_url)return{version:e.name,url:e.html_url,isNewer:c.version.compare(u.version,e.name)<0}}).catch(function(e){console.error("[platform] Failed to get Cesium latest version",e)}):n.when()}function h(){C=[s.api.node.on.restart(t,N,this)]}function I(){_.forEach(C,function(e){e()}),C=[]}function v(){return y?n.when():S||O()}function N(){return console.debug("[platform] restarting csPlatform"),R().then(function(){return o(O,200)})}function O(){return E(),S=e().then(n.all([l.ready(),d.ready()])).then(function(){return s.ready().then(g)}).then(p.ready).then(m.ready).then(function(){b(),h(),S=null,y=!0}).catch(function(e){throw S=null,y=!1,i.current.name!==t.errorState&&i.go(t.errorState,{error:"peer"}),e})}function R(){return y?(I(),m.stop(),p.stop(),s.stop(),o(function(){b(),y=!1,S=null},500)):n.when()}var A,S,C,L,D=0,y=!1;return{disableChangeState:E,isStarted:f,ready:v,restart:N,start:O,stop:R,version:{latest:T}}}]).run(["$rootScope","$state","$window","$urlRouter","ionicReady","$ionicPlatform","$ionicHistory","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet","csSettings","csConfig","csCurrency",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b){"ngInject";e.config=E,e.settings=m.data,e.currency=b.data,e.device=s,e.errorState="app.home",e.smallscreen=l.screen.isSmall();var g=n.location.href.indexOf("#");e.rootPath=-1!=g?n.location.href.substr(0,g):n.location.href,console.debug("[app] Root path is ["+e.rootPath+"]"),a().then(function(){return s.keyboard.enable&&(s.keyboard.hideKeyboardAccessoryBar(!0),ionic.Platform.isIOS()&&s.keyboard.disableScroll(!0)),"a"!==ionic.Platform.grade.toLowerCase()&&(console.info("[app] Disabling UI effects, because plateform's grade is ["+ionic.Platform.grade+"]"),l.setEffects(!1)),window.StatusBar&&console.debug("[app] Status bar plugin enable"),d.version.latest().then(function(t){t&&t.isNewer?(console.info("[app] New release detected [{0}]".format(t.version)),e.newRelease=t):console.info("[app] Current version [{0}] is the latest release".format(E.version))}),o.registerBackButtonAction(function(e){return r.backView()?r.goBack():(e.preventDefault(),l.alert.confirm("CONFIRM.EXIT_APP").then(function(e){e&&ionic.Platform.exitApp()}))},100),d.ready()})}]),"function"!=typeof String.prototype.startsWith&&(console.debug("Adding String.prototype.startsWith() -> was missing on this platform"),String.prototype.startsWith=function(e,t){return 0===this.indexOf(e,t)}),"function"!=typeof String.prototype.trim){console.debug("Adding String.prototype.trim() -> was missing on this platform");var rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(rtrim,"")}}Math&&"function"!=typeof Math.trunc&&(console.debug("Adding Math.trunc() -> was missing on this platform"),Math.trunc=function(e){return(e-.5).toFixed()}),"function"!=typeof String.prototype.format&&(console.debug("Adding String.prototype.format() -> was missing on this platform"),String.prototype.format=function(){var e=arguments;return this.replace(/{(\d+)}/g,function(t,n){return void 0!==e[n]?e[n]:t})});
\ No newline at end of file
+e.put("plugins/es/templates/registry/lookup_list_lg.html",'<div class="list {{::motion.ionListClass}}" ng-if="!search.loading && search.results && search.results.length > 0"><a ng-repeat="item in search.results" class="item item-record item-border-large ink padding-xs" ui-sref="app.view_page({id: item.id, title: item.urlTitle})"><div class="row row-record"><div class="col item-text-wrap item-avatar-left-padding" ng-class="::{\'item-avatar\': item.avatar || item.type}"><i class="item-image icon cion-page-{{::item.type}}" ng-if="::!item.avatar"></i> <i class="item-image avatar" style="background-image: url({{::item.avatar.src}})" ng-if="::item.avatar"></i><h2 ng-bind-html="::item.title"></h2><h4><span class="dark" ng-if="::item.city"><b class="ion-location"></b> <span ng-bind-html="::item.city"></span> </span><span class="gray" ng-if="::item.distance">({{::item.distance|formatDecimal}} {{::geoUnit}})</span></h4><h4><span class="gray" ng-if="::item.time && search.lastRecords"><b class="ion-clock"></b> {{::item.time | formatFromNow}} </span><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4><span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count">{{::item.picturesCount}}&nbsp;<i class="icon ion-camera"></i></span></div><div class="col hidden-xs"><h4 class="text-wrap"><span class="visible-sm"><b class="ion-flag"></b><ng-if ng-if="::item.category">{{::item.category.name|truncText:50}}</ng-if><ng-if ng-if="::!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</ng-if></span><span class="gray text-italic" ng-if="::item.description"><b class="ion-quote"></b> <span ng-bind-html="::item.description|truncText:500" ng-if="::item.description"></span></span></h4></div></div></a></div><ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%"></ion-infinite-scroll>'),e.put("plugins/es/templates/registry/lookup_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="showNewPageModal();"><i class="icon ion-plus"></i> <span translate>REGISTRY.BTN_NEW</span></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/registry/lookup_popover_filters.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="doGetLastRecords()"><i class="icon ion-clock"></i> {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}} </a><a class="item item-icon-left ink" ng-click="toggleAdvanced();"><i class="icon ion-android-checkbox-outline-blank" ng-show="!search.advanced"></i> <i class="icon ion-android-checkbox-outline" ng-show="search.advanced"></i> <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span></a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/registry/modal_record_type.html",'<ion-modal-view><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>{{getParameters().title||\'REGISTRY.TYPE.TITLE\'|translate}}</h1></ion-header-bar><ion-content class="lookupForm"><div class="list padding"><h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3><button class="button button-block button-stable icon-left cion-page-shop" ng-click="closeModal(\'shop\')" translate>REGISTRY.TYPE.ENUM.SHOP</button> <button class="button button-block button-stable icon-left cion-page-association" ng-click="closeModal(\'association\')" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button> <button class="button button-block button-stable icon-left cion-page-company" ng-click="closeModal(\'company\')" translate>REGISTRY.TYPE.ENUM.COMPANY</button> <button class="button button-block button-stable icon-left cion-page-institution" ng-click="closeModal(\'institution\')" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button></div></ion-content></ion-modal-view>'),e.put("plugins/es/templates/registry/view_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>REGISTRY.VIEW.MENU_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="showSharePopover($event)"><i class="icon ion-android-share-alt"></i> {{\'COMMON.BTN_SHARE\' | translate}} </a><a class="item item-icon-left assertive ink" ng-if="canEdit" ng-click="delete()"><i class="icon ion-trash-a"></i> {{\'COMMON.BTN_DELETE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/registry/view_record.html",'<ion-view left-buttons="leftButtons" class="view-page"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit"><i class="icon ion-android-create"></i></button> <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content scroll="true" class="refresher-top-bg"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()"></ion-refresher><div class="hero"><div class="content" ng-if="!loading"><i class="avatar cion-page-{{formData.type}}" ng-if="!formData.avatar"></i> <i class="avatar" ng-style="{{avatarStyle}}" ng-if="formData.avatar"></i><h3><span class="dark" ng-bind-html="formData.title"></span></h3><h4>&nbsp;</h4></div><h4 class="content dark" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><div class="row no-padding-xs no-padding-sm"><div class="col list animate-fade-slide-in item-text-wrap no-padding-xs no-padding-sm"><div class="item"><h2 class="gray"><a ng-if="formData.city" ui-sref="app.wot_lookup.tab_registry({location:formData.city})"><i class="icon ion-location"></i> <span ng-bind-html="formData.city"></span> </a><span ng-if="formData.city && formData.type">&nbsp;|&nbsp;</span> <a ng-if="formData.type" ui-sref="app.wot_lookup.tab_registry({type:formData.type})"><i class="cion-page-{{formData.type}}"></i> {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}</a></h2><h4><i class="icon ion-clock" ng-if="formData.time"></i> <span translate="">COMMON.SUBMIT_BY</span> <a ng-class="{\'positive\': issuer.uid, \'gray\': !issuer.uid}" ui-sref="app.wot_identity({pubkey:issuer.pubkey, uid: issuer.name||issuer.uid})"><ng-if ng-if="issuer.uid"><i class="icon ion-person"></i> {{::issuer.name||issuer.uid}}</ng-if><span ng-if="!issuer.uid"><i class="icon ion-key"></i> {{issuer.pubkey|formatPubkey}} </span></a><span>{{formData.time|formatFromNow}}<h4 class="gray hidden-xs">| {{formData.time | formatDate}}</h4></span></h4></div><a id="registry-share-anchor-{{id}}"></a><div class="item"><h2 trust-as-html="formData.description"></h2></div><div class="item" ng-if="formData.category || formData.address"><h4 ng-if="formData.category"><span class="gray" translate="">REGISTRY.VIEW.CATEGORY</span> <a class="positive" ng-if="formData.category" ui-sref="app.wot_lookup.tab_registry({category:formData.category.id})"><span ng-bind-html="formData.category.name"></span></a></h4><h4 ng-if="formData.address"><span class="gray" translate="">REGISTRY.VIEW.LOCATION</span> <a class="positive" target="_system" href="https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}"><span ng-bind-html="formData.address"></span> <span ng-if="formData.city">- </span><span ng-bind-html="formData.city"></span></a></h4></div><ng-if ng-if="formData.socials && formData.socials.length>0"><div class="item item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}}</p><h2><a ng-click="openLink($event, social.url, social.type)">{{social.url}}</a></h2></div></ng-if><div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}"><i class="icon ion-key"></i> <span translate="">REGISTRY.EDIT.RECORD_PUBKEY</span><h4 class="dark">{{::formData.pubkey}}</h4></div><div class="lazy-load"><ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include><ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include></div></div></div></ion-content><button class="button button-fab button-fab-bottom-right button-assertive icon ion-android-send visible-xs visible-sm" ng-if="formData.pubkey && !isUserPubkey(formData.pubkey)" ng-click="showTransferModal({pubkey: formData.pubkey, uid: formData.title})"></button></ion-view>'),e.put("plugins/es/templates/registry/view_wallet_pages.html",'<ion-view left-buttons="leftButtons" class="view-notification"><ion-nav-title>{{\'REGISTRY.MY_PAGES\' | translate}}</ion-nav-title><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate()"></ion-refresher><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding gray" ng-if="!search.loading && !search.results.length" translate="">REGISTRY.NO_PAGE</div><ng-include src="\'plugins/es/templates/registry/lookup_list.html\'"></ng-include></ion-content><button id="fab-wallet-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin" ng-click="showNewPageModal()"><i class="icon ion-plus"></i></button></ion-view>'),e.put("plugins/es/templates/settings/plugin_settings.html",'<ion-view left-buttons="leftButtons" class="settings"><ion-nav-title translate="">ES_SETTINGS.PLUGIN_NAME</ion-nav-title><ion-content scroll="true"><div class="item item-toggle dark"><div class="input-label" translate="">ES_SETTINGS.ENABLE_TOGGLE</div><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.enable"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider" translate="">SETTINGS.STORAGE_DIVIDER</span><div class="item item-toggle item-text-wrap dark"><div class="input-label" ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.ENABLE_REMOTE_STORAGE</div><h4 class="gray text-wrap" ng-bind-html="\'ES_SETTINGS.ENABLE_REMOTE_STORAGE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.useRemoteStorage" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider" translate="">SETTINGS.NETWORK_SETTINGS</span><ion-item class="ink item-icon-right item-text-wrap visible-xs visible-sm" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable"><div class="input-label" ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.PEER</div><ng-if ng-if="isFallbackNode"><h4 class="gray text-wrap assertive"><b class="ion-alert-circled"></b> <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span></h4><div class="badge badge-assertive">{{server}}</div></ng-if><div class="badge" ng-class="{\'badge-balanced\': formData.enable, \'badge-stable\': !formData.enable}" ng-if="!isFallbackNode">{{server}}</div><i class="icon ion-ios-arrow-right"></i></ion-item><span class="item item-divider" translate="">ES_SETTINGS.NOTIFICATIONS.DIVIDER</span><span class="item gray item-text-wrap" translate="">ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</span><div class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.txSent" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></div></label><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</span><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.txReceived" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></label></label><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</span><div class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.certSent" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></div></label><label class="item item-toggle dark item-text-wrap"><span ng-class="{\'gray\': !formData.enable}" translate="">ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</span><div class="toggle toggle-royal"><input type="checkbox" ng-model="formData.notifications.certReceived" ng-disabled="!formData.enable"><div class="track"><div class="handle"></div></div></div></label><cs-extension-point name="common"></cs-extension-point></ion-content></ion-view>'),e.put("plugins/es/templates/settings/settings_extend.html",'<div class="item item-text-wrap item-icon-right ink" ui-sref="app.es_settings"><div class="input-label ng-binding" translate>ES_SETTINGS.PLUGIN_NAME</div><h4 class="gray" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4><i class="icon ion-ios-arrow-right"></i></div>'),e.put("plugins/es/templates/subscription/edit_subscriptions.html",'<ion-view left-buttons="leftButtons" class="view-notification"><ion-nav-title>{{\'SUBSCRIPTION.EDIT.TITLE\' | translate}}</ion-nav-title><ion-nav-buttons side="secondary"></ion-nav-buttons><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()"></ion-refresher><div class="center padding" ng-if="search.loading"><ion-spinner icon="android"></ion-spinner></div><div class="center padding gray" ng-if="!search.loading && !search.results.length" translate="">SUBSCRIPTION.NO_SUBSCRIPTION</div><div class="row no-padding"><div class="col list {{::motion.ionListClass}} item-border-large"><ng-repeat ng-repeat="subscriptions in search.results | filter: { type: \'email\' }" ng-include="\'plugins/es/templates/subscription/item_\' + subscriptions.type.toLowerCase() + \'_subscription.html\'">></ng-repeat></div></div></ion-content><button id="fab-add-subscription-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="addSubscription()"></button></ion-view>'),e.put("plugins/es/templates/subscription/item_email_subscription.html",'<div class="item item-avatar"><i class="item-image icon ion-email"></i><h3>{{\'SUBSCRIPTION.TYPE.ENUM.\' + subscriptions.type.toUpperCase() | translate}}</h3><h4 class="gray">{{\'SUBSCRIPTION.EDIT.PROVIDER\'|translate}} <a ui-sref="app.wot_identity({pubkey: subscriptions.recipient, uid: subscriptions.uid})"><span ng-class="{\'positive\': subscriptions.uid, \'dark\': !subscriptions.uid}" ng-if="subscriptions.name||subscriptions.uid"><i class="ion-person" ng-if="subscriptions.uid"></i> {{subscriptions.name||subscriptions.uid}} </span><span class="gray" ng-if="!subscriptions.uid"><i class="ion-key"></i> {{subscriptions.recipient | formatPubkey}}</span></a></h4><div class="item-note text-right"><span ng-repeat="item in subscriptions.items">{{item.content.email}} <a class="ion-trash-a gray padding-left" ng-click="deleteSubscription(item)"></a> <a class="ion-edit gray padding-left" ng-click="editSubscription(item)"></a><br></span></div></div>'),e.put("plugins/es/templates/subscription/modal_email.html",'<ion-modal-view id="composeMessage" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1><button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSubmit()"></button></ion-header-bar><ion-content scroll="true"><div class="item item-icon-left item-text-wrap"><i class="icon ion-ios-information-outline positive"></i><h4 class="positive" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4></div><form name="subscriptionForm" novalidate="" ng-submit="doSubmit()"><div class="list" ng-init="setForm(subscriptionForm)"><label class="item item-input" ng-class="{\'item-input-error\': form.$submitted && (form.email.$invalid || form.email.$error)}"><span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span> <input name="email" type="text" placeholder="{{\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\' | translate}}" ng-model="formData.content.email" ng-minlength="3" required email></label><div class="form-errors" ng-if="form.$submitted && (form.email.$invalid || form.email.$error)" ng-messages="form.email.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div><div class="form-error" ng-message="email"><span translate="ERROR.FIELD_NOT_EMAIL"></span></div></div><label class="item item-input item-select" ng-class="{\'item-input-error\': form.$submitted && !formData.content.frequency}"><span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span><select name="frequency" ng-model="formData.content.frequency" style="height: 46px;margin-top: 1px"><option value="weekly" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option><option value="daily" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option></select></label><div class="form-errors" ng-if="form.$submitted && !formData.content.frequency"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><a class="item item-input item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.recipient}" ng-click="showNetworkLookup()" style="height: 67px"><span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span> <span class="badge animate-fade-in animate-show-hide ng-hide" ng-class="{\'badge-royal\': recipient.uid, \'badge-stable\': !recipient.uid}" ng-show="recipient && (recipient.name||recipient.uid)"><i class="ion-person" ng-if="recipient.uid"></i> {{recipient.name||recipient.uid}} </span><span class="badge badge-secondary animate-fade-in animate-show-hide ng-hide" ng-show="formData.recipient"><i class="ion-key"></i> {{formData.recipient | formatPubkey}} </span><i class="gray icon ion-ios-arrow-right"></i></a><div class="form-errors" ng-if="form.$submitted && !formData.recipient"><div class="form-error"><span translate="ERROR.FIELD_REQUIRED"></span></div></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" type="submit">{{\'COMMON.BTN_ADD\' | translate}}</button></div></form></ion-content></ion-modal-view>'),e.put("plugins/es/templates/user/edit_popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left assertive ink" ng-click="removeProfile()"><i class="icon ion-trash-a"></i> {{\'PROFILE.BTN_DELETE\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/user/edit_profile.html",'<ion-view left-buttons="leftButtons"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm" ng-click="removeProfile()" ng-if="existing"></button> <button class="button button-icon button-clear ion-android-done visible-xs visible-sm" ng-click="submitAndSaveAndClose()"></button></ion-nav-buttons><ion-content scroll="true"><div class="positive-900-bg hero"><div class="content"><i class="avatar" ng-style="avatarStyle" ng-class="{\'avatar-wallet\': !loading && !avatar && walletData && !walletData.isMember, \'avatar-member\': !loading && !avatar && walletData.isMember}"><button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block" ng-click="showAvatarModal()"></button> <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px" ng-click="rotateAvatar()"><i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px"></i> <i class="icon-secondary ion-forward" style="left: 26px; top: -13px"></i></button></i><h3 class="light"><ng-if ng-if="!loading && !formData.title && walletData && walletData.isMember">{{walletData.uid}}</ng-if><ng-if ng-if="!loading && !formData.title && walletData && !walletData.isMember">{{::walletData.pubkey | formatPubkey}}</ng-if><ng-if ng-if="!loading && formData.title">{{formData.title}}</ng-if></h3><h4 class="light"><ion-spinner ng-if="loading" icon="android"></ion-spinner></h4></div></div><div class="row no-padding"><div class="col"><form name="profileForm" novalidate="" ng-submit="saveAndClose()"><div class="list item-text-wrap {{::motion.ionListClass}}" ng-init="setForm(profileForm)"><div class="item item-icon-left item-text-wrap"><i class="icon ion-ios-information-outline positive"></i><h4 class="positive" translate="">PROFILE.HELP.WARNING_PUBLIC_DATA</h4></div><div class="item item-divider">{{\'PROFILE.GENERAL_DIVIDER\' | translate}}</div><ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}"><span class="input-label">{{\'PROFILE.TITLE\' | translate}}</span> <input type="text" name="title" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" id="profile-name" ng-model="formData.title" ng-model-options="{ debounce: 350 }" ng-maxlength="50" required></ion-item><div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span></div></div><ion-item class="item-input item-floating-label item-button-right"><span class="input-label" style="width: 100%">{{\'PROFILE.DESCRIPTION\' | translate}}</span><textarea placeholder="{{\'PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n              </textarea></ion-item><ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl as ctrl"></ng-include></div><ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include><div class="list item-text-wrap {{::motion.ionListClass}}"><div class="item item-divider">{{\'PROFILE.TECHNICAL_DIVIDER\' | translate}}</div><ion-item class="item-icon-left" ng-if="walletData && walletData.uid"><span translate="">COMMON.UID</span> <span class="badge badge-stable">{{::walletData.uid}}</span></ion-item><ion-item class="item-icon-left item-icon-right item-text-wrap ink" on-hold="copy(formData.pubkey)" copy-on-click=""><i class="icon ion-key"></i> <span translate="">COMMON.PUBKEY</span><p class="gray">{{walletData.pubkey}}</p></ion-item></div></form></div></div></ion-content></ion-view>'),e.put("plugins/es/templates/user/items_profile.html",'<div ng-if="!formData.profile" class="item gray" translate>PROFILE.NO_PROFILE_DEFINED</div><div class="item" ng-if="formData.profile && formData.name && showName"><span class="gray" translate>PROFILE.TITLE</span><h3>{{formData.name}}</h3></div><div class="item item-text-wrap" ng-if="formData.profile.description"><span class="gray" translate>PROFILE.DESCRIPTION</span><h3 trust-as-html="formData.profile.description"></h3></div><div class="item" ng-if="formData.profile.address || formData.profile.city" copy-on-click="{{formData.profile.address ? formData.profile.address + \'&#10;\' : \'\'}}{{formData.profile.city}}"><span class="gray" translate>LOCATION.LOCATION_DIVIDER</span><h3><span class="text-keep-lines" ng-if="formData.profile.address">{{formData.profile.address}}<br></span>{{formData.profile.city}}</h3></div><div class="item" ng-if="formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl"><span class="gray" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span><div class="list no-padding"><ion-item ng-repeat="social in formData.profile.socials | filter:filterFn track by social.url " id="social-{{::social.url|formatSlug}}" class="item-icon-left item-text-wrap no-padding-bottom ink" on-tap="openSocial($event, social)"><i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i><p ng-if="social.type && social.type != \'web\'">{{social.type}} <i class="ion-locked" ng-if="social.recipient"></i></p><h4><a on-tap="openSocial($event, social)" href="{{::social.url}}" target="_blank">{{::social.url}}</a></h4></ion-item></div></div>'),e.put("plugins/es/templates/wallet/item_wallet_extend.html",'<h4 class="dark" ng-if=":state:enable && wallet.id!=\'default\'"><a ng-if="walletData.invitations.unreadCount"><i class="dark ion-person-stalker"></i> {{walletData.invitations.unreadCount}} </a><a ng-if="walletData.messages.unreadCount" ui-sref="app.user_messages_by_id.tab_inbox({id: wallet.id})"><i class="dark ion-email"></i> {{walletData.messages.unreadCount}} </a><a ng-if="walletData.notifications.unreadCount" ui-sref="app.view_notifications_by_id({id: wallet.id})"><i class="dark ion-android-notifications"></i> {{walletData.notifications.unreadCount}}</a></h4>'),e.put("plugins/es/templates/wallet/view_wallet_extend.html",'<ng-if ng-if=":state:enable"><div class="item item-divider item-divider-top-border"><span>{{\'PROFILE.PROFILE_DIVIDER\' | translate}} <i style="font-size: 12pt; cursor: pointer" ng-click="showProfileHelp=!showProfileHelp" class="icon positive ion-ios-help-outline" title="{{\'PROFILE.PROFILE_DIVIDER_HELP\' | translate}}"></i> </span><a class="badge button button-text button-small button-small-padding" ng-if="isDefaultWallet" ui-sref="app.edit_profile"><i class="icon ion-edit"></i> <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span> <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span> </a><a class="badge button button-text button-small button-small-padding" ng-if="!isDefaultWallet" ui-sref="app.edit_profile_by_id({id: walletId})"><i class="icon ion-edit"></i> <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span> <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span></a></div><div class="item item-text-wrap positive item-small-height" ng-show="showProfileHelp"><small translate>PROFILE.PROFILE_DIVIDER_HELP</small></div><ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=true"></ng-include><div class="item item-divider item-divider-top-border"><span>{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\' | translate}} <i style="font-size: 12pt; cursor: pointer" ng-click="showSubscriptionHelp=!showSubscriptionHelp" class="icon positive ion-ios-help-outline" title="{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\' | translate}}"></i> <span><a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count && isDefaultWallet" ui-sref="app.edit_subscriptions"><i class="icon ion-edit"></i> <span translate>SUBSCRIPTION.BTN_ADD</span> </a><a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count && !isDefaultWallet" ui-sref="app.edit_subscriptions_by_id({id: walletId})"><i class="icon ion-edit"></i> <span translate>SUBSCRIPTION.BTN_ADD</span></a></span></span></div><div class="item item-text-wrap positive item-small-height" ng-show="showSubscriptionHelp"><small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small></div><div ng-if="!formData.subscriptions.count" class="item gray" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count && isDefaultWallet" ui-sref="app.edit_subscriptions"><i class="icon ion-gear-a"></i> <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span> <span class="badge badge-calm">{{formData.subscriptions.count}}</span> <i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count && !isDefaultWallet" ui-sref="app.edit_subscriptions_by_id({id: walletId})"><i class="icon ion-gear-a"></i> <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span> <span class="badge badge-calm">{{formData.subscriptions.count}}</span> <i class="gray icon ion-ios-arrow-right"></i></a><div class="item item-divider item-divider-top-border"><span>{{\'REGISTRY.WALLET.REGISTRY_DIVIDER\' | translate}} <i style="font-size: 12pt; cursor: pointer" ng-click="showPagesHelp=!showPagesHelp" class="icon positive ion-ios-help-outline" title="{{\'REGISTRY.WALLET.REGISTRY_HELP\' | translate}}"></i> <span><a class="badge button button-text button-small button-small-padding" ng-if="!formData.pages.count" ng-click="showNewPageModal()"><i class="icon ion-edit"></i> <span translate>REGISTRY.BTN_NEW</span></a></span></span></div><div class="item item-text-wrap positive item-small-height" ng-show="showPagesHelp"><small translate>REGISTRY.WALLET.REGISTRY_HELP</small></div><div ng-if="!formData.pages.count" class="item gray" translate>REGISTRY.NO_PAGE</div><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count && isDefaultWallet" ui-sref="app.wallet_pages"><i class="icon ion-social-buffer"></i> <span translate>REGISTRY.MY_PAGES</span> <span class="badge badge-calm">{{formData.pages.count}}</span> <i class="gray icon ion-ios-arrow-right"></i> </a><a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count && !isDefaultWallet" ui-sref="app.wallet_pages_by_id({id: walletId})"><i class="icon ion-social-buffer"></i> <span translate>REGISTRY.MY_PAGES</span> <span class="badge badge-calm">{{formData.pages.count}}</span> <i class="gray icon ion-ios-arrow-right"></i></a></ng-if>'),e.put("plugins/es/templates/wot/lookup_extend.html",'<ion-tab ng-if=":state:enable" title="{{\'MENU.REGISTRY\'|translate}}" icon="ion-social-buffer" ui-sref="app.wot_lookup.tab_registry"><ion-nav-view name="tab_registry"></ion-nav-view></ion-tab>'),
+e.put("plugins/es/templates/wot/lookup_item_group.html",'<i ng-if="::!item.avatar" class="item-image icon ion-android-people"></i> <i ng-if="::!item.avatar" class="item-image icon-secondary ion-android-lock" style="left: 20px; top: 17px; font-size: 19px; color: #d9d9d9"></i> <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i><h2 ng-bind-html=":rebind:item.name"></h2><h4 class="gray"><i class="ion-clock"></i> {{:rebind:\'GROUP.CREATED_TIME\'|translate: item }}</h4><h4 class="dark pull-left" ng-if=":rebind:item.membersCount"><i class="dark ion-person"></i> <span class="dark">+{{:rebind:item.membersCount}}</span></h4><h4 class="dark"><span class="dark" ng-if="::item.description"><i class="ion-quote"></i> {{::item.description|truncText}}</span></h4><h4 ng-if="::item.tags"><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),e.put("plugins/es/templates/wot/lookup_item_page.html",'<i ng-if="::!item.avatar" class="item-image icon cion-page-{{item.type}}"></i> <i ng-if="::item.avatar" class="item-image avatar" style="background-image: url({{::item.avatar.src}})"></i><h2 ng-bind-html=":rebind:item.name"></h2><h4 class="gray"><span class="gray" ng-if="::item.city"><i class="ion-location"></i> {{::item.city|truncText}} </span><span ng-if="::item.city && item.type">|</span> <span ng-if="item.type"><i class="cion-page-{{item.type}}"></i> {{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</span></h4><h4 class="dark"><span class="dark" ng-if="::item.description"><i class="ion-quote"></i> {{::item.description|truncText}}</span></h4><h4 ng-if="::item.tags"><span ng-if="::item.tags" class="dark"><ng-repeat ng-repeat="tag in ::item.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),e.put("plugins/es/templates/wot/lookup_lg_extend.html",'<div class="buttons-tabs" ng-if=":state:enable"><div class="pull-right"><div class="button button-tab dark" title="{{\'REGISTRY.BTN_SHOW_WOT_HELP\' | translate}}" nav-transition="none" active-link="active" active-link-path-prefix="#/app/wot/lg" ui-sref="app.wot_lookup_lg"><i class="icon ion-person-stalker"></i> {{\'REGISTRY.BTN_SHOW_WOT\' | translate}}</div><a class="button button-tab ink dark" title="{{\'REGISTRY.BTN_SHOW_PAGES_HELP\' | translate}}" nav-transition="none" active-link="active" active-link-path-prefix="#/app/wot/page" ui-sref="app.registry_lookup_lg"><i class="icon ion-social-buffer"></i> {{\'REGISTRY.BTN_SHOW_PAGES\' | translate}}</a></div><div class="pull-right" ng-if="showNewPageButton">&nbsp;</div></div>'),e.put("plugins/es/templates/wot/popover_certification_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-if="canCertify" ng-click="certify()"><i class="icon ion-ribbon-b"></i> {{\'WOT.BTN_CERTIFY\' | translate}} </a><a class="item item-icon-left ink" ng-if="!isUserPubkey(formData.pubkey) && formData.isMember" ng-click="askCertification()"><i class="icon-secondary ion-ribbon-b" style="left: 16px; top: 0px; font-size: 25px"></i> <b class="icon-secondary ion-help" style="left: 35px; top: 0px"></b> {{\'WOT.BTN_ASK_CERTIFICATION\' | translate}} </a><a class="item item-icon-left ink" ng-if="isUserPubkey(formData.pubkey)" ng-click="showAskCertificationModal()"><i class="icon-secondary ion-ribbon-b" style="left: 16px; top: 0px; font-size: 25px"></i> <b class="icon-secondary ion-help" style="left: 35px; top: 0px"></b> {{\'WOT.BTN_ASK_CERTIFICATIONS_DOTS\' | translate}} </a><a class="item item-icon-left ink" ng-if="!isUserPubkey(formData.pubkey)" ng-click="showSuggestCertificationModal()"><i class="icon-secondary ion-person-stalker" style="left: 16px; top: 0px; font-size: 25px"></i> <b class="icon-secondary ion-help" style="left: 37px; top: -4px"></b> {{\'WOT.BTN_SUGGEST_CERTIFICATIONS_DOTS\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("plugins/es/templates/wot/view_certifications_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'nav-buttons\'"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showCertificationActionsPopover($event)"></button></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'buttons\'"><button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showCertificationActionsPopover($event)" title="{{\'COMMON.POPOVER_ACTIONS_TITLE\' | translate}}"></button></ng-if>'),e.put("plugins/es/templates/wot/view_identity_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'"><button class="button button-stable button-small-padding icon ion-compose" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}"></button></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'buttons-top-fab\'"><button id="fab-compose-{{:rebind:formData.uid}}" class="button button-fab button-fab-top-left button-fab-hero mini button-stable spin" style="left: 88px" ng-click="showNewMessageModal()"><i class="icon ion-compose"></i></button></ng-if><ng-if ng-if=":state:enable && extensionPoint === \'after-general\'"><span class="item item-divider item-divider-top-border"><span>{{\'PROFILE.PROFILE_DIVIDER\' | translate}} <a style="font-size: 12pt; cursor: pointer" ng-click="showProfileHelp=!showProfileHelp" class="icon positive ion-ios-help-outline ink" title="{{\'PROFILE.PROFILE_DIVIDER_HELP\' | translate}}"></a></span></span><div class="item item-text-wrap positive item-small-height" ng-show="showProfileHelp"><small translate>PROFILE.PROFILE_DIVIDER_HELP</small></div><ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=false;"></ng-include></ng-if>'),e.put("plugins/graph/templates/account/graph_balance.html",'\n    \x3c!-- button bar --\x3e\n    <div class="button-bar-inline "\n         style="top: 33px; margin-top:-33px; position: relative;">\n      <button\n        class="button button-stable button-clear no-padding-xs pull-right"\n        ng-click="showActionsPopover($event)">\n        <i class="icon ion-navicon-round"></i>\n      </button>\n    </div>\n\n    <div class="padding-left padding-right">\n      <canvas id="account-balance" class="chart-bar"\n              height="{{height}}" width="{{width}}"\n              chart-data="data"\n              chart-dataset-override="datasetOverride"\n              chart-colors="colors"\n              chart-options="options"\n              chart-labels="labels"\n              chart-click="onChartClick">\n      </canvas>\n    </div>\n\n    <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/account/graph_certifications.html",'\n    <div class="padding-left padding-right">\n      <canvas id="account-certifications" class="chart-bar"\n              height="{{height}}" width="{{width}}"\n              chart-data="data"\n              chart-dataset-override="datasetOverride"\n              chart-colors="colors"\n              chart-options="options"\n              chart-labels="labels"\n              chart-click="onChartClick">\n      </canvas>\n    </div>\n'),e.put("plugins/graph/templates/account/graph_sum_tx.html",'<div class="row responsive-sm" ng-if="!loading">\n\n  <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n  <div class="col text-center">\n\n    \x3c!-- TX input chart --\x3e\n    <p class="gray padding text-wrap"\n       ng-if="inputChart.data.length"\n       translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\n    <canvas id="chart-received-pie" class="chart-pie"\n            chart-data="inputChart.data"\n            chart-labels="inputChart.labels"\n            chart-colors="inputChart.colors"\n            chart-click="onInputChartClick">\n    </canvas>\n\n  </div>\n\n  <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n  <div class="col text-center">\n\n    \x3c!-- TX output chart --\x3e\n    <p class="gray padding text-wrap"\n       ng-if="outputChart.data.length"\n       translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\n    <canvas id="chart-sent-pie" class="chart-pie"\n            chart-data="outputChart.data"\n            chart-labels="outputChart.labels"\n            chart-colors="outputChart.colors"\n            chart-click="onOutputChartClick">\n    </canvas>\n\n  </div>\n\n  <div class="col col-10 hidden-xs hidden-sm">&nbsp;</div>\n\n</div>\n'),e.put("plugins/graph/templates/account/view_identity_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="extensionPoint === \'buttons\'">\n\n  <button class="button button-stable button-small-padding icon ion-stats-bars"\n          ng-click="showIdentityStats()"\n          title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n  </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/account/view_identity_tx_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="extensionPoint === \'buttons\'">\n\n  <button class="button button-stable button-small-padding icon ion-stats-bars"\n          ng-click="showIdentityStats()"\n          title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n  </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/account/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.ACCOUNT.TITLE\' | translate}}{{id}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="no-padding">\n\n\n\n    <div class="list" >\n\n      \x3c!--  - - - - Balance - - - - --\x3e\n      <ng-controller ng-controller="GpAccountBalanceCtrl">\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        <div class="item item-divider" ng-if="!loading" >\n          {{\'GRAPH.ACCOUNT.BALANCE_DIVIDER\'|translate}}\n          <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n        </div>\n\n        <div class="item no-padding-xs"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/account/graph_balance.html\'"\n             ng-init="setSize(350, 1000)">\n        </div>\n      </ng-controller>\n\n    </div>\n\n    <div class="item no-padding-xs"\n         ng-include="\'plugins/graph/templates/account/graph_sum_tx.html\'"\n         ng-controller="GpAccountSumTxCtrl">\n    </div>\n\n    \x3c!--  - - - - WOT - - - -\n    <div class="item item-divider" translate>\n      GRAPH.ACCOUNT.WOT_DIVIDER\n    </div>\n\n    <div class="item no-padding-xs"\n         ng-include="\'plugins/graph/templates/account/graph_certifications.html\'"\n         ng-controller="GpAccountCertificationCtrl"\n         ng-init="setSize(350, 1000)">\n    </div>--\x3e\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/account/view_wallet_tx_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="extensionPoint === \'buttons\'">\n\n  <button class="button button-stable button-small-padding icon ion-stats-bars"\n          ng-click="showWalletStats()"\n          title="{{\'GRAPH.ACCOUNT.BTN_SHOW_STATS\' | translate}}">\n  </button>\n\n</ng-if>\n'),e.put("plugins/graph/templates/blockchain/graph_block_issuers.html",'\n    <div class="row responsive-lg">\n\n      \x3c!-- bar --\x3e\n      <div class="col col-75">\n        <canvas id="bar" class="chart-bar"\n                height="{{height}}" width="{{width}}"\n                chart-data="data"\n                chart-labels="labels"\n                chart-colors="colors"\n                chart-options="barOptions"\n                chart-click="onChartClick">\n        </canvas>\n      </div>\n\n      \x3c!-- pie --\x3e\n      <div class="col col-25 padding-top">\n        <canvas id="blocksByIssuer-pie" class="chart-pie"\n                chart-data="data"\n                chart-labels="labels"\n                chart-colors="colors"\n                chart-click="onChartClick">\n        </canvas>\n\n        <div class="gray padding-top text-center">\n          <small ng-bind-html="\'GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_HELP\'| translate:{issuerCount: data.length, blockCount: blockCount }"></small>\n        </div>\n      </div>\n    </div>\n'),e.put("plugins/graph/templates/blockchain/graph_tx_count.html",'\n    \x3c!-- button bar --\x3e\n    <div class="button-bar-inline "\n         style="top: 33px; margin-top:-33px; position: relative;">\n      <button\n        class="button button-stable button-clear no-padding-xs pull-right"\n        ng-click="showActionsPopover($event)">\n        <i class="icon ion-navicon-round"></i>\n      </button>\n    </div>\n\n    <div class="padding-left padding-right">\n      <canvas id="tx-line" class="chart-bar"\n              height="{{height}}" width="{{width}}"\n              chart-data="data"\n              chart-dataset-override="datasetOverride"\n              chart-colors="colors"\n              chart-options="options"\n              chart-labels="labels"\n              chart-click="onChartClick">\n      </canvas>\n    </div>\n\n    <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/blockchain/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}{{id}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="no-padding">\n\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <div class="list" ng-if="!loading">\n\n\n      \x3c!-- TX count --\x3e\n      <ng-controller ng-controller="GpBlockchainTxCountCtrl">\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        <div class="item item-divider" ng-if="!loading" >\n          {{\'GRAPH.BLOCKCHAIN.TX_DIVIDER\'|translate}}\n          <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n        </div>\n\n        <div class="item no-padding-xs no-padding-sm"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/blockchain/graph_tx_count.html\'"\n             ng-init="setSize(350, 1000)">\n        </div>\n      </ng-controller>\n\n\n      \x3c!-- Blocks issuer --\x3e\n      <ng-controller ng-controller="GpBlockchainIssuersCtrl">\n\n        <div class="item item-divider" ng-if="!loading" translate>GRAPH.BLOCKCHAIN.BLOCKS_ISSUERS_DIVIDER</div>\n\n        <div class="item no-padding-xs no-padding-sm"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/blockchain/graph_block_issuers.html\'"\n             ng-init="setSize(300, 750)">\n        </div>\n\n      </ng-controller>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/common/graph_range_bar.html",'\n  <div class="range range-positive no-padding-left no-padding-right">\n    <a\n      class="button button-stable button-clear no-padding pull-left"\n      ng-click="goPreviousRange($event)">\n      <i class="icon ion-chevron-left"></i>\n    </a>\n    <input type="range"\n           ng-model="formData.timePct"\n           name="timePct"\n           min="0" max="100"\n           value="{{formData.timePct}}"\n           ng-change="onRangeChanged();"\n           ng-model-options="{ debounce: 250 }">\n    <a\n      class="button button-stable button-clear no-padding pull-right"\n      ng-click="goNextRange($event)">\n      <i class="icon ion-chevron-right"></i>\n    </a>\n  </div>\n'),e.put("plugins/graph/templates/common/popover_range_actions.html",'<ion-popover-view class="has-header popover-graph-currency">\n  <ion-header-bar>\n    <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n  </ion-header-bar>\n  <ion-content scroll="false">\n    <div class="list item-text-wrap">\n\n      \x3c!-- scale --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="toggleScale()">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.scale==\'logarithmic\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.LOGARITHMIC_SCALE\' | translate"></span>\n      </a>\n\n      \x3c!-- duration divider --\x3e\n      <div class="item item-divider">\n        {{\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\'|translate}}\n      </div>\n\n      \x3c!-- duration: hour --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="setRangeDuration(\'hour\')">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'hour\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.HOUR\' | translate"></span>\n      </a>\n\n      \x3c!-- duration: day --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="setRangeDuration(\'day\')">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'day\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.DAY\' | translate"></span>\n      </a>\n\n      \x3c!-- duration: month --\x3e\n      <a class="item item-icon-left ink"\n         ng-click="setRangeDuration(\'month\')">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'month\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.MONTH\' | translate"></span>\n      </a>\n\n    </div>\n  </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/currency/graph_du.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs no-padding-sm pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="monetaryMass-bar" class="chart-bar"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="data"\n          chart-labels="labels"\n          chart-colors="colors"\n          chart-dataset-override="datasetOverride"\n          chart-options="options"\n          chart-click="showBlock">\n  </canvas>\n'),e.put("plugins/graph/templates/currency/graph_members_count.html",'  <canvas id="membersCount-bar" class="chart-line"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="data"\n          chart-labels="labels"\n          chart-colors="colors"\n          chart-options="options"\n          chart-dataset-override="datasetOverride"\n          chart-click="onChartClick">\n  </canvas>\n'),e.put("plugins/graph/templates/currency/graph_monetary_mass.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="monetaryMass-bar"\n          class="chart-bar"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="data"\n          chart-labels="labels"\n          chart-colors="colors"\n          chart-dataset-override="datasetOverride"\n          chart-options="options"\n          chart-click="onChartClick">\n  </canvas>\n'),e.put("plugins/graph/templates/currency/popover_monetary_mass_actions.html",'<ion-popover-view class="fit has-header">\n  <ion-header-bar>\n    <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n  </ion-header-bar>\n  <ion-content scroll="false">\n    <div class="list item-text-wrap">\n\n      <a class="item item-icon-left ink"\n         ng-click="toggleScale()">\n        <i class="icon ion-ios-checkmark-empty" ng-show="formData.scale==\'logarithmic\'"></i>\n        <span ng-bind-html="\'GRAPH.COMMON.LOGARITHMIC_SCALE\' | translate"></span>\n      </a>\n\n    </div>\n  </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/currency/tab_blocks_extend.html",'\x3c!-- buttons --\x3e\n<ng-if ng-if="enable && extensionPoint === \'buttons\'">\n  <div class="item item-divider">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_blocks_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n'),e.put("plugins/graph/templates/currency/view_currency_extend.html",'\n\x3c!-- section actual parameters --\x3e\n<ng-if ng-if="enable && extensionPoint === \'parameters-actual\'" >\n\n  <ng-if ng-if="!smallscreen">\n    <div class="item padding-left padding-right no-padding-xs no-padding-sm"\n         ng-include="\'plugins/graph/templates/currency/graph_monetary_mass.html\'"\n         ng-controller="GpCurrencyMonetaryMassCtrl"\n         ng-init="displayShareAxis=false;">\n    </div>\n    <div class="item buttons no-padding-top ">\n      <a class="pull-right button button-text button-small button-small-padding ink" ui-sref="app.currency_stats_lg">\n        <i class="icon ion-stats-bars"></i>\n        <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\n      </a>\n    </div>\n  </ng-if>\n\n  <div class="item item-divider"\n       ng-if="smallscreen">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_parameters_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n\n\x3c!-- section Wot --\x3e\n<ng-if ng-if="enable && extensionPoint === \'wot-actual\'" >\n\n  <ng-if ng-if="!smallscreen">\n    <div class="item padding-left padding-right no-padding-xs no-padding-sm"\n         ng-include="\'plugins/graph/templates/currency/graph_members_count.html\'"\n         ng-controller="GpCurrencyMembersCountCtrl">\n    </div>\n    <div class="item buttons no-padding-top ">\n      <a class="pull-right button button-text button-small button-small-padding ink" ui-sref="app.currency_stats_lg">\n        <i class="icon ion-stats-bars"></i>\n        <span translate>GRAPH.COMMON.BTN_SHOW_DETAILED_STATS</span>\n      </a>\n    </div>\n  </ng-if>\n\n  <div class="item item-divider"\n       ng-if="smallscreen">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_wot_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n\n\x3c!-- section Wot --\x3e\n<ng-if ng-if="enable && extensionPoint === \'network-actual\'" >\n\n  <div class="item padding-left padding-right no-padding-xs no-padding-sm"\n       ng-if="!smallscreen"\n       ng-include="\'plugins/graph/templates/blockchain/graph_block_issuers.html\'"\n       ng-controller="GpBlockchainIssuersCtrl">\n  </div>\n\n  <div class="item item-divider"\n       ng-if="smallscreen">\n    <a class="badge button button-text button-small button-small-padding ink" ui-sref="app.currency.tab_network_stats">\n      <i class="icon ion-stats-bars"></i>\n      <span translate>GRAPH.COMMON.BTN_SHOW_STATS</span>\n    </a>\n  </div>\n</ng-if>\n\n'),e.put("plugins/graph/templates/currency/view_stats_lg.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="padding" >\n\n\n\n    <div class="list" >\n\n      \x3c!-- Monetary mass --\x3e\n      <ng-controller ng-controller="GpCurrencyMonetaryMassCtrl" >\n\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        <div class="item no-padding-xs" ng-if="!loading"\n             ng-include="\'plugins/graph/templates/currency/graph_monetary_mass.html\'"\n             ng-init="setSize(250, 1000)">\n        </div>\n\n        <div ng-if="!loading"\n             class="item item-toggle dark no-border text-right">\n          <span class="" translate>COMMON.BTN_RELATIVE_UNIT</span>\n          <label class="toggle toggle-royal" id="helptip-currency-change-unit">\n            <input type="checkbox" ng-model="formData.useRelative">\n            <div class="track">\n              <div class="handle"></div>\n            </div>\n          </label>\n        </div>\n      </ng-controller>\n\n      \x3c!-- DU --\x3e\n      <ng-controller ng-controller="GpCurrencyDUCtrl" >\n        <div class="item no-padding-xs"\n             ng-if="!loading"\n             ng-include="\'plugins/graph/templates/currency/graph_du.html\'"\n             ng-init="setSize(250, 1000)">\n        </div>\n      </ng-controller>\n\n      \x3c!-- Member count  --\x3e\n      <ng-controller ng-controller="GpCurrencyMembersCountCtrl" >\n      <div class="item no-padding-xs"\n           ng-if="!loading"\n           ng-include="\'plugins/graph/templates/currency/graph_members_count.html\'"\n           ng-init="setSize(250, 1000)">\n      </div>\n\n\n    </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/currency/view_wot_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n\n  <ion-content scroll="true" >\n\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <ng-include\n      ng-if="!loading"\n      src="\'plugins/graph/templates/currency/graph_members_count.html\'" ></ng-include>\n  </ion-content>\n  </ion-view>\n'),e.put("plugins/graph/templates/docstats/graph.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs no-padding-sm pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="{{::chartIdPrefix}}{{chart.id}}"\n          class="chart-line"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="chart.data"\n          chart-labels="labels"\n          chart-dataset-override="chart.datasetOverride"\n          chart-options="chart.options"\n          chart-click="onChartClick">\n  </canvas>\n\n  <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/docstats/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.DOC_STATS.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="padding" >\n\n    <div class="list" >\n\n      \x3c!-- Doc stat --\x3e\n      <div class="center padding" ng-if="loading">\n        <ion-spinner icon="android"></ion-spinner>\n      </div>\n\n      <div class="item no-padding-xs no-padding-sm" ng-if="!loading"\n           ng-repeat="chart in charts"\n           ng-include="\'plugins/graph/templates/docstats/graph.html\'"\n           ng-init="setSize(250, 1000)">\n      </div>\n\n    </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/network/view_network_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="enable && extensionPoint === \'buttons\'">\n  <a class="button button-text button-small ink"\n     ui-sref="app.blockchain_stats" >\n    <i class="icon ion-stats-bars"></i>\n    <span>{{\'NETWORK.VIEW.BTN_GRAPH\'|translate}}</span>\n  </a>\n</ng-if>\n'),e.put("plugins/graph/templates/network/view_peer_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if="enable && extensionPoint === \'general\'">\n\n  <a class="item item-icon-left item-icon-right item-text-wrap ink"\n    ui-sref="app.view_peer_stats({pubkey: node.pubkey})">\n    <i class="icon ion-stats-bars"></i>\n    <span translate>GRAPH.PEER.VIEW.BLOCK_COUNT_LABEL</span>\n    <span class="badge"\n          ng-if="!loading"\n          ng-class="{\'badge-stable\': blockCount > 0, \'badge-assertive\': !blockCount}">\n      {{!blockCount ? \'GRAPH.PEER.VIEW.NO_BLOCK\' : \'GRAPH.PEER.VIEW.BLOCK_COUNT\' | translate:{count: blockCount} }}\n    </span>\n    <ion-spinner class="badge" icon="android" ng-if="loading"></ion-spinner>\n    <i class="gray icon ion-ios-arrow-right"></i>\n  </a>\n</ng-if>\n\n'),e.put("plugins/graph/templates/network/view_peer_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.BLOCKCHAIN.TITLE\' | translate}}{{id}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="no-padding">\n\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <div class="list" ng-if="!loading">\n\n      \x3c!--  - - - - TX divider - - - - --\x3e\n      <div class="item item-divider hidden-xs hidden-sm" translate>\n        GRAPH.BLOCKCHAIN.TX_DIVIDER\n      </div>\n\n      <div class="item no-padding-xs"\n           ng-include="\'plugins/graph/templates/blockchain/graph_tx_count.html\'"\n           ng-init="setSize(350, 1000)">\n      </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/synchro/graph.html",'\n  \x3c!-- graphs button bar --\x3e\n  <div class="button-bar-inline "\n       style="top: 33px; margin-top:-33px; position: relative;">\n    <button\n      class="button button-stable button-clear no-padding-xs pull-right"\n      ng-click="showActionsPopover($event)">\n      <i class="icon ion-navicon-round"></i>\n    </button>\n  </div>\n\n  <canvas id="synchro-chart-{{chart.id}}"\n          class="chart-bar"\n          height="{{height}}"\n          width="{{width}}"\n          chart-data="chart.data"\n          chart-labels="labels"\n          chart-dataset-override="chart.datasetOverride"\n          chart-options="chart.options">\n  </canvas>\n\n  <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/synchro/view_stats.html",'<ion-view left-buttons="leftButtons"\n          cache-view="false">\n  <ion-nav-title>\n    {{\'GRAPH.SYNCHRO.TITLE\' | translate}}\n  </ion-nav-title>\n\n  <ion-content scroll="true" class="padding" >\n\n    <div class="list" >\n\n      <div class="center padding" ng-if="loading">\n        <ion-spinner icon="android"></ion-spinner>\n      </div>\n\n      <div class="item no-padding-xs" ng-if="!loading"\n           ng-repeat="chart in charts"\n           ng-include="\'plugins/graph/templates/synchro/graph.html\'"\n           ng-init="setSize(250, 1000)">\n      </div>\n\n    </div>\n\n  </ion-content>\n\n</ion-view>\n'),e.put("plugins/map/templates/network/item_search_tooltip.html","<a href=\"#\">\n  {{peer.dns || peer.server}}\n  <span class=\"{{peer.uid ? 'positive' : 'gray'}}\">\n    <i class=\"icon {{peer.uid ? 'ion-person' : 'ion-key'}}\"></i>\n    {{peer.uid ? (peer.name||peer.uid) : (peer.pubkey|formatPubkey) }}\n  </span>\n  <span class=\"gray\">{{peer.ipv4 ? (peer.ipv4 + ':' + peer.port) : ''}}</span>\n  <span class=\"{{peer.bma.useSsl  ? '' : 'ng-hide'}}\"><i class=\"ion-locked\"></i> <small>SSL</small></span>\n</a>\n"),e.put("plugins/map/templates/network/lookup_extend.html",'\x3c!-- FIXME issue #755 - https://git.duniter.org/clients/cesium-grp/cesium/issues/755\n<a ng-if="enable"\n   class="button button-text button-small ink hidden-sm hidden-xs"\n   title="{{\'MAP.NETWORK.LOOKUP.BTN_MAP_HELP\' | translate}}"\n        ui-sref="app.view_network_map">\n  <i class="icon ion-ios-location"></i>\n  {{\'MAP.NETWORK.LOOKUP.BTN_MAP\' | translate}}\n</a>\n --\x3e\n'),
+e.put("plugins/map/templates/network/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-network">\n  <ion-nav-title>\n    <span class="hidden-xs" translate>MAP.NETWORK.VIEW.TITLE</span>\n  </ion-nav-title>\n\n  <ion-nav-buttons side="secondary">\n  </ion-nav-buttons>\n\n  <ion-content data-tap-disabled="true">\n    <leaflet id="{{::mapId}}"\n             height="100%"\n             center="map.center"\n             markers="map.markers"\n             layers="map.layers">\n    </leaflet>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/map/templates/registry/item_search_tooltip.html","<a href=\"#\" class=\"{{type}}\">\n  <i class=\"{{'cion-page-' + type}}\"></i>\n  {{name != uid ? name +' ' : ''}}\n  <span class=\"gray\">\n    {{pubkey ? (pubkey|formatPubkey) : ''}}\n  </span>\n</a>\n"),e.put("plugins/map/templates/registry/lookup_lg_extend.html",'<a class="button button-text button-small ink hidden-sm hidden-xs"\n   title="{{\'MAP.REGISTRY.LOOKUP.BTN_MAP_HELP\' | translate}}"\n   ui-sref="app.view_registry_map">\n  <i class="icon ion-ios-location"></i>\n  {{\'MAP.REGISTRY.LOOKUP.BTN_MAP\' | translate}}\n</a>\n'),e.put("plugins/map/templates/registry/popup_marker.html",'<div class="item no-border no-padding item-avatar "\n     ng-if="loadingMarker">\n\n  <i class="item-image icon ion-person"></i>\n\n  <div class="item-content item-avatar-left-padding padding-top" >\n    <h2 class="stable-bg">\n      &nbsp;\n    </h2>\n    <h4 class="stable-bg col-75">\n      &nbsp;\n    </h4>\n    <h4 class="stable-bg col-50">\n      &nbsp;\n    </h4>\n  </div>\n</div>\n\n<a class="item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide"\n     ng-show="!loadingMarker"\n     ui-sref="app.view_page({id: formData.id, title: formData.name})">\n  <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}}"></i>\n  <i ng-if="!formData.avatar" class="item-image icon cion-page-{{::formData.type}}"></i>\n  <div class="item-content item-avatar-left-padding padding-top">\n    <h2 class="dark">\n      {{::formData.name}}\n    </h2>\n    <h4 ng-if="::formData.category" class="gray" title="{{::formData.category.name}}">\n      <b class="ion-flag"></b> {{::formData.category.name}}\n    </h4>\n    <h4 ng-if="::formData.city" class="gray" title="{{::formData.city}}">\n      <b class="ion-location"></b> {{::formData.city}}\n    </h4>\n  </div>\n</a>\n\x3c!-- buttons --\x3e\n<div class="item no-border no-padding">\n  <div class="pull-left gray">\n    \x3c!-- show description --\x3e\n    <a class="animate-fade-in animate-show-hide gray ng-hide"\n       ng-class="{\'ion-arrow-down-b\': !showDescription, \'ion-arrow-up-b\': showDescription}"\n       ng-click="showDescription=!showDescription;"\n       title="{{\'PROFILE.DESCRIPTION\'|translate}}"\n       ng-show="!loadingMarker && formData.description">\n      &nbsp;\n    </a>\n  </div>\n</div>\n<div class="item no-border no-padding item-text-wrap hidden-xs ng-hide" ng-show="showDescription">\n  <small trust-as-html="::formData.description|truncText:500"></small>\n</div>\n'),e.put("plugins/map/templates/registry/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-registry">\n  <ion-nav-title>\n    <span class="hidden-xs" translate>MAP.REGISTRY.VIEW.TITLE</span>\n  </ion-nav-title>\n\n  <ion-nav-buttons side="secondary">\n    <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n    </button>\n  </ion-nav-buttons>\n\n  <ion-content data-tap-disabled="true">\n    <a id="helptip-map-registry" style="left: 150px; top: 50px; position: relative;"></a>\n    <leaflet id="{{::mapId}}"\n             height="100%"\n             layers="map.layers"\n             markers="map.markers"\n             lf-center="map.center"\n             bounds="map.bounds">\n    </leaflet>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/map/templates/settings/es_settings_extend.html",'\n\x3c!--<span class="item item-divider" translate>MAP.SETTINGS.MAP_DIVIDER</span>\n\n<label class="item item-toggle dark item-text-wrap">\n  <span translate>MAP.SETTINGS.ENABLE_GOOGLE_API</span>\n  <h4 class="gray" translate>MAP.SETTINGS.ENABLE_GOOGLE_API_HELP</h4>\n  <div class="toggle toggle-royal">\n    <input type="checkbox" ng-model="formData.enableGoogleApi">\n    <div class="track">\n      <div class="handle"></div>\n    </div>\n  </div>\n</label>\n\n<ion-item class="item-input"\n          ng-if="!$root.config.plugins.es.googleApiKey"\n          ng-class="{\'item-input-error\': formData.enableGoogleApi && !formData.googleApiKey}">\n  <div class="input-label col-33">\n    <span class="" ng-class="{\'gray\': !formData.enableGoogleApi}"translate>MAP.SETTINGS.GOOGLE_API_KEY</span>\n    <h4>\n      <a ng-click="openLink($event, \'https://console.developers.google.com/apis/credentials/key\')" translate>MAP.SETTINGS.BTN_GOOGLE_API</a>\n      <span class="gray"> ({{\'MAP.SETTINGS.BTN_GOOGLE_API_WARNING\'|translate}})</span>\n    </h4>\n  </div>\n  <input type="text"\n         placeholder="{{\'MAP.SETTINGS.GOOGLE_API_KEY_PLACEHOLDER\' | translate}}"\n         ng-model="formData.googleApiKey"\n         ng-if="formData.enableGoogleApi">\n</ion-item>\n<div class="form-errors"\n     ng-show="formData.enableGoogleApi && !formData.googleApiKey">\n  <div class="form-error">\n    <span translate="ERROR.FIELD_REQUIRED"></span>\n  </div>\n</div>--\x3e\n'),e.put("plugins/map/templates/user/edit_profile_extend.html",'<div class="item no-padding hidden-xs hidden-sm {{ionItemClass}}" ng-if="formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon">\n  <leaflet id="{{::mapId}}"\n           height="250px"\n           center="map.center"\n           markers="map.markers"\n           defaults="map.defaults">\n  </leaflet>\n</div>\n'),e.put("plugins/map/templates/wot/item_search_tooltip.html","<a href=\"#\" class=\"{{type}}\">\n  <i class=\"{{pending ? 'ion-clock': (type ? 'cion-page-' + type : '')}}\"></i>\n  {{name != uid ? name +' ' : ''}}\n  <span class=\"{{uid ? 'positive' : 'gray'}}\">\n    <i class=\"{{uid ? 'ion-person' : 'ion-key'}}\"></i>\n    {{uid ? uid : (pubkey|formatPubkey) }}\n  </span>\n</a>\n"),e.put("plugins/map/templates/wot/lookup_lg_extend.html",'<a ng-if="enable"\n   class="button button-text button-small ink hidden-sm hidden-xs"\n   title="{{\'MAP.WOT.LOOKUP.BTN_MAP_HELP\' | translate}}"\n   ui-sref="app.view_wot_map">\n  <i class="icon ion-ios-location"></i>\n  {{\'MAP.WOT.LOOKUP.BTN_MAP\' | translate}}\n</a>\n'),e.put("plugins/map/templates/wot/popup_marker.html",'\n<div class="item no-border no-padding item-avatar "\n     ng-if="loadingMarker">\n\n  <i class="item-image icon ion-person"></i>\n\n  <div class="item-content item-avatar-left-padding padding-top" >\n    <h2 class="stable-bg">\n      &nbsp;\n    </h2>\n    <h4 class="stable-bg col-75">\n      &nbsp;\n    </h4>\n    <h4 class="stable-bg col-50">\n      &nbsp;\n    </h4>\n  </div>\n</div>\n\n<a class="item no-border no-padding item-avatar ink animate-fade-in animate-show-hide ng-hide"\n   ng-show="!loadingMarker"\n   ui-sref="app.wot_identity({pubkey: formData.pubkey, uid: formData.uid})">\n\n  <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n  <i ng-if="!formData.avatar && formData.uid" class="item-image icon ion-person"></i>\n  <i ng-if="!formData.avatar && !formData.uid" class="item-image icon ion-card"></i>\n\n  <div class="item-content item-avatar-left-padding padding-top">\n    <h2 class="dark">\n      {{formData.name}}\n    </h2>\n    <h4>\n      <span ng-if="formData.uid" class="positive">\n        <b class="ion-person"></b>\n        {{formData.uid}}\n      </span>\n      <span class="gray" title="{{formData.pubkey}}"><b class="ion-key"></b> {{formData.pubkey|formatPubkey}}</span>\n      <span class="assertive" ng-if="!formData.isMember">\n        {{::\'WOT.NOT_MEMBER_PARENTHESIS\'|translate}}\n      </span>\n    </h4>\n    <h4 ng-if="formData.profile.city" class="gray" title="{{formData.profile.city}}">\n      <b class="ion-location"></b> {{formData.profile.city}}\n    </h4>\n  </div>\n</a>\n\x3c!-- buttons --\x3e\n<div class="item no-border no-padding">\n  <div class="pull-left gray">\n    \x3c!-- show description --\x3e\n    <a class="animate-fade-in animate-show-hide gray ng-hide"\n       ng-class="{\'ion-arrow-down-b\': !showDescription, \'ion-arrow-up-b\': showDescription}"\n       ng-click="showDescription=!showDescription;"\n       title="{{\'PROFILE.DESCRIPTION\'|translate}}"\n       ng-show="!loadingMarker && formData.profile.description">\n      &nbsp;\n    </a>\n  </div>\n  <div style="font-size: 18px;" class="pull-right gray">\n    \x3c!-- share --\x3e\n    <a class="icon ion-android-share-alt "\n       ng-click="showSharePopover($event)"\n       title="{{\'COMMON.BTN_SHARE\' | translate}}">&nbsp;</a>\n    \x3c!-- certify --\x3e\n    <a class="icon ion-ribbon-b"\n       ng-click="certify()"\n       title="{{\'WOT.BTN_CERTIFY\' | translate}}"\n       ng-hide="!canCertify">&nbsp;</a>\n    \x3c!-- compose message --\x3e\n    <a class="icon ion-compose"\n       ng-click="showNewMessageModal()"\n       title="{{\'MESSAGE.BTN_WRITE\' | translate}}">&nbsp;</a>\n    \x3c!-- transfer --\x3e\n    <a class="icon ion-card"\n       ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})"\n       title="{{\'COMMON.BTN_SEND_MONEY\' | translate}}">&nbsp;</a>\n\n  </div>\n</div>\n<div class="item no-border no-padding item-text-wrap hidden-xs ng-hide" ng-show="showDescription">\n  <small trust-as-html="formData.profile.description|truncText:500"></small>\n</div>\n'),e.put("plugins/map/templates/wot/view_map.html",'<ion-view left-buttons="leftButtons" class="view-map-wot">\n  <ion-nav-title>\n    <span class="hidden-xs" translate>MAP.WOT.VIEW.TITLE</span>\n  </ion-nav-title>\n\n  <ion-nav-buttons side="secondary">\n    <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n    </button>\n  </ion-nav-buttons>\n\n  <ion-content data-tap-disabled="true">\n    <a id="helptip-map-wot" style="left: 150px; top: 50px; position: relative;"></a>\n    <leaflet id="{{::mapId}}"\n             height="100%"\n             layers="map.layers"\n             markers="map.markers"\n             lf-center="map.center"\n             bounds="map.bounds">\n    </leaflet>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/message/tabs/tab_list.html",'<ion-view><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear icon ion-android-more-vertical" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()"></ion-refresher><cs-extension-point name="buttons"></cs-extension-point><ng-include src="\'plugins/es/templates/message/list.html\'"></ng-include></ion-content><div class="visible-xs visible-sm"><button ng-if="fabButtonNewMessageId" id="{{::fabButtonNewMessageId}}" class="button button-fab button-fab-bottom-right button-assertive spin has-footer" ng-click="showNewMessageModal()"><i class="icon ion-compose"></i></button></div></ion-view>'),e.put("plugins/es/templates/registry/tabs/tab_registry.html",'<ion-view><ion-nav-buttons side="secondary"><cs-extension-point name="nav-buttons"></cs-extension-point><button class="button button-icon button-clear" ng-click="showFiltersPopover($event)"><i class="icon ion-android-funnel"></i></button> <button class="button button-icon button-clear icon ion-android-more-vertical" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doSearch()"></ion-refresher><cs-extension-point name="buttons"></cs-extension-point><ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include><ng-include src="::\'plugins/es/templates/registry/lookup_list.html\'"></ng-include></ion-content></ion-view>'),e.put("plugins/graph/templates/currency/tabs/tab_blocks_stats.html",'<ion-view>\n  <ion-content>\n    <div\n       ng-include="\'plugins/graph/templates/blockchain/graph_tx_count.html\'"\n       ng-controller="GpBlockchainTxCountCtrl"\n       ng-init="setSize(500,700,false)">\n      </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_network_stats.html",'<ion-view>\n  <ion-content>\n\n    <div class="list">\n      <div class="item"\n         ng-include="\'plugins/graph/templates/blockchain/graph_block_issuers.html\'"\n         ng-controller="GpBlockchainIssuersCtrl"\n           ng-init="setSize(500,700,true)">\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_parameters_stats.html",'<ion-view>\n  <ion-content>\n    <div class="list no-padding-xs no-padding-sm">\n\n      <ng-container ng-controller="GpCurrencyMonetaryMassCtrl">\n\n        <div class="center padding" ng-if="loading">\n          <ion-spinner icon="android"></ion-spinner>\n        </div>\n\n        \x3c!-- Monetary mass --\x3e\n        <div class="item"\n             ng-include="\'plugins/graph/templates/currency/graph_monetary_mass.html\'"\n             ng-init="setSize(500,700,true)">\n        </div>\n      </ng-container>\n\n      \x3c!-- DU --\x3e\n      <ng-container ng-controller="GpCurrencyDUCtrl">\n        <div class="item"\n             ng-include="\'plugins/graph/templates/currency/graph_du.html\'"\n             ng-init="setSize(500,700,true)">\n        </div>\n      </ng-container>\n    </div>\n  </ion-content>\n</ion-view>\n'),e.put("plugins/graph/templates/currency/tabs/tab_wot_stats.html",'<ion-view>\n  <ion-content>\n    <div class="center padding" ng-if="loading">\n      <ion-spinner icon="android"></ion-spinner>\n    </div>\n\n    <div class="list no-padding">\n      <div class="item no-padding-top"\n           ng-include="\'plugins/graph/templates/currency/graph_members_count.html\'"\n           ng-init="setSize(600,700,false)">\n      </div>\n    </div>\n  </ion-content>\n</ion-view>\n')}]),angular.module("cesium.es.plugin",["cesium.es.services","cesium.es.app.controllers","cesium.es.common.controllers","cesium.es.settings.controllers","cesium.es.currency.controllers","cesium.es.wot.controllers","cesium.es.wallet.controllers","cesium.es.profile.controllers","cesium.es.message.controllers","cesium.es.notification.controllers","cesium.es.blockchain.controllers","cesium.es.network.controllers","cesium.es.registry.controllers","cesium.es.group.controllers","cesium.es.invitation.controllers","cesium.es.subscription.controllers","cesium.es.document.controllers"]),angular.module("cesium.es.services",["cesium.es.http.services","cesium.es.comment.services","cesium.es.social.services","cesium.es.settings.services","cesium.es.crypto.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.message.services","cesium.es.modal.services","cesium.es.blockchain.services","cesium.es.registry.services","cesium.es.group.services","cesium.es.wallet.services","cesium.es.invitation.services","cesium.es.subscription.services","cesium.es.wot.services","cesium.es.tx.services","cesium.es.geo.services","cesium.es.document.services"]),angular.module("cesium.es.comment.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.profile.services"]).factory("esComment",["$rootScope","$q","UIUtils","BMA","esHttp","csWallet","csWot",function(e,t,n,i,a,o,r){"ngInject";function s(n){var i={commons:["issuer","creationTime","time","message","reply_to"]},s={index:n,fields:{commons:i.commons},raw:{search:a.post("/"+n+"/comment/_search"),remove:a.record.remove(n,"comment"),wsChanges:a.ws("/ws/_changes"),add:new a.record.post("/"+n+"/comment",{creationTime:!0}),update:new a.record.post("/"+n+"/comment/:id/_update",{creationTime:!0})}};return s.raw.refreshTreeLinks=function(e){return s.raw.addTreeLinks(e,!0)},s.raw.addTreeLinks=function(e,n){e=e||{},e.result=e.result||[],e.mapById=e.mapById||{};var o={};if(_.forEach(_.values(e.mapById),function(t){if(t.reply_to&&!t.parent){var i=e.mapById[t.reply_to];i||(i=new Comment(t.reply_to),o[i.id]=t.id,e.mapById[i.id]=i),n&&i.containsReply(t)||i.addReply(t)}}),!_.size(o)){var r=t.defer();return r.resolve(e),r.promise}var l={query:{terms:{_id:_.keys(o)}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:0,size:1e3,_source:i.commons};return console.debug("[ES] [comment] Getting missing comments in tree"),s.raw.search(l).then(function(t){return t.hits.total?(_.forEach(t.hits.hits,function(t){var n=e.mapById[t._id];n.copyFromJson(t._source),n.html=a.util.parseAsHtml(n.message),delete o[n.id]}),_.size(o)&&console.error("Comments has invalid [reply_to]: "+_.values(o).join(",")),s.raw.addTreeLinks(e)):(console.error("[ES] [comment] Comments has invalid [reply_to]: "+_.values(o).join(",")),e)})},s.raw.loadDataByRecordId=function(e,t){t=t||{},t.from=t.from||0,t.size=t.size||20,t.loadAvatar=!angular.isDefined(t.loadAvatar)||t.loadAvatar,t.loadAvatarAllParent=!!angular.isDefined(t.loadAvatarAllParent)&&(t.loadAvatar&&t.loadAvatarAllParent),t.size<0&&(t.size=20);var n={query:{term:{record:e}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:t.from,size:t.size,_source:i.commons},o={total:0,mapById:{},result:[],pendings:{}};return s.raw.search(n).then(function(e){return e.hits.total?(o.total=e.hits.total,o.result=e.hits.hits.reduce(function(e,t){var n=new Comment(t._id,t._source);return n.html=a.util.parseAsHtml(n.message),o.mapById[n.id]=n,e.concat(n)},o.result),s.raw.addTreeLinks(o)):o}).then(function(){if(t.loadAvatar)return t.loadAvatarAllParent?r.extendAll(_.values(o.mapById),"issuer"):r.extendAll(o.result,"issuer")}).then(function(){return o.result=o.result.sort(function(e,t){return e.creationTime-t.creationTime}),o})},s.raw.createOnDeleteListener=function(e){return function(n){var i=_.findIndex(e.result,{id:n.id});if(-1!==i){e.result.splice(i,1),delete e.mapById[n.id];return(o.isUserPubkey(n.issuer)?o:o.children.getByPubkey(n.issuer))?s.raw.remove(n.id).catch(function(e){throw console.error(e),new Error("COMMENTS.ERROR.FAILED_REMOVE_COMMENT")}):t.reject("No wallet found corresponding to the comment issuer")}}},s.raw.startListenChanges=function(t,i,l){i=i||{},i.result=i.result||[],i.mapById=i.mapById||{},i.pendings=i.pendings||{},l=l||e;var c=s.raw.createOnDeleteListener(i);_.forEach(i.result,function(e){e.addOnRemoveListener(c)});var u=Date.now();console.info("[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]".format(n,t.substr(0,8)));var d=s.raw.wsChanges();return d.open().then(function(e){return e.send(n+"/comment")}).then(function(){console.debug("[ES] [comment] Websocket opened in {0} ms".format(Date.now()-u)),d.on(function(e){e&&l.$applyAsync(function(){var n=i.mapById[e._id];"DELETE"===e._operation?n&&n.remove():e._source&&e._source.record===t&&(n?(n.copyFromJson(e._source),n.html=a.util.parseAsHtml(n.message),s.raw.refreshTreeLinks(i)):i.pendings&&i.pendings[e._source.creationTime]||e._source.issuer==o.data.pubkey?console.debug("Skip comment received by WS (already in pending)"):(n=new Comment(e._id,e._source),n.addOnRemoveListener(c),n.isnew=!0,n.html=a.util.parseAsHtml(n.message),i.mapById[e._id]=n,s.raw.refreshTreeLinks(i).then(function(){return r.extend(n,"issuer")}).then(function(){i.result.push(n)})))})})})},s.raw.save=function(e,t,n){t=t||{},t.result=t.result||[],t.mapById=t.mapById||{},t.pendings=t.pendings||{};var i=n.id,r={creationTime:i?n.creationTime||n.time:moment().utc().unix(),message:n.message,record:e,issuer:o.data.pubkey};n.reply_to||n.parent?r.reply_to=n.reply_to||n.parent.id:r.reply_to=null;var l;return i?(l=t.mapById[i],l.copy(n)):(l=new Comment(null,r),l.addOnRemoveListener(s.raw.createOnDeleteListener(t)),l.uid=o.data.uid,l.name=o.data.name,l.avatar=o.data.avatar,l.isnew=!0,n.parent&&n.parent.addReply(l),t.result.push(l)),l.html=a.util.parseAsHtml(l.message),i?s.raw.update(r,{id:i}).then(function(){return l}):(t.pendings=t.pendings||{},t.pendings[r.creationTime]=r,s.raw.add(r).then(function(e){return l.id=e,t.mapById[e]=l,delete t.pendings[r.creationTime],l}))},s.raw.stopListenChanges=function(e){console.debug("[ES] [comment] Stopping websocket on comments"),_.forEach(e.result,function(e){e.cleanAllListeners()}),s.raw.wsChanges().close()},s.load=s.raw.loadDataByRecordId,s.save=s.raw.save,s.changes={start:s.raw.startListenChanges,stop:s.raw.stopListenChanges},s}return{instance:s}}]),angular.module("cesium.es.http.services",["ngResource","ngApi","cesium.services","cesium.config"]).factory("esHttp",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csHttp","csConfig","csSettings","csCache","BMA","csWallet","csPlatform","Api",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,f){"ngInject";function T(i,a,r,T){function I(e,t,n,i){!e&&p.data&&(e=e||(p.data.plugins&&p.data.plugins.es?p.data.plugins.es.host:null),t=t||(e?p.data.plugins.es.port:null),n=angular.isDefined(n)?n:443==t||p.data.plugins.es.useSsl||h),K.alive=!1,K.host=e,K.port=t||(n||h?443:80),K.useSsl=angular.isDefined(n)?n:443==K.port||h,K.server=u.getServer(e,t)}function v(e){if(e=e||p.data,!e.plugins||!e.plugins.es)return!1;var t=e.plugins.es.host,n=443==e.plugins.es.port||e.plugins.es.useSsl||h;return N(t,e.plugins.es.port||(n?443:80),n)}function N(e,t,n){return K.host==e&&K.port==t&&(angular.isUndefined(n)||n==K.useSsl)}function O(){return K.data.isFallback}function R(e){K.data.isFallback=e}function A(e){return new RegExp("^"+e+"$")}function S(e){return new RegExp(e)}function C(){return{getByPath:{},postByPath:{},wsByPath:{}}}function L(t,n){return n=n||e.defer(),K.data.isFallback&&K.started&&K.stop(),K.data.isFallback=!1,j=null,n.resolve(t),n.promise}function D(e,t){t=t||"#";for(var n="@"===t?q.USER_TAG:q.HASH_TAG,i=e&&n.exec(e),a=i&&[];i;){var o=i[1];_.contains(a,o)||a.push(o),e=e.substr(i.index+i[1].length+1),i=e.length>0&&n.exec(e)}return a}function y(e){for(var t=e&&q.URL.exec(e),n=t&&[];t;){var i=t[0];_.contains(n,i)||n.push(i),e=e.substr(t.index+t[0].length+1),t=e&&q.URL.exec(e)}return n}function P(e){return e?e.replace(/</g,"&lt;").replace(/>/g,"&gt;"):e}function k(e,t){var n=e?P(e.trim()):void 0;if(n){t=t||{},t.tagState=t.tagState||"app.wot_lookup.tab_search",t.uidState=t.uidState||"app.wot_identity_uid",!t.newLine&&angular.isDefined(t.newLine)||(n=n.replace(/\n/g,"<br>\n"));var i=y(n);_.forEach(i,function(e){var t=e.startsWith("http://")||e.startsWith("https://")?e:"http://"+e,i='<a on-tap="openLink($event, \'{0}\')" href="{1}" target="_blank">{2}</a>'.format(t,t,Q(e));n=n.replace(e,i)});var a=D(n);_.forEach(a,function(e){var i="<a ui-sref=\"{0}({hash: '{1}'})\">#{2}</a>".format(t.tagState,e,e);n=n.replace("#"+e,i)});var o=D(n,"@");_.forEach(o,function(e){var i="<a ui-sref=\"{0}({uid: '{1}'})\">@{2}</a>".format(t.uidState,e,e);n=n.replace("@"+e,i)})}return n}function M(e,t){t=t||["title","description"],e.tags=t.reduce(function(t,n){var i=e[n],a=i&&D(i);return a?t.concat(a):t},[])}function w(e,t){if(e)return e[t]?e[t]:Array.isArray(e)?e.reduce(function(e,n){return e||w(n,t)},!1):"object"==typeof e?_.reduce(_.keys(e),function(n,i){return n||w(e[i],t)},!1):void 0}function U(t,n){n=n||{};var i=K.post(t);return function(t,n){n=n||{};var a=n.wallet||n.walletId&&b.children.get(n.walletId)||(!n.pubkey||b.isUserPubkey(n.pubkey))&&b||n.pubkey&&b.children.getByPubkey(n.pubkey),o=n.keypair||a&&a.data&&a.data.keypair;if(!o&&!a)throw new Error("Missing wallet or keypair, to sign record");delete n.wallet,delete n.walletId,delete n.keypair;var r=angular.copy(n);return r.pubkey=r.pubkey||a.data.pubkey,(a.isAuth()?e.when(a.data):a.auth({silent:!0,minData:!0})).then(function(){n.creationTime&&!t.creationTime&&(t.creationTime=moment().utc().unix());var e=moment().utc().unix();t.time=!t.time||t.time<e?e:t.time+1;var a=angular.copy(t);delete a.signature,delete a.hash,a.issuer=r.pubkey,a.version||(a.version=2),n.tagFields&&M(a,n.tagFields);var s=JSON.stringify(a);return l.util.hash(s).then(function(e){return l.sign(e,o).then(function(t){return s='{"hash":"{0}","signature":"{1}",'.format(e,t)+s.substring(1),i(s,r).then(function(e){return m.clear(z),e}).catch(function(e){var t=K.byteCount(a);if(t>$.MAX_UPLOAD_BODY_SIZE)throw{message:"ERROR.ES_MAX_UPLOAD_BODY_SIZE",length:t};throw e})})})})}}function B(t,n){return function(i,a){a=a||{};var o=a.wallet||a.walletId&&b.children.get(a.walletId)||b;return(o.isAuth()?e.when(o.data):o.auth({silent:!0,minData:!0})).then(function(e){var a={version:2,index:t,type:n,id:i,issuer:e.pubkey,time:moment().utc().unix()},o=JSON.stringify(a);return l.util.hash(o).then(function(t){return l.sign(t,e.keypair).then(function(e){return o='{"hash":"{0}","signature":"{1}",'.format(t,e)+o.substring(1),K.post("/history/delete")(o).then(function(e){return e})})})})}}function x(e){if(!e||!e._content_type||!e._content||0===e._content.length)return null;var t={src:"data:"+e._content_type+";base64,"+e._content};return e._title&&(t.title=e._title),e._name&&(t.name=e._name),t}function F(e){if(!e||!e.src)return null;var t=q.IMAGE_SRC.exec(e.src);if(!t)return null;var n={_content_type:t[1],_content:t[2]};return e.title&&(n._title=e.title),e.name&&(n._name=e.name),n}function H(e){var t=q.ES_USER_API_ENDPOINT.exec(e);if(t){var n=t[8]||80;return{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:n,useSsl:80!=n&&443==n}}}function W(){return{_id:null,_index:null,_type:null,_version:null,_source:{}}}function V(){Y=[p.api.data.on.reset(n,L,K)]}function G(){_.forEach(Y,function(e){e()}),Y=[]}var Y,j,K=this,z="esHttp-",$={ES_USER_API_ENDPOINT:"ES_USER_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))",MAX_UPLOAD_BODY_SIZE:d.plugins&&d.plugins.es&&d.plugins.es.maxUploadBodySize||2097152},q={IMAGE_SRC:A("data:([A-Za-z//]+);base64,(.+)"),URL:S("(www\\.|https?://(www\\.)?)[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)"),HASH_TAG:S("(?:^|[\t\n\rs ])#([\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)"),USER_TAG:S("(?:^|[\t\n\rs ])@("+E.constants.regexp.USER_ID+")"),ES_USER_API_ENDPOINT:A($.ES_USER_API_ENDPOINT)},X=0,Q=s("truncUrl");K.data={isFallback:!1},K.cache=C(),K.api=new f(this,"esHttp"),K.started=!1,K.init=I,I(i,a,r,T),K.useCache=!!angular.isDefined(T)&&T,K.cleanCache=function(){console.debug("[ES] [http] Cleaning requests cache..."),_.keys(K.cache.wsByPath).forEach(function(e){K.cache.wsByPath[e].close()}),K.cache=C(),m.clear(z)},K.copy=function(e){return K.started&&K.stop(),K.init(e.host,e.port,e.useSsl||443==e.port),K.data.isTemporary=!1,K.start(!0)},K.byteCount=function(e){return e="string"==typeof e?e:JSON.stringify(e),encodeURI(e).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1},K.getUrl=function(e){return u.getUrl(K.host,K.port,e,K.useSsl)},K.get=function(t,n){n=K.useCache&&n;var i=t+(n?"#"+n:""),a=function(o){if(!K.started)return K._startPromise||console.error("[ES] [http] Trying to get [{0}] before start(). Waiting...".format(t)),K.ready().then(function(t){return t?a(o):e.reject("ERROR.ES_CONNECTION_ERROR")});var r=K.cache.getByPath[i];return r||(r=n?u.getWithCache(K.host,K.port,t,K.useSsl,n,null,null,z):u.get(K.host,K.port,t,K.useSsl),K.cache.getByPath[i]=r),r(o)};return a},K.post=function(t){var n=function(i,a){if(!K.started)return K._startPromise||console.error("[ES] [http] Trying to post [{0}] before start()...".format(t)),K.ready().then(function(t){return t?n(i,a):e.reject("ERROR.ES_CONNECTION_ERROR")});var o=K.cache.postByPath[t];return o||(o=u.post(K.host,K.port,t,K.useSsl),K.cache.postByPath[t]=o),o(i,a)};return n},K.ws=function(e){return function(){var t=K.cache.wsByPath[e];return t||(t=u.ws(K.host,K.port,e,K.useSsl),K.cache.wsByPath[e]=t),t}},K.isAlive=function(){return u.get(K.host,K.port,"/node/summary",K.useSsl)().then(function(e){var t=e&&e.duniter&&e.duniter.software||"unknown";return"cesium-plus-pod"===t||"duniter4j-elasticsearch"===t||(console.error("[ES] [http] Not a Cesium+ Pod, but a {0} node. Please check '/node/summary'".format(t)),!1)}).catch(function(){return!1})},K.checkNodeAlive=function(e){if(e)return R(!v()),!0;if(angular.isUndefined(e))return K.isAlive().then(K.checkNodeAlive);var t=p.data.plugins&&p.data.plugins.es||{};j=j||{host:t.host,port:t.port};var n=t.fallbackNodes&&X<t.fallbackNodes.length&&t.fallbackNodes[X++];if(!n)return o("ERROR.ES_CONNECTION_ERROR",{server:K.server}).then(c.alert.info),!1;var i=u.getServer(n.host,n.port);return c.loading.hide(),o("CONFIRM.ES_USE_FALLBACK_NODE",{old:K.server,new:i}).then(c.alert.confirm).then(function(e){return!!e&&(K.cleanCache(),K.init(n.host,n.port,n.useSsl||443==n.port),K.isAlive().then(K.checkNodeAlive))})},K.isStarted=function(){return K.started},K.ready=function(){return K.started?e.when(!0):K._startPromise||K.start()},K.start=function(t){return K._startPromise?K._startPromise:K.started?e.when(K.alive):(K._startPromise=g.ready().then(function(){t||K.init()}).then(function(){console.debug("[ES] [http] Starting on [{0}]{1}...".format(K.server,K.useSsl?" (SSL on)":""));var e=Date.now();return K.checkNodeAlive().then(function(t){return K.alive=t,t?(V(),console.debug("[ES] [http] Started in "+(Date.now()-e)+"ms"),K.api.node.raise.start(),K.started=!0,delete K._startPromise,X=0,!0):(console.error("[ES] [http] Could not start [{0}]: node unreachable".format(K.server)),K.started=!0,delete K._startPromise,X=0,!1)})}),K._startPromise)},K.stop=function(){return console.debug("[ES] [http] Stopping..."),G(),R(!1),delete K._startPromise,K.alive?(K.cleanCache(),K.alive=!1,K.started=!1,K.api.node.raise.stop()):K.started=!1,e.when()},K.restart=function(){return K.stop(),t(K.start,200)},K.image={},K.image.fromHit=function(e,t){if(e&&e._source){var n=e._source[t];if(n&&n._content_type&&n._content_type.startsWith("image/")){var i={};if(n._content)i.src="data:"+n._content_type+";base64,"+n._content;else{var a=n._content_type.substr(6),o=[e._index,e._type,e._id,"_image",t].join("/");o="/"+o+"."+a,i.src=K.getUrl(o)}return n._title&&(i.title=n._title),n._name&&(i.name=n._name),i}}},K.api.registerEvent("node","start"),K.api.registerEvent("node","stop");var J={getServer:u.getServer,node:{summary:K.get("/node/summary"),parseEndPoint:H,same:N,sameAsSettings:v,isFallback:O},network:{peering:K.get("/network/peering"),peers:K.get("/network/peers")},record:{post:U,remove:B},image:{fromAttachment:x,toAttachment:F},hit:{empty:W},util:{parseTags:D,parseAsHtml:k,findObjectInTree:w},cache:u.cache,constants:$};J.constants.regexp=q,angular.merge(K,J)}var h=!!("true"===d.httpsMode||!0===d.httpsMode||"force"===d.httpsMode||r.location&&"https:"===r.location.protocol);h&&console.debug("[ES] [https] Enable SSL (forced by config or detected in URL)");var I=new T(void 0,void 0,void 0,!0);return I.instance=function(e,t,n,i){return new T(e,t,n,i)},I}]),angular.module("cesium.es.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esSettings")}]).factory("esSettings",["$rootScope","$q","$timeout","Api","esHttp","csConfig","csSettings","CryptoUtils","Device","UIUtils","csWallet",function(e,t,n,i,a,o,r,s,l,c,u){"ngInject";function d(e,t){var n={};return t.includes&&_.forEach(_.keys(t),function(e){"includes"!=e&&"excludes"!=e&&t.includes.push(e)}),_.forEach(_.keys(e),function(i){t.includes&&!_.contains(t.includes,i)||t.excludes&&_.contains(t.excludes,i)||(e[i]&&"object"==typeof e[i]&&t[i]&&"object"==typeof t[i]?n[i]=d(e[i],t[i]):n[i]=e[i])}),n}function p(e,t){var n=Date.now();return S.get({id:e}).catch(function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}).then(function(e){if(e&&e._source){var i=e._source
+;if(i.time===r.data.time)return void console.debug("[ES] [settings] Loaded in "+(Date.now()-n)+"ms, but already up to date");var a=s.util.decode_base58(i.nonce);return s.box.open(i.content,a,t.boxPk,t.boxSk).then(function(e){var t=JSON.parse(e||"{}");return t.time=i.time,console.debug("[ES] [settings] Loaded and decrypted in "+(Date.now()-n)+"ms"),t}).catch(function(e){return console.error("[ES] [settings] Could not load remote settings: "+(e&&e.message||"decryption error")),delete r.data.time,null})}})}function m(e,n){return n=n||t.defer(),angular.merge(e,A),D=!1,n.resolve(e),n.promise}function E(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair&&e.keypair.signSk&&e.keypair.boxSk?(console.debug("[ES] [settings] Loading user settings..."),p(e.pubkey,e.keypair).then(function(e){if(e)return angular.merge(r.data,e),N=e,console.debug("[ES] [settings] Applied"),g()}).then(function(){n.resolve(e)}).catch(function(e){n.reject(e)}),n.promise):(n.resolve(),n.promise)}function b(e){if(!L){var t=O&&O.length>0;!a.isStarted()||a.node.isFallback()||a.node.sameAsSettings(e)||I(),v();S.isEnable()&&u.isAuth()&&(t?f(e):E(u.data))}}function g(){return L?t.when():(L=!0,r.store().then(function(){L=!1}).catch(function(e){throw L=!1,e}))}function f(e){var n=d(e,R);if(N&&angular.equals(n,N))return t.when();if(!r.data.plugins.es.useRemoteStorage)return g();var i=moment().utc().unix();return console.debug("[ES] [settings] Saving user settings remotely..."),t.all([u.getKeypair(),s.util.random_nonce()]).then(function(t){var a=t[0],o=t[1];if(a.boxPk&&a.boxSk){var r={issuer:u.data.pubkey,nonce:s.util.encode_base58(o),time:i},l=JSON.stringify(n);return s.box.pack(l,o,a.boxPk,a.boxSk).then(function(t){return r.content=t,angular.isUndefined(e.time)?S.add(r):S.update(r,{id:r.issuer}).catch(function(e){if(e&&404==e.ucode)return S.add(r);throw e})}).then(function(){return!0})}}).then(function(t){if(t)return e.time=i,N=n,console.debug("[ES] [settings] Saved user settings remotely in "+(moment().utc().unix()-i)+"ms"),g()}).catch(function(e){throw console.error(e),e})}function T(){_.forEach(O,function(e){e()}),O=[]}function h(){O=[r.api.data.on.reset(e,m,this),u.api.data.on.auth(e,E,this)]}function I(){T(),a.stop()}function v(){var e=S.isEnable();return!e&&O&&O.length>0?(console.debug("[ES] [settings] Disable"),T(),a.stop().then(function(){C.state.raise.changed(e)})):!e||O&&0!==O.length&&a.isStarted()?void 0:a.start().then(function(t){return t?(console.debug("[ES] [settings] Enable"),h(),u.isAuth()?E(u.data).then(function(){C.state.raise.changed(e)}):void C.state.raise.changed(e)):(r.data.plugins.es.enable=!1,r.data.plugins.es.askEnable=!0,D=!0,C.state.raise.changed(!1),void console.error("[ES] [settings] Disable, has ES node could not be started"))})}var N,O,R={includes:["locale","showUDHistory","useRelative","useLocalStorage","useLocalStorageEncryption","expertMode","logoutIdle","blockValidityWindow"],excludes:["timeout","cacheTimeMs","version","build","minVersion","fallbackLanguage"],plugins:{es:{excludes:["enable","host","port","fallbackNodes","enableGoogleApi","googleApiKey"],notifications:{}}},wallet:{includes:["alertIfUnusedWallet"],excludes:["notificationReadTime"]},helptip:{excludes:["installDocUrl"]},notifications:{excludes:["time","warnCount","unreadCount"]}},A=angular.merge({plugins:{es:{askEnable:!1,useRemoteStorage:!0,notifications:{txSent:!0,txReceived:!0,certSent:!0,certReceived:!0,emitHtml5:!1},invitations:{readTime:!0},defaultCountry:void 0,enableGoogleApi:!1,googleApiKey:void 0,wot:{enableMixedSearch:!0},registry:{defaultSearch:{location:null,geoPoint:null}},geoDistance:"20km"}}},{plugins:{es:o.plugins&&o.plugins.es||{}}}),S=this,C=new i("esSettings"),L=!1,D=!1;return S.api=C,S.get=a.get("/user/settings/:id"),S.add=a.record.post("/user/settings"),S.update=a.record.post("/user/settings/:id/_update"),S.isEnable=function(){return r.data.plugins&&r.data.plugins.es&&r.data.plugins.es.enable&&!!r.data.plugins.es.host},S.notifications={},S.notifications.isEmitHtml5Enable=function(){return!!(S.isEnable()&&r.data.plugins.es.notifications&&angular.isDefined(r.data.plugins.es.notifications.emitHtml5))&&r.data.plugins.es.notifications.emitHtml5},S.wot={},S.wot.isMixedSearchEnable=function(){return S.isEnable()&&(!angular.isDefined(r.data.plugins.es.wot&&r.data.plugins.es.wot.enableMixedSearch)||r.data.plugins.es.wot.enableMixedSearch)},C.registerEvent("state","changed"),r.ready().then(function(){return r.api.data.on.changed(e,b,this),a.api.node.on.stop(e,function(){N=null},this),v()}).then(function(){if(!D&&o.plugins&&o.plugins.es&&o.plugins.es.askEnable&&!S.isEnable()&&r.data.plugins.es.askEnable)return c.alert.confirm("ES_SETTINGS.CONFIRM.ASK_ENABLE","ES_SETTINGS.CONFIRM.ASK_ENABLE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then(function(e){return e&&(r.data.plugins.es.enable=!0),r.data.plugins.es.askEnable=!1,r.store()})}),S}]),angular.module("cesium.es.registry.services",["ngResource","cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esRegistry")}]).factory("esRegistry",["$rootScope","$q","csPlatform","csSettings","csWallet","csWot","esHttp","esComment","esGeo",function(e,t,n,i,a,o,r,s,l){"ngInject";function c(e){e.pages=null}function u(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [registry] Loading pages count..."),v.raw.count({pubkey:e.pubkey}).then(function(t){e.pages=e.pages||{},e.pages.count=t&&t.hits&&t.hits.total,console.debug("[ES] [registry] Loaded pages count ("+e.pages.count+")"),n.resolve(e)}).catch(function(t){console.error("[ES] [registry] Error while counting page: "+(t.message?t.message:t)),n.resolve(e)}),n.promise):(n.resolve(),n.promise)}function d(){if(v.raw.categories&&v.raw.categories.length){var e=t.defer();return e.resolve(v.raw.categories),e.promise}return v.raw.category.all().then(function(e){if(0===e.hits.total)v.raw.categories=[];else{var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,e.concat(n)},[]);_.forEach(t,function(e){t[e.id]=e}),v.raw.categories=t}return v.raw.categories})}function p(e){return v.raw.category.get(e).then(function(e){var t=e._source;return t.id=e._id,t})}function m(e,t){if(e){var n=e._source;return n.category&&n.category.id&&(n.category=t[n.category.id]),e.highlight&&(e.highlight.title&&(n.title=e.highlight.title[0]),e.highlight.description&&(n.description=e.highlight.description[0]),e.highlight.location&&(n.location=e.highlight.location[0]),e.highlight.tags&&(n.tags=e.highlight.tags.reduce(function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))},[]))),n.avatar=r.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(n.pictures=e._source.pictures.reduce(function(e,t){return e.concat(r.image.fromAttachment(t.file))},[])),n}}function E(e){return e=e||{},e.from=e.from||0,e.size=e.size||20,e._source=e._source||I.commons,e.highlight=e.highlight||{fields:{title:{},description:{}}},t.all([d(),v.raw.search(e)]).then(function(t){var n=t[0];if(!(t=t[1])||!t.hits||!t.hits.total)return{total:0,hits:[]};var i=r.util.findObjectInTree(e.query,"geo_distance"),a=i&&i.geoPoint,o=i&&i.distance&&i.distance.replace(new RegExp("[0-9 ]+","gm"),""),s=t.hits.hits.reduce(function(e,t){var i=m(t,n);return i.id=t._id,a&&i.geoPoint&&o&&(i.distance=l.point.distance(a.lat,a.lon,i.geoPoint.lat,i.geoPoint.lon,o)),e.concat(i)},[]);return{total:t.hits.total,hits:s}})}function b(e,n){return n=n||{},n.raw=!!angular.isDefined(n.raw)&&n.raw,n.fecthPictures=angular.isDefined(n.fetchPictures)?n.fetchPictures:n.raw,t.all([d(),n.fecthPictures?v.raw.get({id:e}):v.raw.getCommons({id:e})]).then(function(e){var t=e[0],i=e[1],a=m(i,t);return n.raw||(a.description=r.util.parseAsHtml(a.description,{tagState:"app.wot_lookup.tab_registry"})),o.extend({pubkey:a.issuer}).then(function(e){return{id:i._id,issuer:e,record:a}})})}function g(){_.forEach(h,function(e){e()}),h=[]}function f(){h=[a.api.data.on.load(e,u,this),a.api.data.on.init(e,c,this),a.api.data.on.reset(e,c,this)]}function T(){var e=r.alive;if(!e&&h&&h.length>0){if(console.debug("[ES] [subscription] Disable"),g(),a.isLogin())return c(a.data)}else if(e&&(!h||0===h.length)&&(console.debug("[ES] [subscription] Enable"),f(),a.isLogin()))return u(a.data)}var h,I={commons:["title","description","issuer","time","address","city","creationTime","avatar._content_type","picturesCount","type","category","socials","pubkey","geoPoint"]},v=this;return v.raw={count:r.get("/page/record/_search?size=0&q=issuer::pubkey"),searchText:r.get("/page/record/_search?q=:search"),search:r.post("/page/record/_search"),get:r.get("/page/record/:id"),getCommons:r.get("/page/record/:id?_source="+I.commons.join(",")),category:{get:r.get("/page/category/:id"),all:r.get("/page/category/_search?sort=order&from=0&size=1000&_source=name,parent")}},n.ready().then(function(){return r.api.node.on.start(e,T,this),r.api.node.on.stop(e,T,this),T()}),v.category={all:d,get:p},v.record={search:E,load:b,add:r.record.post("/page/record",{tagFields:["title","description"],creationTime:!0}),update:r.record.post("/page/record/:id/_update",{tagFields:["title","description"]}),remove:r.record.remove("page","record"),fields:{commons:I.commons},picture:{all:r.get("/page/record/:id?_source=pictures")},comment:s.instance("page")},v.currency={all:r.get("/currency/record/_search?_source=currencyName,peers.host,peers.port"),get:r.get("/currency/record/:id/_source")},v}]),angular.module("cesium.es.social.services",["cesium.es.crypto.services"]).factory("SocialUtils",["$filter","$q","CryptoUtils","BMA","csWallet","esCrypto","$timeout",function(e,t,n,i,a,o,r){"ngInject";function s(){function s(e){return new RegExp("^"+e+"$")}function l(e){var t;if(E.URI.test(e)){var n=E.URI.exec(e)[1],i=e;if("http"==n||"https"==n){var a=e.indexOf("/",n.length+3);a>0&&(i=e.substring(0,a))}_.keys(E.socials).forEach(function(e){if(E.socials[e].test(i))return t=e,!1}),t||(t="web")}else E.EMAIL.test(e)?t="email":E.PHONE.test(e)&&(t="phone");return t||console.warn("[ES] [social] Unable to detect type of social URL: "+e),t}function c(e){if((e=e?e.trim():e)&&e.length>0)return e.startsWith("www.")&&(e="http://"+e),{type:l(e),url:e}}function u(t){if(!t||!t.length)return[];var n={};return t.forEach(function(t){if("curve25519"==t.type?(delete t.issuer,t.valid&&angular.merge(t,c(t.url))):t=c(t.url),t){var i=e("formatSlug")(t.url);n[i]=t}}),_.values(n)}function d(e,t){return{recipient:e,type:"curve25519",url:t}}function p(e,i,s){if(s=s||a.data.pubkey,!n.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),r(function(){return p(e,i,s)},100);var l=_.filter(e||[],function(e){var t=e.url&&"curve25519"==e.type&&E.socials.curve25519.exec(e.url);return!!t&&(e.recipient=t[1],e.nonce=t[2],e.url=t[3],e.issuer=i,e.valid=e.recipient===s,e.valid)});return l.length?o.box.open(l,void 0,"issuer","url").then(function(){return u(e)}):t.when(u(e))}function m(e){if(!n.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),r(function(){return m(e)},100);var i=_.filter(e||[],function(e){return"curve25519"==e.type&&e.url&&e.recipient});return i.length?n.util.random_nonce().then(function(e){return t.all(i.reduce(function(t,n){return t.concat(o.box.pack(n,void 0,"recipient","url",e))},[]))}).then(function(e){return e.reduce(function(e,t){return e.concat({type:"curve25519",url:"curve25519://{0}:{1}@{2}".format(t.recipient,t.nonce,t.url)})},[])}):t.when(e)}var E={URI:"([a-zA−Z0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",EMAIL:"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",PHONE:"[+]?[0-9. ]{9,15}",socials:{facebook:"https?://((fb.me)|((www.)?facebook.com))",twitter:"https?://(www.)?twitter.com",googleplus:"https?://plus.google.com(/u)?",youtube:"https?://(www.)?youtube.com",github:"https?://(www.)?github.com",tumblr:"https?://(www.)?tumblr.com",snapchat:"https?://(www.)?snapchat.com",linkedin:"https?://(www.)?linkedin.com",vimeo:"https?://(www.)?vimeo.com",instagram:"https?://(www.)?instagram.com",wordpress:"https?://([a-z]+)?wordpress.com",diaspora:"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org",duniter:"duniter://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",bitcoin:"bitcoin://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",curve25519:"curve25519://("+i.constants.regexp.PUBKEY+"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)"}};return E.URI=s(E.URI),E.EMAIL=s(E.EMAIL),E.PHONE=s(E.PHONE),_.keys(E.socials).forEach(function(e){E.socials[e]=s(E.socials[e])}),{get:c,reduce:u,createForEncryption:d,open:p,pack:m}}var l=s();return l.instance=s,l}]),angular.module("cesium.es.crypto.services",["ngResource","cesium.services"]).factory("esCrypto",["$q","$rootScope","CryptoUtils",function(e,t,n){"ngInject";function i(t){if(!t)throw new Error("Missing keypair");return t.boxPk&&t.boxSk?e.when(t):e.all([n.box.keypair.skFromSignSk(t.signSk),n.box.keypair.pkFromSignPk(t.signPk)]).then(function(e){return{boxSk:e[0],boxPk:e[1]}})}function a(t,a,o,r,s){if(o=o||"recipient",!t[o])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});r=r||"content","string"==typeof r&&(r=[r]),t=angular.copy(t);var l=n.util.decode_base58(t[o]);return e.all([i(a),n.box.keypair.pkFromSignPk(l),s?e.when(s):n.util.random_nonce()]).then(function(i){var a=i[0],o=a.boxSk,s=i[1],l=i[2];return e.all(r.reduce(function(e,i){return t[i]?e.concat(n.box.pack(t[i],l,s,o)):e},[])).then(function(e){var i=0;return _.forEach(r,function(n){t[n]?t[n]=e[i++]:t[n]=null}),t.nonce=n.util.encode_base58(l),t})})}function o(t,a,o,r){o=o||"issuer","string"==typeof(r=r||"content")&&(r=[r]);var s=Date.now(),l={},c=[i(a)];return e.all(t.reduce(function(e,t){var i=t[o];if(!i)throw"Record has no "+o;return l[i]?res:e.concat(n.box.keypair.pkFromSignPk(n.util.decode_base58(i)).then(function(e){l[i]=e}))},c)).then(function(i){var a=i[0];return e.all(t.reduce(function(e,t){var i=l[t[o]],s=n.util.decode_base58(t.nonce);return t.valid=!0,e.concat(r.reduce(function(e,o){return t[o]?e.concat(n.box.open(t[o],s,i,a.boxSk).then(function(e){t[o]=e}).catch(function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+o),t.valid=!1})):e},[]))},[]))}).then(function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-s)+"ms"),t})}return{box:{getKeypair:i,pack:a,open:o}}}]),angular.module("cesium.es.profile.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esProfile")}]).factory("esProfile",["$rootScope","$q","esHttp","SocialUtils","csWot","csWallet","csPlatform","esSettings",function(e,t,n,i,a,o,r,s){"ngInject";function l(e){return T.raw.getFields({id:e,fields:"title,avatar._content_type"}).then(function(e){var t;return e&&e._source&&(t={name:e._source.title},t.avatar=n.image.fromHit(e,"avatar")),t}).catch(function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e})}function c(e,t){return t=t||{},(t.raw?T.raw.getAll:T.raw.get)({id:e}).then(function(a){if(a&&a.found&&a._source){var r={name:a._source.title,source:a._source};return r.name&&r.name.length>30&&(r.name=r.name.substr(0,27)+"..."),r.avatar=n.image.fromHit(a,"avatar"),t.raw||(r.description=n.util.parseAsHtml(r.source.description)),r.source.socials&&r.source.socials.length&&(r.source.socials=_.uniq(r.source.socials,!1,function(e){return e.url})),o.isLogin()?i.open(r.source.socials,e).then(function(){return r}):(r.source.socials=_.filter(r.source.socials,function(e){return"curve25519"!=e.type}),r)}}).catch(function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e})}function u(e,t){return p(null,e,t)}function d(e,t,i){e.avatar=e.avatar||n.image.fromHit(t,i||"avatar"),e.name=t._source.title,e.name&&e.name.length>30&&(e.name=e.name.substr(0,27)+"..."),e.description=t._source.description||e.description,e.city=t._source.city||e.city,t.highlight&&(t.highlight.title&&(e.name=t.highlight.title[0]),t.highlight.tags&&(e.tags=t.highlight.tags.reduce(function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))},[])))}function p(e,i,a,o){if(o=o||t.defer(),!(e||i&&i.length))return o.resolve(i),o.promise;a=a||"pubkey",e=e?e.toLowerCase().trim():e;var r,l=e?n.util.parseTags(e):void 0,c={query:{},highlight:{fields:{title:{},tags:{}}},from:0,size:100,_source:["title","avatar._content_type"]},u=e&&s.wot.isMixedSearchEnable();if(u&&(c._source=c._source.concat(["description","city","creationTime","membersCount","type"]),console.debug("[ES] [profile] Mixed search: enable")),i.length>0){r={},_.forEach(i,function(e){var t=e[a];if(t){var n=r[t];n?n.push(e):(n=[e],r[t]=n)}});var p=_.keys(r);c.size=p.length<=c.size?c.size:p.length,e?(c.query.bool={should:[{terms:{"_id^4":p}},{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},l&&c.query.bool.should.push({terms:{tags:l}})):(delete c.highlight,c.query.constant_score={filter:{terms:{_id:p}}})}else{if(!e)return o.resolve(i),o.promise;c.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},l&&c.query.bool.should.push({terms:{tags:l}})}e&&u&&(c.indices_boost={user:100,page:1,group:.01});var m;return(u?T.raw.mixedSearch:T.raw.search)(c).then(function(e){if(m=e.hits,m.total>0){var t,s={};_.forEach(m.hits,function(e){var o="avatar";if("user"==e._index){if(!(t=r&&r[e._id])){var l={};l[a]=e._id,t=[l],i.push(l)}}else if("user"!=e._index){s[e._index]||(s[e._index]=!0,i.push({id:"divider-"+e._index,divider:!0,index:e._index}));var c={id:e._index+"-"+e._id,index:e._index,templateUrl:"plugins/es/templates/wot/lookup_item_{0}.html".format(e._index),state:"app.view_{0}".format(e._index),stateParams:{id:e._id,title:e._source.title},creationTime:e._source.creationTime,memberCount:e._source.memberCount,type:e._source.type};t=[c],i.push(c),o="avatar"}var u=n.image.fromHit(e,o);_.forEach(t,function(t){t.avatar=u,d(t,e)})}),_.keys(s).length&&i.splice(0,0,{id:"divider-identities",divider:!0,index:"profile"})}o.resolve(i)}).catch(function(e){e&&e.ucode&&404==e.ucode?o.resolve(i):o.reject(e)}),o.promise}function m(e,n){return n=n||t.defer(),e&&e.pubkey?(t.all([c(e.pubkey).then(function(t){t&&(e.name=t.name,e.avatar=t.avatar,e.profile=t.source,e.profile.description=t.description),n.resolve(e)}),u((e.received_cert||[]).concat(e.received_cert_pending||[]).concat(e.given_cert||[]).concat(e.given_cert_pending||[]))]).catch(function(e){n.reject(e)}),n.promise):(n.resolve(),n.promise)}function E(){_.forEach(f,function(e){e()}),f=[]}function b(){f=[a.api.data.on.load(e,m,this),a.api.data.on.search(e,p,this)]}function g(){var e=n.alive;!e&&f&&f.length>0?(console.debug("[ES] [profile] Disable"),E()):!e||f&&0!==f.length||(console.debug("[ES] [profile] Enable"),b())}var f,T=this;return T.raw={getFields:n.get("/user/profile/:id?&_source_exclude=avatar._content&_source=:fields"),get:n.get("/user/profile/:id?&_source_exclude=avatar._content",n.cache.MEDIUM),getAll:n.get("/user/profile/:id",n.cache.MEDIUM),search:n.post("/user/profile/_search",n.cache.MEDIUM),mixedSearch:n.post("/user,page,group/profile,record/_search",n.cache.MEDIUM)},r.ready().then(function(){return n.api.node.on.start(e,g,this),n.api.node.on.stop(e,g,this),g()}),{getAvatarAndName:l,get:c,add:n.record.post("/user/profile",{tagFields:["title","description"]}),update:n.record.post("/user/profile/:id/_update",{tagFields:["title","description"]}),avatar:n.get("/user/profile/:id?_source=avatar"),fillAvatars:u,remove:n.record.remove("user","profile")}}]),angular.module("cesium.es.notification.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esNotification")}]).factory("esNotification",["$rootScope","$q","$timeout","$translate","$state","csHttp","csConfig","csSettings","esHttp","esSettings","csWallet","csWot","UIUtils","filterTranslations","BMA","CryptoUtils","csPlatform","Api",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b,g,f){"ngInject";function T(e,t){t=t||{},t.codes=t.codes||{},t.codes.excludes=t.codes.excludes||x.EXCLUDED_CODES;var n={bool:{must:[{term:{recipient:e}}]}};if(t.codes&&t.codes.includes)n.bool.must.push({terms:{code:t.codes.includes}});else{var i=[];s.getByPath("plugins.es.notifications.txSent",!1)||i.push("TX_SENT"),s.getByPath("plugins.es.notifications.txReceived",!0)||i.push("TX_RECEIVED"),s.getByPath("plugins.es.notifications.certSent",!1)||i.push("CERT_SENT"),s.getByPath("plugins.es.notifications.certReceived",!0)||i.push("CERT_RECEIVED"),t.codes.excludes&&_.forEach(t.codes.excludes,function(e){i.push(e)}),i.length&&(n.bool.must_not={terms:{code:i}})}return t.readTime&&n.bool.must.push({range:{time:{gt:t.readTime}}}),n}function h(e,n){if(!e)return t.reject("[ES] [notification] Unable to load - missing pubkey");var i={query:T(e,n)};return i.query.bool.must.push({missing:{field:"read_signature"}}),H.raw.postCount(i).then(function(e){return e.count})}function I(e){e=e||{};var t=e.wallet||u;return new Promise(function(e){if(!t.data||!t.data.events||!t.data.events.length)return e([]);var n=o.date.now()-m.MEDIAN_TIME_OFFSET;e((t.data.events||[]).reduce(function(e,i){if("warn"!=i.type&&"error"!=i.type)return e;var a=new EsNotification({},function(e){e.read||(e.read=!0,t.data.notifications&&t.data.notifications.warnCount>0&&t.data.notifications.warnCount--)});return a.id=i.code,a.read=!1,a.state="app.view_wallet",a.avatarIcon="ion-alert-circled",a.icon="ion-alert-circled assertive",a.time=n,a.message=i.message,a.messageParams=i.messageParams,e.concat(a)},[]))})}function v(e){if(e=e||{},!e.pubkey)return t.reject("[ES] [notification] Unable to load - missing options.pubkey");e.from=e.from||0,e.size=e.size||x.DEFAULT_LOAD_SIZE;var n={query:T(e.pubkey,e),sort:[{time:{order:"desc"}}],from:e.from,size:e.size,_source:F.commons};return t.all([I(e),H.raw.postSearch(n)]).then(function(e){var t=e[0]||[];if(e=e[1],!e.hits||!e.hits.total)return t;var n=e.hits.hits.reduce(function(e,t){var n=new EsNotification(t._source,C);return n.id=t._id,e.concat(n)},t);return d.extendAll(n)})}function N(t){if(t&&u.isLogin()){if(_.contains(x.INVITATION_CODES,t.code))return void W.event.raise.newInvitation(t);if(_.contains(x.MESSAGE_CODES,t.code))return void W.event.raise.newMessage(t);var n=new EsNotification(t,C);return d.extendAll([n]).then(function(){e.$$phase?O(n):e.$applyAsync(function(){O(n)})}).then(function(){if(c.notifications.isEmitHtml5Enable())return A(n)})}}function O(e){return u.data.notifications=u.data.notifications||{},u.data.notifications.unreadCount++,W.data.raise.new(e),e}function R(e){return e?String(e).replace(/<[^>]*>/gm,"").replace(/&[^;]+;/gm,""):""}function A(n,o){t.all([i(o||"COMMON.NOTIFICATION.TITLE"),i(n.message,n)]).then(function(t){S(R(t[0]),{body:R(t[1]),icon:n.avatar&&n.avatar.src||"./img/logo.png",lang:i.use(),tag:n.id,onclick:function(){e.$applyAsync(function(){"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&a.go(n.state,n.stateParams)})}})})}function S(e,t){if("Notification"in window)if("granted"===Notification.permission){var n=new Notification(e,t);n.onclick=t.onclick||n.onclick}else"denied"!==Notification.permission&&Notification.requestPermission(function(n){"granted"===n&&S(e,t)})}function C(e){if(!e.read&&e.id){if(!e.id)return void console.error("[ES] [notification] Could not mark as read: no 'id' found!",e);if(u.isAuth())return e.read=!0,u.getKeypair().then(function(t){return b.sign(e.hash,t).then(function(t){return H.raw.postReadById(t,{id:e.id})}).catch(function(e){console.error("[ES] [notification] Error while trying to mark event as read.",e)})})}}function L(e){e.notifications=e.notifications||{},e.notifications.unreadCount=null,e.notifications.warnCount=null,e.notifications.time=null,B&&(console.debug("[ES] [notification] Closing websocket..."),B(),B=null)}function D(e,i){if(i=i||t.defer(),!e||!e.pubkey||!e.keypair)return i.resolve(),i.promise;var a=Date.now(),o=Math.trunc(a/1e3);if(e.notifications&&e.notifications.time&&o-e.notifications.time<30)return e.notifications.warnCount=P(e),console.debug("[ES] [notification] Skipping load (loaded "+(o-e.notifications.time)+"s ago)"),i.resolve(),i.promise;var r=u.isUserPubkey(e.pubkey);return console.debug("[ES] [notification] Loading count..."+e.pubkey.substr(0,8)),h(e.pubkey,{readTime:e.notifications&&e.notifications.time||0,excludeCodes:x.EXCLUDED_CODES}).then(function(t){e.notifications=e.notifications||{},e.notifications.unreadCount=t,e.notifications.warnCount=P(e),t>0&&c.notifications.isEmitHtml5Enable()&&r&&n(function(){A({message:"COMMON.NOTIFICATION.HAS_UNREAD",count:t,state:"app.view_notifications"},e.ui||e.name||e.pubkey&&e.pubkey.substr(0,8))},500),console.debug("[ES] [notification] Loaded count ("+t+") in "+(Date.now()-a)+"ms"),i.resolve(e)}).catch(i.reject),i.promise}function y(e,t){return D(e,t).then(function(){console.debug("[ES] [notification] Starting listen user event...");var t=H.raw.ws.getUserEvent();t.on(N,{pubkey:e.pubkey,locale:s.data.locale.id}).catch(function(e){console.error("[ES] [notification] Unable to listen user event",e),p.alert.error("ACCOUNT.ERROR.WS_CONNECTION_FAILED")}),B=function(){t.close()}})}function P(e){return e.events?e.events.reduce(function(e,t){return"warn"==t.type?e+1:e},0):0}function k(){U=[u.api.data.on.login(e,y,this),u.api.data.on.load(e,D,this),u.api.data.on.init(e,L,this),u.api.data.on.reset(e,L,this)]}function M(){_.forEach(U,function(e){e()}),U=[]}function w(){var e=l.alive;if(!e&&U&&U.length>0)console.debug("[ES] [notification] Disable"),M(),u.isLogin()&&L(u.data);else if(e&&(!U||0===U.length)&&(console.debug("[ES] [notification] Enable"),k(),u.isLogin()))return y(u.data)}var U,B,x={MESSAGE_CODES:["MESSAGE_RECEIVED"],INVITATION_CODES:["INVITATION_TO_CERTIFY"],DEFAULT_LOAD_SIZE:20},F={commons:["type","code","params","reference","recipient","time","hash","read_signature"]},H=this,W=new f(this,"esNotification");return x.EXCLUDED_CODES=x.MESSAGE_CODES.concat(x.INVITATION_CODES),H.raw={postCount:l.post("/user/event/_count"),postSearch:l.post("/user/event/_search"),postReadById:l.post("/user/event/:id/_read"),ws:{getUserEvent:l.ws("/ws/event/user/:pubkey/:locale"),getChanges:l.ws("/ws/_changes")}},W.registerEvent("data","new"),W.registerEvent("event","newInvitation"),W.registerEvent("event","newMessage"),g.ready().then(function(){return l.api.node.on.start(e,w,this),l.api.node.on.stop(e,w,this),w()}),H.load=v,H.unreadCount=h,H.html5={emit:S},H.api=W,H.websocket={event:H.raw.ws.getUserEvent,change:H.raw.ws.getChanges},H.constants=x,H}]),angular.module("cesium.es.message.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esMessage")}]).factory("esMessage",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","esHttp","csWallet","esWallet","csWot","esNotification",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";function E(e){e.messages=e.messages||{},e.messages.unreadCount=null,e.messages.time=null}function b(e){e.messages&&delete e.messages}function g(t,n){if(n=n||e.defer(),!t||!t.pubkey)return n.resolve(),n.promise;var i=Date.now(),a=Math.trunc(i/1e3);return t.messages&&t.messages.time&&a-t.messages.time<30?(console.debug("[ES] [message] Skipping load (loaded "+(a-t.messages.time)+"s ago)"),n.resolve(),n.promise):(console.debug("[ES] [message] Loading count..."),f({pubkey:t.pubkey}).then(function(e){t.messages=t.messages||{},t.messages.unreadCount=e,t.messages.time=a,console.debug("[ES] [message] Loaded count ("+e+") in "+(Date.now()-i)+"ms"),n.resolve(t)}).catch(function(e){console.error("Error while counting messages: "+(e.message?e.message:e)),n.resolve(t)}),n.promise)}function f(e){e=e||{};var t=e.wallet||e.walletId&&u.children.get(e.walletId)||u,n=e.pubkey||t&&t.data&&t.data.pubkey;if(!n)throw new Error("no pubkey or wallet found in options, and user not connected.");var i={query:{bool:{must:[{term:{recipient:n}},{missing:{field:"read_signature"}}]}}};return c.post("/message/inbox/_count")(i).then(function(e){return e.count})}function T(e,t){console.debug("[ES] [message] detected new message (from notification service)");var n=new EsNotification(e);if(n.issuer=n.pubkey,delete n.pubkey,n.issuer){if(!(t=t||n.issuer&&u.isUserPubkey(n.issuer)&&u||n.issuer&&u.children.getByPubkey(n.issuer)))throw new Error("No wallet for pubkey: {0}".format(n.issuer.substring(0,6)));p.extend(n,"issuer").then(function(){t.data.messages=t.data.messages||{},t.data.messages.unreadCount++,V.data.raise.new(n)})}}function h(e,t){t=t||{};var n=t.wallet||t.walletId&&u.children.get(t.walletId)||u;return delete t.wallet,e.issuer=e.issuer||n.data.pubkey,n.getKeypair().then(function(t){return I(e,t).then(function(n){return l.data.plugins.es.message&&angular.isDefined(l.data.plugins.es.message.outbox)&&!l.data.plugins.es.message.outbox?n:I(e,t,"/message/outbox","issuer").catch(function(e){return console.error("Failed to store message to outbox: "+e),n})}).then(function(e){return V.data.raise.sent(e),e})})}function I(e,t,n,i){return n=n||"/message/inbox",d.box.record.pack(e,t,i,["title","content"]).then(function(e){return c.record.post(n)(e,{pubkey:e.issuer,keypair:t})})}function v(t){t=t||{},t.from=t.from||0,t.size=t.size||F.DEFAULT_LOAD_SIZE;var n=t.wallet||t.walletId&&u.children.get(t.walletId)||u;if(delete t.wallet,!n.isLogin())return e.when([]);var i={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:n.data.pubkey}}}},from:t.from,size:t.size,_source:H.notifications};return W.postSearch(i).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,n.read=!!n.read_signature,delete n.read_signature,e.concat(n)},[]);return p.extendAll(t,"issuer")})}function N(e,t){e=e||u.data.pubkey,t=t||{},t.type=t.type||"inbox",t.from=t.from||0,t.size=t.size||1e3,t._source=t._source||H.commons;var n={sort:{time:"desc"},from:t.from,size:t.size,_source:t._source};return"inbox"==t.type?n.query={bool:{filter:{term:{recipient:e}}}}:n.query={bool:{filter:{term:{issuer:e}}}},W.postSearchByType(n,{type:t.type}).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce(function(e,n){var i=n._source||{};return i.id=n._id,i.read="outbox"==t.type||!!i.read_signature,delete i.read_signature,e.concat(i)},[]);return console.debug("[ES] [message] Loading {0} {1} messages".format(n.length,t.type)),n})}function O(e){e=e||{},e.type=e.type||"inbox",e._source=H.commons,e.summary=!angular.isDefined(e.summary)||e.summary,e.filter=angular.isDefined(e.filter)?e.filter:void 0,e.from=e.from||0;var t=e.wallet||e.walletId&&u.children.get(e.walletId)||u;delete e.wallet;var n=t.auth().then(function(t){return N(t.pubkey,e).then(function(n){return A(n,t.keypair,e.summary)})}).then(function(t){var n="inbox"==e.type?"issuer":"recipient";return p.extendAll(t,n)}).then(function(n){if(n.length&&e.filter){var i=P(n,e.filter);if(i.length<n.length)return e=angular.copy(e),e.from+=e.size,e.size=n.length-i.length,e.wallet=t,O(e).then(function(e){return i.concat(e)})}return 0!==e.from||e.filter||(t.data.messages=t.data.messages||{},t.data.messages.count=n.length),n});return 0===e.from&&e.filter&&n.then(k),n}function R(e,t,n){return t=t||"inbox",n=n||{},n.summary=!!angular.isDefined(n.summary)&&n.summary,(n.wallet||n.walletId&&u.children.get(n.walletId)||u).auth().then(function(i){return W.getByTypeAndId({id:e,type:t}).then(function(e){if(e.found){var a=e._source;return a.id=e._id,a.read="outbox"==t||!!a.read_signature,delete a.read_signature,A([a],i.keypair,n.summary).then(function(){var e="inbox"==t?"issuer":"recipient";return p.extend(a,e)})}})})}function A(t,n,i){
+var a=Date.now(),r={},s=[d.box.getKeypair(n)];return e.all(t.reduce(function(e,t){return r[t.issuer]?res:e.concat(o.box.keypair.pkFromSignPk(o.util.decode_base58(t.issuer)).then(function(e){r[t.issuer]=e}))},s)).then(function(n){var a=n[0];return e.all(t.reduce(function(e,t){var n=r[t.issuer],s=o.util.decode_base58(t.nonce);return t.valid=!0,e.concat(o.box.open(t.title,s,n,a.boxSk).then(function(e){t.title=e}).catch(function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher title"),t.valid=!1}),o.box.open(t.content,s,n,a.boxSk).then(function(e){t.content=e,i?S(t):e&&(t.html=c.util.parseAsHtml(e))}).catch(function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher content"),t.valid=!1}))},[]))}).then(function(){return console.debug("[ES] [message] All messages decrypted in "+(Date.now()-a)+"ms"),t})}function S(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim(),e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"..."))}function C(e,t,n){t=t||"inbox";var i=n.wallet||n.walletId&&u.children.get(n.walletId)||u;return c.record.remove("message",t)(e,{wallet:i}).then(function(n){return"inbox"===t&&(i.data.messages=i.data.messages||{},i.data.messages.count=i.data.messages.count>0?i.data.messages.count-1:0),i.isDefault()&&V.data.raise.delete(e),n})}function L(t,n){t=t||"inbox";var i=n&&n.walletId&&u.children.get(n.walletId)||u;return i.auth().then(function(n){return N(n.pubkey,{type:t,from:0,size:1e3,_source:!1}).then(function(n){if(n&&n.length){var a=_.pluck(n,"id");return e.all(n.reduce(function(e,n){return e.concat(c.record.remove("message",t)(n.id,{wallet:i}))},[])).then(function(){return a})}}).then(function(e){"inbox"===t&&(i.data.messages=i.data.messages||{},i.data.messages.count=0,i.data.messages.unreadCount=0),i.isDefault()&&_.forEach(e,V.data.raise.delete)})})}function D(t,n){n=n||{};var i=n.wallet||n.walletId&&u.children.get(n.walletId)||u,a=n&&n.type||(i.isUserPubkey(t.recipient)?"inbox":"outbox");if(t.read){var r=e.defer();return r.resolve(),r.promise}return t.read=!0,i.getKeypair().then(function(e){return o.sign(t.hash,e)}).then(function(e){return W.postReadById(e,{id:t.id})}).then(function(){"inbox"===a&&(i.data.messages=i.data.messages||{},i.data.messages.unreadCount=i.data.messages.unreadCount?i.data.messages.unreadCount-1:0)})}function y(t){t=t||{};var n=t.wallet||t.walletId&&u.children.get(t.walletId)||u;return n.auth().then(function(t){return N(t.pubkey,{type:"inbox",from:0,size:1e3,_source:["hash","read_signature"]}).then(function(n){if(n&&n.length)return n=_.filter(n,{read:!1}),e.all(n.reduce(function(e,n){return e.concat(o.sign(n.hash,t.keypair).then(function(e){return W.postReadById(e,{id:n.id})}))},[]))}).then(function(){n.data.messages=n.data.messages||{},n.data.messages.unreadCount=0})})}function P(e,t){return t&&!t.trim().length?e:(e.forEach(function(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim()||"")}),t.trim().split(" ").forEach(function(t){var n=new RegExp(t,"gi");e.forEach(function(e){var i=n.exec(e.title);if(i)for(e.title=e.title.replace(n,"<b>$&</b>"),e.titleMatch=(e.titleMatch||0)+1;(i=n.exec(e.title.substring(i.index+t.length)))&&!(e.titleMatch>=10);)e.titleMatch=e.titleMatch+1;else if(i=n.exec(e.summary)){for(i.index>140&&(e.summary="..."+e.summary.substring(i.index-20)),e.summary=e.summary.replace(n,"<b>$&</b>"),e.contentMatch=(e.contentMatch||0)+1;(i=n.exec(e.summary.substring(i.index+t.length)))&&!(e.contentMatch>=10);)e.contentMatch++;e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"...")}})}),e=_.filter(e,function(e){return e.titleMatch||e.contentMatch}))}function k(e){return _.sortBy(e,function(e){return-1*(1e3*(e.titleMatch||0)+100*(e.contentMatch||0)+e.time/1e10)})}function M(t){var n=s.developers||[{pubkey:"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"}];t&&t.content&&n&&n.length&&(console.info("[ES] [message] Sending logs to developers..."),t.issuer=u.data.pubkey,t.title=t.title||"Sending log",t.time=moment().utc().unix(),u.getKeypair().then(function(i){return e.all(n.reduce(function(e,n){return n.pubkey?e.concat(I(angular.merge({recipient:n.pubkey},t),i)):e},[]))}).then(function(e){console.info("[ES] [message] Logs sent to {0} developers".format(e.length))}))}function w(){_.forEach(x,function(e){e()}),x=[]}function U(){x=[u.api.data.on.init(t,E,this),u.api.data.on.login(t,g,this),u.api.data.on.load(t,g,this),u.api.data.on.reset(t,b,this),m.api.event.on.newMessage(t,T,this),u.api.error.on.send(t,M,this)]}function B(){var e=c.alive;!e&&x&&x.length>0?(console.debug("[ES] [message] Disable"),w(),u.isLogin()&&b(u.data)):!e||x&&0!==x.length||(console.debug("[ES] [message] Enable"),U(),u.isLogin()&&g(u.data))}var x,F={DEFAULT_LOAD_SIZE:10},H={commons:["issuer","recipient","title","content","time","nonce","read_signature"],notifications:["issuer","time","hash","read_signature"]},W={postSearch:c.post("/message/inbox/_search"),postSearchByType:c.post("/message/:type/_search"),getByTypeAndId:c.get("/message/:type/:id"),postReadById:c.post("/message/inbox/:id/_read")},V=new a(this,"esMessage");return V.registerEvent("data","new"),V.registerEvent("data","delete"),V.registerEvent("data","sent"),r.ready().then(function(){return c.api.node.on.start(t,B,this),c.api.node.on.stop(t,B,this),B()}),{api:V,search:W.postSearch,notifications:{load:v},load:O,get:R,send:h,remove:C,removeAll:L,markAsRead:D,markAllAsRead:y,fields:{commons:H.commons}}}]),angular.module("cesium.es.modal.services",["cesium.modal.services","cesium.es.message.services"]).factory("esModals",["$state","ModalUtils","UIUtils","csWallet",function(e,t,n,i){"ngInject";function a(e){return t.show("plugins/es/templates/message/modal_compose.html","ESMessageComposeModalCtrl",e,{focusFirstInput:!0})}function o(t,i){return n.popover.show(i,{templateUrl:"plugins/es/templates/common/popover_notification.html",scope:t,autoremove:!1,afterHidden:t.resetUnreadCount}).then(function(t){t&&(t.onRead&&"function"==typeof t.onRead&&t.onRead(),t.state&&e.go(t.state,t.stateParams))})}function r(e){return i.auth({minData:!0}).then(function(i){return n.loading.hide(),i.isMember?t.show("plugins/es/templates/invitation/modal_new_invitation.html","ESNewInvitationModalCtrl",e):n.alert.error("ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION")})}function s(a){var o=a&&a.wallet||i;return o.auth({minData:!0}).then(function(){return n.loading.hide(),t.show("plugins/es/templates/registry/modal_record_type.html",void 0,{title:"REGISTRY.EDIT.TITLE_NEW"}).then(function(t){t&&e.go("app.registry_add_record",{type:t,wallet:o.id})})})}return{showMessageCompose:a,showNotifications:o,showNewInvitation:r,showNewPage:s}}]),angular.module("cesium.es.blockchain.services",["cesium.services","cesium.es.http.services"]).factory("esBlockchain",["$rootScope","$q","$timeout","BMA","esHttp",function(e,t,n,i,a){"ngInject";return function(){var e=i.constants.regexp.PUBKEY,t={DEFAULT_SEARCH_SIZE:40,ES_CORE_API_ENDPOINT:"ES_CORE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))"},n={SEARCH_FILTER:{TX_PUBKEY:new RegExp("\\(transactions\\.issuers:("+e+") OR transactions\\.outputs:\\*("+e+")\\)([ ]+AND)?"),ISSUER:new RegExp("issuer:("+e+")([ ]+AND)?"),MEMBER_FLOWS:new RegExp("\\(_exists_:joiners OR _exists_:leavers OR _exists_:revoked OR _exists_:excluded\\)([ ]+AND)?"),EXISTING_TRANSACTION:new RegExp("_exists_:transactions([ ]+AND)?"),PERIOD:new RegExp("medianTime:>=?([0-9]+)[ ]+AND[ ]+medianTime:<=?([0-9]+)([ ]+AND)?")},LAST_AND:/[ ]+AND$/},o={MINIMAL:["number","hash","medianTime","issuer"],COMMONS:["number","hash","medianTime","issuer","currency","version","powMin","dividend","membersCount","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions"]},r={node:{},block:{},raw:{block:{search:a.post("/:currency/block/_search",a.cache.SHORT),searchText:a.get("/:currency/block/_search?q=:text"),get:a.get("/:currency/block/:number/_source",a.cache.SHORT)}},regexp:{ES_CORE_API_ENDPOINT:function(e){return new RegExp("^"+e+"$")}(t.ES_CORE_API_ENDPOINT)}};return r.regex=r.regexp,r.node.parseEndPoint=function(e){var t=r.regexp.ES_CORE_API_ENDPOINT.exec(e);if(t)return{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80}},r.raw.block.processSearchResult=function(e,t){t=t||{},t.excludeCurrent=!angular.isDefined(t.excludeCurrent)||t.excludeCurrent,t.fillAvatar=!angular.isDefined(t.fillAvatar)||t.fillAvatar,t.cleanData=!angular.isDefined(t.cleanData)||t.cleanData;var n=!1;return{hits:(e&&e.hits&&e.hits.hits||[]).reduce(function(e,i){if("current"==i._id&&t.excludeCurrent)return n=!0,e;if(!i._source)return e;var a=new Block(i._source);return t.cleanData&&a.cleanData(),e.concat(a)},[]),took:e.took,total:e&&e.hits&&e.hits.total?n?e.hits.total-1:e.hits.total:0}},r.block.search=function(e,n){var i=n?angular.copy(n):{};return delete i.excludeCurrent,delete i.fillAvatar,delete i.skipData,i.from=i.from||0,i.size=i.size||t.DEFAULT_SEARCH_SIZE,i._source=n._source||o.COMMONS,n._source&&"*"==n._source&&delete i._source,r.raw.block.search(i,{currency:e}).then(function(e){return r.raw.block.processSearchResult(e,n)})},r.block.searchText=function(e,n,i){i&&angular.isUndefined(i.excludeCurrent)&&(i.excludeCurrent=!0);var a=i?angular.copy(i):{};return delete a.excludeCurrent,delete a.fillAvatar,delete a.skipData,a.from=a.from||0,a.size=a.size||t.DEFAULT_SEARCH_SIZE,a._source=i._source||o.COMMONS.join(","),i._source&&"*"==i._source&&delete a._source,a.currency=e,a.text=n||"",r.raw.block.searchText(a).then(function(e){return r.raw.block.processSearchResult(e,i)})},r.block.parseSearchText=function(e,t){var i=e;return t=_.keys(n.SEARCH_FILTER).reduce(function(e,t){var a=n.SEARCH_FILTER[t].exec(i);if(a){var o=a[0];i=i.replace(o,""),o=o.replace(n.LAST_AND,"");var r={type:t,text:o,params:a};return e.concat(r)}return e},t||[]),{filters:t,text:i.trim()}},r}()}]),angular.module("cesium.es.group.services",["cesium.platform","cesium.es.http.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.comment.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esGroup")}]).factory("esGroup",["$q","$rootScope","csPlatform","BMA","csSettings","esHttp","CryptoUtils","csWot","csWallet","esNotification","esComment",function(e,t,n,i,a,o,r,s,l,c,u){"ngInject";function d(e){e.groups=e.groups||{},e.groups.unreadCount=null}function p(e){e.groups&&delete e.groups}function m(t,n){return n=n||e.defer(),t&&t.pubkey?(c.unreadCount(t.pubkey,{codes:{includes:["GROUP_INVITATION"],excludes:[]}}).then(function(e){t.groups=t.groups||{},t.groups.unreadCount=e,console.debug("[ES] [group] Detecting "+e+" unread notifications"),n.resolve(t)}).catch(function(e){console.error("Error while counting group notifications: "+(e.message?e.message:e)),n.resolve(t)}),n.promise):(n.resolve(),n.promise)}function E(e,t){if(e){var n=e._source;return t&&e.highlight&&(e.highlight.title&&(n.title=e.highlight.title[0]),e.highlight.description&&(n.description=e.highlight.description[0]),e.highlight.location&&(n.location=e.highlight.location[0]),e.highlight.tags&&(data.tags=e.highlight.tags.reduce(function(e,t){return e.concat(t.replace("<em>","").replace("</em>",""))},[]))),t&&(n.description=o.util.parseAsHtml(n.description)),n.avatar=o.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(n.pictures=e._source.pictures.reduce(function(e,t){return e.concat(o.image.fromAttachment(t.file))},[])),n}}function b(e){return A._internal.search(e).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce(function(e,t){var n=E(t,!0);return n.id=t._id,n?e.concat(n):e},[]);return console.debug("[ES] [group] Loading {0} groups".format(t.length)),t})}function g(e){return e=e||{},b({sort:{time:"desc"},from:e.from||0,size:e.size||O,_source:e._source||R.list})}function f(e){e=e||{};var t=e.text&&e.text.trim();if(!t)return g(e);var n={from:e.from||0,size:e.size||O,highlight:{fields:{title:{},tags:{}}},_source:e._source||R.list},a=[],o=[];if(i.regexp.PUBKEY.test(t))o.push({term:{issuer:t}}),o.push({term:{pubkey:t}});else{t=t.toLowerCase();var r=["title","description"];a.push({multi_match:{query:t,fields:r,type:"phrase_prefix"}}),a.push({match:{title:t}}),a.push({match:{description:t}})}return n.query={bool:{}},a.length>0&&(n.query.bool.should=a),o.length>0&&(n.query.bool.filter=o),b(n)}function T(e,t){return t=t||{},t.fecthPictures=!!angular.isDefined(t.fetchPictures)&&t.fetchPictures,t.html=!angular.isDefined(t.html)||t.html,(t.fecthPictures?A._internal.get({id:e}):A._internal.getCommons({id:e})).then(function(e){var n=E(e,t.html);return s.extend({pubkey:n.issuer}).then(function(t){return{id:e._id,issuer:t,record:n}})})}function h(){_.forEach(N,function(e){e()}),N=[]}function I(){N=[l.api.data.on.login(t,m,this),l.api.data.on.init(t,d,this),l.api.data.on.reset(t,p,this)]}function v(){var e=o.alive;!e&&N&&N.length>0?(console.debug("[ES] [group] Disable"),h(),l.isLogin()&&p(l.data)):!e||N&&0!==N.length||(console.debug("[ES] [group] Enable"),I(),l.isLogin()&&m(l.data))}var N,O=50,R={list:["issuer","title","description","type","creationTime","avatar._content_type"],commons:["issuer","title","description","creationTime","time","signature"],notifications:["issuer","time","hash","read_signature"]},A={_internal:{}};return A._internal.search=o.post("/group/record/_search"),A._internal.get=o.get("/group/record/:id"),A._internal.getCommons=o.get("/group/record/:id?_source="+R.commons.join(",")),n.ready().then(function(){return o.api.node.on.start(t,v,this),o.api.node.on.stop(t,v,this),v()}),{record:{last:g,search:f,load:T,add:o.record.post("/group/record",{tagFields:["title","description"]}),update:o.record.post("/group/record/:id/_update",{tagFields:["title","description"]}),remove:o.record.remove("group","record"),fields:{commons:R.commons},picture:{all:o.get("/group/record/:id?_source=pictures")},comment:u.instance("group")}}}]),angular.module("cesium.es.invitation.services",["cesium.platform","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esInvitation")}]).factory("esInvitation",["$rootScope","$q","CryptoUtils","csPlatform","Api","esHttp","csWallet","esWallet","csWot","esNotification",function(e,t,n,i,a,o,r,s,l,c){"ngInject";function u(e){e.invitations=e.invitations||{},e.invitations.unreadCount=null,e.invitations.time=null}function d(e){e.invitations&&delete e.invitations}function p(e,n){if(n=n||t.defer(),!e||!e.pubkey)return n.resolve(),n.promise;var i=Date.now(),a=Math.trunc(i/1e3);return e.invitations&&e.invitations.time&&a-e.invitations.time<30?(console.debug("[ES] [invitation] Skipping load (loaded "+(a-e.invitations.time)+"s ago)"),n.resolve(),n.promise):(console.debug("[ES] [invitation] Loading count..."),b(e.pubkey).then(function(t){e.invitations=e.invitations||{},e.invitations.unreadCount=t,e.invitations.time=a,console.debug("[ES] [invitation] Loaded count ("+t+") in "+(Date.now()-i)+"ms"),n.resolve(e)}).catch(function(t){console.error("Error while counting invitation: "+(t.message?t.message:t)),n.resolve(e)}),n.promise)}function m(e){if(r.data.invitations&&r.data.invitations.list){var n=_.where(r.data.invitations.list,{type:"certification",pubkey:e.pubkey});if(n&&n.length)return t.all(n.reduce(function(e,t){return e.concat(h(t))},[]))}}function E(t){if(console.debug("[ES] [invitation] detected new invitation (from notification service)"),!r.isAuth())return void e.$applyAsync(function(){r.data.invitations=r.data.invitations||{},r.data.invitations.unreadCount++});f(t.reference.id,t.reference.type).then(function(e){r.data.invitations=r.data.invitations||{},r.data.invitations.unreadCount++,r.data.invitations.list&&r.data.invitations.list.splice(0,0,e),D.data.raise.new(e)})}function b(e){if(!(e=e||(r.isLogin()?r.data.pubkey:e)))throw new Error("User not connected or no pubkey");var t={query:{bool:{must:[{term:{recipient:e}}]}}};return o.post("/invitation/certification/_count")(t).then(function(e){return e.count})}function g(e,t){t=t||{},t.type=t.type||"certification";var n=t.keypair||t.wallet&&t.wallet.data.keypair;return s.box.record.pack(e,n,"recipient",["content","comment"]).then(function(e){return S.raw[t.type].add(e,t)})}function f(e,n){return n=n||"certification",t.all([s.box.getKeypair(),S.raw[n].get({id:e,fields:L.commons.join(",")})]).then(function(e){var t=e[0],n=e[1],i=n._source;return i.id=n._id,i.type=n._type,s.box.record.open([i],t,"issuer",["content","comment"])}).then(function(e){var t=e[0];if(t&&t.valid){var n=new Invitation(t);return l.extendAll(n.issuer?[n,n.issuer]:[n],"pubkey").then(function(){return n})}})}function T(e,n){if(!r.isLogin())return t.when([]);e=e||{},e.from=e.from||0,e.size=e.size||C.DEFAULT_LOAD_SIZE;var i=e.issuer||r.data.pubkey,a={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:i}}}},from:e.from,size:e.size,_source:L.commons};return e.readTime&&(query.bool.must=[{range:{time:{gt:e.readTime}}}]),S.raw.certification.postSearch(a).then(function(e){if(!e||!e.hits||!e.hits.total)return[];var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,n.type=t._type,n.read=!!n.read_signature,delete n.read_signature,e.concat(n)},[]);return s.box.record.open(t,n,"issuer",["content","comment"])}).then(function(t){var n=[];return t=t.reduce(function(e,t){if(!t||!t.valid)return e;var i=new Invitation(t);return n.push(i),i.issuer&&n.push(i.issuer),e.concat(i)},[]),l.extendAll(n,"pubkey").then(function(){return r.data.invitations=r.data.invitations||{},r.data.invitations.list?(r.data.invitations.list.length&&r.data.invitations.list.splice(e.from,r.data.invitations.list.length-e.from),_.forEach(t,function(e){r.data.invitations.list.push(e)})):r.data.invitations.list=t,r.data.invitations.list})})}function h(e,t){if(!e||!e.id)throw"Invalid invitation (empty or without id). Could not delete.";var n=e.type||"certification",i=t&&t.walletId&&r.children.get(t.walletId)||r;return S.raw[n].remove(e.id,{wallet:i}).then(function(){i.data.invitations.unreadCount=0,i.data.invitations&&i.data.invitations.list&&i.data.invitations.list.splice(i.data.invitations.list.indexOf(e),1)})}function I(e,n,i){return e&&e.length?(n=n||"certification",t.all(e.reduce(function(e,t){return e.concat(S.raw[n].remove(t,i))},[]))):t.when()}function v(e,t){e=e||"certification";var n=Date.now();console.debug("[ES] [invitation] Deleting all {0} invitations...".format(e));var i=t&&t.pubkey&&r.children.getByPubkey(t.pubkey)||t&&t.walletId&&r.children.getByPubkey(t.walletId)||r,a=i.data.invitations&&i.data.invitations.count||0,o=i.data.invitations&&i.data.invitations.unreadCount||0;return S.raw[e].getIds({pubkey:i.data.pubkey}).then(function(t){if(t&&t.hits&&t.hits.total){return I(t.hits.hits.reduce(function(e,t){return e.concat(t._id)},[]),e,{walletId:i.id}).then(function(){i.data.invitations=i.data.invitations||{},i.data.invitations.count>=a?i.data.invitations.count-=a||0:i.data.invitations.count=0,i.data.invitations.unreadCount>=o?i.data.invitations.unreadCount-=o||0:i.data.invitations.unreadCount=0,console.debug("[ES] [invitation] All {0} invitations deleted in {1}ms".format(e,Date.now()-n))})}})}function N(){_.forEach(A,function(e){e()}),A=[]}function O(){A=[r.api.data.on.init(e,u,this),r.api.data.on.login(e,p,this),r.api.data.on.load(e,p,this),r.api.data.on.reset(e,d,this),r.api.action.on.certify(e,m,this),c.api.event.on.newInvitation(e,E,this)]}function R(){var e=o.alive;!e&&A&&A.length>0?(console.debug("[ES] [invitations] Disable"),N(),r.isLogin()&&d(r.data)):!e||A&&0!==A.length||(console.debug("[ES] [invitations] Enable"),O(),r.isLogin()&&p(r.data))}var A,S=this,C={DEFAULT_LOAD_SIZE:20},L={commons:["issuer","time","hash","content","nonce","comment"]},D=new a(this,"esInvitation");return S.raw={certification:{get:o.get("/invitation/certification/:id?_source:fields"),add:o.record.post("/invitation/certification"),postSearch:o.post("/invitation/certification/_search"),remove:o.record.remove("invitation","certification"),getIds:o.get("/invitation/certification/_search?q=recipient::pubkey&_source=false&size=1000")}},D.registerEvent("data","new"),i.ready().then(function(){return o.api.node.on.start(e,R,this),o.api.node.on.stop(e,R,this),R()}),S.api=D,S.load=T,S.get=f,S.send=g,S.delete=h,S.deleteByIds=I,S.deleteAll=v,S.constants=C,S}]),angular.module("cesium.es.subscription.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esSubscription")}]).factory("esSubscription",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","esSettings","CryptoUtils","UIUtils","csWallet","csWot","BMA","csPlatform","esWallet",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E){"ngInject";function b(e){e.subscriptions=null}function g(e,n){return n=n||t.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [subscription] Loading subscriptions count..."),C.raw.count({pubkey:e.pubkey}).then(function(t){e.subscriptions=e.subscriptions||{},e.subscriptions.count=t&&t.hits&&t.hits.total,console.debug("[ES] [subscription] Loaded count ("+e.subscriptions.count+")"),n.resolve(e)}).catch(function(t){console.error("[ES] [subscription] Error while counting subscription: "+(t.message?t.message:t)),n.resolve(e)}),n.promise):(n.resolve(),n.promise)}function f(e,t){return C.raw.getAll({issuer:e}).then(function(e){var n=e&&e.hits&&e.hits.total&&e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,e.concat(n)},[])||[];return E.box.record.open(n,t,"issuer","issuerContent").then(function(e){return _.forEach(e,function(e){e.content=JSON.parse(e.issuerContent||"{}"),delete e.issuerContent,delete e.recipientContent}),e})})}function T(e,n){if(!(e&&e.type&&e.content&&e.recipient))return t.reject("Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'");var i=n&&n.wallet||n&&n.walletId&&u.children.get(n.walletId)||u,a=i.data.pubkey,o=JSON.stringify(e.content);return l.util.random_nonce().then(function(n){return t.all([E.box.record.pack({issuer:a,issuerContent:o},i.data.keypair,"issuer","issuerContent",n),E.box.record.pack({recipient:e.recipient,recipientContent:o},i.data.keypair,"recipient","recipientContent",n)])}).then(function(t){var n=angular.merge(t[0],t[1]);return n.type=e.type,C.raw.add(n,{wallet:i}).then(function(t){return e.id=t,e})})}function h(e,n){if(!e||!e.content||!e.recipient)return t.reject("Missing arguments 'record' or 'record.content', or 'record.recipient'");var i=n&&n.wallet||n&&n.walletId&&u.children.get(n.walletId)||u,a=i.data.pubkey,o=JSON.stringify(e.content);return l.util.random_nonce().then(function(n){return t.all([E.box.record.pack({issuer:a,issuerContent:o},i.data.keypair,"issuer","issuerContent",n),E.box.record.pack({recipient:e.recipient,recipientContent:o},i.data.keypair,"recipient","recipientContent",n)])}).then(function(t){var n=angular.merge(t[0],t[1]);return n.type=e.type,C.raw.update(n,{id:e.id,wallet:i}).then(function(){return e})})}function I(){if(C.raw.categories&&C.raw.categories.length){var e=t.defer();return e.resolve(C.raw.categories),e.promise}return C.raw.category.all().then(function(e){if(0===e.hits.total)C.raw.categories=[];else{var t=e.hits.hits.reduce(function(e,t){var n=t._source;return n.id=t._id,e.concat(n)},[]);_.forEach(t,function(e){t[e.id]=e}),C.raw.categories=t}return C.raw.categories})}function v(e){return C.raw.category.get(e).then(function(e){var t=e._source;return t.id=e._id,t})}function N(){_.forEach(A,function(e){e()}),A=[]}function O(){A=[u.api.data.on.load(e,g,this),u.api.data.on.init(e,b,this),u.api.data.on.reset(e,b,this)]}function R(){var e=i.alive;if(!e&&A&&A.length>0){if(console.debug("[ES] [subscription] Disable"),N(),u.isLogin())return b(u.data)}else if(e&&(!A||0===A.length)&&(console.debug("[ES] [subscription] Enable"),O(),u.isLogin()))return g(u.data)}var A,S={},C=this;return C.raw={getAll:i.get("/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer"),count:i.get("/subscription/record/_search?size=0&q=issuer::pubkey"),add:i.record.post("/subscription/record"),update:i.record.post("/subscription/record/:id/_update"),category:{get:i.get("/subscription/category/:id"),all:i.get("/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key")}},m.ready().then(function(){return i.api.node.on.start(e,R,this),i.api.node.on.stop(e,R,this),R()}),C.record={load:f,add:T,update:h,remove:i.record.remove("subscription","record")},C.category={all:I,get:v},C.constants=S,C}]),angular.module("cesium.es.wallet.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.crypto.services"]).factory("esWallet",["$q","$rootScope","$timeout","CryptoUtils","csPlatform","csWallet","esCrypto","esProfile","esHttp",function(e,t,n,i,a,o,r,s,l){"ngInject";function c(e){e.avatar=null,e.profile=null,e.name=null,o.events.cleanByContext("esWallet"),e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function u(t,n){return n=n||e.defer(),r.box.getKeypair(t.keypair).then(function(e){t.keypair.boxSk=e.boxSk,t.keypair.boxPk=e.boxPk,console.debug("[ES] [wallet] Box keypair successfully computed"),n.resolve()}),n.promise}function d(e){e=e||o.data,e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function p(t,a){if(a=a||e.defer(),!t||!t.pubkey||!t.keypair)return a.resolve(),a.promise;if(!i.isLoaded())return console.debug("[ES] [wallet] Waiting crypto lib loading..."),n(function(){return p(t,a)},50);console.debug("[ES] [wallet] Loading user avatar+name...");var o=Date.now();return s.getAvatarAndName(t.pubkey).then(function(e){e?(t.name=e.name,t.avatarStyle=e.avatarStyle,t.avatar=e.avatar,console.debug("[ES] [wallet] Loaded user avatar+name in "+(Date.now()-o)+"ms")):console.debug("[ES] [wallet] No user avatar+name found"),a.resolve(t)}).catch(function(e){a.reject(e)}),a.promise}function m(t,n){n=n||e.defer(),o.events.cleanByContext("esWallet"),!t.name&&!t.requirements.revoked&&t.requirements.pendingMembership&&t.requirements.needCertificationCount>0&&o.events.add({type:"info",message:"ACCOUNT.EVENT.MEMBER_WITHOUT_PROFILE",context:"esWallet"}),console.debug("[ES] [wallet] Loading full user profile...");var i=Date.now();return s.get(t.pubkey).then(function(e){e&&(t.name=e.name,t.avatar=e.avatar,t.profile=e.source,t.profile.description=e.description,console.debug("[ES] [wallet] Loaded full user profile in "+(Date.now()-i)+"ms")),n.resolve()}),n.promise}function E(t){if(!t&&!o.isAuth())throw new Error("Unable to get box keypair: user not authenticated !");return(t?e.when(t):o.getKeypair({silent:!0})).then(function(t){return t&&t.boxPk&&t.boxSk?e.when(t):r.box.getKeypair(t).then(function(e){return t.boxSk=e.boxSk,t.boxPk=e.boxPk,console.debug("[ES] [wallet] Box keypair successfully computed"),t})})}function b(){T=[o.api.data.on.login(t,p,this),o.api.data.on.load(t,m,this),o.api.data.on.init(t,c,this),o.api.data.on.reset(t,c,this),o.api.data.on.unauth(t,d,this),o.api.data.on.auth(t,u,this)]}function g(){_.forEach(T,function(e){e()}),T=[]}function f(){var e=l.alive;if(!e&&T&&T.length>0){if(console.debug("[ES] [wallet] Disable"),g(),o.isLogin())return c(o.data)}else if(e&&(!T||0===T.length)&&(console.debug("[ES] [wallet] Enable"),b(),o.isLogin()))return p(o.data)}var T,h=this;return a.ready().then(function(){return l.api.node.on.start(t,f,this),l.api.node.on.stop(t,f,this),f()}),h.box={getKeypair:E,record:{pack:function(e,t,n,i,a){return E(t).then(function(t){return r.box.pack(e,t,n,i,a)})},open:function(e,t,n,i){return E(t).then(function(t){return r.box.open(e,t,n,i)})}}},h}]),angular.module("cesium.es.wot.services",["ngResource","cesium.es.http.services"]).factory("esWot",["$rootScope","$q","esHttp","csCache",function(e,t,n,i){"ngInject";var a=i.get("esWot-memberships-",i.constants.MEDIUM),o={user:{event:n.post("/user/event/_search")}},r=function(e,n){n=n||{};var i=!1!==n.cache?a.get(e):null;if(i)return t.when(i);var r={size:1e3,query:{bool:{filter:[{term:{recipient:e}},{terms:{code:["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"]}}]}},sort:[{time:{order:"asc"}}],_source:["code","time"]};return o.user.event(r).then(function(t){if(t.hits&&t.hits.total){var n,i=t.hits.hits.reduce(function(e,t){var i="MEMBER_JOIN"==t._source.code||"MEMBER_ACTIVE"==t._source.code;return i&&!n?n=t._source.time:!i&&n&&(e=e.concat({joinTime:n,leaveTime:t._source.time}),n=0),e},[]);return n&&i.push({joinTime:n,leaveTime:moment().utc().unix()}),a.put(e,i),i}})},s=function(){console.debug("[ES] [wot] Clean cache..."),i.clear("esWot-")};return n.api.node.on.stop(e,s,this),{memberships:r}}]),angular.module("cesium.es.tx.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.wot.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esTx")}]).factory("esTx",["$q","$rootScope","csPlatform","csCurrency","csTx","esHttp","esWot",function(e,t,n,i,a,o,r){"ngInject";function s(e,t){return t<=0?e:e*Math.pow(10,t)}function l(t,n){return n=n||e.defer(),t=t||{},t.pubkey||n.reject("Missing [pubkey] when calling [loadUDs] extension point"),e.all([i.get(),r.memberships(t.pubkey)]).then(function(n){var i=n[0]&&n[0].name,a=n[1];if(i&&a&&a.length)return-1!==t.fromTime&&(a=a.reduce(function(e,n){return n.leaveTime<t.fromTime?e:(n.joinTime=Math.max(n.joinTime,t.fromTime),e.concat(n))},[])),e.all(a.reduce(function(e,n){var a={query:{filtered:{filter:{bool:{must:[{exists:{field:"dividend"}},{range:{medianTime:{from:n.joinTime+1,to:n.leaveTime}}}]}}}},size:t.size||1e4,from:t.from||0,sort:{medianTime:"desc"},_source:["medianTime","number","dividend","unitbase"]};return e.concat(m.block.search(a,{currency:i}))},[]))}).then(function(e){if(e&&e.length)return e.reduce(function(e,t){return t.hits.total&&t.hits.hits.length?e.concat(t.hits.hits.reduce(function(e,t){var n=t._source;return e.concat({time:n.medianTime,amount:s(n.dividend,n.unitbase),isUD:!0,block_number:n.number})},[])):t},[])}).then(function(e){n.resolve(e)}).catch(function(e){n.reject(e)}),n.promise}function c(){p=[a.api.data.on.loadUDs(t,l,this)]}function u(){_.forEach(p,function(e){e()}),p=[]}function d(){var e=o.alive;!e&&p&&p.length>0?(console.debug("[ES] [tx] Disable"),u()):!e||p&&0!==p.length||(console.debug("[ES] [tx] Enable"),c())}var p,m={block:{search:o.post("/:currency/block/_search")}};return n.ready().then(function(){return o.api.node.on.start(t,d,this),o.api.node.on.stop(t,d,this),d()}),{}}]),angular.module("cesium.es.geo.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esGeo")}]).factory("esGeo",["$rootScope","$q","csConfig","csSettings","csHttp",function(e,t,n,i,a){"ngInject";function o(e){var t=e.trim().replace(/\n/g,",");return t=t.replace(/(?:^|[\t\n\r\s ])([A−Z09-]+)(?:$|[\t\n\r\s ])/g,""),t=t.replace(/,[ ,]+/g,", ")}function r(e){return p.raw.google.search({address:e,key:p.raw.google.apiKey}).then(function(e){if(e&&e.results&&e.results.length)return e.results.reduce(function(e,t){return e.concat({display_name:t.address_components&&t.address_components.reduce(function(e,t){return t.long_name?e.concat(t.long_name):e},[]).join(", "),lat:t.geometry&&t.geometry.location&&t.geometry.location.lat,lon:t.geometry&&t.geometry.location&&t.geometry.location.lng})},[])})}function s(e,t){return console.debug("[ES] [geo] Search position failed on [OSM]. Trying [google] service"),r(t).catch(function(t){throw console.debug("[ES] [geo] Search position failed on [google] service"),e||t})}function l(e){"string"==typeof e&&(e={q:e}),e.q&&(e.q=o(e.q)),e.addressdetails=1
+;var t=Date.now();return p.raw.osm.search(e).then(function(e){if(e)return e=e.reduce(function(e,t){return"waterway"!=t.class&&"railway"!=t.class&&t.address?(t.address.city=t.address.city||t.address.village||t.address.town||t.address.postcode,t.address.road=t.address.road||t.address.suburb||t.address.hamlet,t.address.postcode&&t.address.city==t.address.postcode&&delete t.address.postcode,t.address.city?e.concat({id:t.place_id,name:t.display_name,address:t.address,lat:t.lat,lon:t.lon,class:t.class,license:p.raw.osm.license}):e):e},[]),console.debug("[ES] [geo] Found {0} address position(s)".format(e&&e.length||0,Date.now()-t),e),e.length?e:void 0}).catch(function(t){return s(t,e.q?e.q:(e.street?e.street+", ":"")+e.city+(e.country?", "+e.country:""))})}function c(){var e=t.defer();return navigator.geolocation?navigator.geolocation.getCurrentPosition(function(t){if(!t||!t.coords)return void console.error("[ES] [geo] navigator geolocation > Unknown format:",t);e.resolve({lat:t.coords.latitude,lon:t.coords.longitude})},function(t){e.reject(t)},{timeout:5e3}):e.reject(),e.promise}function u(e){return p.raw.freegeoip.search({ip:e}).then(function(e){return e?{lat:e.latitude,lng:e.longitude}:void 0})}function d(e,t,n,i,a){var o=Math.PI*e/180,r=Math.PI*n/180,s=t-i,l=Math.PI*s/180,c=Math.sin(o)*Math.sin(r)+Math.cos(o)*Math.cos(r)*Math.cos(l);return c=Math.acos(c),c=180*c/Math.PI,c=60*c*1.1515,"km"==a?1.609344*c:"N"==a?.8684*c:c}var p=this;p.raw={osm:{search:a.get("nominatim.openstreetmap.org",443,"/search.php?format=json"),license:{name:"OpenStreetMap",url:"https://www.openstreetmap.org/copyright"}},google:{apiKey:void 0,search:a.get("maps.google.com",443,"/maps/api/geocode/json")},freegeoip:{search:a.get("freegeoip.net",443,"/json/:ip"),license:{name:"freegeoip",url:"https://freegeoip.net"}}},p.raw.google.apiKey=n.plugins&&n.plugins.es&&n.plugins.es.googleApiKey;var m=!!p.raw.google.apiKey;return i.ready().then(function(){function t(e){m||(p.raw.google.apiKey=e.plugins.es.googleApiKey),p.raw.google.enable=p.raw.google.apiKey&&e.plugins&&e.plugins.es&&e.plugins.es.enableGoogleApi}i.api.data.on.changed(e,t,this),t(i.data)}),{point:{current:c,searchByAddress:l,distance:d,ip:{search:u,license:p.raw.freegeoip.license}},google:{isEnable:function(){return p.raw.google.enable&&p.raw.google.apiKey},searchByAddress:r}}}]),angular.module("cesium.es.document.services",["ngResource","cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.registerEagerLoadingService("esDocument")}]).factory("esDocument",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","csWot","csWallet","esHttp",function(e,t,n,i,a,o,r,s,l,c,u,d){"ngInject";function p(e,t){t.issuerField=t.issuerField||"pubkey";var n=(e&&e.hits&&e.hits.hits||[]).reduce(function(e,n){var i=n._source||{};return i.index=n._index,i.type=n._type,i.id=n._id,i.pubkey=i.issuer||t.issuerField&&i[t.issuerField],i.time=i.time||t.getTimeFunction&&t.getTimeFunction(i),e.concat(i)},[]),i=n.reduce(function(e,t){return t.recipient?(t.recipient={pubkey:t.recipient},e.concat(t.recipient)):e},[]);return c.extendAll(n.concat(i)).then(function(){return{hits:n,took:e.took,total:e&&e.hits&&e.hits.total||0}})}function m(e){e=e||{};var t,n;if("movement"==e.type?e.sort?(t=e.sort.split(":"),n=t.length>1?t[1]:"desc",e.sort=[{"stats.medianTime":{nested_path:"stats",order:n}}],e._source=f.peer,e.getTimeFunction=function(e){return e.time=e.stats&&e.stats.medianTime,e.time}):e.sort="stats.medianTime:desc":"movement"==e.type&&(e.sort?(t=e.sort.split(":"),n=t.length>1?t[1]:"desc",e.sort=[{medianTime:{order:n}}],e._source=f.movement,e.getTimeFunction=function(e){return e.time=e.medianTime,e.time}):e.sort="medianTime:desc"),!e||!e.index||!e.type)throw new Error("Missing mandatory options [index, type]");var i={from:e.from||0,size:e.size||_.DEFAULT_LOAD_SIZE,sort:e.sort||{time:"desc"},_source:e._source||f.commons};return e.query&&(i.query=e.query),T.search(i,{index:e.index,type:e.type}).then(function(t){return p(t,e)})}function E(e,t){t=t||{};var n={text:e,index:t.index||"user",type:t.type||"event",from:t.from||0,size:t.size||_.DEFAULT_LOAD_SIZE,sort:t.sort||"time:desc",_source:t._source||f.commons.join(",")};console.debug("[ES] [wallet] [document] [{0}/{1}] Loading documents...".format(t.index,t.type));var i=Date.now();return T.searchText(n).then(function(e){return p(e,t)}).then(function(e){return console.debug("[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms".format(t.index,t.type,e&&e.hits&&e.hits.length||0,Date.now()-i)),e})}function b(t,n){return t&&t.index&&t.type&&t.id?d.record.remove(t.index,t.type)(t.id,n):e.reject("Could not remove document: missing mandatory fields")}function g(t,n){if(t&&t.length){var i=n&&n.walletId&&u.children.get(n.walletId)||u;return i.auth().then(function(){return e.all(t.reduce(function(e,t){return e.concat(d.record.remove(t.index,t.type)(t.id,{wallet:i}))},[]))})}}var _={DEFAULT_LOAD_SIZE:40},f={commons:["issuer","pubkey","hash","time","recipient","nonce","read_signature"],peer:["*"],movement:["*"]},T={search:d.post("/:index/:type/_search"),searchText:d.get("/:index/:type/_search?q=:text")};return{search:m,searchText:E,remove:b,removeAll:g,fields:{commons:f.commons}}}]),ESPicturesEditController.$inject=["$scope","UIUtils","$q","Device"],ESSocialsEditController.$inject=["$scope","$focus","$filter","UIUtils","SocialUtils"],ESSocialsViewController.$inject=["$scope"],ESCommentsController.$inject=["$scope","$filter","$state","$focus","$timeout","$anchorScroll","UIUtils"],ESCategoryModalController.$inject=["$scope","UIUtils","$timeout","parameters"],ESAvatarModalController.$inject=["$scope"],ESPositionEditController.$inject=["$scope","csConfig","esGeo","ModalUtils"],ESLookupPositionController.$inject=["$scope","$q","csConfig","esGeo","ModalUtils"],ESSearchPositionItemController.$inject=["$scope","$timeout","ModalUtils","csConfig","esGeo"],ESSearchPositionModalController.$inject=["$scope","$q","$translate","esGeo","parameters"],angular.module("cesium.es.common.controllers",["ngResource","cesium.es.services"]).controller("ESPicturesEditCtrl",ESPicturesEditController).controller("ESPicturesEditCtrl",ESPicturesEditController).controller("ESSocialsEditCtrl",ESSocialsEditController).controller("ESSocialsViewCtrl",ESSocialsViewController).controller("ESCommentsCtrl",ESCommentsController).controller("ESCategoryModalCtrl",ESCategoryModalController).controller("ESAvatarModalCtrl",ESAvatarModalController).controller("ESPositionEditCtrl",ESPositionEditController).controller("ESLookupPositionCtrl",ESLookupPositionController).controller("ESSearchPositionItemCtrl",ESSearchPositionItemController).controller("ESSearchPositionModalCtrl",ESSearchPositionModalController),ESExtensionController.$inject=["$scope","esSettings","PluginService"],ESMenuExtendController.$inject=["$scope","$state","$controller","UIUtils","csWallet"],ESProfilePopoverExtendController.$inject=["$scope","$q","$state","esSettings","csWallet"],angular.module("cesium.es.app.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&(e.extendState("app",{points:{"nav-buttons-right":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"}}}),e.extendState("app",{points:{"profile-popover-user":{templateUrl:"plugins/es/templates/common/popover_profile_extend.html",controller:"ESProfilePopoverExtendCtrl"}}}))}]).controller("ESExtensionCtrl",ESExtensionController).controller("ESMenuExtendCtrl",ESMenuExtendController).controller("ESProfilePopoverExtendCtrl",ESProfilePopoverExtendController),ESExtendSettingsController.$inject=["$scope","PluginService"],ESPluginSettingsController.$inject=["$scope","$window","$q","$translate","$ionicPopup","UIUtils","Modals","csHttp","csConfig","csSettings","esHttp","esSettings"],angular.module("cesium.es.settings.controllers",["cesium.es.services"]).config(["PluginServiceProvider","$stateProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(e.extendState("app.settings",{points:{plugins:{templateUrl:"plugins/es/templates/settings/settings_extend.html",controller:"ESExtensionCtrl"}}}),t.state("app.es_settings",{url:"/settings/es",views:{menuContent:{templateUrl:"plugins/es/templates/settings/plugin_settings.html",controller:"ESPluginSettingsCtrl"}}}))}]).controller("ESExtendSettingsCtrl",ESExtendSettingsController).controller("ESPluginSettingsCtrl",ESPluginSettingsController),angular.module("cesium.es.currency.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.currency.tab_blocks",{points:{"nav-buttons":{templateUrl:"plugins/es/templates/currency/tab_blocks_extend.html",controller:"ESExtensionCtrl"}}})}]),ESWalletController.$inject=["$scope","$controller","$state","esModals","csWallet"],angular.module("cesium.es.wallet.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendStates(["app.view_wallet","app.view_wallet_by_id"],{points:{"after-general":{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletCtrl"}}}).extendState("app.view_wallets",{points:{"item-wallet":{templateUrl:"plugins/es/templates/wallet/item_wallet_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("ESWalletCtrl",ESWalletController),ESWotLookupExtendController.$inject=["$scope","$controller","$state"],ESWotIdentityViewController.$inject=["$scope","$ionicPopover","$q","$controller","UIUtils","Modals","csWallet","esModals","esWallet","esInvitation"],angular.module("cesium.es.wot.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&t.extendState("app.wot_lookup",{points:{tabs:{templateUrl:"plugins/es/templates/wot/lookup_extend.html",controller:"ESExtensionCtrl"}}}).extendState("app.wot_lookup_lg",{points:{top:{templateUrl:"plugins/es/templates/wot/lookup_lg_extend.html",controller:"ESWotLookupExtendCtrl"}}}).extendStates(["app.wot_identity","app.wot_identity_uid"],{points:{"after-general":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"buttons-top-fab":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"}}}).extendStates(["app.wot_cert","app.wot_cert_lg","app.wallet_cert","app.wallet_cert_lg"],{points:{"nav-buttons":{templateUrl:"plugins/es/templates/wot/view_certifications_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_certifications_extend.html",controller:"ESWotIdentityViewCtrl"}}})}]).controller("ESWotLookupExtendCtrl",ESWotLookupExtendController).controller("ESWotIdentityViewCtrl",ESWotIdentityViewController),ESRegistryLookupController.$inject=["$scope","$focus","$timeout","$filter","$controller","$location","$translate","$ionicPopover","Device","UIUtils","ModalUtils","BMA","csSettings","csWallet","esModals","esRegistry","esHttp"],ESWalletPagesController.$inject=["$scope","$controller","$timeout","UIUtils","esModals","csWallet"],ESRegistryRecordViewController.$inject=["$scope","$rootScope","$state","$q","$timeout","$ionicPopover","$ionicHistory","$translate","$anchorScroll","csConfig","csWallet","esRegistry","UIUtils","esHttp"],ESRegistryRecordEditController.$inject=["$scope","$timeout","$state","$q","$ionicHistory","$focus","$translate","$controller","Device","UIUtils","ModalUtils","csWallet","esHttp","esRegistry"],angular.module("cesium.es.registry.controllers",["cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){"ngInject";e.state("app.wot_lookup.tab_registry",{url:"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{tab_registry:{templateUrl:"plugins/es/templates/registry/tabs/tab_registry.html",controller:"ESRegistryLookupCtrl"}},data:{large:"app.registry_lookup_lg",silentLocationChange:!0}}).state("app.registry_lookup_lg",{url:"/wot/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup_lg.html",controller:"ESRegistryLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.wallet_pages",{url:"/account/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0,silentLocationChange:!0}}).state("app.wallet_pages_by_id",{url:"/wallets/:id/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0,silentLocationChange:!0}}).state("app.view_page",{url:"/page/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.view_page_anchor",{url:"/page/view/:id/:title/:anchor",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.registry_add_record",{cache:!1,url:"/page/add/:type?wallet",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}}).state("app.registry_edit_record",{cache:!1,url:"/page/edit/:id/:title?wallet",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}})}]).controller("ESRegistryLookupCtrl",ESRegistryLookupController).controller("ESWalletPagesCtrl",ESWalletPagesController).controller("ESRegistryRecordViewCtrl",ESRegistryRecordViewController).controller("ESRegistryRecordEditCtrl",ESRegistryRecordEditController),ESViewEditProfileController.$inject=["$scope","$q","$timeout","$state","$focus","$translate","$controller","$ionicHistory","$ionicPopover","UIUtils","csWallet","esHttp","esProfile","ModalUtils","Device"],angular.module("cesium.es.profile.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_profile",{url:"/wallet/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{auth:!0}}).state("app.edit_profile_by_id",{url:"/wallets/:id/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{login:!0}})}]).controller("ESViewEditProfileCtrl",ESViewEditProfileController),ESMessageAbstractListController.$inject=["$scope","$state","$translate","$ionicHistory","$ionicPopover","$timeout","csWallet","esModals","UIUtils","esMessage"],ESMessageInboxListController.$inject=["$scope","$controller"],ESMessageOutboxListController.$inject=["$scope","$controller"],ESMessageComposeController.$inject=["$scope","$controller"],ESMessageComposeModalController.$inject=["$scope","Modals","UIUtils","csWallet","esHttp","esMessage","parameters"],ESMessageViewController.$inject=["$scope","$state","$timeout","$translate","$ionicHistory","$ionicPopover","UIUtils","esModals","esMessage","csWallet"],PopoverMessageController.$inject=["$scope","UIUtils","$state","csWallet","esHttp","esMessage","esModals","$timeout"],angular.module("cesium.es.message.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.user_message",{url:"/user/message",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup.html"}}}).state("app.user_message.tab_inbox",{url:"/inbox",views:{tab_inbox:{controller:"ESMessageInboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{auth:!0,minData:!0,large:"app.user_messages_lg_inbox"}}).state("app.user_message.tab_outbox",{url:"/outbox",views:{tab_outbox:{controller:"ESMessageOutboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{auth:!0,minData:!0,large:"app.user_messages_lg_outbox"}}).state("app.user_messages_lg_inbox",{url:"/user/message/lg/inbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageInboxListCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_messages_by_id",{url:"/wallets/:id/message",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_by_id.html"}}}).state("app.user_messages_by_id.tab_inbox",{url:"/inbox",views:{tab_inbox:{controller:"ESMessageInboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{large:"app.user_messages_lg_inbox_by_id"}}).state("app.user_messages_by_id.tab_outbox",{url:"/outbox",views:{tab_outbox:{controller:"ESMessageOutboxListCtrl",templateUrl:"plugins/es/templates/message/tabs/tab_list.html"}},data:{large:"app.user_messages_lg_outbox_by_id"}}).state("app.user_messages_lg_inbox_by_id",{url:"/wallets/:id/message/lg/inbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageInboxListCtrl"}}}).state("app.user_messages_lg_outbox",{url:"/user/message/lg/outbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageOutboxListCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_messages_lg_outbox_by_id",{url:"/wallets/:id/message/lg/outbox",views:{menuContent:{templateUrl:"plugins/es/templates/message/lookup_lg.html",controller:"ESMessageOutboxListCtrl"}}}).state("app.user_new_message",{cache:!1,url:"/user/message/new?pubkey&uid&title&content&isReply",views:{menuContent:{templateUrl:"plugins/es/templates/message/compose.html",controller:"ESMessageComposeCtrl"}}}).state("app.user_view_message",{cache:!1,url:"/user/message/view/:type/:messageId",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}},data:{auth:!0,minData:!0}}).state("app.user_view_message_by_id",{cache:!1,url:"/wallets/:id/message/view/:type/:messageId",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}}})}]).controller("ESMessageAbstractListCtrl",ESMessageAbstractListController).controller("ESMessageInboxListCtrl",ESMessageInboxListController).controller("ESMessageOutboxListCtrl",ESMessageOutboxListController).controller("ESMessageComposeCtrl",ESMessageComposeController).controller("ESMessageComposeModalCtrl",ESMessageComposeModalController).controller("ESMessageViewCtrl",ESMessageViewController).controller("PopoverMessageCtrl",PopoverMessageController),NotificationsController.$inject=["$scope","$ionicPopover","$state","$timeout","UIUtils","esHttp","csWallet","esNotification"],PopoverNotificationsController.$inject=["$scope","$timeout","$controller","$state","UIUtils","csWallet"],angular.module("cesium.es.notification.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.view_notifications",{url:"/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}},data:{login:!0}}).state("app.view_notifications_by_id",{url:"/wallets/:id/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}},data:{login:!0}})}]).controller("NotificationsCtrl",NotificationsController).controller("PopoverNotificationsCtrl",PopoverNotificationsController),ESBlockLookupController.$inject=["$scope","$controller","$ionicPopover","$location","UIUtils","esBlockchain"],angular.module("cesium.es.blockchain.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.lookup_blocks_currency",{url:"/currencies/:currency/blocks?q",views:{menuContent:{templateUrl:"plugins/es/templates/blockchain/lookup.html",controller:"ESBlockLookupCtrl"}}}).state("app.blockchain_search",{url:"/blockchain/search?q&type",views:{menuContent:{templateUrl:"plugins/es/templates/blockchain/lookup.html",controller:"ESBlockLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESBlockLookupCtrl",ESBlockLookupController),angular.module("cesium.es.network.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.network",{points:{buttons:{templateUrl:"plugins/es/templates/network/view_network_extend.html",controller:"ESExtensionCtrl"}}})}]),ESGroupListController.$inject=["$scope","UIUtils","$state","csWallet","esGroup","ModalUtils"],ESGroupViewController.$inject=["$scope","$state","$ionicPopover","$ionicHistory","$translate","UIUtils","csConfig","esGroup","csWallet"],ESGroupEditController.$inject=["$scope","esGroup","UIUtils","$state","$q","Device","$ionicHistory","ModalUtils","$focus","esHttp"],angular.module("cesium.es.group.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.groups",{url:"/group?type&location",views:{menuContent:{templateUrl:"plugins/es/templates/group/lookup.html",controller:"ESGroupListCtrl"}}}).state("app.add_group",{url:"/group/add/:type",views:{menuContent:{templateUrl:"plugins/es/templates/group/edit_group.html",controller:"ESGroupEditCtrl"}}}).state("app.edit_group",{url:"/group/edit/:id",views:{menuContent:{templateUrl:"plugins/es/templates/group/edit_group.html",controller:"ESGroupEditCtrl"}}}).state("app.view_group",{url:"/group/view/:id",views:{menuContent:{templateUrl:"plugins/es/templates/group/view_record.html",controller:"ESGroupViewCtrl"}}})}]).controller("ESGroupListCtrl",ESGroupListController).controller("ESGroupViewCtrl",ESGroupViewController).controller("ESGroupEditCtrl",ESGroupEditController),InvitationsController.$inject=["$scope","$q","$ionicPopover","$state","$timeout","UIUtils","csWallet","esHttp","esModals","esNotification","esInvitation"],PopoverInvitationController.$inject=["$scope","$controller","csWallet"],NewInvitationModalController.$inject=["$scope","$q","Modals","UIUtils","csWallet","esHttp","esWallet","esInvitation","parameters"],angular.module("cesium.es.invitation.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.view_invitations",{url:"/invitations?id",views:{menuContent:{templateUrl:"plugins/es/templates/invitation/view_invitations.html",controller:"InvitationsCtrl"}},data:{auth:!0}}).state("app.view_invitations_by_id",{url:"/wallets/:id/invitations",views:{menuContent:{templateUrl:"plugins/es/templates/invitation/view_invitations.html",controller:"InvitationsCtrl"}},data:{login:!0}})}]).controller("InvitationsCtrl",InvitationsController).controller("PopoverInvitationCtrl",PopoverInvitationController).controller("ESNewInvitationModalCtrl",NewInvitationModalController),ViewSubscriptionsController.$inject=["$scope","$q","$ionicHistory","csWot","csWallet","UIUtils","ModalUtils","esSubscription"],ModalEmailSubscriptionsController.$inject=["$scope","Modals","csSettings","esHttp","csWot","parameters"],angular.module("cesium.es.subscription.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_subscriptions",{cache:!1,url:"/wallet/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{auth:!0,minData:!0}}).state("app.edit_subscriptions_by_id",{cache:!1,url:"/wallets/:id/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{login:!0,minData:!0}})}]).controller("ViewSubscriptionsCtrl",ViewSubscriptionsController).controller("ModalEmailSubscriptionsCtrl",ModalEmailSubscriptionsController),ESDocumentLookupController.$inject=["$scope","$ionicPopover","$location","$timeout","csSettings","csWallet","UIUtils","esHttp","esDocument"],angular.module("cesium.es.document.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.document_search",{url:"/data/search/:index/:type?q",views:{menuContent:{templateUrl:"plugins/es/templates/document/lookup.html",controller:"ESDocumentLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESDocumentLookupCtrl",ESDocumentLookupController),angular.module("cesium.graph.plugin",["cesium.graph.services","cesium.graph.common.controllers","cesium.graph.blockchain.controllers","cesium.graph.network.controllers","cesium.graph.currency.controllers","cesium.graph.account.controllers","cesium.graph.docstats.controllers","cesium.graph.synchro.controllers"]),angular.module("cesium.graph.services",["cesium.graph.color.services","cesium.graph.data.services"]),angular.module("cesium.graph.data.services",["cesium.wot.services","cesium.es.http.services","cesium.es.wot.services"]).factory("gpData",["$rootScope","$q","$timeout","esHttp","BMA","csWot","csCache","esWot",function(e,t,n,i,a,o,r,s){"ngInject";function l(e,t){return t<=0?e:e*Math.pow(10,t)}function c(e){return e=e||{},e.maxRangeSize=e.maxRangeSize||30,e.defaultTotalRangeCount=e.defaultTotalRangeCount||2*e.maxRangeSize,e.rangeDuration=e.rangeDuration||"day",e.endTime=e.endTime||moment().utc().add(1,e.rangeDuration).unix(),e.startTime=e.startTime||moment.unix(e.endTime).utc().subtract(e.defaultTotalRangeCount,e.rangeDuration).unix(),e.firstBlockTime&&e.startTime<e.firstBlockTime&&(e.startTime=e.firstBlockTime),e}var u=r.get("gpData-currency-",r.constants.SHORT),d={node:{},wot:{},blockchain:{},docstat:{},synchro:{execution:{}},raw:{block:{search:i.post("/:currency/block/_search")},blockstat:{search:i.post("/:currency/blockstat/_search")},movement:{search:i.post("/:currency/movement/_search")},user:{event:i.post("/user/event/_search?pretty")},docstat:{search:i.post("/docstat/record/_search")},synchro:{search:i.post("/:currency/synchro/_search")}},regex:{}};return d.blockchain.countByIssuer=function(e){var t={size:0,aggs:{blocksByIssuer:{terms:{field:"issuer",size:0}}}};return d.raw.block.search(t,{currency:e}).then(function(e){var t=e.aggregations;if(t.blocksByIssuer&&t.blocksByIssuer.buckets&&t.blocksByIssuer.buckets.length){var n={blockCount:e.hits.total};return n.data=(t.blocksByIssuer.buckets||[]).reduce(function(e,t){return e.concat(t.doc_count)},[]),n.issuers=(t.blocksByIssuer.buckets||[]).reduce(function(e,t){return e.concat({pubkey:t.key})},[]),o.extendAll(n.issuers).then(function(){return n.labels=n.issuers.reduce(function(e,t){return e.concat(t.name||t.uid||t.pubkey.substr(0,8))},[]),n})}})},d.blockchain.withDividend=function(e,n){n=n||{};var i=!angular.isDefined(n.withCache)||n.withCache,o=[e,JSON.stringify(n)].join("-");if(i){var r=u.get(o);if(r){if(!r.blocks){var s=t.defer();return r.then(function(e){return s.resolve(e),e}),s.promise}return console.debug("[graph] monetaryMass for ["+e+"] found in cache"),t.when(r)}}var c={query:{filtered:{filter:{bool:{must:[{exists:{field:"dividend"}}]}}}},size:n.size||1e4,from:n.from||0,_source:["medianTime","number","dividend","monetaryMass","membersCount","unitbase"],sort:{medianTime:"asc"}},p=t.all([n.withCurrent?a.blockchain.current().catch(function(e){if(!e||e.ucode!=a.errorCodes.NO_CURRENT_BLOCK)throw e}):t.when(),d.raw.block.search(c,{currency:e})]).then(function(e){var t=e[0];if(e=e[1],e.hits.total&&e.hits.hits.length){var n={};if(n.blocks=e.hits.hits.reduce(function(e,t){var n=t._source;return n.dividend=l(n.dividend,n.unitbase),delete n.unitbase,e.concat(n)},[]),t){var i=n.blocks.length&&t.medianTime-n.blocks[n.blocks.length-1].medianTime;i&&i>=3600&&(t.dividend=l(t.dividend,t.unitbase),delete t.unitbase,n.blocks.push(t))}return n.times=n.blocks.reduce(function(e,t){return e.concat(t.medianTime)},[]),u.put(o,n),n}});return u.put(o,p),p},d.blockchain.txCount=function(e,n){n=c(n);for(var i=[],a=moment.unix(n.startTime).utc().startOf(n.rangeDuration),o=moment.unix(n.endTime).utc().startOf(n.rangeDuration),r=[];a.isBefore(o);){r.push({from:a.unix(),to:a.add(1,n.rangeDuration).unix()});if(r.length===n.maxRangeSize||!a.isBefore(o)){var s={size:0,aggs:{tx:{range:{field:"medianTime",ranges:r},aggs:{txCount:{stats:{field:"txCount"}},txAmount:{stats:{field:"txAmount"}}}}}};n.issuer&&(s.query={bool:{filter:{term:{issuer:n.issuer}}}}),r=[],10==i.length?(console.error("Too many parallel jobs!"),a=moment.unix(n.endTime).utc()):i.push(d.raw.blockstat.search(s,{currency:e}).then(function(e){var t=e.aggregations;if(t.tx&&t.tx.buckets&&t.tx.buckets.length)return(t.tx.buckets||[]).reduce(function(e,t){return e.concat({from:t.from,to:t.to,count:t.txCount.sum||0,amount:t.txAmount.sum||0,avgByBlock:Math.round(100*t.txCount.avg)/100,maxByBlock:t.txCount.max})},[])}))}}return t.all(i).then(function(e){return e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e=_.sortBy(e,"from"),{count:_.pluck(e,"count"),avgByBlock:_.pluck(e,"avgByBlock"),maxByBlock:_.pluck(e,"maxByBlock"),amount:e.reduce(function(e,t){return e.concat(t.amount/100)},[]),times:_.pluck(e,"from")}})},d.node.blockCount=function(e,t){var n={size:0,query:{bool:{filter:{term:{issuer:t}}}}};return d.raw.block.search(n,{currency:e}).then(function(e){return e.hits.total})},d.raw.movement.getByRange=function(e,t,n){if(!t)throw new Error("Missing 'pubkey' argument!");var i={size:0,query:{bool:{should:[{term:{recipient:t}},{term:{issuer:t}}]}},aggs:{tx:{range:{field:"medianTime",ranges:n},aggs:{received:{filter:{term:{recipient:t}},aggs:{received_stats:{stats:{field:"amount"}}}},sent:{filter:{term:{issuer:t}},aggs:{sent_stats:{stats:{field:"amount"}}}}}}}};return d.raw.movement.search(i,{currency:e}).then(function(e){var t=e.aggregations;if(t.tx&&t.tx.buckets&&t.tx.buckets.length)return(t.tx.buckets||[]).reduce(function(e,t){var n=t.sent.sent_stats,i=t.received.received_stats;return e.concat({from:t.from,to:t.to,sent:n.sum?-n.sum/100:0,received:i.sum?i.sum/100:0})},[])})},d.raw.movement.getUds=function(e,t,n){var i={size:0,query:{bool:{should:[{exists:{field:"dividend"}}]}},aggs:{ud:{range:{field:"medianTime",ranges:t},aggs:{ud_stats:{stats:{field:"dividend"}},unitbase_stats:{stats:{field:"unitbase"}}}}}};return d.raw.block.search(i,{currency:e}).then(function(e){var t=e.aggregations;if(t.ud&&t.ud.buckets&&t.ud.buckets.length)return(t.ud.buckets||[]).reduce(function(e,t){return e[n[t.from]]=l(t.ud_stats.sum,t.unitbase_stats.min)/100,e},{})})},d.blockchain.movement=function(e,n){function i(e){if(l.push(e),E&&E.joinTime<e.to){var t={from:Math.max(E.joinTime,e.from),to:Math.min(E.leaveTime,e.to)};for(u.push(t),p[t.from]=e.from;E&&E.leaveTime&&E.leaveTime<e.to;)E=m.pop()}}n=c(n),n.withUD=!angular.isDefined(n.withUD)||n.withUD;var a=[];if(n.withUD&&!n.memberships)return s.memberships(n.pubkey).then(function(t){return n.memberships=t||[],d.blockchain.movement(e,n)});var o=moment.unix(n.startTime).utc().startOf(n.rangeDuration),r=moment.unix(n.endTime).utc().startOf(n.rangeDuration),l=[],u=[],p={},m=angular.copy(n.memberships).reverse(),E=m.pop();for(i({from:0,to:o.unix()});o.isBefore(r);){i({from:o.unix(),to:o.add(1,n.rangeDuration).unix()});(!a.length&&l.length==n.maxRangeSize+1||a.length&&l.length==n.maxRangeSize||!o.isBefore(r))&&(u.length?a.push(t.all([d.raw.movement.getUds(e,u,p),d.raw.movement.getByRange(e,n.pubkey,l)]).then(function(e){var t=e[0];return e=e[1],e.forEach(function(e){e.ud=t[e.from]||0}),e})):a.push(d.raw.movement.getByRange(e,n.pubkey,l).then(function(e){return e.forEach(function(e){e.ud=0}),e})),l=[])}return t.all(a).then(function(e){if(e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e.length){e=_.sortBy(e,"from");var t=e.splice(0,1)[0],n=t.received+t.sent+t.ud;return{
+times:_.pluck(e,"from"),ud:_.pluck(e,"ud"),sent:_.pluck(e,"sent"),received:_.pluck(e,"received"),balance:e.reduce(function(e,t){return n+=t.received+t.sent+t.ud,e.concat(n)},[])}}})},d.wot.certifications=function(e){return e=c(e),o.load(e.pubkey).then(function(t){if(t){var n={};_.forEach(t.given_cert||[],function(t){var i=moment.unix(t.time).utc().startOf(e.rangeDuration).unix();n[i]=n[i]||{time:i,given:0,received:0},n[i].given++}),_.forEach(t.received_cert||[],function(t){var i=moment.unix(t.time).utc().startOf(e.rangeDuration).unix();n[i]=n[i]||{time:i,given:0,received:0},n[i].received++}),n=_.sortBy(_.values(n),"time");var i={times:_.pluck(n,"time"),deltaGiven:_.pluck(n,"given"),deltaReceived:_.pluck(n,"received")},a=0;return i.given=i.deltaGiven.reduce(function(e,t){return a+=t,e.concat(a)},[]),a=0,i.received=i.deltaReceived.reduce(function(e,t){return a+=t,e.concat(a)},[]),i}})},d.wot.memberships=function(e){e=e||{};var t={size:1e3,query:{bool:{filter:[{term:{recipient:e.pubkey}},{terms:{code:["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"]}}]}},sort:[{time:{order:"asc"}}],_source:["code","time"]};return d.raw.user.event(t).then(function(e){if(e.hits&&e.hits.total){var t,n=e.hits.hits.reduce(function(e,n){var i="MEMBER_JOIN"==n._source.code||"MEMBER_ACTIVE"==n._source.code;return i&&!t?t=n._source.time:!i&&t&&(e=e.concat({joinTime:t,leaveTime:n._source.time}),t=0),e},[]);return t&&n.push({joinTime:t,leaveTime:moment().utc().unix()}),n}})},d.docstat.get=function(e){e=c(e);for(var n=[],i=moment.unix(e.startTime).utc().startOf(e.rangeDuration),a=moment.unix(e.endTime).utc().startOf(e.rangeDuration),o=[];i.isBefore(a);){o.push({from:i.unix(),to:i.add(1,e.rangeDuration).unix()});if(o.length===e.maxRangeSize||!i.isBefore(a)){var r={size:0,aggs:{range:{range:{field:"time",ranges:o},aggs:{index:{terms:{field:"index",size:0},aggs:{type:{terms:{field:"indexType",size:0},aggs:{max:{max:{field:"count"}}}}}}}}}};o=[];var s={};10==n.length?(console.error("Too many parallel jobs!"),i=moment.unix(e.endTime).utc()):n.push(d.raw.docstat.search(r).then(function(e){var t=e.aggregations;return(t.range&&t.range.buckets||[]).reduce(function(e,t){var n={from:t.from,to:t.to};return _.forEach(t.index&&t.index.buckets||[],function(e){var t=e.key;_.forEach(e.type&&e.type.buckets||[],function(e){var i=t+"_"+e.key;n[i]=e.max.value,s[i]||(s[i]=!0)})}),e.concat(n)},[])}))}}return t.all(n).then(function(e){return e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e=_.sortBy(e,"from"),_.keys(s).reduce(function(t,n){return t[n]=_.pluck(e,n),t},{times:_.pluck(e,"from")})})},d.synchro.execution.get=function(e){e=c(e);for(var n=[],i=moment.unix(e.startTime).utc().startOf(e.rangeDuration),a=moment.unix(e.endTime).utc().startOf(e.rangeDuration),o=[];i.isBefore(a);){o.push({from:i.unix(),to:i.add(1,e.rangeDuration).unix()});if(o.length===e.maxRangeSize||!i.isBefore(a)){var r={size:0,aggs:{range:{range:{field:"time",ranges:o},aggs:{api:{terms:{field:"api",size:0},aggs:{peer_count:{cardinality:{field:"peer"}}}},duration:{sum:{field:"executionTime"}},result:{nested:{path:"result"},aggs:{inserts:{sum:{field:"result.inserts"}},updates:{sum:{field:"result.updates"}},deletes:{sum:{field:"result.deletes"}}}}}}}};o=[];var s={};10==n.length?(console.error("Too many parallel jobs!"),i=moment.unix(e.endTime).utc()):n.push(d.raw.synchro.search(r,{currency:e.currency}).then(function(e){var t=e.aggregations;return(t.range&&t.range.buckets||[]).reduce(function(e,t){var n={from:t.from,to:t.to,inserts:t.result.inserts.value,updates:t.result.inserts.value,deletes:t.result.deletes.value,duration:t.duration.value};return _.forEach(t.api&&t.api.buckets||[],function(e){n[e.key]=e.peer_count&&e.peer_count.value||0,s[e.key]||(s[e.key]=!0)}),e.concat(n)},[])}))}}return t.all(n).then(function(e){e=e.reduce(function(e,t){return t&&t.length?e.concat(t):e},[]),e=_.sortBy(e,"from");var t={times:_.pluck(e,"from"),inserts:_.pluck(e,"inserts"),updates:_.pluck(e,"updates"),deletes:_.pluck(e,"deletes"),duration:_.pluck(e,"duration")};return _.keys(s).forEach(function(n){t[n]=_.pluck(e,n)}),t})},d}]),angular.module("cesium.graph.color.services",[]).factory("gpColor",function(){"ngInject";var e={css2Rgb:{white:[255,255,255],assertive:[239,71,58],calm:[17,193,243],positive:[56,126,245],balanced:[51,205,95],energized:[255,201,0],royal:[136,106,234],gray:[150,150,150],stable:[248,248,248]}},t={scale:{}};return t.scale.custom=function(e,t,n,i){function a(e){switch(e){case 0:return 0;case 1:return-1;case 2:return 0;case 3:return 1}}t=t>0&&t||.55;for(var o=Math.round(e/2.5),r=n&&3==n.length?angular.copy(n):[255,0,0],s=i&&3==i.length?angular.copy(i):[0,2,3],l=n?[Math.round(255/o),Math.round(255/o),Math.round(255/o)]:[Math.round((r[0]-50)/o),Math.round((255-r[1])/o),Math.round((255-r[2])/o)],c=[a(s[0]),a(s[1]),a(s[2])],u=[0,0,0],d=[],p=0;p<e;p++){for(var m=0;m<3;m++)r[m]+=c[m]*l[m],u[m]++,((r[m]<=0||r[m]>=255)&&0!==c[m]||0===c[m]&&u[m]==o)&&(r[m]<=0?r[m]=0:r[m]>=255&&(r[m]=255),s[m]=(s[m]+1)%4,c[m]=a(s[m]),u[m]=0);d.push("rgba("+r[0]+","+r[1]+","+r[2]+","+t+")")}return d},t.scale.default=function(){return t.scale.custom(25)},t.scale.fix=function(e,n){return Array.apply(null,Array(e||25)).map(String.prototype.valueOf,n||t.rgba.calm(.5))},t.rgba=_.mapObject(e.css2Rgb,function(e){var t="rgba("+e.join(",")+",";return function(n){return!n||n<0?"rgb("+e.join(",")+")":t+n+")"}}),t.rgba.translucent=function(){return"rgb(0,0,0,0)"},t.constants=e,t}),GpCurrencyAbstractController.$inject=["$scope","$filter","$ionicPopover","$ionicHistory","$state","csSettings","csCurrency","esHttp","UIUtils"],angular.module("cesium.graph.common.controllers",["cesium.services"]).controller("GpCurrencyAbstractCtrl",GpCurrencyAbstractController),GpBlockchainTxCountController.$inject=["$scope","$controller","$q","$state","$filter","$translate","gpData","gpColor"],GpBlockchainIssuersController.$inject=["$scope","$controller","$q","$state","$translate","gpColor","gpData"],angular.module("cesium.graph.blockchain.controllers",["chart.js","cesium.services","cesium.graph.services"]).config(["$stateProvider",function(e){"ngInject";e.state("app.blockchain_stats",{url:"/blockchain/stats?currency&stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/blockchain/view_stats.html"}}}).state("app.currency_blockchain_stats",{url:"/:currency/blockchain/stats",views:{menuContent:{templateUrl:"plugins/graph/templates/blockchain/view_stats.html"}}})}]).controller("GpBlockchainTxCountCtrl",GpBlockchainTxCountController).controller("GpBlockchainIssuersCtrl",GpBlockchainIssuersController),GpNetworkViewExtendController.$inject=["$scope","PluginService","esSettings"],GpPeerViewExtendController.$inject=["$scope","$timeout","PluginService","esSettings","csCurrency","gpData"],angular.module("cesium.graph.network.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.network",{points:{buttons:{templateUrl:"plugins/graph/templates/network/view_network_extend.html",controller:"GpNetworkViewExtendCtrl"}}}).extendState("app.view_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_peer_extend.html",controller:"GpPeerViewExtendCtrl"}}}),e.state("app.view_peer_stats",{url:"/network/peer/:pubkey/stats",views:{menuContent:{templateUrl:"plugins/graph/templates/network/view_peer_stats.html",controller:"GpBlockchainTxCountCtrl"}}}))}]).controller("GpNetworkViewExtendCtrl",GpNetworkViewExtendController).controller("GpPeerViewExtendCtrl",GpPeerViewExtendController),GpCurrencyViewExtendController.$inject=["$scope","PluginService","UIUtils","esSettings"],GpCurrencyMonetaryMassController.$inject=["$scope","$controller","$q","$state","$translate","UIUtils","gpColor","gpData","$filter","csSettings"],GpCurrencyDUController.$inject=["$scope","$q","$controller","$translate","gpColor","gpData","$filter","UIUtils"],GpCurrencyMembersCountController.$inject=["$scope","$controller","$q","$state","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.currency.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";e.state("app.currency.tab_parameters_stats",{url:"/parameters/stats",views:{"tab-parameters":{templateUrl:"plugins/graph/templates/currency/tabs/tab_parameters_stats.html"}}}).state("app.currency.tab_wot_stats",{url:"/community/stats",views:{"tab-wot":{templateUrl:"plugins/graph/templates/currency/tabs/tab_wot_stats.html",controller:"GpCurrencyMembersCountCtrl"}}}).state("app.currency.tab_network_stats",{url:"/network/stats",views:{"tab-network":{templateUrl:"plugins/graph/templates/currency/tabs/tab_network_stats.html"}}}).state("app.currency.tab_blocks_stats",{url:"/blocks/stats",views:{"tab-blocks":{templateUrl:"plugins/graph/templates/currency/tabs/tab_blocks_stats.html"}}}).state("app.currency_stats_lg",{url:"/currency/stats/lg?hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/currency/view_stats_lg.html"}}}),n.plugins&&n.plugins.es&&t.extendStates(["app.currency_name","app.currency","app.currency_name_lg","app.currency_lg"],{points:{"parameters-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"},"wot-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"},"network-actual":{templateUrl:"plugins/graph/templates/currency/view_currency_extend.html",controller:"GpCurrencyViewExtendCtrl"}}}).extendStates(["app.currency.tab_blocks"],{points:{buttons:{templateUrl:"plugins/graph/templates/currency/tab_blocks_extend.html",controller:"GpCurrencyViewExtendCtrl"}}})}]).controller("GpCurrencyViewExtendCtrl",GpCurrencyViewExtendController).controller("GpCurrencyMonetaryMassCtrl",GpCurrencyMonetaryMassController).controller("GpCurrencyDUCtrl",GpCurrencyDUController).controller("GpCurrencyMembersCountCtrl",GpCurrencyMembersCountController),GpExtendController.$inject=["$scope","PluginService","esSettings","$state","csWallet"],GpAccountBalanceController.$inject=["$scope","$controller","$q","$state","$filter","$translate","csWot","gpData","gpColor","csWallet"],GpAccountSumTxController.$inject=["$scope","$controller","$filter","$state","csTx","gpColor"],GpAccountCertificationController.$inject=["$scope","$controller","$q","$state","$filter","$translate","gpData","gpColor","csWallet"],angular.module("cesium.graph.account.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.view_wallet_tx",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_wallet_tx_extend.html",controller:"GpExtendCtrl"}}}).extendState("app.view_wallet_tx_by_id",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_wallet_tx_extend.html",controller:"GpExtendCtrl"}}}).extendState("app.wot_identity",{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_identity_extend.html",controller:"GpExtendCtrl"}}}).extendStates(["app.wot_identity_tx_uid","app.wot_identity_tx_uid_lg"],{points:{buttons:{templateUrl:"plugins/graph/templates/account/view_identity_tx_extend.html",controller:"GpExtendCtrl"}}}),e.state("app.view_wallet_stats",{url:"/wallet/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}},data:{auth:!0}}).state("app.view_wallet_stats_by_id",{url:"/wallets/:id/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}},data:{auth:!0}}).state("app.wot_identity_stats",{url:"/wot/:pubkey/stats?t&stepUnit&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/account/view_stats.html"}}}))}]).controller("GpExtendCtrl",GpExtendController).controller("GpAccountBalanceCtrl",GpAccountBalanceController).controller("GpAccountSumTxCtrl",GpAccountSumTxController).controller("GpAccountCertificationCtrl",GpAccountCertificationController),GpDocStatsController.$inject=["$scope","$state","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.docstats.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";e.state("app.doc_stats_lg",{url:"/data/stats?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}});n.plugins&&n.plugins.es}]).controller("GpDocStatsCtrl",GpDocStatsController),GpSynchroController.$inject=["$scope","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.synchro.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";e.state("app.doc_synchro_lg",{url:"/data/synchro?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}});n.plugins&&n.plugins.es}]).controller("GpSynchroCtrl",GpSynchroController),angular.module("cesium.map.plugin",["ui-leaflet","cesium.map.services","cesium.map.wot.controllers","cesium.map.registry.controllers","cesium.map.network.controllers","cesium.map.user.controllers","cesium.map.settings.controllers","cesium.map.help.controllers"]).config(function(){"ngInject";L.AwesomeMarkers.Icon.prototype.options.prefix="ion"}),angular.module("cesium.map.services",["cesium.map.wot.services","cesium.map.registry.services","cesium.map.utils.services"]),angular.module("cesium.map.wot.services",["cesium.services"]).factory("mapWot",["$q","csHttp","esHttp","esSettings","csWot","BMA","esGeo",function(e,t,n,i,a,o,r){"ngInject";function s(e){e=e||{};var t={bool:{}};if(e.searchAddress?t.bool.should=[{exists:{field:"geoPoint"}},{exists:{field:"city"}}]:t.bool.must=[{exists:{field:"geoPoint"}}],e.bounds&&e.bounds.northEast&&e.bounds.southWest){var n={geoPoint:{top_left:{lat:Math.max(Math.min(e.bounds.northEast.lat,90),-90),lon:Math.max(Math.min(e.bounds.southWest.lng,180),-180)},bottom_right:{lat:Math.max(Math.min(e.bounds.southWest.lat,90),-90),lon:Math.max(Math.min(e.bounds.northEast.lng,180),-180)}}};console.debug("[map] [wot] Filtering on bounds: ",e.bounds),t.bool.must=t.bool.must||[],t.bool.must.push({geo_bounding_box:n})}return t}function l(t){t=t||{},t.from=t.from||0,t.size=t.size||d.DEFAULT_LOAD_SIZE,t.searchAddress=r.google.isEnable()&&(!angular.isDefined(t.searchAddress)||t.searchAddress),t.fields=t.fields||{},t.fields.description=!!angular.isDefined(t.fields.description)&&t.fields.description;var n={query:s(t),from:0,size:t.size,_source:t.fields.description?p.profile.concat("description"):p.profile},i=u.raw.profile.search;return e.all([i(n),o.wot.member.uids(),o.wot.member.pending().then(function(e){return e.memberships&&e.memberships.length?e.memberships:[]})]).then(function(a){var o=a[1],r=a[2],a=a[0];if(!a.hits||!a.hits.total)return[];r=r.reduce(function(e,t){if("IN"==t.membership&&!o[t.pubkey]){var n={uid:t.uid,pubkey:t.pubkey,block:t.blockNumber,blockHash:t.blockHash,pending:!0},i=e[t.pubkey];if(i&&n.block>i.block)return e;e[n.pubkey]=n}return e},{});var s=[c(t,o,r,a)];for(n.from+=n.size;n.from<a.hits.total;)s.push(i(angular.copy(n)).then(function(e){return e.hits&&e.hits.hits.length?c(t,o,r,e):[]})),n.from+=n.size;return e.all(s).then(function(e){return e.reduce(function(e,t){return e.concat(t)},[])})})}function c(t,i,a,o){var s=new RegExp("[,]"),l=[],c=o.hits.hits.reduce(function(e,o){var r=o._id,c=i[r],u=c&&{uid:c}||a[r]||{};if(u.pubkey=r,u.index=o._index,u.city=o._source.city,u.address=o._source.address,u.geoPoint=o._source.geoPoint,u.geoPoint&&u.geoPoint.lat&&u.geoPoint.lon)u.geoPoint.lat&&"string"==typeof u.geoPoint.lat&&(u.geoPoint.lat=parseFloat(u.geoPoint.lat.replace(s,"."))),u.geoPoint.lon&&"string"==typeof u.geoPoint.lon&&(u.geoPoint.lon=parseFloat(u.geoPoint.lon.replace(s,".")));else{if(!t.searchAddress||!u.city)return e;u.searchAddress=u.city&&(o._source.address?o._source.address+", ":"")+u.city,l.push(u)}return u.avatar=n.image.fromHit(o,"avatar"),u.name=o._source.title,u.name&&u.name.length>30&&(u.name=u.name.substr(0,27)+"..."),u.description=o._source.description&&n.util.parseAsHtml(o._source.description),u.geoPoint?e.concat(u):e},[]);if(l.length){var u=Date.now();console.debug("[map] [wot] Search positions of {0} addresses...".format(l.length));var d=0;return e.all(l.reduce(function(e,t){return t.city?e.concat(r.google.searchByAddress(t.searchAddress).then(function(e){e&&e.length&&(t.geoPoint=e[0],t.city==t.searchAddress&&(t.geoPoint.lon+=Math.random()/1e3,t.geoPoint.lat+=Math.random()/1e3),delete t.searchAddress,c.push(t),d++)}).catch(function(){})):e},[])).then(function(){return console.debug("[map] [wot] Resolved {0}/{1} addresses in {2}ms".format(d,l.length,Date.now()-u)),c})}return e.when(c)}var u=this,d={DEFAULT_LOAD_SIZE:1e3},p={min:["title","geoPoint"],profile:["title","geoPoint","avatar._content_type","address","city"]};return u.raw={profile:{search:n.post("/user/profile/_search"),mixedSearch:n.post("/user,page,group/profile,record/_search")}},{load:l}}]),angular.module("cesium.map.registry.services",["cesium.services"]).factory("mapRegistry",["$q","csHttp","esHttp","esSettings","csWot","BMA","esGeo",function(e,t,n,i,a,o,r){"ngInject";function s(e){e=e||{};var t={bool:{}};return e.searchAddress?t.bool.should=[{exists:{field:"geoPoint"}},{exists:{field:"city"}}]:t.bool.must=[{exists:{field:"geoPoint"}}],e.bounds&&e.bounds.northEast&&e.bounds.southWest&&(t.bool.should=t.bool.should||{},t.bool.should.geo_bounding_box={geoPoint:{top_left:{lat:Math.max(Math.min(e.bounds.northEast.lat,90),-90),lon:Math.max(Math.min(e.bounds.southWest.lng,180),-180)},bottom_right:{lat:Math.max(Math.min(e.bounds.southWest.lat,90),-90),lon:Math.max(Math.min(e.bounds.northEast.lng,180),-180)}}}),t}function l(t){t=t||{},t.from=t.from||0,t.size=t.size||d.DEFAULT_LOAD_SIZE,t.searchAddress=r.google.isEnable()&&(!angular.isDefined(t.searchAddress)||t.searchAddress),t.fields=t.fields||{},t.fields.description=!angular.isDefined(t.fields.description)||t.fields.description;var n={query:s(t),from:0,size:t.size,_source:t.fields.description?p.record.concat("description"):p.record},i=u.raw.profile.search;return i(n).then(function(a){if(!a.hits||!a.hits.total)return[];var o=[c(t,a)];for(n.from+=n.size;n.from<a.hits.total;)o.push(i(angular.copy(n)).then(function(e){return e.hits&&e.hits.hits.length?c(t,e):[]})),n.from+=n.size;return e.all(o).then(function(e){return e.reduce(function(e,t){return e.concat(t)},[])})})}function c(t,i){var a=new RegExp("[,]"),o=[],s=i.hits.hits.reduce(function(e,i){var r=i._source.issuer,s={};if(s.issuer=r,s.pubkey=i._source.pubkey||s.issuer,s.id=i._id,s.index=i._index,s.type=i._source.type,s.category=i._source.category,s.category&&delete s.category.parent,s.city=i._source.city,s.address=i._source.address,s.geoPoint=i._source.geoPoint,s.geoPoint&&s.geoPoint.lat&&s.geoPoint.lon)s.geoPoint.lat&&"string"==typeof s.geoPoint.lat&&(s.geoPoint.lat=parseFloat(s.geoPoint.lat.replace(a,"."))),s.geoPoint.lon&&"string"==typeof s.geoPoint.lon&&(s.geoPoint.lon=parseFloat(s.geoPoint.lon.replace(a,".")));else{if(!t.searchAddress||!s.city)return e;s.searchAddress=s.city&&(i._source.address?i._source.address+", ":"")+s.city,o.push(s)}return s.avatar=n.image.fromHit(i,"avatar"),s.name=i._source.title,s.name&&s.name.length>30&&(s.name=s.name.substr(0,27)+"..."),s.description=i._source.description&&n.util.parseAsHtml(i._source.description),s.geoPoint?e.concat(s):e},[]);if(o.length){var l=Date.now();console.debug("[map] [registry] Search positions of {0} addresses...".format(o.length));var c=0;return e.all(o.reduce(function(e,t){return t.city?e.concat(r.google.searchByAddress(t.searchAddress).then(function(e){e&&e.length&&(t.geoPoint=e[0],t.city==t.searchAddress&&(t.geoPoint.lon+=Math.random()/1e3,t.geoPoint.lat+=Math.random()/1e3),delete t.searchAddress,s.push(t),c++)}).catch(function(){})):e},[])).then(function(){return console.debug("[map] [registry] Resolved {0}/{1} addresses in {2}ms".format(c,o.length,Date.now()-l)),s})}return e.when(s)}var u=this,d={DEFAULT_LOAD_SIZE:1e3},p={record:["title","geoPoint","avatar._content_type","address","city","type","pubkey","issuer","category"]};return u.raw={profile:{search:n.post("/page/record/_search"),mixedSearch:n.post("/user,page,group/profile,record/_search")}},{load:l}}]),angular.module("cesium.map.utils.services",["cesium.services","ui-leaflet"]).factory("MapUtils",["$timeout","$q","$translate","$window","leafletData","csConfig","csSettings","esGeo","UIUtils","leafletHelpers",function(e,t,n,i,a,o,r,s,l,c){"ngInject";function u(e){e=angular.merge({center:angular.copy(I.DEFAULT_CENTER),cache:!1,defaults:{scrollWheelZoom:!0,tileLayerOptions:{attribution:'© <a target="_blank" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}},layers:{baselayers:{osm:{name:"OpenStreetMap",type:"xyz",url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",layerOptions:{subdomains:["a","b","c"],attribution:'&copy; <a target="_blank" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',continuousWorld:!0}},google:{name:"Google map",type:"xyz",url:"https://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key="+h,layerOptions:{subdomains:["mt0","mt1","mt2","mt3"],attribution:'&copy; <a target="_blank"  href="https://www.google.com/intl/fr_fr/help/terms_maps.html">Google</a>',continuousWorld:!0}}}},controls:{custom:[]}},e||{}),e.cache&&v.cache[e.cache]&&(console.debug("[map] Restoring map from cache :",v.cache[e.cache]),e=angular.merge(e,v.cache[e.cache]));var t;return e.layers.overlays&&(t=_.keys(e.layers.overlays).reduce(function(t,n){return t.concat(e.layers.overlays[n].name)},[]),n(t).then(function(t){_.keys(e.layers.overlays||{}).forEach(function(n){e.layers.overlays[n].name=t[e.layers.overlays[n].name]})})),e}function d(n,i){return E(i,n)?t.when():e(function(){n.invalidateSize(),n._resetView(i,i.zoom,!0)},300)}function p(e,t,n){if(n=n||{},!t||!n.layers||!e)throw"Illegal arguments";if(n.cache){if(n.layers.overlays){var o=_.keys(n.layers.overlays);v.cache[n.cache]||(v.cache[n.cache]={center:n.center,bounds:n.bounds,layers:angular.copy(n.layers)}),a.getMap(t).then(function(){_(i.document.querySelectorAll("#{0} .leaflet-control-layers-overlays input[type=checkbox]".format(t))).forEach(function(e,t){var i=o[t],a=n.layers.overlays[i].visible;e.addEventListener("change",function(e){a=!a,v.cache[n.cache].layers.overlays[i].visible=a})})})}e.$on("$ionicView.leave",function(){v.cache[n.cache].center=n.center,v.cache[n.cache].bounds=n.bounds})}}function m(e){if(e){var t;if(e.lat&&(t={},t.lat=parseFloat(e.lat)),(e.lng||e.lon)&&(t=t||{},t.lng=parseFloat(e.lng||e.lon)),e.zoom&&(t=t||{},t.zoom=parseFloat(e.zoom)),t)return c.isValidCenter(t)||(t=angular.merge({},I.DEFAULT_CENTER,t)),t}}function E(e,t){return c.isSameCenterOnMap(e,t)}function b(e){var t=I.DEFAULT_CENTER;return!(!e.lat||!e.lng||t.lat.toFixed(4)!==e.lat.toFixed(4)||t.lng.toFixed(4)!==e.lng.toFixed(4)||t.zoom!==e.zoom)}function g(e,t){if(!e||!t)throw"Illegal arguments";if(e._container)e._container.id=t;else{var n=e.onAdd;e.onAdd=function(e){var i=n.call(this,e);return i.id=t,i}}}function f(e){e=e||{},e.initial=!!angular.isDefined(e.initial)&&e.initial,e.marker=!!angular.isDefined(e.marker)&&e.marker,e.propertyName=angular.isDefined(e.propertyName)?e.propertyName:"title",e.position=angular.isDefined(e.position)?e.position:"topleft",e.zoom=angular.isDefined(e.zoom)?e.zoom:I.LOCALIZE_ZOOM,e.markerLocation=!angular.isDefined(e.markerLocation)||e.markerLocation;var t=n(["MAP.COMMON.SEARCH_DOTS","COMMON.SEARCH_NO_RESULT"]);return{addTo:function(n){t.then(function(t){var i=L.control.search(angular.merge(e,{textPlaceholder:t["MAP.COMMON.SEARCH_DOTS"],textErr:t["COMMON.SEARCH_NO_RESULT"]}));e.id&&g(i,e.id),i.addTo(n)})}}}function T(e){return e=e||{},L.easyButton({position:"topleft",type:"replace",leafletClasses:!0,states:[{stateName:"locate-me",onClick:function(e,t){s.point.current().then(function(e){t.setView({lat:e.lat,lng:e.lon},I.LOCALIZE_ZOOM)}).catch(function(e){console.error(e),l.alert.error("MAP.ERROR.LOCALIZE_ME_FAILED")})},title:e.title,icon:"icon ion-android-locate"}]})}var h=o.plugins&&o.plugins.es&&o.plugins.es.googleApiKey,I={locations:{FRANCE:{lat:46.5588603,lng:4.229736328124999,zoom:6}},LOCALIZE_ZOOM:15},v={cache:{}};return I.DEFAULT_CENTER=r.data&&r.data.plugins&&r.data.plugins.map&&r.data.plugins.map.center||I.locations.FRANCE,{map:u,updateCenter:d,center:{get:m,isSame:E,isDefault:b},control:{search:f,localizeMe:T,setId:g},cache:{bind:p},constants:I}}]),MapWotViewController.$inject=["$scope","$filter","$templateCache","$interpolate","$timeout","$location","$translate","$q","$controller","ionicReady","leafletData","UIUtils","csSettings","csWallet","MapUtils","mapWot"],angular.module("cesium.map.wot.controllers",["cesium.services","cesium.map.services","cesium.map.help.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.wot_lookup.tab_search",{points:{"nav-buttons":{template:'<button class="button button-icon button-clear" ui-sref="app.view_wot_map"><i class="icon ion-ios-location"></i></button>'}}}).extendState("app.wot_lookup_lg",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/wot/lookup_lg_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_wot_map",{url:"/wot/map?c&center",views:{menuContent:{templateUrl:"plugins/map/templates/wot/view_map.html",controller:"MapWotViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapWotViewCtrl",MapWotViewController),MapRegistryViewController.$inject=["$scope","$filter","$templateCache","$interpolate","$timeout","$location","$translate","$q","ionicReady","leafletData","UIUtils","csSettings","csWallet","MapUtils","mapRegistry"],angular.module("cesium.map.registry.controllers",["cesium.services","cesium.map.services","cesium.map.help.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.wot_lookup.tab_registry",{points:{"nav-buttons":{template:'<button class="button button-icon button-clear" ui-sref="app.view_registry_map"><i class="icon ion-ios-location"></i></button>'}}}).extendState("app.registry_lookup_lg",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/registry/lookup_lg_extend.html"}}}),e.state("app.view_registry_map",{url:"/wot/pagemap?c&center",views:{menuContent:{templateUrl:"plugins/map/templates/registry/view_map.html",controller:"MapRegistryViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapRegistryViewCtrl",MapRegistryViewController),angular.module("cesium.map.network.controllers",["cesium.services","cesium.map.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,t,n){"ngInject";n.plugins&&n.plugins.es&&(t.extendState("app.network",{points:{"filter-buttons":{templateUrl:"plugins/map/templates/network/lookup_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.view_network_map",{url:"/network/map?c",views:{menuContent:{templateUrl:"plugins/map/templates/network/view_map.html",controller:"MapNetworkViewCtrl"}},data:{silentLocationChange:!0}}))}]).controller("MapNetworkViewCtrl",["$scope","$controller","$q","$interpolate","$translate","$filter","$templateCache","$timeout","$location","esGeo","UIUtils","csNetwork","MapUtils","leafletData",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";angular.extend(this,t("NetworkLookupCtrl",{$scope:e}));var E,b,g=o("formatPubkey"),f={member:{type:"awesomeMarker",icon:"person",markerColor:"green",iconColor:"white"},mirror:{type:"awesomeMarker",icon:"radio-waves",markerColor:"green",iconColor:"white"},offline:{type:"awesomeMarker",icon:"ion-close-circled",markerColor:"red",iconColor:"white"}},T={},h=0;E='<div class="item item-peer item-icon-left no-border" ng-click="selectPeer(peer)">',E+=r.get("templates/network/item_content_peer.html"),E+="</div>",E=E.replace(/[:]rebind[:]|[:][:]/g,""),e.loading=!0,e.mapId="map-network-"+e.$id,e.helptipPrefix="helptip-"+e.mapId,e.map=p.map({cache:"map-network",layers:{overlays:{member:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.MEMBER",visible:!0},mirror:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.MIRROR",visible:!0},offline:{type:"featureGroup",name:"MAP.NETWORK.VIEW.LAYER.OFFLINE",visible:!1}}},bounds:{},loading:!0,markers:{}});var I=e.enter;e.enter=function(t,n){if(!e.loading)return e.updateLocationHref(),I(t,n);if(n.stateParams&&n.stateParams.c){var i=n.stateParams.c.split(":");e.map.center.lat=parseFloat(i[0]),e.map.center.lng=parseFloat(i[1]),e.map.center.zoom=parseInt(i[2])}e.$watch("map.center",function(){if(!e.map.loading)return s(function(){e.updateLocationHref()},300)},!0),e.loadMap().then(function(e){return e.fire("dataloading"),I(t,n)})},e.$on("$ionicView.enter",e.enter);var v=e.computeOptions;e.computeOptions=function(){var e=v();return e.filter.online="all",e},e.loadMap=function(){return m.getMap(e.mapId).then(function(t){if(!e.map.loading)return t;L.Control.loading({position:"topright",separate:!0}).addTo(t),b=L.layerGroup({visible:!1});var n=i(r.get("plugins/map/templates/network/item_search_tooltip.html"));p.control.search({layer:b,propertyName:"title",buildTip:function(e,t){return n(t.layer.options)},moveToLocation:function(e,t,n){this.options.zoom?this._map.setView(e,this.options.zoom):this._map.panTo(e);var i=e.layer&&e.layer.options&&e.layer.options.popupMarkerId;i&&s(function(){var e=_.find(n._layers,function(e){return e.options&&e.options.id===i});e&&e.openPopup()},400)},firstTipSubmit:!0,tooltipLimit:50}).addTo(t);var a=function(e){return e.options&&e.options.icon.options.markerColor},o=L.markerClusterGroup({disableClusteringAtZoom:p.constants.LOCALIZE_ZOOM,maxClusterRadius:65,showCoverageOnHover:!1,iconCreateFunction:function(e){var t=_.countBy(e.getAllChildMarkers(),a),n=t.green?"green":t.lightgreen?"lightgreen":t.lightgray?"lightgray":"red",i=e.getChildCount(),o="marker-cluster "+n+" marker-cluster-";return o+=i<10?"small":i<100?"medium":"large",L.divIcon({html:"<div><span>"+i+"</span></div>",className:o,iconSize:new L.Point(40,40)})}});return t.eachLayer(function(e){e.addLayer&&angular.extend(e,L.featureGroup.subGroup(o))}),c.point.ip.license&&(o.getAttribution=function(){return'<a target="_blank" href="{0}">{1}</a>'.format(c.point.ip.license.url,c.point.ip.license.name)}),o.addTo(t),e.map.loading=!1,t})},e.updateView=function(t){console.debug("[map] [peers] Updating UI"),e.search.loading=!e.networkStarted||d.isBusy();var n=angular.copy(T);_.forEach(t.peers||[],function(t){if(!t.isTor()){var i=T[t.id];if(i&&e.map.markers[i])return e.updateMarker(e.map.markers[i],t),void delete n[t.id];var a=t.bma,o=t.hasValid4(a)?a.ipv4:a.dns||a.ipv6;c.point.ip.search(o).then(function(n){i=""+h++;var o=e.updateMarker({position:n,getMessageScope:function(){var n=e.$new();return n.peer=t,n},draggable:!1,focus:!1,message:E,id:i},t);e.map.markers[i]=o,T[t.id]=i;var r,s=t.dns||t.server,l=s+(t.uid?" | "+(t.name||t.uid):"")+" | "+g(t.pubkey);a.ipv4&&!(t.dns||t.server).startsWith(a.ipv4)&&(r=a.ipv4,l+=" | "+a.ipv4),b.addLayer(new L.Marker({lat:n.lat,lng:n.lng},{opacity:0,icon:L.divIcon({className:"ng-hide",iconSize:L.point(0,0)}),title:l,peer:angular.extend({ipv4:r},t),popupMarkerId:i}))}).catch(function(e){console.debug("No position found for address ["+o+"]",e)})}}),_.forEach(_.keys(n),function(e){delete T[e]}),_.forEach(_.values(n),function(t){delete e.map.markers[t]}),
+e.search.loading||m.getMap(e.mapId).then(function(t){e.loading=!1,t.fire("dataload")})},e.updateMarker=function(e,t){return e.layer=t.online?t.uid?"member":"mirror":"offline",e.icon=angular.copy(f[e.layer]),e.opacity=(t.online,1),e.title=t.dns||t.server,t.online&&!t.hasMainConsensusBlock&&(e.icon.markerColor=t.hasConsensusBlock?"lightgreen":"lightgray",e.opacity=t.hasConsensusBlock?.9:.8),e.lng||(e.lng=e.position.lng+Math.random()/1e3,e.lat=e.position.lat+Math.random()/1e3),e},e.updateLocationHref=function(t){(l.search()||{}).c&&p.center.isDefault(e.map.center)||(t=t||"{0}:{1}:{2}".format(e.map.center.lat.toFixed(4),e.map.center.lng.toFixed(4),e.map.center.zoom),l.search({c:t}).replace())},e.$on("centerUrlHash",function(t,n){if(!e.loading)return s(function(){e.updateLocationHref(n)},300)}),e.showHelpTip=function(){}}]),angular.module("cesium.map.user.controllers",["cesium.services","cesium.map.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.edit_profile",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}}).extendState("app.edit_profile_by_id",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}})}]).controller("MapEditProfileViewCtrl",["$scope","$timeout","$q","MapUtils","$translate",function(e,t,n,i,a){"ngInject";var o=[];e.mapId="map-user-profile-"+e.$id,e.map=i.map({markers:{},center:{zoom:13}}),e.loading=!0,e.mapId="map-profile-"+e.$id,e.enter=function(n,i){return e.formData&&(e.formData.title||e.formData.geoPoint)?(e.loading=!0,e.load()):t(e.enter,500)},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.load=function(){return e.formData.geoPoint&&e.formData.geoPoint.lat&&e.formData.geoPoint.lon?e.map.markers.geoPoint?(e.map.markers.geoPoint.lat=e.formData.geoPoint.lat,void(e.map.markers.geoPoint.lng=e.formData.geoPoint.lon)):a("MAP.PROFILE.MARKER_HELP").then(function(t){e.map.markers.geoPoint={message:t,lat:parseFloat(e.formData.geoPoint.lat),lng:parseFloat(e.formData.geoPoint.lon),draggable:!0,focus:!0},angular.extend(e.map.center,{lat:e.map.markers.geoPoint.lat,lng:e.map.markers.geoPoint.lng});var n=e.$watch("map.markers.geoPoint",function(){e.loading||e.map.markers.geoPoint&&e.map.markers.geoPoint.lat&&e.map.markers.geoPoint.lng&&(e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=e.map.markers.geoPoint.lat,e.formData.geoPoint.lon=e.map.markers.geoPoint.lng)},!0);o.push(n),e.ionItemClass||(e.ionItemClass="done in"),e.loading=!1}):(_.forEach(o,function(e){e()}),o=[],delete e.map.markers.geoPoint,e.loading=!1,n.when())},e.$watch("formData.geoPoint",function(){e.loading||e.load()},!0)}]),angular.module("cesium.map.settings.controllers",["cesium.services"]).config(["PluginServiceProvider","csConfig",function(e,t){"ngInject";t.plugins&&t.plugins.es&&e.extendState("app.es_settings",{points:{common:{templateUrl:"plugins/map/templates/settings/es_settings_extend.html"}}})}]),MapHelpTipController.$inject=["$scope","$controller"],angular.module("cesium.map.help.controllers",["cesium.services"]).controller("MapHelpTipCtrl",MapHelpTipController),angular.module("cesium",["ionic","ionic-material","ngMessages","ngSanitize","pascalprecht.translate","ngApi","angular-cache","angular.screenmatch","angular.bind.notifier","ImageCropper","ion-digit-keyboard","FBAngular","ngCordova","cesium.plugins","cesium.filters","cesium.config","cesium.platform","cesium.controllers","cesium.templates","cesium.translations","cesium.components","cesium.directives"]).config(["$urlRouterProvider",function(e){"ngInject";e.deferIntercept()}]).run(["$rootScope","$translate","$state","$window","$urlRouter","ionicReady","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet",function(e,t,n,i,a,o,r,s,l,c,u,d){"ngInject";u.disableChangeState();var p=!1;e.$on("$stateChangeStart",function(t,i,a,o){if(!t.defaultPrevented){if(!(!i.data||e.tour||t.currentScope.tour)){if(p)return void t.preventDefault();var r,l=a.wallet&&"default"!=a.wallet?d.children.get(a.wallet):d;return a.wallet&&!l&&console.warn("[app] Unable to find the children wallet: "+a.wallet),i.data.auth&&!l.isAuth()?(t.preventDefault(),r=i.data.minData?{minData:!0}:void 0,p=!0,d.auth(r).then(function(){return p=!1,n.go(i.name,a)}).catch(function(e){if(p=!1,"CANCELLED"===e&&!n.current.name)return n.go("app.home")})):i.data.login&&!d.isLogin()?(t.preventDefault(),r=i.data.minData?{minData:!0}:void 0,p=!0,d.login(r).then(function(){return p=!1,n.go(i.name,a)}).catch(function(e){if(p=!1,"CANCELLED"===e&&!n.current.name)return n.go("app.home")})):!i.data.login&&!i.data.auth||(r=i.data.minData?{minData:!0}:void 0,l.isDataLoaded(r))?void 0:(t.preventDefault(),r&&r.minData||s.loading.show(),l.loadData(r).then(function(){return p=!1,n.go(i.name,a)}))}}}),d.api.data.on.unauth(e,function(){n.current&&n.current.data&&n.current.data.auth&&n.go("app.home")}),e.$on("$locationChangeSuccess",function(e,t,i){if(n.current.data&&!0===n.current.data.silentLocationChange){i&&i.split("?")[0]===t.split("?")[0]&&e.preventDefault()}}),a.listen(),c.start(),o().then(function(){ionic.Platform.isIOS()&&window.StatusBar&&StatusBar.styleLightContent()})}]),window.ionic.Platform.ready(function(){angular.bootstrap(document,["cesium"])}),angular.module("cesium.components",[]).component("csBadgeCertification",{bindings:{requirements:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_certification_count.html"}).component("csBadgeGivenCertification",{bindings:{identity:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_given_certification_count.html"}).component("csSortIcon",{bindings:{asc:"=",sort:"=",toggle:"<"},template:'<i class="ion-chevron-up" ng-class="{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: 5px; top:-5px; font-size: 9px;"></i><i class="ion-chevron-down" ng-class="{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: -2.6px; top: 3px; font-size: 9px;"></i>'}),angular.module("cesium.directives",[]).directive("compareTo",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.compareTo&&(i.$validators.compareTo=function(t){return t==e.$eval(n.compareTo)},e.$watch(n.compareTo,function(){i.$validate()}))}}}).directive("differentTo",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.differentTo&&(i.$validators.differentTo=function(t){return t!=e.$eval(n.differentTo)},e.$watch(n.differentTo,function(){i.$validate()}))}}}).directive("numberFloat",function(){var e=new RegExp("^[0-9]+([.,][0-9]+)?$");return{require:"?ngModel",link:function(t,n,i,a){a&&(a.$validators.numberFloat=function(t){return a.$isEmpty(t)||e.test(t)})}}}).directive("numberInt",function(){var e=new RegExp("^[0-9]+$");return{require:"ngModel",link:function(t,n,i,a){a&&(a.$validators.numberInt=function(t){return a.$isEmpty(t)||e.test(t)})}}}).directive("email",function(){var e=new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");return{require:"ngModel",link:function(t,n,i,a){a&&(a.$validators.email=function(t){return a.$isEmpty(t)||e.test(t)})}}}).directive("requiredIf",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&n.requiredIf&&(i.$validators.required=function(t){return!e.$eval(n.requiredIf)||!i.$isEmpty(t)},e.$watch(n.requiredIf,function(){i.$validate()}))}}}).directive("geoPoint",function(){return{require:"?ngModel",link:function(e,t,n,i){i&&(i.$validators.geoPoint=function(e){return i.$isEmpty(e)||angular.isDefined(e.lat)&&angular.isDefined(e.lon)||angular.isUndefined(e.lat)&&angular.isUndefined(e.lon)})}}}).directive("copyOnClick",["$window","Device","UIUtils",function(e,t,n){"ngInject";return{restrict:"A",link:function(e,i,a){var o=function(i){var o=a.copyOnClick;if(o&&t.clipboard.enable)t.clipboard.copy(o).then(function(){n.toast.show("INFO.COPY_TO_CLIPBOARD_DONE")}).catch(n.onError("ERROR.COPY_CLIPBOARD"));else if(o){var r=o&&o.indexOf("\n")>=0?o.split("\n").length:1;n.popover.show(i,{scope:e,templateUrl:"templates/common/popover_copy.html",bindings:{value:a.copyOnClick,rows:r},autoselect:".popover-copy "+(r<=1?"input":"textarea")})}};i.bind("click",o),i.bind("hold",o)}}}]).directive("selectOnClick",["$window",function(e){"ngInject";return{restrict:"A",link:function(t,n,i){n.bind("click",function(){e.getSelection&&!e.getSelection().toString()&&this.value&&this.setSelectionRange(0,this.value.length)})}}}]).directive("activeLink",["$location",function(e){"ngInject";return{restrict:"A",link:function(t,n,i,a){var o,r=i.activeLink;i.activeLinkPathPrefix?(o=i.activeLinkPathPrefix.substring(1),t.location=e,t.$watch("location.path()",function(e){e&&0===e.indexOf(o)?n.addClass(r):n.removeClass(r)})):i.href&&(o=i.href.substring(1),t.location=e,t.$watch("location.path()",function(e){e&&e==o?n.addClass(r):n.removeClass(r)}))}}}]).directive("input",["$timeout",function(e){return{restrict:"E",scope:{returnClose:"=",onReturn:"&",onFocus:"&",onBlur:"&"},link:function(t,n,i){n.bind("focus",function(n){t.onFocus&&e(function(){t.onFocus()})}),n.bind("blur",function(n){t.onBlur&&e(function(){t.onBlur()})}),n.bind("keydown",function(i){13==i.which&&(t.returnClose&&n[0].blur(),t.onReturn&&e(function(){t.onReturn()}))})}}}]).directive("trustAsHtml",["$sce","$compile","$parse",function(e,t,n){return{restrict:"A",compile:function(i,a){var o=n(a.trustAsHtml),r=n(a.trustAsHtml,function(e){return(e||"").toString()});return t.$$addBindingClass(i),function(n,i,a){t.$$addBindingInfo(i,a.trustAsHtml),n.$watch(r,function(){i.html(e.getTrustedHtml(e.trustAsHtml(o(n)))||""),t(i.contents())(n)})}}}}]).directive("modalClose",["$ionicHistory","$timeout",function(e,t){return{restrict:"AC",link:function(n,i){i.bind("click",function(){n.closeModal&&(e.nextViewOptions({historyRoot:!0,disableAnimate:!0,expire:300}),t(function(){e.nextViewOptions({historyRoot:!1,disableAnimate:!1})},300),n.closeModal())})}}}]).directive("csExtensionPoint",["$state","$compile","$controller","$templateCache","PluginService",function(e,t,n,i,a){var o=function(e){var t=e.templateUrl?i.get(e.templateUrl):e.template;return t?(e.controller&&(t='<ng-controller ng-controller="'+e.controller+'">'+t+"</div>"),t):(console.error("[plugin] Could not found template for extension :"+(e.templateUrl?e.templateUrl:e.template)),"")};return{restrict:"E",compile:function(e,t){if(angular.isDefined(t.name)){var n=a.extensions.points.getActivesByName(t.name);n.length>0&&(e.html(""),_.forEach(n,function(t){e.append(o(t))}))}return{pre:function(e,t,n){a.extensions.points.current.set(n.name)},post:function(){a.extensions.points.current.set()}}},scope:{content:"="}}}]).directive("onReadFile",["$parse",function(e){return{restrict:"A",scope:!1,link:function(t,n,i){var a=e(i.onReadFile);n.on("change",function(e){var n=new FileReader,i={name:this.files[0].name,size:this.files[0].size,type:this.files[0].type};n.onload=function(e){t.$applyAsync(function(){a(t,{file:{fileContent:e.target.result,fileData:i}})})},n.readAsText((e.srcElement||e.target).files[0])})}}}]).directive("dropzone",["$parse",function(e){return{restrict:"A",scope:!1,link:function(t,n,i){var a=e(i.dropzone);n.bind("dragover",function(e){e.stopPropagation(),e.preventDefault()}),n.bind("dragenter",function(e){e.stopPropagation(),e.preventDefault()}),n.bind("dragleave",function(e){e.stopPropagation(),e.preventDefault()}),n.bind("drop",function(e){e.stopPropagation(),e.preventDefault();var n={name:e.dataTransfer.files[0].name,size:e.dataTransfer.files[0].size,type:e.dataTransfer.files[0].type},i=new FileReader;i.onload=function(e){t.$apply(function(){a(t,{file:{fileContent:e.target.result,fileData:n}})})},i.readAsText(e.dataTransfer.files[0])})}}}]).directive("windowExitUnauth",["$window","csSettings","csWallet",function(e,t,n){return{restrict:"AE",link:function(i,a){(e.attachEvent||e.addEventListener)(e.attachEvent?"onunload":"unload",function(e){if(t.data&&t.data.keepAuthIdle!=t.constants.KEEP_AUTH_IDLE_SESSION)return n.unauth()})}}}]),angular.module("cesium.filters",["cesium.config","cesium.platform","pascalprecht.translate","cesium.translations"]).factory("filterTranslations",["$rootScope","$q","csPlatform","csSettings","csCurrency","$translate","$timeout",function(e,t,n,i,a,o,r){"ngInject";function s(){return console.debug("[filter] Loading translations for locale [{0}]".format(o.use())),o(["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.UD","COMMON.DAYS"]).then(function(e){d.DATE_PATTERN=e["COMMON.DATE_PATTERN"],"COMMON.DATE_PATTERN"===d.DATE_PATTERN&&(d.DATE_PATTERN="YYYY-MM-DD HH:mm"),d.DATE_SHORT_PATTERN=e["COMMON.DATE_SHORT_PATTERN"],"COMMON.DATE_SHORT_PATTERN"===d.DATE_SHORT_PATTERN&&(d.DATE_SHORT_PATTERN="YYYY-MM-DD"),d.DATE_MONTH_YEAR_PATTERN=e["COMMON.DATE_MONTH_YEAR_PATTERN"],"COMMON.DATE_MONTH_YEAR_PATTERN"===d.DATE_MONTH_YEAR_PATTERN&&(d.DATE_MONTH_YEAR_PATTERN="MMM YY"),d.DAYS=e["COMMON.DAYS"],"COMMON.DAYS"===d.DAYS&&(d.DAYS="days"),d.UD=e["COMMON.UD"],"COMMON.UD"===d.UD&&(d.UD="UD")})}function l(){console.debug("[filter] Computing constants from currency parameters"),d.MEDIAN_TIME_OFFSET=a.data.medianTimeOffset||d.MEDIAN_TIME_OFFSET}var c,u=!1,d=this;return d.MEDIAN_TIME_OFFSET=3600,d.ready=function(){return u?t.when():c||d.start()},d.start=function(){return c=n.ready().then(s).then(function(){l(),u=!0,i.api.locale.on.changed(e,s,this),a.api.data.on.ready(e,l,this)})},r(function(){d.start()}),d}]).filter("formatInteger",function(){return function(e){return e?e<1e7?numeral(e).format("0,0"):numeral(e).format("0,0.000 a"):"0"}}).filter("formatAmount",["csConfig","csSettings","csCurrency","$filter",function(e,t,n,i){function a(e,t){var i=t&&t.currentUD?t.currentUD:n.data.currentUD;if(!i)return void console.warn("formatAmount: currentUD not defined");var a=e/i;return a=Math.abs(e)<u&&0!==e?"~ 0":numeral(a).format(c),t&&t.currency?a+" "+l(t.currency,!0):a}function o(e,t){var n=numeral(e/100).format(e<-1e9||e>1e9?s:r);return t&&t.currency?n+" "+l(t.currency,!1):n}var r="0,0.0"+Array(e.decimalCount||4).join("0"),s="0,0.000 a",l=i("currencySymbol"),c=r+"0",u=1/Math.pow(10,(e.decimalCount||4)+1);return function(e,n){if(void 0!==e)return(n&&angular.isDefined(n.useRelative)?n.useRelative:t.data.useRelative)?a(e,n):o(e,n)}}]).filter("formatAmountNoHtml",["csConfig","csSettings","csCurrency","$filter",function(e,t,n,i){function a(e,t){var i=t&&t.currentUD?t.currentUD:n.data.currentUD;if(!i)return void console.warn("formatAmount: currentUD not defined");var a=e/i;return a=Math.abs(a)<r&&0!==e?"~ 0":numeral(a).format(s),t&&t.currency?a+" "+l(t.currency,!0):a}function o(e,t){var n=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return t&&t.currency?n+" "+l(t.currency,!1):n}var r=1/Math.pow(10,e.decimalCount||4),s="0,0.0"+Array(e.decimalCount||4).join("0"),l=i("currencySymbolNoHtml");return function(e,n){if(void 0!==e)return(n&&angular.isDefined(n.useRelative)?n.useRelative:t.data.useRelative)?a(e,n):o(e,n)}}]).filter("currencySymbol",["filterTranslations","$filter","csSettings",function(e,t,n){return function(i,a){return i?(angular.isDefined(a)?a:n.data.useRelative)?e.UD+"<sub>"+t("abbreviate")(i)+"</sub>":t("abbreviate")(i):""}}]).filter("currencySymbolNoHtml",["filterTranslations","$filter","csSettings",function(e,t,n){return function(i,a){return i?(angular.isDefined(a)?a:n.data.useRelative)?e.UD+" "+t("abbreviate")(i):t("abbreviate")(i):""}}]).filter("formatDecimal",["csConfig","csCurrency",function(e,t){var n=1/Math.pow(10,e.decimalCount||4),i="0,0.0"+Array(e.decimalCount||4).join("0");return function(e){return void 0===e?"0":e===1/0||e===-1/0?(console.warn("formatDecimal: division by zero ? (is currentUD defined ?) = "+t.data.currentUD),"error"):Math.abs(e)<n?"~ 0":numeral(e).format(i)}}]).filter("formatNumeral",function(){return function(e,t){return void 0===e?"0":Math.abs(e)<1e-4?"~ 0":numeral(e).format(t)}}).filter("formatDate",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("formatDateShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatDateMonth",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_MONTH_YEAR_PATTERN||"MMM YY"):""}}]).filter("formatDateForFile",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)).local().format(e.DATE_FILE_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatTime",function(){return function(e){return e?moment.unix(parseInt(e)).local().format("HH:mm"):""}}).filter("formatFromNow",function(){return function(e){return e?moment.unix(parseInt(e)).fromNow():""}}).filter("formatFromNowAndDate",["filterTranslations",function(e){return function(t,n){var i=t&&moment.unix(parseInt(t));return i&&i.fromNow()+(n&&n.separator||" | ")+i.local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm")||""}}]).filter("formatDurationTo",function(){return function(e){return e?moment.unix(moment().utc().unix()+parseInt(e)).fromNow():""}}).filter("formatDuration",function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0):""}}).filter("formatDurationTime",["filterTranslations",function(e){return function(t){if(!t)return"";var n=t&&t<0?"-":"+";t=Math.abs(t);var i=Math.trunc(t/3600/24),a=Math.trunc(t/3600-24*i),o=Math.trunc(t/60-24*i*60-60*a);return i>0?n+i+" "+e.DAYS+" "+a+"h "+o+"m":a>0?n+a+"h "+o+"m":n+o+"m"}}]).filter("formatDurationMs",function(){return function(e){return e?e<1e3?e+"ms":e/1e3+"s":""}}).filter("formatPeriod",function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0).split(" ").slice(-1)[0]:null}}).filter("formatFromNowShort",function(){return function(e){return e?moment.unix(parseInt(e)+offset).fromNow(!0):""}}).filter("medianDate",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("medianDateShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("medianTime",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).local().format("HH:mm"):""}}]).filter("medianFromNow",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).fromNow():""}}]).filter("medianFromNowShort",["filterTranslations",function(e){return function(t){return t?moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET).fromNow(!0):""}}]).filter("medianFromNowAndDate",["filterTranslations",function(e){return function(t,n){var i=t&&moment.unix(parseInt(t)+e.MEDIAN_TIME_OFFSET);return i&&i.fromNow()+(n&&n.separator||" | ")+i.local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm")||""}}]).filter("capitalize",function(){return function(e){return e?(e=e.toLowerCase(),e.substring(0,1).toUpperCase()+e.substring(1)):""}}).filter("abbreviate",function(){var e={};return function(t){var n=t||"";if(e[n])return e[n];if(n.length>3){for(var i="",a=["-","_"," "],o=0;o<n.length;o++){var r=n[o];0===o?i="g"===r||"G"===r?"Äž":r:o>0&&-1!=a.indexOf(n[o-1])&&(i+=r)}n=i.toUpperCase()}else n=n.toUpperCase(),"G"===n.charAt(0)&&(n="Äž"+(n.length>1?n.substr(1):""));return e[t]=n,n}}).filter("upper",function(){return function(e){return e?e.toUpperCase():""}}).filter("formatPubkey",function(){return function(e){return e?e.substr(0,8):""}}).filter("formatHash",function(){return function(e){return e?e.substr(0,4)+e.substr(e.length-4):""}}).filter("formatCategory",function(){return function(e){return e&&e.length>28?e.substr(0,25)+"...":e}}).filter("formatSlug",function(){return function(e){return e?encodeURIComponent(e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\w ]+/g,"").replace(/ +/g,"-")):""}}).filter("formatEncodeURI",function(){return function(e){return e?encodeURIComponent(e):""}}).filter("truncText",function(){return function(e,t){return t=t||500,!e||e.length<=t?e:e.substr(0,t)+"..."}}).filter("truncUrl",function(){return function(e,t){t=t||25;var n=e.startsWith("http://")?7:e.startsWith("https://")?8:0;return n=e.startsWith("www.",n)?n+4:n,!e||e.length-n<=t?e.substr(n):e.substr(n,t)+"..."}}).filter("trustAsHtml",["$sce",function(e){return function(t){return e.trustAsHtml(t)}}]),angular.module("cesium.platform",["ngIdle","cesium.config","cesium.services"]).config(["$translateProvider","csConfig",function(e,t){"ngInject";e.uniformLanguageTag("bcp47").determinePreferredLanguage().useSanitizeValueStrategy(null).fallbackLanguage([t.fallbackLanguage?t.fallbackLanguage:"en"]).useLoaderCache(!0)}]).config(["$httpProvider","csConfig",function(e,t){"ngInject";e.defaults.timeout=t.timeout?t.timeout:3e5,e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"],e.useApplyAsync(!0)}]).config(["$compileProvider","csConfig",function(e,t){"ngInject";e.debugInfoEnabled(!!t.debug)}]).config(["$animateProvider",function(e){"ngInject";e.classNameFilter(/\banimate-/)}]).config(["CacheFactoryProvider","csConfig",function(e,t){"ngInject";angular.extend(e.defaults,{maxAge:t.cacheTimeMs||6e4})}]).config(["screenmatchConfigProvider",function(e){"ngInject";e.config.rules="bootstrap"}]).config(["$ionicConfigProvider",function(e){"ngInject";var t=ionic.Platform.isIOS();e.scrolling.jsScrolling(t),e.views.maxCache(5)}]).config(["IdleProvider","csConfig",function(e,t){"ngInject";e.idle(t.logoutIdle||600),e.timeout(t.logoutTimeout||15)}]).factory("$exceptionHandler",["$log",function(e){"ngInject";return function(t,n){n?e.error(t,n):e.error(t)}}]).factory("csPlatform",["ionicReady","$rootScope","$q","$state","$translate","$timeout","UIUtils","BMA","Device","csHttp","csConfig","csSettings","csCurrency","csWallet",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m){"ngInject";function E(){if(!L){var e=t.$on("$stateChangeStart",function(e,t,n,a){e.defaultPrevented||"app.home"===t.name||"app.settings"===t.name||(e.preventDefault(),S?S.then(function(){i.go(t.name,n)}):r.loading.hide())});L=e}}function b(){L&&L(),L=null}function g(e){if(e)return!0;A=A||d.data.node;var t=d.data.fallbackNodes&&D<d.data.fallbackNodes.length&&d.data.fallbackNodes[D++];if(!t)throw"ERROR.CHECK_NETWORK_CONNECTION";var n=t.host+(t.port||80==t.port||443==t.port?"":":"+t.port);return s.node.same(t.host,t.port)?(console.debug("[platform] Skipping fallback node [{0}]: same as actual node".format(n)),g()):c.get(t.host,t.port,"/node/summary",443==t.port||s.node.forceUseSsl)().catch(function(e){console.error("[platform] Could not reach fallback node [{0}]: skipping".format(n))}).then(function(e){if(!e)return g();var i={old:s.server,new:n};return i.old===i.new&&(s.port!=t.port?i.new+=":"+t.port:0!=s.useSsl||!t.useSsl&&443!=t.port||(i.new+=" (SSL)")),a("CONFIRM.USE_FALLBACK_NODE",i).then(function(e){return r.alert.confirm(e)}).then(function(e){if(e)return d.data.node=t,d.data.node.temporary=!0,c.cache.clear(),s.copy(t).then(g)})})}function f(){return y}function T(){var e=d.data.latestReleaseUrl&&c.uri.parse(d.data.latestReleaseUrl);return e?c.get(e.host,"https:"==e.protocol?443:e.port,"/"+e.pathname)().then(function(e){if(e&&e.name&&e.tag_name&&e.html_url)return{version:e.name,url:e.html_url,isNewer:c.version.compare(u.version,e.name)<0}}).catch(function(e){console.error("[platform] Failed to get Cesium latest version",e)}):n.when()}function h(){C=[s.api.node.on.restart(t,N,this)]}function I(){_.forEach(C,function(e){e()}),C=[]}function v(){return y?n.when():S||O()}function N(){return console.debug("[platform] restarting csPlatform"),R().then(function(){return o(O,200)})}function O(){return E(),S=e().then(n.all([l.ready(),d.ready()])).then(function(){return s.ready().then(g)}).then(p.ready).then(m.ready).then(function(){b(),h(),S=null,y=!0}).catch(function(e){throw S=null,y=!1,i.current.name!==t.errorState&&i.go(t.errorState,{error:"peer"}),e})}function R(){return y?(I(),m.stop(),p.stop(),s.stop(),o(function(){b(),y=!1,S=null},500)):n.when()}var A,S,C,L,D=0,y=!1;return{disableChangeState:E,isStarted:f,ready:v,restart:N,start:O,stop:R,version:{latest:T}}}]).run(["$rootScope","$state","$window","$urlRouter","ionicReady","$ionicPlatform","$ionicHistory","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet","csSettings","csConfig","csCurrency",function(e,t,n,i,a,o,r,s,l,c,u,d,p,m,E,b){"ngInject";e.config=E,e.settings=m.data,e.currency=b.data,e.device=s,e.errorState="app.home",e.smallscreen=l.screen.isSmall();var g=n.location.href.indexOf("#");e.rootPath=-1!=g?n.location.href.substr(0,g):n.location.href,console.debug("[app] Root path is ["+e.rootPath+"]"),a().then(function(){return s.keyboard.enable&&(s.keyboard.hideKeyboardAccessoryBar(!0),ionic.Platform.isIOS()&&s.keyboard.disableScroll(!0)),"a"!==ionic.Platform.grade.toLowerCase()&&(console.info("[app] Disabling UI effects, because plateform's grade is ["+ionic.Platform.grade+"]"),l.setEffects(!1)),window.StatusBar&&console.debug("[app] Status bar plugin enable"),d.version.latest().then(function(t){t&&t.isNewer?(console.info("[app] New release detected [{0}]".format(t.version)),e.newRelease=t):console.info("[app] Current version [{0}] is the latest release".format(E.version))}),o.registerBackButtonAction(function(e){return r.backView()?r.goBack():(e.preventDefault(),l.alert.confirm("CONFIRM.EXIT_APP").then(function(e){e&&ionic.Platform.exitApp()}))},100),d.ready()})}]),"function"!=typeof String.prototype.startsWith&&(console.debug("Adding String.prototype.startsWith() -> was missing on this platform"),String.prototype.startsWith=function(e,t){return 0===this.indexOf(e,t)}),"function"!=typeof String.prototype.trim){console.debug("Adding String.prototype.trim() -> was missing on this platform");var rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(rtrim,"")}}Math&&"function"!=typeof Math.trunc&&(console.debug("Adding Math.trunc() -> was missing on this platform"),Math.trunc=function(e){return(e-.5).toFixed()}),"function"!=typeof String.prototype.format&&(console.debug("Adding String.prototype.format() -> was missing on this platform"),String.prototype.format=function(){var e=arguments;return this.replace(/{(\d+)}/g,function(t,n){return void 0!==e[n]?e[n]:t})});
\ No newline at end of file
diff --git a/assets/www/index.html b/assets/www/index.html
index cb983187e587b6e413d8a2c1e4cfffab936885f1..9f5b469e003dba7d748c187e4816c557f0e09958 100644
--- a/assets/www/index.html
+++ b/assets/www/index.html
@@ -32,7 +32,7 @@
     <script src="cordova.js"></script>
     <!--endRemoveIf(no-device)-->
 
-    <script src="dist_js/cesium-346c044447.js"></script>
+    <script src="dist_js/cesium-fc8a3b811f.js"></script>
 
     <script src="config.js"></script>
   </body>
diff --git a/assets/www/manifest.json b/assets/www/manifest.json
index cef10474a34d75daf80162421972103ccc3aa6aa..743637192a1cd130fd2a6c5ecbb36d212283bf2a 100644
--- a/assets/www/manifest.json
+++ b/assets/www/manifest.json
@@ -2,7 +2,7 @@
   "short_name": "Cesium",
   "name": "Cesium",
   "manifest_version": 1,
-  "version": "1.4.16",
+  "version": "1.4.17",
   "default_locale": "fr",
   "description": "Manage your Duniter Wallet on a libre currency, like Äž1",
   "icons": [
diff --git a/res/xml/config.xml b/res/xml/config.xml
index 08c1c0abd402ef72d041c7871eb181c95d4cdbbc..64d6cc301b592a20b60aee63e3903cf2f9b2d768 100644
--- a/res/xml/config.xml
+++ b/res/xml/config.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<widget android-versionCode="104016" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.4.16" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+<widget android-versionCode="104017" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.4.17" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
     <feature name="Clipboard">
         <param name="android-package" value="com.verso.cordova.clipboard.Clipboard" />
     </feature>