diff options
| author | Adam Soltys <[email protected]> | 2022-09-06 09:20:25 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-09-06 09:20:25 -0700 |
| commit | c2464b2407ee23134732fd67586758dbfe18f9b5 (patch) | |
| tree | 3e2d9f009bb325a9a7c4304ea02f6e64dda85bd1 | |
| parent | 8a080ef9a198799e7ee31cf81f92afd5495e4074 (diff) | |
| download | coinos-server-c2464b2407ee23134732fd67586758dbfe18f9b5.tar.gz coinos-server-c2464b2407ee23134732fd67586758dbfe18f9b5.zip | |
prettier
| -rw-r--r-- | db/db.js | 26 | ||||
| -rw-r--r-- | db/index.js | 66 | ||||
| -rw-r--r-- | lib/account.js | 18 | ||||
| -rw-r--r-- | lib/buildliquidtx.js | 8 | ||||
| -rw-r--r-- | lib/buildtx.js | 36 | ||||
| -rw-r--r-- | lib/liquid.js | 1 | ||||
| -rw-r--r-- | lib/ln.js | 2 | ||||
| -rw-r--r-- | lib/lnd.js | 2 | ||||
| -rw-r--r-- | lib/logo.js | 1 | ||||
| -rw-r--r-- | lib/mail.js | 7 | ||||
| -rw-r--r-- | lib/notifications.js | 9 | ||||
| -rw-r--r-- | lib/passport.js | 2 | ||||
| -rw-r--r-- | lib/persist.js | 4 | ||||
| -rw-r--r-- | lib/read.js | 4 | ||||
| -rw-r--r-- | lib/register.js | 12 | ||||
| -rw-r--r-- | lib/sockets.js | 6 | ||||
| -rw-r--r-- | lib/utils.js | 16 | ||||
| -rw-r--r-- | lib/webhooks.js | 2 | ||||
| -rw-r--r-- | lib/whitelist.js | 2 | ||||
| -rw-r--r-- | lib/wretch.js | 2 | ||||
| -rw-r--r-- | routes/admin.js | 550 | ||||
| -rw-r--r-- | routes/assets.js | 699 | ||||
| -rw-r--r-- | routes/funding.js | 168 | ||||
| -rw-r--r-- | routes/info.js | 24 | ||||
| -rw-r--r-- | routes/lnurl.js | 4 | ||||
| -rw-r--r-- | routes/payments.js | 2 | ||||
| -rw-r--r-- | routes/referrals.js | 270 | ||||
| -rw-r--r-- | routes/swaps.js | 417 | ||||
| -rw-r--r-- | routes/users.js | 5 | ||||
| -rw-r--r-- | sampleconfig/index.js | 18 | ||||
| -rw-r--r-- | sampleconfig/knexfile.js | 16 | ||||
| -rw-r--r-- | scripts/apiParse.js | 48 | ||||
| -rw-r--r-- | scripts/check.js | 22 |
33 files changed, 1221 insertions, 1248 deletions
@@ -1,17 +1,13 @@ -import Sequelize from '@sequelize/core'; -import dbOptions from '../config/knexfile'; +import Sequelize from "@sequelize/core"; +import dbOptions from "../config/knexfile"; -let { database, user, password, host } = dbOptions[process.env.NODE_ENV].connection; - -export default new Sequelize( - database, - user, - password, - { - host, - dialect: "mariadb", - logging: false, - dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" }, - } -); +let { database, user, password, host } = dbOptions[ + process.env.NODE_ENV +].connection; +export default new Sequelize(database, user, password, { + host, + dialect: "mariadb", + logging: false, + dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" } +}); diff --git a/db/index.js b/db/index.js index a7d7c25c..a98b6576 100644 --- a/db/index.js +++ b/db/index.js @@ -1,123 +1,123 @@ -import Sequelize from '@sequelize/core'; +import Sequelize from "@sequelize/core"; import db from "$db/db"; -db.authenticate().catch((err) => { +db.authenticate().catch(err => { console.debug("Error connecting to database: " + err.message); console.log(dbOptions.connection.database + "." + dbOptions.connection.user); }); -import './models/accounts'; -import './models/codes'; -import './models/deposits'; -import './models/invoices'; -import './models/keys'; -import './models/payments'; -import './models/orders'; -import './models/users'; -import './models/withdrawals'; +import "./models/accounts"; +import "./models/codes"; +import "./models/deposits"; +import "./models/invoices"; +import "./models/keys"; +import "./models/payments"; +import "./models/orders"; +import "./models/users"; +import "./models/withdrawals"; -import './models/referrals'; -import './models/waiting_list'; +import "./models/referrals"; +import "./models/waiting_list"; const { User, Account, Payment, Invoice, Key, Order, Referral } = db; User.hasMany(Account, { as: "accounts", - foreignKey: "user_id", + foreignKey: "user_id" }); User.hasMany(Invoice, { as: "invoices", - foreignKey: "user_id", + foreignKey: "user_id" }); User.hasMany(Key, { as: "keys", - foreignKey: "user_id", + foreignKey: "user_id" }); User.hasMany(Order, { as: "orders", - foreignKey: "user_id", + foreignKey: "user_id" }); User.hasMany(Payment, { as: "payments", - foreignKey: "user_id", + foreignKey: "user_id" }); User.belongsTo(Account, { as: "account", - foreignKey: "account_id", + foreignKey: "account_id" }); Invoice.belongsTo(Account, { as: "account", - foreignKey: "account_id", + foreignKey: "account_id" }); Account.belongsTo(User, { as: "user", - foreignKey: "user_id", + foreignKey: "user_id" }); Invoice.belongsTo(User, { as: "user", - foreignKey: "user_id", + foreignKey: "user_id" }); Key.belongsTo(User, { as: "user", - foreignKey: "user_id", + foreignKey: "user_id" }); Payment.belongsTo(Account, { as: "account", - foreignKey: "account_id", + foreignKey: "account_id" }); Payment.belongsTo(User, { as: "user", - foreignKey: "user_id", + foreignKey: "user_id" }); Payment.belongsTo(Invoice, { as: "invoice", - foreignKey: "invoice_id", + foreignKey: "invoice_id" }); Order.belongsTo(User, { as: "user", - foreignKey: "user_id", + foreignKey: "user_id" }); Order.belongsTo(Account, { as: "acc1", - foreignKey: "a1_id", + foreignKey: "a1_id" }); Order.belongsTo(Account, { as: "acc2", - foreignKey: "a2_id", + foreignKey: "a2_id" }); User.hasMany(Referral, { as: "referral_codes", - foreignKey: "sponsor_id", + foreignKey: "sponsor_id" }); User.hasMany(Referral, { as: "sponsors", - foreignKey: "user_id", + foreignKey: "user_id" }); Referral.belongsTo(User, { as: "sponsor", - foreignKey: "sponsor_id", + foreignKey: "sponsor_id" }); Referral.belongsTo(User, { as: "user", - foreignKey: "user_id", + foreignKey: "user_id" }); Payment.belongsTo(Payment, { diff --git a/lib/account.js b/lib/account.js index a1f20dc7..6edb3fc1 100644 --- a/lib/account.js +++ b/lib/account.js @@ -1,4 +1,4 @@ -import axios from 'axios'; +import axios from "axios"; export default async (asset, user, transaction) => { const account = await db.Account.findOne({ @@ -27,17 +27,15 @@ export default async (asset, user, transaction) => { if (assets[asset]) { ({ domain, ticker, precision, name } = assets[asset]); } else { - const existing = await db.Account.findOne( - { - where: { - asset - }, - order: [["id", "ASC"]], - limit: 1, + const existing = await db.Account.findOne({ + where: { + asset + }, + order: [["id", "ASC"]], + limit: 1, lock: transaction.LOCK.UPDATE, transaction - }, - ); + }); if (existing) { ({ domain, ticker, precision, name } = existing); diff --git a/lib/buildliquidtx.js b/lib/buildliquidtx.js index 00489e1d..ab2c597e 100644 --- a/lib/buildliquidtx.js +++ b/lib/buildliquidtx.js @@ -1,15 +1,15 @@ import store from "./store"; import { prod } from "./utils"; -import axios from 'axios'; +import axios from "axios"; // import liquid from 'liquidjs-lib'; -import coinselect from 'coinselect'; -import split from 'coinselect/split'; +import coinselect from "coinselect"; +import split from "coinselect/split"; const api = prod ? "https://blockstream.info/liquid/api" : "http://localhost:3002"; const SATS = 100000000; const network = prod ? liquid.networks["liquid"] : liquid.networks["regtest"]; -import { Op } from '@sequelize/core'; +import { Op } from "@sequelize/core"; export default async ({ address, diff --git a/lib/buildtx.js b/lib/buildtx.js index 24b8c91a..daed2e73 100644 --- a/lib/buildtx.js +++ b/lib/buildtx.js @@ -1,9 +1,9 @@ import store from "./store"; import { prod } from "./utils"; -import axios from 'axios'; -import bitcoin from 'bitcoinjs-lib'; -import coinselect from 'coinselect'; -import split from 'coinselect/split'; +import axios from "axios"; +import bitcoin from "bitcoinjs-lib"; +import coinselect from "coinselect"; +import split from "coinselect/split"; const api = prod ? "https://blockstream.info/api" : "http://electrsb:3095"; const SATS = 100000000; const network = prod @@ -18,20 +18,21 @@ export default async ({ address, amount, feeRate, replaceable, user }) => { where: { received: true, account_id: user.account_id, - network: 'bitcoin', - } + network: "bitcoin" + } }); - const addresses = [...new Set(payments.map(p => p.address))]; const utxos = []; for (let i = 0; i < addresses.length; i++) { try { - utxos.push(...(await axios.get(`${api}/address/${addresses[i]}/utxo`)).data); + utxos.push( + ...(await axios.get(`${api}/address/${addresses[i]}/utxo`)).data + ); } catch (e) { err("problem fetching utxos", e.message); } - } + } let targets = [ { @@ -43,9 +44,16 @@ export default async ({ address, amount, feeRate, replaceable, user }) => { let { inputs, outputs, fee } = coinselect(utxos, targets, feeRate); if (!inputs || !outputs) { - l("utxos", amount, feeRate, utxos.map(u => u.value)); - throw new Error("Couldn't find inputs for transaction, check your balance/fee"); - } + l( + "utxos", + amount, + feeRate, + utxos.map(u => u.value) + ); + throw new Error( + "Couldn't find inputs for transaction, check your balance/fee" + ); + } let psbt = new bitcoin.Psbt({ network }); let total = 0; @@ -53,9 +61,9 @@ export default async ({ address, amount, feeRate, replaceable, user }) => { outputs.map(({ address, value }) => { total += value; if (!address) { - address = payments[payments.length - 1].address; + address = payments[payments.length - 1].address; store.change.push(address); - } + } psbt = psbt.addOutput({ address, diff --git a/lib/liquid.js b/lib/liquid.js index 0eba0a28..ccf6aafb 100644 --- a/lib/liquid.js +++ b/lib/liquid.js @@ -1,4 +1,3 @@ import config from "$config"; import rpc from "./rpc"; export default rpc(config.liquid); - @@ -4,7 +4,7 @@ let ln; if (config.lna.clightning) { ln = (await import("clightning-client"))(config.lna.dir); } else { - ln = (await import("./lnd")); + ln = await import("./lnd"); } export default ln; @@ -1,5 +1,5 @@ import config from "$config"; -import { authenticatedLndGrpc } from 'lightning'; +import { authenticatedLndGrpc } from "lightning"; const { cert, macaroon, socket } = config.lna; diff --git a/lib/logo.js b/lib/logo.js index ab03ae55..922716ac 100644 --- a/lib/logo.js +++ b/lib/logo.js @@ -1,2 +1 @@ - export default "iVBORw0KGgoAAAANSUhEUgAABbYAAAW2CAYAAABXn/ThAAAgAElEQVR4Xuza2W7d5bnA4c/OyLQRUxg2IEoACaG2opV6F0jcTg/KCRfAQS+qJ5VQq1Y9aCuKxFyGTUMgk5Ot729WmrJ35WQ18Vo/+4nkOkm9sl4/7xs7/pmdMcaN4QcBAgQIECBAgAABAgQIECBAgAABAgQIEIgI7AjbkU0ZkwABAgQIECBAgAABAgQIECBAgAABAgQWAWHbIRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIEDNS+v0AACAASURBVCBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIECBAgAABAgQIECBAgACBlICwnVqXYQkQIECAAAECBAgQIECAAAECBAgQIEBA2HYDBAgQIECAAAECBAgQIECAAAECBAgQIJASELZT6zIsAQIECBAgQIAAAQIECBAgQIAAAQIECAjbboAAAQIECBAgQIAAAQIECBAgQIAAAQIEUgLCdmpdhiVAgAABAgQIECBAgAABAgQIECBAgAABYdsNECBAgAABAgQIECBAgAABAgQIECBAgEBKQNhOrcuwBAgQIECAAAECBAgQIECAAAECBAgQICBsuwECBAgQIECAAAECBAgQIECAAAECBAgQSAkI26l1GZYAAQIECBAgQIAAAQIECBAgQIAAAQIEhG03QIAAAQIECBAgQIAAAQIECBAgQIAAAQIpAWE7tS7DEiBAgAABAgQIECBAgAABAgQIECBAgICw7QYIECBAgAABAgQIECBAgAABAgQIECBAICUgbKfWZVgCBAgQIECAAAECBAgQIECAAAECBAgQELbdAAECBAgQIECAAAECBAgQIECAAAECBAikBITt1LoMS4AAAQIECBAgQIAAAQIECBAgQIAAAQLCthsgQIAAAQIECBAgQIAAAQIECBAgQIAAgZSAsJ1al2EJECBAgAABAgQIECBAgAABAgQIECBAQNh2AwQIECBAgAABAgQIECBAgAABAgQIECCQEhC2U+syLAECBAgQIECAAAECBAgQIECAAAECBAgI226AAAECBAgQIECAAAECBAgQIECAAAECBFICwnZqXYYlQIAAAQIECBAgQIAAAQIECBAgQIAAAWHbDRAgQIAAAQIECBAgQIAAAQIECBAgQIBASkDYTq3LsAQIECBAgAABAgQIECBAgAABAgQIECAgbLsBAgQIECBAgAABAgQIECBAgAABAgQIEEgJCNupdRmWAAECBAgQIECAAAECBAgQIECAAAECBIRtN0CAAAECBAgQIECAAAECBAgQIECAAAECKQFhO7UuwxIgQIAAAQIECBAgQIAAAQIECBAgQICAsO0GCBAgQIAAAQIECBAgQIAAAQIECBAgQCAlIGyn1mVYAgQIECBAgAABAgQIECBAgAABzP6fVgAAIABJREFUAgQIEBC23QABAgQIECBAgAABAgQIECBAgAABAgQIpASE7dS6DEuAAAECBAgQIECAAAECBAgQIECAAAECwrYbIECAAAECBAgQIECAAAECBAgQIECAAIGUgLCdWpdhCRAgQIAAAQIECBAgQIAAAQIECBAgQEDYdgMECBAgQIAAAQIECBAgQIAAAQIECBAgkBIQtlPrMiwBAgQIECBAgAABAgQIECBAgAABAgQICNtugAABAgQIECBAgAABAgQIECBAgAABAgRSAsJ2al2GJUCAAAECBAgQIECAAAECBAgQIECAAAFh2w0QIECAAAECBAgQIECAAAECBAgQIECAQEpA2E6ty7AECBAgQIAAAQIECBAgQIAAAQIECBAgIGy7AQIECBAgQIAAAQIECBAgQIAAAQIECBBICQjbqXUZlgABAgQIECBAgAABAgQIECBAgAABAgSEbTdAgAABAgQIECBAgAABAgQIECBAgAABAikBYTu1LsMSIECAAAECBAgQIECAAAECBAgQIECAgLDtBggQIECAAAECBAgQIECAAAECBAgQIEAgJSBsp9ZlWAIECBAgQIAAAQIECBAgQIAAAQIECBAQtt0AAQIECBAgQIAAAQIECBAgQIAAAQIECKQEhO3UugxLgAABAgQIECBAgAABAgQIECBAgAABAsK2GyBAgAABAgQIbJHAm2++Od56663x+uuvH+pUv/rVr8Y777wzLl68eKjP68kIECBAgAABAgQIECCwjoCwvY6axxAgQIAAAQIE7pGAsH2PYP2xBAgQIECAAAECBAgcKQFh+0it0ztDgAABAgQI1AWE7foGzU+AAAECBAgQIECAwGEICNuHoew5CBAgQIAAAQK3KSBs3yaUNyNAgAABAgQIECBA4FgLCNvHev3eeQIECBAgQGDbBITtbduIeQgQIECAAAECBAgQ2EYBYXsbt2ImAgQIECBA4NgKCNvHdvXecQIECBAgQIAAAQIE7kBA2L4DLG9KgAABAgQIELjXAsL2vRb25xMgQIAAAQIECBAgcBQEhO2jsEXvAwECBAgQIHBkBITtI7NK7wgBAgQIECBAgAABAvdQQNi+h7j+aAIECBAgQIDAnQoI23cq5u0JECBAgAABAgQIEDiOAsL2cdy695kAAQIECBDYWgFhe2tXYzACBAgQIECAAAECBLZIQNjeomUYhQABAgQIECAgbLsBAgQIECBAgAABAgQIHCwgbB9s5C0IECBAgAABAocmIGwfGrUnIkCAAAECBAgQIEAgLCBsh5dndAIECBAgQODoCQjbR2+n3iMCBAgQIECAAAECBO6+gLB99039iQQIECBAgACBtQWE7bXpPJAAAQIECBAgQIAAgWMkIGwfo2V7VwkQIECAAIHtFxC2t39HJiRAgAABAgQIECBAYPMCwvbmd2ACAgQIECBAgMBNAWHbMRAgQIAAAQIECBAgQOBgAWH7YCNvQYAAAQIECBA4NAFh+9CoPREBAgQIECBAgAABAmEBYTu8PKMTIECAAAECR09A2D56O/UeESBAgAABAgQIECBw9wWE7btv6k8kQIAAAQIECKwtIGyvTeeBBAgQIECAAAECBAgcIwFh+xgt27tKgAABAgQIbL+AsL39OzIhAQIECBAgQIAAAQKbFxC2N78DExAgQIAAAQIEbgoI246BAAECBAgQIECAAAECBwsI2wcbeQsCBAgQIECAwKEJCNuHRu2JCBAgQIAAAQIECBAICwjb4eUZnQABAgQIEDh6AsL20dup94gAAQIECBAgQIAAgbsvIGzffVN/IgECBAgQIEBgbQFhe206DyRAgAABAgQIECBA4BgJCNvHaNneVQIECBAgQGD7BYTt7d+RCQkQIECAAAECBAgQ2LyAsL35HZiAAAECBAgQIHBTQNh2DAQIECBAgAABAgQIEDhYQNg+2MhbECBAgAABAgQOTUDYPjRqT0SAAAECBAgQIECAQFhA2A4vz+gECBAgQIDA0RMQto/eTr1HBAgQIECAAAECBAjcfQFh++6b+hMJECBAgAABAmsLCNtr03kgAQIECBAgQIAAAQLHSEDYPkbL9q4SIECAAAEC2y8gbG//jkxIgAABAgQIECBAgMDmBYTtze/ABAQIECBAgACBmwLCtmMgQIAAAQIECBAgQIDAwQLC9sFG3oIAAQIECBAgcGgCwvahUXsiAgQIECBAgAABAgTCAsJ2eHlGJ0CAAAECBI6egLB99HbqPSJAgAABAgQIECBA4O4LCNt339SfSIAAAQIECBBYW0DYXpvOAwkQIECAAAECBAgQOEYCwvYxWrZ3lQABAgQIENh+AWF7+3dkQgIECBAgQIAAAQIENi8gbG9+ByYgQIAAAQIECNwUELYdAwECBAgQIECAAAECBA4WELYPNvIWBAgQIECAAIFDE3jjjTfGL3/5y/HTn/700J5zPtHbb789fv3rX4+LFy8e6vN6MgIECBAgQIAAAQIECKwjIGyvo+YxBAgQIECAAIF7JHD+/Pnxi1/8Ypw7d+4ePcP//8f+5je/Ge++++64evXqoT6vJyNAgAABAgQIECBAgMA6AsL2OmoeQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIbExC2N0bviQkQIECAAAECBAgQIECAAAECBAgQIEBgHQFhex01jyFAgAABAgQIECBAgAABAgQIECBAgACBjQkI2xuj98QECBAgQIAAAQIECBAgQIAAAQIECBAgsI6AsL2OmscQIECAAAECBAgQIECAAAECBAgQIECAwMYEhO2N0XtiAgQIECBAgAABAgQIECBAgAABAgQIEFhHQNheR81jCBAgQIAAAQIECBAgQIAAAQIECBAgQGBjAsL2xug9MQECBAgQIECAAAECBAgQIECAAAECBAisIyBsr6PmMQQIECBAgAABAgQIECBAgAABAgQIECCwMQFhe2P0npgAAQIECBAgQIAAAQIECBAgQIAAAQIE1hEQttdR8xgCBAgQIECAAAECBAgQIECAAAECBAgQ2JiAsL0xek9MgAABAgQIECBAgAABAgQIECBAgAABAusICNvrqHkMAQIECBAgQIAAAQIECBAgQIAAAQIECGxMQNjeGL0nJkCAAAECBAgQIECAAAECBAgQIECAAIF1BITtddQ8hgABAgQIECBAgAABAgQIECBAgAABAgQ2JiBsb4zeExMgQIAAAQIECBAgQIAAAQIECBAgQIDAOgLC9jpqHkOAAAECBAgQIECAAAECBAgQIECAAAECGxMQtjdG74kJECBAgAABAgQIECBAgAABAgQIECBAYB0BYXsdNY8hQIAAAQIECBAgQIAAAQIECBAgQIAAgY0JCNsbo/fEBAgQIECAAAECBAgQIECAAAECBAgQILCOgLC9jprHECBAgAABAgQIECBAgAABAgQIECBAgMDGBITtjdF7YgIECBAgQIAAAQIECBAgQIAAAQIECBBYR0DYXkfNYwgQIECAAAECBAgQIECAAAECBAgQIEBgYwLC9sboPTEBAgQIECBAgAABAgQIECBAgAABAgQIrCMgbK+j5jEECBAgQIAAAQIECBAgQIAAAQIECBAgsDEBYXtj9J6YAAECBAgQIECAAAECBAgQIECAAAECBNYRELbXUfMYAgS2QmBnZ2fMl9WPW39948aNMV/mj9XrH/58K94JQxw7gdu929W93nq/xw7LO0yAQEbg331s++Hn4ls/P2feOYMSOEBg/nN0/5+k+/8uXX79/WPmv0a//yfp/Nny83/+Gi2BpsDqS7DV3d/89XLl+/+z/5XY/i9uvXn339y5qQlsq4Cwva2bMReBYyqwu7s75suJEyeWaL369Xy9+qJ5vj5z5sx46KGHxv3337+8zfy9++67b5w+fXqR++6778bly5fH3t7euHTp0rh27dryevV78wvr69evL9H71tfz7eev54sfBO5E4NbbXd3kD+933vUDDzyw3O6pU6f+z91euXJludN5f/Nmv/nmm+Vl/vyHt7q6Uzd7J1vytgQIrCNw6+fj+XFsvtz6cW7+en4Onh/b5ufnkydPjrNnzy4f5+bHqvlxbX58my8XLlwY33777fL5efVx7NbX8/fni2/qrbMpj7nbAru7Y5zYnf8enS/j+5edsTvD9e78DyzGOHVqZzz0wInxwP3z78bOOLE7xtmzu8vvzx+XLl8fly/vh70rV66PCxf3xrff7Y29a2NcXyL3/LfoGNev31h+vbzeG2Pv+r/GwLv9vvnzCNwqMG95/9bnne+Mnfl6+YbN/u/dfD3GOH16d5w9s7Pc+33Lre+O06d3xtkz8+u4Ma5duzEuXbo+ru3tP8Pl+Xfgyvy6a//vw3yZN7//TZ5/frNn9evl78P8/eX1/t8JMdy9EiDw7wSEbbdBgMBGBFbxen7xu/oieUbpp556avzoRz8azz333HjyySeXX8/X586dG48++uh4+OGHl5f5hfOt/7X2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AZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAWsFCLat9aQ1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAZsFCLZtBqZ5BBBAAAEEEEAAAQQQQAABBBBAAIH/b8cOCQAAABiE9W/9EtytAGISAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBBSidlBAAAgAElEQVQgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaARW1geMAAAewSURBVGO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUwtltPNQIECBAgQIAAAQIECBAgQIAAAQIECBA4CxjbZ2B5AgQIECBAgAABAgQIECBAgAABAgQIEGgFjO3WU40AAQIECBAgQIAAAQIECBAgQIAAAQIEzgLG9hlYngABAgQIECBAgAABAgQIECBAgAABAgRaAWO79VQjQIAAAQIECBAgQIAAAQIECBAgQIAAgbOAsX0GlidAgAABAgQIECBAgAABAgQIECBAgACBVsDYbj3VCBAgQIAAAQIECBAgQIAAAQIECBAgQOAsYGyfgeUJECBAgAABAgQIECBAgAABAgQIECBAoBUYUqkaGlqg5VYAAAAASUVORK5CYII="; diff --git a/lib/mail.js b/lib/mail.js index fdece056..537614d2 100644 --- a/lib/mail.js +++ b/lib/mail.js @@ -111,12 +111,7 @@ imap.once("ready", function() { emit(user.username, "account", account); emit(user.username, "payment", payment); - l( - "interac deposit detected for", - user.username, - cad, - amount - ); + l("interac deposit detected for", user.username, cad, amount); }); } catch (e) { console.log(e); diff --git a/lib/notifications.js b/lib/notifications.js index 49ac32f7..9c9c95dc 100644 --- a/lib/notifications.js +++ b/lib/notifications.js @@ -1,5 +1,5 @@ import config from "$config"; -import webpush from 'web-push'; +import webpush from "web-push"; if (config.vapid) { webpush.setVapidDetails( @@ -17,9 +17,12 @@ export const notify = (user, payload) => { try { await webpush.sendNotification(subscription, payload); } catch (e) { - if (e.body && (e.body.includes('expired') || e.body.includes('No such'))) { + if ( + e.body && + (e.body.includes("expired") || e.body.includes("No such")) + ) { user.subscriptions.splice(i, 1); - await user.save(); + await user.save(); } else { err("problem sending notification", e); } diff --git a/lib/passport.js b/lib/passport.js index 68adbe08..a1c19d19 100644 --- a/lib/passport.js +++ b/lib/passport.js @@ -4,7 +4,7 @@ import Passport from "passport"; import jwt from "passport-jwt"; import { Op } from "@sequelize/core"; import fastifyPassport from "@fastify/passport"; -import fastifySecureSession from '@fastify/secure-session' +import fastifySecureSession from "@fastify/secure-session"; import config from "$config"; import fs from "fs"; import path from "path"; diff --git a/lib/persist.js b/lib/persist.js index 861166d4..8061d8a3 100644 --- a/lib/persist.js +++ b/lib/persist.js @@ -1,10 +1,10 @@ -import fs from 'fs'; +import fs from "fs"; export default (path, initial = {}) => { if (!initial || !Object.keys(initial).length) { try { initial = require("../" + path); - } catch(e) {} + } catch (e) {} } return new Proxy(initial, { diff --git a/lib/read.js b/lib/read.js index 9acb1056..c021cb10 100644 --- a/lib/read.js +++ b/lib/read.js @@ -1,7 +1,7 @@ export default (stream, func) => { var remaining = ""; - stream.on("data", function (data) { + stream.on("data", function(data) { remaining += data; var index = remaining.indexOf("\n"); var last = 0; @@ -17,7 +17,7 @@ export default (stream, func) => { stream.on("error", () => {}); - stream.on("end", function () { + stream.on("end", function() { if (remaining.length > 0) { func(remaining); } diff --git a/lib/register.js b/lib/register.js index f1e8a37c..7f8a059d 100644 --- a/lib/register.js +++ b/lib/register.js @@ -1,6 +1,6 @@ -import { authenticator } from 'otplib'; -import axios from 'axios'; -import bcrypt from 'bcrypt'; +import { authenticator } from "otplib"; +import axios from "axios"; +import bcrypt from "bcrypt"; export const register = async (user, ip, requireChallenge) => { if (!(user && user.username)) throw new Error("Username required"); @@ -19,7 +19,7 @@ export const register = async (user, ip, requireChallenge) => { JP: "JPY", CN: "CNY", AU: "AUD", - GB: "GBP", + GB: "GBP" }; if (!config.ipstack || ip.startsWith("127") || ip.startsWith("192")) @@ -44,7 +44,7 @@ export const register = async (user, ip, requireChallenge) => { pending: 0, name: "Bitcoin", ticker: "BTC", - precision: 8, + precision: 8 }); user.accounts = [account]; @@ -60,4 +60,4 @@ export const register = async (user, ip, requireChallenge) => { await user.save(); l("new user", user.username, ip); return user; -} +}; diff --git a/lib/sockets.js b/lib/sockets.js index 366820e0..252ee552 100644 --- a/lib/sockets.js +++ b/lib/sockets.js @@ -100,10 +100,12 @@ app.register(async function(app) { const existing = Object.keys(store.sockets[username]); if (existing.length > 4) { const p = existing.find(sid => sid !== id); - store.sockets[username][p].send(JSON.stringify({ type: "logout" })); + store.sockets[username][p].send( + JSON.stringify({ type: "logout" }) + ); setTimeout(() => { if (store.sockets[username][p]) - store.sockets[username][p].close(code, "too many sockets"); + store.sockets[username][p].close(code, "too many sockets"); }, 5000); } store.sockets[username][id] = ws; diff --git a/lib/utils.js b/lib/utils.js index a7db0ea3..004ca7ac 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,5 +1,5 @@ import db from "$db"; -import sequelize from '@sequelize/core'; +import sequelize from "@sequelize/core"; const { Op } = sequelize; export const getUser = async (username, transaction) => { @@ -7,12 +7,12 @@ export const getUser = async (username, transaction) => { include: [ { model: db.Account, - as: "account", - }, + as: "account" + } ], where: { - username: { [Op.or]: [username, username.replace(/ /g, "")] }, - }, + username: { [Op.or]: [username, username.replace(/ /g, "")] } + } }; if (transaction) { @@ -31,10 +31,10 @@ export const getUserById = async (id, transaction) => { include: [ { model: db.Account, - as: "account", - }, + as: "account" + } ], - where: { id }, + where: { id } }; if (transaction) { diff --git a/lib/webhooks.js b/lib/webhooks.js index dcfcb8b0..db27f26b 100644 --- a/lib/webhooks.js +++ b/lib/webhooks.js @@ -1,4 +1,4 @@ -import wretch from './wretch'; +import wretch from "./wretch"; export const callWebhook = (invoice, payment) => { if (!invoice || !payment) return; diff --git a/lib/whitelist.js b/lib/whitelist.js index 229f2682..a5c7a15f 100644 --- a/lib/whitelist.js +++ b/lib/whitelist.js @@ -16,5 +16,5 @@ export default [ "keys", "index", "verified", - "email", + "email" ]; diff --git a/lib/wretch.js b/lib/wretch.js index 67e28b88..0be00d10 100644 --- a/lib/wretch.js +++ b/lib/wretch.js @@ -1,4 +1,4 @@ import wretch from "wretch"; -import fetch from 'node-fetch'; +import fetch from "node-fetch"; wretch().polyfills({ fetch }); export default wretch; diff --git a/routes/admin.js b/routes/admin.js index 918f9423..3053d813 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -1,8 +1,8 @@ -import express from 'express'; +import express from "express"; var router = express.Router(); -import * as parseInput from '../scripts/apiParse'; -import Sequelize from '@sequelize/core'; +import * as parseInput from "../scripts/apiParse"; +import Sequelize from "@sequelize/core"; const Op = Sequelize.Op; /** @@ -11,8 +11,8 @@ const Op = Sequelize.Op; * @apiGroup Admin * * @apiPermission admin - * - * @apiSuccess {Object} users List of users + * + * @apiSuccess {Object} users List of users * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { @@ -26,25 +26,32 @@ router.get( "/users", // auth, async (req, res) => { - var {search, starts_with, contains} = req.query + var { search, starts_with, contains } = req.query; var users = knex - .select('username', 'email', 'phone', 'verified', knex.raw('LEFT(createdAt,10) as created_at')) - .from('users') - - var timeCondition = parseInput.addTimeSearch(req.query, 'users.createdAt') - var userCondition = parseInput.addUserSearch(req.query) + .select( + "username", + "email", + "phone", + "verified", + knex.raw("LEFT(createdAt,10) as created_at") + ) + .from("users"); + + var timeCondition = parseInput.addTimeSearch(req.query, "users.createdAt"); + var userCondition = parseInput.addUserSearch(req.query); + + if (timeCondition) users = users.whereRaw(timeCondition); + if (userCondition) users = users.whereRaw(userCondition); - if (timeCondition) users = users.whereRaw(timeCondition) - if (userCondition) users = users.whereRaw(userCondition) - // Alternative Sequelize query syntax // await db.User.findAll({ // attributes: ['username', 'email', 'phone', 'verified', 'createdAt'] // }) - const found = await users - return res.send({users: found}) - }) + const found = await users; + return res.send({ users: found }); + } +); /** * @api {get} /referrals Retrieve list of referral tokens @@ -52,7 +59,7 @@ router.get( * @apiGroup Admin * * @apiPermission admin - * + * * @apiSuccess returns list of referral tokens * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK @@ -63,43 +70,43 @@ router.get( * ] * } */ -router.get( - "/referrals", - auth, - async (req, res) => { - var referrals = knex - .select( - 'token', - 'users.username as user', - 'sponsor.username as sponsor', - knex.raw('LEFT(created_at, 10) as created_at'), - 'referrals.status' - ) - .from('referrals') - .leftJoin('users', 'users.id', 'referrals.user_id') - .leftJoin('users as sponsor', 'sponsor.id', 'referrals.sponsor_id') +router.get("/referrals", auth, async (req, res) => { + var referrals = knex + .select( + "token", + "users.username as user", + "sponsor.username as sponsor", + knex.raw("LEFT(created_at, 10) as created_at"), + "referrals.status" + ) + .from("referrals") + .leftJoin("users", "users.id", "referrals.user_id") + .leftJoin("users as sponsor", "sponsor.id", "referrals.sponsor_id"); - // Alternative Sequelize query syntax (returns sub-tables as hash) - // var referrals = await db.Referral.findAll({ - // include: [ - // {model: db.User, as: 'user', attributes: [['username', 'user']]}, - // {model: db.User, as: 'sponsor', attributes: [['username', 'sponsor']]} - // ] - // }) + // Alternative Sequelize query syntax (returns sub-tables as hash) + // var referrals = await db.Referral.findAll({ + // include: [ + // {model: db.User, as: 'user', attributes: [['username', 'user']]}, + // {model: db.User, as: 'sponsor', attributes: [['username', 'sponsor']]} + // ] + // }) - var timeCondition = parseInput.addTimeSearch(req.query, 'referrals.updated_at') - var userCondition = parseInput.addUserSearch(req.query, 'sponsor') + var timeCondition = parseInput.addTimeSearch( + req.query, + "referrals.updated_at" + ); + var userCondition = parseInput.addUserSearch(req.query, "sponsor"); - if (userCondition) { - referrals = referrals.whereRaw(userCondition) - } - if (timeCondition) { - referrals = referrals.whereRaw(timeCondition) - } + if (userCondition) { + referrals = referrals.whereRaw(userCondition); + } + if (timeCondition) { + referrals = referrals.whereRaw(timeCondition); + } - var found = await referrals - return res.send({referrals: found}) - }) + var found = await referrals; + return res.send({ referrals: found }); +}); /** * @api {get} /waiting_list Retrieve waiting_list @@ -107,7 +114,7 @@ router.get( * @apiGroup Admin * * @apiPermission admin - * + * * @apiSuccess returns list of referral tokens * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK @@ -119,32 +126,36 @@ router.get( * } */ router.get( - "/waiting_list", - // auth, - async (req, res) => { - var {search, starts_with, contains} = req.query + "/waiting_list", + // auth, + async (req, res) => { + var { search, starts_with, contains } = req.query; - var queue = knex - .select( - 'waiting_list.email', - 'waiting_list.phone', - 'waiting_list.created_at as requested', - 'users.id as current_user_id' - ) - .from('waiting_list') - .leftJoin('users', 'users.email', 'waiting_list.email') - .where('waiting_list.id', '>', 0) + var queue = knex + .select( + "waiting_list.email", + "waiting_list.phone", + "waiting_list.created_at as requested", + "users.id as current_user_id" + ) + .from("waiting_list") + .leftJoin("users", "users.email", "waiting_list.email") + .where("waiting_list.id", ">", 0); - var timeCondition = parseInput.addTimeSearch(req.query, 'waiting_list.updated_at') - var userCondition = parseInput.addUserSearch(req.query) + var timeCondition = parseInput.addTimeSearch( + req.query, + "waiting_list.updated_at" + ); + var userCondition = parseInput.addUserSearch(req.query); - if (timeCondition) queue = queue.whereRaw(timeCondition) - if (userCondition) queue = queue.whereRaw(userCondition) + if (timeCondition) queue = queue.whereRaw(timeCondition); + if (userCondition) queue = queue.whereRaw(userCondition); - const found = await queue + const found = await queue; - return res.send({queue: found}) - }) + return res.send({ queue: found }); + } +); /** * @api {get} /accounts Retrieve list of accounts @@ -152,7 +163,7 @@ router.get( * @apiGroup Admin * * @apiPermission admin - * + * * @apiSuccess returns list of accounts * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK @@ -163,32 +174,35 @@ router.get( * ] * } */ -router.get( - "/accounts", - auth, - async (req, res) => { - var {nonZero, search, starts_with, contains} = req.query +router.get("/accounts", auth, async (req, res) => { + var { nonZero, search, starts_with, contains } = req.query; - var accounts = knex - .select('username', 'accounts.id as account_id', 'ticker', 'balance', knex.raw('LEFT(accounts.createdAt, 10) as created'), knex.raw('LEFT(accounts.updatedAt, 10) as updated')) - .from('accounts') - .leftJoin('users', 'users.id', 'accounts.user_id') + var accounts = knex + .select( + "username", + "accounts.id as account_id", + "ticker", + "balance", + knex.raw("LEFT(accounts.createdAt, 10) as created"), + knex.raw("LEFT(accounts.updatedAt, 10) as updated") + ) + .from("accounts") + .leftJoin("users", "users.id", "accounts.user_id"); - if (nonZero) { - accounts = accounts - .where('balance', '>', 0) - } + if (nonZero) { + accounts = accounts.where("balance", ">", 0); + } - var timeCondition = parseInput.addTimeSearch(req.query, 'accounts.updatedAt') - var userCondition = parseInput.addUserSearch(req.query) + var timeCondition = parseInput.addTimeSearch(req.query, "accounts.updatedAt"); + var userCondition = parseInput.addUserSearch(req.query); - if (timeCondition) accounts = accounts.whereRaw(timeCondition) - if (userCondition) accounts = accounts.whereRaw(userCondition) + if (timeCondition) accounts = accounts.whereRaw(timeCondition); + if (userCondition) accounts = accounts.whereRaw(userCondition); - const found = await accounts + const found = await accounts; - return res.send({accounts: found}) - }) + return res.send({ accounts: found }); +}); /** * @api {get} /transactions Retrieve summary of user transactions @@ -212,50 +226,56 @@ router.get( "/transactions", // auth, async (req, res) => { - var {type, since, search, starts_with, contains} = req.query + var { type, since, search, starts_with, contains } = req.query; var transactions = knex .select( - 'users.username', - 'users.email', + "users.username", + "users.email" // knex.raw('LEFT(created_at, 10) as created') // knex.raw('LEFT(updatedAt, 10) as updated') // knex.raw('COUNT(invoices.id) as invoices'), // knex.raw('COUNT(payments.id) as payments'), // knex.raw('COUNT(orders.id) as orders') ) - .from('users') + .from("users"); - const types = ['deposits', 'withdrawals', 'orders', 'payments', 'invoices'] - for (var i=0; i<types.length; i++) { - var stamp = types[i].replace(/s$/,'') + '_date' + const types = ["deposits", "withdrawals", "orders", "payments", "invoices"]; + for (var i = 0; i < types.length; i++) { + var stamp = types[i].replace(/s$/, "") + "_date"; - transactions = transactions + transactions = transactions .select( - knex.raw('COUNT(DISTINCT ' + types[i] + '.id) as ' + types[i]), - knex.raw('LEFT(MAX(' + types[i] + '.updatedAt), 10) as ' + stamp) + knex.raw("COUNT(DISTINCT " + types[i] + ".id) as " + types[i]), + knex.raw("LEFT(MAX(" + types[i] + ".updatedAt), 10) as " + stamp) ) - .leftJoin(types[i], 'users.id', types[i] + '.user_id') - // .havingRaw(types[i] + ' > ?', [0]) - - if (since) { - transactions = transactions - .havingRaw('(' + stamp + ' >= ? OR ' + stamp + ' IS NULL)', [since]) - } + .leftJoin(types[i], "users.id", types[i] + ".user_id"); + // .havingRaw(types[i] + ' > ?', [0]) + + if (since) { + transactions = transactions.havingRaw( + "(" + stamp + " >= ? OR " + stamp + " IS NULL)", + [since] + ); } + } - if (since) transactions = transactions.havingRaw('invoices + payments + deposits + orders > ?', [0]) + if (since) + transactions = transactions.havingRaw( + "invoices + payments + deposits + orders > ?", + [0] + ); - var userCondition = parseInput.addUserSearch(req.query) - if (userCondition) transactions = transactions.whereRaw(userCondition) + var userCondition = parseInput.addUserSearch(req.query); + if (userCondition) transactions = transactions.whereRaw(userCondition); - transactions = transactions - .groupBy('users.id') + transactions = transactions.groupBy("users.id"); - const found = await transactions + const found = await transactions; - return res.send({transactions: found}) - }) + return res.send({ transactions: found }); + } +); /** * @api {get} /orders Retrieve summary of orders @@ -275,43 +295,41 @@ router.get( * ] * } */ -router.get( - "/orders", - auth, - async (req, res) => { - var {type, since, search, starts_with, contains} = req.query +router.get("/orders", auth, async (req, res) => { + var { type, since, search, starts_with, contains } = req.query; - var orders = knex - .select( - 'u1.username as seller', - 'u2.username as buyer', - 'v1 as sell_amount', - 'v2 as buy_amount', - 'rate', - 'a1.name as from', - 'a2.name as to', - knex.raw('Left(completedAt,16) as completed') - ) - .from('orders') - .leftJoin('accounts as a1', 'a1.id', 'orders.a1_id') - .leftJoin('accounts as a2', 'a2.id', 'orders.a2_id') - .leftJoin('users as u1', 'a1.user_id', 'u1.id') - .leftJoin('users as u2', 'a2.user_id', 'u2.id') + var orders = knex + .select( + "u1.username as seller", + "u2.username as buyer", + "v1 as sell_amount", + "v2 as buy_amount", + "rate", + "a1.name as from", + "a2.name as to", + knex.raw("Left(completedAt,16) as completed") + ) + .from("orders") + .leftJoin("accounts as a1", "a1.id", "orders.a1_id") + .leftJoin("accounts as a2", "a2.id", "orders.a2_id") + .leftJoin("users as u1", "a1.user_id", "u1.id") + .leftJoin("users as u2", "a2.user_id", "u2.id"); - var timeCondition = parseInput.addTimeSearch(req.query, 'orders.updatedAt') - if (timeCondition) orders = orders.whereRaw(timeCondition) + var timeCondition = parseInput.addTimeSearch(req.query, "orders.updatedAt"); + if (timeCondition) orders = orders.whereRaw(timeCondition); - var userCondition1 = parseInput.addUserSearch(req.query, 'u1') - var userCondition2 = parseInput.addUserSearch(req.query, 'u2') + var userCondition1 = parseInput.addUserSearch(req.query, "u1"); + var userCondition2 = parseInput.addUserSearch(req.query, "u2"); - if (userCondition1) orders = orders.where( function () { - this.whereRaw(userCondition1) - this.orWhere(knex.raw(userCondition2)) - }) + if (userCondition1) + orders = orders.where(function() { + this.whereRaw(userCondition1); + this.orWhere(knex.raw(userCondition2)); + }); - var found = await orders - return res.send({orders: found}) - }) + var found = await orders; + return res.send({ orders: found }); +}); /** * @api {get} /invoices Retrieve summary of invoices @@ -331,35 +349,31 @@ router.get( * ] * } */ -router.get( - "/invoices", - auth, - async (req, res) => { - var {type, since, search, starts_with, contains} = req.query +router.get("/invoices", auth, async (req, res) => { + var { type, since, search, starts_with, contains } = req.query; - var invoices = knex - .select( - 'username', - 'users.email', - 'invoices.currency', - 'invoices.amount', - 'accounts.network', - knex.raw('Left(invoices.updatedAt,16) as updated') - ) - .from('invoices') - .leftJoin('accounts', 'invoices.account_id', 'accounts.id') - .leftJoin('users', 'accounts.user_id', 'users.id') + var invoices = knex + .select( + "username", + "users.email", + "invoices.currency", + "invoices.amount", + "accounts.network", + knex.raw("Left(invoices.updatedAt,16) as updated") + ) + .from("invoices") + .leftJoin("accounts", "invoices.account_id", "accounts.id") + .leftJoin("users", "accounts.user_id", "users.id"); - var timeCondition = parseInput.addTimeSearch(req.query, 'invoices.updatedAt') - var userCondition = parseInput.addUserSearch(req.query) - - if (timeCondition) invoices = invoices.whereRaw(timeCondition) - if (userCondition) invoices = invoices.whereRaw(userCondition) + var timeCondition = parseInput.addTimeSearch(req.query, "invoices.updatedAt"); + var userCondition = parseInput.addUserSearch(req.query); - var found = await invoices - return res.send({invoices: found}) - }) + if (timeCondition) invoices = invoices.whereRaw(timeCondition); + if (userCondition) invoices = invoices.whereRaw(userCondition); + var found = await invoices; + return res.send({ invoices: found }); +}); /** * @api {get} /deposits Retrieve summary of deposits @@ -379,32 +393,29 @@ router.get( * ] * } */ -router.get( - "/deposits", - auth, - async (req, res) => { - var {type, since, search, starts_with, contains} = req.query +router.get("/deposits", auth, async (req, res) => { + var { type, since, search, starts_with, contains } = req.query; - var deposits = knex - .select( - 'username', - 'users.email', - 'amount', - 'credited', - knex.raw('Left(deposits.updatedAt,16) as deposited') - ) - .from('deposits') - .leftJoin('users', 'deposits.user_id', 'users.id') + var deposits = knex + .select( + "username", + "users.email", + "amount", + "credited", + knex.raw("Left(deposits.updatedAt,16) as deposited") + ) + .from("deposits") + .leftJoin("users", "deposits.user_id", "users.id"); - var timeCondition = parseInput.addTimeSearch(req.query, 'deposits.updatedAt') - var userCondition = parseInput.addUserSearch(req.query) + var timeCondition = parseInput.addTimeSearch(req.query, "deposits.updatedAt"); + var userCondition = parseInput.addUserSearch(req.query); - if (timeCondition) deposits = deposits.whereRaw(timeCondition) - if (userCondition) deposits = deposits.whereRaw(userCondition) + if (timeCondition) deposits = deposits.whereRaw(timeCondition); + if (userCondition) deposits = deposits.whereRaw(userCondition); - var found = await deposits - return res.send({deposits: found}) - }) + var found = await deposits; + return res.send({ deposits: found }); +}); /** * @api {get} /withdrawals Retrieve summary of withdrawals @@ -424,32 +435,32 @@ router.get( * ] * } */ -router.get( - "/withdrawals", - auth, - async (req, res) => { - var {type, since, search, starts_with, contains} = req.query +router.get("/withdrawals", auth, async (req, res) => { + var { type, since, search, starts_with, contains } = req.query; - var withdrawals = knex - .select( - 'username', - 'users.email', - 'amount', - 'notes', - knex.raw('Left(withdrawals.updatedAt,16) as withdrawn') - ) - .from('withdrawals') - .leftJoin('users', 'withdrawals.user_id', 'users.id') + var withdrawals = knex + .select( + "username", + "users.email", + "amount", + "notes", + knex.raw("Left(withdrawals.updatedAt,16) as withdrawn") + ) + .from("withdrawals") + .leftJoin("users", "withdrawals.user_id", "users.id"); + + var timeCondition = parseInput.addTimeSearch( + req.query, + "withdrawals.updatedAt" + ); + var userCondition = parseInput.addUserSearch(req.query); - var timeCondition = parseInput.addTimeSearch(req.query, 'withdrawals.updatedAt') - var userCondition = parseInput.addUserSearch(req.query) - - if (timeCondition) withdrawals = withdrawals.whereRaw(timeCondition) - if (userCondition) withdrawals = withdrawals.whereRaw(userCondition) + if (timeCondition) withdrawals = withdrawals.whereRaw(timeCondition); + if (userCondition) withdrawals = withdrawals.whereRaw(userCondition); - var found = await withdrawals - return res.send({withdrawals: found}) - }) + var found = await withdrawals; + return res.send({ withdrawals: found }); +}); /** * @api {get} /payments Retrieve summary of payments @@ -469,34 +480,31 @@ router.get( * ] * } **/ -router.get( - "/payments", - auth, - async (req, res) => { - var {type, since, search, starts_with, contains} = req.query +router.get("/payments", auth, async (req, res) => { + var { type, since, search, starts_with, contains } = req.query; - var payments = knex - .select( - 'username', - 'users.email', - 'amount', - 'payments.network', - knex.raw('LEFT(hash,20) as hash'), - knex.raw('Left(payments.updatedAt,16) as deposited') - ) - .from('payments') - .leftJoin('accounts', 'payments.account_id', 'accounts.id') - .leftJoin('users', 'accounts.user_id', 'users.id') + var payments = knex + .select( + "username", + "users.email", + "amount", + "payments.network", + knex.raw("LEFT(hash,20) as hash"), + knex.raw("Left(payments.updatedAt,16) as deposited") + ) + .from("payments") + .leftJoin("accounts", "payments.account_id", "accounts.id") + .leftJoin("users", "accounts.user_id", "users.id"); - var timeCondition = parseInput.addTimeSearch(req.query, 'payments.updatedAt') - var userCondition = parseInput.addUserSearch(req.query) + var timeCondition = parseInput.addTimeSearch(req.query, "payments.updatedAt"); + var userCondition = parseInput.addUserSearch(req.query); - if (timeCondition) payments = payments.whereRaw(timeCondition) - if (userCondition) payments = payments.whereRaw(userCondition) + if (timeCondition) payments = payments.whereRaw(timeCondition); + if (userCondition) payments = payments.whereRaw(userCondition); - var found = await payments - return res.send({payments: found}) - }) + var found = await payments; + return res.send({ payments: found }); +}); /** * @api {get} /user_kyc Retrieve user kyc details @@ -516,43 +524,43 @@ router.get( * ] * } */ -router.get( - "/kyc_required", - auth, - async (req, res) => { - var {since, search, starts_with, contains} = req.query - - var threshold = '0.2' - - var kyc = knex +router.get("/kyc_required", auth, async (req, res) => { + var { since, search, starts_with, contains } = req.query; + + var threshold = "0.2"; + + var kyc = knex .select( knex.raw("CONCAT( FORMAT(Max(amount)/1000000, 1), ' M') as max"), - 'username', - 'users.email', - 'users.verified as kyc_verified', + "username", + "users.email", + "users.verified as kyc_verified", // 'payments.currency', // 'payments.network', // knex.raw('LEFT(hash,20) as hash'), // knex.raw('Left(payments.updatedAt,16) as transferred') // knex.raw( parseInput.readableDate('Max(payments.updatedAt)', 'last_changed') ) - knex.raw( 'DATE_FORMAT(Max(payments.updatedAt), ?) AS last_changed', "%M %d, %Y" ) + knex.raw( + "DATE_FORMAT(Max(payments.updatedAt), ?) AS last_changed", + "%M %d, %Y" ) - .from('payments') - .leftJoin('accounts', 'payments.account_id', 'accounts.id') - .leftJoin('users', 'payments.user_id', 'users.id') // should really point to accounts - .groupBy('users.id') - // .groupBy('payments.currency') - // .groupBy('payments.network') + ) + .from("payments") + .leftJoin("accounts", "payments.account_id", "accounts.id") + .leftJoin("users", "payments.user_id", "users.id") // should really point to accounts + .groupBy("users.id"); + // .groupBy('payments.currency') + // .groupBy('payments.network') - var timeCondition = parseInput.addTimeSearch(req.query, 'payments.updatedAt') - var userCondition = parseInput.addUserSearch(req.query) + var timeCondition = parseInput.addTimeSearch(req.query, "payments.updatedAt"); + var userCondition = parseInput.addUserSearch(req.query); - if (timeCondition) kyc = kyc.whereRaw(timeCondition) - if (userCondition) kyc = kyc.whereRaw(userCondition) + if (timeCondition) kyc = kyc.whereRaw(timeCondition); + if (userCondition) kyc = kyc.whereRaw(userCondition); - var found = await kyc.having('max', '>=', threshold) + var found = await kyc.having("max", ">=", threshold); - return res.send({found: found}) - }) + return res.send({ found: found }); +}); export default router; diff --git a/routes/assets.js b/routes/assets.js index 541c9625..826ff2d9 100644 --- a/routes/assets.js +++ b/routes/assets.js @@ -4,16 +4,14 @@ import db from "$db"; import config from "$config"; import app from "$app"; import { auth } from "$lib/passport"; -import axios from 'axios'; -import crypto from 'crypto'; -import fs from 'fs'; +import axios from "axios"; +import crypto from "crypto"; +import fs from "fs"; let fetchAssets; (fetchAssets = async () => { try { - const { data } = await axios.get( - "https://assets.blockstream.info/" - ); + const { data } = await axios.get("https://assets.blockstream.info/"); store.assets = data; } catch (e) { @@ -30,432 +28,415 @@ let fetchAssets; setTimeout(fetchAssets, 7200000); })(); -app.get( - "/assets", - async (req, res) => { - if (store.assets) { - const accounts = await db.Account.findAll({ - // group: ["asset"] - }); - Object.keys(store.assets).map(a => { - store.assets[a].registered = true; - if (!store.assets[a].asset) store.assets[a].asset = store.assets[a].asset_id; - if ( - (store.assets[a].ticker === "BTC" && - store.assets[a].asset !== config.liquid.btcasset) || - (store.assets[a].ticker === "EUR" && - store.assets[a].asset !== config.liquid.eurasset) || - (store.assets[a].ticker === "CAD" && - store.assets[a].asset !== config.liquid.cadasset) || - (store.assets[a].ticker === "USDt" && - store.assets[a].asset !== config.liquid.usdtasset) - ) - delete store.assets[a]; - }); - accounts.map(({ asset, name, domain, ticker, precision }) => { - if (!store.assets[asset]) - store.assets[asset] = { - asset, - name, - domain, - ticker, - precision - }; - }); +app.get("/assets", async (req, res) => { + if (store.assets) { + const accounts = await db.Account.findAll({ + // group: ["asset"] + }); + Object.keys(store.assets).map(a => { + store.assets[a].registered = true; + if (!store.assets[a].asset) + store.assets[a].asset = store.assets[a].asset_id; + if ( + (store.assets[a].ticker === "BTC" && + store.assets[a].asset !== config.liquid.btcasset) || + (store.assets[a].ticker === "EUR" && + store.assets[a].asset !== config.liquid.eurasset) || + (store.assets[a].ticker === "CAD" && + store.assets[a].asset !== config.liquid.cadasset) || + (store.assets[a].ticker === "USDt" && + store.assets[a].asset !== config.liquid.usdtasset) + ) + delete store.assets[a]; + }); + accounts.map(({ asset, name, domain, ticker, precision }) => { + if (!store.assets[asset]) + store.assets[asset] = { + asset, + name, + domain, + ticker, + precision + }; + }); - res.send(store.assets); - } else { - console.log("error getting blockstream assets"); - res.code(500).send("Problem fetching blockstream asset registry data"); - } - }) + res.send(store.assets); + } else { + console.log("error getting blockstream assets"); + res.code(500).send("Problem fetching blockstream asset registry data"); + } +}); -app.post( - "/assets", - auth, - async (req, res) => { - try { - const sha256 = crypto.createHash("sha256"); - const { id: user_id } = req.user; - const blind = false; +app.post("/assets", auth, async (req, res) => { + try { + const sha256 = crypto.createHash("sha256"); + const { id: user_id } = req.user; + const blind = false; - if (!user_id) throw new Error("unauthorized"); + if (!user_id) throw new Error("unauthorized"); - const { - address, - domain, - name, - asset_amount, - filename, - token_amount, - precision, - pubkey, - ticker - } = req.body; + const { + address, + domain, + name, + asset_amount, + filename, + token_amount, + precision, + pubkey, + ticker + } = req.body; - const asset_address = address - ? address - : await lq.getNewAddress("", "legacy"); + const asset_address = address + ? address + : await lq.getNewAddress("", "legacy"); - const token_address = - token_amount && (await lq.getNewAddress("", "legacy")); + const token_address = + token_amount && (await lq.getNewAddress("", "legacy")); - const issuer_pubkey = pubkey - ? pubkey - : (await lq.getAddressInfo(asset_address)).pubkey; - const version = 0; + const issuer_pubkey = pubkey + ? pubkey + : (await lq.getAddressInfo(asset_address)).pubkey; + const version = 0; - let contract = { - entity: { domain }, - issuer_pubkey, - name, - precision, - version - }; + let contract = { + entity: { domain }, + issuer_pubkey, + name, + precision, + version + }; - if (filename) contract.file = filename; - if (ticker) contract.ticker = ticker; + if (filename) contract.file = filename; + if (ticker) contract.ticker = ticker; - contract = Object.keys(contract) - .sort() - .reduce((r, k) => ((r[k] = contract[k]), r), {}); + contract = Object.keys(contract) + .sort() + .reduce((r, k) => ((r[k] = contract[k]), r), {}); - l( - "attempting issuance", - req.user.username, - contract, - "address", - address, - "pubkey", - pubkey - ); + l( + "attempting issuance", + req.user.username, + contract, + "address", + address, + "pubkey", + pubkey + ); - sha256.update(JSON.stringify(contract)); - const hash = sha256.digest("hex"); - const contract_hash = hash - .match(/[a-f0-9]{2}/g) - .reverse() - .join(""); - const rawtx = await lq.createRawTransaction([], [{ data: "00" }]); - const funded = await lq.fundRawTransaction(rawtx, { feeRate: 0.000002 }); - const params = { - asset_amount, - asset_address, - blind, - contract_hash - }; + sha256.update(JSON.stringify(contract)); + const hash = sha256.digest("hex"); + const contract_hash = hash + .match(/[a-f0-9]{2}/g) + .reverse() + .join(""); + const rawtx = await lq.createRawTransaction([], [{ data: "00" }]); + const funded = await lq.fundRawTransaction(rawtx, { feeRate: 0.000002 }); + const params = { + asset_amount, + asset_address, + blind, + contract_hash + }; - params.asset_amount = asset_amount / (SATS / 10 ** precision); + params.asset_amount = asset_amount / (SATS / 10 ** precision); - if (token_amount) { - params.token_amount = token_amount; - params.token_address = token_address; - params.token_amount = parseInt(params.token_amount); - } + if (token_amount) { + params.token_amount = token_amount; + params.token_address = token_address; + params.token_amount = parseInt(params.token_amount); + } - let ria; - try { - ria = await lq.rawIssueAsset(funded.hex, [params]); - } catch (e) { - l(asset_amount, token_amount, params); - throw new Error(e.message); - } + let ria; + try { + ria = await lq.rawIssueAsset(funded.hex, [params]); + } catch (e) { + l(asset_amount, token_amount, params); + throw new Error(e.message); + } - const { asset, hex, token } = ria[0]; - const brt = await lq.blindRawTransaction(hex, true, [], false); - const srt = await lq.signRawTransactionWithWallet(brt); - const allowed = (await lq.testMempoolAccept([srt.hex]))[0].allowed; - if (!allowed) throw new Error("issuance rejected by mempool", srt.hex); - const txid = await lq.sendRawTransaction(srt.hex); + const { asset, hex, token } = ria[0]; + const brt = await lq.blindRawTransaction(hex, true, [], false); + const srt = await lq.signRawTransactionWithWallet(brt); + const allowed = (await lq.testMempoolAccept([srt.hex]))[0].allowed; + if (!allowed) throw new Error("issuance rejected by mempool", srt.hex); + const txid = await lq.sendRawTransaction(srt.hex); - await db.transaction(async transaction => { - let account = await db.Account.findOne({ - where: { - user_id, - asset: config.liquid.btcasset, - pubkey: null - }, - include: { - model: db.User, - as: "user" - }, - order: [["balance", "DESC"]], - transaction - }); + await db.transaction(async transaction => { + let account = await db.Account.findOne({ + where: { + user_id, + asset: config.liquid.btcasset, + pubkey: null + }, + include: { + model: db.User, + as: "user" + }, + order: [["balance", "DESC"]], + transaction + }); - let { user } = account; + let { user } = account; - if (Math.round(funded.fee * SATS) > account.balance) { - err( - "amount exceeds balance", - asset_amount, - funded.fee, - account.balance - ); - throw new Error(`Insufficient funds to pay fee of ${funded.fee} BTC`); - } + if (Math.round(funded.fee * SATS) > account.balance) { + err( + "amount exceeds balance", + asset_amount, + funded.fee, + account.balance + ); + throw new Error(`Insufficient funds to pay fee of ${funded.fee} BTC`); + } + + await account.decrement( + { balance: Math.round(funded.fee * SATS) }, + { transaction } + ); + await account.reload({ transaction }); + emit(user.username, "account", account); + + account = await db.Account.create( + { + asset, + contract, + domain, + user_id, + ticker, + precision, + name, + balance: 0, + network: "liquid", + pending: address ? 0 : Math.round(params.asset_amount * SATS) + }, + { transaction } + ); - await account.decrement( - { balance: Math.round(funded.fee * SATS) }, + emit(user.username, "account", account); + l( + "issued asset", + user.username, + params.asset_amount, + ticker, + name, + account.id + ); + + if (!address) { + const asset_payment = await db.Payment.create( + { + account_id: account.id, + user_id, + hash: txid, + amount: Math.round(params.asset_amount * SATS), + received: true, + confirmed: false, + address: asset_address, + network: "liquid" + }, { transaction } ); - await account.reload({ transaction }); - emit(user.username, "account", account); + emit(user.username, "payment", asset_payment); + + issuances[txid] = { + user_id, + asset, + asset_amount: params.asset_amount, + asset_payment_id: asset_payment.id + }; + } + if (token_amount) { account = await db.Account.create( { - asset, - contract, - domain, + asset: token, user_id, - ticker, - precision, - name, + domain, + ticker: `${ticker}REISSUANCETOKEN`, + precision: 8, + name: `${name} Reissuance Token`, balance: 0, - network: "liquid", - pending: address ? 0 : Math.round(params.asset_amount * SATS) + pending: address ? 0 : Math.round(token_amount * SATS) }, { transaction } ); - emit(user.username, "account", account); - l( - "issued asset", - user.username, - params.asset_amount, - ticker, - name, - account.id - ); if (!address) { - const asset_payment = await db.Payment.create( + const token_payment = await db.Payment.create( { account_id: account.id, user_id, hash: txid, - amount: Math.round(params.asset_amount * SATS), + amount: Math.round(token_amount * SATS), received: true, confirmed: false, - address: asset_address, + address: token_address, network: "liquid" }, { transaction } ); - emit(user.username, "payment", asset_payment); + emit(user.username, "payment", token_payment); - issuances[txid] = { - user_id, - asset, - asset_amount: params.asset_amount, - asset_payment_id: asset_payment.id - }; + issuances[txid].token = token; + issuances[txid].token_amount = token_amount; + issuances[txid].token_payment_id = token_payment.id; } + } + }); - if (token_amount) { - account = await db.Account.create( - { - asset: token, - user_id, - domain, - ticker: `${ticker}REISSUANCETOKEN`, - precision: 8, - name: `${name} Reissuance Token`, - balance: 0, - pending: address ? 0 : Math.round(token_amount * SATS) - }, - { transaction } - ); - emit(user.username, "account", account); - - if (!address) { - const token_payment = await db.Payment.create( - { - account_id: account.id, - user_id, - hash: txid, - amount: Math.round(token_amount * SATS), - received: true, - confirmed: false, - address: token_address, - network: "liquid" - }, - { transaction } - ); - emit(user.username, "payment", token_payment); - - issuances[txid].token = token; - issuances[txid].token_amount = token_amount; - issuances[txid].token_payment_id = token_payment.id; - } - } - }); + res.send(issuances[txid] ? issuances[txid] : { asset }); + } catch (e) { + err("asset issuance failed", e.message, e.stack); + res.code(500).send(e.message); + } +}); - res.send(issuances[txid] ? issuances[txid] : { asset }); - } catch (e) { - err("asset issuance failed", e.message, e.stack); - res.code(500).send(e.message); +app.post("/assets/register", auth, async (req, res) => { + const { asset } = req.body; + const account = await db.Account.findOne({ + where: { + user_id: req.user.id, + asset } - }) + }); -app.post( - "/assets/register", - auth, - async (req, res) => { - const { asset } = req.body; - const account = await db.Account.findOne({ - where: { - user_id: req.user.id, - asset + l("registering", asset, account.contract); + + try { + const { data: result } = await axios.post( + "https://assets.blockstream.info/", + { + asset_id: asset, + contract: account.contract } - }); + ); + l("register asset result", req.user.username, result); + res.send(result); + } catch (e) { + err("asset registration failed", e.message); + res.code(500).send(e.message); + } +}); - l("registering", asset, account.contract); +app.post("/loadFaucet", auth, async (req, res) => { + return res.code(500).send("Faucet feature temporarily disabled"); - try { - const { data: result } = await axios.post( - "https://assets.blockstream.info/", - { - asset_id: asset, - contract: account.contract - } - ); - l("register asset result", req.user.username, result); - res.send(result); - } catch (e) { - err("asset registration failed", e.message); - res.code(500).send(e.message); - } - }) - -app.post( - "/loadFaucet", - auth, - async (req, res) => { - return res.code(500).send("Faucet feature temporarily disabled"); + const { user } = req; + let { asset, amount } = req.body; + amount = parseInt(amount); - const { user } = req; - let { asset, amount } = req.body; - amount = parseInt(amount); + try { + if (amount <= 0) throw new Error("Amount to load cannot be negative"); - try { - if (amount <= 0) throw new Error("Amount to load cannot be negative"); + await db.transaction(async transaction => { + let account = await getAccount(config.liquid.btcasset, user, transaction); - await db.transaction(async transaction => { - let account = await getAccount( - config.liquid.btcasset, - user, - transaction + if (account.asset !== config.liquid.btcasset) + throw new Error( + "Faucet has to be funded with bitcoin. Try sending from another wallet." ); + if (account.balance < amount) throw new Error("Insufficient funds"); - if (account.asset !== config.liquid.btcasset) - throw new Error( - "Faucet has to be funded with bitcoin. Try sending from another wallet." - ); - if (account.balance < amount) throw new Error("Insufficient funds"); - - let fee = 0; + let fee = 0; - await account.decrement({ balance: amount }, { transaction }); - await account.reload({ transaction }); + await account.decrement({ balance: amount }, { transaction }); + await account.reload({ transaction }); - let a2; - let acc = { - user_id: null, - asset - }; + let a2; + let acc = { + user_id: null, + asset + }; - a2 = await db.Account.findOne({ - where: acc, - lock: transaction.LOCK.UPDATE, - transaction - }); + a2 = await db.Account.findOne({ + where: acc, + lock: transaction.LOCK.UPDATE, + transaction + }); - if (a2) { - await a2.increment({ balance: amount }, { transaction }); - await a2.reload({ transaction }); - } else { - let name = asset.substr(0, 6); - let domain; - let ticker = asset.substr(0, 3).toUpperCase(); - let precision = 8; + if (a2) { + await a2.increment({ balance: amount }, { transaction }); + await a2.reload({ transaction }); + } else { + let name = asset.substr(0, 6); + let domain; + let ticker = asset.substr(0, 3).toUpperCase(); + let precision = 8; - const assets = assets; + const assets = assets; - if (assets[asset]) { - ({ domain, ticker, precision, name } = assets[asset]); - } else { - const existing = await db.Account.findOne({ - where: { - asset - }, - order: [["id", "ASC"]], - limit: 1, - lock: transaction.LOCK.UPDATE, - transaction - }); + if (assets[asset]) { + ({ domain, ticker, precision, name } = assets[asset]); + } else { + const existing = await db.Account.findOne({ + where: { + asset + }, + order: [["id", "ASC"]], + limit: 1, + lock: transaction.LOCK.UPDATE, + transaction + }); - if (existing) { - ({ domain, ticker, precision, name } = existing); - } + if (existing) { + ({ domain, ticker, precision, name } = existing); } - - acc = { ...acc, ...{ domain, ticker, precision, name } }; - acc.balance = amount; - acc.pending = 0; - acc.network = "liquid"; - a2 = await db.Account.create(acc, { transaction }); } - let params = { - amount: -amount, - account_id: account.id, - user_id: user.id, - rate: store.rates[user.currency], - currency: user.currency, - confirmed: true, - hash: `Loaded Faucet - ${a2.ticker}`, - network: "COINOS" - }; + acc = { ...acc, ...{ domain, ticker, precision, name } }; + acc.balance = amount; + acc.pending = 0; + acc.network = "liquid"; + a2 = await db.Account.create(acc, { transaction }); + } - let payment = await db.Payment.create(params, { transaction }); + let params = { + amount: -amount, + account_id: account.id, + user_id: user.id, + rate: store.rates[user.currency], + currency: user.currency, + confirmed: true, + hash: `Loaded Faucet - ${a2.ticker}`, + network: "COINOS" + }; - payment = payment.get({ plain: true }); - payment.account = account.get({ plain: true }); + let payment = await db.Payment.create(params, { transaction }); - l("sent internal", user.username, -payment.amount); + payment = payment.get({ plain: true }); + payment.account = account.get({ plain: true }); - emit(user.username, "payment", payment); - emit(user.username, "account", account); - emit(user.username, "user", user); + l("sent internal", user.username, -payment.amount); - l("loaded faucet", asset, amount); - res.send({}); - }); - } catch (e) { - err("problem loading faucet", user.username, e.message); - return res.code(500).send(e.message); - } - }) + emit(user.username, "payment", payment); + emit(user.username, "account", account); + emit(user.username, "user", user); -app.get( - "/faucet", - auth, - async (req, res) => { - let { asset } = req.query; - let faucet = await db.Account.findOne({ - where: { - asset, - user_id: null - } + l("loaded faucet", asset, amount); + res.send({}); }); + } catch (e) { + err("problem loading faucet", user.username, e.message); + return res.code(500).send(e.message); + } +}); - if (!faucet) - faucet = { - asset, - balance: 0, - ticker: "Unknown" - }; +app.get("/faucet", auth, async (req, res) => { + let { asset } = req.query; + let faucet = await db.Account.findOne({ + where: { + asset, + user_id: null + } + }); + + if (!faucet) + faucet = { + asset, + balance: 0, + ticker: "Unknown" + }; - res.send(faucet); - }) + res.send(faucet); +}); diff --git a/routes/funding.js b/routes/funding.js index 9647b301..e65a704e 100644 --- a/routes/funding.js +++ b/routes/funding.js @@ -1,110 +1,96 @@ import { emit } from "$lib/sockets"; import app from "$app"; import config from "$config"; -import mailgunFactory from 'mailgun-js'; +import mailgunFactory from "mailgun-js"; const mailgun = mailgunFactory(config.mailgun); -app.post( - "/id", - auth, - upload.single("id"), - async (req, res) => { - const { user } = req; - if (user.verified === "proof") user.verified = "pending"; - else user.verified = "id"; - await user.save(); - emit(user.username, "user", user); +app.post("/id", auth, upload.single("id"), async (req, res) => { + const { user } = req; + if (user.verified === "proof") user.verified = "pending"; + else user.verified = "id"; + await user.save(); + emit(user.username, "user", user); - let data = { - subject: "KYC Documents", - text: `ID uploaded for ${user.username}`, - from: "[email protected]", - to: "[email protected]" - }; + let data = { + subject: "KYC Documents", + text: `ID uploaded for ${user.username}`, + from: "[email protected]", + to: "[email protected]" + }; - mailgun.messages().send(data); - l("id uploaded", user.username); + mailgun.messages().send(data); + l("id uploaded", user.username); - res.send({}); - }) + res.send({}); +}); -app.post( - "/proof", - auth, - upload.single("proof"), - async (req, res) => { - const { user } = req; - if (user.verified === "id") user.verified = "pending"; - else user.verified = "proof"; - await user.save(); - emit(user.username, "user", user); - l("id proof uploaded", user.username); +app.post("/proof", auth, upload.single("proof"), async (req, res) => { + const { user } = req; + if (user.verified === "id") user.verified = "pending"; + else user.verified = "proof"; + await user.save(); + emit(user.username, "user", user); + l("id proof uploaded", user.username); - res.send({}); - }) + res.send({}); +}); -app.post( - "/funding", - auth, - async (req, res) => { - try { - let { id, amount, code } = req.body; +app.post("/funding", auth, async (req, res) => { + try { + let { id, amount, code } = req.body; - if (!code) { - code = ""; - let d = "ABCDEFGHIJKLMNPQRSTUVWXYZ23456789"; - let l = d.length; - for (let i = 0; i < 8; i++) { - code += d.charAt(Math.floor(Math.random() * l)); - } + if (!code) { + code = ""; + let d = "ABCDEFGHIJKLMNPQRSTUVWXYZ23456789"; + let l = d.length; + for (let i = 0; i < 8; i++) { + code += d.charAt(Math.floor(Math.random() * l)); } - - let params = { - user_id: req.user.id, - amount, - code - }; - - let deposit; - if (id) { - if (!parseFloat(amount) || parseFloat(amount) < 0) - throw new Error("Invalid amount"); - deposit = await db.Deposit.findOne({ where: { id } }); - deposit.update(params); - await deposit.save(); - } else { - deposit = await db.Deposit.create(params); - } - - res.send(deposit); - } catch (e) { - err("funding error", e.message); - res.code(500).send("Funding request failed"); } - }) -app.post( - "/withdrawal", - auth, - async (req, res) => { - try { - const { account, amount, email, institution, transit, notes } = req.body; + let params = { + user_id: req.user.id, + amount, + code + }; + + let deposit; + if (id) { if (!parseFloat(amount) || parseFloat(amount) < 0) throw new Error("Invalid amount"); + deposit = await db.Deposit.findOne({ where: { id } }); + deposit.update(params); + await deposit.save(); + } else { + deposit = await db.Deposit.create(params); + } - await db.Withdrawal.create({ - user_id: req.user.id, - account, - amount, - email, - institution, - transit, - notes - }); + res.send(deposit); + } catch (e) { + err("funding error", e.message); + res.code(500).send("Funding request failed"); + } +}); - res.send({}); - } catch (e) { - err("withdrawaerr", e.message); - res.code(500).send("Withdrawal request failed"); - } - }) +app.post("/withdrawal", auth, async (req, res) => { + try { + const { account, amount, email, institution, transit, notes } = req.body; + if (!parseFloat(amount) || parseFloat(amount) < 0) + throw new Error("Invalid amount"); + + await db.Withdrawal.create({ + user_id: req.user.id, + account, + amount, + email, + institution, + transit, + notes + }); + + res.send({}); + } catch (e) { + err("withdrawaerr", e.message); + res.code(500).send("Withdrawal request failed"); + } +}); diff --git a/routes/info.js b/routes/info.js index d8785333..1b92624b 100644 --- a/routes/info.js +++ b/routes/info.js @@ -1,5 +1,5 @@ import app from "$app"; -import sequelize from '@sequelize/core'; +import sequelize from "@sequelize/core"; import config from "$config"; import store from "$lib/store"; import ln from "$lib/ln"; @@ -21,7 +21,7 @@ app.get("/info", async (req, res, next) => { const info = { nodes: store.networks, - clientVersion, + clientVersion }; res.send(info); @@ -34,35 +34,37 @@ app.get("/balances", async (req, res, next) => { "pubkey", [sequelize.fn("sum", sequelize.col("balance")), "total"] ], - group: ["asset", "pubkey"], + group: ["asset", "pubkey"] }); - let lnchannel; + let lnchannel; let lnwallet; if (config.lna) { if (config.lna.clightning) { const funds = await lna.listfunds(); - lnchannel = parseInt(funds.channels.reduce((a, b) => a + b.channel_sat, 0)); + lnchannel = parseInt( + funds.channels.reduce((a, b) => a + b.channel_sat, 0) + ); lnwallet = parseInt(funds.outputs.reduce((a, b) => a + b.value, 0)); } else { - lnchannel = parseInt((await getChannelBalance({ lnd }).channel_balance)); - lnwallet = parseInt((await getChainBalance({ lnd }).chain_balance)); - } + lnchannel = parseInt(await getChannelBalance({ lnd }).channel_balance); + lnwallet = parseInt(await getChainBalance({ lnd }).chain_balance); + } } let bitcoin, bitcoind; if (config.bitcoin) { bitcoin = parseInt((await bc.getBalance()) * SATS); bitcoind = await bc.getNetworkInfo(); - } + } let assets, liquid, elementsd; if (config.liquid) { assets = await lq.getBalance(); liquid = parseInt(assets.bitcoin * SATS); elementsd = await lq.getNetworkInfo(); - } + } const info = { bitcoind, @@ -72,7 +74,7 @@ app.get("/balances", async (req, res, next) => { bitcoin, liquid, lnchannel, - lnwallet, + lnwallet }; info.total = diff --git a/routes/lnurl.js b/routes/lnurl.js index d7bdcfc2..1cf5e319 100644 --- a/routes/lnurl.js +++ b/routes/lnurl.js @@ -9,7 +9,7 @@ import qs from "query-string"; import persist from "$lib/persist"; import bolt11 from "bolt11"; import { optionalAuth, auth } from "$lib/passport"; -import { createInvoice, getPayments, from "lightning"; +import { createInvoice, getPayments } from "lightning"; import lnd from "$lib/lnd"; export const logins = persist("data/logins.json"); @@ -455,7 +455,7 @@ lnurlServer.bindToHook( try { let { payments } = await ln.getPayments({ lnd, - limit: 5, + limit: 5 }); let p = payments.find(p => p.request === pr); diff --git a/routes/payments.js b/routes/payments.js index 4939394f..6d4076cf 100644 --- a/routes/payments.js +++ b/routes/payments.js @@ -65,7 +65,7 @@ if (config.lna) { // if (config.lnurl) { // let channelRequest = await import("$routes/lightning/channelRequest"); // app.post("/lightning/channelRequest", channelRequest) - // } + // } } if (config.bitcoin) { diff --git a/routes/referrals.js b/routes/referrals.js index 08059c74..b3d53306 100644 --- a/routes/referrals.js +++ b/routes/referrals.js @@ -1,19 +1,19 @@ -import express from 'express'; +import express from "express"; var router = express.Router(); -import { v4 } from 'uuid'; +import { v4 } from "uuid"; -router.get('/', function(req, res, next) { - res.send('list of referrals...'); +router.get("/", function(req, res, next) { + res.send("list of referrals..."); }); // Grant & Retrieve Referral tokens for existing user // usage: GET '/grant?sponsor_id=N&expiry=2021-09-01' // -// Required: +// Required: // sponsor_id (= user.id) -// Changes to DB: +// Changes to DB: // adds record to referrals table: // { token: <uuid>, sponsor_id: <user.id>, status: "available" } @@ -22,9 +22,9 @@ router.get('/', function(req, res, next) { * @apiName Grant * @apiGroup Referrals * - * + * * @apiPermission member - * + * * @apiParam {sponsor_id} user_id of member generating referral code. * @apiParam {expiry} optional expiry date for token. * @@ -34,28 +34,23 @@ router.get('/', function(req, res, next) { * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { - * "token": "*********", - * "status": "available", + * "token": "*********", + * "status": "available", * "expiry": null * } */ -router.post( - "/grant", - auth, - async (req, res) => { - const {sponsor_id, expiry} = req.body - var token = v4() +router.post("/grant", auth, async (req, res) => { + const { sponsor_id, expiry } = req.body; + var token = v4(); - var ref = await knex.table('referrals') - .insert({ - sponsor_id: sponsor_id, - token: token, - status: 'available' - } - ) + var ref = await knex.table("referrals").insert({ + sponsor_id: sponsor_id, + token: token, + status: "available" + }); - return res.send({token: token, status: 'available', expiry: expiry}) - }) + return res.send({ token: token, status: "available", expiry: expiry }); +}); /** * @api {get} /grant Grant Referral code (variation using get) @@ -63,7 +58,7 @@ router.post( * @apiGroup Referrals * * @apiPermission member - * + * * @apiPermission member * @apiParam {sponsor_id} user_id of member generating referral code. * @apiParam {expiry} optional expiry date for token. @@ -74,43 +69,37 @@ router.post( * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { - * "token": "*********", - * "status": "available", + * "token": "*********", + * "status": "available", * "expiry": null * } */ -router.get( - "/grant", - auth, - async (req, res) => { - const {sponsor_id, expiry} = req.query - var token = v4() - - var ref = await knex.table('referrals') - .insert({ - sponsor_id: sponsor_id, - token: token, - status: 'available' - } - ) +router.get("/grant", auth, async (req, res) => { + const { sponsor_id, expiry } = req.query; + var token = v4(); - return res.send({token: token, status: 'available', expiry: expiry}) - }) + var ref = await knex.table("referrals").insert({ + sponsor_id: sponsor_id, + token: token, + status: "available" + }); + return res.send({ token: token, status: "available", expiry: expiry }); +}); /** * @api {get} /checkTokens/:sponsor_id Retrieve list of referral tokens generated by this user - * + * * @apiName checkTokens * @apiGroup Referrals * - * + * * @apiPermission member - * + * * @apiParam {sponsor_id} user_id of member generating referral code. * @apiParam {status} optional token status. * - * @apiSuccess tokens array of token objects + * @apiSuccess tokens array of token objects * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { @@ -122,40 +111,37 @@ router.get( // TO FIX - change sponsor_id so that it is retrieved from current payload (NOT FROM URL) -router.get( - "/checkTokens/:sponsor_id", - auth, - async (req, res) => { - const {sponsor_id} = req.params - const {status} = req.query +router.get("/checkTokens/:sponsor_id", auth, async (req, res) => { + const { sponsor_id } = req.params; + const { status } = req.query; - var tokens = knex - .select( - 'token', - 'created_at', - knex.raw('LEFT(created_at,10) as created'), - 'username', - 'status' - ) - .from('referrals') - .leftJoin('users', 'users.id', 'referrals.user_id') - .where('sponsor_id', 'like', sponsor_id) + var tokens = knex + .select( + "token", + "created_at", + knex.raw("LEFT(created_at,10) as created"), + "username", + "status" + ) + .from("referrals") + .leftJoin("users", "users.id", "referrals.user_id") + .where("sponsor_id", "like", sponsor_id); - if (status && status !== 'all') tokens = tokens.where('status', 'like', status) - const found = await tokens - - return res.send({tokens: found}) - }) + if (status && status !== "all") + tokens = tokens.where("status", "like", status); + const found = await tokens; + return res.send({ tokens: found }); +}); /** * @api {get} /verify/:user_id Verify token and apply to existing user - * + * * @apiName verify * @apiGroup Referrals - * + * * @apiPermission member - * + * * @apiParam {user_id} Current user * @apiParam {token} Token to validate * @@ -165,42 +151,46 @@ router.get( * { * "verified": true * } - * + * * @apiDescription referral token is updated from 'available' to 'used' * @apiDescription referral token is updated with existing user_id */ -router.get( - "/verify/:user_id/:token", - auth, - async (req, res) => { - const { user_id, token } = req.params; +router.get("/verify/:user_id/:token", auth, async (req, res) => { + const { user_id, token } = req.params; - const found = await knex - .select('status') - .from('referrals') - .where('token', 'like', token) - .whereNull('user_id') + const found = await knex + .select("status") + .from("referrals") + .where("token", "like", token) + .whereNull("user_id"); - if (found && found.length) { - if (found[0].status === 'available') { - - await knex('referrals') - .where('token', 'like', token) - .update({ - status: 'used', + if (found && found.length) { + if (found[0].status === "available") { + await knex("referrals") + .where("token", "like", token) + .update({ + status: "used", user_id: user_id, - updated_at: new Date().toISOString().substring(0,10) - }) + updated_at: new Date().toISOString().substring(0, 10) + }); - return res.send({ verified: true, sponsor_id: found.sponsor_id, updated: found.updated_at}); - } else { - res.code(500).send({ verified: false, message: 'Referral already ' + found[0].status }) - } + return res.send({ + verified: true, + sponsor_id: found.sponsor_id, + updated: found.updated_at + }); } else { - res.code(500).send('Invalid referral token') + res + .code(500) + .send({ + verified: false, + message: "Referral already " + found[0].status + }); } - }) - + } else { + res.code(500).send("Invalid referral token"); + } +}); /** * @api {post} /joinQueue Join waiting list (track email & phone) @@ -217,39 +207,39 @@ router.get( * "success": true * "message": 'Added to waiting list' * } - * + * * @apiDescription referral token is updated from 'available' to 'used' * @apiDescription referral token is updated with existing user_id */ -router.post( - "/joinQueue", - async (req, res) => { - const { email, phone, user_id } = req.body; +router.post("/joinQueue", async (req, res) => { + const { email, phone, user_id } = req.body; - await knex.table('waiting_list') - .insert({ - email: email, - phone: phone, - user_id: user_id - }) + await knex.table("waiting_list").insert({ + email: email, + phone: phone, + user_id: user_id + }); - res.send({success: true, message: 'Added ' + email + ' to waiting list ' + phone}) - }) + res.send({ + success: true, + message: "Added " + email + " to waiting list " + phone + }); +}); -router.get( - "/joinQueue", - async (req, res) => { - const {email, phone, user_id} = req.query; +router.get("/joinQueue", async (req, res) => { + const { email, phone, user_id } = req.query; - await knex('waiting_list') - .insert({ - email: email, - phone: phone, - user_id: user_id - }) + await knex("waiting_list").insert({ + email: email, + phone: phone, + user_id: user_id + }); - res.send({success: true, message: 'Added ' + email + ' to waiting list ' + phone}) - }) + res.send({ + success: true, + message: "Added " + email + " to waiting list " + phone + }); +}); /** * @api {get} /isReferred/:user_id Check if user is referred @@ -263,24 +253,22 @@ router.get( * { * true * } - * + * * @apiDescription returns boolean indicating if user is referred or not */ -router.get( - "/isReferred/:user_id", - async (req, res) => { - const { user_id } = req.params; +router.get("/isReferred/:user_id", async (req, res) => { + const { user_id } = req.params; + + var referred = await knex("referrals") + .select("referrals.id") + .where("user_id", "like", user_id) + .where("status", "like", "used"); - var referred = await knex('referrals') - .select('referrals.id') - .where('user_id', 'like', user_id) - .where('status', 'like', 'used') - - if (referred && referred.length) { - res.send({referred: true}) - } else { - res.send({referred: false}) - } - }) + if (referred && referred.length) { + res.send({ referred: true }); + } else { + res.send({ referred: false }); + } +}); export default router; diff --git a/routes/swaps.js b/routes/swaps.js index 31387bec..169c2b8f 100644 --- a/routes/swaps.js +++ b/routes/swaps.js @@ -3,11 +3,11 @@ import app from "$app"; import config from "$config"; import { auth, optionalAuth } from "$lib/passport"; import store from "$lib/store"; -import axios from 'axios'; -import crypto from 'crypto'; -import fs from 'fs'; -import getAccount from '../lib/account'; -import { Op, col } from '@sequelize/core'; +import axios from "axios"; +import crypto from "crypto"; +import fs from "fs"; +import getAccount from "../lib/account"; +import { Op, col } from "@sequelize/core"; const shallow = a => { let b = {}; @@ -335,131 +335,85 @@ const cancel = async (user, id) => { }); }; -app.delete( - "/order/:id", - auth, - async (req, res) => { - const { id } = req.params; - const { user } = req; +app.delete("/order/:id", auth, async (req, res) => { + const { id } = req.params; + const { user } = req; - await cancel(user, id); - res.send({}); - }) + await cancel(user, id); + res.send({}); +}); -app.post( - "/orders", - auth, - async (req, res) => { - return res.code(500).send("Trading temporarily disabled"); - const { user } = req; - try { - await swap(user, req.body); - res.send({}); - } catch (e) { - err(req.user.username, e.message); - res.code(500).send(e.message); - } - }) +app.post("/orders", auth, async (req, res) => { + return res.code(500).send("Trading temporarily disabled"); + const { user } = req; + try { + await swap(user, req.body); + res.send({}); + } catch (e) { + err(req.user.username, e.message); + res.code(500).send(e.message); + } +}); -app.get( - "/orders", - optionalAuth, - async (req, res) => { - try { - let orders = await db.Order.findAll({ - attributes: { - include: [ - [col("acc1.asset"), "a1"], - [col("acc2.asset"), "a2"] - ] - }, +app.get("/orders", optionalAuth, async (req, res) => { + try { + let orders = await db.Order.findAll({ + attributes: { include: [ - { - model: db.Account, - as: "acc1", - attributes: [] - }, - { - model: db.Account, - as: "acc2", - attributes: [] - } + [col("acc1.asset"), "a1"], + [col("acc2.asset"), "a2"] ] - }); + }, + include: [ + { + model: db.Account, + as: "acc1", + attributes: [] + }, + { + model: db.Account, + as: "acc2", + attributes: [] + } + ] + }); - res.send( - orders.map(order => { - if (order.user_id !== req.user.id) order.user_id = null; - return order; - }) - ); - } catch (e) { - res.code(500).send(e.message); - } - }) + res.send( + orders.map(order => { + if (order.user_id !== req.user.id) order.user_id = null; + return order; + }) + ); + } catch (e) { + res.code(500).send(e.message); + } +}); if (config.maker) { - debug('setup maker account...') - config.maker.map(({ amount, c1, c2, currency, askMultiplier, bidMultiplier }) => { - setInterval(async () => { - if (!rates) return; - - const user = await db.User.findOne({ - where: { - username: "maker" - } - }); - - if (!user) { - debug('maker user not defined in database') - } else { - debug('maker: ' + JSON.stringify(user)) - await db.transaction(async transaction => { - let order = await db.Order.findOne( - { - where: { - user_id: user.id, - "$acc1.asset$": c1, - "$acc2.asset$": c2, - accepted: false - }, - include: [ - { - model: db.Account, - as: "acc1" - }, - { - model: db.Account, - as: "acc2" - } - ] - }, - { transaction } - ); + debug("setup maker account..."); + config.maker.map( + ({ amount, c1, c2, currency, askMultiplier, bidMultiplier }) => { + setInterval(async () => { + if (!rates) return; - let params = { - a1: c1, - a2: c2, - v1: amount * SATS, - v2: Math.round( - amount * - SATS * - (((app.get("ask") * store.rates[currency]) / - store.rates["USD"]) * - askMultiplier) - ) - }; + const user = await db.User.findOne({ + where: { + username: "maker" + } + }); - if (order) { - let bestBid = await db.Order.findOne( + if (!user) { + debug("maker user not defined in database"); + } else { + debug("maker: " + JSON.stringify(user)); + await db.transaction(async transaction => { + let order = await db.Order.findOne( { where: { - "$acc1.asset$": c2, - "$acc2.asset$": c1, - accepted: false, - id: { - [Op.ne]: order.id - } + user_id: user.id, + "$acc1.asset$": c1, + "$acc2.asset$": c2, + accepted: false }, include: [ { @@ -470,80 +424,80 @@ if (config.maker) { model: db.Account, as: "acc2" } - ], - order: [["rate", "DESC"]], - limit: 1 + ] }, { transaction } ); - if ( - !bestBid || - (params.v2 / params.v1 > bestBid.rate && - order.acc2.balance >= params.v2) - ) { - order.v1 = params.v1; - order.v2 = params.v2; - await order.save(); - order = order.get({ plain: true }); - order.a1 = params.a1; - order.a2 = params.a2; - order.rate = order.v2 / order.v1; - broadcast("order", shallow(order)); - } - } else { - try { - await swap(user, params); - } catch (e) { - warn("Failed to make ask", e.message); - } - } + let params = { + a1: c1, + a2: c2, + v1: amount * SATS, + v2: Math.round( + amount * + SATS * + (((app.get("ask") * store.rates[currency]) / + store.rates["USD"]) * + askMultiplier) + ) + }; - order = await db.Order.findOne( - { - where: { - user_id: user.id, - "$acc1.asset$": c2, - "$acc2.asset$": c1, - accepted: false - }, - include: [ + if (order) { + let bestBid = await db.Order.findOne( { - model: db.Account, - as: "acc1" + where: { + "$acc1.asset$": c2, + "$acc2.asset$": c1, + accepted: false, + id: { + [Op.ne]: order.id + } + }, + include: [ + { + model: db.Account, + as: "acc1" + }, + { + model: db.Account, + as: "acc2" + } + ], + order: [["rate", "DESC"]], + limit: 1 }, - { - model: db.Account, - as: "acc2" - } - ] - }, - { transaction } - ); + { transaction } + ); + if ( + !bestBid || + (params.v2 / params.v1 > bestBid.rate && + order.acc2.balance >= params.v2) + ) { + order.v1 = params.v1; + order.v2 = params.v2; + await order.save(); + order = order.get({ plain: true }); + order.a1 = params.a1; + order.a2 = params.a2; + order.rate = order.v2 / order.v1; - params = { - a1: c2, - a2: c1, - v1: Math.round( - amount * - SATS * - ((app.get("bid") * store.rates[currency]) / - store.rates["USD"]) * - bidMultiplier - ), - v2: amount * SATS - }; + broadcast("order", shallow(order)); + } + } else { + try { + await swap(user, params); + } catch (e) { + warn("Failed to make ask", e.message); + } + } - if (order) { - let bestAsk = await db.Order.findOne( + order = await db.Order.findOne( { where: { - "$acc1.asset$": c1, - "$acc2.asset$": c2, - accepted: false, - id: { - [Op.ne]: order.id - } + user_id: user.id, + "$acc1.asset$": c2, + "$acc2.asset$": c1, + accepted: false }, include: [ { @@ -554,41 +508,80 @@ if (config.maker) { model: db.Account, as: "acc2" } - ], - order: [["rate", "ASC"]], - limit: 1 + ] }, - transaction + { transaction } ); - if (bestAsk) - if ( - !bestAsk || - (params.v1 / params.v2 < bestAsk.rate && - order.acc1.balance >= params.v1) - ) { - order.v1 = params.v1; - order.v2 = params.v2; - await order.save(); - order = order.get({ plain: true }); - order.a1 = params.a1; - order.a2 = params.a2; - order.rate = order.v2 / order.v1; + params = { + a1: c2, + a2: c1, + v1: Math.round( + amount * + SATS * + ((app.get("bid") * store.rates[currency]) / + store.rates["USD"]) * + bidMultiplier + ), + v2: amount * SATS + }; - broadcast("order", shallow(order)); - } else { - broadcast("removeOrder", order.id); - await order.destroy({ transaction }); + if (order) { + let bestAsk = await db.Order.findOne( + { + where: { + "$acc1.asset$": c1, + "$acc2.asset$": c2, + accepted: false, + id: { + [Op.ne]: order.id + } + }, + include: [ + { + model: db.Account, + as: "acc1" + }, + { + model: db.Account, + as: "acc2" + } + ], + order: [["rate", "ASC"]], + limit: 1 + }, + transaction + ); + + if (bestAsk) + if ( + !bestAsk || + (params.v1 / params.v2 < bestAsk.rate && + order.acc1.balance >= params.v1) + ) { + order.v1 = params.v1; + order.v2 = params.v2; + await order.save(); + order = order.get({ plain: true }); + order.a1 = params.a1; + order.a2 = params.a2; + order.rate = order.v2 / order.v1; + + broadcast("order", shallow(order)); + } else { + broadcast("removeOrder", order.id); + await order.destroy({ transaction }); + } + } else { + try { + await swap(user, params); + } catch (e) { + warn("Failed to make bid", e.message); } - } else { - try { - await swap(user, params); - } catch (e) { - warn("Failed to make bid", e.message); } - } - }); - } - }, 5000); - }); + }); + } + }, 5000); + } + ); } diff --git a/routes/users.js b/routes/users.js index ca1f3a02..dd62fad1 100644 --- a/routes/users.js +++ b/routes/users.js @@ -10,7 +10,7 @@ import { authenticator } from "otplib"; import getAccount from "$lib/account"; import Sequelize from "@sequelize/core"; import bitcoin from "bitcoinjs-lib"; -import liquid from 'liquidjs-lib'; +import liquid from "liquidjs-lib"; import { fromBase58, fromPrivateKey } from "bip32"; import { Mutex } from "async-mutex"; import bip32 from "bip32"; @@ -387,8 +387,7 @@ app.get("/address", async (req, res) => { const release = await mutex.acquire(); try { if (network === "bitcoin") { - if (!config.bitcoin) - return res.code(500).send("Bitcoin not configured"); + if (!config.bitcoin) return res.code(500).send("Bitcoin not configured"); address = await bc.getNewAddress("", type); store.bcAddressIndex = i + 1; diff --git a/sampleconfig/index.js b/sampleconfig/index.js index c843e1e0..e1f55f43 100644 --- a/sampleconfig/index.js +++ b/sampleconfig/index.js @@ -6,7 +6,7 @@ const db = { database: "coinos", host: "mariadb", dialect: "mariadb", - dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" }, + dialectOptions: { multipleStatements: true, timezone: "Etc/GMT+7" } }; const btcasset = @@ -17,7 +17,7 @@ module.exports = { clientVersion: "3b96359d6a6ce68fe4a32f495fc9a6f78af0aa63", knex: { client: "mysql2", - connection: db, + connection: db }, jwt: "secret", port: 3119, @@ -32,7 +32,7 @@ module.exports = { network: "regtest", port: 18443, zmqrawblock: "tcp://bitcoin:18506", - zmqrawtx: "tcp://bitcoin:18507", + zmqrawtx: "tcp://bitcoin:18507" }, liquid: { masterkey: @@ -47,14 +47,16 @@ module.exports = { port: 7040, zmqrawblock: "tcp://liquid:18606", zmqrawtx: "tcp://liquid:18607", - btcasset, + btcasset }, lna: { lnd: true, socket: "lnd:10009", - cert: // get this with: sudo base64 config/lnd/tls.cert | tr -d '\n' + // get this with: sudo base64 config/lnd/tls.cert | tr -d '\n' + cert: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNLRENDQWMrZ0F3SUJBZ0lRTzBDWGhna3k0Z1RQZDFYZmxZaWFrekFLQmdncWhrak9QUVFEQWpBNE1SOHcKSFFZRFZRUUtFeFpzYm1RZ1lYVjBiMmRsYm1WeVlYUmxaQ0JqWlhKME1SVXdFd1lEVlFRREV3dzVOelJqWXpVMgpOelF4TkdRd0hoY05NakV3T0RBeU1qRXpOakkyV2hjTk1qSXdPVEkzTWpFek5qSTJXakE0TVI4d0hRWURWUVFLCkV4WnNibVFnWVhWMGIyZGxibVZ5WVhSbFpDQmpaWEowTVJVd0V3WURWUVFERXd3NU56UmpZelUyTnpReE5HUXcKV1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVE5bFM5ODlxNklzamJKTkQ1TW14eko1dnpzdGp4bgpUMFVyMitpaC9ZS1NQTlJSNFFKSzAvSk9pR1lzL3pPbGJTRDRxSGg2QlRyQmdMd0FxUDY3ZGh0bG80RzZNSUczCk1BNEdBMVVkRHdFQi93UUVBd0lDcERBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREFUQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQjBHQTFVZERnUVdCQlE3M2s3ZXNpTXlHNW1NTTFMRjkzM3IwNG4valRCZ0JnTlZIUkVFV1RCWApnZ3c1TnpSall6VTJOelF4TkdTQ0NXeHZZMkZzYUc5emRJSURiRzVrZ2dSMWJtbDRnZ3AxYm1sNGNHRmphMlYwCmdnZGlkV1pqYjI1dWh3Ui9BQUFCaHhBQUFBQUFBQUFBQUFBQUFBQUFBQUFCaHdTc0hBQUhNQW9HQ0NxR1NNNDkKQkFNQ0EwY0FNRVFDSUFjUVdJd3YrVEkvT2NYZVpRNU1yQm5kQjFtWUQzWFEyU3E1VE5ISnkrTWZBaUF1RlEvNQpNT2pqWWdlN0hZd0gvQmwzb0ZKWWFTUUJEcVFRWE9YVkhDN3JZUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - macaroon: // get this with: sudo base64 config/lnd/data/chain/bitcoin/regtest/admin.macaroon | tr -d '\n' - "AgEDbG5kAvgBAwoQ7uOeHFozqNAvezu2+4G29hIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgOcqQGlllETS4FikFxk9X33ZgAi4kowVw9Ze2IcVnfHo=", - }, + // get this with: sudo base64 config/lnd/data/chain/bitcoin/regtest/admin.macaroon | tr -d '\n' + macaroon: + "AgEDbG5kAvgBAwoQ7uOeHFozqNAvezu2+4G29hIBMBoWCgdhZGRyZXNzEgRyZWFkEgV3cml0ZRoTCgRpbmZvEgRyZWFkEgV3cml0ZRoXCghpbnZvaWNlcxIEcmVhZBIFd3JpdGUaIQoIbWFjYXJvb24SCGdlbmVyYXRlEgRyZWFkEgV3cml0ZRoWCgdtZXNzYWdlEgRyZWFkEgV3cml0ZRoXCghvZmZjaGFpbhIEcmVhZBIFd3JpdGUaFgoHb25jaGFpbhIEcmVhZBIFd3JpdGUaFAoFcGVlcnMSBHJlYWQSBXdyaXRlGhgKBnNpZ25lchIIZ2VuZXJhdGUSBHJlYWQAAAYgOcqQGlllETS4FikFxk9X33ZgAi4kowVw9Ze2IcVnfHo=" + } }; diff --git a/sampleconfig/knexfile.js b/sampleconfig/knexfile.js index 4df78b84..68c933a3 100644 --- a/sampleconfig/knexfile.js +++ b/sampleconfig/knexfile.js @@ -2,16 +2,16 @@ module.exports = { development: { - client: 'mysql2', + client: "mysql2", connection: { - host: 'mariadb', - database: 'coinos', - user: 'root', - password: 'password' + host: "mariadb", + database: "coinos", + user: "root", + password: "password" }, migrations: { - tableName: 'migrations', - directory: 'migrations' + tableName: "migrations", + directory: "migrations" } - }, + } }; diff --git a/scripts/apiParse.js b/scripts/apiParse.js index f13f1943..ec2a33c1 100644 --- a/scripts/apiParse.js +++ b/scripts/apiParse.js @@ -1,34 +1,46 @@ -export const addUserSearch = function (input, table) { - var {search, starts_with, contains} = input +export const addUserSearch = function(input, table) { + var { search, starts_with, contains } = input; - if (!table) { table = 'users' } + if (!table) { + table = "users"; + } // if (since) cmd = cmd.havingRaw('invoices + payments + deposits + orders > ?', [0]) if (search) { if (starts_with) { - search = search + '%' + search = search + "%"; } else if (contains) { - search = '%' + search + '%' + search = "%" + search + "%"; } - var condition = "(" + table + ".email like '" + search + "' OR " + table + ".username like '" + search + "')" + var condition = + "(" + + table + + ".email like '" + + search + + "' OR " + + table + + ".username like '" + + search + + "')"; - return condition + return condition; } else { - return '' + return ""; + } +}; + +export const addTimeSearch = function(input, field) { + if (!field) { + field = "updatedAt"; } -} -export const addTimeSearch = function (input, field) { - if (!field) { field = 'updatedAt' } - - var {since} = input + var { since } = input; if (since) { - condition = field + " >= '" + since + "'" + condition = field + " >= '" + since + "'"; - return condition + return condition; } else { - return '' + return ""; } -} - +}; diff --git a/scripts/check.js b/scripts/check.js index f14a313a..e86940da 100644 --- a/scripts/check.js +++ b/scripts/check.js @@ -1,22 +1,24 @@ -let config = require('./config'); -let fs = require('fs'); +let config = require("./config"); +let fs = require("fs"); + +let mailgun = require("mailgun-js")({ + apiKey: config.mailgun, + domain: config.domain +}); -let mailgun = require('mailgun-js')({apiKey: config.mailgun, domain: config.domain }); - let data = { ...config.mail, - subject: 'User Documents', - text: 'Documents uploaded', + subject: "User Documents", + text: "Documents uploaded" }; -fs.readdir('./uploads', (err, files) => { +fs.readdir("./uploads", (err, files) => { files.forEach(file => { console.log(file); data.text = file; - fs.rename(file, '../verified' + file); - mailgun.messages().send(data, function (error, body) { + fs.rename(file, "../verified" + file); + mailgun.messages().send(data, function(error, body) { console.log(body); }); }); }); - |
