@txnlab/use-wallet 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -0
- package/dist/cjs/clients/algosigner.d.ts +62 -0
- package/dist/cjs/clients/base.d.ts +72 -0
- package/dist/cjs/clients/defly.d.ts +51 -0
- package/dist/cjs/clients/exodus.d.ts +52 -0
- package/dist/cjs/clients/index.d.ts +300 -0
- package/dist/cjs/clients/myalgowallet.d.ts +40 -0
- package/dist/cjs/clients/perawallet.d.ts +51 -0
- package/dist/cjs/constants/constants.d.ts +10 -0
- package/dist/cjs/constants/index.d.ts +1 -0
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/useConnectWallet.d.ts +22 -0
- package/dist/cjs/hooks/useWallet.d.ts +10 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +3536 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/media/audio.d.ts +1 -0
- package/dist/cjs/providers/algosigner.d.ts +2 -0
- package/dist/cjs/providers/defly.d.ts +2 -0
- package/dist/cjs/providers/exodus.d.ts +2 -0
- package/dist/cjs/providers/index.d.ts +7 -0
- package/dist/cjs/providers/myalgowallet.d.ts +2 -0
- package/dist/cjs/providers/perawallet.d.ts +2 -0
- package/dist/cjs/store/index.d.ts +1 -0
- package/dist/cjs/store/middelware/immer.d.ts +10 -0
- package/dist/cjs/store/state/walletStore.d.ts +19 -0
- package/dist/cjs/types/api.d.ts +11 -0
- package/dist/cjs/types/index.d.ts +3 -0
- package/dist/cjs/types/node.d.ts +41 -0
- package/dist/cjs/types/wallet.d.ts +47 -0
- package/dist/cjs/utils/index.d.ts +4 -0
- package/dist/esm/clients/algosigner.d.ts +62 -0
- package/dist/esm/clients/base.d.ts +72 -0
- package/dist/esm/clients/defly.d.ts +51 -0
- package/dist/esm/clients/exodus.d.ts +52 -0
- package/dist/esm/clients/index.d.ts +300 -0
- package/dist/esm/clients/myalgowallet.d.ts +40 -0
- package/dist/esm/clients/perawallet.d.ts +51 -0
- package/dist/esm/constants/constants.d.ts +10 -0
- package/dist/esm/constants/index.d.ts +1 -0
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/useConnectWallet.d.ts +22 -0
- package/dist/esm/hooks/useWallet.d.ts +10 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3506 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/media/audio.d.ts +1 -0
- package/dist/esm/providers/algosigner.d.ts +2 -0
- package/dist/esm/providers/defly.d.ts +2 -0
- package/dist/esm/providers/exodus.d.ts +2 -0
- package/dist/esm/providers/index.d.ts +7 -0
- package/dist/esm/providers/myalgowallet.d.ts +2 -0
- package/dist/esm/providers/perawallet.d.ts +2 -0
- package/dist/esm/store/index.d.ts +1 -0
- package/dist/esm/store/middelware/immer.d.ts +10 -0
- package/dist/esm/store/state/walletStore.d.ts +19 -0
- package/dist/esm/types/api.d.ts +11 -0
- package/dist/esm/types/index.d.ts +3 -0
- package/dist/esm/types/node.d.ts +41 -0
- package/dist/esm/types/wallet.d.ts +47 -0
- package/dist/esm/utils/index.d.ts +4 -0
- package/dist/index.d.ts +160 -0
- package/package.json +94 -0
|
@@ -0,0 +1,3506 @@
|
|
|
1
|
+
import require$$0, { useReducer, useRef, useDebugValue, useEffect, useLayoutEffect, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
function n(n){for(var r=arguments.length,t=Array(r>1?r-1:0),e=1;e<r;e++)t[e-1]=arguments[e];if("production"!==process.env.NODE_ENV){var i=Y[n],o=i?"function"==typeof i?i.apply(null,t):i:"unknown error nr: "+n;throw Error("[Immer] "+o)}throw Error("[Immer] minified error nr: "+n+(t.length?" "+t.map((function(n){return "'"+n+"'"})).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function r(n){return !!n&&!!n[Q]}function t(n){return !!n&&(function(n){if(!n||"object"!=typeof n)return !1;var r=Object.getPrototypeOf(n);if(null===r)return !0;var t=Object.hasOwnProperty.call(r,"constructor")&&r.constructor;return t===Object||"function"==typeof t&&Function.toString.call(t)===Z}(n)||Array.isArray(n)||!!n[L]||!!n.constructor[L]||s(n)||v(n))}function i(n,r,t){void 0===t&&(t=!1),0===o(n)?(t?Object.keys:nn)(n).forEach((function(e){t&&"symbol"==typeof e||r(e,n[e],n);})):n.forEach((function(t,e){return r(e,t,n)}));}function o(n){var r=n[Q];return r?r.i>3?r.i-4:r.i:Array.isArray(n)?1:s(n)?2:v(n)?3:0}function u(n,r){return 2===o(n)?n.has(r):Object.prototype.hasOwnProperty.call(n,r)}function a(n,r){return 2===o(n)?n.get(r):n[r]}function f(n,r,t){var e=o(n);2===e?n.set(r,t):3===e?(n.delete(r),n.add(t)):n[r]=t;}function c(n,r){return n===r?0!==n||1/n==1/r:n!=n&&r!=r}function s(n){return X&&n instanceof Map}function v(n){return q&&n instanceof Set}function p(n){return n.o||n.t}function l(n){if(Array.isArray(n))return Array.prototype.slice.call(n);var r=rn(n);delete r[Q];for(var t=nn(r),e=0;e<t.length;e++){var i=t[e],o=r[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(r[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:n[i]});}return Object.create(Object.getPrototypeOf(n),r)}function d(n,e){return void 0===e&&(e=!1),y(n)||r(n)||!t(n)?n:(o(n)>1&&(n.set=n.add=n.clear=n.delete=h),Object.freeze(n),e&&i(n,(function(n,r){return d(r,!0)}),!0),n)}function h(){n(2);}function y(n){return null==n||"object"!=typeof n||Object.isFrozen(n)}function b(r){var t=tn[r];return t||n(18,r),t}function _(){return "production"===process.env.NODE_ENV||U||n(0),U}function j(n,r){r&&(b("Patches"),n.u=[],n.s=[],n.v=r);}function O(n){g(n),n.p.forEach(S),n.p=null;}function g(n){n===U&&(U=n.l);}function w(n){return U={p:[],l:U,h:n,m:!0,_:0}}function S(n){var r=n[Q];0===r.i||1===r.i?r.j():r.O=!0;}function P$1(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.g||b("ES5").S(e,r,o),o?(i[Q].P&&(O(e),n(4)),t(r)&&(r=M(e,r),e.l||x(e,r)),e.u&&b("Patches").M(i[Q].t,r,e.u,e.s)):r=M(e,i,[]),O(e),e.u&&e.v(e.u,e.s),r!==H?r:void 0}function M(n,r,t){if(y(r))return r;var e=r[Q];if(!e)return i(r,(function(i,o){return A(n,e,r,i,o,t)}),!0),r;if(e.A!==n)return r;if(!e.P)return x(n,e.t,!0),e.t;if(!e.I){e.I=!0,e.A._--;var o=4===e.i||5===e.i?e.o=l(e.k):e.o;i(3===e.i?new Set(o):o,(function(r,i){return A(n,e,o,r,i,t)})),x(n,o,!1),t&&n.u&&b("Patches").R(e,t,n.u,n.s);}return e.o}function A(e,i,o,a,c,s){if("production"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var v=M(e,c,s&&i&&3!==i.i&&!u(i.D,a)?s.concat(a):void 0);if(f(o,a,v),!r(v))return;e.m=!1;}if(t(c)&&!y(c)){if(!e.h.F&&e._<1)return;M(e,c),i&&i.A.l||x(e,c);}}function x(n,r,t){void 0===t&&(t=!1),n.h.F&&n.m&&d(r,t);}function z(n,r){var t=n[Q];return (t?p(t):n)[r]}function I(n,r){if(r in n)for(var t=Object.getPrototypeOf(n);t;){var e=Object.getOwnPropertyDescriptor(t,r);if(e)return e;t=Object.getPrototypeOf(t);}}function k(n){n.P||(n.P=!0,n.l&&k(n.l));}function E(n){n.o||(n.o=l(n.t));}function R(n,r,t){var e=s(r)?b("MapSet").N(r,t):v(r)?b("MapSet").T(r,t):n.g?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,D:{},l:r,t:n,k:null,o:null,j:null,C:!1},i=e,o=en;t&&(i=[e],o=on);var u=Proxy.revocable(i,o),a=u.revoke,f=u.proxy;return e.k=f,e.j=a,f}(r,t):b("ES5").J(r,t);return (t?t.A:_()).p.push(e),e}function D(e){return r(e)||n(22,e),function n(r){if(!t(r))return r;var e,u=r[Q],c=o(r);if(u){if(!u.P&&(u.i<4||!b("ES5").K(u)))return u.t;u.I=!0,e=F(r,c),u.I=!1;}else e=F(r,c);return i(e,(function(r,t){u&&a(u.t,r)===t||f(e,r,n(t));})),3===c?new Set(e):e}(e)}function F(n,r){switch(r){case 2:return new Map(n);case 3:return Array.from(n)}return l(n)}var G,U,W="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),X="undefined"!=typeof Map,q="undefined"!=typeof Set,B="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,H=W?Symbol.for("immer-nothing"):((G={})["immer-nothing"]=!0,G),L=W?Symbol.for("immer-draftable"):"__$immer_draftable",Q=W?Symbol.for("immer-state"):"__$immer_state",Y={0:"Illegal state",1:"Immer drafts cannot have computed properties",2:"This object has been frozen and should not be mutated",3:function(n){return "Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+n},4:"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.",5:"Immer forbids circular references",6:"The first or second argument to `produce` must be a function",7:"The third argument to `produce` must be a function or undefined",8:"First argument to `createDraft` must be a plain object, an array, or an immerable object",9:"First argument to `finishDraft` must be a draft returned by `createDraft`",10:"The given draft is already finalized",11:"Object.defineProperty() cannot be used on an Immer draft",12:"Object.setPrototypeOf() cannot be used on an Immer draft",13:"Immer only supports deleting array indices",14:"Immer only supports setting array indices and the 'length' property",15:function(n){return "Cannot apply patch, path doesn't resolve: "+n},16:'Sets cannot have "replace" patches.',17:function(n){return "Unsupported patch operation: "+n},18:function(n){return "The plugin for '"+n+"' has not been loaded into Immer. To enable the plugin, import and call `enable"+n+"()` when initializing your application."},20:"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available",21:function(n){return "produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '"+n+"'"},22:function(n){return "'current' expects a draft, got: "+n},23:function(n){return "'original' expects a draft, got: "+n},24:"Patching reserved attributes like __proto__, prototype and constructor is not allowed"},Z=""+Object.prototype.constructor,nn="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:Object.getOwnPropertyNames,rn=Object.getOwnPropertyDescriptors||function(n){var r={};return nn(n).forEach((function(t){r[t]=Object.getOwnPropertyDescriptor(n,t);})),r},tn={},en={get:function(n,r){if(r===Q)return n;var e=p(n);if(!u(e,r))return function(n,r,t){var e,i=I(r,t);return i?"value"in i?i.value:null===(e=i.get)||void 0===e?void 0:e.call(n.k):void 0}(n,e,r);var i=e[r];return n.I||!t(i)?i:i===z(n.t,r)?(E(n),n.o[r]=R(n.A.h,i,n)):i},has:function(n,r){return r in p(n)},ownKeys:function(n){return Reflect.ownKeys(p(n))},set:function(n,r,t){var e=I(p(n),r);if(null==e?void 0:e.set)return e.set.call(n.k,t),!0;if(!n.P){var i=z(p(n),r),o=null==i?void 0:i[Q];if(o&&o.t===t)return n.o[r]=t,n.D[r]=!1,!0;if(c(t,i)&&(void 0!==t||u(n.t,r)))return !0;E(n),k(n);}return n.o[r]===t&&"number"!=typeof t&&(void 0!==t||r in n.o)||(n.o[r]=t,n.D[r]=!0,!0)},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.D[r]=!1,E(n),k(n)):delete n.D[r],n.o&&delete n.o[r],!0},getOwnPropertyDescriptor:function(n,r){var t=p(n),e=Reflect.getOwnPropertyDescriptor(t,r);return e?{writable:!0,configurable:1!==n.i||"length"!==r,enumerable:e.enumerable,value:t[r]}:e},defineProperty:function(){n(11);},getPrototypeOf:function(n){return Object.getPrototypeOf(n.t)},setPrototypeOf:function(){n(12);}},on={};i(en,(function(n,r){on[n]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)};})),on.deleteProperty=function(r,t){return "production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&n(13),on.set.call(this,r,t,void 0)},on.set=function(r,t,e){return "production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&n(14),en.set.call(this,r[0],t,e,r[0])};var un=function(){function e(r){var e=this;this.g=B,this.F=!0,this.produce=function(r,i,o){if("function"==typeof r&&"function"!=typeof i){var u=i;i=r;var a=e;return function(n){var r=this;void 0===n&&(n=u);for(var t=arguments.length,e=Array(t>1?t-1:0),o=1;o<t;o++)e[o-1]=arguments[o];return a.produce(n,(function(n){var t;return (t=i).call.apply(t,[r,n].concat(e))}))}}var f;if("function"!=typeof i&&n(6),void 0!==o&&"function"!=typeof o&&n(7),t(r)){var c=w(e),s=R(e,r,void 0),v=!0;try{f=i(s),v=!1;}finally{v?O(c):g(c);}return "undefined"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P$1(n,c)}),(function(n){throw O(c),n})):(j(c,o),P$1(f,c))}if(!r||"object"!=typeof r){if(void 0===(f=i(r))&&(f=r),f===H&&(f=void 0),e.F&&d(f,!0),o){var p=[],l=[];b("Patches").M(r,f,p,l),o(p,l);}return f}n(21,r);},this.produceWithPatches=function(n,r){if("function"==typeof n)return function(r){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return e.produceWithPatches(r,(function(r){return n.apply(void 0,[r].concat(i))}))};var t,i,o=e.produce(n,r,(function(n,r){t=n,i=r;}));return "undefined"!=typeof Promise&&o instanceof Promise?o.then((function(n){return [n,t,i]})):[o,t,i]},"boolean"==typeof(null==r?void 0:r.useProxies)&&this.setUseProxies(r.useProxies),"boolean"==typeof(null==r?void 0:r.autoFreeze)&&this.setAutoFreeze(r.autoFreeze);}var i=e.prototype;return i.createDraft=function(e){t(e)||n(8),r(e)&&(e=D(e));var i=w(this),o=R(this,e,void 0);return o[Q].C=!0,g(i),o},i.finishDraft=function(r,t){var e=r&&r[Q];"production"!==process.env.NODE_ENV&&(e&&e.C||n(9),e.I&&n(10));var i=e.A;return j(i,t),P$1(void 0,i)},i.setAutoFreeze=function(n){this.F=n;},i.setUseProxies=function(r){r&&!B&&n(20),this.g=r;},i.applyPatches=function(n,t){var e;for(e=t.length-1;e>=0;e--){var i=t[e];if(0===i.path.length&&"replace"===i.op){n=i.value;break}}e>-1&&(t=t.slice(e+1));var o=b("Patches").$;return r(n)?o(n,t):this.produce(n,(function(n){return o(n,t)}))},e}(),an=new un,fn=an.produce;an.produceWithPatches.bind(an);an.setAutoFreeze.bind(an);an.setUseProxies.bind(an);an.applyPatches.bind(an);an.createDraft.bind(an);an.finishDraft.bind(an);
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The immer middleware turns the `set` method into a proxy for the immer `produce` method.
|
|
7
|
+
* https://immerjs.github.io/immer/
|
|
8
|
+
*
|
|
9
|
+
* The TypeScript magic is taken from here:
|
|
10
|
+
* https://github.com/pmndrs/zustand/blob/main/tests/middlewareTypes.test.tsx
|
|
11
|
+
*/
|
|
12
|
+
const immer = (config) => (set, get, api) => {
|
|
13
|
+
// see https://github.com/pmndrs/zustand/issues/449#issuecomment-873777576
|
|
14
|
+
api.setState = (fn$1) => set(fn(fn$1));
|
|
15
|
+
return config((partial, replace) => {
|
|
16
|
+
const nextState = typeof partial === "function"
|
|
17
|
+
? fn(partial)
|
|
18
|
+
: partial;
|
|
19
|
+
return set(nextState, replace);
|
|
20
|
+
}, get, api);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function createStore(createState) {
|
|
24
|
+
let state;
|
|
25
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
26
|
+
const setState = (partial, replace) => {
|
|
27
|
+
const nextState = typeof partial === "function" ? partial(state) : partial;
|
|
28
|
+
if (nextState !== state) {
|
|
29
|
+
const previousState = state;
|
|
30
|
+
state = replace ? nextState : Object.assign({}, state, nextState);
|
|
31
|
+
listeners.forEach((listener) => listener(state, previousState));
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const getState = () => state;
|
|
35
|
+
const subscribeWithSelector = (listener, selector = getState, equalityFn = Object.is) => {
|
|
36
|
+
console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");
|
|
37
|
+
let currentSlice = selector(state);
|
|
38
|
+
function listenerToAdd() {
|
|
39
|
+
const nextSlice = selector(state);
|
|
40
|
+
if (!equalityFn(currentSlice, nextSlice)) {
|
|
41
|
+
const previousSlice = currentSlice;
|
|
42
|
+
listener(currentSlice = nextSlice, previousSlice);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
listeners.add(listenerToAdd);
|
|
46
|
+
return () => listeners.delete(listenerToAdd);
|
|
47
|
+
};
|
|
48
|
+
const subscribe = (listener, selector, equalityFn) => {
|
|
49
|
+
if (selector || equalityFn) {
|
|
50
|
+
return subscribeWithSelector(listener, selector, equalityFn);
|
|
51
|
+
}
|
|
52
|
+
listeners.add(listener);
|
|
53
|
+
return () => listeners.delete(listener);
|
|
54
|
+
};
|
|
55
|
+
const destroy = () => listeners.clear();
|
|
56
|
+
const api = { setState, getState, subscribe, destroy };
|
|
57
|
+
state = createState(setState, getState, api);
|
|
58
|
+
return api;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const isSSR = typeof window === "undefined" || !window.navigator || /ServerSideRendering|^Deno\//.test(window.navigator.userAgent);
|
|
62
|
+
const useIsomorphicLayoutEffect = isSSR ? useEffect : useLayoutEffect;
|
|
63
|
+
function create(createState) {
|
|
64
|
+
const api = typeof createState === "function" ? createStore(createState) : createState;
|
|
65
|
+
const useStore = (selector = api.getState, equalityFn = Object.is) => {
|
|
66
|
+
const [, forceUpdate] = useReducer((c) => c + 1, 0);
|
|
67
|
+
const state = api.getState();
|
|
68
|
+
const stateRef = useRef(state);
|
|
69
|
+
const selectorRef = useRef(selector);
|
|
70
|
+
const equalityFnRef = useRef(equalityFn);
|
|
71
|
+
const erroredRef = useRef(false);
|
|
72
|
+
const currentSliceRef = useRef();
|
|
73
|
+
if (currentSliceRef.current === void 0) {
|
|
74
|
+
currentSliceRef.current = selector(state);
|
|
75
|
+
}
|
|
76
|
+
let newStateSlice;
|
|
77
|
+
let hasNewStateSlice = false;
|
|
78
|
+
if (stateRef.current !== state || selectorRef.current !== selector || equalityFnRef.current !== equalityFn || erroredRef.current) {
|
|
79
|
+
newStateSlice = selector(state);
|
|
80
|
+
hasNewStateSlice = !equalityFn(currentSliceRef.current, newStateSlice);
|
|
81
|
+
}
|
|
82
|
+
useIsomorphicLayoutEffect(() => {
|
|
83
|
+
if (hasNewStateSlice) {
|
|
84
|
+
currentSliceRef.current = newStateSlice;
|
|
85
|
+
}
|
|
86
|
+
stateRef.current = state;
|
|
87
|
+
selectorRef.current = selector;
|
|
88
|
+
equalityFnRef.current = equalityFn;
|
|
89
|
+
erroredRef.current = false;
|
|
90
|
+
});
|
|
91
|
+
const stateBeforeSubscriptionRef = useRef(state);
|
|
92
|
+
useIsomorphicLayoutEffect(() => {
|
|
93
|
+
const listener = () => {
|
|
94
|
+
try {
|
|
95
|
+
const nextState = api.getState();
|
|
96
|
+
const nextStateSlice = selectorRef.current(nextState);
|
|
97
|
+
if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {
|
|
98
|
+
stateRef.current = nextState;
|
|
99
|
+
currentSliceRef.current = nextStateSlice;
|
|
100
|
+
forceUpdate();
|
|
101
|
+
}
|
|
102
|
+
} catch (error) {
|
|
103
|
+
erroredRef.current = true;
|
|
104
|
+
forceUpdate();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const unsubscribe = api.subscribe(listener);
|
|
108
|
+
if (api.getState() !== stateBeforeSubscriptionRef.current) {
|
|
109
|
+
listener();
|
|
110
|
+
}
|
|
111
|
+
return unsubscribe;
|
|
112
|
+
}, []);
|
|
113
|
+
const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;
|
|
114
|
+
useDebugValue(sliceToReturn);
|
|
115
|
+
return sliceToReturn;
|
|
116
|
+
};
|
|
117
|
+
Object.assign(useStore, api);
|
|
118
|
+
useStore[Symbol.iterator] = function() {
|
|
119
|
+
console.warn("[useStore, api] = create() is deprecated and will be removed in v4");
|
|
120
|
+
const items = [useStore, api];
|
|
121
|
+
return {
|
|
122
|
+
next() {
|
|
123
|
+
const done = items.length <= 0;
|
|
124
|
+
return { value: items.shift(), done };
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
return useStore;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function devtools(fn, options) {
|
|
132
|
+
return (set, get, api) => {
|
|
133
|
+
var _a;
|
|
134
|
+
let didWarnAboutNameDeprecation = false;
|
|
135
|
+
if (typeof options === "string" && !didWarnAboutNameDeprecation) {
|
|
136
|
+
console.warn("[zustand devtools middleware]: passing `name` as directly will be not allowed in next majorpass the `name` in an object `{ name: ... }` instead");
|
|
137
|
+
didWarnAboutNameDeprecation = true;
|
|
138
|
+
}
|
|
139
|
+
const devtoolsOptions = options === void 0 ? { name: void 0, anonymousActionType: void 0 } : typeof options === "string" ? { name: options } : options;
|
|
140
|
+
if (typeof ((_a = devtoolsOptions == null ? void 0 : devtoolsOptions.serialize) == null ? void 0 : _a.options) !== "undefined") {
|
|
141
|
+
console.warn("[zustand devtools middleware]: `serialize.options` is deprecated, just use `serialize`");
|
|
142
|
+
}
|
|
143
|
+
let extensionConnector;
|
|
144
|
+
try {
|
|
145
|
+
extensionConnector = window.__REDUX_DEVTOOLS_EXTENSION__ || window.top.__REDUX_DEVTOOLS_EXTENSION__;
|
|
146
|
+
} catch {
|
|
147
|
+
}
|
|
148
|
+
if (!extensionConnector) {
|
|
149
|
+
if ((import.meta.env && import.meta.env.MODE) !== "production" && typeof window !== "undefined") {
|
|
150
|
+
console.warn("[zustand devtools middleware] Please install/enable Redux devtools extension");
|
|
151
|
+
}
|
|
152
|
+
return fn(set, get, api);
|
|
153
|
+
}
|
|
154
|
+
let extension = Object.create(extensionConnector.connect(devtoolsOptions));
|
|
155
|
+
let didWarnAboutDevtools = false;
|
|
156
|
+
Object.defineProperty(api, "devtools", {
|
|
157
|
+
get: () => {
|
|
158
|
+
if (!didWarnAboutDevtools) {
|
|
159
|
+
console.warn("[zustand devtools middleware] `devtools` property on the store is deprecated it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
|
|
160
|
+
didWarnAboutDevtools = true;
|
|
161
|
+
}
|
|
162
|
+
return extension;
|
|
163
|
+
},
|
|
164
|
+
set: (value) => {
|
|
165
|
+
if (!didWarnAboutDevtools) {
|
|
166
|
+
console.warn("[zustand devtools middleware] `api.devtools` is deprecated, it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
|
|
167
|
+
didWarnAboutDevtools = true;
|
|
168
|
+
}
|
|
169
|
+
extension = value;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
let didWarnAboutPrefix = false;
|
|
173
|
+
Object.defineProperty(extension, "prefix", {
|
|
174
|
+
get: () => {
|
|
175
|
+
if (!didWarnAboutPrefix) {
|
|
176
|
+
console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
|
|
177
|
+
didWarnAboutPrefix = true;
|
|
178
|
+
}
|
|
179
|
+
return "";
|
|
180
|
+
},
|
|
181
|
+
set: () => {
|
|
182
|
+
if (!didWarnAboutPrefix) {
|
|
183
|
+
console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
|
|
184
|
+
didWarnAboutPrefix = true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
let isRecording = true;
|
|
189
|
+
api.setState = (state, replace, nameOrAction) => {
|
|
190
|
+
set(state, replace);
|
|
191
|
+
if (!isRecording)
|
|
192
|
+
return;
|
|
193
|
+
extension.send(nameOrAction === void 0 ? { type: devtoolsOptions.anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction, get());
|
|
194
|
+
};
|
|
195
|
+
const setStateFromDevtools = (...a) => {
|
|
196
|
+
const originalIsRecording = isRecording;
|
|
197
|
+
isRecording = false;
|
|
198
|
+
set(...a);
|
|
199
|
+
isRecording = originalIsRecording;
|
|
200
|
+
};
|
|
201
|
+
const initialState = fn(api.setState, get, api);
|
|
202
|
+
extension.init(initialState);
|
|
203
|
+
if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
|
|
204
|
+
let didWarnAboutReservedActionType = false;
|
|
205
|
+
const originalDispatch = api.dispatch;
|
|
206
|
+
api.dispatch = (...a) => {
|
|
207
|
+
if (a[0].type === "__setState" && !didWarnAboutReservedActionType) {
|
|
208
|
+
console.warn('[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.');
|
|
209
|
+
didWarnAboutReservedActionType = true;
|
|
210
|
+
}
|
|
211
|
+
originalDispatch(...a);
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
extension.subscribe((message) => {
|
|
215
|
+
var _a2;
|
|
216
|
+
switch (message.type) {
|
|
217
|
+
case "ACTION":
|
|
218
|
+
if (typeof message.payload !== "string") {
|
|
219
|
+
console.error("[zustand devtools middleware] Unsupported action format");
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
return parseJsonThen(message.payload, (action) => {
|
|
223
|
+
if (action.type === "__setState") {
|
|
224
|
+
setStateFromDevtools(action.state);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (!api.dispatchFromDevtools)
|
|
228
|
+
return;
|
|
229
|
+
if (typeof api.dispatch !== "function")
|
|
230
|
+
return;
|
|
231
|
+
api.dispatch(action);
|
|
232
|
+
});
|
|
233
|
+
case "DISPATCH":
|
|
234
|
+
switch (message.payload.type) {
|
|
235
|
+
case "RESET":
|
|
236
|
+
setStateFromDevtools(initialState);
|
|
237
|
+
return extension.init(api.getState());
|
|
238
|
+
case "COMMIT":
|
|
239
|
+
return extension.init(api.getState());
|
|
240
|
+
case "ROLLBACK":
|
|
241
|
+
return parseJsonThen(message.state, (state) => {
|
|
242
|
+
setStateFromDevtools(state);
|
|
243
|
+
extension.init(api.getState());
|
|
244
|
+
});
|
|
245
|
+
case "JUMP_TO_STATE":
|
|
246
|
+
case "JUMP_TO_ACTION":
|
|
247
|
+
return parseJsonThen(message.state, (state) => {
|
|
248
|
+
setStateFromDevtools(state);
|
|
249
|
+
});
|
|
250
|
+
case "IMPORT_STATE": {
|
|
251
|
+
const { nextLiftedState } = message.payload;
|
|
252
|
+
const lastComputedState = (_a2 = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a2.state;
|
|
253
|
+
if (!lastComputedState)
|
|
254
|
+
return;
|
|
255
|
+
setStateFromDevtools(lastComputedState);
|
|
256
|
+
extension.send(null, nextLiftedState);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
case "PAUSE_RECORDING":
|
|
260
|
+
return isRecording = !isRecording;
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
return initialState;
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const parseJsonThen = (stringified, f) => {
|
|
269
|
+
let parsed;
|
|
270
|
+
try {
|
|
271
|
+
parsed = JSON.parse(stringified);
|
|
272
|
+
} catch (e) {
|
|
273
|
+
console.error("[zustand devtools middleware] Could not parse the received json", e);
|
|
274
|
+
}
|
|
275
|
+
if (parsed !== void 0)
|
|
276
|
+
f(parsed);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
var __defProp = Object.defineProperty;
|
|
280
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
281
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
282
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
283
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
284
|
+
var __spreadValues = (a, b) => {
|
|
285
|
+
for (var prop in b || (b = {}))
|
|
286
|
+
if (__hasOwnProp.call(b, prop))
|
|
287
|
+
__defNormalProp(a, prop, b[prop]);
|
|
288
|
+
if (__getOwnPropSymbols)
|
|
289
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
290
|
+
if (__propIsEnum.call(b, prop))
|
|
291
|
+
__defNormalProp(a, prop, b[prop]);
|
|
292
|
+
}
|
|
293
|
+
return a;
|
|
294
|
+
};
|
|
295
|
+
const toThenable = (fn) => (input) => {
|
|
296
|
+
try {
|
|
297
|
+
const result = fn(input);
|
|
298
|
+
if (result instanceof Promise) {
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
then(onFulfilled) {
|
|
303
|
+
return toThenable(onFulfilled)(result);
|
|
304
|
+
},
|
|
305
|
+
catch(_onRejected) {
|
|
306
|
+
return this;
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
} catch (e) {
|
|
310
|
+
return {
|
|
311
|
+
then(_onFulfilled) {
|
|
312
|
+
return this;
|
|
313
|
+
},
|
|
314
|
+
catch(onRejected) {
|
|
315
|
+
return toThenable(onRejected)(e);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
const persist = (config, baseOptions) => (set, get, api) => {
|
|
321
|
+
let options = __spreadValues({
|
|
322
|
+
getStorage: () => localStorage,
|
|
323
|
+
serialize: JSON.stringify,
|
|
324
|
+
deserialize: JSON.parse,
|
|
325
|
+
partialize: (state) => state,
|
|
326
|
+
version: 0,
|
|
327
|
+
merge: (persistedState, currentState) => __spreadValues(__spreadValues({}, currentState), persistedState)
|
|
328
|
+
}, baseOptions);
|
|
329
|
+
if (options.blacklist || options.whitelist) {
|
|
330
|
+
console.warn(`The ${options.blacklist ? "blacklist" : "whitelist"} option is deprecated and will be removed in the next version. Please use the 'partialize' option instead.`);
|
|
331
|
+
}
|
|
332
|
+
let hasHydrated = false;
|
|
333
|
+
const hydrationListeners = /* @__PURE__ */ new Set();
|
|
334
|
+
const finishHydrationListeners = /* @__PURE__ */ new Set();
|
|
335
|
+
let storage;
|
|
336
|
+
try {
|
|
337
|
+
storage = options.getStorage();
|
|
338
|
+
} catch (e) {
|
|
339
|
+
}
|
|
340
|
+
if (!storage) {
|
|
341
|
+
return config((...args) => {
|
|
342
|
+
console.warn(`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`);
|
|
343
|
+
set(...args);
|
|
344
|
+
}, get, api);
|
|
345
|
+
} else if (!storage.removeItem) {
|
|
346
|
+
console.warn(`[zustand persist middleware] The given storage for item '${options.name}' does not contain a 'removeItem' method, which will be required in v4.`);
|
|
347
|
+
}
|
|
348
|
+
const thenableSerialize = toThenable(options.serialize);
|
|
349
|
+
const setItem = () => {
|
|
350
|
+
const state = options.partialize(__spreadValues({}, get()));
|
|
351
|
+
if (options.whitelist) {
|
|
352
|
+
Object.keys(state).forEach((key) => {
|
|
353
|
+
var _a;
|
|
354
|
+
!((_a = options.whitelist) == null ? void 0 : _a.includes(key)) && delete state[key];
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
if (options.blacklist) {
|
|
358
|
+
options.blacklist.forEach((key) => delete state[key]);
|
|
359
|
+
}
|
|
360
|
+
let errorInSync;
|
|
361
|
+
const thenable = thenableSerialize({ state, version: options.version }).then((serializedValue) => storage.setItem(options.name, serializedValue)).catch((e) => {
|
|
362
|
+
errorInSync = e;
|
|
363
|
+
});
|
|
364
|
+
if (errorInSync) {
|
|
365
|
+
throw errorInSync;
|
|
366
|
+
}
|
|
367
|
+
return thenable;
|
|
368
|
+
};
|
|
369
|
+
const savedSetState = api.setState;
|
|
370
|
+
api.setState = (state, replace) => {
|
|
371
|
+
savedSetState(state, replace);
|
|
372
|
+
void setItem();
|
|
373
|
+
};
|
|
374
|
+
const configResult = config((...args) => {
|
|
375
|
+
set(...args);
|
|
376
|
+
void setItem();
|
|
377
|
+
}, get, api);
|
|
378
|
+
let stateFromStorage;
|
|
379
|
+
const hydrate = () => {
|
|
380
|
+
var _a;
|
|
381
|
+
if (!storage)
|
|
382
|
+
return;
|
|
383
|
+
hasHydrated = false;
|
|
384
|
+
hydrationListeners.forEach((cb) => cb(get()));
|
|
385
|
+
const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;
|
|
386
|
+
return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {
|
|
387
|
+
if (storageValue) {
|
|
388
|
+
return options.deserialize(storageValue);
|
|
389
|
+
}
|
|
390
|
+
}).then((deserializedStorageValue) => {
|
|
391
|
+
if (deserializedStorageValue) {
|
|
392
|
+
if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
|
|
393
|
+
if (options.migrate) {
|
|
394
|
+
return options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);
|
|
395
|
+
}
|
|
396
|
+
console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`);
|
|
397
|
+
} else {
|
|
398
|
+
return deserializedStorageValue.state;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}).then((migratedState) => {
|
|
402
|
+
var _a2;
|
|
403
|
+
stateFromStorage = options.merge(migratedState, (_a2 = get()) != null ? _a2 : configResult);
|
|
404
|
+
set(stateFromStorage, true);
|
|
405
|
+
return setItem();
|
|
406
|
+
}).then(() => {
|
|
407
|
+
postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);
|
|
408
|
+
hasHydrated = true;
|
|
409
|
+
finishHydrationListeners.forEach((cb) => cb(stateFromStorage));
|
|
410
|
+
}).catch((e) => {
|
|
411
|
+
postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);
|
|
412
|
+
});
|
|
413
|
+
};
|
|
414
|
+
api.persist = {
|
|
415
|
+
setOptions: (newOptions) => {
|
|
416
|
+
options = __spreadValues(__spreadValues({}, options), newOptions);
|
|
417
|
+
if (newOptions.getStorage) {
|
|
418
|
+
storage = newOptions.getStorage();
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
clearStorage: () => {
|
|
422
|
+
var _a;
|
|
423
|
+
(_a = storage == null ? void 0 : storage.removeItem) == null ? void 0 : _a.call(storage, options.name);
|
|
424
|
+
},
|
|
425
|
+
rehydrate: () => hydrate(),
|
|
426
|
+
hasHydrated: () => hasHydrated,
|
|
427
|
+
onHydrate: (cb) => {
|
|
428
|
+
hydrationListeners.add(cb);
|
|
429
|
+
return () => {
|
|
430
|
+
hydrationListeners.delete(cb);
|
|
431
|
+
};
|
|
432
|
+
},
|
|
433
|
+
onFinishHydration: (cb) => {
|
|
434
|
+
finishHydrationListeners.add(cb);
|
|
435
|
+
return () => {
|
|
436
|
+
finishHydrationListeners.delete(cb);
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
hydrate();
|
|
441
|
+
return stateFromStorage || configResult;
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const walletStoreSelector = (state) => ({
|
|
445
|
+
accounts: state.accounts,
|
|
446
|
+
activeAccount: state.activeAccount,
|
|
447
|
+
setActiveAccount: state.setActiveAccount,
|
|
448
|
+
clearActiveAccount: state.clearActiveAccount,
|
|
449
|
+
addAccounts: state.addAccounts,
|
|
450
|
+
removeAccounts: state.removeAccounts,
|
|
451
|
+
});
|
|
452
|
+
const useWalletStore = create(devtools(persist(immer((set, _get) => ({
|
|
453
|
+
accounts: [],
|
|
454
|
+
activeAccount: null,
|
|
455
|
+
setActiveAccount: (account) => {
|
|
456
|
+
set((state) => {
|
|
457
|
+
state.activeAccount = account;
|
|
458
|
+
});
|
|
459
|
+
},
|
|
460
|
+
clearActiveAccount: (id) => {
|
|
461
|
+
set((state) => {
|
|
462
|
+
if (id === state.activeAccount?.providerId)
|
|
463
|
+
state.activeAccount = null;
|
|
464
|
+
});
|
|
465
|
+
},
|
|
466
|
+
addAccounts: (accounts) => {
|
|
467
|
+
set((state) => {
|
|
468
|
+
const uniqueAccounts = [...state.accounts, ...accounts].reduce((uniqueAccounts, o) => {
|
|
469
|
+
if (!uniqueAccounts.some((obj) => obj.providerId === o.providerId && obj.address === o.address)) {
|
|
470
|
+
uniqueAccounts.push(o);
|
|
471
|
+
}
|
|
472
|
+
return uniqueAccounts;
|
|
473
|
+
}, []);
|
|
474
|
+
// Remove duplicates that occur when a user reconnects Pera wallet
|
|
475
|
+
state.accounts = uniqueAccounts;
|
|
476
|
+
});
|
|
477
|
+
},
|
|
478
|
+
removeAccounts: (providerId) => {
|
|
479
|
+
set((state) => {
|
|
480
|
+
state.accounts = state.accounts.filter((account) => account.providerId !== providerId);
|
|
481
|
+
});
|
|
482
|
+
},
|
|
483
|
+
})), {
|
|
484
|
+
name: "txnlab-use-wallet",
|
|
485
|
+
version: 0, // increment to deprecate stored data
|
|
486
|
+
}), { name: "local-storage" } // prefix in Redux DevTools
|
|
487
|
+
));
|
|
488
|
+
|
|
489
|
+
var PROVIDER_ID;
|
|
490
|
+
(function (PROVIDER_ID) {
|
|
491
|
+
PROVIDER_ID["PERA_WALLET"] = "Pera Wallet";
|
|
492
|
+
PROVIDER_ID["MYALGO_WALLET"] = "MyAlgo Wallet";
|
|
493
|
+
PROVIDER_ID["ALGO_SIGNER"] = "Algo Signer";
|
|
494
|
+
PROVIDER_ID["DEFLY"] = "Defly";
|
|
495
|
+
PROVIDER_ID["EXODUS"] = "Exodus";
|
|
496
|
+
})(PROVIDER_ID || (PROVIDER_ID = {}));
|
|
497
|
+
const NODE_SERVER = "https://node.algoexplorerapi.io";
|
|
498
|
+
const NODE_TOKEN = "";
|
|
499
|
+
const NODE_PORT = "";
|
|
500
|
+
|
|
501
|
+
/*
|
|
502
|
+
* big.js v6.2.1
|
|
503
|
+
* A small, fast, easy-to-use library for arbitrary-precision decimal arithmetic.
|
|
504
|
+
* Copyright (c) 2022 Michael Mclaughlin
|
|
505
|
+
* https://github.com/MikeMcl/big.js/LICENCE.md
|
|
506
|
+
*/
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
/************************************** EDITABLE DEFAULTS *****************************************/
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
// The default values below must be integers within the stated ranges.
|
|
513
|
+
|
|
514
|
+
/*
|
|
515
|
+
* The maximum number of decimal places (DP) of the results of operations involving division:
|
|
516
|
+
* div and sqrt, and pow with negative exponents.
|
|
517
|
+
*/
|
|
518
|
+
var // The maximum value of DP and Big.DP.
|
|
519
|
+
MAX_DP = 1E6, // 0 to 1000000
|
|
520
|
+
|
|
521
|
+
// The maximum magnitude of the exponent argument to the pow method.
|
|
522
|
+
MAX_POWER = 1E6, // 1 to 1000000
|
|
523
|
+
|
|
524
|
+
/**************************************************************************************************/
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
// Error messages.
|
|
528
|
+
NAME = '[big.js] ',
|
|
529
|
+
INVALID = NAME + 'Invalid ',
|
|
530
|
+
INVALID_DP = INVALID + 'decimal places',
|
|
531
|
+
INVALID_RM = INVALID + 'rounding mode',
|
|
532
|
+
DIV_BY_ZERO = NAME + 'Division by zero',
|
|
533
|
+
|
|
534
|
+
// The shared prototype object.
|
|
535
|
+
P = {},
|
|
536
|
+
UNDEFINED = void 0;
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
/*
|
|
540
|
+
* Round Big x to a maximum of sd significant digits using rounding mode rm.
|
|
541
|
+
*
|
|
542
|
+
* x {Big} The Big to round.
|
|
543
|
+
* sd {number} Significant digits: integer, 0 to MAX_DP inclusive.
|
|
544
|
+
* rm {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).
|
|
545
|
+
* [more] {boolean} Whether the result of division was truncated.
|
|
546
|
+
*/
|
|
547
|
+
function round(x, sd, rm, more) {
|
|
548
|
+
var xc = x.c;
|
|
549
|
+
|
|
550
|
+
if (rm === UNDEFINED) rm = x.constructor.RM;
|
|
551
|
+
if (rm !== 0 && rm !== 1 && rm !== 2 && rm !== 3) {
|
|
552
|
+
throw Error(INVALID_RM);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (sd < 1) {
|
|
556
|
+
more =
|
|
557
|
+
rm === 3 && (more || !!xc[0]) || sd === 0 && (
|
|
558
|
+
rm === 1 && xc[0] >= 5 ||
|
|
559
|
+
rm === 2 && (xc[0] > 5 || xc[0] === 5 && (more || xc[1] !== UNDEFINED))
|
|
560
|
+
);
|
|
561
|
+
|
|
562
|
+
xc.length = 1;
|
|
563
|
+
|
|
564
|
+
if (more) {
|
|
565
|
+
|
|
566
|
+
// 1, 0.1, 0.01, 0.001, 0.0001 etc.
|
|
567
|
+
x.e = x.e - sd + 1;
|
|
568
|
+
xc[0] = 1;
|
|
569
|
+
} else {
|
|
570
|
+
|
|
571
|
+
// Zero.
|
|
572
|
+
xc[0] = x.e = 0;
|
|
573
|
+
}
|
|
574
|
+
} else if (sd < xc.length) {
|
|
575
|
+
|
|
576
|
+
// xc[sd] is the digit after the digit that may be rounded up.
|
|
577
|
+
more =
|
|
578
|
+
rm === 1 && xc[sd] >= 5 ||
|
|
579
|
+
rm === 2 && (xc[sd] > 5 || xc[sd] === 5 &&
|
|
580
|
+
(more || xc[sd + 1] !== UNDEFINED || xc[sd - 1] & 1)) ||
|
|
581
|
+
rm === 3 && (more || !!xc[0]);
|
|
582
|
+
|
|
583
|
+
// Remove any digits after the required precision.
|
|
584
|
+
xc.length = sd;
|
|
585
|
+
|
|
586
|
+
// Round up?
|
|
587
|
+
if (more) {
|
|
588
|
+
|
|
589
|
+
// Rounding up may mean the previous digit has to be rounded up.
|
|
590
|
+
for (; ++xc[--sd] > 9;) {
|
|
591
|
+
xc[sd] = 0;
|
|
592
|
+
if (sd === 0) {
|
|
593
|
+
++x.e;
|
|
594
|
+
xc.unshift(1);
|
|
595
|
+
break;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Remove trailing zeros.
|
|
601
|
+
for (sd = xc.length; !xc[--sd];) xc.pop();
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
return x;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
/*
|
|
609
|
+
* Return a string representing the value of Big x in normal or exponential notation.
|
|
610
|
+
* Handles P.toExponential, P.toFixed, P.toJSON, P.toPrecision, P.toString and P.valueOf.
|
|
611
|
+
*/
|
|
612
|
+
function stringify(x, doExponential, isNonzero) {
|
|
613
|
+
var e = x.e,
|
|
614
|
+
s = x.c.join(''),
|
|
615
|
+
n = s.length;
|
|
616
|
+
|
|
617
|
+
// Exponential notation?
|
|
618
|
+
if (doExponential) {
|
|
619
|
+
s = s.charAt(0) + (n > 1 ? '.' + s.slice(1) : '') + (e < 0 ? 'e' : 'e+') + e;
|
|
620
|
+
|
|
621
|
+
// Normal notation.
|
|
622
|
+
} else if (e < 0) {
|
|
623
|
+
for (; ++e;) s = '0' + s;
|
|
624
|
+
s = '0.' + s;
|
|
625
|
+
} else if (e > 0) {
|
|
626
|
+
if (++e > n) {
|
|
627
|
+
for (e -= n; e--;) s += '0';
|
|
628
|
+
} else if (e < n) {
|
|
629
|
+
s = s.slice(0, e) + '.' + s.slice(e);
|
|
630
|
+
}
|
|
631
|
+
} else if (n > 1) {
|
|
632
|
+
s = s.charAt(0) + '.' + s.slice(1);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
return x.s < 0 && isNonzero ? '-' + s : s;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
// Prototype/instance methods
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
/*
|
|
643
|
+
* Return a new Big whose value is the absolute value of this Big.
|
|
644
|
+
*/
|
|
645
|
+
P.abs = function () {
|
|
646
|
+
var x = new this.constructor(this);
|
|
647
|
+
x.s = 1;
|
|
648
|
+
return x;
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
/*
|
|
653
|
+
* Return 1 if the value of this Big is greater than the value of Big y,
|
|
654
|
+
* -1 if the value of this Big is less than the value of Big y, or
|
|
655
|
+
* 0 if they have the same value.
|
|
656
|
+
*/
|
|
657
|
+
P.cmp = function (y) {
|
|
658
|
+
var isneg,
|
|
659
|
+
x = this,
|
|
660
|
+
xc = x.c,
|
|
661
|
+
yc = (y = new x.constructor(y)).c,
|
|
662
|
+
i = x.s,
|
|
663
|
+
j = y.s,
|
|
664
|
+
k = x.e,
|
|
665
|
+
l = y.e;
|
|
666
|
+
|
|
667
|
+
// Either zero?
|
|
668
|
+
if (!xc[0] || !yc[0]) return !xc[0] ? !yc[0] ? 0 : -j : i;
|
|
669
|
+
|
|
670
|
+
// Signs differ?
|
|
671
|
+
if (i != j) return i;
|
|
672
|
+
|
|
673
|
+
isneg = i < 0;
|
|
674
|
+
|
|
675
|
+
// Compare exponents.
|
|
676
|
+
if (k != l) return k > l ^ isneg ? 1 : -1;
|
|
677
|
+
|
|
678
|
+
j = (k = xc.length) < (l = yc.length) ? k : l;
|
|
679
|
+
|
|
680
|
+
// Compare digit by digit.
|
|
681
|
+
for (i = -1; ++i < j;) {
|
|
682
|
+
if (xc[i] != yc[i]) return xc[i] > yc[i] ^ isneg ? 1 : -1;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// Compare lengths.
|
|
686
|
+
return k == l ? 0 : k > l ^ isneg ? 1 : -1;
|
|
687
|
+
};
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
/*
|
|
691
|
+
* Return a new Big whose value is the value of this Big divided by the value of Big y, rounded,
|
|
692
|
+
* if necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM.
|
|
693
|
+
*/
|
|
694
|
+
P.div = function (y) {
|
|
695
|
+
var x = this,
|
|
696
|
+
Big = x.constructor,
|
|
697
|
+
a = x.c, // dividend
|
|
698
|
+
b = (y = new Big(y)).c, // divisor
|
|
699
|
+
k = x.s == y.s ? 1 : -1,
|
|
700
|
+
dp = Big.DP;
|
|
701
|
+
|
|
702
|
+
if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {
|
|
703
|
+
throw Error(INVALID_DP);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Divisor is zero?
|
|
707
|
+
if (!b[0]) {
|
|
708
|
+
throw Error(DIV_BY_ZERO);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// Dividend is 0? Return +-0.
|
|
712
|
+
if (!a[0]) {
|
|
713
|
+
y.s = k;
|
|
714
|
+
y.c = [y.e = 0];
|
|
715
|
+
return y;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
var bl, bt, n, cmp, ri,
|
|
719
|
+
bz = b.slice(),
|
|
720
|
+
ai = bl = b.length,
|
|
721
|
+
al = a.length,
|
|
722
|
+
r = a.slice(0, bl), // remainder
|
|
723
|
+
rl = r.length,
|
|
724
|
+
q = y, // quotient
|
|
725
|
+
qc = q.c = [],
|
|
726
|
+
qi = 0,
|
|
727
|
+
p = dp + (q.e = x.e - y.e) + 1; // precision of the result
|
|
728
|
+
|
|
729
|
+
q.s = k;
|
|
730
|
+
k = p < 0 ? 0 : p;
|
|
731
|
+
|
|
732
|
+
// Create version of divisor with leading zero.
|
|
733
|
+
bz.unshift(0);
|
|
734
|
+
|
|
735
|
+
// Add zeros to make remainder as long as divisor.
|
|
736
|
+
for (; rl++ < bl;) r.push(0);
|
|
737
|
+
|
|
738
|
+
do {
|
|
739
|
+
|
|
740
|
+
// n is how many times the divisor goes into current remainder.
|
|
741
|
+
for (n = 0; n < 10; n++) {
|
|
742
|
+
|
|
743
|
+
// Compare divisor and remainder.
|
|
744
|
+
if (bl != (rl = r.length)) {
|
|
745
|
+
cmp = bl > rl ? 1 : -1;
|
|
746
|
+
} else {
|
|
747
|
+
for (ri = -1, cmp = 0; ++ri < bl;) {
|
|
748
|
+
if (b[ri] != r[ri]) {
|
|
749
|
+
cmp = b[ri] > r[ri] ? 1 : -1;
|
|
750
|
+
break;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// If divisor < remainder, subtract divisor from remainder.
|
|
756
|
+
if (cmp < 0) {
|
|
757
|
+
|
|
758
|
+
// Remainder can't be more than 1 digit longer than divisor.
|
|
759
|
+
// Equalise lengths using divisor with extra leading zero?
|
|
760
|
+
for (bt = rl == bl ? b : bz; rl;) {
|
|
761
|
+
if (r[--rl] < bt[rl]) {
|
|
762
|
+
ri = rl;
|
|
763
|
+
for (; ri && !r[--ri];) r[ri] = 9;
|
|
764
|
+
--r[ri];
|
|
765
|
+
r[rl] += 10;
|
|
766
|
+
}
|
|
767
|
+
r[rl] -= bt[rl];
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
for (; !r[0];) r.shift();
|
|
771
|
+
} else {
|
|
772
|
+
break;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
// Add the digit n to the result array.
|
|
777
|
+
qc[qi++] = cmp ? n : ++n;
|
|
778
|
+
|
|
779
|
+
// Update the remainder.
|
|
780
|
+
if (r[0] && cmp) r[rl] = a[ai] || 0;
|
|
781
|
+
else r = [a[ai]];
|
|
782
|
+
|
|
783
|
+
} while ((ai++ < al || r[0] !== UNDEFINED) && k--);
|
|
784
|
+
|
|
785
|
+
// Leading zero? Do not remove if result is simply zero (qi == 1).
|
|
786
|
+
if (!qc[0] && qi != 1) {
|
|
787
|
+
|
|
788
|
+
// There can't be more than one zero.
|
|
789
|
+
qc.shift();
|
|
790
|
+
q.e--;
|
|
791
|
+
p--;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Round?
|
|
795
|
+
if (qi > p) round(q, p, Big.RM, r[0] !== UNDEFINED);
|
|
796
|
+
|
|
797
|
+
return q;
|
|
798
|
+
};
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
/*
|
|
802
|
+
* Return true if the value of this Big is equal to the value of Big y, otherwise return false.
|
|
803
|
+
*/
|
|
804
|
+
P.eq = function (y) {
|
|
805
|
+
return this.cmp(y) === 0;
|
|
806
|
+
};
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
/*
|
|
810
|
+
* Return true if the value of this Big is greater than the value of Big y, otherwise return
|
|
811
|
+
* false.
|
|
812
|
+
*/
|
|
813
|
+
P.gt = function (y) {
|
|
814
|
+
return this.cmp(y) > 0;
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
/*
|
|
819
|
+
* Return true if the value of this Big is greater than or equal to the value of Big y, otherwise
|
|
820
|
+
* return false.
|
|
821
|
+
*/
|
|
822
|
+
P.gte = function (y) {
|
|
823
|
+
return this.cmp(y) > -1;
|
|
824
|
+
};
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
/*
|
|
828
|
+
* Return true if the value of this Big is less than the value of Big y, otherwise return false.
|
|
829
|
+
*/
|
|
830
|
+
P.lt = function (y) {
|
|
831
|
+
return this.cmp(y) < 0;
|
|
832
|
+
};
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
/*
|
|
836
|
+
* Return true if the value of this Big is less than or equal to the value of Big y, otherwise
|
|
837
|
+
* return false.
|
|
838
|
+
*/
|
|
839
|
+
P.lte = function (y) {
|
|
840
|
+
return this.cmp(y) < 1;
|
|
841
|
+
};
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
/*
|
|
845
|
+
* Return a new Big whose value is the value of this Big minus the value of Big y.
|
|
846
|
+
*/
|
|
847
|
+
P.minus = P.sub = function (y) {
|
|
848
|
+
var i, j, t, xlty,
|
|
849
|
+
x = this,
|
|
850
|
+
Big = x.constructor,
|
|
851
|
+
a = x.s,
|
|
852
|
+
b = (y = new Big(y)).s;
|
|
853
|
+
|
|
854
|
+
// Signs differ?
|
|
855
|
+
if (a != b) {
|
|
856
|
+
y.s = -b;
|
|
857
|
+
return x.plus(y);
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
var xc = x.c.slice(),
|
|
861
|
+
xe = x.e,
|
|
862
|
+
yc = y.c,
|
|
863
|
+
ye = y.e;
|
|
864
|
+
|
|
865
|
+
// Either zero?
|
|
866
|
+
if (!xc[0] || !yc[0]) {
|
|
867
|
+
if (yc[0]) {
|
|
868
|
+
y.s = -b;
|
|
869
|
+
} else if (xc[0]) {
|
|
870
|
+
y = new Big(x);
|
|
871
|
+
} else {
|
|
872
|
+
y.s = 1;
|
|
873
|
+
}
|
|
874
|
+
return y;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// Determine which is the bigger number. Prepend zeros to equalise exponents.
|
|
878
|
+
if (a = xe - ye) {
|
|
879
|
+
|
|
880
|
+
if (xlty = a < 0) {
|
|
881
|
+
a = -a;
|
|
882
|
+
t = xc;
|
|
883
|
+
} else {
|
|
884
|
+
ye = xe;
|
|
885
|
+
t = yc;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
t.reverse();
|
|
889
|
+
for (b = a; b--;) t.push(0);
|
|
890
|
+
t.reverse();
|
|
891
|
+
} else {
|
|
892
|
+
|
|
893
|
+
// Exponents equal. Check digit by digit.
|
|
894
|
+
j = ((xlty = xc.length < yc.length) ? xc : yc).length;
|
|
895
|
+
|
|
896
|
+
for (a = b = 0; b < j; b++) {
|
|
897
|
+
if (xc[b] != yc[b]) {
|
|
898
|
+
xlty = xc[b] < yc[b];
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// x < y? Point xc to the array of the bigger number.
|
|
905
|
+
if (xlty) {
|
|
906
|
+
t = xc;
|
|
907
|
+
xc = yc;
|
|
908
|
+
yc = t;
|
|
909
|
+
y.s = -y.s;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
/*
|
|
913
|
+
* Append zeros to xc if shorter. No need to add zeros to yc if shorter as subtraction only
|
|
914
|
+
* needs to start at yc.length.
|
|
915
|
+
*/
|
|
916
|
+
if ((b = (j = yc.length) - (i = xc.length)) > 0) for (; b--;) xc[i++] = 0;
|
|
917
|
+
|
|
918
|
+
// Subtract yc from xc.
|
|
919
|
+
for (b = i; j > a;) {
|
|
920
|
+
if (xc[--j] < yc[j]) {
|
|
921
|
+
for (i = j; i && !xc[--i];) xc[i] = 9;
|
|
922
|
+
--xc[i];
|
|
923
|
+
xc[j] += 10;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
xc[j] -= yc[j];
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// Remove trailing zeros.
|
|
930
|
+
for (; xc[--b] === 0;) xc.pop();
|
|
931
|
+
|
|
932
|
+
// Remove leading zeros and adjust exponent accordingly.
|
|
933
|
+
for (; xc[0] === 0;) {
|
|
934
|
+
xc.shift();
|
|
935
|
+
--ye;
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
if (!xc[0]) {
|
|
939
|
+
|
|
940
|
+
// n - n = +0
|
|
941
|
+
y.s = 1;
|
|
942
|
+
|
|
943
|
+
// Result must be zero.
|
|
944
|
+
xc = [ye = 0];
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
y.c = xc;
|
|
948
|
+
y.e = ye;
|
|
949
|
+
|
|
950
|
+
return y;
|
|
951
|
+
};
|
|
952
|
+
|
|
953
|
+
|
|
954
|
+
/*
|
|
955
|
+
* Return a new Big whose value is the value of this Big modulo the value of Big y.
|
|
956
|
+
*/
|
|
957
|
+
P.mod = function (y) {
|
|
958
|
+
var ygtx,
|
|
959
|
+
x = this,
|
|
960
|
+
Big = x.constructor,
|
|
961
|
+
a = x.s,
|
|
962
|
+
b = (y = new Big(y)).s;
|
|
963
|
+
|
|
964
|
+
if (!y.c[0]) {
|
|
965
|
+
throw Error(DIV_BY_ZERO);
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
x.s = y.s = 1;
|
|
969
|
+
ygtx = y.cmp(x) == 1;
|
|
970
|
+
x.s = a;
|
|
971
|
+
y.s = b;
|
|
972
|
+
|
|
973
|
+
if (ygtx) return new Big(x);
|
|
974
|
+
|
|
975
|
+
a = Big.DP;
|
|
976
|
+
b = Big.RM;
|
|
977
|
+
Big.DP = Big.RM = 0;
|
|
978
|
+
x = x.div(y);
|
|
979
|
+
Big.DP = a;
|
|
980
|
+
Big.RM = b;
|
|
981
|
+
|
|
982
|
+
return this.minus(x.times(y));
|
|
983
|
+
};
|
|
984
|
+
|
|
985
|
+
|
|
986
|
+
/*
|
|
987
|
+
* Return a new Big whose value is the value of this Big negated.
|
|
988
|
+
*/
|
|
989
|
+
P.neg = function () {
|
|
990
|
+
var x = new this.constructor(this);
|
|
991
|
+
x.s = -x.s;
|
|
992
|
+
return x;
|
|
993
|
+
};
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
/*
|
|
997
|
+
* Return a new Big whose value is the value of this Big plus the value of Big y.
|
|
998
|
+
*/
|
|
999
|
+
P.plus = P.add = function (y) {
|
|
1000
|
+
var e, k, t,
|
|
1001
|
+
x = this,
|
|
1002
|
+
Big = x.constructor;
|
|
1003
|
+
|
|
1004
|
+
y = new Big(y);
|
|
1005
|
+
|
|
1006
|
+
// Signs differ?
|
|
1007
|
+
if (x.s != y.s) {
|
|
1008
|
+
y.s = -y.s;
|
|
1009
|
+
return x.minus(y);
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
var xe = x.e,
|
|
1013
|
+
xc = x.c,
|
|
1014
|
+
ye = y.e,
|
|
1015
|
+
yc = y.c;
|
|
1016
|
+
|
|
1017
|
+
// Either zero?
|
|
1018
|
+
if (!xc[0] || !yc[0]) {
|
|
1019
|
+
if (!yc[0]) {
|
|
1020
|
+
if (xc[0]) {
|
|
1021
|
+
y = new Big(x);
|
|
1022
|
+
} else {
|
|
1023
|
+
y.s = x.s;
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
return y;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
xc = xc.slice();
|
|
1030
|
+
|
|
1031
|
+
// Prepend zeros to equalise exponents.
|
|
1032
|
+
// Note: reverse faster than unshifts.
|
|
1033
|
+
if (e = xe - ye) {
|
|
1034
|
+
if (e > 0) {
|
|
1035
|
+
ye = xe;
|
|
1036
|
+
t = yc;
|
|
1037
|
+
} else {
|
|
1038
|
+
e = -e;
|
|
1039
|
+
t = xc;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
t.reverse();
|
|
1043
|
+
for (; e--;) t.push(0);
|
|
1044
|
+
t.reverse();
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
// Point xc to the longer array.
|
|
1048
|
+
if (xc.length - yc.length < 0) {
|
|
1049
|
+
t = yc;
|
|
1050
|
+
yc = xc;
|
|
1051
|
+
xc = t;
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
e = yc.length;
|
|
1055
|
+
|
|
1056
|
+
// Only start adding at yc.length - 1 as the further digits of xc can be left as they are.
|
|
1057
|
+
for (k = 0; e; xc[e] %= 10) k = (xc[--e] = xc[e] + yc[e] + k) / 10 | 0;
|
|
1058
|
+
|
|
1059
|
+
// No need to check for zero, as +x + +y != 0 && -x + -y != 0
|
|
1060
|
+
|
|
1061
|
+
if (k) {
|
|
1062
|
+
xc.unshift(k);
|
|
1063
|
+
++ye;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
// Remove trailing zeros.
|
|
1067
|
+
for (e = xc.length; xc[--e] === 0;) xc.pop();
|
|
1068
|
+
|
|
1069
|
+
y.c = xc;
|
|
1070
|
+
y.e = ye;
|
|
1071
|
+
|
|
1072
|
+
return y;
|
|
1073
|
+
};
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
/*
|
|
1077
|
+
* Return a Big whose value is the value of this Big raised to the power n.
|
|
1078
|
+
* If n is negative, round to a maximum of Big.DP decimal places using rounding
|
|
1079
|
+
* mode Big.RM.
|
|
1080
|
+
*
|
|
1081
|
+
* n {number} Integer, -MAX_POWER to MAX_POWER inclusive.
|
|
1082
|
+
*/
|
|
1083
|
+
P.pow = function (n) {
|
|
1084
|
+
var x = this,
|
|
1085
|
+
one = new x.constructor('1'),
|
|
1086
|
+
y = one,
|
|
1087
|
+
isneg = n < 0;
|
|
1088
|
+
|
|
1089
|
+
if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) {
|
|
1090
|
+
throw Error(INVALID + 'exponent');
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
if (isneg) n = -n;
|
|
1094
|
+
|
|
1095
|
+
for (;;) {
|
|
1096
|
+
if (n & 1) y = y.times(x);
|
|
1097
|
+
n >>= 1;
|
|
1098
|
+
if (!n) break;
|
|
1099
|
+
x = x.times(x);
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
return isneg ? one.div(y) : y;
|
|
1103
|
+
};
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
/*
|
|
1107
|
+
* Return a new Big whose value is the value of this Big rounded to a maximum precision of sd
|
|
1108
|
+
* significant digits using rounding mode rm, or Big.RM if rm is not specified.
|
|
1109
|
+
*
|
|
1110
|
+
* sd {number} Significant digits: integer, 1 to MAX_DP inclusive.
|
|
1111
|
+
* rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).
|
|
1112
|
+
*/
|
|
1113
|
+
P.prec = function (sd, rm) {
|
|
1114
|
+
if (sd !== ~~sd || sd < 1 || sd > MAX_DP) {
|
|
1115
|
+
throw Error(INVALID + 'precision');
|
|
1116
|
+
}
|
|
1117
|
+
return round(new this.constructor(this), sd, rm);
|
|
1118
|
+
};
|
|
1119
|
+
|
|
1120
|
+
|
|
1121
|
+
/*
|
|
1122
|
+
* Return a new Big whose value is the value of this Big rounded to a maximum of dp decimal places
|
|
1123
|
+
* using rounding mode rm, or Big.RM if rm is not specified.
|
|
1124
|
+
* If dp is negative, round to an integer which is a multiple of 10**-dp.
|
|
1125
|
+
* If dp is not specified, round to 0 decimal places.
|
|
1126
|
+
*
|
|
1127
|
+
* dp? {number} Integer, -MAX_DP to MAX_DP inclusive.
|
|
1128
|
+
* rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).
|
|
1129
|
+
*/
|
|
1130
|
+
P.round = function (dp, rm) {
|
|
1131
|
+
if (dp === UNDEFINED) dp = 0;
|
|
1132
|
+
else if (dp !== ~~dp || dp < -MAX_DP || dp > MAX_DP) {
|
|
1133
|
+
throw Error(INVALID_DP);
|
|
1134
|
+
}
|
|
1135
|
+
return round(new this.constructor(this), dp + this.e + 1, rm);
|
|
1136
|
+
};
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
/*
|
|
1140
|
+
* Return a new Big whose value is the square root of the value of this Big, rounded, if
|
|
1141
|
+
* necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM.
|
|
1142
|
+
*/
|
|
1143
|
+
P.sqrt = function () {
|
|
1144
|
+
var r, c, t,
|
|
1145
|
+
x = this,
|
|
1146
|
+
Big = x.constructor,
|
|
1147
|
+
s = x.s,
|
|
1148
|
+
e = x.e,
|
|
1149
|
+
half = new Big('0.5');
|
|
1150
|
+
|
|
1151
|
+
// Zero?
|
|
1152
|
+
if (!x.c[0]) return new Big(x);
|
|
1153
|
+
|
|
1154
|
+
// Negative?
|
|
1155
|
+
if (s < 0) {
|
|
1156
|
+
throw Error(NAME + 'No square root');
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// Estimate.
|
|
1160
|
+
s = Math.sqrt(x + '');
|
|
1161
|
+
|
|
1162
|
+
// Math.sqrt underflow/overflow?
|
|
1163
|
+
// Re-estimate: pass x coefficient to Math.sqrt as integer, then adjust the result exponent.
|
|
1164
|
+
if (s === 0 || s === 1 / 0) {
|
|
1165
|
+
c = x.c.join('');
|
|
1166
|
+
if (!(c.length + e & 1)) c += '0';
|
|
1167
|
+
s = Math.sqrt(c);
|
|
1168
|
+
e = ((e + 1) / 2 | 0) - (e < 0 || e & 1);
|
|
1169
|
+
r = new Big((s == 1 / 0 ? '5e' : (s = s.toExponential()).slice(0, s.indexOf('e') + 1)) + e);
|
|
1170
|
+
} else {
|
|
1171
|
+
r = new Big(s + '');
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
e = r.e + (Big.DP += 4);
|
|
1175
|
+
|
|
1176
|
+
// Newton-Raphson iteration.
|
|
1177
|
+
do {
|
|
1178
|
+
t = r;
|
|
1179
|
+
r = half.times(t.plus(x.div(t)));
|
|
1180
|
+
} while (t.c.slice(0, e).join('') !== r.c.slice(0, e).join(''));
|
|
1181
|
+
|
|
1182
|
+
return round(r, (Big.DP -= 4) + r.e + 1, Big.RM);
|
|
1183
|
+
};
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
/*
|
|
1187
|
+
* Return a new Big whose value is the value of this Big times the value of Big y.
|
|
1188
|
+
*/
|
|
1189
|
+
P.times = P.mul = function (y) {
|
|
1190
|
+
var c,
|
|
1191
|
+
x = this,
|
|
1192
|
+
Big = x.constructor,
|
|
1193
|
+
xc = x.c,
|
|
1194
|
+
yc = (y = new Big(y)).c,
|
|
1195
|
+
a = xc.length,
|
|
1196
|
+
b = yc.length,
|
|
1197
|
+
i = x.e,
|
|
1198
|
+
j = y.e;
|
|
1199
|
+
|
|
1200
|
+
// Determine sign of result.
|
|
1201
|
+
y.s = x.s == y.s ? 1 : -1;
|
|
1202
|
+
|
|
1203
|
+
// Return signed 0 if either 0.
|
|
1204
|
+
if (!xc[0] || !yc[0]) {
|
|
1205
|
+
y.c = [y.e = 0];
|
|
1206
|
+
return y;
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
// Initialise exponent of result as x.e + y.e.
|
|
1210
|
+
y.e = i + j;
|
|
1211
|
+
|
|
1212
|
+
// If array xc has fewer digits than yc, swap xc and yc, and lengths.
|
|
1213
|
+
if (a < b) {
|
|
1214
|
+
c = xc;
|
|
1215
|
+
xc = yc;
|
|
1216
|
+
yc = c;
|
|
1217
|
+
j = a;
|
|
1218
|
+
a = b;
|
|
1219
|
+
b = j;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
// Initialise coefficient array of result with zeros.
|
|
1223
|
+
for (c = new Array(j = a + b); j--;) c[j] = 0;
|
|
1224
|
+
|
|
1225
|
+
// Multiply.
|
|
1226
|
+
|
|
1227
|
+
// i is initially xc.length.
|
|
1228
|
+
for (i = b; i--;) {
|
|
1229
|
+
b = 0;
|
|
1230
|
+
|
|
1231
|
+
// a is yc.length.
|
|
1232
|
+
for (j = a + i; j > i;) {
|
|
1233
|
+
|
|
1234
|
+
// Current sum of products at this digit position, plus carry.
|
|
1235
|
+
b = c[j] + yc[i] * xc[j - i - 1] + b;
|
|
1236
|
+
c[j--] = b % 10;
|
|
1237
|
+
|
|
1238
|
+
// carry
|
|
1239
|
+
b = b / 10 | 0;
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
c[j] = b;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
// Increment result exponent if there is a final carry, otherwise remove leading zero.
|
|
1246
|
+
if (b) ++y.e;
|
|
1247
|
+
else c.shift();
|
|
1248
|
+
|
|
1249
|
+
// Remove trailing zeros.
|
|
1250
|
+
for (i = c.length; !c[--i];) c.pop();
|
|
1251
|
+
y.c = c;
|
|
1252
|
+
|
|
1253
|
+
return y;
|
|
1254
|
+
};
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
/*
|
|
1258
|
+
* Return a string representing the value of this Big in exponential notation rounded to dp fixed
|
|
1259
|
+
* decimal places using rounding mode rm, or Big.RM if rm is not specified.
|
|
1260
|
+
*
|
|
1261
|
+
* dp? {number} Decimal places: integer, 0 to MAX_DP inclusive.
|
|
1262
|
+
* rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).
|
|
1263
|
+
*/
|
|
1264
|
+
P.toExponential = function (dp, rm) {
|
|
1265
|
+
var x = this,
|
|
1266
|
+
n = x.c[0];
|
|
1267
|
+
|
|
1268
|
+
if (dp !== UNDEFINED) {
|
|
1269
|
+
if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {
|
|
1270
|
+
throw Error(INVALID_DP);
|
|
1271
|
+
}
|
|
1272
|
+
x = round(new x.constructor(x), ++dp, rm);
|
|
1273
|
+
for (; x.c.length < dp;) x.c.push(0);
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
return stringify(x, true, !!n);
|
|
1277
|
+
};
|
|
1278
|
+
|
|
1279
|
+
|
|
1280
|
+
/*
|
|
1281
|
+
* Return a string representing the value of this Big in normal notation rounded to dp fixed
|
|
1282
|
+
* decimal places using rounding mode rm, or Big.RM if rm is not specified.
|
|
1283
|
+
*
|
|
1284
|
+
* dp? {number} Decimal places: integer, 0 to MAX_DP inclusive.
|
|
1285
|
+
* rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).
|
|
1286
|
+
*
|
|
1287
|
+
* (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.
|
|
1288
|
+
* (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.
|
|
1289
|
+
*/
|
|
1290
|
+
P.toFixed = function (dp, rm) {
|
|
1291
|
+
var x = this,
|
|
1292
|
+
n = x.c[0];
|
|
1293
|
+
|
|
1294
|
+
if (dp !== UNDEFINED) {
|
|
1295
|
+
if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {
|
|
1296
|
+
throw Error(INVALID_DP);
|
|
1297
|
+
}
|
|
1298
|
+
x = round(new x.constructor(x), dp + x.e + 1, rm);
|
|
1299
|
+
|
|
1300
|
+
// x.e may have changed if the value is rounded up.
|
|
1301
|
+
for (dp = dp + x.e + 1; x.c.length < dp;) x.c.push(0);
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
return stringify(x, false, !!n);
|
|
1305
|
+
};
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
/*
|
|
1309
|
+
* Return a string representing the value of this Big.
|
|
1310
|
+
* Return exponential notation if this Big has a positive exponent equal to or greater than
|
|
1311
|
+
* Big.PE, or a negative exponent equal to or less than Big.NE.
|
|
1312
|
+
* Omit the sign for negative zero.
|
|
1313
|
+
*/
|
|
1314
|
+
P[Symbol.for('nodejs.util.inspect.custom')] = P.toJSON = P.toString = function () {
|
|
1315
|
+
var x = this,
|
|
1316
|
+
Big = x.constructor;
|
|
1317
|
+
return stringify(x, x.e <= Big.NE || x.e >= Big.PE, !!x.c[0]);
|
|
1318
|
+
};
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
/*
|
|
1322
|
+
* Return the value of this Big as a primitve number.
|
|
1323
|
+
*/
|
|
1324
|
+
P.toNumber = function () {
|
|
1325
|
+
var n = Number(stringify(this, true, true));
|
|
1326
|
+
if (this.constructor.strict === true && !this.eq(n.toString())) {
|
|
1327
|
+
throw Error(NAME + 'Imprecise conversion');
|
|
1328
|
+
}
|
|
1329
|
+
return n;
|
|
1330
|
+
};
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
/*
|
|
1334
|
+
* Return a string representing the value of this Big rounded to sd significant digits using
|
|
1335
|
+
* rounding mode rm, or Big.RM if rm is not specified.
|
|
1336
|
+
* Use exponential notation if sd is less than the number of digits necessary to represent
|
|
1337
|
+
* the integer part of the value in normal notation.
|
|
1338
|
+
*
|
|
1339
|
+
* sd {number} Significant digits: integer, 1 to MAX_DP inclusive.
|
|
1340
|
+
* rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).
|
|
1341
|
+
*/
|
|
1342
|
+
P.toPrecision = function (sd, rm) {
|
|
1343
|
+
var x = this,
|
|
1344
|
+
Big = x.constructor,
|
|
1345
|
+
n = x.c[0];
|
|
1346
|
+
|
|
1347
|
+
if (sd !== UNDEFINED) {
|
|
1348
|
+
if (sd !== ~~sd || sd < 1 || sd > MAX_DP) {
|
|
1349
|
+
throw Error(INVALID + 'precision');
|
|
1350
|
+
}
|
|
1351
|
+
x = round(new Big(x), sd, rm);
|
|
1352
|
+
for (; x.c.length < sd;) x.c.push(0);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
return stringify(x, sd <= x.e || x.e <= Big.NE || x.e >= Big.PE, !!n);
|
|
1356
|
+
};
|
|
1357
|
+
|
|
1358
|
+
|
|
1359
|
+
/*
|
|
1360
|
+
* Return a string representing the value of this Big.
|
|
1361
|
+
* Return exponential notation if this Big has a positive exponent equal to or greater than
|
|
1362
|
+
* Big.PE, or a negative exponent equal to or less than Big.NE.
|
|
1363
|
+
* Include the sign for negative zero.
|
|
1364
|
+
*/
|
|
1365
|
+
P.valueOf = function () {
|
|
1366
|
+
var x = this,
|
|
1367
|
+
Big = x.constructor;
|
|
1368
|
+
if (Big.strict === true) {
|
|
1369
|
+
throw Error(NAME + 'valueOf disallowed');
|
|
1370
|
+
}
|
|
1371
|
+
return stringify(x, x.e <= Big.NE || x.e >= Big.PE, true);
|
|
1372
|
+
};
|
|
1373
|
+
|
|
1374
|
+
const icon$4 = "data:image/svg+xml;base64," +
|
|
1375
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
|
|
1376
|
+
const PERA_WALLET = {
|
|
1377
|
+
id: PROVIDER_ID.PERA_WALLET,
|
|
1378
|
+
name: "Pera Wallet",
|
|
1379
|
+
icon: icon$4,
|
|
1380
|
+
isWalletConnect: true,
|
|
1381
|
+
};
|
|
1382
|
+
|
|
1383
|
+
const icon$3 = "data:image/svg+xml;base64," +
|
|
1384
|
+
"PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxyZWN0IHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgcng9IjE2IiBmaWxsPSJ1cmwoI3BhdHRlcm4wKSIvPgo8ZGVmcz4KPHBhdHRlcm4gaWQ9InBhdHRlcm4wIiBwYXR0ZXJuQ29udGVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgd2lkdGg9IjEiIGhlaWdodD0iMSI+Cjx1c2UgeGxpbms6aHJlZj0iI2ltYWdlMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMDU4NjA0MyAtMC4wNTEyMjcpIHNjYWxlKDAuMDAzNzczMjEpIi8+CjwvcGF0dGVybj4KPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVN3QUFBRXNDQVlBQUFCNWZZNTFBQUFnQUVsRVFWUjRBZTE5ZDVoVjFkWDMrOC8zNy9jbW1rQUVSU1ZmVEY1ck1ER3hSMDFNZVUwTUE4aFFSVUFwU2hVc0NJS0tZQlM3Mk1IZXNLQ0lnZ1VwMDN0bFlBWVlZSURwekF6VEdLWXc2M3QrKzNMR3krV1dVL1k1ZDU5ejFuNmVlZTZkZTg4OVorKzExLzd0dFZmOUwrTEdGR0FLTUFWY1FvSC9ja2svdVp0TUFhWUFVNEFZc0pnSm1BSk1BZGRRZ0FITE5WUEZIV1VLTUFVWXNKZ0htQUpNQWRkUWdBSExOVlBGSFdVS01BVVlzSmdIbUFKTUFkZFFnQUhMTlZQRkhXVUtNQVVZc0pnSG1BSk1BZGRRZ0FITE5WTVZuNDUyZEI2bnB0WnVPbEI3akhaVXRGRjJXUXR0SzJ5aXJ6TVAweWRKZGZUdXBtcDYvZXRLZXVHTFEvVE1wd2ZvaVRVVnRQeUQvZUlQNy9FWnZzTTF1QmEvd1c5eEQ5d0w5enhRZDB3OEE4L2l4aFNJUmdFR3JHalU4Y0YzQUltSzJnNEJIbXVUNjJqbHVrUDB3T3B5bXJSaUovMXJVUkZkT3plUExwMmVUUmRNenFUL2QyczZEUnFkU3IrNEpZWDZqMGloZmlPUzZlZkRrK2xudzVMcGRPMHZJWmxPUzBnU2Y2Y24vUGc1cnNHMStBMStpM3ZnWHJnbjd2Mjc2ZG5pV1hnbW5vMCt2TGp1RUtGUEFEYjBrUUhOQnd3Wlk0Z01XREVJNUpXdmU0NzMwc0c2WTdTbG9JbGVXVjlKOTcyK2h4S1hicWRyNXViUytaTXk2S3pScVFKTVRrc0lBQkNBNVl5UktYVG1xRlFhTkNhTnpobWJSdWVPUzZQQjQ5UHBsK1BUQmRBQWJNejgvZkxXd0Qxd0w5d1Q5OFl6OEN3OEU4OEd3S0V2ZUkrK25UOHBrNjZkbXl2NmpMNWpERnNMbThTWU1EWnUvcUFBQTVaSDV4bkh1S3pTRm5yam15cWE4Y0l1K3V0OUJXTFJBeEFnRFFFUUlPVUFKQUFZQW9oTUFwQVowTkw3RzRBYitvWStvcS9vc3liUllTd0FNb3h0NXNwZFlxelpwUzNpZU9uUmFmWDlzQml3UE1JQ2g1dTdoRjdvNlU4UDBOamxKWFRabmRsQ01nRTQ0U2cyTURFQVRGYWxJNzFBNDhSMUdBdUFiRUJpcWhnampxQ1F4aTY3SzRmR1BWWkNvTVcyb2lacWFPbnl5Q3p6TUJpd1hNb0RuZDI5bExlN2hWNzY4aEJOZUh3SFhUb3RXeHluc0dpaEk0SitDSktKRThDaDBqTXdab3dkTkFBdEJveE1FVG80ME9qbDlZY29mMDhyZFhYekVkS2xiTS9CejI2YXVQb2pYY0xDQmgzTzlmUHlhTkNZVkxFbyt3R2d4cVJaMWkycEJEeXkrZ0lwRExTQkxnd0FodmZYejgrbisxZnRvUTJaaHdrMDVlWWVDckNFcGZoY1ZUZDAwcHF0dFRUbG1WSWFNaTByc1BDR0pkUEFVZjZVb0t3Q0dTUXcwQTVIWllBWWFBcmFnc2JWaloyS2N3TjNqd0ZMUVI1b1BkcERHN01hYU1ZTFpYVHhIVmxDeVF3OWxKQ2lGRlNNV3dXUmVQMGVDbjNRVkhQTkFLMW52bEJHRzdNYnFLMmpSMEhPNEM0eFlDbkNBOUNxWkpZMjA1SzM5OUpWczNLRkRnYldzTFBIcFBsT0R4VXZBQU90UWZQK3Q2VFFWYk56NmFGMzlsSldhYk1pSE1MZEFBVVlzT0xNQjdXTm5iUjZZeFhkOUVDaE1OdER6d0x6UFhiL2VDMWN2ejhYZWkvTUFlWUNWc2QvTGl5a043K3BwdG9tUGpMR2Via3dZTVZyQW9yMnR0SENOOHJwdDFPenhNS0FUNUVmclhxcWd5UG1SUGl1SlNUVGtLbFpZczR3ZDl6aVF3R1dzQnltK3c5NWpUVHB5WjNDd3h1ZTNMRDBxYjVvdVg4QmFSZHpoVG1EZC83a0ozZlM1dnhHaDdtSEg4ZUE1UUFQUUlHN1prc3QzZnhnb2ZEVWhwSVhUTTlBNE01akwrWU9jd2pKNitZSGkrampyYlhVZm93RHR4MVlTbndrdEpQSUxlMDk5TnJYbFhUMW5OeStVQmd2ZVpyN0hYQXhsMXFvMERWemN1bjFEWlVFQ3k4Myt5akFFcFlOdEFYVHZ2cFZKVjA1SzFka0xVQllqTjhYdDlmSGp6bEdsZ3BZRjdGSnNWdUVEUXVMcllSeWlZcVFqM2UrcjZhclo1OEFxbEVNVkY0SHF0RHh3U2tWd0lVc0dPOXVxdUV3SUxsTGpJK0VzdWo1WlZvOTNYaGZ2dkNnWm9uS25icXBVUEN4OHYrQXhFQldER1NTV0o5ZUw0dk5mSDhmUGhKYVpJR3NzbVlhdmF5RStwMVF3bHBoY3Y2dDk0RHVqRnNDK2IxR0x5OFJpUWd0c3B2dmY4NkFaWklGcWhvNjZkN1g5Z2pIUWxpTVdKbnVQYkNSdFlHQU44QWp5Q0tCd0hYRWgzSXpSd0VHTElOMFEzTExWUnVyaE1NbmRCVXdjZitLdmRMWnFCQ0RCOEFqNEJYd0RCeFFFZDNReTFsdURLNCtEczB4UkxDY1hTMDBkSEdSY0I1RXlBWURGVXRWUnFVdzhBeDRCOENWc0tSWTVEUXp4SVErdjVnbExCME1BRGVGUjk3ZEo3elNrWkxFS0pQeTlReHM0WGdBdkhUMjJEUjY5TDE5N0FhaFl4M2lFZ2FzR0lSQ09hcnI1dVhSVDRjbWlYUzhMRlV4K0lRREh6T2ZnWmVRNGhtOGRjUDhmRW91Ym9yQmpmdzFBMVlFSGtDb3hlSzM5b3A4NGZCbVpxQmlvRElEU25wL0F4NkREeGZTQ3gzbE1KOElxNUlsckxDRXlTbHJFWlZZc1BPeFVwMkJTaS9vV0xrT0d5SjREVHdIM3kzb1M3bWRTZ0dXc0VKbzhzSVhCNFdZamlJR0xGVXhXRmtCSWJPL0JlL2hxSWlpdHR4T3BnQUQxZ2w2N0svcG9OSEx0dE5wUTVPRUlwVEJpc0hLTE9CWS9SMTREOWxQd1lzbzJZYXExOXdDRkdEQUlxSXYwK3Zwd3RzelJVWUZxOHpHdjJlZ2s4a0RTTmw4MFIyWjlGWEdZY1lzdGhJU0xmOWd2MGdSQW9YbnJ5YndZcE81MlBoZTF2a0pQSW5ZVkNqbC8vTmhoZTlCeTdjU1ZrMWpweEMzV2JGdWZWRXhNTmxMdzJDRi9QakhTcWpPeDdubGZRbFlxSVJ5K2N3Y2tVdWRGNXU5aTQzcEs1ZStweWNrMFpXemNpaTcxSjlXUk44QjF2cy8xTkM1WTlPRWlNMUhRTG1MaWNISmZucUNaM0U4aEF2RUI1dHJmSGRFOUJWZ0lRUkNpNXBuc0xKL2NUR0EyVU5qOEM0eVA0Q1hsNzIvejFlZzVRdkFRcnJhS1UrWDBrK0dKdEZnTHY3QXNaQXhNaXU0QldnMVI5T3B6NVQ2cGdpRzV3R3JycW1ML3IyNFNIZ1FjM0ZTZTNaOHR5eHdML1lUUEEzREVUSS8xQi9wOHJ5MDVXbkFnalBvOWZQeWhIS2RIVUVackx3SVdOcVlVS1g2ei9QejZVRHRNVStEbG1jQmEvditOcnJzcm14eHptZDlGWU9WdHJDOStnb2VoMDdyanpPeWFVZUZkeXRUZXhLd01uWTIwd1dUTTZrL3NpeXdNeWpyckR5aXM0b0Z0dUIxeENIQ016NjdyTm1Ua3BibkFBdjVxekJ4cU1yTFlNV1NWYXhGN3JYdk5kNC83N1owU2lrKzRqblE4aFJnYmM1dnBNSGowa1VPS3dZckJpdXZnWkhlOFlEM0J5U21pc0lvV3dvYVBRVmFuZ0dzSC9JYVJVb094RjB4V0RGWTZWM2NYcjBPYXdCckFhNFAyTWk5MGp3QldGc0xtOFRFTUZneFVIa1ZnTXlNS3hpMG9DcnhRbk05WUtWdVB5SkVYODYyd0dCbFpsRjcvVGNhYUdHY2FTWHUxMm01R3JDUXl2aTgyekpZWitVVEs1alh3Y1d1OFFHMG9OUDZ6Y1FNeW5ONTZtWFhBbGJKL2piaHVzRFdRSmFzN0Zyb1hyb3ZRQXRyQlM0UGJ2YlRjaVZnN2F2dW9OOU56MlkvSzVhczJNZk1BQThBdE9DYitQczdzd2xSSUc1c3JnT3NocFl1dW41K0hudXdHMkJVTDBrS1BCWnJFalZBQ3g3eGY3NG5ueHBidTEySFdhNENyTTd1WGhxNWRMc284dzNDTS9NeURaZ0hqUE1BMXM1cENVbWk2RXBYZDYrclFNdFZnRFhucFYwaU1wMloxRGlUTXMyWVpxRThnSFJMODE3WnpZQmxCd1dlL3ZRQXA0amhZeUJMMVJKNTRKZmpBNmxwbmx0NzBJNGxhOHM5WFNGaGZaNVNSLzFHSkF2bjBOQmRndjlueVlGNXdEd1BJRjE0dnhFcDlFVnF2UzBBSS91bXlnTldZWG1yY0F3OWEzUXFWMktXdUx2eUlqZS95TDFFTytTSnc5ckNtSXIydHNyR0YrbjNVeHF3R2xxNjZhclp1Vnd3Z29HS2o0STI4Z0NVOENoc2NmV2NYSUlWWHVXbUxHREJkbkhyNHp2b3RJUmtEbWEya1ZtOUpDM3dXTXhMalFITFlUSk5lR0tIeW5oRnlnS1dwbVJuSmpUUGhFdzdwcDFSSGtCKytHYy9PNkFzYUNrSldKc0xHa1VZd1RsYzRZYVBRaXhkT3NvRDU0eE5vek1TVXdnWlVGUnN5Z0ZXZFVNbi9YWnFWaUNnbVpuVlVXWTF1aHZ6OWQ2VDRLQ0VSNkQwcGRPenFhYXhVem5NVWc2d3hqMVdRcWNQWTcwVmc0SDN3TUF0Y3dwOUZ0YmdyZjlSVDUrbEZHQTkvL2xCOW1SbnFaS2xTa1Y0QVBxc2w5WWRVa3JLVWdhd3NrcGI2TXhScVNMTnNWdDJJdTRuUzBGZTVvR3p4NmJSb05HcGxLdFFEaTBsQUt2MWFBLzk2ZTY4Z0wrVklydUxseG1SeDhaQXE0Y0hvTStDZjlaMTgvS29yYU5IQ1VsTENjQmFzR29QSVJDVHF6UHpRdEt6a1BnYTUvZ0VheEpId3dXcnl4bXdRQUdZVDRIaWc5bUZnWFUzTEYwcnlRT292SU0xcWtJaGk3aEtXRGdLWGpNblYvaGM4YTdwM0s3SnRHWmFHK1VCcEZlK2RtNHV0Y2I1YUJoWHdIcm83YjFDM09TaklDOGdvd3VJcjNlV1o3U2o0Y1B2N0l2cjBUQnVnSld6SzJBVlJIb0xaajVubVkvcHpmUTJ3d1B3Z2o5clZDcmw3bTZKRzJqRkJiQ1FsdldtQndxby80Z1VWclN6M29ZM0xKZndBS1Fzck5sL0xTcWk3cDc0cEZhT0MyQzkrbFVsTzRpNmhFbk43TVQ4RzI5TGNMQWFydHBRR1JjcHkzSEFxbXJvRlBVRXRhUmh6TnplWm02ZVgrL05MOWJ1UmJkblVuVWNZZzBkQjZ5NUwrL2lIRmNzWGZFeDBNVThnS01ocXU3TWU5WDVBaGFPQWxaMldZdUlCSWRmQisrODN0dDVlVTc5TTZkWXd3aWx5OXZ0YkZwbFJ3RXJjZWwyNmpjOG1jSEt4YnNyZzVKL1FDbldYS01nNitobEpZN3FzaHdEckcreUdrVEZXWlFXaWtVSS9wNXB4RHlnUGc5Z0xRTzB2czF1Y0F5MEhBRXNtRUQvZG4rQmNPOW5SblNHRWJYQ0F0QTFtUDhMbEZiRHZkdzJiMWhJNXNlZEZOaGNXUktPT2U4STJjSGFkc3JOd1JIQSttaExyVkMwdTQzcDNkemYvcmVrME5SblN1bU5iNnBNLzczMmRTVU5tWnJscXBRLzJQVUhqa3FsSlcvdE5UMXUwT3p4anlwRWVUaytFY1RlckU1UFNDYXNjU2VhN1lEVmZ1eTRLQjgwTURGUSs4ek5JT0NXdm1QQlhuWlhOclYzSExmTVE1Tlc3SFNOM2hIV0swaFdJNWR1dHp4dTNPQ2FPWGxDc2V5V2VZOVhQNUZTR1hHR1I0OVo1N2RZRTJjN1lLM2VXTVZPb2c0ZkxYQVVlditIbWxoenIrdjdWOVpYRW5iUWVDMEdJODlGeGc5WXJtUWxuSnUxY2hmOWJKZzd4bTZFVG5aY2U5clFKQ0hSNm1JcUN4ZlpDbGhJK25YbHJCd2hvdHRCSkw3bnFlSTZqb0kzTFN5a251TnlRaWZ5ZHJlSXlzQ0RGVGVXQkh5RGt1bnVsK1g1Qm4yNHVWYmtObWMrTzVYUFFta0NxUjVGajl1UDJadm96MWJBZ2k3Z3B3bEpydGlkUXlmQWpmOUQzd0xBMmxZa3IwUVR4SHd3SW9KZVZhYkoyV1BTNkRjVE0raGczVEVMKy9mSlA5MWYwMEhuVGNnZ0R0Q1BEVmpnRFVqMmIzMWJkVElSSmY5bkcyQjFkQjRYdWE1WWQ2VnZzcTJDQVNRTUhGOG1QN2xUTW9zUTNmbGNtZEFOV2Uyam5iOUhmQnVLNzhwdVF4Y1hjYjQyblNvTjZMS1E2dnhZbDMyNkxOc0FhODNXV3Rmb1B1eGNTRTdkRzZrLzRIMWNlcUJkOXBxbHQ3K3JWdnBvTkhCVUNsMCtNNGVRRUZKMmUvS1RDclp3NndRczhEcktnMzJXVkNkN0d2cnVad3RnUVgveWp3Y0tlV2N5TU5GV2dFM29iNFltMGVLMzl2Wk5yTXczSlJWdEFnd0hqM05HV2pSS2k5TVRrZ2dicEIwdFkyY3pEVXhNRVM0T1J2dmx4K3ZQdUNXRi9ybXdrQ1NwVUUrWlVsc0FhMU5lSS9VYmtVSy9kR2pCK3BFeGdzZU02UGxMcG1SUjNaR3VVeVpZeGdkd0NyeGhmajZwZUx5SHpnNzVtV1FaR1VMcHBlbndZSDBNcGptL0Q3OTVRWStLdGI4bHZ6R1VsRkwrdHdXd0pqeStRM21kaDVjWURpWmxPSG5hMldCOVU4M0VEOHNsUEsyVGk0L1lPWFNhOHlLN054aFpML0NGbS9pRVBWV2pwUU5XeWY0MmdzV0dNektFMzRHTVRMeWVhMUVjQU5LUG5ZcE9vTUVuMjJxVkFpek55RERsbVZKYndRbzNYNXRjUnovam9IM2RFaWJXUG5TcU95cmFwTStOZE1CYTlHWTVLeWtkT2dyanlJMkZ0Q0h6c0hUR0NMMWhlZFZSa2M1YWxZMElDMkx3K0RUYVhTbmZ5QkE2OXNyRHgraC9KbVc0S2tSSnoyWm41elduSlNRVHNFQjJrd3BZalMxZEl2WnMwQmpPZDJVbk0rRGVrREFnZWp1VjN1TTREQ2tMQ21oQVlvcnVuZFl1R21Ec2NHTndzb0lMd24yZ0w3TnJURjY3THpEZzBtbloxTlRhTFJXenBBTFd1OTlYQytjeHJ4RmZ4ZkZBMG9FaU9IK1BjeFZNRnI1UnJvUjd3NW1qVTJuSXRDdzYzR3lQa1NIY0Nudis4NFBNMndaUERnanBlbTlUZFRoeW12NU1HbUQxOWhMOWUzRVJwNUF4T0tsbXdGQzRNU1FrMGQydnlBdEQwY05CNjlQcmxUQ21JSG9DTWFwT3RueVhoQ2laNFNlN2ZnT0RTTUxpWWlJNVVXSml1cVVCVnY3dVZzTE9wM3JNbVYyVDQrUjk3UWhEMGJQNEQ5VWZvLytaR0Y5ZERvd01mN2szbnpxNzdmT21Ea2NMbEthN2JsNGV4OFVhMkpDQkJYQzVLU2lYbDBaWkdtREJhUkdLTmljWHJoK2ZwZWx2bnZwRWZoaEt1SVVhK2hta2FJQkdQR2dQSXdQMGR0ODRtT0V5ZVB6M3ZyWkhpU054UEdodjlwbkFoSWZla2VmUUxBV3dFQkx4eHhrNUFrM05Eb3gvcDg4TkFzNmJWOHl5Snd3bGVIRkdldi9vZS92akVuS2xHUm5HTG5jMmgzZ3dIYjdPUEN3QWt4Mmk5ZkVxMWpRa3JDdG01aEF5dDhob1VnQ0xKMUwvQkZvRlpzUnFmV3hUR0lvZWh2byt0MUZZeTV6T3hBa2p3NkRScVZRbzhYaWhaN3pCMTlRMWRkSkZkMlFLUDBPcjgraW4zNlB3akN5cFdBcGczZmw4R1R2V0dUamJtMlhXL2lPUzZlYkZSWFFjRm80NE5ZVC9YSHhIbHFPTFZqTXk0RWdXN3pidXNSSVJlbUoyRHYzNE8wUklJQm1pakdZWnNPcVBkSWs0TmlpQy9UZ1pUbzFaaEtHTVRLR1U3ZmFHb2VoaHFzUkhuZlZKR2pRbWxjNmZsRWxWaHp2MWRNL1dhMTc5cXBKMXRRWTNaL2hrL1hacUZqVzBXSGREc1F4WW55RnNnZFBJMmdyV2tEQkFZeFNWVUtFNW1YSkZNekk4dC9hZ0NrTW5FWG9HTDNzdUJteUk1eEdSOFVWcXZlVTV0QXhZMDU0dFZjSTN4eWxKSng3UFFSZ0tkRWE3SzQ5YW5uQVpOMEN3TVN5RlR1aXhZR1M0ZW5hdU5LV3QxZkVqYzhXTjk2cVp1U0lldktuM21RQXNKSUswMml3QlZtTkx0eEQxT0JUSFBxVzdKbUU4OHU0K3EzUGQ5M3VyS3JBamJkMzB1K25aaEtPYVhvWTFleDI4cFNIRnkyb3k4alRCaGNjdGhUbk0wbDMyNzRBUlF4Q3EwMkl0Vk1jU1lDSG9GbjR4c2dmSDkvc1JBR0VXUmhpS2pQTS9GbjNtem1ZcDFVMlFRZ2g1ait5Y3EzNGprbW5va21LeUNyQWEySDJ5clk2K3piRmVwWGhUbkN5bGR0TGE3bnZERmFUZjhCVGFtR1dOL3BZQTY5N1g5N0QreXFBQzBpaGpJTmVWekRDVWhDVkZoRCtyN2NWMWgyeU5yVU1tQmh3NzAwcWFyWFpWL0I1K1FPZFB6cVFsYjF0M1lteHM3YVpMcDJVNUltRWE1UmVWcjRkTHpuMnZXN1AwbWdZczVGKzZkaTRYbXJTVFFiQmdiN3kzZ0RvbEpmWEg3dmJmLzA0U3g3bm1kbXVpT1dyL1FmcXpJeFFMeDJBd045eGxaTFduUGoxQS8rZHZXK2lXUitRVVdVV3hEMGlBZHM2LzErNk5ZUDNyN3M2enhNK21BU3RuVjR2SUZtQUh3M3B0b3N5TVI2U2FIWjRzNVFpRFJZOEszR0FXQktTaXVrbXFSZmNJYkZpb2tHSkg2bUFZR1VDenZWVnlqQXg3cXp2b1Z4UFN4Ymd2dkQyVGFocXR1MGU4OWEzYWhUbk04SnpkdjlGaUMxSHIwbXd6RFZpQmRCdTh3OWd4eVpBd29Cc2MrNWk4TUpRWFBqOG9ja2poM29qdmtsRVNhNjROYVpNMUl3TkNnR1MxNmMrVjlTbkpJUlZ0eUxLZThIRFhvWFpoSlZVbG9hRWRmR2pIUGNGN0s3OHc3NkppR3JER0xDK2gvallyWGUwZ21CdnVpVVVnTThxOXVxR1RMcGljU1pvMUY0bm9SajFxL1dpMFpvdjh0TW1RMkM2ZG5rM1FFOGxvMElIaGFLMmRCSERVWENnaEV5YXNqZi9MbGFFTUg0bUJHZU1zeElPYUFxeTZwaTY2ZUlxejRSbHVBQm9aZmRRa29IdGVsWmZyYXNGcXBLMU9FbGxLMFVkRUpWeHlSeFloU3NGS2cxOFk3aWRUeWdoVUQ1YVQ5QTNXeFdFUEZSRkNtclM1d1hINHIvY1ZTS215OCtqNysydzFQR2g5OXRLcjRMMHBXVlJ2TXZtaUtjRDZJZTlFQUt6TkZqSXZUWlRlc1VBS1F2NXc1QkdYMFRUUDdHQlFnWWtaVWhiS3NWbHBLSzMxdC91Uk5sbU9QeFlrSVlBSmNrL0phSituMUo5aXhRWWRJRzNKS0RpN3JhakpNUWRhdmZ5aituWFF6VUtQdXFYQUhPK1pBcXpIUDZybzB3bW9UaUMzOVErNXlwLzVURjZ1cTRrcmRvaEZDOGt0bUJZNEdpMTczN3FlNlA1VmN0SW1nNUdodC90T2dwOFV3QTcxQksrZG0wc0RScDRLcG5ENmZPdGI2eGxMT2EzU3lUd1Z6Ri9SM29QK0t6NnVNTFVubVFLc3hLWGJPUlZ5Q0FCRW15QzkzeUVNNWNwWjhzSlF0aFEwaWVOUXVCQWFTRE5ERjF2M3gwSjhtRlhuWVlBcDdqSHVQL0pxMmNGUERPQWZqdlo0MXBTbjVjUmxUbitPUTlQQzBUamFaNUR1eHl3enAwTTFERmlpTW81d211UHNETkVteGN4MzJIayszaWFuNURxT2F6Y3RMSXhZNlFXdUF6aDZJdTJ4bFZaUjIwRy92czFhMm1RYzB3SzVydVRVc2FzOWtiZHEwT2p3UEFxRHhoL3V5cWFXZHV0SjVUN2NYTU5aU0ExdTNwanIzMC9QcHFZMjQ0WVZ3NENWc2FOWmxDd1B0MnViV2FUOG00QllEZXNKMGcvTHluV0ZoUlFyWlRVa0RSU1dzTktnMlA3WG9rS2h5ekV6bDVxUlFXYXVxMFZ2bFBlNWNJVHJFM2dYRXFhTVZEMzdhenJvdkFucGRPNEozN0Z3eitQUFRqNDZndjZ3Qm1lWEdmZkhNZ3hZcjIrb1pQMlZ3UjBsRnNNaVZja3ZKQzBnZ0U5TGV6ZGRQak1uWnNFRVllSmZiYjNZSlhKMm13MEdEdVM2eXFBcVNVYUduUWZhaGRWU2N6Nk5SSHVBK1JOcnpPbFJRZ0VlUjJ2TVg2Um44ZWNuQXhib0FYNTV3MFRsSThPQWhjeUJuUC9xMUFrd3k1U1FNR1RudWtLQmlrajZtK0IrUWlHTjRxaFdNeGg4azlWZ09rd0YvWlNaNjJyeVV6dkRHaG1DeDQzM3NGUU5lNmc0Rkh0TS9iOWlUVVZNYVRiMCtYNy9IencvKzBYaldVZ05BVmFnK20raE5ETzIzeWNONDRja0FEUDdya055d2xCRUthNUpHWDFPb3RGb0ROMFJBSE9QeFJBWU9LWmVPRG5UY0NsM1ZKRythbll1dFVzcVVKQlUxQ1IwZHBxVGFMU3h5OUxoQWVFeWRyS2FKQnF0dzMwSFY1aC9MQ2cwdkZrYUFpekVZRjEwZXlhZHplZDFLZUkvd0FJU2hzeVM2L05mM1NOMmU4VE9oV09VME0rdzA4bFE5QTkvdU5pdzVSaEgwaytUNU9TNmdwRUJ1alFqNWVTaHc1T1JCUk11RkZmTnlxV3pScDNxUWhGS2IvNC93SmR3SUVWQkQ2TnhuWVlBSzYza0NDdmNKZXF2K25KZG1mVDZEVDIvb0tMTVdhUFRESG1lQTdEdWZ0bTZWLzFqSHhvci93VWpBOUxjV0QyT2FqUllzN1hXc0I0TmdIblBxOWJTbldqUG4vTVNxMHFNZ0RFVTd3TkhwVks2d2ZSQmhnRHI3ZStxV1g4bEViQWdYYTB5b1hqVUZrbm9LeXE2UUdxQTVLYVhlY0EwTjh6THQreGREcDh2NklYMDFPeURrUUZXT215QU1ob2NPT0cvQmo4MnZlUEdkUmo3OWZPc3BUdlIrcjgycGM2eVA1cVJ2bnZoV215VzczNXZMQXpMRUdBOWlOU3dYSERDMEtLSXhGaG5qRXlsUDkrVFQwalRJcU45bDl0QXFQOW0xTjBFNEFGZEZrSjRyTFREelYwaVhYYXM2a2w5Um9abjVUaHVvcy9QZnFiUHlCQTZGMGdTaUZDb0lnbTFEaEZLZGY0a2EvNW9vZjN6K3YvQWtpVnZHVXVvYUFpd3hqMjJnek0wR0pCZUlqRWNRQVdTME1aTTYybE9zR0FSZTRjWVBFZzRrWjRaN1hPWW1KSGZ5V29ic3l4MkJnOG91ekYrV1FVMU5LQXdtMThlN2cwbzNTV2pqVnpxYlBtemFIUHFodStnRnJqVllIU0Ric0RxN082MUxXR2JHNGdyczQrUWhFWXZrNWZyNnAzdnFpMloxUUdleUJsbHRTSEhGckl0UktJVnBDdWtmSlpaVUFNT3B3QWRJOGZnNFA0aEwvMkVKK1NFQkQyLzlxQ2xlUWp1bHgvZXcza1VSM0lqd2U2NkFRdm1jbVJyak9XUTV3ZENXeGtqamwrWXFQdzlyVmJ4UWZ5K3FiV2JmbjludHFYTW43QnV3YjNnNkRGcm9TcXBNWXd5ZlVZR0NRVTFNZmppZlcwaXJ6cG9hblpPY0lSRmZuWlVnTExha0VrVFk5VGpWbUcydjE3NkhiQUVsc0txQnYzaFlib0JTOHZoYlZSSDRpVUNXeDBMWEEwZ2djaXd5bW1MQzlZNVBVNmkwZnFPQllhRmxtc2hkUzM2QXcvN3krN01wa2d4ZkJpN3pJSWFxTnlEZW5kbXBTdlFCUHlNby9UbWZIUHBUclI1d0t1V05ocksvR2owNXU4Q1JpSHdIWFNJUmpadjNZQzFMclZlbEhYU1l3WGlDUWx2cGNOdS9wdUpHWFN3cmlPWXowMi8zeWZpMkRKRVFqNnJOSWNlNjVYMWgwejNSZnZoeENkUS91dkhoSGxhdjJBVi9NczkrUVRWZ295R25HdzR6c25ZUURIMnBlL0pxZnVJU2xKc21BclAveG92YUsrWU8raXgxbWZvajJmVkRWZ3ZmWW15VHFjeW92WndmbzA5U1pDRVpPUlMxeFk4d3FTczZHK0M1d3dnZzl4WlZ0dkw2dytkNGc4RnhvU2VEQ0U4TWhxcUwvLzlmdk5HaHVCeDR6M0E5SitMQ3FYVVAvd3E0N0FBYk43WVk2OEgwTjZvMFVNM1lLSGFMZndtUWllYi85YzNNVGdtWERFemgrQXpKS09oYWhIdWVlNDRmYytQTlU5SStYSFpYVG1XVTY1b3FvTmdQUTdBYXF5RlBONmg5SHB2RXpKUlJGYnV4eHByNlBmSXRJQ01DL3VxclV1K2RVZTY2T0k3TXFWSXZhSDk5T0wvd0pTSDN0RXYzZW9HckR1ZTVrUmxWaGdHeHc1NFk4dHFNS0dITzNxWjdTT2tJTVQyV1hYbUZHRXFzMzhNVTRGQ0hQcXhBa2xHaGlOdDNmU0h1M0lzR1JuQzBRZ0w1Nk10Y3VZSERyekJlZVREUFk4L0MyeTAyTXltUHFQZkowODNZQ0d5blZOb21KTm1jRTVIbkJ1Q3gyVzByek1QQzJsWDlyRURVb3VNekFsM1BsZlc1M0dQZTg2WFdGQURLV0dzR2huQ2dRV1U5ek5YR3M4ZUVHNCs0ZGZGNmhOOWF3V1lNdHhBMWd4ZGdBVkZLZndsWUk0UE45bjhXZVRKZ2VRQ0t4UXlDY2hvc0VUZE1EK2Y0Q2t2bSs0SUhKWnhkRU80QlJUUFdrRU5xMWxOTmJwcDJVMWplZE9ib1V1ZmEwZW45Y2lEN2Z2YkFsazRMTGhibUJtREczOER0UWI0V2E4dmxpN0FncS9QNzZabjYwcFo0a2FpMmRWbkxReEZWdjV3TE54Vkd5cUY4NlVkZlQ1N1RLb0lyMm13R0l5TkpIb0krZm0vTjIrVFdsQmo3a3Z5akF5aDlNUEdZallMcGdhbzJpdU1BamZlbXkrTzJLSFA0ZjlQM3R5eHFjR1BFRWQ5UFUwWFlHRm5RLzV2ZGhvOW1kaXhtQS8wZ2c2bjdHQzducm1JZVEzaTlZWk16Ykl0allrbURTS1EyVXJEZ3IxeWRxN29xeXdqUTk3dVZnRW9zb3dNNGVZT2VrWlVOSmZSSG55ei9CUnJhYmhuK3YwenJCRVUrVDFRcDg5NVZCZGdGZTlyRlRzbWRrMi9FMWp2K0NGZFFkZXk1RzFqd1ozUkZzdkQ3KzZ6Ulg4VFBDYm9Ydjd6a2ZYVXdkT2VLNU1Xb3dlYUlKUUpDdHJndnNwK2p5UHhLSlBWWEVMbjdmdmNFN1U3eHh2YjVHU1BTZlg3WVVQSFJvbGp0SjZtQzdDUVVSSGlNbTZzT2dGVTZSOHNZNWRNeVNLWXVXVTBCQXVEL25aTHVkQzNqWGpZZXVwZ1NKVnRraktKYnN4cUVHQmxOLzlCTndhWEJGUTJ0OXFnUmhuQzFhVmk0Z1htRkdzbHE3UlpGOGwxQVJaWGVqWU8xSkN1WHZ0YVRoWUF6Q1JNdnpDOVd3bEQwUVBteUNhTG1OSHF4azVkREdUM1JUOGFHY3hsb3RBejVyNXJ4cWNMVnhFQXBJdzIrY21kSXVWUDMvMGxaUHJ3MnIxZzZRNkVSdWxUUStnQ3JNOVQ2cVQ2L0hpTjZLSGpnZWYwRGZQenBPVzZTaWsrSWlZMTJCa3o5Sm15L2djRHdRM2ptMnc1aTlicXdnZm8yK0hHRUlsZXNHNHVlbFBPTVI0Skx6bE1KL1ptRDMvQ2RXbjZ3bk4wQWRiN1A5VFlyaitJeEVCdSt4d0xIajQ5Q05HUTBlQzdkZk9pSWtmemtFSDVMRFBQdkZrNjFCL3BFc2RxSEJtYzRnTTR6eUszR0hMRVcyMG9MSUlqajVWc0VrNk5PNTdQZ1c0U2RUVDFOTksyNU40QUFCOFBTVVJCVkYyQXRYcERGWWZsNkJEbmNWenJOenlGRWg4MVY0WTczSVRCKzlwcEowUklpRGMvV0VqV2wyeTRFZW4vYk5HYjVjS0Z3KzVqY1BCaUJiakF1RlI2d0xwbEYwVm1iM3JBZkpIWjRINTUrVDBBNjgxdnFuUXhoaTdBV3ZuRlFSWnRkUUFXR0IzR0NjVFR5V2pON1QzMHh4bXhDNkxLWnVaenhnV3lTdWcxTmNzWWErZzlkbGEwRS9vUmo0cktPTWJoT0NlalBmcmVQblp2aUxGMm9KdDkrVXQ5bVVKMEFSWUtjK0tZSUh0aGVPbCtrQUpBbzdrU0t0Qm9DMlhGeC9hRW9laWhPM1k5R1NXd3RMRVlmWjIwUWw5QlZEMWpNWG9OeG00a3ZpM2EyQkRoQUluVmJndW4wVEdxZEQwMkNPVGwxOU4wQVJiaXR4aXdvaXNQNFNVZXlIV2x6d0V1MXVUWUdZYWloMW5CUkFza2xMR1BOYzV3MzIvT2J4STZ1M2d0Y3VqTS9qQkRUbWFObHZZZUVhenRwQjVPei95cWRBMnc1Y2xQOVBuKzZRSXNaTFdVbWM1REpXTEo2Z3NzV1pCRVpiVlpMKzRTbTRTVCtwdGdXa0Q1akp4VHNnSzI5ZElGWHZLb0NBeFRkM0Ivbkh3UG9Cd3dNb1dROGxsR1E3NThTRzFPanNGTnp3SmdQYTdUV1ZrWFlDMTdud0VyR2dNZ2dQUHltVG5VY2xSZlBGU3NSWkJWMmtJbzVSM1B5QUxOc3JXbjhtaXM3a3I5SG9IVFRoc1p3czJ0MlBVL2xyTUJ3UUxHN2cyUlR5Z1FocFovc0Y4WEh6Rmd4VkFJaG1QbTBNL0EzREp6WGQzeVNMRkkveHY2SEtmL2h6TDBZNGs1dkdKeHBJeUNHckpvQkFuUFNOcVRhR1BiajFUV3Q2WEh4WUFnaXg1MjNrYzZZQ0cyVElWZHowNmltYjAzNHM5azVycUNvaHRBSVR2WGxabnhvUjkzdjJLOWpIMjB4Uno4SFhaWkhLM2pkUXdPcGhGQ29NNmZsRW1vZXlpakRWMVN4UG5rSWdnSHdCYXBSOElWckhRUHEzK0E1emwyNHFRaU9ib09aT3U4Wms2dU1tbEpVUHBkNUNycXNkOGpxN3pxcUtBeFFvT0NnU09lNzJWYVNtSHg1VTAvL0xFUUp4VFFSMC9UZFNSRTRRVGNOSjdNbzlxemhSdkRzR1JDNm1oWjdZWFBEem9haGhLTHBvUEhCYnkwZDFUb2k2UzNRZ2NvcHFIblFTbTBXUDF5Nm50SW1QZThKa2ZDUkFJQmJBRHhzbnc2UlRNeno4RzhQL09wUG4yaExzQmF1ZTRRS3cxRHhGa2NHYUFVbDVYckNzVWtrUmNJeFNETVRMcGR2d0V6eVhLaWpBUm9xZHVQQ0YrbHdlUFZrYTVBVHhoVGtHbTNzOXQ2RmxJVXFVV3gyak1WbTErNytNYklmYkV4b0NxWG5xWUxzRkQ4RWpjMTBna3ZYd3ZwQ2lYWGpWVDdpRFVaOTcyT2t1dEpTa2tZbUVNY2k2WTlLMCtLREtWRGIyOHZEVjNzYkt5a1h0N0Vob1NVTThWNzVWVHBudjNpTGw1SElScy81Z0t4dDFKRGN6ajQrZVJqQ3B3QUw1bWFSUWpPbGRFS3kxdEZUaURObFVEdmduTGlPb3dWTGh1eWNsdUYwdXVUYmJWS3F4dWdDcEdWSnVpejVEcXhPSjJZTnpjOUE1dmloNXYxVlN6U0pXRjlub0txenl4aGFVd0FTOWJyRytUbHVocjdtUDNaTkxXK0czMkZ6Z1h4a1hvVHJJVUNVclQva1Q3NWlsazVRcmRqdEY5T1hRKyt2KzBKNndWbVFRZFlIRG5WK01tYlA2emgwdFBMYk1vN2tlNDFqRGpuRk9PbzhweEFycXQ4YWJtdWtIY0tPNHdLYmd5UmFBenJGZ3dDc2h1TU9VN211b28wdm1pZkR4cVRTcGRPenliNGlNbG9JeC9aSGxjdi9taGpqY2QzNEh1UndFOW5IUUZkRWxZNkxCeWNJbGxZZUFBdUc3TGs1THBDTnMyLzNJT1NYZkVMUTlIRHBFam9oK0tnTXR2QnVtTWk5aEl4bUhyNkVLOXJJR0ZpUVcwcGFKUXlmQlM1WVBlR0g2VXMwQmRxQjcwU3ZDN0FLdHJiSnBLUXhUTlVKRjRNRy94Y2dCV0tJY2hxcXpaVTJWYXlLN2pmVnQvRElpclNKamZJUzV1TXJCWll1Q280aWNhaUQvUllDRStUMFZEOUJ3dlVpZXl4c2NhbHd2ZlEyd0swU21RV29VQm9nZC9QM2lBc2REbjV1K1ZZaktDdy95MUtkcm5BekkwK29xQkdqYVE4NzhnWEJsckN6MHVGUlJPckR5S2g0YUlpUWtJK3F3MHVFdGZOeXhNbmxsalA5Y1AzMkF6aHpuT3dYbDlFZ1M0SkMrZDNuT05SOU5BUFJBd2RvM0JqU0VpbXV5WG11a0w1TDlYMU54b2QwRTlabGpJcytKRkx0NHZpREc2UXJrQURiRmJuVFVpbmZkVWRWdkZLL1A3ZTEvYXdYK01KZmZpZzBXbDAyVjNaMU55dVQwZW9DN0N3Sy9pNVZEMThjV1RtdWtMNlhTd0M3QzRhS0tqNkt0dklzRDc5c0RLeGtrWm9EajlFV1FIdXlQZmZqOVBOQ042SGJ2elA5K1JUbDg3d0wxMkFoVzFoMkVQRnZnM2VoSVFCaTVhc2h2SlBXQUNxU3hqUUxVQnZ0MUdTa2VGbzUzRzY3dTQ4a1d2S0NGaW9jQzNtYTliS1hWSllvSzZwa3k2NkkxTTRwYW93dG5qMjRSY2pVd1MyNkNXc2JzQ2E4a3lwTDVPUURSeVZJaHduWlpWY1J4bDRXTjBBQnZGa0ZEM1BsbTFrZUhuOUlkY2NnMFBwYzlhb1ZMcDZUaTUxZEZvUDA4SGloTlcxM3dpMXJjT2hOTERqZi9DWWtYVFV1Z0VMT2hjL2h1ZWNucEFrN1NnZ3NtaytFTjlzbW5xWkRrZFdLTnNMOXNneE10UTJCcVNLczBhcmZ3d09SeU5zTUlnRHpKRlVZT1RWOVpYczNvQ3duR0hKaGtMY2RBUFdLK3NQK1k3QWdWeFhSVkpxMUdGWGZXOVRqU3RTVFd0R2h2bXZ5c2xVZ0xFdmZLTmNTRmNxWldNSUIwelJQa09zSnlwSXlXamI5N2NKSGFaYkxLWFI2R0xsTzdpMnZQcVYvcWdSM1lEMVpYcTlhNDR5Vmdpby9WYkxkWlZjcksrRWRpd21QdExXTFlvUndKeXZQVVBWVjFpRDRjYWkxOVFjYSt3N1VMSnJyRHVNRE5IbUJFZjVNY3ZsK09HaFVPdU45K1lyay9zczJyanQrZzVTSzJocXBPaXdic0RLMjkwaVVwLzR3ZUVORWdaRTFkdWYyaGxyTGVyK0hoa1ZvYnhYWGRFTzVrUS9uOUZaZGtrUEFTYXUyT0VLSTBPc2hZbmtnaGZma1VsMWtvTGVIM3h6cjlLQjM3SG9ZZlY3WUFrMngvdzkrdXQ0Nmdhc1EvWEg2TUxKbWE0d3hWc2xKS1FCNkhCa1ZQL0ZnaFk1dlNla2swclpOQ1BSYUdCaUNsMHhVMDZKSzR4OWMwR2paeVJ6TFZBWDhaOHkydmU1M3FGTkpINks5am5XMlVXM0cwdERyUnV3T3J1TzA1L3V6aE1leXRFNjRmYnZoUDVtYUJJdGZtdXZESjRVOTRBNUhNcDdOMGhYMG8wTUN3bzhGZXlMTUowSDN5eVh3aHVOTFYwMFpGb1dJY0RhN2V2R1RQK2hIb0hYZjFlMy9oQUMzWUNGR1JxN3ZFVHNsbVk2NTViZmFHRW9zc1QrN0xJV2tUN0ZEWEdZTURMY3ZLaElXaTFDdHhnWmpQQW02algrN2Y0Q2FZWVlWTGlHYWQ5SUg3eHlMZlJYNC85akxIV1BJY0JhOUdhNTUwTUtrRWxVWmhoS29HU1grZ3hwajVFaDIzTVNPVlFGb0pXczFOakl0T25YZWdsSXYyMzBKR01Jc043NnR0clRnSVV3RklRZ0llMkxqUFpsV3FCa2wrbzdvbVprbUNLeG9BYXFoYnZGeUdCMGZyRFEzdm0rV2dhTDBLNURSd1VBQWdpTjlzUHQxOE93aGNLNVJwb2h3RUt4QUs5Vy9vQkNGYm1salpoWW94RWFIdEhRK2FIa3VlcU1CZVdueklJYUNCS0d2NVViakF4bTVrWjRaMHZLYzMrOGwraC9IeWgwQlorWW9WV2szOENsQVhHRTZUdWFveTJqVTc0ekJGalZEWjBpTHhJWVBGSkgzUGc1SkF3d1llS2oyMDhoa05rUHREQVUxUlh0NkI4a0lVUXl5R296WGloempaSEJETDlDejNuNURIbDU3aDk5YjcvdmpvVklLSUI0U3FNcGl3d0IxdkhqdmZTUEJRVTBJTkZiVmcySTQ3Qlk1TzdXN3c4U2JYSFhOblVLZngwd3Rwa0Y0ZVJ2MEVmazVaSlZVQ056WjdOd2huU0RrY0VzblNFZFFQbWVWaUtuZ082Mm9pYVJkUmIzTmRzbnQvME9HUEtQQllVRUNkTklNd1JZdURGTTlGNktLY1RSQlNFWGMxNlNFNGtQR3NFaDhLZEQxYy9HQUNhSGRJWE1wN0xhaUllTGZSSFVDNTU1NmhNNUdUeGFqdmJRSCs3S2RrVXlSMW5BQ0F4QjJUT2p6VEJnZ2JtOVpOV0FhUHJyMnpLb29sWk9jcmFkTGdwRGtaM3I2b3RVZHhnWlpDdzY1SGtmOFVpeDBmVVc4ZnJwejViNXlyMEJHSUo2cDBhYlljQ0N5SS9qazFmRVYwZ1lLejZ1TUVxM2lOZFBja3V1cXhONnV3MlpjZ3Bxb0xMeE5YTnpQYWN1aUFSdTBPTWkzaEtsdTJTMER6ZlhlT3JrRW9sdStCellBUXpSVzNnaW1MNkdBYXNSNlpJOTRwMExLOFVmWitUb1RzOGFUTGh3NzdjV05oR2NMMVVIY3lqYWtmRlNaa0dObGVzQ3VhNVVOekpFVzBoR3Y0T2habDFhZlRoV01Qelp2cG9PT205Q0JwM3JNWU5XT0pyQ3MvOTNKa3VuR1FZc3pBU3NhUkNKdzNYR1RaOUJMTVhPSnFNaCt2Nm1oWVVDc0ZTbmdXWmtNQkowR28xRzFZMEI2L0VnRnhnWlpNNE45RERJenk2ckRWMWM1SXVzdnZCd0g3M01uRVhlRkdBaDg0RGI5VmlRaEc1Nm9GQmFpTVVIbTJ1RUtWL21nckRqWHBDQW9EQ2UrN0p4aFdla2hibGdkYm00cDUra0s4d05mQkp2bUo5dktCWXVFZzN4K1JOcktueVJjdzdZWVZZTll3cXdmc2hyRkJLV3l0V0tveTEySE5rQVdEakN5V2pON1QzMGh4azVyaWpkSkl3TUV6UG9nQ1Fqdy9aOWJTSTN1Ujg5dFJHaUErZlk0bjF0TXRpSU1sQ3dPTkU3K3VGd2F4QnJ6MHBoV2xPQVZkZlVSUmRQeVhKbEVuMUlBUkRsb1J5WDFiQmJRSGtmYm9KVSsweTJrV0hDNHp2bzV5NG9xR0hYUEVCYWtPVVdnaUlkVjgzTzlWejhaVER0c1dHaXhxVlp2ejlUZ0lXRlBtYVpPek0zd0xxRFAyVEJsTkhnRGdHM0NFeEU4TVNvK0I1R2hzdG55ak15UU5MdVB5SlplU09EblhQUmIwUXlUVndoYi9PRGI1S1gvQnhEYVEvOUZRcHdtRzJtQWV2NXRRZGRkOTRXVHFKRGsyalJtL0xDVU9CdzZxYVM2eDl0cVRYTEt5ZjlEZ1UxL242L3QzSmRoUzR1UGYvRDBBQ0xGMUpneTJocmsrczhEVmhZS3l1L09HU2FWS1lCQzNtZTNPYVBoVEFVcExoRjZJeU1oZ29xMERtNG9aQkEvMXVTNlo4TDVSa1pFR1VQNXRPenFMMThqZERKakpTbkQ2MnNQeWI4dTd3V3J3c2VnTTRQYXpCdnQvbEtUS1lCcTZQck9GMDcxMTBaU0tHL1FmVWZXUzF4NlhiaG5heTZkVXhUZEc2VFpHU0FOSEhabmQ3TGRXVVdXS0hIV3ZiK2ZsbHNSU01mMmU0Szl4aWo5RG96TVZVVTBrVWxlYlBOTkdEaGdmQkJjY3Q1RzJsZWtPNUZWaUZNcEtGQk9ocUFnZEdKYy9KNnpjZ3cyYWNGTlp5Z05VS2NibjZ3aUF6RzhVWmNzOCs1VU4yaWg4N0lJM2IvS212cHBTMEJGc0k2NERHdHA3UHh2RWJrdWhxV1RPdlQ1WVNoSE9zOExoTDlnVkhqT1M0OXo4YlJBaTRIcFFmbEdCbEVRUTBZR1h6Z2thMkh2cmdHM3VubjNaWWhpbzFFUkNFRFg2QkNGWTVPT0VMcDdZTWJyb09CWXFQRkFoNldBQ3NRcHBNdFN2V29TakJJR0NEVUxZK1k4NndOeDJkSW9ld0dOd1lZR2RCUG8ybG93NDFaK3d6Wk90eGlaSENTSjNIUytHU2JISU9HRnd1K29KelhwZE95Q1poaHBWa0NMRHg0K25OcVI1bERJUTdGT0l3RU1ocjhSeTZabXVXS1ZDRFlwZUh6VWlmSnlCQW9xSkhpdVoxZkJyQUJzTXlrUzRuRWsyNVN0K2loSDlRbmR6NVhGbW00dWorM0RGaWZwNmh0aGtXQUt2SlR5V29Qdm9WY1Ywa2lCYkNlaVlyWE5kQ3R3ZWZsd3kxeVlpVkJQNUhyYXJnNzhudzVUWGRZeksrZWt5dUx6U2lwK0VnZ21zUWp4MElBRnRJUFdXMldBZXR3YzVmWXhWVjBuQnc4UHFDL1diV2hrbEMwOHJ1Y0J0Ti8rRDE4bUtDcmNJUEpHWDFFSmxFVXdyQXlidngyVTE0alFSR01MSkdxR3htY0JpcnRlZEEzUVZjSXIvZE5FbmdOUWZtL21aZ2g3cWs5dzYydndBYndZa05MbDFXOElzdUFoUjdjOVh5WnNKaXBTRkRvY1hCK2hvTGM2aDlpb01DVXFyc3hhUE9Bc1dQbnR6cHU3ZmNNVnRHVjRERHVJSFd5Umk4cnI1ZzN0L0NaeG0rUlhuRmNucmxTVHJDOUZNQ0N0UkJITDFXRG9iSFFaUDFGbWhSVlA1YzFibFhuVmpXNlM2TzNSNDZDbUI5NEVueGowVHFvaVdaU0FLdjFhSTlJaEFjbHIyb014UDJKTGhVd2ZaZytkdkxBV2FOUzZZcVo4aW9NU1FFc29CK1UwVzdQa1dYbnhQRzlHUmo4eUFOd2dYbm9IWGxHTDJtQWhmZ2duTHU5NXV6bVJ5YmpNVE80eXVBQkxYYXdvTng4N0tCMkZOUmVwUUZXYnkvUnY1SGkxUU9wazJWTUZ0K0RGNzNmZVFCWWtMQkVYbVVoZ0pZMHdNTE5BaEg4N2toazUzZG00dkV6b05yTkExQVJ2YjlKbmgrZ2RNQnFiT21pSVZPemxBN1ZzWHVTK1A0TUJNd0Q2VFJvZENBVXA4bGlLSTUyRk5SZXBVcFl1T21pTjFHUVFQMkFhR1lxQmhibUFmdDRBQmdnTTFHbWJZQzFvOEsvUlFsNEFkaTNBSmkyN3FFdG5LdVJ6UU5ZSUx0Smw3RFFRVkdZd0FWcFozZ1J1R2NSOEZ5NVo2N2dSSDdiRXp0a1k1VzRueTJBaGVJRS9VYW9Yd0daRjRGN0ZnSFBsVHZtQ3A3K1dQdWI4eHZkQTFqSGUwbFVRV1lYQjNjd0dZTUJ6NU1zSHNDYS8rZWlRZ0lHMk5Gc2tiRFEwYldLcDUyUk5VRjhIMTdzekFNLzhnQUNuV1dra1lrRWRyWUJWbGQzTDkwd1AwOUVyL09FL2ppaFRBdW1oVmQ1QUhVVC9ueFBQbUh0MjlWc0F5eDArTDFOTmV6aWNDc3ZVSzh1VUI3WHlid05SOUVQTnN0SkV4MEo4R3dGTEZTb1FSWkdwQ2pteVQxNWNwa2VUQTh2OGNEQXhCUzZWbUpWcXJnQUZoNzZ4c1lxVnhSczhCTHo4RmdZREozbWdkT0dKdEhiMzFWSHdobHBuOXNxWWFHWGJSMDlMR1h4c1pBbGJBL3pBRkpuUTdvNjJtbStRS3BlUkxNZHNOQ1JEN2ZVc2k3THd3enI5RzdPejFOTGdvVHU2dU90OXVxdU5FQnpCTEM2ZTNycGIvY1YwQzljVUhpVUY0TmFpNEhuUSszNWdOL1YzKzh2SUt4eEo1b2pnSVdCSUtlenlQdnVvVnpWdkpqVVhrdzhQL2JPRDd6YXNhWmw1V3ZYQTNpT0FSWTZNMnBaaVJnZ001SzlqTVQwWmZvNndRTUFxOUhMU3ZUZ2pMUnJIQVdzM0YwdE5IQlVxaWRxclRuQkVQd01CaDVWZVFBWkdaQVNIYW5Sbld5T0FoWUdOdStWM1hSYVFwSm5hcTZweWxEY0x3WTd1M2dBOVJLeGh1ZS91dHRKckJMUGNoeXdxaHFPMFFXM1p4S1hCT01GWmRlQzR2dmF5MXRZdXhmZW5rblZqWjNlQnl5TThMV3ZLOW1abE4wYzJEZkxwVHp3MDZGSnRHcERsZU5naFFjNkxtSGhvVENCM3JTd2tQcVBTT0dqb1V1WmxxVVllNlVZRmVtTG8yQy9FY2wwODRPRjFHTlgvcGdZTUJnWHdFS2ZjbmExQ0tYZHVXUFRlS2RsMEdJZWNBRVBuRE0yVGFoeThoMVd0QWRqV053QUM1MVk4dlplY1RRRWNxdTRvM0NmZUY2WUJ3SThnRFg2azM4bjBkTDM5Z1hqaCtQdjR3cFlyVWQ3NkpvNXVYUUdlOEF6WVBPbXBUUVBZSTMrNmU0OGFqdmE0emhJQlQ4d3JvQ0ZqbXd0YkJMVm9nZVA0Nk1oNytZczBhbklBMWliQ01GSktqb1NqQjF4ZVI5M3dNS29GNndxNTZNaFN4aEtTeGdxQW9rVGZjSlJFRmJCQmF2TDR3SlFvUTlWQXJCYWdvNkdyTTlpS2NPSmhjalBpTTFuV0l0SVdIRE4zRHhxYVkvdlVWQURMaVVBQzUxSjNYNkVrQk1hbGdobXB0ak14RFJpR3RuTkExaUxBeEpUS0sya1djT0x1TDhxQTFpZ3hPTWZWZEJQaGlZeFlQSHhrSGxBQVI3QVdueGlUVVhjUVNxNEEwb0JGaHhLaHoxVUxESTYvR29DNzZCMjc2QjhmK2F4Y0R5QXRZZHlYU01lTG82YmcyZ3dTQVcvVndxdzBMRjlOUjEwL3FSTTRWUWFqcGo4R1M4eTVnSDdlQUI2SzJSVXVXQnlKbFhVZEFSamhSTHZsUU1zVU9XcmpNTWlCSUJkSGV4alRGNzBUTnR3UElDME1RaVoyNWgxV0FtQUN1MkVrb0NGVGo3eTdqNE9rRlpBanhHT3Fma3o3NElkdk5tWGY3QS9GQ2VVK1Y5WndJSSthL2pEeFhUNnNHUmlmWlozRndpRG54cHppeldHWWhJamwyNVhUbThWakpiS0FoWTZXZFhRU1pmZGxTMThRUmkwMUdCc0JoanZ6UVBXRmp6Wi96Z2poMnFibk05eEZReElzZDRyRFZqb1BOSXFRNWVGcEdIc1ZPcTl4Y0lBR044NXhackMyaG84UHAzeTl6aWI3amdXT0lYN1hubkFRcWUvU0trWGlrQk9SUk5mNW1adzhSNzlzYWFnWlA4aXRUNGNQaWozbVNzQUMxUjdkdTFCb1lSSGFTRmVPRXdENWdIclBJQzFoRGpCNTlZZVZBNllJblhJTllDRkFkejk4bTZSazRlWjFUcXpNZzJaaHJBSVlrMjVxYmtLc0xwNmVtbmNZeVdCcWp2c0NjK1NKcnQ5bU9JQktObFI5UVpyQ1d2S1RjMVZnQVhDTnJkMzA5OFhGSWpRQWJZY3NwVEFrcUl4SHNDYVFkak5QeDRvb0daRk1qQVlBVXpYQVJZR0IzZUhxMmJuQ205NEJpMWpETXNMM0wvMHdscEJFUW1zbmVvR3RkMFhJb0dZS3dFTGc5bGRlWlIrT3pWTCtJOHdhUGwzRVRJQTY1dDdyQkg0V2cyWmxrWGxsVWNqNFlIeW43c1dzRURaL0QwdDlPdmJNbWhBWWlwN3c3TSt4NVEreHcrQUI3RENHdm5OeEF3cUtGZmYxeW9hYXJvYXNEQ3cxSklqQlBNc0lzeFowdEszMi9waGtmSVlBN3lBTlRFd01WV0FlVnBKL0hPeVJ3TWpQZCs1SHJBd3lDMEZUUVFIT0FZdEJpd0dxaDk1UUFPcmM4ZWwwN2JDSmoxNG9QdzFuZ0FzVVBtSHZFWkNhZ3pzSml4cC9jaTB2SUQ5U1lzZndTcU5OdWMzS2c5RWVqdm9HY0RDZ0xma045TGdjWUh6T29PV1B4Y3FBM1M2MkxDaHM0S3FaRXVCZDhBS2E5eFRnSVVCSlJVMWlRbEQ0VWNHTFFZdHZ3RVllQjY4Zjk2RWRFb3U5c1l4TUZqNjhoeGdZWEJacGMxMDRlMloxUDhXQmkyL0xWZy9qeGRnMVg5RU1sMTBSNlpZQThFTDNTdnZQUWxZbUp5Uy9XMGlsOWJQaDNNQ1FEOHZZcitNSFdBRkQzYmt0TnBaMGU0VmZEcGxISjRGTEl5MG9yYURicnczWDhSTitZVnhlWnorUEFZak52Q3Y5eFhRZ2JwanB5eHlMMzNnYWNEQ1JEVzFkdE9vWmR0RnZVTk9UZVBQeGV4bEVOZFN4SXhkWGtKSDJycTloRTFoeCtKNXdNS29PN3Q3YWZhTHUwVHVIN2crZUptQmVXeitBV1h3TXZKWklVVU1haUQ0b2ZrQ3NMU0pYUEZ4aFNqU0t0SXRjM29hQm02WGhqTkJYd1VlN2pjOG1aNzg1SURHM3I1NDlSVmdZVVkvMkZ3akhFd1JDSXFKWjRtRWFlQW1IZ0RQZ25jaFhYMjRwY1lYSUJVOFNOOEJGZ2FmVmRwQ1Y4ek1FU1hFM01TczNGY0cxOU9ISmRFVnMzSUVEd2N2WkwrODl5VmdZWEpSem1qTThwSSt2UlpYNUdFd1VIVkRBRzlxK2lvbzExVXZ4V1VuZVBvV3NFQlVxQ2xSNVJZT3BtZHl0Z2MrSGl1bzA4SVJFRUg5T0FZKzlxRzZGWm50QktuZ2Uvc2FzRFJDZkpsZVR4ZmNua2svRzU3TWkxYkJSYXVxNU9ORXY4Q1RpTnBZbjNGWVkxZGZ2ekpnblpqK1BaVkhhZGhEeGVLSWVNN1lOQzdheXNBVnQ4MExSMER3SUZ3V1JqeGNUSHVyTzN3TlVzR0RaOEFLb2tiUDhWNXhSQnlZbUJKSXZjeUxObTZMMWducFJjVm5BS3h3L0lPS0FrZkE0OGY5NFY4VnRBeWp2bVhBQ2tPZWxPSWpkUDI4UEZiSU0yQTdCdGpCaXZVYjV1ZFQ2bmIzWndjTnM3UXNmOFNBRllHRXJSMDl0UGl0dlNJaG9QRFo0c1hyMk9KVlVmS3h1MC9nTVNTZkJNKzFkZlJFNEVyK21BRXJCZzhndjlZTjh3UFNGdXUyMlBWQkpuQUY2NnJBWTBrZXpGOFZZM2taL3BvQlN3ZkoybzcyMENQdjdxT3p4NlNLdW00eW1aYnY1VjhRUkkzQXM4ZW0wU1B2N1dPcFNzYzZ4Q1VNV0RvSmhjdHlkclhRME1WRmRGcENzb2psd2c3SmdNTTBNTUlENEJuRUFZS0hFcFlVVWU2dUZnTWN5SmN5WUJua2dkNWVvdFVicWtRUlYrUWdnZ2N5QXhlRFZpelFBbytBVjhBelE2Wm0wUnNicXdpOHhNMFlCUml3ak5HcjcrcXF3NTEwejJ0N3hHNkpyS2FjYTR0Qkt4Sm9nVGZBSTROR3A5RjlyKzl4YlpuNFB1YVA0eHNHTEl2RXp5NXJwdEhMU2tTcUR5VC9qOFMwL0xrL0FlMk1XMUtFM2hOeHF6bGxmUHl6dU54WWgyV1ZnTnJ2djB5cnB4dnZ5eGNaSU9CNHlnRGxUNERTNWgwOGNQcXdaSkcyZUgxNnZjWW0vR3FSQWl4aFdTUmc4TSs3dW52cG5lK3I2ZW81dVVKWGdhQlZqWUg1MVI4QWhqbUhudXFhT2JuMDd2ZlZCSjdnSm84Q0RGanlhTmwzcDlhalBmVEtWNVVpYnhHWWw0SEwrMkFGcDAvTTlaV3pjK20xcnlvSlBNQk5QZ1VZc09UVHRPK09MZTA5OU5yWGxYVFY3Rnc2UFNGWkZMaGtTY3RiNEFXOUpZNStWOC9PcGRlL1pxRHFZMzZiM2pCZzJVVFk0TnRpdDhWUkVTWEhZQzJDdytCZ0xvYmgydU15NWc1emlMbUUzdkxkVFRYcytCbk04RGErWjhDeWtiaWh0MFpsazNXcDlZU3NrV2VQU1JOUzE2QXhyT2R5aTlTSnVZS2tqTG5ESE1MUTRwZHFOYUc4SEsvL0diRGlSUG44M2EzMHdPcHk0WUNxSFJjSGovZldjY2t0UUJTdG41Z1RjZXhMU0JaenRmQ05jc3JmMHhvbnJ1SEhNbURGbVFmcW1qcHA5VGRWZE5QQ1FwRURDZUNGWEVpLzVMQ2Z1QjBaUVh2TWdUWVhtSnMzdnFraXpCVzMrRktBQVN1KzlPOTdPb3pmV2FYTnRPVHR2WFRsckZ6cVB5S0ZmallzY1B5SUpnSHdkL0trVWh6MVFIUFFIb1lTekFYbWhKczZGR0RBVW1jdStub0NKZjNHckFhYThVSVpYWHhIbGxoRUlyUmpUQnBMWGhJbFQwaFNnOGFrQ2VVNWdBcTBudmxDbWFBOTU2VHFZMGVsM2pCZ0tUVWRwM2FtdXFHVDFteXBwU2xQbDlLUWFWbkNPZ1V6T255N1dPZGxYTG9DelVBNzBCQ1dQdEIweWpPbHRHWnJMVlUzOHBIdlZBNVU2eE1HTExYbUkycHY2bzkwMGRlWmgrbisxL2VJRk02UURxQm42VGNpUlVnS0hJQjlLb0NCSnFBVHdBbTB3dnZyNStmUi9hdjJDRnFDcHR6Y1F3RUdMUGZNMVVrOVJjZ0hMSTB2ZlhtSUpqeStneTZkbGgyd1pwM1F3Y0FFNzBjSkRHTWVORHBWNktFQVVBTkdwdENsMDdNRmpVQXIwSXpEWlU1aUpWZjl3NERscXVtSzNObkR6VjIwdGJDSm52cmtnUEFSK3YyZDJTTDFEWTQrMEg4aGRBUXBucjBraFdFc0dOT0F4RlF4UmdBVWt1TmRkbGMyalgyc2hKNys5QUJ0SzJ5aWhoYVdvaUp6anJ1K1ljQnkxM3pwN20xamE3ZXdjQ0ZSM0l3WGRvbXNBZWRQeXV5VHdxQmsxc3BKWWRGRE1sSFJsUUo5UXQvUVI3Z2FvTS9vTzRBWS9sRVkwMS92S3hCamhPdEJkbWtMTmJWMjY2WVRYK2d1Q2pCZ3VXdStUUGNXTlJjUDFoMmpyUVZOOU1yNlNwRklMbkhwZHJwbWJpNmRQeWxEU0NiUTh5QjFMd0FCN3dFSWtGaGc3a2UyVE5tZ3BvRVI3bzFuNEZsNEpwNk5QcUF2ZUkvUEFVem9LL3FNSkhnWUE4YUNNV0ZzM1B4QkFRWXNmOHh6eEZGMmRCNm5pdG9PeWk1cm9iWEpkYlJ5M1NIaGdUOXB4VTc2MTZJaTRZOTB5WlFzK3RXRWREcnJoSVFESlQrT21RQVZJZTBrQUZ5U292N2h1S1pkajkvaUhwQ1dBRWE0TjU0QjN5YzhjOUtUTzBVZlhseDNTUFFKZlVNZjBWZHUvcVlBQTVhLzV6L202TnVQOVZCdFV5ZVZIbWluekozTnRLV2dpZGFuSDZZUE50ZlFxZzFWdFBLTFE3VGk0d3BhOXY1K2V2VDkvZUlWNzdVLzdUTmNBekRFYi9CYjNBUDN3ajF4Ynp3RHorTEdGSWhHQVFhc2FOVGg3NWdDVEFHbEtNQ0FwZFIwY0dlWUFreUJhQlJnd0lwR0hmNk9LY0FVVUlvQ0RGaEtUUWQzaGluQUZJaEdBUWFzYU5UaDc1Z0NUQUdsS01DQXBkUjBjR2VZQWt5QmFCUmd3SXBHSGY2T0tjQVVVSW9DREZoS1RRZDNoaW5BRkloR0FRYXNhTlRoNzVnQ1RBR2xLUEQvQWRXcDJSQnhQVXVTQUFBQUFFbEZUa1N1UW1DQyIvPgo8L2RlZnM+Cjwvc3ZnPgo=";
|
|
1385
|
+
const MYALGO_WALLET = {
|
|
1386
|
+
id: PROVIDER_ID.MYALGO_WALLET,
|
|
1387
|
+
name: "MyAlgo Wallet",
|
|
1388
|
+
icon: icon$3,
|
|
1389
|
+
isWalletConnect: false,
|
|
1390
|
+
};
|
|
1391
|
+
|
|
1392
|
+
const icon$2 = "data:image/svg+xml;base64," +
|
|
1393
|
+
"PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
|
|
1394
|
+
const ALGO_SIGNER = {
|
|
1395
|
+
id: PROVIDER_ID.ALGO_SIGNER,
|
|
1396
|
+
name: "AlgoSigner",
|
|
1397
|
+
icon: icon$2,
|
|
1398
|
+
isWalletConnect: false,
|
|
1399
|
+
};
|
|
1400
|
+
|
|
1401
|
+
const icon$1 = "data:image/svg+xml;base64," +
|
|
1402
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
|
|
1403
|
+
const DEFLY = {
|
|
1404
|
+
id: PROVIDER_ID.DEFLY,
|
|
1405
|
+
name: "Defly Wallet",
|
|
1406
|
+
icon: icon$1,
|
|
1407
|
+
isWalletConnect: true,
|
|
1408
|
+
};
|
|
1409
|
+
|
|
1410
|
+
const icon = "data:image/svg+xml;base64," +
|
|
1411
|
+
"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
|
|
1412
|
+
const EXODUS = {
|
|
1413
|
+
id: PROVIDER_ID.EXODUS,
|
|
1414
|
+
name: "Exodus",
|
|
1415
|
+
icon,
|
|
1416
|
+
isWalletConnect: false,
|
|
1417
|
+
};
|
|
1418
|
+
|
|
1419
|
+
const providers = {
|
|
1420
|
+
[PROVIDER_ID.PERA_WALLET]: PERA_WALLET,
|
|
1421
|
+
[PROVIDER_ID.MYALGO_WALLET]: MYALGO_WALLET,
|
|
1422
|
+
[PROVIDER_ID.DEFLY]: DEFLY,
|
|
1423
|
+
[PROVIDER_ID.ALGO_SIGNER]: ALGO_SIGNER,
|
|
1424
|
+
[PROVIDER_ID.EXODUS]: EXODUS,
|
|
1425
|
+
};
|
|
1426
|
+
|
|
1427
|
+
const audio = `SUQzBAAAAAIYBlRJVDIAAAAWAAAAMzAgU2Vjb25kcyBvZiBTaWxlbmNlVFBFMQAAABIAAABBbmFyIFNvZnR3YXJlIExMQ1RBTEIAAAAMAAAAQmxhbmsgQXVkaW9BUElDAAIPAgAAAGltYWdlL2pwZWcAAwCJUE5HDQoaCgAAAA1JSERSAAAEOAAABDgIBgAAAOwQbI8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACD0AAAg9AQWVVbYAAAAHdElNRQffCgsFHDEDbwR2AAAgAElEQVR42uzde5RVZd0H8N8wDDcBAS8o6oCJVyxTsDSxojJvgVYq3jVNUQgzaZWmpqh56+ItNa+kr4Cay9Q0DQ1DWb2WeSm8pGRy0RAEgRFhuIzz/tFbC5yZc86eOWfmPDOfz1rvemvvZz9779+zz3DOt2fvXRER9QEAAACQsE5KAAAAAKROwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8BBq9pss81i4sSJMXToUMUAAACgaCoiol4ZaA177rln3HzzzdG/f/+oqamJww8/PGbNmqUwAAAAtJgZHLSKk046Ke67777o379/RET07t07pk6dGtXV1YoDAABAi5nBQcmde+65MW7cuEbXvfjii3HIIYfE2rVrFQoAAIBmq4yIC5WBUqioqIgf/ehHceqppzbZZosttohevXrFk08+qWAAAAA0/zdomMFBCVRWVsZPfvKTGD16dEHtjzrqqJgxY4bCAQAA0CwCDoquU6dOccMNN8SoUaMK3mbOnDkxYsSIWL16tQICAACQmVtUKLoLL7wwjj766Ezb9OnTJz788MP44x//qIAAAABkZgYHRXXyySfHxRdf3Kxt16xZEyNGjIg333xTIQEAAMjEa2Ipmv333z8mTpzY7O27dOnSou0BAADouMzgoCh23333uO+++6J79+4t7utLX/pSvPLKK4oKAABAwczgoMW22mqruOOOO4oSbkREjBs3TlEBAADIxAwOWqRTp05x3333xV577VW0Puvq6uIzn/lMzJ8/X4EBAAAo7PepEtASp59+elHDjYiIysrKOO200xQXAACAgpnBQbPtuuuu8cgjj0RVVVXR+66trY0999wzlixZotAAAADkZQYHzdKtW7e4/vrrSxJu/Kf/r3/96woNAABAQQQcNMv5558f22+/fUn3MWrUKIUGAACgIAIOMvvCF74Q3/jGN0q+nz322COqq6sVHAAAgLwEHGRSVVUVl156adH7Xbp0aaPLzeIAAACgEAIOMjn22GOLPqvimWeeic997nOxaNGiBusOOeQQRQcAACAvAQcF69GjR5x55plF7fOhhx6KI488MhYvXhxTp05tsH7IkCGx3XbbKT4AAAA5CTgo2De/+c3YbLPNitbfM888E+PGjYs1a9ZERMTkyZOjvr7hW4vN4gAAACAfAQcF6dOnT4wdO7Zo/S1dujTGjh0bdXV1/1321ltvxaxZsxq0HTFihAEAAAAgJwEHBfnWt74VvXv3Llp/Z555ZrzzzjsNlj/++OMNln3iE5+Irl27GgQAAACaJOAgr/79+8dJJ51UtP5uu+22RoOMiIhp06Y1WFZVVRWf+MQnDAQAAABNEnCQ19ixY6Nbt25F6evdd9+Nyy+/vMn1s2bNanRmx5577mkgAAAAaJKAg9wXSKdOMWrUqKL199Of/jQ++OCDnG0am90h4AAAACDn71clIJe99tor+vfvX5S+3njjjZgyZUredo0FHMOGDTMYAAAANEnAQU4jR44sWl8/+tGPYt26dXnbPf3007Fq1aoNlm2yySax7bbbGhAAAAAaJeCgSZWVlXHwwQcXpa9nn302HnvssYLarl69Ol588cUGyz/1qU8ZFAAAABol4KBJe++9d2y66aZF6euiiy7K1P6VV15psGyPPfYwKAAAADRKwEGTDjnkkKL088gjj8Rzzz2XaZuXX365wbKBAwcaFAAAABol4KBRnTt3joMOOqjF/axbty4uvfTSzNs1NoNjq622MjAAAAA0SsBBo/bZZ5/o27dvi/v5n//5n3jzzTczb/faa69FfX39BssGDBhgYAAAAGiUgINGFeOBnitWrIirrrqqWduuXr063n///Q2Wde/evSihCwAAAO2PgING7brrri3u46abborFixc3e/ulS5c2WOY2FQAAABoj4KBRQ4YMadH2a9eujV/+8pct6mPZsmUNlrlNBQAAgMYIOGigT58+LQ4SHnrooViyZEmL+mgs4DCDAwAAgMYIOGhg8ODBLe6jpbM3IiI++OCDBssEHAAAADRGwEED/fr1a9H2s2bNiueee67Fx9HYA0UFHAAAADRGwEEDLX1TyaRJk4pyHJtvvnmDZZ7BAQAAQGMEHDTQkhkcy5YtiwceeKAox7HZZps1WNazZ08DBAAAQAMCDhro06dPs7e9++67o7a2tsXH0KVLl+jdu3eD5Z07dzZAAAAANCDgoIHKyspmbVdfXx933nlnUY5hu+22K+qxAQAA0L4JOGhg5cqVzdpu+vTpMWfOnKIcw/7779/ocgEHAAAAjRFw0EBzA45ivBr2Pw488MBGl7tFBQAAgMYIOGjggw8+yLzN3Llz48knnyzK/rfaaqv4+Mc/3ug6AQcAAACNEXDQQHNmcEyePDk+/PDDouz/oIMOanKdW1QAAABojICDBpoTcDz22GNF2XePHj1i7NixTa4XcAAAANAYAQcNZL1FZc6cOfGPf/yjKPseP3589O/fv8n1Ag4AAAAaI+CggawzOKZNm1aU/W699dZx2mmn5WzjGRwAAAA0RsBBA1lncDz++ONF2e95550XXbt2zdmmWM/5AAAAoH0RcNBAlhkcNTU18ac//anF+9xzzz1j1KhRedstWrTIAAEAANCAgIMG3nnnnaivry+o7fTp02PdunUt2l9FRUVMnDixoLb/+te/DBAAAAANCDhoYPXq1bFw4cKC2hbj+RuHHXZYfPKTnyyo7YIFCwwQAAAADQg4aNScOXPytlm3bl1Mnz69Rfvp0aNH/OAHPyi4vYADAACAxgg4aNTcuXPztvnzn/8cNTU1LdrPuHHjcr4W9qMEHAAAADRGwEGjCgk4Xn/99RbtY6uttorTTz890zaewQEAAEBjBBw0qpBbVJYvX96ifVx55ZXRrVu3TNuYwQEAAEBjBBw0at68eXnbtCTgOO6442LEiBGZtxNwAAAA0JjOSkBjCpnBsWzZsmb1PXDgwLjgggsyb7dmzZp47733DA4AANCqKioqmr0sa9tCt1+3bl18+OGHBmc9Ao717LTTTrHjjju2yoVbqu1b+mFaf3ltbW3OW0h233336Ny5c6Z9VVRUxJgxY6JHjx6Zx2fBggVx4oknluRcy2Vcy+EPain2laVdSuea0nWVyjXoXNvn562tx6pcz7UUY9Xevos4V99FfBfxXaRcPgPl6OSTT45HH33UD/n1xzQi6pXh3yZMmBATJkxQCAAAAMraKaecEo888ohCrMcMjiJZvHhxo7ds1Nc3nh9lWZ61j6Zk7bu6ujp69+7dZH8LFiyIxYsXF3yM3bp1ix122KHZSens2bPj/fffb9b5t8U4pDDG5VyTVMcy6z6LcZ4pjHG51NvnNYyxz6ux7EDfF4yxsWwP36E68vf7Aw44IMaNG9fk+k6dPFJTwFEi1113Xdxyyy3t6py+973vxZlnntnk+nvvvTeuuOKKgvqqqqqK3/72t80ON9asWRNf/vKXY/Xq1S42AACg3dtpp51yrk/9FptSEPnQpL/97W851/fp06fgvs4666wYMmRIs4/lL3/5i3ADAADoMPI9QNQMjkZqogQ0ZdasWTnX9+3bt6B+9thjj/jWt77VomP54x//aEAAAIAOQ8CRnYrQpLfffjvna1kLmcHRrVu3uPbaa6OysrJFxzJz5kwDAgAAdBj5ntch4GikJkpALrlmcVRXV+fd/rzzzouPfexjLTqGVatWxQsvvGAwAACADsMMjuxUhJxyPYejuro6unbt2uT64cOHxze+8Y0WH8PMmTNj7dq1BgMAAOgw8s3g8JDRhgQc5JQr4OjUqVOTszM22WSTuOaaa4ryobvzzjsNBAAA0KHkm8HR0scAtEcCDnLK96DR7bffvtEP2o033hhbbrlli/c/Z86cmD59uoEAAAA6FLeoZKci5DRv3rxYvnx5k+sbCzjOOeecGD58eFH2f8cdd+SdmgUAANDeeMhodipCXrlmcXw04Dj44INj7NixRdnvqlWrYurUqQYAAADocMzgyE5FyCvXczjWDzgGDx4cV111VdH2e//990dNTY0BAAAAOpx8AYeHjDbUWQnIJ1fAsd1220VlZWV07949br/99ujZs2fR9jtp0iTFBwAAOiQzOLJTEfLKFXB06dIlqqur46qrrorBgwcXbZ9/+tOf4pVXXlF8AACgQxJwZKci5DV37tyct4pcfvnlcfDBBxd1nzfeeKPCAwAAHZaHjGanIhT0wXrppZeaXL/vvvsWdX9PPfVUTJs2TeEBAIAO/Tss5495AUfDmigBhch1m0oxrVu3Ls4//3wFBwAAOjS3qGSnIhQk16tii+n222+P2bNnKzgAANChCTiyUxEK0hozOBYvXhw/+9nPFBsAAOjwBBzZqQgFefPNN2PFihUl3cell16a82GmAAAAHYWAIzsVoeAP18svv1yy/l988cW45557FBoAACA8ZLQ5VISCvfLKKyX74J533nl5P8AAAAAdRb4ZHBUVFYr0EQIOCjJkyJA47LDDStL3TTfdFM8//7wiAwAA/D+3qGSnIuQ1aNCgmDJlSvTq1avofb/44otx2WWXKTIAAMB6BBzZqQg59e/fP+65557YbLPNit73+++/H6effnqsXbtWoQEAANYj4MhORWjSxhtvHFOnTo1tttmmJP1/73vfi7lz5yo0AABA1h/zAo6GNVECGtO9e/e46667YqeddipJ/1OnTo0HH3xQoQEAABphBkd2KkIDVVVVceutt8bQoUNL0v/rr78e5513nkIDAAA0QcCRnYqwgYqKirjmmmtixIgRJel/9erVcdppp8WqVasUGwAAoAkCjuxUhA1ccsklceihh5as/3PPPTf+/ve/KzQAAEAOAo7sOisBEf+euXHppZfGCSecULJ93HjjjTFlyhTFBgAAyCNfwFFRUaFIHyHgIDp16hQ//elPY/To0SXbxyOPPBKXXHKJYgMAABSgvr4+7+84NiTg6OgXQOfOce2115b0tpTnn38+xo8fn/cDCgAAwL+5RaUZv2+VoOOqqqqKG2+8MQ466KCS7WPevHlx4oknRm1trYIDAABlpbHbPJq69aNYywtt27lz7p/rAo6GBBxFMmzYsFi9enWbfwgKXV5VVRWjR4+OHXbYoWQ1qa2tjYcffjgOP/zwZp9j1vMs5R+jch3LcqxJKc+znGpVLv9QpjrGqX5e29sY+7waS2NsjP0b4zthR/hO2B4JOAQcJTNy5MgYOXKkQqynW7duMXbsWIUAAAAoMgFHQwKOIlm8eHEsW7aswfLGnjvR1LMoWtq2Keu3raioiIEDB0aPHj1KWo958+bF0qVLS16HLLVpzbEo13Mrh/PNcm6pjaVza/3jNZbOrb2dm3/v2te5+Qym9z3FZ9C5ldP3lL59+8a9994r4BBwtL7rrrsubrnllrI+xt69e8eUKVNKHm5ERBx88MGxZMkSFwYAAEAzbLLJJjnXCzgaqYkSdAz9+vWL++67L/bYY49W2V9r7QcAAKA98haV7FSkA+jdu3fce++9seuuu7baPocPH67wAAAAzSTgyE5F2rlu3brFHXfcEbvsskur7lfAAQAA0Hz5ni3Skd4YUygBRzvWuXPnuOmmm+LTn/50q+97p512ik033dQgAAAANIMZHNmpSDtVUVERP/vZz2K//fZrs/2bxQEAANA8Ao7sVKSduvDCC+Owww4r6T5mzpwZNTU1Ta7fd999DQQAAEAzCDiyU5F2aPz48XHKKaeUdB/PPfdcnHjiifHXv/61yTYCDgAAgObJF3BUVlYq0kcIONqZL37xi3H22WeXdB+vvvpqHHvssbFy5cp4/vnnm2y39dZbx6BBgwwKAABARh4ymp2Aox0ZOHBg/PznPy/phT537tw4+uijY/ny5RER8cILL+Rs7zkcAAAA2blFJTsVaSe6desWt956a2y88cYl28eiRYviqKOOioULF/53Wb6Aw20qAAAA2Qk4slORduLyyy+PIUOGlKz/mpqaOOqoo2LOnDkbLH/33XfjrbfeanK7ffbZx9QpAACAjPLdoiLgaKQmSpC+448/Po444oiS9V9bWxvHH398vPrqq42uzzWLo1+/fiUNXgAAANqrXLM4BByN1EQJ0rbHHnvExRdfXLL+161bF6eeemr8+c9/brKN21QAAACKL1fAYaZ8QwKOhHXp0iWuvfbaqKqqKkn/9fX1ceaZZ8YTTzyRs12uN6lEeNAoAABAc3+TNflj3gyOhjVRgnSNHz8+Pvaxj5Ws/x/+8Idx//335203a9asWLduXZPr99prr5KFMAAAAO1VXV1d0z/mBRwNa6IEadp2221j/PjxJev/5z//edx2220FtV21alW89tprTa7v3r17DB061KABAABkkOsWlcrKSgX6CAFHoq644oro0qVLSfr+/e9/H5dffnmmbfLdpuI5HAAAANl4Bkc2nZUgPV/72tdK9lyLN998M8aNG5f3ncsf9fzzz8dxxx3X5Prhw4fHj3/844iI2GSTTWLPPfeMXXbZJfr16xd9+/bd4P/36dMnVq5cGUuWLInFixfH4sWL//uf586dGzNmzIhly5a5EAAAgHbNW1SyEXAkpnfv3nHhhReWpO8PPvggvvGNb0RNTU3mbV988cWc63fbbbf42c9+Fp/61KcKem5Iz549Y/PNN290XV1dXTz77LPx+OOPx7Rp0+KNN95wYQAAAO2Oh4xmI+BIzLnnnhubbrppST44Z5xxRrz++uvN2n727NmxYsWK6NmzZ6Pru3TpEkceeWRRjrWysjL22muv2GuvveL888+PN998Mx577LG4+eabY+HChS4SAACgXTCDIxsVScigQYPimGOOKUnf11xzTTz66KMt+uDlm8VRKttuu22cfvrpMXPmzBg/fnzJnk0CAADQmgQc2ahIQk455ZSSXMRPPPFE/OQnP2n29hUVFXHEEUfE4MGD27Q+G220UZxzzjkxY8aMOPDAA10wAABA0gQc2ahIIjbeeOMYPXp00ft9880341vf+lbmh4r+xy677BIPPvhgXH311bHFFluURa0GDhwYt912W9x7772x8847u3gAAIAkeYtKNgKORBx33HHRo0ePon9YzjjjjGY9VLRXr15x8cUXx+9+97sYNmxYWdZs+PDh8dhjj8URRxzhAgIAAJLjIaPZqEgCqqqq4uSTTy56vzfffHM899xzmbf76le/Gk8//XScfPLJUVlZWfa1u/rqq2PChAkuJAAAICluUclGRRJwyCGHRP/+/Yva5z//+c+48sorM21TWVkZl156aVx//fVNvsK1XE2YMCGuuuqqqKqqckEBAABJyBVwlPv/2NwWBBwJGDNmTNE/JN/5zneitra24G169+4dd911V5x44onJ1nH06NFx1113Ra9evVxUAABA2fMMjmwEHGVu+PDhMWTIkKL2efvtt8ezzz5bcPuBAwfGb37zm/jc5z6XfD333XffeOCBB4o+IwYAAKDY3KKSjYqUua9+9atF7W/OnDlx2WWXFdz+05/+dDzyyCOx/fbbt5ua7rzzzvHLX/4yunXr5gIDAADKloeMZtNZCcpbsWdNfPe7341Vq1YV1PaTn/xkTJ06tV0GAbvttltcddVVcfrpp7vIAICSa2oqeTGWZ52mXoy+2+J8inGe5XTcxTjPFI67PV2zbTGWuZ4hKOAQcJTMgQceGNtss01RPwQbb7xxDBgwoGjHOH/+/Bg1alSMGjUq77H07NkzDjjggHY9y+GQQw6JwYMHx9///vd2/Y9WOf3x949W+/likuoXLWNsjP0w8m9MW/2NACg2AUcjf5cjojspCGQAACAASURBVF4Z/m3ChAleJwoAAEDZW7hwYey+++4KsR4zOIrk1Vdfjblz5zZY3tg9U03dR/XR5cOGDSvawzDnz58fL7zwQt5jiPj3cze22GKLDjN2a9eujccffzyWLVtWlHErZdumlOIYWvt8s9SgXMfHuXXMczOWzs25Ff/flfb8GfT3xbm5Tp1blrZPPPFEbLfddo22N4NDwFEyd999d9xyyy1F66+qqipeeeWVov2AP/zww2PevHl5206cOLFDhRv/qfWuu+4aX/jCF2LlypUuZgAAoCzU1dU1uU7A0UhNlKA8DR06NDbaaKOi9HXXXXcVFG7svffeccopp3TIeldXV8cZZ5zhwgMAAMpGrtfEVlZWKtBHCDjK1Gc/+9mi9LNy5cq4+uqr818InTrFxIkTO3TNTzvttBg0aJCLDwAAKAteE5uNipSpYr0e9t5774133303b7vRo0fHrrvu2qFr3qVLlw4f8gAAAOUj1wwOb3JqSMBRpnbaaaei9DN58uS8bXr27Blnn322okfEfvvtF1/84hcVAgAAaHO5Ag4zOBqpiRKUn169ekX37t1b3M9f//rXePnll/O2+/a3vx2bbbaZwv+/iy66KKqqqhQCAABoUwKObFSkDG2++eZF6WfKlCl522y55ZYd9sGiTdl2223j1FNPVQgAAKBNCTiy8ZrYMtS/f/8W97Fy5cr49a9/nbfdqFGjokuXLm1ynq+++mrceuutUV1dHQMHDozq6uqorq6OTTfdtM3HYMyYMXHzzTfH2rVrXZAAAECbEHBkI+AoQ8W4XeShhx6KFStW5G138MEHF/346+rq4sknn4y+ffvG0KFDm2zXp0+fmDp1aoPlgwYNimOOOSZGjx7dZmHHpptuGgcccED85je/cUECAABtItdbVDxktCGRTxkqxgyOQn6Y9+/fP2cAkdW8efPiyiuvjD333DOOP/74eOyxx3K233LLLaNnz54Nls+ZMyd+9KMfxdChQ+PUU0+Np556KucHu1SOO+44FyMAANBmzODIRkXKUEufwbF27dp45pln8rY76KCDipL6zZo1K4488sjYe++94+qrr4533nknIiJef/31vNvusMMOOc/j4YcfjiOPPDI+85nPxOOPP96q47DPPvvEoEGDXJAAAECbEHBkoyJlqKUBx1/+8pdYtWpV3nYHHnhgi/ZTU1MT5557bhx00EGNzrJ47bXX8vax/fbbF7SvuXPnxoknnhgTJ05stediVFRUxLHHHuuCBAAA2kSugCNCyNGgHkpQflp6i8rTTz+dt02/fv1i7733bvY+fv/738dnP/vZmDRpUtTV1TXaZv78+bFy5cqc/eSawfFR9fX1cdNNN8UhhxwS8+bNa5WxGD16tFfGAgAAbULAkY1qlKGWzuAoJODYb7/9orKysln9X3vttXHCCSfEokWLcrarr6+P2bNn52yTJeD4jxdffDG+/OUvt8oDQDfZZJM44IADXJQAAECry/csQg8a3ZCAo515//3348UXX8zbbtttt83c99q1a2PMmDFx+eWX500S/yPfbSrNCTgi/n17zJgxY+Luu+8ueU332WcfFxYAANDqzODIRjXK0OLFi5u97d///vcmbxlZX9++fTP3feGFF2aeNZHvQaNbb7119OjRo9nne/bZZ8dzzz1X0vHYY489XJQAAECrE3BkoxplaMmSJc3e9o033iioXZ8+fTL1e++998akSZMyH0++GRwVFRUxePDgZp/vmjVr4pvf/GYsXLiwZOOx0047Rffu3V2YAABAqxJwZKMaZaglAcc//vGPgtplmcHxt7/9Lb7//e8363gKeZNKc29T+Y+FCxfGySefHGvWrCnJeHTu3Dl22203FyYAANCqBBzZqEYZasktKsUOOJYsWRInn3xyrF69ulnH8/bbb8cHH3yQs01LA46IiOeff77ZIUwh3KYCAAC0Ng8ZzUbAUYbK6RaVCRMmxNtvv92iD2S+53AUI+CIiLjnnnvi97//fUnGRMABAAC0tnwBR3PfjNleCTjKUHNncHz44Ycxd+7cgtr27t07b5t58+bF448/3uLzKdWbVBpz0003lWRMdt99dxcmAADQqtyiko1qlKH58+c3a7sVK1bEunXrCmq7dOnSvG2mTJmSNzEsRL6Ao7q6Orp27VqU2s2cOTNefvnloo9J1oeyAgAAtJSAIxvVKEMvv/xyQQHERy1btqzgtvPmzcu5ft26dXHPPfcU5XzyBRydOnWK7bbbrmj1K8Usji5durgwAQCAViXgyEY1yvQifvrppzNvt3z58oLb5psl8sQTTxTt1aut8SaV9T344IPxzjvvFHVMKisr3d8GAAC0Kg8ZzUbAUaZmzJiReZssAUe+Z3X89re/Ldq5LFiwIN5///2cbYoZcKxduzZuu+22oo+JWRwAAEBrMoMjG9UoU80JOIp5i8qCBQuKej6t9SaV/5g8eXJRnh+yPgEHAADQmgQc2ahGmfrXv/4Vs2fPzrRNXV1dwW3z3aJS7Fs85syZk3N9MZ/BEfHvsKclr7dtTLEehAoAAFAIAUc2qlHGss7i6NevX8FtZ8+enfONK4sWLSrqueS7JWabbbYpev0KefZHpg+LPx4AAEArEnBk/M2mBOXrySefzNQ+S8BRU1MTzzzzTKPrVq1alfeZGVnluyWmR48esckmmxR1n8UMONatWxeLFy92UQIAAK3GQ0azEXCUsaeeeirTbRZZAo6IiGnTprXahyTfDI6I4s/iyPfcjyzeeuutnDNeAAAAii3fDA5vetyQgKOM1dXVxR133FFw+6wzIJoKOLp16xabbbZZUc+lkICjurq6qPss5gyOfM8QAQAAKDa3qGTTWQnK25QpU+K73/1uQW/w6NKlS2y00UbxwQcfFNT3vHnz4tVXX42dd965wbptttkm3n333aKdx8KFC2PNmjU5z2Prrbcuau1mz54d9fX1RZmR8uabb7oYAYAWaew7SVPfU4q1vFR9l/K4i3GOKZ9Pa49lW12brtnC2vfp00fAIeBofQceeGCjt1gU4wMzb968GDx4cEHHcfXVVzf5rIjG+m7qtouzzz670VkLLTmf2tranAHHkUceGdtvv31RvySsXLkyNtpooxaP79ChQ+P6669P8o95Of2R78hfQFI+n478BcQY+5Lph1HH+jem1NcVQLH5O/SRekREvTL824QJE2LChAkKAQAAQNnbb7/94uWXX1aI/2cGR5G89NJL8cYbbzRY3thTb5t6Em6utiNGjCjoIaJLliyJ6dOnZzqGvfbaKwYOHLjB+qVLl/73GR3NOd7Glu+5556xww47NHnsNTU18dBDDxWtZhERhx12WPTs2bPF43vPPffEihUrilKH1mrblHI93izbZ6lBSufr3NI9t/b6Gcxybq5T5+bc0vn7Yiydm3Nr23PLsv1ll10WJ5xwQpPH4hYVAUdJ/OpXv4pbbrmlZP1/9atfbfIWifX17ds3Lrjggli2bFnBfe+4444xffr0DaY39e3bN3784x/Hv/71r6Kdw5gxY+KCCy5ocn3Xrl3j+9//fqY/LvmMHDmyxQHH66+/Ht/5zndc5AAAQKvykNFsVCMRDz74YLz66qv5B7RTp/jsZz+bqe/XXnstHnvssQbL999//6KeQ743qXTt2jU233zzou6zR48eLe5jxowZLkAAAKDV5fsffwUcH6mHEqThww8/jIsvvrigtiNGjMjc/9VXX91g2UknnVTU9yoX8qrYYr5JZcCAAdG9e/cW9yPgAAAA2kJdXV3uH/QCjg3roQTp+MMf/hBPPfVU3nb77bdf5h/2s2bNismTJ2+wbLvttotDDz20aMc/f/78vG2qq6uLtr/dd9+9xX2sWbMm/vd//9fFBwAAtDq3qGSjGom56KKL8l7k/fr1i+OPP75Zfb/99tsbLPv+979f0MNNC7FixYpYsmRJzjblFnD8+c9/jlWrVrnwAACAVifgyEY1EvPKK6/Efffdl7fd6aefHt26dcvU9/vvvx/f/e53N1i29dZbxxlnnFG04583b17O9dtss03R9lWMgOP+++930QEAAG3CMziyUY0EXXHFFVFbW5uzzeabbx7HHnts5r5nzJgRt99++wbLli5dWrRjzxdwFGsGR/fu3WO33XZrUR+LFy8WcAAAAG3GMziyUY0ELViwIK677rq87caNGxddu3bN3P8Pf/jDuOeee/773996662iHXu+B40W6yGjX/nKV1r8BpU77rgj1qxZ44IDAADaRL5bVCoqKhRpPQKORF133XXxt7/9LWeb/v37xzHHHNOsD9GECRNi0qRJsWbNmgbP5WiJfAHHVlttVZQU8sgjj2zR9mvWrIk777zThQYAALQZz+DIRjUStW7duvj2t7+dd4bB+PHjY+ONN27WB+ncc8+NIUOGxAsvvFC04853i0pVVVVsscUWLdrHoEGDYq+99mpRH7/+9a/j3XffdaEBAABtRsCRjWok7LXXXosrr7wyZ5v+/fvH1Vdf3ex9fPDBB7F69eqiHXO+GRwRLX8Ox+jRo1s0VWvt2rVxww03uMAAAIA2JeDIRjUS94tf/CL+8pe/5Gyz//77x6mnnloWx7tgwYJYu3ZtzjYteZNKr169mnVbzvp+/vOfx+zZs11cAABAmxJwZKMa7eCCP+OMM2LVqlU525177rlFeW1qS9XV1eV9pkdLZnBMmDAhNt1002ZvP3v27BbNeAEAACjm772cP+gFHBvWQwnSN2fOnDj//PNztqmqqopf/OIX0bt37zY/3nzP4Wjum1R23HHHOOmkk1r0x+Oss87KO8MEAACgNXhNbDaq0U5MmTIlJk+enLPNNttsUxazE/I9h2PAgAHN6vfiiy+Ozp07N/u4Jk2aFM8995yLCQAAKAv19fW5f9ALODashxK0Hz/4wQ/i+eefz9nmgAMOiEsuuaRNPwj5Ao7m3GIycuTIGD58eLOP6aWXXorLLrvMRQQAAJQNt6hkoxrtyNq1a+Ob3/xm3tebnnTSSXHjjTdGly5d2uQ4892istlmm2Xqb8cdd8z7Nplc5syZE8ccc0ysXLnSRQQAAJQNt6hkoxrtzDvvvBNjxoyJdevW5Ww3cuTImDp1aps8kyPfDI5+/foV/EHdaqutYurUqbHxxhs361gWLlwYRx55ZN5QCAAAoLXlm8FRUVGhSOsRcLRDzzzzTJxzzjl579fae++949e//nVsscUWrXp8+QKOTp06Rb9+/fL207dv35g6dWqzj7+mpiaOPvrovDNKAAAA2oJncGSjGu3U5MmT49xzz83bbuedd46HH344dthhh1Y7tpqamli+fHnONvluU+nevXvceeedMXjw4GYdw4oVK+KEE06IV1991cUCAACUJc/gyEY12rFf/vKXBYUcAwYMiN/85jcxZsyYqKqqapVja8mDRgcMGBBTpkyJoUOHNmvfc+bMia985Svxpz/9yUUCAACULc/gyEY12rlJkyYVFHL06tUrLrjggpgxY0bsv//+JT+ufAFHUzM4Dj300Jg+fXp8+tOfbtZ+Z8yYEQceeGC8/vrrLg4AAKCsmcGRjWp0AJMmTYrzzjuvoLaDBg2KSZMmxa9+9avYZZddSnZM8+fPz7n+ozM4evfuHTfccEPccMMNzX4w6k033RTHHnts3ttjAAAAyoGAIxvV6CBuv/32OP/88wtuv88++8S0adPiJz/5SebXthYiywyOz3/+8/Hkk0/GoYce2qx91dTUxPjx42PixIl5p3gBAACUCwFHNp2VoOO47bbboqKiIi666KKC2nfq1CmOPvro+PrXvx5PPfVU/O53v4snnngiFi1a1OJjyRdwDB48OE477bQ46qijYvvtt2/2fh544IG48MILi3LMAAAArUnAkY2Ao4O59dZb4/3334+LLrooevXqVdA2Xbt2jf322y/222+/qK+vj+effz6mTZsW06ZNi9dee61Zx/Huu+/mXL///vu36Fkg//znP+Pss8+OmTNnGnQAACBJAo5sBBwd0D333BNPPfVUXHHFFfGlL30p07YVFRUxdOjQGDp0aJxzzjkxZ86cePzxx+Oll16KOXPmxNy5c/POlqisrIyuXbuW5NxWr14d1157bVx//fWxZs0agw0AACRLwJGNgKODWrBgQRx//PHxta99Lb73ve9FdXV1s/oZNGhQnHLKKRssW7lyZSxYsCBWrVoVq1evjtra2qitrY2qqqqorq6Orbbaquivo62trY2pU6fGjTfeGG+99ZYBBgAAkpcv4KioqFCk9Qg4Orj7778/HnzwwRg5cmSMGzcuhgwZ0uI+e/ToEdttt12rHH9NTU1MmjQpbr311liyZIkBBQAA2g0zOLIRcBB1dXXxwAMPxAMPPBCf//zn49RTT43hw4dH587le3ksXLgwbrnllrjzzjtjxYoVBhEAAGh3BBzZCDjYwB/+8If4wx/+EP369YsDDzwwRo4cGZ/5zGfKIuxYsWJFTJ8+PR599NF49NFHPWMDAABo1+rq6nKuF3BsSMBBo957772YPHlyTJ48+b9hx7777hvDhg2LAQMGtNpxLFq0KH73u9/FY489FjNnzoy1a9caHAAAoEMwgyMbAQd5rR92RERsscUWMWzYsBg6dGgMGzYshgwZEt26dSv6fi+++OL4xS9+EfX19QYBAADocPL9FhJwbEjAQWbvvPNOPPzww/Hwww//d1m/fv1iyy23jAEDBsSWW2753//cs2fPqKura/T/dtxxxxg2bFiT+6mtrRVuAAAAJdPUW0iKsTzrG04aa58vwBBw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AAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4A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/+MYxDEI82IgCACTTf6////t98+t/1zM6EI0EjnShA1ZDQGwCihWSh/+31m+3T3//9v///+8isktZGQJQdVOqqAj3bzT2uob/+MYxEgJ62IcAABHLDA+NMOJVR//f+v/T3///////s601VGsHZ1JChXYMDDFChZLktspI2cRANRlAv6/7f9v/0//////6Ugi/+MYxFsJS2IgCACRTV9TK6QjqqLREYkhtQEagpiFkYQYKuGDFPp7vWtk619lsZL+duiJrb///7dOuZCbOCI7qOdlOnxRMxKD/+MYxHAJY2IoCACNT/pSA8JVAv//v/X9dP/////9r8yqZJznU5kd3CIDKMWQnF2IEClORjJGgJl5FnIPrr6KtLldn19bIn/T/+MYxIUJu2okEACTTNV/////XqhmdUqV2Wg6snZtpXGY3CJ5wHFTyS0P/avqv/pud6pZX1d7bk3XXpfdP///+Ts2hqWcGlJi/+MYxJkJ214cAACNTYEQosiRkGN8kyJVjqGKD613X0XY1H+r7lo789b3/b/9u/7b1dKmRGkR0OQcc7jbmFJpwthYsRGzaNYX/+MYxKwKK2YkEACTTARJ///LWsue/Kf/////W5K4XsY6nJZLEpr+yFCbYkKFUzYoQk6S9EwElUBYVoBsE+sylf9foSm1t9lS/+MYxL4KO2YcCACTTVu5pGRSEIpZiqIVVnbdHufbknQx6Pultv9kf9uvL57R38h8nqBpHJqZDbbFGW11xdtVZgUqltJZHhtq/+MYxNALG14YCACNMS8BvandlRGV/SiqrqtStTstbrV6f//tz8/ZUoh3RY1TnOyEDCAdVklceHyInItkgSKJ2uof/x/zz+KS/+MYxN4LO2IYCACTTQEmlFZRGzd6Lefkv////tfznKLv4NZTPgji8uQaa6hlcySiYiQEuVDRsQFhcGA2+PUDvvka+fT/fkd//+MYxOwMo2YkGABTSFf////n97B1Uwttzm0l0kRGqMMoy6zlDhgfQ2iJTrczBJjCcVQiTK0qKFn/yX/NWesrfq/////9ZKae/+MYxPQRA2oMAACTELWd87muwfkuw0cGyBYFhQaEYHAM/KZFCsERXTJKBp4OvEJRh6YgptX/d0+7zJbIqA0RHWdEVq9DqrBm/+MYxOsMm2IYEAFTTWVdBjTHwZSnuiITdUd3br9af+P95Orq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`;
|
|
1428
|
+
|
|
1429
|
+
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
1430
|
+
|
|
1431
|
+
var lib = {};
|
|
1432
|
+
|
|
1433
|
+
var uaParser_min = {exports: {}};
|
|
1434
|
+
|
|
1435
|
+
/* UAParser.js v1.0.32
|
|
1436
|
+
Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
|
|
1437
|
+
MIT License */
|
|
1438
|
+
|
|
1439
|
+
(function (module, exports) {
|
|
1440
|
+
(function(window,undefined$1){var LIBVERSION="1.0.32",EMPTY="",UNKNOWN="?",FUNC_TYPE="function",UNDEF_TYPE="undefined",OBJ_TYPE="object",STR_TYPE="string",MAJOR="major",MODEL="model",NAME="name",TYPE="type",VENDOR="vendor",VERSION="version",ARCHITECTURE="architecture",CONSOLE="console",MOBILE="mobile",TABLET="tablet",SMARTTV="smarttv",WEARABLE="wearable",EMBEDDED="embedded",UA_MAX_LENGTH=350;var AMAZON="Amazon",APPLE="Apple",ASUS="ASUS",BLACKBERRY="BlackBerry",BROWSER="Browser",CHROME="Chrome",EDGE="Edge",FIREFOX="Firefox",GOOGLE="Google",HUAWEI="Huawei",LG="LG",MICROSOFT="Microsoft",MOTOROLA="Motorola",OPERA="Opera",SAMSUNG="Samsung",SHARP="Sharp",SONY="Sony",XIAOMI="Xiaomi",ZEBRA="Zebra",FACEBOOK="Facebook";var extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){if(extensions[i]&&extensions[i].length%2===0){mergedRegexes[i]=extensions[i].concat(regexes[i]);}else {mergedRegexes[i]=regexes[i];}}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i<arr.length;i++){enums[arr[i].toUpperCase()]=arr[i];}return enums},has=function(str1,str2){return typeof str1===STR_TYPE?lowerize(str2).indexOf(lowerize(str1))!==-1:false},lowerize=function(str){return str.toLowerCase()},majorize=function(version){return typeof version===STR_TYPE?version.replace(/[^\d\.]/g,EMPTY).split(".")[0]:undefined$1},trim=function(str,len){if(typeof str===STR_TYPE){str=str.replace(/^\s\s*/,EMPTY).replace(/\s\s*$/,EMPTY);return typeof len===UNDEF_TYPE?str:str.substring(0,UA_MAX_LENGTH)}};var rgxMapper=function(ua,arrays){var i=0,j,k,p,q,matches,match;while(i<arrays.length&&!matches){var regex=arrays[i],props=arrays[i+1];j=k=0;while(j<regex.length&&!matches){matches=regex[j++].exec(ua);if(!!matches){for(p=0;p<props.length;p++){match=matches[++k];q=props[p];if(typeof q===OBJ_TYPE&&q.length>0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match);}else {this[q[0]]=q[1];}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined$1;}else {this[q[0]]=match?match.replace(q[1],q[2]):undefined$1;}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined$1;}}else {this[q]=match?match:undefined$1;}}}}i+=2;}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j<map[i].length;j++){if(has(map[i][j],str)){return i===UNKNOWN?undefined$1:i}}}else if(has(map[i],str)){return i===UNKNOWN?undefined$1:i}}return str};var oldSafariMap={"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"},windowsVersionMap={ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2e3:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"};var regexes={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[VERSION,[NAME,"Chrome"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[VERSION,[NAME,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[NAME,VERSION],[/opios[\/ ]+([\w\.]+)/i],[VERSION,[NAME,OPERA+" Mini"]],[/\bopr\/([\w\.]+)/i],[VERSION,[NAME,OPERA]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,/(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,/(ba?idubrowser)[\/ ]?([\w\.]+)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,/(weibo)__([\d\.]+)/i],[NAME,VERSION],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[VERSION,[NAME,"UC"+BROWSER]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i],[VERSION,[NAME,"WeChat(Win) Desktop"]],[/micromessenger\/([\w\.]+)/i],[VERSION,[NAME,"WeChat"]],[/konqueror\/([\w\.]+)/i],[VERSION,[NAME,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[VERSION,[NAME,"IE"]],[/yabrowser\/([\w\.]+)/i],[VERSION,[NAME,"Yandex"]],[/(avast|avg)\/([\w\.]+)/i],[[NAME,/(.+)/,"$1 Secure "+BROWSER],VERSION],[/\bfocus\/([\w\.]+)/i],[VERSION,[NAME,FIREFOX+" Focus"]],[/\bopt\/([\w\.]+)/i],[VERSION,[NAME,OPERA+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[VERSION,[NAME,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[VERSION,[NAME,"Dolphin"]],[/coast\/([\w\.]+)/i],[VERSION,[NAME,OPERA+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[VERSION,[NAME,"MIUI "+BROWSER]],[/fxios\/([-\w\.]+)/i],[VERSION,[NAME,FIREFOX]],[/\bqihu|(qi?ho?o?|360)browser/i],[[NAME,"360 "+BROWSER]],[/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i],[[NAME,/(.+)/,"$1 "+BROWSER],VERSION],[/(comodo_dragon)\/([\w\.]+)/i],[[NAME,/_/g," "],VERSION],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i],[NAME,VERSION],[/(metasr)[\/ ]?([\w\.]+)/i,/(lbbrowser)/i,/\[(linkedin)app\]/i],[NAME],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[NAME,FACEBOOK],VERSION],[/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(chromium|instagram)[\/ ]([-\w\.]+)/i],[NAME,VERSION],[/\bgsa\/([\w\.]+) .*safari\//i],[VERSION,[NAME,"GSA"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[VERSION,[NAME,CHROME+" Headless"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[NAME,CHROME+" WebView"],VERSION],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[VERSION,[NAME,"Android "+BROWSER]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[NAME,VERSION],[/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i],[VERSION,[NAME,"Mobile Safari"]],[/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i],[VERSION,NAME],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[NAME,[VERSION,strMapper,oldSafariMap]],[/(webkit|khtml)\/([\w\.]+)/i],[NAME,VERSION],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[NAME,"Netscape"],VERSION],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[VERSION,[NAME,FIREFOX+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/(links) \(([\w\.]+)/i],[NAME,VERSION]],cpu:[[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i],[[ARCHITECTURE,"amd64"]],[/(ia32(?=;))/i],[[ARCHITECTURE,lowerize]],[/((?:i[346]|x)86)[;\)]/i],[[ARCHITECTURE,"ia32"]],[/\b(aarch64|arm(v?8e?l?|_?64))\b/i],[[ARCHITECTURE,"arm64"]],[/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i],[[ARCHITECTURE,"armhf"]],[/windows (ce|mobile); ppc;/i],[[ARCHITECTURE,"arm"]],[/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i],[[ARCHITECTURE,/ower/,EMPTY,lowerize]],[/(sun4\w)[;\)]/i],[[ARCHITECTURE,"sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i],[[ARCHITECTURE,lowerize]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[MODEL,[VENDOR,SAMSUNG],[TYPE,TABLET]],[/\b((?:s[cgp]h|gt|sm)-\w+|galaxy nexus)/i,/samsung[- ]([-\w]+)/i,/sec-(sgh\w+)/i],[MODEL,[VENDOR,SAMSUNG],[TYPE,MOBILE]],[/\((ip(?:hone|od)[\w ]*);/i],[MODEL,[VENDOR,APPLE],[TYPE,MOBILE]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[MODEL,[VENDOR,APPLE],[TYPE,TABLET]],[/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i],[MODEL,[VENDOR,HUAWEI],[TYPE,TABLET]],[/(?:huawei|honor)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[MODEL,[VENDOR,HUAWEI],[TYPE,MOBILE]],[/\b(poco[\w ]+)(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i],[[MODEL,/_/g," "],[VENDOR,XIAOMI],[TYPE,MOBILE]],[/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i],[[MODEL,/_/g," "],[VENDOR,XIAOMI],[TYPE,TABLET]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[MODEL,[VENDOR,"OPPO"],[TYPE,MOBILE]],[/vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[MODEL,[VENDOR,"Vivo"],[TYPE,MOBILE]],[/\b(rmx[12]\d{3})(?: bui|;|\))/i],[MODEL,[VENDOR,"Realme"],[TYPE,MOBILE]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ](\w*)/i,/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i],[MODEL,[VENDOR,MOTOROLA],[TYPE,MOBILE]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[MODEL,[VENDOR,MOTOROLA],[TYPE,TABLET]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[MODEL,[VENDOR,LG],[TYPE,TABLET]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,/\blg-?([\d\w]+) bui/i],[MODEL,[VENDOR,LG],[TYPE,MOBILE]],[/(ideatab[-\w ]+)/i,/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i],[MODEL,[VENDOR,"Lenovo"],[TYPE,TABLET]],[/(?:maemo|nokia).*(n900|lumia \d+)/i,/nokia[-_ ]?([-\w\.]*)/i],[[MODEL,/_/g," "],[VENDOR,"Nokia"],[TYPE,MOBILE]],[/(pixel c)\b/i],[MODEL,[VENDOR,GOOGLE],[TYPE,TABLET]],[/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i],[MODEL,[VENDOR,GOOGLE],[TYPE,MOBILE]],[/droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[MODEL,[VENDOR,SONY],[TYPE,MOBILE]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[MODEL,"Xperia Tablet"],[VENDOR,SONY],[TYPE,TABLET]],[/ (kb2005|in20[12]5|be20[12][59])\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[MODEL,[VENDOR,"OnePlus"],[TYPE,MOBILE]],[/(alexa)webm/i,/(kf[a-z]{2}wi)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[MODEL,[VENDOR,AMAZON],[TYPE,TABLET]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[MODEL,/(.+)/g,"Fire Phone $1"],[VENDOR,AMAZON],[TYPE,MOBILE]],[/(playbook);[-\w\),; ]+(rim)/i],[MODEL,VENDOR,[TYPE,TABLET]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[MODEL,[VENDOR,BLACKBERRY],[TYPE,MOBILE]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[MODEL,[VENDOR,ASUS],[TYPE,TABLET]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[MODEL,[VENDOR,ASUS],[TYPE,MOBILE]],[/(nexus 9)/i],[MODEL,[VENDOR,"HTC"],[TYPE,TABLET]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic|sony(?!-bra))[-_ ]?([-\w]*)/i],[VENDOR,[MODEL,/_/g," "],[TYPE,MOBILE]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[MODEL,[VENDOR,"Acer"],[TYPE,TABLET]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[MODEL,[VENDOR,"Meizu"],[TYPE,MOBILE]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[MODEL,[VENDOR,SHARP],[TYPE,MOBILE]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,/(hp) ([\w ]+\w)/i,/(asus)-?(\w+)/i,/(microsoft); (lumia[\w ]+)/i,/(lenovo)[-_ ]?([-\w]+)/i,/(jolla)/i,/(oppo) ?([\w ]+) bui/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/(archos) (gamepad2?)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i,/(nook)[\w ]+build\/(\w+)/i,/(dell) (strea[kpr\d ]*[\dko])/i,/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,/(trinity)[- ]*(t\d{3}) bui/i,/(gigaset)[- ]+(q\w{1,9}) bui/i,/(vodafone) ([\w ]+)(?:\)| bui)/i],[VENDOR,MODEL,[TYPE,TABLET]],[/(surface duo)/i],[MODEL,[VENDOR,MICROSOFT],[TYPE,TABLET]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[MODEL,[VENDOR,"Fairphone"],[TYPE,MOBILE]],[/(u304aa)/i],[MODEL,[VENDOR,"AT&T"],[TYPE,MOBILE]],[/\bsie-(\w*)/i],[MODEL,[VENDOR,"Siemens"],[TYPE,MOBILE]],[/\b(rct\w+) b/i],[MODEL,[VENDOR,"RCA"],[TYPE,TABLET]],[/\b(venue[\d ]{2,7}) b/i],[MODEL,[VENDOR,"Dell"],[TYPE,TABLET]],[/\b(q(?:mv|ta)\w+) b/i],[MODEL,[VENDOR,"Verizon"],[TYPE,TABLET]],[/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i],[MODEL,[VENDOR,"Barnes & Noble"],[TYPE,TABLET]],[/\b(tm\d{3}\w+) b/i],[MODEL,[VENDOR,"NuVision"],[TYPE,TABLET]],[/\b(k88) b/i],[MODEL,[VENDOR,"ZTE"],[TYPE,TABLET]],[/\b(nx\d{3}j) b/i],[MODEL,[VENDOR,"ZTE"],[TYPE,MOBILE]],[/\b(gen\d{3}) b.+49h/i],[MODEL,[VENDOR,"Swiss"],[TYPE,MOBILE]],[/\b(zur\d{3}) b/i],[MODEL,[VENDOR,"Swiss"],[TYPE,TABLET]],[/\b((zeki)?tb.*\b) b/i],[MODEL,[VENDOR,"Zeki"],[TYPE,TABLET]],[/\b([yr]\d{2}) b/i,/\b(dragon[- ]+touch |dt)(\w{5}) b/i],[[VENDOR,"Dragon Touch"],MODEL,[TYPE,TABLET]],[/\b(ns-?\w{0,9}) b/i],[MODEL,[VENDOR,"Insignia"],[TYPE,TABLET]],[/\b((nxa|next)-?\w{0,9}) b/i],[MODEL,[VENDOR,"NextBook"],[TYPE,TABLET]],[/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i],[[VENDOR,"Voice"],MODEL,[TYPE,MOBILE]],[/\b(lvtel\-)?(v1[12]) b/i],[[VENDOR,"LvTel"],MODEL,[TYPE,MOBILE]],[/\b(ph-1) /i],[MODEL,[VENDOR,"Essential"],[TYPE,MOBILE]],[/\b(v(100md|700na|7011|917g).*\b) b/i],[MODEL,[VENDOR,"Envizen"],[TYPE,TABLET]],[/\b(trio[-\w\. ]+) b/i],[MODEL,[VENDOR,"MachSpeed"],[TYPE,TABLET]],[/\btu_(1491) b/i],[MODEL,[VENDOR,"Rotor"],[TYPE,TABLET]],[/(shield[\w ]+) b/i],[MODEL,[VENDOR,"Nvidia"],[TYPE,TABLET]],[/(sprint) (\w+)/i],[VENDOR,MODEL,[TYPE,MOBILE]],[/(kin\.[onetw]{3})/i],[[MODEL,/\./g," "],[VENDOR,MICROSOFT],[TYPE,MOBILE]],[/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,TABLET]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,MOBILE]],[/(ouya)/i,/(nintendo) ([wids3utch]+)/i],[VENDOR,MODEL,[TYPE,CONSOLE]],[/droid.+; (shield) bui/i],[MODEL,[VENDOR,"Nvidia"],[TYPE,CONSOLE]],[/(playstation [345portablevi]+)/i],[MODEL,[VENDOR,SONY],[TYPE,CONSOLE]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[MODEL,[VENDOR,MICROSOFT],[TYPE,CONSOLE]],[/smart-tv.+(samsung)/i],[VENDOR,[TYPE,SMARTTV]],[/hbbtv.+maple;(\d+)/i],[[MODEL,/^/,"SmartTV"],[VENDOR,SAMSUNG],[TYPE,SMARTTV]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[VENDOR,LG],[TYPE,SMARTTV]],[/(apple) ?tv/i],[VENDOR,[MODEL,APPLE+" TV"],[TYPE,SMARTTV]],[/crkey/i],[[MODEL,CHROME+"cast"],[VENDOR,GOOGLE],[TYPE,SMARTTV]],[/droid.+aft(\w)( bui|\))/i],[MODEL,[VENDOR,AMAZON],[TYPE,SMARTTV]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[MODEL,[VENDOR,SHARP],[TYPE,SMARTTV]],[/(bravia[\w ]+)( bui|\))/i],[MODEL,[VENDOR,SONY],[TYPE,SMARTTV]],[/(mitv-\w{5}) bui/i],[MODEL,[VENDOR,XIAOMI],[TYPE,SMARTTV]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w ]*; *(\w[^;]*);([^;]*)/i],[[VENDOR,trim],[MODEL,trim],[TYPE,SMARTTV]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i],[[TYPE,SMARTTV]],[/((pebble))app/i],[VENDOR,MODEL,[TYPE,WEARABLE]],[/droid.+; (glass) \d/i],[MODEL,[VENDOR,GOOGLE],[TYPE,WEARABLE]],[/droid.+; (wt63?0{2,3})\)/i],[MODEL,[VENDOR,ZEBRA],[TYPE,WEARABLE]],[/(quest( 2)?)/i],[MODEL,[VENDOR,FACEBOOK],[TYPE,WEARABLE]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[VENDOR,[TYPE,EMBEDDED]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i],[MODEL,[TYPE,MOBILE]],[/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i],[MODEL,[TYPE,TABLET]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[TYPE,TABLET]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[TYPE,MOBILE]],[/(android[-\w\. ]{0,9});.+buil/i],[MODEL,[VENDOR,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[VERSION,[NAME,EDGE+"HTML"]],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[VERSION,[NAME,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i],[NAME,VERSION],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[VERSION,NAME]],os:[[/microsoft (windows) (vista|xp)/i],[NAME,VERSION],[/(windows) nt 6\.2; (arm)/i,/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,/(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i],[NAME,[VERSION,strMapper,windowsVersionMap]],[/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i],[[NAME,"Windows"],[VERSION,strMapper,windowsVersionMap]],[/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,/cfnetwork\/.+darwin/i],[[VERSION,/_/g,"."],[NAME,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+haiku)/i],[[NAME,"Mac OS"],[VERSION,/_/g,"."]],[/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i],[VERSION,NAME],[/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,/(blackberry)\w*\/([\w\.]*)/i,/(tizen|kaios)[\/ ]([\w\.]+)/i,/\((series40);/i],[NAME,VERSION],[/\(bb(10);/i],[VERSION,[NAME,BLACKBERRY]],[/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i],[VERSION,[NAME,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[VERSION,[NAME,FIREFOX+" OS"]],[/web0s;.+rt(tv)/i,/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i],[VERSION,[NAME,"webOS"]],[/crkey\/([\d\.]+)/i],[VERSION,[NAME,CHROME+"cast"]],[/(cros) [\w]+ ([\w\.]+\w)/i],[[NAME,"Chromium OS"],VERSION],[/(nintendo|playstation) ([wids345portablevuch]+)/i,/(xbox); +xbox ([^\);]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/(mint)[\/\(\) ]?(\w*)/i,/(mageia|vectorlinux)[; ]/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/(hurd|linux) ?([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) (\w+)/i],[NAME,VERSION],[/(sunos) ?([\w\.\d]*)/i],[[NAME,"Solaris"],VERSION],[/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/(aix) ((\d)(?=\.|\)| )[\w\.])*/i,/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i,/(unix) ?([\w\.]*)/i],[NAME,VERSION]]};var UAParser=function(ua,extensions){if(typeof ua===OBJ_TYPE){extensions=ua;ua=undefined$1;}if(!(this instanceof UAParser)){return new UAParser(ua,extensions).getResult()}var _ua=ua||(typeof window!==UNDEF_TYPE&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:EMPTY);var _rgxmap=extensions?extend(regexes,extensions):regexes;this.getBrowser=function(){var _browser={};_browser[NAME]=undefined$1;_browser[VERSION]=undefined$1;rgxMapper.call(_browser,_ua,_rgxmap.browser);_browser.major=majorize(_browser.version);return _browser};this.getCPU=function(){var _cpu={};_cpu[ARCHITECTURE]=undefined$1;rgxMapper.call(_cpu,_ua,_rgxmap.cpu);return _cpu};this.getDevice=function(){var _device={};_device[VENDOR]=undefined$1;_device[MODEL]=undefined$1;_device[TYPE]=undefined$1;rgxMapper.call(_device,_ua,_rgxmap.device);return _device};this.getEngine=function(){var _engine={};_engine[NAME]=undefined$1;_engine[VERSION]=undefined$1;rgxMapper.call(_engine,_ua,_rgxmap.engine);return _engine};this.getOS=function(){var _os={};_os[NAME]=undefined$1;_os[VERSION]=undefined$1;rgxMapper.call(_os,_ua,_rgxmap.os);return _os};this.getResult=function(){return {ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}};this.getUA=function(){return _ua};this.setUA=function(ua){_ua=typeof ua===STR_TYPE&&ua.length>UA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this};this.setUA(_ua);return this};UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);{if(module.exports){exports=module.exports=UAParser;}exports.UAParser=UAParser;}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop];}};}})(typeof window==="object"?window:commonjsGlobal);
|
|
1441
|
+
} (uaParser_min, uaParser_min.exports));
|
|
1442
|
+
|
|
1443
|
+
Object.defineProperty(lib, '__esModule', { value: true });
|
|
1444
|
+
|
|
1445
|
+
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
1446
|
+
|
|
1447
|
+
var React = require$$0;
|
|
1448
|
+
var React__default = _interopDefault(React);
|
|
1449
|
+
|
|
1450
|
+
var UAParser = uaParser_min.exports;
|
|
1451
|
+
|
|
1452
|
+
var ClientUAInstance = new UAParser();
|
|
1453
|
+
var browser = ClientUAInstance.getBrowser();
|
|
1454
|
+
var cpu = ClientUAInstance.getCPU();
|
|
1455
|
+
var device = ClientUAInstance.getDevice();
|
|
1456
|
+
var engine = ClientUAInstance.getEngine();
|
|
1457
|
+
var os = ClientUAInstance.getOS();
|
|
1458
|
+
var ua = ClientUAInstance.getUA();
|
|
1459
|
+
var setUa = function setUa(userAgentString) {
|
|
1460
|
+
return ClientUAInstance.setUA(userAgentString);
|
|
1461
|
+
};
|
|
1462
|
+
var parseUserAgent = function parseUserAgent(userAgent) {
|
|
1463
|
+
if (!userAgent) {
|
|
1464
|
+
console.error('No userAgent string was provided');
|
|
1465
|
+
return;
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
var UserAgentInstance = new UAParser(userAgent);
|
|
1469
|
+
return {
|
|
1470
|
+
UA: UserAgentInstance,
|
|
1471
|
+
browser: UserAgentInstance.getBrowser(),
|
|
1472
|
+
cpu: UserAgentInstance.getCPU(),
|
|
1473
|
+
device: UserAgentInstance.getDevice(),
|
|
1474
|
+
engine: UserAgentInstance.getEngine(),
|
|
1475
|
+
os: UserAgentInstance.getOS(),
|
|
1476
|
+
ua: UserAgentInstance.getUA(),
|
|
1477
|
+
setUserAgent: function setUserAgent(userAgentString) {
|
|
1478
|
+
return UserAgentInstance.setUA(userAgentString);
|
|
1479
|
+
}
|
|
1480
|
+
};
|
|
1481
|
+
};
|
|
1482
|
+
|
|
1483
|
+
var UAHelper = /*#__PURE__*/Object.freeze({
|
|
1484
|
+
ClientUAInstance: ClientUAInstance,
|
|
1485
|
+
browser: browser,
|
|
1486
|
+
cpu: cpu,
|
|
1487
|
+
device: device,
|
|
1488
|
+
engine: engine,
|
|
1489
|
+
os: os,
|
|
1490
|
+
ua: ua,
|
|
1491
|
+
setUa: setUa,
|
|
1492
|
+
parseUserAgent: parseUserAgent
|
|
1493
|
+
});
|
|
1494
|
+
|
|
1495
|
+
function ownKeys(object, enumerableOnly) {
|
|
1496
|
+
var keys = Object.keys(object);
|
|
1497
|
+
|
|
1498
|
+
if (Object.getOwnPropertySymbols) {
|
|
1499
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
1500
|
+
|
|
1501
|
+
if (enumerableOnly) {
|
|
1502
|
+
symbols = symbols.filter(function (sym) {
|
|
1503
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
1504
|
+
});
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
keys.push.apply(keys, symbols);
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
return keys;
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
function _objectSpread2(target) {
|
|
1514
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
1515
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
1516
|
+
|
|
1517
|
+
if (i % 2) {
|
|
1518
|
+
ownKeys(Object(source), true).forEach(function (key) {
|
|
1519
|
+
_defineProperty(target, key, source[key]);
|
|
1520
|
+
});
|
|
1521
|
+
} else if (Object.getOwnPropertyDescriptors) {
|
|
1522
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
1523
|
+
} else {
|
|
1524
|
+
ownKeys(Object(source)).forEach(function (key) {
|
|
1525
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
1526
|
+
});
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
return target;
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
function _typeof(obj) {
|
|
1534
|
+
"@babel/helpers - typeof";
|
|
1535
|
+
|
|
1536
|
+
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
1537
|
+
_typeof = function (obj) {
|
|
1538
|
+
return typeof obj;
|
|
1539
|
+
};
|
|
1540
|
+
} else {
|
|
1541
|
+
_typeof = function (obj) {
|
|
1542
|
+
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
1543
|
+
};
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
return _typeof(obj);
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
function _classCallCheck(instance, Constructor) {
|
|
1550
|
+
if (!(instance instanceof Constructor)) {
|
|
1551
|
+
throw new TypeError("Cannot call a class as a function");
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
function _defineProperties(target, props) {
|
|
1556
|
+
for (var i = 0; i < props.length; i++) {
|
|
1557
|
+
var descriptor = props[i];
|
|
1558
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
1559
|
+
descriptor.configurable = true;
|
|
1560
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
1561
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
function _createClass(Constructor, protoProps, staticProps) {
|
|
1566
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
1567
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
1568
|
+
return Constructor;
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
function _defineProperty(obj, key, value) {
|
|
1572
|
+
if (key in obj) {
|
|
1573
|
+
Object.defineProperty(obj, key, {
|
|
1574
|
+
value: value,
|
|
1575
|
+
enumerable: true,
|
|
1576
|
+
configurable: true,
|
|
1577
|
+
writable: true
|
|
1578
|
+
});
|
|
1579
|
+
} else {
|
|
1580
|
+
obj[key] = value;
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
return obj;
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
function _extends() {
|
|
1587
|
+
_extends = Object.assign || function (target) {
|
|
1588
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
1589
|
+
var source = arguments[i];
|
|
1590
|
+
|
|
1591
|
+
for (var key in source) {
|
|
1592
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
1593
|
+
target[key] = source[key];
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
return target;
|
|
1599
|
+
};
|
|
1600
|
+
|
|
1601
|
+
return _extends.apply(this, arguments);
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
function _inherits(subClass, superClass) {
|
|
1605
|
+
if (typeof superClass !== "function" && superClass !== null) {
|
|
1606
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
1610
|
+
constructor: {
|
|
1611
|
+
value: subClass,
|
|
1612
|
+
writable: true,
|
|
1613
|
+
configurable: true
|
|
1614
|
+
}
|
|
1615
|
+
});
|
|
1616
|
+
if (superClass) _setPrototypeOf(subClass, superClass);
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
function _getPrototypeOf(o) {
|
|
1620
|
+
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
|
|
1621
|
+
return o.__proto__ || Object.getPrototypeOf(o);
|
|
1622
|
+
};
|
|
1623
|
+
return _getPrototypeOf(o);
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
function _setPrototypeOf(o, p) {
|
|
1627
|
+
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
|
|
1628
|
+
o.__proto__ = p;
|
|
1629
|
+
return o;
|
|
1630
|
+
};
|
|
1631
|
+
|
|
1632
|
+
return _setPrototypeOf(o, p);
|
|
1633
|
+
}
|
|
1634
|
+
|
|
1635
|
+
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
1636
|
+
if (source == null) return {};
|
|
1637
|
+
var target = {};
|
|
1638
|
+
var sourceKeys = Object.keys(source);
|
|
1639
|
+
var key, i;
|
|
1640
|
+
|
|
1641
|
+
for (i = 0; i < sourceKeys.length; i++) {
|
|
1642
|
+
key = sourceKeys[i];
|
|
1643
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
1644
|
+
target[key] = source[key];
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
return target;
|
|
1648
|
+
}
|
|
1649
|
+
|
|
1650
|
+
function _objectWithoutProperties(source, excluded) {
|
|
1651
|
+
if (source == null) return {};
|
|
1652
|
+
|
|
1653
|
+
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
1654
|
+
|
|
1655
|
+
var key, i;
|
|
1656
|
+
|
|
1657
|
+
if (Object.getOwnPropertySymbols) {
|
|
1658
|
+
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
1659
|
+
|
|
1660
|
+
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
1661
|
+
key = sourceSymbolKeys[i];
|
|
1662
|
+
if (excluded.indexOf(key) >= 0) continue;
|
|
1663
|
+
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
1664
|
+
target[key] = source[key];
|
|
1665
|
+
}
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
return target;
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
function _assertThisInitialized(self) {
|
|
1672
|
+
if (self === void 0) {
|
|
1673
|
+
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
return self;
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
function _possibleConstructorReturn(self, call) {
|
|
1680
|
+
if (call && (typeof call === "object" || typeof call === "function")) {
|
|
1681
|
+
return call;
|
|
1682
|
+
} else if (call !== void 0) {
|
|
1683
|
+
throw new TypeError("Derived constructors may only return object or undefined");
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
return _assertThisInitialized(self);
|
|
1687
|
+
}
|
|
1688
|
+
|
|
1689
|
+
function _slicedToArray(arr, i) {
|
|
1690
|
+
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
function _arrayWithHoles(arr) {
|
|
1694
|
+
if (Array.isArray(arr)) return arr;
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
function _iterableToArrayLimit(arr, i) {
|
|
1698
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
1699
|
+
|
|
1700
|
+
if (_i == null) return;
|
|
1701
|
+
var _arr = [];
|
|
1702
|
+
var _n = true;
|
|
1703
|
+
var _d = false;
|
|
1704
|
+
|
|
1705
|
+
var _s, _e;
|
|
1706
|
+
|
|
1707
|
+
try {
|
|
1708
|
+
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
|
|
1709
|
+
_arr.push(_s.value);
|
|
1710
|
+
|
|
1711
|
+
if (i && _arr.length === i) break;
|
|
1712
|
+
}
|
|
1713
|
+
} catch (err) {
|
|
1714
|
+
_d = true;
|
|
1715
|
+
_e = err;
|
|
1716
|
+
} finally {
|
|
1717
|
+
try {
|
|
1718
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
1719
|
+
} finally {
|
|
1720
|
+
if (_d) throw _e;
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
|
|
1724
|
+
return _arr;
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
function _unsupportedIterableToArray(o, minLen) {
|
|
1728
|
+
if (!o) return;
|
|
1729
|
+
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
1730
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
1731
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
1732
|
+
if (n === "Map" || n === "Set") return Array.from(o);
|
|
1733
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
function _arrayLikeToArray(arr, len) {
|
|
1737
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
1738
|
+
|
|
1739
|
+
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
1740
|
+
|
|
1741
|
+
return arr2;
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
function _nonIterableRest() {
|
|
1745
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
var DeviceTypes = {
|
|
1749
|
+
Mobile: 'mobile',
|
|
1750
|
+
Tablet: 'tablet',
|
|
1751
|
+
SmartTv: 'smarttv',
|
|
1752
|
+
Console: 'console',
|
|
1753
|
+
Wearable: 'wearable',
|
|
1754
|
+
Embedded: 'embedded',
|
|
1755
|
+
Browser: undefined
|
|
1756
|
+
};
|
|
1757
|
+
var BrowserTypes = {
|
|
1758
|
+
Chrome: 'Chrome',
|
|
1759
|
+
Firefox: 'Firefox',
|
|
1760
|
+
Opera: 'Opera',
|
|
1761
|
+
Yandex: 'Yandex',
|
|
1762
|
+
Safari: 'Safari',
|
|
1763
|
+
InternetExplorer: 'Internet Explorer',
|
|
1764
|
+
Edge: 'Edge',
|
|
1765
|
+
Chromium: 'Chromium',
|
|
1766
|
+
Ie: 'IE',
|
|
1767
|
+
MobileSafari: 'Mobile Safari',
|
|
1768
|
+
EdgeChromium: 'Edge Chromium',
|
|
1769
|
+
MIUI: 'MIUI Browser',
|
|
1770
|
+
SamsungBrowser: 'Samsung Browser'
|
|
1771
|
+
};
|
|
1772
|
+
var OsTypes = {
|
|
1773
|
+
IOS: 'iOS',
|
|
1774
|
+
Android: 'Android',
|
|
1775
|
+
WindowsPhone: 'Windows Phone',
|
|
1776
|
+
Windows: 'Windows',
|
|
1777
|
+
MAC_OS: 'Mac OS'
|
|
1778
|
+
};
|
|
1779
|
+
var InitialDeviceTypes = {
|
|
1780
|
+
isMobile: false,
|
|
1781
|
+
isTablet: false,
|
|
1782
|
+
isBrowser: false,
|
|
1783
|
+
isSmartTV: false,
|
|
1784
|
+
isConsole: false,
|
|
1785
|
+
isWearable: false
|
|
1786
|
+
};
|
|
1787
|
+
|
|
1788
|
+
var checkDeviceType = function checkDeviceType(type) {
|
|
1789
|
+
switch (type) {
|
|
1790
|
+
case DeviceTypes.Mobile:
|
|
1791
|
+
return {
|
|
1792
|
+
isMobile: true
|
|
1793
|
+
};
|
|
1794
|
+
|
|
1795
|
+
case DeviceTypes.Tablet:
|
|
1796
|
+
return {
|
|
1797
|
+
isTablet: true
|
|
1798
|
+
};
|
|
1799
|
+
|
|
1800
|
+
case DeviceTypes.SmartTv:
|
|
1801
|
+
return {
|
|
1802
|
+
isSmartTV: true
|
|
1803
|
+
};
|
|
1804
|
+
|
|
1805
|
+
case DeviceTypes.Console:
|
|
1806
|
+
return {
|
|
1807
|
+
isConsole: true
|
|
1808
|
+
};
|
|
1809
|
+
|
|
1810
|
+
case DeviceTypes.Wearable:
|
|
1811
|
+
return {
|
|
1812
|
+
isWearable: true
|
|
1813
|
+
};
|
|
1814
|
+
|
|
1815
|
+
case DeviceTypes.Browser:
|
|
1816
|
+
return {
|
|
1817
|
+
isBrowser: true
|
|
1818
|
+
};
|
|
1819
|
+
|
|
1820
|
+
case DeviceTypes.Embedded:
|
|
1821
|
+
return {
|
|
1822
|
+
isEmbedded: true
|
|
1823
|
+
};
|
|
1824
|
+
|
|
1825
|
+
default:
|
|
1826
|
+
return InitialDeviceTypes;
|
|
1827
|
+
}
|
|
1828
|
+
};
|
|
1829
|
+
var setUserAgent = function setUserAgent(userAgent) {
|
|
1830
|
+
return setUa(userAgent);
|
|
1831
|
+
};
|
|
1832
|
+
var setDefaults = function setDefaults(p) {
|
|
1833
|
+
var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'none';
|
|
1834
|
+
return p ? p : d;
|
|
1835
|
+
};
|
|
1836
|
+
var getNavigatorInstance = function getNavigatorInstance() {
|
|
1837
|
+
if (typeof window !== 'undefined') {
|
|
1838
|
+
if (window.navigator || navigator) {
|
|
1839
|
+
return window.navigator || navigator;
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
return false;
|
|
1844
|
+
};
|
|
1845
|
+
var isIOS13Check = function isIOS13Check(type) {
|
|
1846
|
+
var nav = getNavigatorInstance();
|
|
1847
|
+
return nav && nav.platform && (nav.platform.indexOf(type) !== -1 || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1 && !window.MSStream);
|
|
1848
|
+
};
|
|
1849
|
+
|
|
1850
|
+
var browserPayload = function browserPayload(isBrowser, browser, engine, os, ua) {
|
|
1851
|
+
return {
|
|
1852
|
+
isBrowser: isBrowser,
|
|
1853
|
+
browserMajorVersion: setDefaults(browser.major),
|
|
1854
|
+
browserFullVersion: setDefaults(browser.version),
|
|
1855
|
+
browserName: setDefaults(browser.name),
|
|
1856
|
+
engineName: setDefaults(engine.name),
|
|
1857
|
+
engineVersion: setDefaults(engine.version),
|
|
1858
|
+
osName: setDefaults(os.name),
|
|
1859
|
+
osVersion: setDefaults(os.version),
|
|
1860
|
+
userAgent: setDefaults(ua)
|
|
1861
|
+
};
|
|
1862
|
+
};
|
|
1863
|
+
var mobilePayload = function mobilePayload(type, device, os, ua) {
|
|
1864
|
+
return _objectSpread2({}, type, {
|
|
1865
|
+
vendor: setDefaults(device.vendor),
|
|
1866
|
+
model: setDefaults(device.model),
|
|
1867
|
+
os: setDefaults(os.name),
|
|
1868
|
+
osVersion: setDefaults(os.version),
|
|
1869
|
+
ua: setDefaults(ua)
|
|
1870
|
+
});
|
|
1871
|
+
};
|
|
1872
|
+
var smartTvPayload = function smartTvPayload(isSmartTV, engine, os, ua) {
|
|
1873
|
+
return {
|
|
1874
|
+
isSmartTV: isSmartTV,
|
|
1875
|
+
engineName: setDefaults(engine.name),
|
|
1876
|
+
engineVersion: setDefaults(engine.version),
|
|
1877
|
+
osName: setDefaults(os.name),
|
|
1878
|
+
osVersion: setDefaults(os.version),
|
|
1879
|
+
userAgent: setDefaults(ua)
|
|
1880
|
+
};
|
|
1881
|
+
};
|
|
1882
|
+
var consolePayload = function consolePayload(isConsole, engine, os, ua) {
|
|
1883
|
+
return {
|
|
1884
|
+
isConsole: isConsole,
|
|
1885
|
+
engineName: setDefaults(engine.name),
|
|
1886
|
+
engineVersion: setDefaults(engine.version),
|
|
1887
|
+
osName: setDefaults(os.name),
|
|
1888
|
+
osVersion: setDefaults(os.version),
|
|
1889
|
+
userAgent: setDefaults(ua)
|
|
1890
|
+
};
|
|
1891
|
+
};
|
|
1892
|
+
var wearablePayload = function wearablePayload(isWearable, engine, os, ua) {
|
|
1893
|
+
return {
|
|
1894
|
+
isWearable: isWearable,
|
|
1895
|
+
engineName: setDefaults(engine.name),
|
|
1896
|
+
engineVersion: setDefaults(engine.version),
|
|
1897
|
+
osName: setDefaults(os.name),
|
|
1898
|
+
osVersion: setDefaults(os.version),
|
|
1899
|
+
userAgent: setDefaults(ua)
|
|
1900
|
+
};
|
|
1901
|
+
};
|
|
1902
|
+
var embeddedPayload = function embeddedPayload(isEmbedded, device, engine, os, ua) {
|
|
1903
|
+
return {
|
|
1904
|
+
isEmbedded: isEmbedded,
|
|
1905
|
+
vendor: setDefaults(device.vendor),
|
|
1906
|
+
model: setDefaults(device.model),
|
|
1907
|
+
engineName: setDefaults(engine.name),
|
|
1908
|
+
engineVersion: setDefaults(engine.version),
|
|
1909
|
+
osName: setDefaults(os.name),
|
|
1910
|
+
osVersion: setDefaults(os.version),
|
|
1911
|
+
userAgent: setDefaults(ua)
|
|
1912
|
+
};
|
|
1913
|
+
};
|
|
1914
|
+
|
|
1915
|
+
function deviceDetect(userAgent) {
|
|
1916
|
+
var _ref = userAgent ? parseUserAgent(userAgent) : UAHelper,
|
|
1917
|
+
device = _ref.device,
|
|
1918
|
+
browser = _ref.browser,
|
|
1919
|
+
engine = _ref.engine,
|
|
1920
|
+
os = _ref.os,
|
|
1921
|
+
ua = _ref.ua;
|
|
1922
|
+
|
|
1923
|
+
var type = checkDeviceType(device.type);
|
|
1924
|
+
var isBrowser = type.isBrowser,
|
|
1925
|
+
isMobile = type.isMobile,
|
|
1926
|
+
isTablet = type.isTablet,
|
|
1927
|
+
isSmartTV = type.isSmartTV,
|
|
1928
|
+
isConsole = type.isConsole,
|
|
1929
|
+
isWearable = type.isWearable,
|
|
1930
|
+
isEmbedded = type.isEmbedded;
|
|
1931
|
+
|
|
1932
|
+
if (isBrowser) {
|
|
1933
|
+
return browserPayload(isBrowser, browser, engine, os, ua);
|
|
1934
|
+
}
|
|
1935
|
+
|
|
1936
|
+
if (isSmartTV) {
|
|
1937
|
+
return smartTvPayload(isSmartTV, engine, os, ua);
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
if (isConsole) {
|
|
1941
|
+
return consolePayload(isConsole, engine, os, ua);
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
if (isMobile) {
|
|
1945
|
+
return mobilePayload(type, device, os, ua);
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
if (isTablet) {
|
|
1949
|
+
return mobilePayload(type, device, os, ua);
|
|
1950
|
+
}
|
|
1951
|
+
|
|
1952
|
+
if (isWearable) {
|
|
1953
|
+
return wearablePayload(isWearable, engine, os, ua);
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
if (isEmbedded) {
|
|
1957
|
+
return embeddedPayload(isEmbedded, device, engine, os, ua);
|
|
1958
|
+
}
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
var isMobileType = function isMobileType(_ref) {
|
|
1962
|
+
var type = _ref.type;
|
|
1963
|
+
return type === DeviceTypes.Mobile;
|
|
1964
|
+
};
|
|
1965
|
+
var isTabletType = function isTabletType(_ref2) {
|
|
1966
|
+
var type = _ref2.type;
|
|
1967
|
+
return type === DeviceTypes.Tablet;
|
|
1968
|
+
};
|
|
1969
|
+
var isMobileAndTabletType = function isMobileAndTabletType(_ref3) {
|
|
1970
|
+
var type = _ref3.type;
|
|
1971
|
+
return type === DeviceTypes.Mobile || type === DeviceTypes.Tablet;
|
|
1972
|
+
};
|
|
1973
|
+
var isSmartTVType = function isSmartTVType(_ref4) {
|
|
1974
|
+
var type = _ref4.type;
|
|
1975
|
+
return type === DeviceTypes.SmartTv;
|
|
1976
|
+
};
|
|
1977
|
+
var isBrowserType = function isBrowserType(_ref5) {
|
|
1978
|
+
var type = _ref5.type;
|
|
1979
|
+
return type === DeviceTypes.Browser;
|
|
1980
|
+
};
|
|
1981
|
+
var isWearableType = function isWearableType(_ref6) {
|
|
1982
|
+
var type = _ref6.type;
|
|
1983
|
+
return type === DeviceTypes.Wearable;
|
|
1984
|
+
};
|
|
1985
|
+
var isConsoleType = function isConsoleType(_ref7) {
|
|
1986
|
+
var type = _ref7.type;
|
|
1987
|
+
return type === DeviceTypes.Console;
|
|
1988
|
+
};
|
|
1989
|
+
var isEmbeddedType = function isEmbeddedType(_ref8) {
|
|
1990
|
+
var type = _ref8.type;
|
|
1991
|
+
return type === DeviceTypes.Embedded;
|
|
1992
|
+
};
|
|
1993
|
+
var getMobileVendor = function getMobileVendor(_ref9) {
|
|
1994
|
+
var vendor = _ref9.vendor;
|
|
1995
|
+
return setDefaults(vendor);
|
|
1996
|
+
};
|
|
1997
|
+
var getMobileModel = function getMobileModel(_ref10) {
|
|
1998
|
+
var model = _ref10.model;
|
|
1999
|
+
return setDefaults(model);
|
|
2000
|
+
};
|
|
2001
|
+
var getDeviceType = function getDeviceType(_ref11) {
|
|
2002
|
+
var type = _ref11.type;
|
|
2003
|
+
return setDefaults(type, 'browser');
|
|
2004
|
+
}; // os types
|
|
2005
|
+
|
|
2006
|
+
var isAndroidType = function isAndroidType(_ref12) {
|
|
2007
|
+
var name = _ref12.name;
|
|
2008
|
+
return name === OsTypes.Android;
|
|
2009
|
+
};
|
|
2010
|
+
var isWindowsType = function isWindowsType(_ref13) {
|
|
2011
|
+
var name = _ref13.name;
|
|
2012
|
+
return name === OsTypes.Windows;
|
|
2013
|
+
};
|
|
2014
|
+
var isMacOsType = function isMacOsType(_ref14) {
|
|
2015
|
+
var name = _ref14.name;
|
|
2016
|
+
return name === OsTypes.MAC_OS;
|
|
2017
|
+
};
|
|
2018
|
+
var isWinPhoneType = function isWinPhoneType(_ref15) {
|
|
2019
|
+
var name = _ref15.name;
|
|
2020
|
+
return name === OsTypes.WindowsPhone;
|
|
2021
|
+
};
|
|
2022
|
+
var isIOSType = function isIOSType(_ref16) {
|
|
2023
|
+
var name = _ref16.name;
|
|
2024
|
+
return name === OsTypes.IOS;
|
|
2025
|
+
};
|
|
2026
|
+
var getOsVersion = function getOsVersion(_ref17) {
|
|
2027
|
+
var version = _ref17.version;
|
|
2028
|
+
return setDefaults(version);
|
|
2029
|
+
};
|
|
2030
|
+
var getOsName = function getOsName(_ref18) {
|
|
2031
|
+
var name = _ref18.name;
|
|
2032
|
+
return setDefaults(name);
|
|
2033
|
+
}; // browser types
|
|
2034
|
+
|
|
2035
|
+
var isChromeType = function isChromeType(_ref19) {
|
|
2036
|
+
var name = _ref19.name;
|
|
2037
|
+
return name === BrowserTypes.Chrome;
|
|
2038
|
+
};
|
|
2039
|
+
var isFirefoxType = function isFirefoxType(_ref20) {
|
|
2040
|
+
var name = _ref20.name;
|
|
2041
|
+
return name === BrowserTypes.Firefox;
|
|
2042
|
+
};
|
|
2043
|
+
var isChromiumType = function isChromiumType(_ref21) {
|
|
2044
|
+
var name = _ref21.name;
|
|
2045
|
+
return name === BrowserTypes.Chromium;
|
|
2046
|
+
};
|
|
2047
|
+
var isEdgeType = function isEdgeType(_ref22) {
|
|
2048
|
+
var name = _ref22.name;
|
|
2049
|
+
return name === BrowserTypes.Edge;
|
|
2050
|
+
};
|
|
2051
|
+
var isYandexType = function isYandexType(_ref23) {
|
|
2052
|
+
var name = _ref23.name;
|
|
2053
|
+
return name === BrowserTypes.Yandex;
|
|
2054
|
+
};
|
|
2055
|
+
var isSafariType = function isSafariType(_ref24) {
|
|
2056
|
+
var name = _ref24.name;
|
|
2057
|
+
return name === BrowserTypes.Safari || name === BrowserTypes.MobileSafari;
|
|
2058
|
+
};
|
|
2059
|
+
var isMobileSafariType = function isMobileSafariType(_ref25) {
|
|
2060
|
+
var name = _ref25.name;
|
|
2061
|
+
return name === BrowserTypes.MobileSafari;
|
|
2062
|
+
};
|
|
2063
|
+
var isOperaType = function isOperaType(_ref26) {
|
|
2064
|
+
var name = _ref26.name;
|
|
2065
|
+
return name === BrowserTypes.Opera;
|
|
2066
|
+
};
|
|
2067
|
+
var isIEType = function isIEType(_ref27) {
|
|
2068
|
+
var name = _ref27.name;
|
|
2069
|
+
return name === BrowserTypes.InternetExplorer || name === BrowserTypes.Ie;
|
|
2070
|
+
};
|
|
2071
|
+
var isMIUIType = function isMIUIType(_ref28) {
|
|
2072
|
+
var name = _ref28.name;
|
|
2073
|
+
return name === BrowserTypes.MIUI;
|
|
2074
|
+
};
|
|
2075
|
+
var isSamsungBrowserType = function isSamsungBrowserType(_ref29) {
|
|
2076
|
+
var name = _ref29.name;
|
|
2077
|
+
return name === BrowserTypes.SamsungBrowser;
|
|
2078
|
+
};
|
|
2079
|
+
var getBrowserFullVersion = function getBrowserFullVersion(_ref30) {
|
|
2080
|
+
var version = _ref30.version;
|
|
2081
|
+
return setDefaults(version);
|
|
2082
|
+
};
|
|
2083
|
+
var getBrowserVersion = function getBrowserVersion(_ref31) {
|
|
2084
|
+
var major = _ref31.major;
|
|
2085
|
+
return setDefaults(major);
|
|
2086
|
+
};
|
|
2087
|
+
var getBrowserName = function getBrowserName(_ref32) {
|
|
2088
|
+
var name = _ref32.name;
|
|
2089
|
+
return setDefaults(name);
|
|
2090
|
+
}; // engine types
|
|
2091
|
+
|
|
2092
|
+
var getEngineName = function getEngineName(_ref33) {
|
|
2093
|
+
var name = _ref33.name;
|
|
2094
|
+
return setDefaults(name);
|
|
2095
|
+
};
|
|
2096
|
+
var getEngineVersion = function getEngineVersion(_ref34) {
|
|
2097
|
+
var version = _ref34.version;
|
|
2098
|
+
return setDefaults(version);
|
|
2099
|
+
};
|
|
2100
|
+
var isElectronType = function isElectronType() {
|
|
2101
|
+
var nav = getNavigatorInstance();
|
|
2102
|
+
var ua = nav && nav.userAgent && nav.userAgent.toLowerCase();
|
|
2103
|
+
return typeof ua === 'string' ? /electron/.test(ua) : false;
|
|
2104
|
+
};
|
|
2105
|
+
var isEdgeChromiumType = function isEdgeChromiumType(ua) {
|
|
2106
|
+
return typeof ua === 'string' && ua.indexOf('Edg/') !== -1;
|
|
2107
|
+
};
|
|
2108
|
+
var getIOS13 = function getIOS13() {
|
|
2109
|
+
var nav = getNavigatorInstance();
|
|
2110
|
+
return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1) && !window.MSStream;
|
|
2111
|
+
};
|
|
2112
|
+
var getIPad13 = function getIPad13() {
|
|
2113
|
+
return isIOS13Check('iPad');
|
|
2114
|
+
};
|
|
2115
|
+
var getIphone13 = function getIphone13() {
|
|
2116
|
+
return isIOS13Check('iPhone');
|
|
2117
|
+
};
|
|
2118
|
+
var getIPod13 = function getIPod13() {
|
|
2119
|
+
return isIOS13Check('iPod');
|
|
2120
|
+
};
|
|
2121
|
+
var getUseragent = function getUseragent(userAg) {
|
|
2122
|
+
return setDefaults(userAg);
|
|
2123
|
+
};
|
|
2124
|
+
|
|
2125
|
+
function buildSelectorsObject(options) {
|
|
2126
|
+
var _ref = options ? options : UAHelper,
|
|
2127
|
+
device = _ref.device,
|
|
2128
|
+
browser = _ref.browser,
|
|
2129
|
+
os = _ref.os,
|
|
2130
|
+
engine = _ref.engine,
|
|
2131
|
+
ua = _ref.ua;
|
|
2132
|
+
|
|
2133
|
+
return {
|
|
2134
|
+
isSmartTV: isSmartTVType(device),
|
|
2135
|
+
isConsole: isConsoleType(device),
|
|
2136
|
+
isWearable: isWearableType(device),
|
|
2137
|
+
isEmbedded: isEmbeddedType(device),
|
|
2138
|
+
isMobileSafari: isMobileSafariType(browser) || getIPad13(),
|
|
2139
|
+
isChromium: isChromiumType(browser),
|
|
2140
|
+
isMobile: isMobileAndTabletType(device) || getIPad13(),
|
|
2141
|
+
isMobileOnly: isMobileType(device),
|
|
2142
|
+
isTablet: isTabletType(device) || getIPad13(),
|
|
2143
|
+
isBrowser: isBrowserType(device),
|
|
2144
|
+
isDesktop: isBrowserType(device),
|
|
2145
|
+
isAndroid: isAndroidType(os),
|
|
2146
|
+
isWinPhone: isWinPhoneType(os),
|
|
2147
|
+
isIOS: isIOSType(os) || getIPad13(),
|
|
2148
|
+
isChrome: isChromeType(browser),
|
|
2149
|
+
isFirefox: isFirefoxType(browser),
|
|
2150
|
+
isSafari: isSafariType(browser),
|
|
2151
|
+
isOpera: isOperaType(browser),
|
|
2152
|
+
isIE: isIEType(browser),
|
|
2153
|
+
osVersion: getOsVersion(os),
|
|
2154
|
+
osName: getOsName(os),
|
|
2155
|
+
fullBrowserVersion: getBrowserFullVersion(browser),
|
|
2156
|
+
browserVersion: getBrowserVersion(browser),
|
|
2157
|
+
browserName: getBrowserName(browser),
|
|
2158
|
+
mobileVendor: getMobileVendor(device),
|
|
2159
|
+
mobileModel: getMobileModel(device),
|
|
2160
|
+
engineName: getEngineName(engine),
|
|
2161
|
+
engineVersion: getEngineVersion(engine),
|
|
2162
|
+
getUA: getUseragent(ua),
|
|
2163
|
+
isEdge: isEdgeType(browser) || isEdgeChromiumType(ua),
|
|
2164
|
+
isYandex: isYandexType(browser),
|
|
2165
|
+
deviceType: getDeviceType(device),
|
|
2166
|
+
isIOS13: getIOS13(),
|
|
2167
|
+
isIPad13: getIPad13(),
|
|
2168
|
+
isIPhone13: getIphone13(),
|
|
2169
|
+
isIPod13: getIPod13(),
|
|
2170
|
+
isElectron: isElectronType(),
|
|
2171
|
+
isEdgeChromium: isEdgeChromiumType(ua),
|
|
2172
|
+
isLegacyEdge: isEdgeType(browser) && !isEdgeChromiumType(ua),
|
|
2173
|
+
isWindows: isWindowsType(os),
|
|
2174
|
+
isMacOs: isMacOsType(os),
|
|
2175
|
+
isMIUI: isMIUIType(browser),
|
|
2176
|
+
isSamsungBrowser: isSamsungBrowserType(browser)
|
|
2177
|
+
};
|
|
2178
|
+
}
|
|
2179
|
+
|
|
2180
|
+
var isSmartTV = isSmartTVType(device);
|
|
2181
|
+
var isConsole = isConsoleType(device);
|
|
2182
|
+
var isWearable = isWearableType(device);
|
|
2183
|
+
var isEmbedded = isEmbeddedType(device);
|
|
2184
|
+
var isMobileSafari = isMobileSafariType(browser) || getIPad13();
|
|
2185
|
+
var isChromium = isChromiumType(browser);
|
|
2186
|
+
var isMobile = isMobileAndTabletType(device) || getIPad13();
|
|
2187
|
+
var isMobileOnly = isMobileType(device);
|
|
2188
|
+
var isTablet = isTabletType(device) || getIPad13();
|
|
2189
|
+
var isBrowser = isBrowserType(device);
|
|
2190
|
+
var isDesktop = isBrowserType(device);
|
|
2191
|
+
var isAndroid = isAndroidType(os);
|
|
2192
|
+
var isWinPhone = isWinPhoneType(os);
|
|
2193
|
+
var isIOS = isIOSType(os) || getIPad13();
|
|
2194
|
+
var isChrome = isChromeType(browser);
|
|
2195
|
+
var isFirefox = isFirefoxType(browser);
|
|
2196
|
+
var isSafari = isSafariType(browser);
|
|
2197
|
+
var isOpera = isOperaType(browser);
|
|
2198
|
+
var isIE = isIEType(browser);
|
|
2199
|
+
var osVersion = getOsVersion(os);
|
|
2200
|
+
var osName = getOsName(os);
|
|
2201
|
+
var fullBrowserVersion = getBrowserFullVersion(browser);
|
|
2202
|
+
var browserVersion = getBrowserVersion(browser);
|
|
2203
|
+
var browserName = getBrowserName(browser);
|
|
2204
|
+
var mobileVendor = getMobileVendor(device);
|
|
2205
|
+
var mobileModel = getMobileModel(device);
|
|
2206
|
+
var engineName = getEngineName(engine);
|
|
2207
|
+
var engineVersion = getEngineVersion(engine);
|
|
2208
|
+
var getUA = getUseragent(ua);
|
|
2209
|
+
var isEdge = isEdgeType(browser) || isEdgeChromiumType(ua);
|
|
2210
|
+
var isYandex = isYandexType(browser);
|
|
2211
|
+
var deviceType = getDeviceType(device);
|
|
2212
|
+
var isIOS13 = getIOS13();
|
|
2213
|
+
var isIPad13 = getIPad13();
|
|
2214
|
+
var isIPhone13 = getIphone13();
|
|
2215
|
+
var isIPod13 = getIPod13();
|
|
2216
|
+
var isElectron = isElectronType();
|
|
2217
|
+
var isEdgeChromium = isEdgeChromiumType(ua);
|
|
2218
|
+
var isLegacyEdge = isEdgeType(browser) && !isEdgeChromiumType(ua);
|
|
2219
|
+
var isWindows = isWindowsType(os);
|
|
2220
|
+
var isMacOs = isMacOsType(os);
|
|
2221
|
+
var isMIUI = isMIUIType(browser);
|
|
2222
|
+
var isSamsungBrowser = isSamsungBrowserType(browser);
|
|
2223
|
+
var getSelectorsByUserAgent = function getSelectorsByUserAgent(userAgent) {
|
|
2224
|
+
if (!userAgent || typeof userAgent !== 'string') {
|
|
2225
|
+
console.error('No valid user agent string was provided');
|
|
2226
|
+
return;
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
var _UAHelper$parseUserAg = parseUserAgent(userAgent),
|
|
2230
|
+
device = _UAHelper$parseUserAg.device,
|
|
2231
|
+
browser = _UAHelper$parseUserAg.browser,
|
|
2232
|
+
os = _UAHelper$parseUserAg.os,
|
|
2233
|
+
engine = _UAHelper$parseUserAg.engine,
|
|
2234
|
+
ua = _UAHelper$parseUserAg.ua;
|
|
2235
|
+
|
|
2236
|
+
return buildSelectorsObject({
|
|
2237
|
+
device: device,
|
|
2238
|
+
browser: browser,
|
|
2239
|
+
os: os,
|
|
2240
|
+
engine: engine,
|
|
2241
|
+
ua: ua
|
|
2242
|
+
});
|
|
2243
|
+
};
|
|
2244
|
+
|
|
2245
|
+
var AndroidView = function AndroidView(_ref) {
|
|
2246
|
+
var renderWithFragment = _ref.renderWithFragment,
|
|
2247
|
+
children = _ref.children,
|
|
2248
|
+
props = _objectWithoutProperties(_ref, ["renderWithFragment", "children"]);
|
|
2249
|
+
|
|
2250
|
+
return isAndroid ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2251
|
+
};
|
|
2252
|
+
var BrowserView = function BrowserView(_ref2) {
|
|
2253
|
+
var renderWithFragment = _ref2.renderWithFragment,
|
|
2254
|
+
children = _ref2.children,
|
|
2255
|
+
props = _objectWithoutProperties(_ref2, ["renderWithFragment", "children"]);
|
|
2256
|
+
|
|
2257
|
+
return isBrowser ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2258
|
+
};
|
|
2259
|
+
var IEView = function IEView(_ref3) {
|
|
2260
|
+
var renderWithFragment = _ref3.renderWithFragment,
|
|
2261
|
+
children = _ref3.children,
|
|
2262
|
+
props = _objectWithoutProperties(_ref3, ["renderWithFragment", "children"]);
|
|
2263
|
+
|
|
2264
|
+
return isIE ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2265
|
+
};
|
|
2266
|
+
var IOSView = function IOSView(_ref4) {
|
|
2267
|
+
var renderWithFragment = _ref4.renderWithFragment,
|
|
2268
|
+
children = _ref4.children,
|
|
2269
|
+
props = _objectWithoutProperties(_ref4, ["renderWithFragment", "children"]);
|
|
2270
|
+
|
|
2271
|
+
return isIOS ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2272
|
+
};
|
|
2273
|
+
var MobileView = function MobileView(_ref5) {
|
|
2274
|
+
var renderWithFragment = _ref5.renderWithFragment,
|
|
2275
|
+
children = _ref5.children,
|
|
2276
|
+
props = _objectWithoutProperties(_ref5, ["renderWithFragment", "children"]);
|
|
2277
|
+
|
|
2278
|
+
return isMobile ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2279
|
+
};
|
|
2280
|
+
var TabletView = function TabletView(_ref6) {
|
|
2281
|
+
var renderWithFragment = _ref6.renderWithFragment,
|
|
2282
|
+
children = _ref6.children,
|
|
2283
|
+
props = _objectWithoutProperties(_ref6, ["renderWithFragment", "children"]);
|
|
2284
|
+
|
|
2285
|
+
return isTablet ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2286
|
+
};
|
|
2287
|
+
var WinPhoneView = function WinPhoneView(_ref7) {
|
|
2288
|
+
var renderWithFragment = _ref7.renderWithFragment,
|
|
2289
|
+
children = _ref7.children,
|
|
2290
|
+
props = _objectWithoutProperties(_ref7, ["renderWithFragment", "children"]);
|
|
2291
|
+
|
|
2292
|
+
return isWinPhone ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2293
|
+
};
|
|
2294
|
+
var MobileOnlyView = function MobileOnlyView(_ref8) {
|
|
2295
|
+
var renderWithFragment = _ref8.renderWithFragment,
|
|
2296
|
+
children = _ref8.children;
|
|
2297
|
+
_ref8.viewClassName;
|
|
2298
|
+
_ref8.style;
|
|
2299
|
+
var props = _objectWithoutProperties(_ref8, ["renderWithFragment", "children", "viewClassName", "style"]);
|
|
2300
|
+
|
|
2301
|
+
return isMobileOnly ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2302
|
+
};
|
|
2303
|
+
var SmartTVView = function SmartTVView(_ref9) {
|
|
2304
|
+
var renderWithFragment = _ref9.renderWithFragment,
|
|
2305
|
+
children = _ref9.children,
|
|
2306
|
+
props = _objectWithoutProperties(_ref9, ["renderWithFragment", "children"]);
|
|
2307
|
+
|
|
2308
|
+
return isSmartTV ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2309
|
+
};
|
|
2310
|
+
var ConsoleView = function ConsoleView(_ref10) {
|
|
2311
|
+
var renderWithFragment = _ref10.renderWithFragment,
|
|
2312
|
+
children = _ref10.children,
|
|
2313
|
+
props = _objectWithoutProperties(_ref10, ["renderWithFragment", "children"]);
|
|
2314
|
+
|
|
2315
|
+
return isConsole ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2316
|
+
};
|
|
2317
|
+
var WearableView = function WearableView(_ref11) {
|
|
2318
|
+
var renderWithFragment = _ref11.renderWithFragment,
|
|
2319
|
+
children = _ref11.children,
|
|
2320
|
+
props = _objectWithoutProperties(_ref11, ["renderWithFragment", "children"]);
|
|
2321
|
+
|
|
2322
|
+
return isWearable ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2323
|
+
};
|
|
2324
|
+
var CustomView = function CustomView(_ref12) {
|
|
2325
|
+
var renderWithFragment = _ref12.renderWithFragment,
|
|
2326
|
+
children = _ref12.children;
|
|
2327
|
+
_ref12.viewClassName;
|
|
2328
|
+
_ref12.style;
|
|
2329
|
+
var condition = _ref12.condition,
|
|
2330
|
+
props = _objectWithoutProperties(_ref12, ["renderWithFragment", "children", "viewClassName", "style", "condition"]);
|
|
2331
|
+
|
|
2332
|
+
return condition ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement("div", props, children) : null;
|
|
2333
|
+
};
|
|
2334
|
+
|
|
2335
|
+
function withOrientationChange(WrappedComponent) {
|
|
2336
|
+
return /*#__PURE__*/function (_React$Component) {
|
|
2337
|
+
_inherits(_class, _React$Component);
|
|
2338
|
+
|
|
2339
|
+
function _class(props) {
|
|
2340
|
+
var _this;
|
|
2341
|
+
|
|
2342
|
+
_classCallCheck(this, _class);
|
|
2343
|
+
|
|
2344
|
+
_this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));
|
|
2345
|
+
_this.isEventListenerAdded = false;
|
|
2346
|
+
_this.handleOrientationChange = _this.handleOrientationChange.bind(_assertThisInitialized(_this));
|
|
2347
|
+
_this.onOrientationChange = _this.onOrientationChange.bind(_assertThisInitialized(_this));
|
|
2348
|
+
_this.onPageLoad = _this.onPageLoad.bind(_assertThisInitialized(_this));
|
|
2349
|
+
_this.state = {
|
|
2350
|
+
isLandscape: false,
|
|
2351
|
+
isPortrait: false
|
|
2352
|
+
};
|
|
2353
|
+
return _this;
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
_createClass(_class, [{
|
|
2357
|
+
key: "handleOrientationChange",
|
|
2358
|
+
value: function handleOrientationChange() {
|
|
2359
|
+
if (!this.isEventListenerAdded) {
|
|
2360
|
+
this.isEventListenerAdded = true;
|
|
2361
|
+
}
|
|
2362
|
+
|
|
2363
|
+
var orientation = window.innerWidth > window.innerHeight ? 90 : 0;
|
|
2364
|
+
this.setState({
|
|
2365
|
+
isPortrait: orientation === 0,
|
|
2366
|
+
isLandscape: orientation === 90
|
|
2367
|
+
});
|
|
2368
|
+
}
|
|
2369
|
+
}, {
|
|
2370
|
+
key: "onOrientationChange",
|
|
2371
|
+
value: function onOrientationChange() {
|
|
2372
|
+
this.handleOrientationChange();
|
|
2373
|
+
}
|
|
2374
|
+
}, {
|
|
2375
|
+
key: "onPageLoad",
|
|
2376
|
+
value: function onPageLoad() {
|
|
2377
|
+
this.handleOrientationChange();
|
|
2378
|
+
}
|
|
2379
|
+
}, {
|
|
2380
|
+
key: "componentDidMount",
|
|
2381
|
+
value: function componentDidMount() {
|
|
2382
|
+
if ((typeof window === "undefined" ? "undefined" : _typeof(window)) !== undefined && isMobile) {
|
|
2383
|
+
if (!this.isEventListenerAdded) {
|
|
2384
|
+
this.handleOrientationChange();
|
|
2385
|
+
window.addEventListener("load", this.onPageLoad, false);
|
|
2386
|
+
} else {
|
|
2387
|
+
window.removeEventListener("load", this.onPageLoad, false);
|
|
2388
|
+
}
|
|
2389
|
+
|
|
2390
|
+
window.addEventListener("resize", this.onOrientationChange, false);
|
|
2391
|
+
}
|
|
2392
|
+
}
|
|
2393
|
+
}, {
|
|
2394
|
+
key: "componentWillUnmount",
|
|
2395
|
+
value: function componentWillUnmount() {
|
|
2396
|
+
window.removeEventListener("resize", this.onOrientationChange, false);
|
|
2397
|
+
}
|
|
2398
|
+
}, {
|
|
2399
|
+
key: "render",
|
|
2400
|
+
value: function render() {
|
|
2401
|
+
return React__default.createElement(WrappedComponent, _extends({}, this.props, {
|
|
2402
|
+
isLandscape: this.state.isLandscape,
|
|
2403
|
+
isPortrait: this.state.isPortrait
|
|
2404
|
+
}));
|
|
2405
|
+
}
|
|
2406
|
+
}]);
|
|
2407
|
+
|
|
2408
|
+
return _class;
|
|
2409
|
+
}(React__default.Component);
|
|
2410
|
+
}
|
|
2411
|
+
|
|
2412
|
+
function useMobileOrientation() {
|
|
2413
|
+
var _useState = React.useState(function () {
|
|
2414
|
+
var orientation = window.innerWidth > window.innerHeight ? 90 : 0;
|
|
2415
|
+
return {
|
|
2416
|
+
isPortrait: orientation === 0,
|
|
2417
|
+
isLandscape: orientation === 90,
|
|
2418
|
+
orientation: orientation === 0 ? 'portrait' : 'landscape'
|
|
2419
|
+
};
|
|
2420
|
+
}),
|
|
2421
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
2422
|
+
state = _useState2[0],
|
|
2423
|
+
setState = _useState2[1];
|
|
2424
|
+
|
|
2425
|
+
var handleOrientationChange = React.useCallback(function () {
|
|
2426
|
+
var orientation = window.innerWidth > window.innerHeight ? 90 : 0;
|
|
2427
|
+
var next = {
|
|
2428
|
+
isPortrait: orientation === 0,
|
|
2429
|
+
isLandscape: orientation === 90,
|
|
2430
|
+
orientation: orientation === 0 ? 'portrait' : 'landscape'
|
|
2431
|
+
};
|
|
2432
|
+
state.orientation !== next.orientation && setState(next);
|
|
2433
|
+
}, [state.orientation]);
|
|
2434
|
+
React.useEffect(function () {
|
|
2435
|
+
if ((typeof window === "undefined" ? "undefined" : _typeof(window)) !== undefined && isMobile) {
|
|
2436
|
+
handleOrientationChange();
|
|
2437
|
+
window.addEventListener("load", handleOrientationChange, false);
|
|
2438
|
+
window.addEventListener("resize", handleOrientationChange, false);
|
|
2439
|
+
}
|
|
2440
|
+
|
|
2441
|
+
return function () {
|
|
2442
|
+
window.removeEventListener("resize", handleOrientationChange, false);
|
|
2443
|
+
window.removeEventListener("load", handleOrientationChange, false);
|
|
2444
|
+
};
|
|
2445
|
+
}, [handleOrientationChange]);
|
|
2446
|
+
return state;
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2449
|
+
function useDeviceData(userAgent) {
|
|
2450
|
+
var hookUserAgent = userAgent ? userAgent : window.navigator.userAgent;
|
|
2451
|
+
return parseUserAgent(hookUserAgent);
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2454
|
+
function useDeviceSelectors(userAgent) {
|
|
2455
|
+
var hookUserAgent = userAgent ? userAgent : window.navigator.userAgent;
|
|
2456
|
+
var deviceData = useDeviceData(hookUserAgent);
|
|
2457
|
+
var selectors = buildSelectorsObject(deviceData);
|
|
2458
|
+
return [selectors, deviceData];
|
|
2459
|
+
}
|
|
2460
|
+
|
|
2461
|
+
lib.AndroidView = AndroidView;
|
|
2462
|
+
lib.BrowserTypes = BrowserTypes;
|
|
2463
|
+
lib.BrowserView = BrowserView;
|
|
2464
|
+
lib.ConsoleView = ConsoleView;
|
|
2465
|
+
lib.CustomView = CustomView;
|
|
2466
|
+
lib.IEView = IEView;
|
|
2467
|
+
lib.IOSView = IOSView;
|
|
2468
|
+
lib.MobileOnlyView = MobileOnlyView;
|
|
2469
|
+
lib.MobileView = MobileView;
|
|
2470
|
+
lib.OsTypes = OsTypes;
|
|
2471
|
+
lib.SmartTVView = SmartTVView;
|
|
2472
|
+
lib.TabletView = TabletView;
|
|
2473
|
+
lib.WearableView = WearableView;
|
|
2474
|
+
lib.WinPhoneView = WinPhoneView;
|
|
2475
|
+
lib.browserName = browserName;
|
|
2476
|
+
lib.browserVersion = browserVersion;
|
|
2477
|
+
lib.deviceDetect = deviceDetect;
|
|
2478
|
+
lib.deviceType = deviceType;
|
|
2479
|
+
lib.engineName = engineName;
|
|
2480
|
+
lib.engineVersion = engineVersion;
|
|
2481
|
+
lib.fullBrowserVersion = fullBrowserVersion;
|
|
2482
|
+
lib.getSelectorsByUserAgent = getSelectorsByUserAgent;
|
|
2483
|
+
lib.getUA = getUA;
|
|
2484
|
+
lib.isAndroid = isAndroid;
|
|
2485
|
+
lib.isBrowser = isBrowser;
|
|
2486
|
+
lib.isChrome = isChrome;
|
|
2487
|
+
lib.isChromium = isChromium;
|
|
2488
|
+
lib.isConsole = isConsole;
|
|
2489
|
+
lib.isDesktop = isDesktop;
|
|
2490
|
+
lib.isEdge = isEdge;
|
|
2491
|
+
lib.isEdgeChromium = isEdgeChromium;
|
|
2492
|
+
lib.isElectron = isElectron;
|
|
2493
|
+
lib.isEmbedded = isEmbedded;
|
|
2494
|
+
lib.isFirefox = isFirefox;
|
|
2495
|
+
lib.isIE = isIE;
|
|
2496
|
+
var isIOS_1 = lib.isIOS = isIOS;
|
|
2497
|
+
lib.isIOS13 = isIOS13;
|
|
2498
|
+
lib.isIPad13 = isIPad13;
|
|
2499
|
+
lib.isIPhone13 = isIPhone13;
|
|
2500
|
+
lib.isIPod13 = isIPod13;
|
|
2501
|
+
lib.isLegacyEdge = isLegacyEdge;
|
|
2502
|
+
lib.isMIUI = isMIUI;
|
|
2503
|
+
lib.isMacOs = isMacOs;
|
|
2504
|
+
lib.isMobile = isMobile;
|
|
2505
|
+
lib.isMobileOnly = isMobileOnly;
|
|
2506
|
+
lib.isMobileSafari = isMobileSafari;
|
|
2507
|
+
lib.isOpera = isOpera;
|
|
2508
|
+
lib.isSafari = isSafari;
|
|
2509
|
+
lib.isSamsungBrowser = isSamsungBrowser;
|
|
2510
|
+
lib.isSmartTV = isSmartTV;
|
|
2511
|
+
lib.isTablet = isTablet;
|
|
2512
|
+
lib.isWearable = isWearable;
|
|
2513
|
+
lib.isWinPhone = isWinPhone;
|
|
2514
|
+
lib.isWindows = isWindows;
|
|
2515
|
+
lib.isYandex = isYandex;
|
|
2516
|
+
lib.mobileModel = mobileModel;
|
|
2517
|
+
lib.mobileVendor = mobileVendor;
|
|
2518
|
+
lib.osName = osName;
|
|
2519
|
+
lib.osVersion = osVersion;
|
|
2520
|
+
lib.parseUserAgent = parseUserAgent;
|
|
2521
|
+
lib.setUserAgent = setUserAgent;
|
|
2522
|
+
lib.useDeviceData = useDeviceData;
|
|
2523
|
+
lib.useDeviceSelectors = useDeviceSelectors;
|
|
2524
|
+
lib.useMobileOrientation = useMobileOrientation;
|
|
2525
|
+
lib.withOrientationChange = withOrientationChange;
|
|
2526
|
+
|
|
2527
|
+
class BaseWallet {
|
|
2528
|
+
algodClient;
|
|
2529
|
+
algosdk;
|
|
2530
|
+
keepWCAlive;
|
|
2531
|
+
constructor({ algosdk, token, server, port }) {
|
|
2532
|
+
this.algodClient = new algosdk.Algodv2(token, server, port);
|
|
2533
|
+
this.algosdk = algosdk;
|
|
2534
|
+
this.keepWCAlive = new Audio();
|
|
2535
|
+
}
|
|
2536
|
+
async healthCheck() {
|
|
2537
|
+
return await this.algodClient.healthCheck().do();
|
|
2538
|
+
}
|
|
2539
|
+
async getAccountInfo(address) {
|
|
2540
|
+
const accountInfo = await this.algodClient.accountInformation(address).do();
|
|
2541
|
+
if (!accountInfo) {
|
|
2542
|
+
throw new Error("Unable to get account information");
|
|
2543
|
+
}
|
|
2544
|
+
return accountInfo;
|
|
2545
|
+
}
|
|
2546
|
+
async getAssets(address) {
|
|
2547
|
+
const accountInfo = await this.algodClient.accountInformation(address).do();
|
|
2548
|
+
if (!accountInfo || accountInfo.assets === undefined) {
|
|
2549
|
+
throw new Error("Unable to get account assets");
|
|
2550
|
+
}
|
|
2551
|
+
return accountInfo.assets;
|
|
2552
|
+
}
|
|
2553
|
+
async waitForConfirmation(txId, timeout = 4) {
|
|
2554
|
+
const confirmation = (await this.algosdk.waitForConfirmation(this.algodClient, txId, timeout));
|
|
2555
|
+
return { txId, ...confirmation };
|
|
2556
|
+
}
|
|
2557
|
+
decodeTransaction = (txn, isSigned) => {
|
|
2558
|
+
return isSigned
|
|
2559
|
+
? this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))).txn
|
|
2560
|
+
: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
2561
|
+
};
|
|
2562
|
+
logEncodedTransaction(txn, isSigned) {
|
|
2563
|
+
const txnObj = this.decodeTransaction(txn, isSigned);
|
|
2564
|
+
console.log("TRANSACTION", {
|
|
2565
|
+
isSigned,
|
|
2566
|
+
from: txnObj.from && this.algosdk.encodeAddress(txnObj.from.publicKey),
|
|
2567
|
+
to: txnObj.to && this.algosdk.encodeAddress(txnObj.to.publicKey),
|
|
2568
|
+
type: txnObj.type,
|
|
2569
|
+
txn: txnObj,
|
|
2570
|
+
});
|
|
2571
|
+
}
|
|
2572
|
+
groupTransactionsBySender(transactions) {
|
|
2573
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2574
|
+
function groupBy(objectArray, property) {
|
|
2575
|
+
return objectArray.reduce(function (acc, obj) {
|
|
2576
|
+
const key = obj[property];
|
|
2577
|
+
if (!acc[key]) {
|
|
2578
|
+
acc[key] = [];
|
|
2579
|
+
}
|
|
2580
|
+
acc[key].push(obj);
|
|
2581
|
+
return acc;
|
|
2582
|
+
}, {});
|
|
2583
|
+
}
|
|
2584
|
+
const decodedGroup = transactions.reduce((acc, [type, txn], index) => {
|
|
2585
|
+
if (type === "u") {
|
|
2586
|
+
const decodedTxn = this.decodeTransaction(txn, false);
|
|
2587
|
+
const from = decodedTxn.from
|
|
2588
|
+
? this.algosdk.encodeAddress(decodedTxn.from.publicKey)
|
|
2589
|
+
: "";
|
|
2590
|
+
const to = decodedTxn.to
|
|
2591
|
+
? this.algosdk.encodeAddress(decodedTxn.to.publicKey)
|
|
2592
|
+
: "";
|
|
2593
|
+
const type = decodedTxn.type || "";
|
|
2594
|
+
const amount = Number(decodedTxn.amount) || 0; // convert from bigint to number
|
|
2595
|
+
const txnObj = {
|
|
2596
|
+
groupIndex: index,
|
|
2597
|
+
amount,
|
|
2598
|
+
from,
|
|
2599
|
+
to,
|
|
2600
|
+
type,
|
|
2601
|
+
txn,
|
|
2602
|
+
};
|
|
2603
|
+
acc.push(txnObj);
|
|
2604
|
+
}
|
|
2605
|
+
return acc;
|
|
2606
|
+
}, []);
|
|
2607
|
+
return groupBy(decodedGroup, "from");
|
|
2608
|
+
}
|
|
2609
|
+
async sendRawTransactions(transactions) {
|
|
2610
|
+
const sentTransaction = await this.algodClient
|
|
2611
|
+
.sendRawTransaction(transactions)
|
|
2612
|
+
.do();
|
|
2613
|
+
if (!sentTransaction) {
|
|
2614
|
+
throw new Error("Transaction failed.");
|
|
2615
|
+
}
|
|
2616
|
+
const confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId);
|
|
2617
|
+
console.log("sent", confirmedTransaction);
|
|
2618
|
+
return {
|
|
2619
|
+
id: sentTransaction.txId,
|
|
2620
|
+
...confirmedTransaction,
|
|
2621
|
+
};
|
|
2622
|
+
}
|
|
2623
|
+
keepWCAliveStart() {
|
|
2624
|
+
// Playing an audio file prevents Wallet Connect's
|
|
2625
|
+
// web socket connection from being dropped when
|
|
2626
|
+
// iOS goes into background mode
|
|
2627
|
+
if (!isIOS_1) {
|
|
2628
|
+
return;
|
|
2629
|
+
}
|
|
2630
|
+
this.keepWCAlive.src = audio;
|
|
2631
|
+
this.keepWCAlive.autoplay = true;
|
|
2632
|
+
this.keepWCAlive.volume = 0;
|
|
2633
|
+
this.keepWCAlive.loop = true;
|
|
2634
|
+
this.keepWCAlive.play();
|
|
2635
|
+
}
|
|
2636
|
+
keepWCAliveStop() {
|
|
2637
|
+
if (!isIOS_1) {
|
|
2638
|
+
return;
|
|
2639
|
+
}
|
|
2640
|
+
this.keepWCAlive.pause();
|
|
2641
|
+
}
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
/**
|
|
2645
|
+
* Helpful resources:
|
|
2646
|
+
* https://github.com/perawallet/connect
|
|
2647
|
+
*/
|
|
2648
|
+
class PeraWalletClient extends BaseWallet {
|
|
2649
|
+
#client;
|
|
2650
|
+
id;
|
|
2651
|
+
provider;
|
|
2652
|
+
constructor(initAlgodClient, initWallet) {
|
|
2653
|
+
super(initAlgodClient);
|
|
2654
|
+
this.#client = initWallet.client;
|
|
2655
|
+
this.id = initWallet.id;
|
|
2656
|
+
this.provider = initWallet.providers[this.id];
|
|
2657
|
+
}
|
|
2658
|
+
static async init() {
|
|
2659
|
+
const algosdk = (await import('algosdk')).default;
|
|
2660
|
+
const initAlgodClient = {
|
|
2661
|
+
algosdk,
|
|
2662
|
+
token: NODE_TOKEN,
|
|
2663
|
+
server: NODE_SERVER,
|
|
2664
|
+
port: NODE_PORT,
|
|
2665
|
+
};
|
|
2666
|
+
const PeraWalletConnect = (await import('@perawallet/connect'))
|
|
2667
|
+
.PeraWalletConnect;
|
|
2668
|
+
const peraWallet = new PeraWalletConnect({ shouldShowSignTxnToast: false });
|
|
2669
|
+
const initWallet = {
|
|
2670
|
+
id: PROVIDER_ID.PERA_WALLET,
|
|
2671
|
+
client: peraWallet,
|
|
2672
|
+
providers: providers,
|
|
2673
|
+
};
|
|
2674
|
+
return new PeraWalletClient(initAlgodClient, initWallet);
|
|
2675
|
+
}
|
|
2676
|
+
async connect(onDisconnect) {
|
|
2677
|
+
this.keepWCAliveStart();
|
|
2678
|
+
const accounts = await this.#client.connect();
|
|
2679
|
+
this.keepWCAliveStop();
|
|
2680
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
2681
|
+
if (accounts.length === 0) {
|
|
2682
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
2683
|
+
}
|
|
2684
|
+
const mappedAccounts = accounts.map((address, index) => ({
|
|
2685
|
+
name: `Pera Wallet ${index + 1}`,
|
|
2686
|
+
address,
|
|
2687
|
+
providerId: this.provider.id,
|
|
2688
|
+
}));
|
|
2689
|
+
return {
|
|
2690
|
+
...this.provider,
|
|
2691
|
+
accounts: mappedAccounts,
|
|
2692
|
+
};
|
|
2693
|
+
}
|
|
2694
|
+
async reconnect(onDisconnect) {
|
|
2695
|
+
const accounts = await this.#client.reconnectSession();
|
|
2696
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
2697
|
+
if (!accounts) {
|
|
2698
|
+
return null;
|
|
2699
|
+
}
|
|
2700
|
+
return {
|
|
2701
|
+
...this.provider,
|
|
2702
|
+
accounts: accounts.map((address, index) => ({
|
|
2703
|
+
name: `Pera Wallet ${index + 1}`,
|
|
2704
|
+
address,
|
|
2705
|
+
providerId: this.provider.id,
|
|
2706
|
+
})),
|
|
2707
|
+
};
|
|
2708
|
+
}
|
|
2709
|
+
async disconnect() {
|
|
2710
|
+
await this.#client.disconnect();
|
|
2711
|
+
}
|
|
2712
|
+
formatTransactionsArray(transactions) {
|
|
2713
|
+
const formattedTransactions = [];
|
|
2714
|
+
for (const [type, txn] of transactions) {
|
|
2715
|
+
if (type === "s") {
|
|
2716
|
+
formattedTransactions.push({
|
|
2717
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
2718
|
+
signers: [],
|
|
2719
|
+
});
|
|
2720
|
+
}
|
|
2721
|
+
else {
|
|
2722
|
+
formattedTransactions.push({
|
|
2723
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
2724
|
+
});
|
|
2725
|
+
}
|
|
2726
|
+
}
|
|
2727
|
+
return formattedTransactions;
|
|
2728
|
+
}
|
|
2729
|
+
async signTransactions(activeAdress, transactions) {
|
|
2730
|
+
// Decode the transactions to access their properties.
|
|
2731
|
+
const decodedTxns = transactions.map((txn) => {
|
|
2732
|
+
return this.algosdk.decodeObj(txn);
|
|
2733
|
+
});
|
|
2734
|
+
// Marshal the transactions,
|
|
2735
|
+
// and add the signers property if they shouldn't be signed.
|
|
2736
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
2737
|
+
if (!("txn" in txn) &&
|
|
2738
|
+
this.algosdk.encodeAddress(txn["snd"]) === activeAdress) {
|
|
2739
|
+
acc.push({
|
|
2740
|
+
txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
|
|
2741
|
+
});
|
|
2742
|
+
}
|
|
2743
|
+
else {
|
|
2744
|
+
acc.push({
|
|
2745
|
+
txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
|
|
2746
|
+
signers: [],
|
|
2747
|
+
});
|
|
2748
|
+
}
|
|
2749
|
+
return acc;
|
|
2750
|
+
}, []);
|
|
2751
|
+
// Play an audio file to keep Wallet Connect's web socket open on iOS
|
|
2752
|
+
// when the user goes into background mode.
|
|
2753
|
+
this.keepWCAliveStart();
|
|
2754
|
+
// Sign them with the client.
|
|
2755
|
+
const result = await this.#client.signTransaction([txnsToSign]);
|
|
2756
|
+
this.keepWCAliveStop();
|
|
2757
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
2758
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
2759
|
+
if (!("txn" in txn)) {
|
|
2760
|
+
const signedByUser = result.shift();
|
|
2761
|
+
signedByUser && acc.push(signedByUser);
|
|
2762
|
+
}
|
|
2763
|
+
else {
|
|
2764
|
+
acc.push(transactions[i]);
|
|
2765
|
+
}
|
|
2766
|
+
return acc;
|
|
2767
|
+
}, []);
|
|
2768
|
+
return signedTxns;
|
|
2769
|
+
}
|
|
2770
|
+
async signEncodedTransactions(transactions) {
|
|
2771
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
2772
|
+
this.keepWCAliveStart();
|
|
2773
|
+
const result = (await this.#client.signTransaction([
|
|
2774
|
+
transactionsToSign,
|
|
2775
|
+
]));
|
|
2776
|
+
this.keepWCAliveStop();
|
|
2777
|
+
const signedTransactions = [];
|
|
2778
|
+
let resultIndex = 0;
|
|
2779
|
+
for (const [type, txn] of transactions) {
|
|
2780
|
+
if (type === "u") {
|
|
2781
|
+
signedTransactions.push(result[resultIndex]);
|
|
2782
|
+
resultIndex++;
|
|
2783
|
+
}
|
|
2784
|
+
else {
|
|
2785
|
+
signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
2786
|
+
}
|
|
2787
|
+
}
|
|
2788
|
+
return signedTransactions;
|
|
2789
|
+
}
|
|
2790
|
+
}
|
|
2791
|
+
var peraWalletClient = PeraWalletClient.init().catch((e) => {
|
|
2792
|
+
if (typeof window !== "undefined") {
|
|
2793
|
+
console.error("error initializing PeraWalletClient", e);
|
|
2794
|
+
return;
|
|
2795
|
+
}
|
|
2796
|
+
});
|
|
2797
|
+
|
|
2798
|
+
/**
|
|
2799
|
+
* Helpful resources:
|
|
2800
|
+
* https://github.com/randlabs/myalgo-connect
|
|
2801
|
+
*/
|
|
2802
|
+
class MyAlgoWalletClient extends BaseWallet {
|
|
2803
|
+
#client;
|
|
2804
|
+
id;
|
|
2805
|
+
provider;
|
|
2806
|
+
constructor(initAlgodClient, initWallet) {
|
|
2807
|
+
super(initAlgodClient);
|
|
2808
|
+
this.#client = initWallet.client;
|
|
2809
|
+
this.id = initWallet.id;
|
|
2810
|
+
this.provider = initWallet.providers[this.id];
|
|
2811
|
+
}
|
|
2812
|
+
static async init() {
|
|
2813
|
+
const algosdk = (await import('algosdk')).default;
|
|
2814
|
+
const initAlgodClient = {
|
|
2815
|
+
algosdk,
|
|
2816
|
+
token: NODE_TOKEN,
|
|
2817
|
+
server: NODE_SERVER,
|
|
2818
|
+
port: NODE_PORT,
|
|
2819
|
+
};
|
|
2820
|
+
const MyAlgo = (await import('@randlabs/myalgo-connect')).default;
|
|
2821
|
+
const myAlgo = new MyAlgo({ disableLedgerNano: false });
|
|
2822
|
+
const initWallet = {
|
|
2823
|
+
id: PROVIDER_ID.MYALGO_WALLET,
|
|
2824
|
+
client: myAlgo,
|
|
2825
|
+
providers: providers,
|
|
2826
|
+
};
|
|
2827
|
+
return new MyAlgoWalletClient(initAlgodClient, initWallet);
|
|
2828
|
+
}
|
|
2829
|
+
async connect() {
|
|
2830
|
+
const accounts = await this.#client.connect();
|
|
2831
|
+
if (accounts.length === 0) {
|
|
2832
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
2833
|
+
}
|
|
2834
|
+
const mappedAccounts = accounts.map((account) => ({
|
|
2835
|
+
...account,
|
|
2836
|
+
providerId: this.provider.id,
|
|
2837
|
+
}));
|
|
2838
|
+
return {
|
|
2839
|
+
...this.provider,
|
|
2840
|
+
accounts: mappedAccounts,
|
|
2841
|
+
};
|
|
2842
|
+
}
|
|
2843
|
+
async reconnect() {
|
|
2844
|
+
return null;
|
|
2845
|
+
}
|
|
2846
|
+
async disconnect() {
|
|
2847
|
+
return;
|
|
2848
|
+
}
|
|
2849
|
+
async signTransactions(activeAdress, transactions) {
|
|
2850
|
+
// Decode the transactions to access their properties.
|
|
2851
|
+
const decodedTxns = transactions.map((txn) => {
|
|
2852
|
+
return this.algosdk.decodeObj(txn);
|
|
2853
|
+
});
|
|
2854
|
+
// Get the unsigned transactions.
|
|
2855
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
2856
|
+
// If the transaction isn't already signed and is to be sent from a connected account,
|
|
2857
|
+
// add it to the arrays of transactions to be signed.
|
|
2858
|
+
if (!("txn" in txn) &&
|
|
2859
|
+
this.algosdk.encodeAddress(txn["snd"]) === activeAdress) {
|
|
2860
|
+
acc.push(transactions[i]);
|
|
2861
|
+
}
|
|
2862
|
+
return acc;
|
|
2863
|
+
}, []);
|
|
2864
|
+
// Sign them with the client.
|
|
2865
|
+
const result = await this.#client.signTransaction(txnsToSign);
|
|
2866
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
2867
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
2868
|
+
if (!("txn" in txn)) {
|
|
2869
|
+
const signedByUser = result.shift()?.blob;
|
|
2870
|
+
signedByUser && acc.push(signedByUser);
|
|
2871
|
+
}
|
|
2872
|
+
else {
|
|
2873
|
+
acc.push(transactions[i]);
|
|
2874
|
+
}
|
|
2875
|
+
return acc;
|
|
2876
|
+
}, []);
|
|
2877
|
+
return signedTxns;
|
|
2878
|
+
}
|
|
2879
|
+
async signEncodedTransactions(transactions) {
|
|
2880
|
+
const transactionsToSign = [];
|
|
2881
|
+
const signedRawTransactions = [];
|
|
2882
|
+
for (const [type, txn] of transactions) {
|
|
2883
|
+
if (type === "u") {
|
|
2884
|
+
transactionsToSign.push(txn);
|
|
2885
|
+
}
|
|
2886
|
+
}
|
|
2887
|
+
const result = await this.#client.signTransaction(transactionsToSign);
|
|
2888
|
+
if (!result) {
|
|
2889
|
+
throw new Error("Signing failed.");
|
|
2890
|
+
}
|
|
2891
|
+
let resultIndex = 0;
|
|
2892
|
+
for (const [type, txn] of transactions) {
|
|
2893
|
+
if (type === "u") {
|
|
2894
|
+
signedRawTransactions.push(result[resultIndex].blob);
|
|
2895
|
+
resultIndex++;
|
|
2896
|
+
}
|
|
2897
|
+
else {
|
|
2898
|
+
signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
2899
|
+
}
|
|
2900
|
+
}
|
|
2901
|
+
return signedRawTransactions;
|
|
2902
|
+
}
|
|
2903
|
+
}
|
|
2904
|
+
var myAlgoWalletClient = MyAlgoWalletClient.init().catch((e) => {
|
|
2905
|
+
if (typeof window !== "undefined") {
|
|
2906
|
+
console.error("error initializing MyAlgoWalletClient", e);
|
|
2907
|
+
return;
|
|
2908
|
+
}
|
|
2909
|
+
});
|
|
2910
|
+
|
|
2911
|
+
/**
|
|
2912
|
+
* Helpful resources:
|
|
2913
|
+
* https://github.com/PureStake/algosigner/blob/develop/docs/dApp-integration.md
|
|
2914
|
+
*/
|
|
2915
|
+
class AlgoSignerClient extends BaseWallet {
|
|
2916
|
+
#client;
|
|
2917
|
+
id;
|
|
2918
|
+
provider;
|
|
2919
|
+
constructor(initAlgodClient, initWallet) {
|
|
2920
|
+
super(initAlgodClient);
|
|
2921
|
+
this.#client = initWallet.client;
|
|
2922
|
+
this.id = initWallet.id;
|
|
2923
|
+
this.provider = initWallet.providers[this.id];
|
|
2924
|
+
}
|
|
2925
|
+
static async init() {
|
|
2926
|
+
const algosdk = (await import('algosdk')).default;
|
|
2927
|
+
const initAlgodClient = {
|
|
2928
|
+
algosdk,
|
|
2929
|
+
token: NODE_TOKEN,
|
|
2930
|
+
server: NODE_SERVER,
|
|
2931
|
+
port: NODE_PORT,
|
|
2932
|
+
};
|
|
2933
|
+
if (typeof window == "undefined" ||
|
|
2934
|
+
window.AlgoSigner === undefined) {
|
|
2935
|
+
throw new Error("AlgoSigner is not available.");
|
|
2936
|
+
}
|
|
2937
|
+
const algoSigner = window.AlgoSigner;
|
|
2938
|
+
const initWallet = {
|
|
2939
|
+
id: PROVIDER_ID.ALGO_SIGNER,
|
|
2940
|
+
client: algoSigner,
|
|
2941
|
+
providers: providers,
|
|
2942
|
+
};
|
|
2943
|
+
return new AlgoSignerClient(initAlgodClient, initWallet);
|
|
2944
|
+
}
|
|
2945
|
+
async connect() {
|
|
2946
|
+
await this.#client.connect();
|
|
2947
|
+
let ledger = "MainNet";
|
|
2948
|
+
/** @todo remove env vars */
|
|
2949
|
+
// if (process.env.NEXT_PUBLIC_VERCEL_ENV === "betanet") {
|
|
2950
|
+
// ledger = "BetaNet";
|
|
2951
|
+
// }
|
|
2952
|
+
// if (process.env.NEXT_PUBLIC_VERCEL_ENV === "testnet") {
|
|
2953
|
+
// ledger = "TestNet";
|
|
2954
|
+
// }
|
|
2955
|
+
// if (!process.env.NEXT_PUBLIC_VERCEL_ENV) {
|
|
2956
|
+
// ledger = "devmodenet";
|
|
2957
|
+
// }
|
|
2958
|
+
const accounts = await this.#client.accounts({
|
|
2959
|
+
ledger,
|
|
2960
|
+
});
|
|
2961
|
+
if (accounts.length === 0) {
|
|
2962
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
2963
|
+
}
|
|
2964
|
+
const mappedAccounts = accounts.map(({ address }, index) => ({
|
|
2965
|
+
name: `AlgoSigner ${index + 1}`,
|
|
2966
|
+
address,
|
|
2967
|
+
providerId: this.provider.id,
|
|
2968
|
+
}));
|
|
2969
|
+
return {
|
|
2970
|
+
...this.provider,
|
|
2971
|
+
accounts: mappedAccounts,
|
|
2972
|
+
};
|
|
2973
|
+
}
|
|
2974
|
+
async reconnect(onDisconnect) {
|
|
2975
|
+
if (window === undefined ||
|
|
2976
|
+
window.AlgoSigner === undefined) {
|
|
2977
|
+
onDisconnect();
|
|
2978
|
+
}
|
|
2979
|
+
return null;
|
|
2980
|
+
}
|
|
2981
|
+
async disconnect() {
|
|
2982
|
+
return;
|
|
2983
|
+
}
|
|
2984
|
+
formatTransactionsArray(transactions) {
|
|
2985
|
+
const formattedTransactions = transactions.map(([type, txn]) => {
|
|
2986
|
+
const formattedTxn = {
|
|
2987
|
+
txn: txn[1],
|
|
2988
|
+
};
|
|
2989
|
+
if (type === "s") {
|
|
2990
|
+
formattedTxn.signers = [];
|
|
2991
|
+
const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
|
|
2992
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
|
|
2993
|
+
}
|
|
2994
|
+
else {
|
|
2995
|
+
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
2996
|
+
formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
|
|
2997
|
+
}
|
|
2998
|
+
return formattedTxn;
|
|
2999
|
+
});
|
|
3000
|
+
return formattedTransactions;
|
|
3001
|
+
}
|
|
3002
|
+
async signTransactions(activeAdress, transactions) {
|
|
3003
|
+
// Decode the transactions to access their properties.
|
|
3004
|
+
const decodedTxns = transactions.map((txn) => {
|
|
3005
|
+
return this.algosdk.decodeObj(txn);
|
|
3006
|
+
});
|
|
3007
|
+
// Marshal the transactions,
|
|
3008
|
+
// and add the signers property if they shouldn't be signed.
|
|
3009
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
3010
|
+
const txnObj = {
|
|
3011
|
+
txn: this.#client.encoding.msgpackToBase64(transactions[i]),
|
|
3012
|
+
};
|
|
3013
|
+
if ("txn" in txn ||
|
|
3014
|
+
this.algosdk.encodeAddress(txn["snd"]) !== activeAdress) {
|
|
3015
|
+
txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
|
|
3016
|
+
txnObj.signers = [];
|
|
3017
|
+
}
|
|
3018
|
+
acc.push(txnObj);
|
|
3019
|
+
return acc;
|
|
3020
|
+
}, []);
|
|
3021
|
+
// Sign them with the client.
|
|
3022
|
+
const result = await this.#client.signTxn(txnsToSign);
|
|
3023
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
3024
|
+
const signedTxns = result.reduce((acc, txn, i) => {
|
|
3025
|
+
if (txn) {
|
|
3026
|
+
acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
3027
|
+
}
|
|
3028
|
+
else {
|
|
3029
|
+
acc.push(transactions[i]);
|
|
3030
|
+
}
|
|
3031
|
+
return acc;
|
|
3032
|
+
}, []);
|
|
3033
|
+
return signedTxns;
|
|
3034
|
+
}
|
|
3035
|
+
async signEncodedTransactions(transactions) {
|
|
3036
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
3037
|
+
const result = await this.#client.signTxn(transactionsToSign);
|
|
3038
|
+
if (!result) {
|
|
3039
|
+
throw new Error("Signing failed.");
|
|
3040
|
+
}
|
|
3041
|
+
const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
|
|
3042
|
+
if (txn) {
|
|
3043
|
+
signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
|
|
3044
|
+
}
|
|
3045
|
+
if (txn === null) {
|
|
3046
|
+
signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
|
|
3047
|
+
}
|
|
3048
|
+
return signedTxns;
|
|
3049
|
+
}, []);
|
|
3050
|
+
return signedRawTransactions;
|
|
3051
|
+
}
|
|
3052
|
+
}
|
|
3053
|
+
var algoSignerClient = AlgoSignerClient.init().catch((e) => {
|
|
3054
|
+
if (typeof window !== "undefined") {
|
|
3055
|
+
console.info("error initializing AlgoSigner", e);
|
|
3056
|
+
return;
|
|
3057
|
+
}
|
|
3058
|
+
});
|
|
3059
|
+
|
|
3060
|
+
/**
|
|
3061
|
+
* Helpful resources:
|
|
3062
|
+
* https://github.com/blockshake-io/defly-connect
|
|
3063
|
+
*/
|
|
3064
|
+
class DeflyWalletClient extends BaseWallet {
|
|
3065
|
+
#client;
|
|
3066
|
+
id;
|
|
3067
|
+
provider;
|
|
3068
|
+
constructor(initAlgodClient, initWallet) {
|
|
3069
|
+
super(initAlgodClient);
|
|
3070
|
+
this.#client = initWallet.client;
|
|
3071
|
+
this.id = initWallet.id;
|
|
3072
|
+
this.provider = initWallet.providers[this.id];
|
|
3073
|
+
}
|
|
3074
|
+
static async init() {
|
|
3075
|
+
const algosdk = (await import('algosdk')).default;
|
|
3076
|
+
const initAlgodClient = {
|
|
3077
|
+
algosdk,
|
|
3078
|
+
token: NODE_TOKEN,
|
|
3079
|
+
server: NODE_SERVER,
|
|
3080
|
+
port: NODE_PORT,
|
|
3081
|
+
};
|
|
3082
|
+
const DeflyWalletConnect = (await import('@blockshake/defly-connect'))
|
|
3083
|
+
.DeflyWalletConnect;
|
|
3084
|
+
const deflyWallet = new DeflyWalletConnect({
|
|
3085
|
+
shouldShowSignTxnToast: false,
|
|
3086
|
+
});
|
|
3087
|
+
const initWallet = {
|
|
3088
|
+
id: PROVIDER_ID.DEFLY,
|
|
3089
|
+
client: deflyWallet,
|
|
3090
|
+
providers: providers,
|
|
3091
|
+
};
|
|
3092
|
+
return new DeflyWalletClient(initAlgodClient, initWallet);
|
|
3093
|
+
}
|
|
3094
|
+
async connect(onDisconnect) {
|
|
3095
|
+
const accounts = await this.#client.connect();
|
|
3096
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
3097
|
+
if (accounts.length === 0) {
|
|
3098
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
3099
|
+
}
|
|
3100
|
+
const mappedAccounts = accounts.map((address, index) => ({
|
|
3101
|
+
name: `Defly Wallet ${index + 1}`,
|
|
3102
|
+
address,
|
|
3103
|
+
providerId: this.provider.id,
|
|
3104
|
+
}));
|
|
3105
|
+
return {
|
|
3106
|
+
...this.provider,
|
|
3107
|
+
accounts: mappedAccounts,
|
|
3108
|
+
};
|
|
3109
|
+
}
|
|
3110
|
+
async reconnect(onDisconnect) {
|
|
3111
|
+
const accounts = await this.#client.reconnectSession();
|
|
3112
|
+
this.#client.connector?.on("disconnect", onDisconnect);
|
|
3113
|
+
if (!accounts) {
|
|
3114
|
+
return null;
|
|
3115
|
+
}
|
|
3116
|
+
return {
|
|
3117
|
+
...this.provider,
|
|
3118
|
+
accounts: accounts.map((address, index) => ({
|
|
3119
|
+
name: `Defly Wallet ${index + 1}`,
|
|
3120
|
+
address,
|
|
3121
|
+
providerId: this.provider.id,
|
|
3122
|
+
})),
|
|
3123
|
+
};
|
|
3124
|
+
}
|
|
3125
|
+
async disconnect() {
|
|
3126
|
+
await this.#client.disconnect();
|
|
3127
|
+
}
|
|
3128
|
+
formatTransactionsArray(transactions) {
|
|
3129
|
+
const formattedTransactions = [];
|
|
3130
|
+
for (const [type, txn] of transactions) {
|
|
3131
|
+
if (type === "s") {
|
|
3132
|
+
formattedTransactions.push({
|
|
3133
|
+
...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
3134
|
+
signers: [],
|
|
3135
|
+
});
|
|
3136
|
+
}
|
|
3137
|
+
else {
|
|
3138
|
+
formattedTransactions.push({
|
|
3139
|
+
txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
|
|
3140
|
+
});
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
return formattedTransactions;
|
|
3144
|
+
}
|
|
3145
|
+
async signTransactions(activeAdress, transactions) {
|
|
3146
|
+
// Decode the transactions to access their properties.
|
|
3147
|
+
const decodedTxns = transactions.map((txn) => {
|
|
3148
|
+
return this.algosdk.decodeObj(txn);
|
|
3149
|
+
});
|
|
3150
|
+
// Marshal the transactions,
|
|
3151
|
+
// and add the signers property if they shouldn't be signed.
|
|
3152
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
3153
|
+
if (!("txn" in txn) &&
|
|
3154
|
+
this.algosdk.encodeAddress(txn["snd"]) === activeAdress) {
|
|
3155
|
+
acc.push({
|
|
3156
|
+
txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
|
|
3157
|
+
});
|
|
3158
|
+
}
|
|
3159
|
+
else {
|
|
3160
|
+
acc.push({
|
|
3161
|
+
txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
|
|
3162
|
+
signers: [],
|
|
3163
|
+
});
|
|
3164
|
+
}
|
|
3165
|
+
return acc;
|
|
3166
|
+
}, []);
|
|
3167
|
+
// Sign them with the client.
|
|
3168
|
+
const result = await this.#client.signTransaction([txnsToSign]);
|
|
3169
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
3170
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
3171
|
+
if (!("txn" in txn)) {
|
|
3172
|
+
const signedByUser = result.shift();
|
|
3173
|
+
signedByUser && acc.push(signedByUser);
|
|
3174
|
+
}
|
|
3175
|
+
else {
|
|
3176
|
+
acc.push(transactions[i]);
|
|
3177
|
+
}
|
|
3178
|
+
return acc;
|
|
3179
|
+
}, []);
|
|
3180
|
+
return signedTxns;
|
|
3181
|
+
}
|
|
3182
|
+
async signEncodedTransactions(transactions) {
|
|
3183
|
+
const transactionsToSign = this.formatTransactionsArray(transactions);
|
|
3184
|
+
const result = await this.#client.signTransaction([
|
|
3185
|
+
transactionsToSign,
|
|
3186
|
+
]);
|
|
3187
|
+
const signedTransactions = [];
|
|
3188
|
+
let resultIndex = 0;
|
|
3189
|
+
for (const [type, txn] of transactions) {
|
|
3190
|
+
if (type === "u") {
|
|
3191
|
+
signedTransactions.push(result[resultIndex]);
|
|
3192
|
+
resultIndex++;
|
|
3193
|
+
}
|
|
3194
|
+
else {
|
|
3195
|
+
signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
3196
|
+
}
|
|
3197
|
+
}
|
|
3198
|
+
return signedTransactions;
|
|
3199
|
+
}
|
|
3200
|
+
}
|
|
3201
|
+
var deflyClient = DeflyWalletClient.init().catch((e) => {
|
|
3202
|
+
if (typeof window !== "undefined") {
|
|
3203
|
+
console.error("error initializing DeflyWalletClient", e);
|
|
3204
|
+
return;
|
|
3205
|
+
}
|
|
3206
|
+
});
|
|
3207
|
+
|
|
3208
|
+
/**
|
|
3209
|
+
* Helpful resources:
|
|
3210
|
+
* https://docs.exodus.com/api-reference/algorand-provider-api/
|
|
3211
|
+
*/
|
|
3212
|
+
class ExodusClient extends BaseWallet {
|
|
3213
|
+
#client;
|
|
3214
|
+
id;
|
|
3215
|
+
provider;
|
|
3216
|
+
constructor(initAlgodClient, initWallet) {
|
|
3217
|
+
super(initAlgodClient);
|
|
3218
|
+
this.#client = initWallet.client;
|
|
3219
|
+
this.id = initWallet.id;
|
|
3220
|
+
this.provider = initWallet.providers[this.id];
|
|
3221
|
+
}
|
|
3222
|
+
static async init() {
|
|
3223
|
+
const algosdk = (await import('algosdk')).default;
|
|
3224
|
+
const initAlgodClient = {
|
|
3225
|
+
algosdk,
|
|
3226
|
+
token: NODE_TOKEN,
|
|
3227
|
+
server: NODE_SERVER,
|
|
3228
|
+
port: NODE_PORT,
|
|
3229
|
+
};
|
|
3230
|
+
if (typeof window == "undefined" ||
|
|
3231
|
+
window.exodus === undefined) {
|
|
3232
|
+
throw new Error("Exodus is not available.");
|
|
3233
|
+
}
|
|
3234
|
+
const exodus = window.exodus.algorand;
|
|
3235
|
+
const initWallet = {
|
|
3236
|
+
id: PROVIDER_ID.EXODUS,
|
|
3237
|
+
client: exodus,
|
|
3238
|
+
providers: providers,
|
|
3239
|
+
};
|
|
3240
|
+
return new ExodusClient(initAlgodClient, initWallet);
|
|
3241
|
+
}
|
|
3242
|
+
async connect() {
|
|
3243
|
+
const { address } = await this.#client.connect();
|
|
3244
|
+
if (!address) {
|
|
3245
|
+
throw new Error(`No accounts found for ${this.provider}`);
|
|
3246
|
+
}
|
|
3247
|
+
const accounts = [
|
|
3248
|
+
{
|
|
3249
|
+
name: `Exodus 1`,
|
|
3250
|
+
address,
|
|
3251
|
+
providerId: this.provider.id,
|
|
3252
|
+
},
|
|
3253
|
+
];
|
|
3254
|
+
return {
|
|
3255
|
+
...this.provider,
|
|
3256
|
+
accounts,
|
|
3257
|
+
};
|
|
3258
|
+
}
|
|
3259
|
+
async reconnect(onDisconnect) {
|
|
3260
|
+
if (window === undefined ||
|
|
3261
|
+
window.exodus === undefined ||
|
|
3262
|
+
window.exodus.algorand.isConnected !== true) {
|
|
3263
|
+
onDisconnect();
|
|
3264
|
+
}
|
|
3265
|
+
return null;
|
|
3266
|
+
}
|
|
3267
|
+
async disconnect() {
|
|
3268
|
+
return;
|
|
3269
|
+
}
|
|
3270
|
+
async signTransactions(activeAdress, transactions) {
|
|
3271
|
+
// Decode the transactions to access their properties.
|
|
3272
|
+
const decodedTxns = transactions.map((txn) => {
|
|
3273
|
+
return this.algosdk.decodeObj(txn);
|
|
3274
|
+
});
|
|
3275
|
+
// Get the unsigned transactions.
|
|
3276
|
+
const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
|
|
3277
|
+
// If the transaction isn't already signed and is to be sent from a connected account,
|
|
3278
|
+
// add it to the arrays of transactions to be signed.
|
|
3279
|
+
if (!("txn" in txn) &&
|
|
3280
|
+
this.algosdk.encodeAddress(txn["snd"]) === activeAdress) {
|
|
3281
|
+
acc.push(transactions[i]);
|
|
3282
|
+
}
|
|
3283
|
+
return acc;
|
|
3284
|
+
}, []);
|
|
3285
|
+
// Sign them with the client.
|
|
3286
|
+
const result = await this.#client.signTransaction(txnsToSign);
|
|
3287
|
+
// Join the newly signed transactions with the original group of transactions.
|
|
3288
|
+
const signedTxns = decodedTxns.reduce((acc, txn, i) => {
|
|
3289
|
+
if (!("txn" in txn)) {
|
|
3290
|
+
const signedByUser = result.shift();
|
|
3291
|
+
signedByUser && acc.push(signedByUser);
|
|
3292
|
+
}
|
|
3293
|
+
else {
|
|
3294
|
+
acc.push(transactions[i]);
|
|
3295
|
+
}
|
|
3296
|
+
return acc;
|
|
3297
|
+
}, []);
|
|
3298
|
+
return signedTxns;
|
|
3299
|
+
}
|
|
3300
|
+
async signEncodedTransactions(transactions) {
|
|
3301
|
+
const transactionsToSign = [];
|
|
3302
|
+
const signedRawTransactions = [];
|
|
3303
|
+
for (const [type, txn] of transactions) {
|
|
3304
|
+
if (type === "u") {
|
|
3305
|
+
const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
|
|
3306
|
+
transactionsToSign.push(decoded.toByte());
|
|
3307
|
+
}
|
|
3308
|
+
}
|
|
3309
|
+
const result = await this.#client.signTransaction(transactionsToSign);
|
|
3310
|
+
if (!result) {
|
|
3311
|
+
throw new Error("Signing failed.");
|
|
3312
|
+
}
|
|
3313
|
+
let resultIndex = 0;
|
|
3314
|
+
for (const [type, txn] of transactions) {
|
|
3315
|
+
if (type === "u") {
|
|
3316
|
+
signedRawTransactions.push(result[resultIndex]);
|
|
3317
|
+
resultIndex++;
|
|
3318
|
+
}
|
|
3319
|
+
else {
|
|
3320
|
+
signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
|
|
3321
|
+
}
|
|
3322
|
+
}
|
|
3323
|
+
return signedRawTransactions;
|
|
3324
|
+
}
|
|
3325
|
+
}
|
|
3326
|
+
var exodusClient = ExodusClient.init().catch((e) => {
|
|
3327
|
+
if (typeof window !== "undefined") {
|
|
3328
|
+
console.info("error initializing ExodusClient", e);
|
|
3329
|
+
return;
|
|
3330
|
+
}
|
|
3331
|
+
});
|
|
3332
|
+
|
|
3333
|
+
const clients = {
|
|
3334
|
+
[PROVIDER_ID.PERA_WALLET]: peraWalletClient,
|
|
3335
|
+
[PROVIDER_ID.MYALGO_WALLET]: myAlgoWalletClient,
|
|
3336
|
+
[PROVIDER_ID.ALGO_SIGNER]: algoSignerClient,
|
|
3337
|
+
[PROVIDER_ID.DEFLY]: deflyClient,
|
|
3338
|
+
[PROVIDER_ID.EXODUS]: exodusClient,
|
|
3339
|
+
};
|
|
3340
|
+
|
|
3341
|
+
const getWalletClient = async (id) => {
|
|
3342
|
+
if (!id) {
|
|
3343
|
+
throw new Error("No wallet provider id provided");
|
|
3344
|
+
}
|
|
3345
|
+
const client = await clients[id];
|
|
3346
|
+
if (!client) {
|
|
3347
|
+
throw new Error(`No wallet client found for provider id: ${id}`);
|
|
3348
|
+
}
|
|
3349
|
+
return client;
|
|
3350
|
+
};
|
|
3351
|
+
|
|
3352
|
+
function useWallet() {
|
|
3353
|
+
const allAccounts = useWalletStore((state) => state.accounts);
|
|
3354
|
+
const activeAccount = useWalletStore((state) => state.activeAccount);
|
|
3355
|
+
const accounts = useMemo(() => allAccounts.filter((account) => account.providerId === activeAccount?.providerId), [allAccounts, activeAccount]);
|
|
3356
|
+
const signTransactions = async (transactions) => {
|
|
3357
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
3358
|
+
if (!walletClient || !activeAccount?.address) {
|
|
3359
|
+
throw new Error("No wallet found.");
|
|
3360
|
+
}
|
|
3361
|
+
const signedTransactions = await walletClient.signTransactions(activeAccount.address, transactions);
|
|
3362
|
+
return signedTransactions;
|
|
3363
|
+
};
|
|
3364
|
+
const sendTransactions = async (transactions) => {
|
|
3365
|
+
const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
3366
|
+
const result = await walletClient?.sendRawTransactions(transactions);
|
|
3367
|
+
return result;
|
|
3368
|
+
};
|
|
3369
|
+
// const getAccountInfo = async () => {
|
|
3370
|
+
// if (!activeAccount) throw new Error("No selected account.");
|
|
3371
|
+
// const walletClient = await getWalletClient(activeAccount.providerId);
|
|
3372
|
+
// const accountInfo = await walletClient?.getAccountInfo(
|
|
3373
|
+
// activeAccount.address
|
|
3374
|
+
// );
|
|
3375
|
+
// return accountInfo;
|
|
3376
|
+
// };
|
|
3377
|
+
// const getAddress = () => {
|
|
3378
|
+
// return activeAccount?.address;
|
|
3379
|
+
// };
|
|
3380
|
+
// const getAssets = async () => {
|
|
3381
|
+
// if (!activeAccount) throw new Error("No selected account.");
|
|
3382
|
+
// const walletClient = await getWalletClient(activeAccount.providerId);
|
|
3383
|
+
// return await walletClient?.getAssets(activeAccount.address);
|
|
3384
|
+
// };
|
|
3385
|
+
// const groupTransactionsBySender = async (transactions: TransactionsArray) => {
|
|
3386
|
+
// const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
3387
|
+
// return walletClient?.groupTransactionsBySender(transactions);
|
|
3388
|
+
// };
|
|
3389
|
+
// const signEncodedTransactions = async (transactions: TransactionsArray) => {
|
|
3390
|
+
// const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
3391
|
+
// return await walletClient?.signEncodedTransactions(transactions);
|
|
3392
|
+
// };
|
|
3393
|
+
// const sendRawTransactions = async (transactions: Uint8Array[]) => {
|
|
3394
|
+
// const walletClient = await getWalletClient(activeAccount?.providerId);
|
|
3395
|
+
// return await walletClient?.sendRawTransactions(transactions);
|
|
3396
|
+
// };
|
|
3397
|
+
return {
|
|
3398
|
+
accounts,
|
|
3399
|
+
activeAccount,
|
|
3400
|
+
signTransactions,
|
|
3401
|
+
sendTransactions,
|
|
3402
|
+
// getAddress,
|
|
3403
|
+
// groupTransactionsBySender,
|
|
3404
|
+
// getAccountInfo,
|
|
3405
|
+
// getAssets,
|
|
3406
|
+
// signEncodedTransactions,
|
|
3407
|
+
// sendRawTransactions,
|
|
3408
|
+
};
|
|
3409
|
+
}
|
|
3410
|
+
|
|
3411
|
+
function shallow(objA, objB) {
|
|
3412
|
+
if (Object.is(objA, objB)) {
|
|
3413
|
+
return true;
|
|
3414
|
+
}
|
|
3415
|
+
if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
|
|
3416
|
+
return false;
|
|
3417
|
+
}
|
|
3418
|
+
const keysA = Object.keys(objA);
|
|
3419
|
+
if (keysA.length !== Object.keys(objB).length) {
|
|
3420
|
+
return false;
|
|
3421
|
+
}
|
|
3422
|
+
for (let i = 0; i < keysA.length; i++) {
|
|
3423
|
+
if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
|
|
3424
|
+
return false;
|
|
3425
|
+
}
|
|
3426
|
+
}
|
|
3427
|
+
return true;
|
|
3428
|
+
}
|
|
3429
|
+
|
|
3430
|
+
function useConnectWallet() {
|
|
3431
|
+
const { accounts, setActiveAccount, activeAccount, clearActiveAccount, addAccounts, removeAccounts, } = useWalletStore(walletStoreSelector, shallow);
|
|
3432
|
+
const providers$1 = useMemo(() => Object.values(providers).map(({ id, name, icon, isWalletConnect }) => {
|
|
3433
|
+
return {
|
|
3434
|
+
id,
|
|
3435
|
+
name,
|
|
3436
|
+
icon,
|
|
3437
|
+
isActive: activeAccount?.providerId === id,
|
|
3438
|
+
isConnected: accounts.some((accounts) => accounts.providerId === id),
|
|
3439
|
+
isWalletConnect,
|
|
3440
|
+
connect: () => connect(id),
|
|
3441
|
+
disconnect: () => disconnect(id),
|
|
3442
|
+
reconnect: () => reconnect(id),
|
|
3443
|
+
setActive: () => setActive(id),
|
|
3444
|
+
};
|
|
3445
|
+
}), [accounts, activeAccount]);
|
|
3446
|
+
const getAccountsByProvider = (id) => {
|
|
3447
|
+
return accounts.filter((account) => account.providerId === id);
|
|
3448
|
+
};
|
|
3449
|
+
const reconnectProviders = async () => {
|
|
3450
|
+
Object.values(providers$1).forEach(({ id, isActive, isConnected }) => {
|
|
3451
|
+
if (isActive || isConnected) {
|
|
3452
|
+
reconnect(id);
|
|
3453
|
+
}
|
|
3454
|
+
});
|
|
3455
|
+
};
|
|
3456
|
+
const disconnectWCSessions = async (id) => {
|
|
3457
|
+
if (!providers[id].isWalletConnect) {
|
|
3458
|
+
return;
|
|
3459
|
+
}
|
|
3460
|
+
const wcSessions = Object.values(providers$1).filter((p) => p.id !== id && p.isWalletConnect && (p.isConnected || p.isActive));
|
|
3461
|
+
for (const session of wcSessions) {
|
|
3462
|
+
await disconnect(session.id);
|
|
3463
|
+
}
|
|
3464
|
+
};
|
|
3465
|
+
const connect = async (id) => {
|
|
3466
|
+
await disconnectWCSessions(id);
|
|
3467
|
+
const walletClient = await getWalletClient(id);
|
|
3468
|
+
const walletInfo = await walletClient.connect(() => disconnect(id));
|
|
3469
|
+
if (!walletInfo || !walletInfo.accounts.length) {
|
|
3470
|
+
throw new Error("Failed to connect " + id);
|
|
3471
|
+
}
|
|
3472
|
+
setActiveAccount(walletInfo.accounts[0]);
|
|
3473
|
+
addAccounts(walletInfo.accounts);
|
|
3474
|
+
};
|
|
3475
|
+
const setActive = async (id) => {
|
|
3476
|
+
await disconnectWCSessions(id);
|
|
3477
|
+
const accounts = getAccountsByProvider(id);
|
|
3478
|
+
setActiveAccount(accounts[0]);
|
|
3479
|
+
};
|
|
3480
|
+
const reconnect = async (id) => {
|
|
3481
|
+
const walletClient = await getWalletClient(id);
|
|
3482
|
+
const walletInfo = await walletClient?.reconnect(() => disconnect(id));
|
|
3483
|
+
if (walletInfo && walletInfo.accounts.length) {
|
|
3484
|
+
addAccounts(walletInfo.accounts);
|
|
3485
|
+
}
|
|
3486
|
+
};
|
|
3487
|
+
const disconnect = async (id) => {
|
|
3488
|
+
const walletClient = await getWalletClient(id);
|
|
3489
|
+
walletClient?.disconnect();
|
|
3490
|
+
clearActiveAccount(id);
|
|
3491
|
+
removeAccounts(id);
|
|
3492
|
+
};
|
|
3493
|
+
return {
|
|
3494
|
+
providers: providers$1,
|
|
3495
|
+
activeAccount,
|
|
3496
|
+
accounts,
|
|
3497
|
+
connect,
|
|
3498
|
+
reconnect,
|
|
3499
|
+
disconnect,
|
|
3500
|
+
setActive,
|
|
3501
|
+
reconnectProviders,
|
|
3502
|
+
};
|
|
3503
|
+
}
|
|
3504
|
+
|
|
3505
|
+
export { NODE_PORT, NODE_SERVER, NODE_TOKEN, PROVIDER_ID, useConnectWallet, useWallet };
|
|
3506
|
+
//# sourceMappingURL=index.js.map
|