(function(e){"use strict";function t(e,n){if(!n||!e)return t.clear();let r=floCrypto.getPubKeyHex(n);if(!r||!floCrypto.verifyPubKey(r,e))return t.clear();let o=floCrypto.randInt(12,20);return y=floCrypto.randString(o),h=Crypto.AES.encrypt(n,y),m=r,p=e,p}function n(e){return new Promise((t,n)=>{if(!(e in I))return n(`${e} is not a supernode`);if(O.has(e))return n(`${e} is not active`);var r=new WebSocket("wss://"+I[e].uri+"/");r.onopen=(e=>t(r)),r.onerror=(t=>{O.add(e),n(`${e} is unavailable`)})})}function r(e,t=!1){return new Promise((o,c)=>{if(O.size===v.list.length)return c("Cloud offline");e in I||(e=v.closestNode(N(e))),n(e).then(e=>o(e)).catch(n=>{if(t)var i=v.prevNode(e);else i=v.nextNode(e);r(i,t).then(e=>o(e)).catch(e=>c(e))})})}function o(e,t){return new Promise((n,r)=>{if(O.has(e))return r(`${e} is not active`);let o,c="https://"+I[e].uri;"string"==typeof t?o=fetch(c+"?"+t):"object"==typeof t&&"POST"===t.method&&(o=fetch(c,t)),o.then(e=>{e.ok||400===e.status||500===e.status?n(e):r(e)}).catch(e=>r(e))})}function c(e,t,n=!1){return new Promise((r,i)=>{if(O.size===v.list.length)return i("Cloud offline");e in I||(e=v.closestNode(N(e))),o(e,t).then(e=>r(e)).catch(o=>{if(O.add(e),n)var a=v.prevNode(e);else a=v.nextNode(e);c(a,t,n).then(e=>r(e)).catch(e=>i(e))})})}function i(e,t,n="POST"){return new Promise((r,o)=>{let i;i="POST"===n?{method:"POST",body:JSON.stringify(t)}:new URLSearchParams(JSON.parse(JSON.stringify(t))).toString(),c(e,i).then(e=>{e.ok?e.json().then(e=>r(e)).catch(e=>o(e)):e.text().then(t=>o(e.status+": "+t)).catch(e=>o(e))}).catch(e=>o(e))})}function a(e,t,n){const o=void 0!==t.status?e=>{if(t.status)return e;{let n={};for(let r in e)t.trackList.includes(r)&&(n[r]=e[r]);return n}}:e=>{e=u(e);let n={},r=N(t.receiverID),o=t;for(let t in e){let c=e[t];o.atVectorClock&&o.atVectorClock!=t||!(o.atVectorClock||!o.lowerVectorClock||o.lowerVectorClock<=t)||!(o.atVectorClock||!o.upperVectorClock||o.upperVectorClock>=t)||o.afterTime&&!(o.afterTime{r(e).then(e=>{let r=floCrypto.randString(5);e.send(JSON.stringify(t)),e.onmessage=(e=>{let t=null,r=null;try{t=o(JSON.parse(e.data))}catch(t){r=e.data}finally{n(t,r)}}),w[r]=e,w[r].request=t,c(r)}).catch(e=>i(e))})}function l(e,t){try{console.log(t);let n=Object.keys(t).sort();for(let r of n)if(!(rD[e]&&(D[e]=t[n].log_time);compactIDB.writeData("lastVC",D[e],e),compactIDB.writeData("generalData",b[e],e)}catch(e){console.error(e)}}function u(e){return Array.isArray(e)||(e=[e]),Object.fromEntries(e.map(e=>(e.message=C(e.message),[e.vectorClock,e])))}const d=e,f={blockchainPrefix:35,SNStorageID:floGlobals.SNStorageID||"FNaN9McoBAEFUjkRmNQRYLmBF8SpS7Tgfk",adminID:floGlobals.adminID,application:floGlobals.application,callback:(e,t)=>console.debug(e,t)};var p,m,h,y,g,b,D;Object.defineProperties(t,{id:{get:()=>{if(!p)throw"User not set";return p}},public:{get:()=>{if(!m)throw"User not set";return m}},sign:{value:e=>{if(!h)throw"User not set";return floCrypto.signData(e,Crypto.AES.decrypt(h,y))}},clear:{value:()=>p=m=h=y=void 0}}),Object.defineProperties(d,{SNStorageID:{get:()=>f.SNStorageID},adminID:{get:()=>f.adminID},application:{get:()=>f.application},user:{get:()=>t}}),Object.defineProperties(floGlobals,{appObjects:{get:()=>g,set:e=>g=e},generalData:{get:()=>b,set:e=>b=e},generalDataset:{value:(e,t={})=>b[P(e,t)]},lastVC:{get:()=>D,set:e=>D=e}});var v,I={};Object.defineProperty(d,"nodes",{get:()=>JSON.parse(JSON.stringify(I))});const k=d.K_Bucket=function(e,t){const n=e=>{let t=bitjs.Base58.decode(e);t.shift(),t.splice(-4,4);let n=Crypto.util.bytesToHex(t),r=new BigInteger(n,16),o=r.toByteArrayUnsigned(),c=new Uint8Array(o);return c},r=new BuildKBucket({localNodeId:n(e)});t.forEach(e=>r.add({id:n(e),floID:e}));const o=t.map(e=>[r.distance(r.localNodeId,n(e)),e]).sort((e,t)=>e[0]-t[0]).map(e=>e[1]),c=this;Object.defineProperty(c,"tree",{get:()=>r}),Object.defineProperty(c,"list",{get:()=>Array.from(o)}),c.isNode=(e=>o.includes(e)),c.innerNodes=function(e,t){if(!o.includes(e)||!o.includes(t))throw Error("Given nodes are not supernode");let n=[];for(let r=o.indexOf(e)+1;o[r]!=t;r++)r-1?r[t++]=o[c]:c=o.length;return 1==t?r[0]:r},c.nextNode=function(e,t=1){let n=t||o.length;if(!o.includes(e))throw Error("Given node is not supernode");n||(n=o.length);let r=[];for(let t=0,c=o.indexOf(e)+1;te.floID);return 1==t?a[0]:a}};d.init=function(e){return new Promise((t,n)=>{try{I=e,v=new k(f.SNStorageID,Object.keys(I)),t("Cloud init successful")}catch(e){n(e)}})},Object.defineProperty(d,"kBucket",{get:()=>v});const O=new Set,w={};Object.defineProperty(d,"liveRequest",{get:()=>w}),Object.defineProperty(d,"inactive",{get:()=>O});const j=d.util={},S=j.encodeMessage=function(e){return btoa(unescape(encodeURIComponent(JSON.stringify(e))))},C=j.decodeMessage=function(e){return JSON.parse(decodeURIComponent(escape(atob(e))))},P=j.filterKey=function(e,t={}){return e+(t.comment?":"+t.comment:"")+"|"+(t.group||t.receiverID||f.adminID)+"|"+(t.application||f.application)},N=j.proxyID=function(e){if(e){var t;if(33==e.length||34==e.length){let n=bitjs.Base58.decode(e);t=n.slice(0,n.length-4);let r=n.slice(n.length-4),o=Crypto.SHA256(Crypto.SHA256(t,{asBytes:!0}),{asBytes:!0});o[0]!=r[0]||o[1]!=r[1]||o[2]!=r[2]||o[3]!=r[3]?t=void 0:t.shift()}else if(42==e.length||62==e.length){if("function"!=typeof coinjs)throw"library missing (lib_btc.js)";let n=coinjs.bech32_decode(e);n&&(t=n.data,t.shift(),t=coinjs.bech32_convert(t,5,8,!1),62==e.length&&(t=coinjs.bech32_convert(t,5,8,!1)))}else 66==e.length&&(t=ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(e),{asBytes:!0})));if(t){t.unshift(f.blockchainPrefix);let e=Crypto.SHA256(Crypto.SHA256(t,{asBytes:!0}),{asBytes:!0});return bitjs.Base58.encode(t.concat(e.slice(0,4)))}throw"Invalid address: "+e}},A={};Object.defineProperty(A,"get",{value:e=>JSON.parse(A[e])}),Object.defineProperty(A,"set",{value:e=>A[e]=JSON.stringify(g[e])}),d.setStatus=function(e={}){return new Promise((n,r)=>{let o=e.callback instanceof Function?e.callback:f.callback;var c={floID:t.id,application:e.application||f.application,time:Date.now(),status:!0,pubKey:t.public};let i=["time","application","floID"].map(e=>c[e]).join("|");c.sign=t.sign(i),a(e.refID||f.adminID,c,o).then(e=>n(e)).catch(e=>r(e))})},d.requestStatus=function(e,t={}){return new Promise((n,r)=>{Array.isArray(e)||(e=[e]);let o=t.callback instanceof Function?t.callback:f.callback,c={status:!1,application:t.application||f.application,trackList:e};a(t.refID||f.adminID,c,o).then(e=>n(e)).catch(e=>r(e))})};const B=d.sendApplicationData=function(e,n,r={}){return new Promise((o,c)=>{var a={senderID:t.id,receiverID:r.receiverID||f.adminID,pubKey:t.public,message:S(e),time:Date.now(),application:r.application||f.application,type:n,comment:r.comment||""};let l=["receiverID","time","application","type","message","comment"].map(e=>a[e]).join("|");a.sign=t.sign(l),i(a.receiverID,a).then(e=>o(e)).catch(e=>c(e))})},x=d.requestApplicationData=function(e,t={}){return new Promise((n,r)=>{var o={receiverID:t.receiverID||f.adminID,senderID:t.senderID||void 0,application:t.application||f.application,type:e,comment:t.comment||void 0,lowerVectorClock:t.lowerVectorClock||void 0,upperVectorClock:t.upperVectorClock||void 0,atVectorClock:t.atVectorClock||void 0,afterTime:t.afterTime||void 0,mostRecent:t.mostRecent||void 0};t.callback instanceof Function?a(o.receiverID,o,t.callback).then(e=>n(e)).catch(e=>r(e)):("POST"===t.method&&(o={time:Date.now(),request:o}),i(o.receiverID,o,t.method||"GET").then(e=>n(e)).catch(e=>r(e)))})};d.tagApplicationData=function(e,n,r={}){return new Promise((o,c)=>{if(!floGlobals.subAdmins.includes(t.id))return c("Only subAdmins can tag data");var a={receiverID:r.receiverID||f.adminID,requestorID:t.id,pubKey:t.public,time:Date.now(),vectorClock:e,tag:n};let l=["time","vectorClock","tag"].map(e=>a[e]).join("|");a.sign=t.sign(l),i(a.receiverID,a).then(e=>o(e)).catch(e=>c(e))})},d.noteApplicationData=function(e,n,r={}){return new Promise((o,c)=>{var a={receiverID:r.receiverID||f.adminID,requestorID:t.id,pubKey:t.public,time:Date.now(),vectorClock:e,note:n};let l=["time","vectorClock","note"].map(e=>a[e]).join("|");a.sign=t.sign(l),i(a.receiverID,a).then(e=>o(e)).catch(e=>c(e))})},d.sendGeneralData=function(e,t,n={}){return new Promise((r,o)=>{if(n.encrypt){let t=!0===n.encrypt?floGlobals.settings.encryptionKey:n.encrypt;e=floCrypto.encryptData(JSON.stringify(e),t)}B(e,t,n).then(e=>r(e)).catch(e=>o(e))})},d.requestGeneralData=function(e,t={}){return new Promise((n,r)=>{var o=P(e,t);if(D[o]=parseInt(D[o])||0,t.afterTime=t.afterTime||D[o],t.callback instanceof Function){let c=Object.create(t);c.callback=((e,n)=>{s(o,e),t.callback(e,n)}),x(e,c).then(e=>n(e)).catch(e=>r(e))}else x(e,t).then(e=>{s(o,u(e)),n(e)}).catch(e=>r(e))})},d.requestObjectData=function(e,t={}){return new Promise((n,r)=>{t.lowerVectorClock=t.lowerVectorClock||D[e]+1,t.senderID=[!1,null].includes(t.senderID)?null:t.senderID||floGlobals.subAdmins,t.mostRecent=!0,t.comment="RESET";let o=null;if(t.callback instanceof Function){let n=t.callback;o=((t,r)=>{l(e,t),n(t,r)}),delete t.callback}x(e,t).then(c=>{if(l(e,u(c)),delete t.comment,t.lowerVectorClock=D[e]+1,delete t.mostRecent,o){let c=Object.create(t);c.callback=o,x(e,c).then(e=>n(e)).catch(e=>r(e))}else x(e,t).then(t=>{l(e,u(t)),n(g[e])}).catch(e=>r(e))}).catch(e=>r(e))})},d.closeRequest=function(e){return new Promise((t,n)=>{let r=w[e];if(!r)return n("Request not found");r.onclose=(n=>{delete w[e],t("Request connection closed")}),r.close()})},d.resetObjectData=function(e,t={}){return new Promise((n,r)=>{let o={reset:g[e]};t.comment="RESET",B(o,e,t).then(t=>{A.set(e),n(t)}).catch(e=>r(e))})},d.updateObjectData=function(e,t={}){return new Promise((n,r)=>{let o={diff:E.find(A.get(e),g[e])};t.comment="UPDATE",B(o,e,t).then(t=>{A.set(e),n(t)}).catch(e=>r(e))})};var E=function(){const e=e=>e instanceof Date,t=e=>0===Object.keys(e).length,n=e=>null!=e&&"object"==typeof e,r=e=>n(e)&&!e.hasOwnProperty?{...e}:e,o=(c,i)=>{if(c===i)return{};if(!n(c)||!n(i))return i;const a=r(c),l=r(i);return e(a)||e(l)?a.valueOf()==l.valueOf()?{}:l:Object.keys(l).reduce((r,c)=>{if(a.hasOwnProperty(c)){const i=o(a[c],l[c]);return n(i)&&t(i)&&!e(i)?r:{...r,[c]:i}}return r},{})},c=(e,o)=>{if(e===o||!n(e)||!n(o))return{};const i=r(e),a=r(o);return Object.keys(a).reduce((e,r)=>{if(i.hasOwnProperty(r)){const o=c(i[r],a[r]);return n(o)&&t(o)?e:{...e,[r]:o}}return{...e,[r]:a[r]}},{})},i=(e,o)=>{if(e===o||!n(e)||!n(o))return{};const c=r(e),a=r(o);return Object.keys(c).reduce((e,r)=>{if(a.hasOwnProperty(r)){const o=i(c[r],a[r]);return n(o)&&t(o)?e:{...e,[r]:o}}return{...e,[r]:null}},{})},a=(e,t)=>{for(var n in t)try{t[n].constructor==Object?e[n]=a(e[n],t[n]):Ext.isArray(t[n])?t[n].length<1?e[n]=t[n]:e[n]=a(e[n],t[n]):e[n]=t[n]}catch(r){e[n]=t[n]}return e},l=e=>(Object.keys(e).forEach(t=>{var n=e[t];"object"==typeof n&&null!==n?l(n):null===n&&delete e[t]}),-1!=e.constructor.toString().indexOf("Array")&&(e=e.filter(function(e){return null!=e})),e),s=(e,t)=>({added:c(e,t),deleted:i(e,t),updated:o(e,t)}),u=(e,t)=>(0!==Object.keys(t.updated).length&&(e=a(e,t.updated)),0!==Object.keys(t.deleted).length&&(e=a(e,t.deleted),e=l(e)),0!==Object.keys(t.added).length&&(e=a(e,t.added)),e);return{find:s,merge:u}}()})("object"==typeof module?module.exports:window.floCloudAPI={});