@iden3/js-crypto
Version:
Crypto primitives for iden3
4 lines • 1.44 MB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/index.ts", "../../../src/ff/utils.ts", "../../../src/ff/scalar.ts", "../../../src/ff/random.ts", "../../../src/ff/f1field.ts", "../../../src/babyjub/babyjub.ts", "../../../src/poseidon/poseidon-constants-opt.json", "../../../src/poseidon/poseidon-opt.ts", "../../../src/babyjub/eddsa.ts", "../../../src/hex.ts", "../../../src/babyjub/eddsa-keys.ts", "../../../src/base58.ts", "../../../src/sha256.ts"],
"sourcesContent": ["export { Eddsa, eddsa, BabyJub, babyJub, Signature, PublicKey, PrivateKey } from './babyjub';\nexport { poseidon, Poseidon, OPT } from './poseidon';\nexport { Hex } from './hex';\nexport { base58FromBytes, base58ToBytes } from './base58';\nexport { sha256, Hash } from './sha256';\nexport { utils as ffUtils, getRandomBytes } from './ff';\n", "import * as Scalar from './scalar';\n\nexport function unStringifyBigInts(o: unknown): unknown {\n if (Array.isArray(o)) {\n return o.map(unStringifyBigInts);\n } else if (typeof o == 'object') {\n const res: { [k: string]: unknown } = {};\n for (const [key, val] of Object.entries(o as unknown as { [k: string]: unknown })) {\n res[key] = unStringifyBigInts(val);\n }\n return res;\n }\n // base64 decode\n const byteArray = Uint8Array.from(atob(o as string), (c) => c.charCodeAt(0));\n const hex = [...byteArray].map((x) => x.toString(16).padStart(2, '0')).join('');\n return BigInt(`0x${hex}`);\n}\n\nexport function beBuff2int(buff: Uint8Array) {\n let res = BigInt(0);\n let i = buff.length;\n let offset = 0;\n const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength);\n while (i > 0) {\n if (i >= 4) {\n i -= 4;\n res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8);\n offset += 4;\n } else if (i >= 2) {\n i -= 2;\n res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8);\n offset += 2;\n } else {\n i -= 1;\n res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8);\n offset += 1;\n }\n }\n return res;\n}\n\nexport function beInt2Buff(n: bigint, len: number) {\n let r = n;\n const buff = new Uint8Array(len);\n const buffV = new DataView(buff.buffer);\n let o = len;\n while (o > 0) {\n if (o - 4 >= 0) {\n o -= 4;\n buffV.setUint32(o, Number(r & BigInt(0xffffffff)));\n r = r >> BigInt(32);\n } else if (o - 2 >= 0) {\n o -= 2;\n buffV.setUint16(o, Number(r & BigInt(0xffff)));\n r = r >> BigInt(16);\n } else {\n o -= 1;\n buffV.setUint8(o, Number(r & BigInt(0xff)));\n r = r >> BigInt(8);\n }\n }\n if (r) {\n throw new Error('Number does not fit in this length');\n }\n return buff;\n}\n\nexport function leBuff2int(buff: Uint8Array) {\n let res = BigInt(0);\n let i = 0;\n const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength);\n while (i < buff.length) {\n if (i + 4 <= buff.length) {\n res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8);\n i += 4;\n } else if (i + 2 <= buff.length) {\n res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8);\n i += 2;\n } else {\n res += BigInt(buffV.getUint8(i)) << BigInt(i * 8);\n i += 1;\n }\n }\n return res;\n}\n\nexport function leInt2Buff(n: bigint, len: number) {\n let r = n;\n if (typeof len === 'undefined') {\n len = Math.floor((Scalar.bitLength(n) - 1) / 8) + 1;\n if (len == 0) len = 1;\n }\n const buff = new Uint8Array(len);\n const buffV = new DataView(buff.buffer);\n let o = 0;\n while (o < len) {\n if (o + 4 <= len) {\n buffV.setUint32(o, Number(r & BigInt(0xffffffff)), true);\n o += 4;\n r = r >> BigInt(32);\n } else if (o + 2 <= len) {\n buffV.setUint16(o, Number(r & BigInt(0xffff)), true);\n o += 2;\n r = r >> BigInt(16);\n } else {\n buffV.setUint8(o, Number(r & BigInt(0xff)));\n o += 1;\n r = r >> BigInt(8);\n }\n }\n if (r) {\n throw new Error('Number does not fit in this length');\n }\n return buff;\n}\n", "const hexLen = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4];\n\nexport const fromString = (s: string, radix?: number): bigint => {\n if (!radix || radix === 10) {\n return BigInt(s);\n } else if (radix === 16) {\n if (s.slice(0, 2) == '0x') {\n return BigInt(s);\n } else {\n return BigInt('0x' + s);\n }\n }\n\n throw new Error('Unsupported radix');\n};\n\nexport const e = fromString;\n\nexport const fromArray = (a: Uint8Array, r: number) => {\n let acc = BigInt(0);\n const radix = BigInt(r);\n for (let i = 0; i < a.length; i++) {\n acc = acc * radix + BigInt(a[i]);\n }\n return acc;\n};\n\nexport const bitLength = (a: bigint): number => {\n const aS = a.toString(16);\n return (aS.length - 1) * 4 + hexLen[parseInt(aS[0], 16)];\n};\n\nexport const isNegative = (a: bigint): boolean => {\n return BigInt(a) < BigInt(0);\n};\n\nexport const isZero = (a: bigint) => {\n return a === zero;\n};\n\nexport const shiftLeft = (a: bigint, n: bigint): bigint => {\n return a << n;\n};\n\nexport const shiftRight = (a: bigint, n: bigint): bigint => {\n return a >> n;\n};\n\nexport const shl = shiftLeft;\nexport const shr = shiftRight;\n\nexport const isOdd = (a: bigint): boolean => {\n return (a & one) == one;\n};\n\nexport const naf = (n: bigint): number[] => {\n let E = n;\n const res = [];\n while (E) {\n if (E & one) {\n const z = 2 - Number(E % BigInt(4));\n res.push(z);\n E = E - BigInt(z);\n } else {\n res.push(0);\n }\n E = E >> one;\n }\n return res;\n};\n\nexport const bits = (n: bigint): number[] => {\n let E = n;\n const res = [];\n while (E) {\n if (E & one) {\n res.push(1);\n } else {\n res.push(0);\n }\n E = E >> one;\n }\n return res;\n};\n\nexport const toNumber = (s: bigint): number => {\n if (s > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('Number too big');\n }\n return Number(s);\n};\n\nexport const toArray = (s: bigint, r: bigint): number[] => {\n const res = [];\n let rem = s;\n const radix = r;\n while (rem) {\n res.unshift(Number(rem % radix));\n rem = rem / radix;\n }\n return res;\n};\n\nexport const add = (a: bigint, b: bigint): bigint => {\n return a + b;\n};\n\nexport const sub = (a: bigint, b: bigint): bigint => {\n return a - b;\n};\n\nexport const neg = (a: bigint): bigint => {\n return -a;\n};\n\nexport const mul = (a: bigint, b: bigint): bigint => {\n return a * b;\n};\n\nexport const square = (a: bigint): bigint => {\n return a * a;\n};\n\nexport const pow = (a: bigint, b: bigint): bigint => {\n return a ** b;\n};\n\nexport const exp = (a: bigint, b: bigint): bigint => {\n return a ** b;\n};\n\nexport const abs = (a: bigint): bigint => {\n return a >= 0 ? a : -a;\n};\n\nexport const div = (a: bigint, b: bigint): bigint => {\n return a / b;\n};\n\nexport const mod = (a: bigint, b: bigint): bigint => {\n return a % b;\n};\n\nexport const eq = (a: bigint, b: bigint): boolean => {\n return a === b;\n};\n\nexport const neq = (a: bigint, b: bigint): boolean => {\n return a !== b;\n};\n\nexport const lt = (a: bigint, b: bigint): boolean => {\n return a < b;\n};\n\nexport const gt = (a: bigint, b: bigint): boolean => {\n return a > b;\n};\n\nexport const leq = (a: bigint, b: bigint): boolean => {\n return a <= b;\n};\n\nexport const geq = (a: bigint, b: bigint): boolean => {\n return a >= b;\n};\n\nexport const band = (a: bigint, b: bigint): bigint => {\n return a & b;\n};\n\nexport const bor = (a: bigint, b: bigint): bigint => {\n return a | b;\n};\n\nexport const bXor = (a: bigint, b: bigint): bigint => {\n return a ^ b;\n};\n\nexport const land = (a: bigint, b: bigint): bigint => {\n return a && b;\n};\n\nexport const lor = (a: bigint, b: bigint): bigint => {\n return a || b;\n};\n\n// Returns a buffer with Little Endian Representation\nexport const toRprLE = (buff: Uint8Array, o: number, e: bigint, n8: number): void => {\n const s = '0000000' + e.toString(16);\n const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8 / 4);\n const l = (((s.length - 7) * 4 - 1) >> 5) + 1; // Number of 32bit words;\n for (let i = 0; i < l; i++)\n v[i] = parseInt(s.substring(s.length - 8 * i - 8, s.length - 8 * i), 16);\n for (let i = l; i < v.length; i++) v[i] = 0;\n for (let i = v.length * 4; i < n8; i++)\n buff[i] = toNumber(band(shiftRight(e, BigInt(i * 8)), BigInt(0xff)));\n};\n\n// Returns a buffer with Big Endian Representation\nexport const toRprBE = (buff: Uint8Array, o: number, e: bigint, n8: number): void => {\n const s = '0000000' + e.toString(16);\n const v = new DataView(buff.buffer, buff.byteOffset + o, n8);\n const l = (((s.length - 7) * 4 - 1) >> 5) + 1; // Number of 32bit words;\n for (let i = 0; i < l; i++)\n v.setUint32(\n n8 - i * 4 - 4,\n parseInt(s.substring(s.length - 8 * i - 8, s.length - 8 * i), 16),\n false\n );\n\n // todo: check this\n for (let i = 0; i < n8 / 4 - l; i++) v.setInt32(0, 0, false);\n};\n\n// Passes a buffer with Little Endian Representation\nexport const fromRprLE = (buff: Uint8Array, o: number, n8?: number): bigint => {\n n8 = n8 || buff.byteLength;\n o = o || 0;\n const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8 / 4);\n const a = new Array(n8 / 4);\n v.forEach((ch, i) => (a[a.length - i - 1] = ch.toString(16).padStart(8, '0')));\n return fromString(a.join(''), 16);\n};\n\n// Passes a buffer with Big Endian Representation\nexport const fromRprBE = (buff: Uint8Array, o: number, n8: number): bigint => {\n n8 = n8 || buff.byteLength;\n o = o || 0;\n const v = new DataView(buff.buffer, buff.byteOffset + o, n8);\n const a = new Array(n8 / 4);\n for (let i = 0; i < n8 / 4; i++) {\n a[i] = v\n .getUint32(i * 4, false)\n .toString(16)\n .padStart(8, '0');\n }\n return fromString(a.join(''), 16);\n};\n\nexport const toString = (a: bigint, radix = 10): string => {\n return a.toString(radix);\n};\n\nexport const toLEBuff = (a: bigint): Uint8Array => {\n const buff = new Uint8Array(Math.floor((bitLength(a) - 1) / 8) + 1);\n toRprLE(buff, 0, a, buff.byteLength);\n return buff;\n};\n\nexport const zero = BigInt(0);\nexport const one = BigInt(1);\n", "/**\n * Type definition for the browser crypto object.\n */\ntype BrowserCrypto = { crypto?: { getRandomValues?: (arg0: Uint8Array) => void } };\n\nexport function getRandomBytes(length: number): Uint8Array {\n if (length <= 0) {\n throw new Error('Length must be greater than 0');\n }\n const global = globalThis as BrowserCrypto;\n if (global.crypto?.getRandomValues) {\n const randomValues = new Uint8Array(length);\n global.crypto.getRandomValues(randomValues);\n return randomValues;\n }\n // eslint-disable-next-line no-unused-labels\n NODE: {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const crypto = require('crypto');\n return crypto.randomBytes(length);\n }\n\n throw new Error('Random byte generation is not supported in this environment');\n}\n", "import * as Scalar from './scalar';\nimport { getRandomBytes } from './random';\n\nexport class F1Field {\n type: string;\n one: bigint;\n zero: bigint;\n p: bigint;\n m: bigint;\n negOne: bigint;\n two: bigint;\n half: bigint;\n bitLength: number;\n mask: bigint;\n n64: number;\n n32: number;\n n8: number;\n R: bigint;\n s: number;\n shift: bigint;\n Ri: bigint;\n nqr: bigint;\n t: bigint;\n nqr_to_t: bigint;\n k: bigint;\n\n constructor(p: bigint) {\n this.type = 'F1';\n this.one = BigInt(1);\n this.zero = BigInt(0);\n this.p = BigInt(p);\n this.m = Scalar.one;\n this.negOne = this.p - this.one;\n this.two = BigInt(2);\n this.half = this.p >> this.one;\n this.bitLength = Scalar.bitLength(this.p);\n this.mask = (this.one << BigInt(this.bitLength)) - this.one;\n\n this.n64 = Math.floor((this.bitLength - 1) / 64) + 1;\n this.n32 = this.n64 * 2;\n this.n8 = this.n64 * 8;\n this.R = this.e(this.one << BigInt(this.n64 * 64));\n this.Ri = this.inv(this.R);\n\n const e = this.negOne >> this.one;\n this.nqr = this.two;\n let r = this.pow(this.nqr, e);\n while (!this.eq(r, this.negOne)) {\n this.nqr = this.nqr + this.one;\n r = this.pow(this.nqr, e);\n }\n\n this.s = 0;\n this.t = this.negOne;\n\n while ((this.t & this.one) == this.zero) {\n this.s = this.s + 1;\n this.t = this.t >> this.one;\n }\n\n this.nqr_to_t = this.pow(this.nqr, this.t);\n\n // eslint-disable-next-line @cspell/spellchecker\n tonelliShanks(this);\n\n this.shift = this.square(this.nqr);\n this.k = this.exp(this.nqr, BigInt(2 ** this.s));\n }\n\n e(a: string | bigint, b: bigint | undefined = undefined): bigint {\n let res!: bigint;\n if (!b) {\n res = BigInt(a);\n } else if (b == BigInt(16)) {\n res = BigInt('0x' + a);\n }\n if (res < 0) {\n let nRes = -res;\n if (nRes >= this.p) nRes = nRes % this.p;\n return this.p - nRes;\n } else {\n return res >= this.p ? res % this.p : res;\n }\n }\n\n add(a: bigint, b: bigint): bigint {\n const res = a + b;\n return res >= this.p ? res - this.p : res;\n }\n\n sub(a: bigint, b: bigint): bigint {\n return a >= b ? a - b : this.p - b + a;\n }\n\n neg(a: bigint): bigint {\n return a ? this.p - a : a;\n }\n\n double(a: bigint): bigint {\n return this.add(a, a);\n }\n\n mul(a: bigint, b: bigint): bigint {\n return (a * b) % this.p;\n }\n\n mulScalar(base: bigint, s: bigint) {\n return (base * this.e(s)) % this.p;\n }\n\n square(a: bigint): bigint {\n return (a * a) % this.p;\n }\n\n eq(a: bigint, b: bigint): boolean {\n return a == b;\n }\n\n neq(a: bigint, b: bigint): boolean {\n return a != b;\n }\n\n lt(a: bigint, b: bigint): boolean {\n const aa = a > this.half ? a - this.p : a;\n const bb = b > this.half ? b - this.p : b;\n return aa < bb;\n }\n\n gt(a: bigint, b: bigint): boolean {\n const aa = a > this.half ? a - this.p : a;\n const bb = b > this.half ? b - this.p : b;\n return aa > bb;\n }\n\n leq(a: bigint, b: bigint): boolean {\n const aa = a > this.half ? a - this.p : a;\n const bb = b > this.half ? b - this.p : b;\n return aa <= bb;\n }\n\n geq(a: bigint, b: bigint): boolean {\n const aa = a > this.half ? a - this.p : a;\n const bb = b > this.half ? b - this.p : b;\n return aa >= bb;\n }\n\n div(a: bigint, b: bigint): bigint {\n return this.mul(a, this.inv(b));\n }\n\n iDiv(a: bigint, b: bigint): bigint {\n if (!b) throw new Error('Division by zero');\n return a / b;\n }\n\n inv(a: bigint) {\n if (!a) throw new Error('Division by zero');\n\n let t = this.zero;\n let r = this.p;\n let newt = this.one;\n let newR = a % this.p;\n while (newR) {\n const q = r / newR;\n [t, newt] = [newt, t - q * newt];\n [r, newR] = [newR, r - q * newR];\n }\n if (t < this.zero) t += this.p;\n return t;\n }\n\n mod(a: bigint, b: bigint): bigint {\n return a % b;\n }\n\n pow(b: bigint, e: bigint): bigint {\n return exp(this, b, e);\n }\n\n exp(b: bigint, e: bigint): bigint {\n return exp(this, b, BigInt(e));\n }\n\n band(a: bigint, b: bigint): bigint {\n const res = a & b & this.mask;\n return res >= this.p ? res - this.p : res;\n }\n\n bor(a: bigint, b: bigint): bigint {\n const res = (a | b) & this.mask;\n return res >= this.p ? res - this.p : res;\n }\n\n bXor(a: bigint, b: bigint): bigint {\n const res = (a ^ b) & this.mask;\n return res >= this.p ? res - this.p : res;\n }\n\n bNot(a: bigint): bigint {\n const res = a ^ this.mask;\n return res >= this.p ? res - this.p : res;\n }\n\n shl(a: bigint, b: bigint): bigint {\n if (Number(b) < this.bitLength) {\n const res = (a << b) & this.mask;\n return res >= this.p ? res - this.p : res;\n } else {\n const nb = this.p - b;\n if (Number(nb) < this.bitLength) {\n return a >> nb;\n } else {\n return this.zero;\n }\n }\n }\n\n shr(a: bigint, b: bigint): bigint {\n if (Number(b) < this.bitLength) {\n return a >> b;\n } else {\n const nb = this.p - b;\n if (Number(nb) < this.bitLength) {\n const res = (a << nb) & this.mask;\n return res >= this.p ? res - this.p : res;\n } else {\n return Scalar.zero;\n }\n }\n }\n\n land(a: bigint, b: bigint): bigint {\n return a && b ? this.one : this.zero;\n }\n\n lor(a: bigint, b: bigint): bigint {\n return a || b ? this.one : this.zero;\n }\n\n sqrt_old(n: bigint): bigint | null {\n if (n == this.zero) return this.zero;\n\n // Test that have solution\n const res = this.pow(n, this.negOne >> this.one);\n if (res != this.one) return null;\n\n let m = this.s;\n let c = this.nqr_to_t;\n let t = this.pow(n, this.t);\n let r = this.pow(n, this.add(this.t, this.one) >> this.one);\n\n while (t != this.one) {\n let sq = this.square(t);\n let i = 1;\n while (sq != this.one) {\n i++;\n sq = this.square(sq);\n }\n\n // b = c ^ m-i-1\n let b = c;\n for (let j = 0; j < m - i - 1; j++) b = this.square(b);\n\n m = i;\n c = this.square(b);\n t = this.mul(t, c);\n r = this.mul(r, b);\n }\n\n if (r > this.p >> this.one) {\n r = this.neg(r);\n }\n\n return r;\n }\n\n normalize(a: bigint): bigint {\n if (a < 0) {\n let na = -a;\n if (na >= this.p) na = na % this.p;\n return this.p - na;\n } else {\n return a >= this.p ? a % this.p : a;\n }\n }\n\n random(): bigint {\n const nBytes = (this.bitLength * 2) / 8;\n let res = this.zero;\n for (let i = 0; i < nBytes; i++) {\n res = (res << BigInt(8)) + BigInt(getRandomBytes(1)[0]);\n }\n return res % this.p;\n }\n\n toString(a: bigint, base = 10) {\n base = base || 10;\n let vs;\n if (a > this.half && base == 10) {\n const v = this.p - a;\n vs = '-' + v.toString(base);\n } else {\n vs = a.toString(base);\n }\n return vs;\n }\n\n isZero(a: bigint) {\n return a == this.zero;\n }\n\n // Returns a buffer with Little Endian Representation\n toRprLE(buff: Uint8Array, o: number, e: bigint) {\n Scalar.toRprLE(buff, o, e, this.n64 * 8);\n }\n\n // Returns a buffer with Big Endian Representation\n toRprBE(buff: Uint8Array, o: number, e: bigint) {\n Scalar.toRprBE(buff, o, e, this.n64 * 8);\n }\n\n // Returns a buffer with Big Endian Montgomery Representation\n toRprBEM(buff: Uint8Array, o: number, e: bigint) {\n return this.toRprBE(buff, o, this.mul(this.R, e));\n }\n\n toRprLEM(buff: Uint8Array, o: number, e: bigint) {\n return this.toRprLE(buff, o, this.mul(this.R, e));\n }\n\n // Passes a buffer with Little Endian Representation\n fromRprLE(buff: Uint8Array, o: number) {\n return Scalar.fromRprLE(buff, o, this.n8);\n }\n\n // Passes a buffer with Big Endian Representation\n fromRprBE(buff: Uint8Array, o: number) {\n return Scalar.fromRprBE(buff, o, this.n8);\n }\n\n fromRprLEM(buff: Uint8Array, o: number) {\n return this.mul(this.fromRprLE(buff, o), this.Ri);\n }\n\n fromRprBEM(buff: Uint8Array, o: number) {\n return this.mul(this.fromRprBE(buff, o), this.Ri);\n }\n\n toObject(a: bigint): bigint {\n return a;\n }\n\n sqrt(a: bigint): bigint | null {\n throw new Error('Not implemented sqrt for F1' + a);\n }\n\n sqrt_e1!: bigint;\n sqrt_q!: bigint;\n sqrt_s!: bigint;\n sqrt_t!: bigint;\n sqrt_z!: bigint;\n sqrt_tm1d2!: bigint;\n}\n\n// eslint-disable-next-line @cspell/spellchecker\nfunction tonelliShanks(F: F1Field) {\n F.sqrt_q = Scalar.pow(F.p, F.m);\n\n F.sqrt_s = Scalar.zero;\n F.sqrt_t = Scalar.sub(F.sqrt_q, Scalar.one);\n\n while (!Scalar.isOdd(F.sqrt_t)) {\n F.sqrt_s = F.sqrt_s + Scalar.one;\n F.sqrt_t = Scalar.div(F.sqrt_t, 2n);\n }\n\n let c0 = F.one;\n\n while (F.eq(c0, F.one)) {\n const c = F.random();\n F.sqrt_z = F.pow(c, F.sqrt_t);\n c0 = F.pow(F.sqrt_z, 2n ** (F.sqrt_s - Scalar.one));\n }\n\n F.sqrt_tm1d2 = Scalar.div(Scalar.sub(F.sqrt_t, Scalar.one), 2n);\n\n F.sqrt = (a: bigint): bigint | null => {\n if (F.isZero(a)) return F.zero;\n let w = F.pow(a, F.sqrt_tm1d2);\n const a0 = F.pow(F.mul(F.square(w), a), 2n ** (F.sqrt_s - Scalar.one));\n if (F.eq(a0, F.negOne)) return null;\n\n let v = F.sqrt_s;\n let x = F.mul(a, w);\n let b = F.mul(x, w);\n let z = F.sqrt_z;\n while (!F.eq(b, F.one)) {\n let b2k = F.square(b);\n let k = Scalar.one;\n while (!F.eq(b2k, F.one)) {\n b2k = F.square(b2k);\n k++;\n }\n\n w = z;\n for (let i = 0; i < v - k - Scalar.one; i++) {\n w = F.square(w);\n }\n z = F.square(w);\n b = F.mul(b, z);\n x = F.mul(x, w);\n v = k;\n }\n return F.geq(x, F.zero) ? x : F.neg(x);\n };\n}\n\nexport function mulScalar(F: F1Field, base: bigint, e: bigint): bigint {\n let res;\n\n if (Scalar.isZero(e)) return F.zero;\n\n const n = Scalar.naf(e);\n\n if (n[n.length - 1] == 1) {\n res = base;\n } else if (n[n.length - 1] == -1) {\n res = F.neg(base);\n } else {\n throw new Error('invalid NAF');\n }\n\n for (let i = n.length - 2; i >= 0; i--) {\n res = F.double(res);\n\n if (n[i] == 1) {\n res = F.add(res, base);\n } else if (n[i] == -1) {\n res = F.sub(res, base);\n }\n }\n\n return res;\n}\n\nexport function exp(F: F1Field, base: bigint, e: bigint) {\n if (Scalar.isZero(e)) return F.one;\n\n const n = Scalar.bits(e);\n\n if (n.length == 0) return F.one;\n\n let res = base;\n\n for (let i = n.length - 2; i >= 0; i--) {\n res = F.square(res);\n\n if (n[i]) {\n res = F.mul(res, base);\n }\n }\n\n return res;\n}\n", "import { Scalar, F1Field } from '../ff';\n\n// circomlibjs BabyJub\nexport class BabyJub {\n F;\n p: bigint;\n pm1d2: bigint;\n Generator: bigint[];\n Base8: bigint[];\n order: bigint;\n subOrder: bigint;\n A: bigint;\n D: bigint;\n\n constructor(F: F1Field) {\n this.F = F;\n this.p = BigInt(\n '21888242871839275222246405745257275088548364400416034343698204186575808495617'\n );\n this.pm1d2 = Scalar.div(Scalar.sub(this.p, Scalar.one), 2n);\n\n this.Generator = [\n F.e('995203441582195749578291179787384436505546430278305826713579947235728471134'),\n F.e('5472060717959818805561601436314318772137091100104008585924551046643952123905')\n ];\n this.Base8 = [\n F.e('5299619240641551281634865583518297030282874472190772894086521144482721001553'),\n F.e('16950150798460657717958625567821834550301663161624707787222815936182638968203')\n ];\n this.order = BigInt(\n '21888242871839275222246405745257275088614511777268538073601725287587578984328'\n );\n this.subOrder = Scalar.shiftRight(this.order, 3n);\n this.A = F.e('168700');\n this.D = F.e('168696');\n }\n\n addPoint(a: bigint[], b: bigint[]): [bigint, bigint] {\n const F = this.F;\n\n const res = new Array(2);\n\n /* does the equivalent of:\n res[0] = bigInt((a[0]*b[1] + b[0]*a[1]) * bigInt(bigInt(\"1\") + d*a[0]*b[0]*a[1]*b[1]).inverse(q)).affine(q);\n res[1] = bigInt((a[1]*b[1] - cta*a[0]*b[0]) * bigInt(bigInt(\"1\") - d*a[0]*b[0]*a[1]*b[1]).inverse(q)).affine(q);\n */\n\n const beta = F.mul(a[0], b[1]);\n const gamma = F.mul(a[1], b[0]);\n const delta = F.mul(F.sub(a[1], F.mul(this.A, a[0])), F.add(b[0], b[1]));\n const tau = F.mul(beta, gamma);\n const dTau = F.mul(this.D, tau);\n\n res[0] = F.div(F.add(beta, gamma), F.add(F.one, dTau));\n\n res[1] = F.div(F.add(delta, F.sub(F.mul(this.A, beta), gamma)), F.sub(F.one, dTau));\n\n return res as [bigint, bigint];\n }\n\n mulPointEScalar(base: bigint[], e: bigint): [bigint, bigint] {\n const F = this.F;\n let res: [bigint, bigint] = [F.e('0'), F.e('1')];\n let rem = e;\n let exp = base;\n\n while (!Scalar.isZero(rem)) {\n if (Scalar.isOdd(rem)) {\n res = this.addPoint(res, exp);\n }\n exp = this.addPoint(exp, exp);\n rem = Scalar.shiftRight(rem, Scalar.one);\n }\n\n return res;\n }\n\n inSubgroup(P: bigint[]): boolean {\n const F = this.F;\n if (!this.inCurve(P)) return false;\n const res = this.mulPointEScalar(P, this.subOrder);\n return F.isZero(res[0]) && F.eq(res[1], F.one);\n }\n\n inCurve(P: bigint[]): boolean {\n const F = this.F;\n const x2 = F.square(P[0]);\n const y2 = F.square(P[1]);\n\n if (!F.eq(F.add(F.mul(this.A, x2), y2), F.add(F.one, F.mul(F.mul(x2, y2), this.D))))\n return false;\n\n return true;\n }\n\n packPoint(P: bigint[]): Uint8Array {\n const F = this.F;\n const buff = new Uint8Array(32);\n F.toRprLE(buff, 0, P[1]);\n const n = F.toObject(P[0]);\n if (Scalar.gt(n, this.pm1d2)) {\n buff[31] = buff[31] | 0x80;\n }\n return buff;\n }\n\n unpackPoint(buff: Uint8Array): [bigint, bigint] | null {\n const F = this.F;\n let sign = false;\n const P: [bigint, bigint] = [BigInt(0), BigInt(0)];\n if (buff[31] & 0x80) {\n sign = true;\n buff[31] = buff[31] & 0x7f;\n }\n P[1] = F.fromRprLE(buff, 0);\n if (Scalar.gt(F.toObject(P[1]), this.p)) return null;\n\n const y2 = F.square(P[1]);\n\n const x2 = F.div(F.sub(F.one, y2), F.sub(this.A, F.mul(this.D, y2)));\n\n const x2h = F.exp(x2, BigInt(F.half));\n if (!F.eq(F.one, x2h)) return null;\n\n let x = F.sqrt(x2);\n\n if (x == null) return null;\n\n if (sign) x = F.neg(x);\n\n P[0] = BigInt(x);\n\n return P;\n }\n}\nconst F = new F1Field(\n BigInt('21888242871839275222246405745257275088548364400416034343698204186575808495617')\n);\n\nexport const babyJub = new BabyJub(F);\n", "{\"C\":[[\"CcRunsaOm9T+H6q6KUy6OKcaoXdTTN0bbH3A29Cr16c=\",\"DANWUwiW7sQql+2TfzE1z8UUKzrkBbg0PB2D/6YEy4E=\",\"JQ9RFqQX12qqQilS/MWzMyn3cU/CbVbAQyUH/HQKh8Q=\",\"JkBlrYdXLgFmWWJsM8ghP3o3O5uCJaOE9FjYULtKlJ8=\",\"K7jpStjYrcps6Qn/lLh1BymylORAA3baOeM/2iS9Qq8=\",\"GQUQZdBdhh7IE8FSkdRqMo9iAbIa1dI51Phfuwml264=\",\"JFvQYXqkSWGPW9RVCqx7jgjU0cAXFllDzfR3bN/zQ0o=\",\"CfsaERgHT/edisv1sCEx4EihVwFV4PKxw2rQkdSRqI8=\",\"I0q1BLuugZiXJ0GVL3i36wGOoZLwXlTBSEq4lz/2bYg=\",\"AfZuUJuEw1WuPUw1E6KC/Uj5yMZDn0Kng1+8/g8qMkw=\",\"GyL11p1yXmACzwDdnuYtGlrw79xJEPVBJ6kgzMQ/kfo=\",\"AlK1Xt6tE1+FKWi38cT0kPplns1bR6eKfbkfZabfwj8=\",\"F3OuLhY3ySrQZ3wqBH/qjspLUzA/IYcfaJKiwEh9f/E=\",\"LVewKQbNCrgqeedvru9vh2ZurAk893FWRdXsn3rHMvU=\",\"ChbzpigksoHost24/DkaSY+wYTF/r/oDaW+DRZYxPZM=\",\"Fmb1Jff0tpiNKjeDSrdH6uBYd1e3iOt/HiawjjaghZE=\",\"BdpE+OCjuLsTIx8MoltQtX9cghKOHf7D5UHZEuvhe3Y=\",\"CaObqZkzA7oZG6yL2z4BRNv7XzliTN2VJNx4YWM7yVo=\",\"BsD7gkoZIC0w7mtBjAAp4QDoWm0Vj58qgo39LtCSCmg=\",\"A4fY4FaysXapd2tEkss7QYrcZgYn5SuzMkKDv5UiOV0=\",\"FHoa+CA271sop6N76kDWrDATzxtiNYOWv3FW9cLcloQ=\",\"MDjZIGDa6q8b0Egr0/BhPYjo3/kKegUl+SJ+TLfG+Bs=\",\"BylAqh1Tilo5oyP55dZWFs9sIjM5AG+XialyRVMpCPU=\",\"LT1gSUn04UxwuKh5rt7Emzo2e6IWrwSPRk7W8V4rkCM=\",\"IlueTzXHVJ+Ad0wrTRgwmy3PfHKHuYLkl0ahdmQec8U=\",\"HqeBKI/fE7IZAJWiNEgo433+gcdaCXCfDRObu/bHBBQ=\",\"COlsPn6N5EMrICQFRYRouQ3GiQ1M7hKLNQLltstK7us=\",\"BbQ9p8iqKa9tyq5X0HC0nSnOiJpkpKwYPoXVWzZsgF8=\",\"vsmKA047ive6SGHxrVpI3O98mW56UcfN3nJNj2EOUg==\",\"LrZ8z6KeK0Irn4Sl0FdfxDWzD8rjAwOUgL44TuTr5yo=\",\"ECu9who/FHvwTu3uXXC9CEpxBcYxyG7NLE6HSaE5Fco=\",\"J0vBbIhyG6v9W76NhWLBvxJ644kVKA+7jjEVytNYL3k=\",\"GFzs5BdUmyUoPeBFEfdpEByIULQJ1JKKuDFhE1G9mTg=\",\"E8c/sEP36Xi8nPtVx/qstPTII2dKvhdzcFmsCjLDYAc=\",\"JLOh2DMIdCs2DJxgWVZz4gHN1M71pBRckzxOWWlIHXA=\",\"GLWulN+eyXqqKo8PQkJbzM3IJmoHD4Zu8PSNejdEOYs=\",\"IOs5jLlYzCzMfLH6w4UBq744FpsthSLZ5fCZ8tWQXLQ=\",\"HliN0+yLDSUsLHwMeKArIru60fTcqi54qLju8vTik0Q=\",\"D4vzvWwiujsb86suP7QIGM1CF/+68pTKQjMdTjBDoKY=\",\"A4jJ/PMPwoQdZI9GutAd0QvuncGE0l6ryfYXAhEJzsM=\",\"K7fzl8WUGsZ776iyMvFciFPawmPaeTVVRBqQzsg7ZFQ=\",\"F/OJtS+ep6mIdKSjHvanvrQ/sX2w5JklC7PwGBxZ+yE=\",\"A6IJDqy4l6MfsQVh1WCpruwkt60U0XsUXyDIdaCyjHw=\",\"DDmFNPDrWA8f5L9kVTOJ5nzKRxQ5lDDglhncvuF7oJk=\",\"Bwlayf2kavp/GBJZ42Nf7/p/Ee5j8+53elzr9IIjKMQ=\",\"IEb3zxyPE+8racvIvA1dgJ+CVoq+KzPRzQYJWLHO1oM=\",\"LCdBNqXeKEnebn+S+QlyllAay2jVYTj7y2YMTLD2kQc=\",\"HE1ReKy1xrbs7vI6/G8W7HsDgwlMtkZ+jQ9FB7PPdMM=\",\"BlsUR9DWTOztEWeFuSxjpqfdlwFQfcvouQkyXij3uNM=\",\"ImXX4kSIEiDIGhk9l5MwQJyb+jM0OJUTQOAj57cqGWE=\",\"FbErNVr34FY3ocduZ/nOxvyopkSbN2afaFBQIlazCro=\",\"GhUi/sxq4Cjk0+MClJe4jzXCtIxoevFo7CWC2QdbQ4c=\",\"IvVueegbdJbkcqZBoFPEFLzFOwqTUOJYkkCAMHb1jyY=\",\"IC3bZtCYiZTnqrrWks6sTiMkZyoXq4QX0e4niv0X/Qw=\",\"ErBwHogTxbIajjAgj48RWLls1Ciud73qcvhFEPc+384=\",\"HmP9IOcG4UB8iDjOsmuEyf5pP93g6x4anffoTlPu7n4=\",\"IKFsWoYlbe/9Fa8XTDn52aoRUAZ2rH5XAIgoDdGJYlk=\",\"HI+L+OFT2lWtWsouqu442lY+BDXA8vN8J1WPubrgo+s=\",\"DXcyaHu3v186q8/cxPu2fhWcGYMhPkFsOIAST93xh8k=\",\"DN0ER1qGmZou3Lu/gmSxleEIs7YLZHXYNfbM754vaGU=\",\"L+ZVhs1OdUtMY6iMLtP5ug47+kP1R7QRU1YMIU/jy80=\",\"BQPPljyCc2BOZZEo7CkmH2I5mBXZjFbb9PKDfHJ61Nk=\",\"HuSOong5Bht4N5k29tl8qUALOT71/fOO8Udch0LLM0w=\",\"GkI/jY/IkrItfNW/AZfFdcV56DVj0EhZ1zssHFwEE/k=\",\"BpoNpQEz6ZUvAOYXeJcqe+Do2Kt2yVYWrkZWNqu5fsc=\",\"G/eHndQvLLuRxloJdjVvZ5ZML5Tfvw5EzyuZCRZdhhQ=\",\"GyPcz0hYIgZcj8Cv5hC+cWTiUFYmf2xKgF//1FR6C5g=\",\"Lr6Q1vb9ykIODC4ATOXFpECeVkycTzZx4wEfYnvsfC4=\",\"FnzWkwU1qBbf6+gdIMN253aHdg86L6DaKQsvTWxoY/c=\",\"CIZcEPSmM8VMzItot53yhfGfEhA3TMZOPIqWbU+QJks=\",\"HekC+8C/AZUcolq7OdeIlHIbN+BxhRsDpyzGuDO3iTs=\",\"Dj7KAHaZ3Q+FLrItpkLklfZ8mI3VvwE3Z2sWox6rRmc=\"],[\"DumlkrqalRjQWYbWVvQMIRTEmTwRuymTjSHUcwTNjm4=\",\"8URSNfIUjFmGWHFp/BvNiHsI1NAIaN9Wlv/0CVboZA==\",\"CN/zSH6KyZ4fKaBY0PqAuTDHKHMLerNs6HnziQ7Pc/U=\",\"CE1SDk5btGnh+Qdct8SQ76WVZe7a4tAMqO+IzuorAZc=\",\"LRXZgtmVd/oz2lZyJBb9c0s+ZnovnxXY6z52euD9gR4=\",\"DtJTiESroWHPFXikPPA2TpFgH2U2pZltDvvmVjLEG20=\",\"JgDCfYefvKGG5znmNjxxz4BMh32Cm3NdzD468ClV5go=\",\"KPi9RKWDy6pHW9FTlkMOfMuZpVF0QN/ZcAWFWCgr8sU=\",\"Cc19TDgNxUiHgarQEufq7x7TFNf2l6VXLQMMVd8VMiE=\",\"Ebtu4Skaq7IGEg7KrORg0ktnE/6+giNJUeK+59D4VfU=\",\"LXTo+gY32YUzEPPA4/rh0G8XFYD1uP0FNJyt7s/OsjA=\",\"JzXk7J05vf+sm+8xusujOLGglVmlEaGL5LTTFu2IkDM=\",\"DwPB6eCJXbGl2mMS+qeOlxEGwz+Cbgjc9hfiQhMTLf0=\",\"FwlM0pe/gnyvkpICBbcZwYdBCQuPd3gRhIp+nq1neMQ=\",\"Dbj0GcIfkkYfwrMhlGV5g0jfkNQXgELIG6fUtNVZ4rg=\",\"JDRDYT9k/6QXQn7Vkz/PvGaAnbYLnKFySiJwnOzu7OI=\",\"Iq9J+/1dfp/NJWwlwH092Oy7rm3uzQOqBLsZH62nVBE=\",\"FPvTf6itbk4MeKINk8cjDEZ395e0MnMj9/fAl8GUIOA=\",\"Fakpi7uIJTTUssn7xuTvQYlCDE6z8+HqIvqn4Yta5iU=\",\"L33nXyPdqqUiEyPrzrLyrIPu+S6FTnVDTC8dkFYiMrw=\",\"A2pEMqhoKDt4oxXoTErlrsohby/56bLmI1hPdHnNXCc=\",\"IYDXeGqM+BDidyGKsUoR5eOfPJYvEehgrhxWgseX3lw=\",\"CiaO+HBzbuvQy1W+ZA1z7jd4mQSEzAPOU1cjd+7/+OQ=\",\"Hu/v4RwL5GZPKZkDHxWZSCnpgujJDgkGnfm64WgJpbI=\",\"J+h/AzvR4KicpZboy3f+OkuPuT2aESmUZXGjw88kTFI=\",\"AUmKPmWZ/iQzIfV9bFQ1iJl5xPnSo+GE0hRRgJF47jk=\",\"J8CkH0y5/mfp3U184zcH901da8wjW+8Qjeobvr3lB6o=\",\"H3UjCQixQbRmNyOLEg/HcPT0roJdUATBanyR/h2uKA8=\",\"JfmakZjpIxZ7uoMbFf/9LXuXs6CJgI1OsfCghb7iFlY=\",\"EBvDGOnqWSDQ9qzcK7UmWT09VuyO0UxnYil0IoupAMY=\",\"GhdWBwZ9UXOXwTNOywGXVOvAyFKjzwkewczEMgeoPHY=\",\"DwLw5tJfnqPeskXz6MOB7msus4C6SvXBxNiXcBVd83s=\",\"FR11esyCN68I2KZncgPslpJWXeRWrnif81izFjs5O8k=\",\"JWzZV3zqFDBJ4KH+AGjdIAhJgO5bdXiQp50To6Yk+tQ=\",\"BROrr/YZXqSIM7E9pQ4IhEdmgsP73RlUl7iuhuGTfGE=\",\"HZVw3HCiBfNvYQJR7m4ugDkkboTkrESDhtGdusTkplU=\",\"GPGlGUdVuMXV1/G/iqpvVu/7AS3XhM9eBE7sULKfydQ=\",\"JmtTthXvc6yGZRLAkeSk8vpLsK+WbvQg2IFjI47rvKg=\",\"LWMjTJIHQ4qkK43idkTAImgwTf64yJoaP0/W6DRK4Pc=\",\"KrMPvlHuSbx7Ot3iGabwtfu5diBe+N9+ACHa7m9VxpM=\",\"Gu5tSz6+k2bcuczkiWnU3x3EKrzVKLJwBo2SB/pqRck=\",\"GJGuq3HjS4laeUUuWGSuHRH1dkbGC7NKohHRI/YJUhk=\",\"JEkrX5XAsIdkN+lLQQHGkRjhayZXdxvTp8qrAcgYqks=\",\"AXUhYbM1D34bOyyGY6DWQpZGKCE9ZsEKsv3fcbz95o8=\",\"CrZ2k1ci4vZ8+4STjmFMbC9EW40UjeVDaM+4+QoA86c=\",\"Cw9yRyuaL19FvHMBF+2a5Wg/wubiJ+PU/g2h96o0gYk=\",\"FqpvknOs1WMcIB0aUvxPisryshUsOubfE6eKUT7c02k=\",\"L2C5h+Y2FOsTwyTB2HFusL9i2bFV0jKBpFwI1SQ1zWA=\",\"GNJK4B3ekv12Brt4hFVOnfHLibBC9Qj9nbdrfMGyEhI=\",\"BPw792/jHi+Nd2NzEw33nRjDGF/fFZOWBxXUckz/pYY=\",\"DRj2tT/GlUbP3WcLQXMr323ungayEmDGtdJicEaNv4I=\",\"ukIxqRjxOs7BH7r6F8UiPx9wtM2wRQNvpdcEW9EOJA==\",\"B7RYsuAM18YQCYUwFmPn7DPIJtoGNf8evt0N2GEgtMg=\",\"HDXC2W25D09gWOdvFaDIKGu6JOLtQLFs7Dnp/XuqV5k=\",\"HRK+o9jDKl12ZWjwPdHs2wpPWJq775aUXg3eaI4pIFA=\",\"DZU+IAIgAycFJfmnNSbpiJyZW7Yv3qlDE9tAWmEwAoY=\",\"KfBT7DiHldeGpAvsTIdQR/Bv8LYQtAQKdg4zUG0mceE=\",\"BBiOM3NfRrFKSVKphGO8EuJk1fRG4MP2S5Z5yqrkT8I=\",\"FJ7CiEbU9DioTx0FKUMbuemWpAi36X6zvxc1zb6W9o8=\",\"DeIPrgr1GIvKJLX2NjC61Hrq/ZjmUZItFIzOHF/d3ug=\",\"EtZQ6PeQsSU+qUNQ5yKtL32DbCNLhmDt9En7pphMZwk=\",\"IqtTqjnzStMOqWcXunRGqv2tvBqKvijXg0DfxLq7j2w=\",\"JlA+jUhJvfVFDavqeQe8PeDeEJhx3XdpBKEp25FJFmw=\",\"HV56Dill3/oA9UVPUAPFyOw0sj2Jfn/EyAZANbDTOFA=\",\"DuPY2qCYvuAS2Wt+xIRIxryaau+lRGFbnLPHu9BxBMs=\",\"G/KCCCoEl5lV0wdUzU2QVvqe96cXVwPZHcIytfmOrQA=\",\"B64TRKv8bCzj6VG8MWvuSZcWRfFraTczoCchc+6a1GE=\",\"IX46JHgnw3bsIbEx1RHX29yYo2t6R9l6XI6Jdi7oBIg=\",\"IV/+WEsOsGegA9Q44vvii6vh5Q78KJQRdQm2Fq3cMO4=\",\"HncPyOy/3IaS3O3Fl8TKD77Bm4TjPaV0EqktHTzj7CA=\",\"L2JDzakZv0yfHjqKbWagV0KRT8GTOLPA5Q6Cj2n/bR8=\",\"JG793DEX7NOVldAEb0SrMDoZXQ6cyJNF08A/+HoRtpM=\",\"U+jZs+pbjtT+AG8TnLxOAWixyJqRjfvmArxizsat8Q==\",\"G4lKL0XLlmR9kQ9qcQ04t+tPJhvu//E1rsBMGr5ZQns=\",\"CusVVOJmaT2CEmUkeRB9X9wHer+IZR9aQlU9VOwkLMA=\",\"Fqc19vcgnSTmiIaA0XgcfwS6fXG9S30OEfr52o2coo4=\",\"BIe4t/q1/I/XwTtN8FQ80mDkvLthWxk3T/VJ3PBz1Bs=\",\"HnW50sIAYwcSS+omsHckk8+11RIGjDrWd/31HJI4h5M=\",\"BRIOPQ4oADwlO0bV/3fScq5G+h4jnRxslh3LAto7OI8=\",\"DaX+tTRXZJK4Iuh2MkARmsCQCgU7Fxgj+JD1/VXXg3I=\",\"LiEbOaAjAxoirMGh9fO7bYwmZqY3nZ0sQMyPeLe9mr4=\"],[\"GbhJ9pRQsGhI2h05vV5KQwK7hnRO3CYjiwh44mntI+U=\",\"Jl3f4SfdUb1yOTR7dY8KEyDrLMdFCswdrUf4DI3PNNY=\",\"GZdQ7EcvGAng9mpUXh5RYkEIrIRQFcKqPfw2urSX2Ko=\",\"FX/z/mWscggRDwal90MCsU10PqJQZ/D/0DL3h8fxzfg=\",\"Gw9o8HJqBRSk0Fs3e1iqvEWUWELnAYN4Skq1oyM3uPg=\",\"EijSVleHFAQwVp1pNC03TYVQnepCRdtHn97xpCXidSY=\",\"F6h4Ts3N1uVQh1w2qJYQ97jB0kXVL1P/lu65EoNYXgs=\",\"CYcKi0UHIqKy1e566GWq8KoArc/DFSCjLgzqolCq668=\",\"Hh1qqpAldOPkBVxrbwOkmyu9t4R/lA68eMCm0/k3KmQ=\",\"KBbE+msIVIfh7sHu/ZLun+9A8wGQrGEAkQPQMmZVDbI=\",\"FzWf2Ivja6hnAA6D92/7RmYGNO+60V3PTU1QLUJ/9Rw=\",\"DjAEy0S6RVo/Fv770MAmQEy6wgPA8ja6rYeWELhmECI=\",\"ClXydq8c6268bGgg8zSybxHKSvmMgzvBtJYZPWsEp8o=\",\"Ae5LBFitzUxIYaJ63BQEpZgdMgtrjiDlHTG5uHfoNG0=\",\"FDFeJ1Pn+5T3AZn4ZF14+HwZSkBU5phys4QdobT0gvE=\",\"K3tj7P/VXZXGYPQ1rZ4uJfJmy1fhfr0baw116IpqVtY=\",\"u1b6Pp/UirRtTnKVu+EgS2UuvpWCIYYPVuONuA2DwA==\",\"BQZTv13Vnt1tFfpgcfUAUFchizOo+SpYucJlYIEkn4I=\",\"LFdUI+JLUiZVxal2xl0GkoeQDI1YJVFAmMWxPIbx/Nw=\",\"L/OizN7pHgmjL3QjK3BM3Zn3LB94VXos5WiwfiGAcdc=\",\"EURzSQGoHBVDuLxvydNl9QRp64mUlJHTaT2+nGI42Qw=\",\"Hv+alU4kvNSvILardNieHNOLxpSp516m2iF6mNuAzSI=\",\"FHB950lsVjj5f+m9fUhcIOrWv9v8BZl5Hkn60DAc1t8=\",\"E9DeNBuoGfkP4+8ffOClTYU4rN2bPvhAqR1I7lNgQrg=\",\"JlIKsdIAVdre1xLVmwcIhFjBivvQ2liu6fFRqQM3K6E=\",\"Boy0gnrEhfxudTejwKBtCKTCeQ9cZdmGbXUpaZn3SV8=\",\"B9a6qi5YfCGwPfoOtxE24pgss4m0OMi8KCdI0OZ06J4=\",\"FbktNtsCyxa4Me6rLm7XXRJv+8J0zDNiNwhRUm3hPSc=\",\"J3uc6JEz3nt5GK1fz6tzI+9bnBkWtYjNfloNgUy8M5U=\",\"KuhHtms8XXO3C3MwQKqGxR9zcJLWXDSS1SkAD6GAKyQ=\",\"L6Porh/vl0ze1qum3CXPVn4W4K8p5nVwZkPyG/jv1lE=\",\"Cx1LlQjOxNGapT9O/kbFeVLb02j8vNRUqLEIe8GKIIg=\",\"AtOBAU0BV4uIizJzJwur3Dk6w5LnlYvgR4lH+vpWm7A=\",\"LnmoJ8hUBiQlI6lEMQBwIbyGWkXKvLpDaMQdRIb+/sg=\",\"AgfJm31ZSlxh1+YMwjZcTAyATNQ0CYr2JE8KAMJZs0c=\",\"EZwSQIbqWOu4PxTyYsaTQkNg6X5vtCroWWutvp7bLco=\",\"EE/zjMoPABc8zQtovdugn8VD8HT3U72OQT+DNPiHolE=\",\"L1tTd70Vb4mEWBHrJiQ2Y43AOLjLEOFHqH30wOI4QlM=\",\"D3Do4C0dI5aJMKjg22mxwgIE8+O0zs0QH4FHbQteqZY=\",\"GsRlOlEHGuci+QoD8AbYV1gU23grfxn2B9rk1WrVhrM=\",\"ErEmAOO/2Oe9+uXvnE84BfpB50rKv33oF4IwF6iyPbk=\",\"EbnRmQiRnay34PjQuncobUF1KaGKHYnEBe0cMCif3Sg=\",\"LDUNJF9PdYZHRPiNv/j+M1sA9PtoiJXBNjp0hKzoINM=\",\"Fqf3b9KyFH2275TCLHi/94LeF+9z5S2n34JgP0IrRh8=\",\"HRjYAkvh6W7CViavBqE59gk1RapQQDPax+KF0cw9s94=\",\"DIyrGtWZgHKUW5uIIo9TwpVGaBn7lNj2qe1Em+j3wYw=\",\"GmjRM9cDzUBsowBBkTzjQjxzsTOEGHqxUwEJt1atT3o=\",\"JKWLnobOgj/0xFNClBQX/yPQPID83vlJjKDYYIVeAak=\",\"DmMVyT+7idOAIRSLbDUyD7eTxBxqQ4bWrtas/i+VLFc=\",\"LDgG2ZppzmMpnodvXyGMcpXYciR5XXVo1VhpbjTGkvg=\",\"BZyJOncelHdNSaNWSUVo3TdoVquJcF3/JduCc4YPoE4=\",\"EWbZgZxPquiYIkPQ3rH4l3An1cxWv1LOJgvsXifosPU=\",\"EoBvqz/LCfwreUBsPCA8SWX8clkRKvIQQxLhU3Mn4KM=\",\"FyAV4OM3NgWPYKoz6C091z3D6tifmN7Q26NdzB2L2iw=\",\"B3uhiADYUtCjT3CujP1ooIApa/nUehtA3n5v1jkqDTA=\",\"IJTs12i/qPDfDXjQ2Ubhr/Si044CnkFHnW48D+efqLk=\",\"DM69MCr+hMIP93TTwfZQynzQvKCLqh4mHanHRBqCP4k=\",\"W5MDBTu0DHNnH11VtAUuDVVJhx8bUoPwFIWmtWjNBQ==\",\"JScokISrSSJ1tM1n04MRorgW6qaO5r2yOJ7u/WukxyE=\",\"IiL5c4KQ2NXyo+rNrZXxLNTnQX7SZhsBL2RIx1A4d/I=\",\"ImyCCPJtaea34C/iZVfmvRYPy+J+50H9HlgRYcF4k1Q=\",\"IWsgjAJh88kfr2CeFfep1IU+QNkgRJayRBEV1zwpQcU=\",\"Dg1mDgRqJZ87rWgpcptq4xUfvNdd4zsSL+E0yj1aTdY=\",\"JA8DnSAmsyZvObpcTsSKxqzoiq2u+ZFJjNUtqqD/u6g=\",\"KMjMz3tAosPP0u7g7E0WCodqTf60CP/jM+kvpeHuTXk=\",\"DX+BtLRtTyR8QkPwRahSzJV9Kykj0o6y+ne1qYRO/Wk=\",\"K+Qy+HssUJSoLHiEV2Ud2M2wIArDtChgy/VEdZlrdy8=\",\"E+o58tY9mtrhh68U3Qe1M9RaY0NeDqTl5VXTXnDUAWs=\",\"KeOxr+GXO+nNHPSwRzJav6plzyuY/zrtR4cEYZd+ySE=\",\"CNt9aE5rhBtelpJJj5Wh+VChzx62OLtOSPO8GjxXEZc=\",\"D08QQal2qgUZbaHAQhJOMnfqGij7bu6rS+wSQ70xYYs=\",\"BanQUm1vGMhrJV8A6G7DTn+KJsJRtRwh/kwSvcTA/x0=\",\"KEsDBN1s5mm89lDFq4XInUQQ1HKqbrAN8bjRflLy8/8=\",\"I2PpsBoBY1mJYv+GkHAC+VkC5yUEkpTKerEMx6o/Bro=\",\"AsLbEmR8TARh3TKQp1xfL9jX8RWz4EDLBd1+OtJg2EI=\",\"LjxC9nFDH5Vg89CGOsRFBSQi1bmT6f2muBSGsU/+OnQ=\",\"HThEHyKMDOIv8oglYPXX7jtMDKoQE3HLd4L/2Xr1//E=\",\"JoFBsOScWeqx1XPq1OLh83k2TdEz8s7FdMJa3ix5Qoc=\",\"IgnLLhh98VIoENPyiGjabPUq+aZdvXuAYEn0ctlmN0o=\",\"Cl6yUQ5vgE0YMNeXSsFnfQggNOU4i/rukaMZ7KfB/6s=\",\"HLKGTDiABzb4862YZp0616nV7lITjpa4pwFeEInjauA=\",\"KvjtBb/I+K2lR+6bxsfGxejBXGwNOAo/mqJ3JzMhtU4=\",\"D4XRWTs1vgP3myIohVVaJSvx8KORHXhBMsSbGpasDzw=\",\"KQlRkuxT4LhZ66RWKV2VvEVn01Gm2tORuLiXB4VQCMU=\",\"GpLv3h9fpWrrArTEuPUayAgx+JjHhDQHET+7YBEXeFQ=\",\"KgXo3u6hXkN3wICqcP1qhtxz8/36a1X1YQYUwYSwsC4=\",\"EhGfOwGcw/xG7MgIk+hvUQsd1AMLLOKMna3NHnGtSJE=\",\"BCtv/mh7wjor9rczFyhqVDxg7RIvwiWq50LDocLdOh0=\"],[\"DrVE/uKBXdp/U+KcysmO19iJu069R8OGTzwr2BptqJE=\",\"BVTXNjFbhmLwL9un3XN/vKGXrrEupkcTunM/KEdRKMs=\",\"L4O53yWbK2i810gFYwfDd1SQffDA+wA19Qh8WNXowtQ=\",\"LKcOLo1/OaEkR6yDBSRRtGHxX4tBp17zGRUgj1q6loM=\",\"HLX5MZvmpF6RsE1yIicclJlBlvEu0ixdTscZy4Ps/qk=\",\"CpwLGRao5B02DQLm4uXRuYw0387HaUKchRhn5G4Sb6M=\",\"Hda6NzHknSHo026dTR7a0kXr+b3Z67YKJS5IBKY5D2o=\",\"JK4qZ8PVIcEaEbcRKrve4wZHEHuAiGapgIN9DX2k4+A=\",\"DSDJMQtcFNnvEoZq9aRerjypvhbSAElwZsiy7pZ4HXA=\",\"DgR8mCH+lNVdQA12OmbExhaZk6vtVDxyhLSjVDABlEU=\",\"KUdKt5mx4TlI7/QdLOeb+tM10JEQFXB2mIrCB+EMgd0=\",\"A4mfE50NxLKBvjt0q0xweJt/QeespH6iciog15r7ypM=\",\"GGZiT3YauN16kcXzevXkdjmVHVrLaxu/O5bKJz9xAp0=\",\"E8EZ82cY99XwmthUEyWhOs9rNNttnuKvfqBgYSQPMAk=\",\"DkoQCBWAd0ArEfE8CIkLc5ZDzI6T+kRIe1oVdd2Gf9c=\",\"DvUF/USsEKJRtnDa/hTKvZranjACIQrJw4dvN95Oetg=\",\"HTHk4qWXi3SRxD02dHClpdFEW2uBKaW5pv0jhAVyDeU=\",\"Cpea1UKNSBy2JNnVBFJKlpTKXLRCG10dxq8sAw++rDk=\",\"D3/M0uyLxu2c42gvOKopHe6pNz9JlXeL92Kt421qsqA=\",\"JpG5JN+hIwBffAeNm/hwbe/pnCupm9buU7FT6f7Hu4A=\",\"Agd99lELSGDla5E77zqA28RksORnit1g3qepUXRjIgs=\",\"Ke4J2K+dJMpJNQzi4KpH0Ao9whuvv6wcm6YcWOKZPow=\",\"CLKSxmHUJ1BrmgGRZiTzzeMyqs7Z8aSUpzPOpvJb+q0=\",\"JYNpnOU2p1eyLkcT7fuwUAkshKvHLJCthzk6Hamkz5A=\",\"Hj8bZgIj1lrYiZlHU3T24l/UFI64EQoLEs/6GWV7C2Y=\",\"IPPsuzfDSux5ExRVRhJZ5ZsiLw7o4C8xlM9iqa1MNEg=\",\"DfT1CI5ERPv4fVU7pi29qVaW2LnPYhCxyFUTsXdvvGQ=\",\"ArNI7/1MnO8Aoc9N1n3WZLL/42GoB8WJolLGO8v8aDM=\",\"G6HlIvyxU2ds2PIOgiVvAyfAAPqWsbRi/IS1VvJqhsc=\",\"ApTETfjmjJYUTpZMN7vFdmdk7TVQr/gNvp0/p0QZ/lA=\",\"AxNxbuxtzYpgLKBAcASY3ATHff4hlHU8WbyBjB0mNqE=\",\"KH3sdGltZj4jWfaCJd6VU4TZYLuvuQlnQppELhnj7GE=\",\"JeQvcsa+CUIxG6CXzzZWg9tJYsggT+ySE/D49ywZRr4=\",\"EraIG5ZlT+F2jCQqzVOZsIY58IGpSJb16m2nC2tHXJE=\",\"DfwrVFRv0yZ9e+VccWyyQ+8YEY7ZSYyCcESb2UGK/bU=\",\"J91V/g1cD/Vq1IkPoCnCfF820Ezcc4mauZsocrKO7fA=\",\"DGCWJxGu8W56LOWfWHRD7ItB743PzLOBiK3L3dMvFz8=\",\"LtwJ/rJnxrWG5i//4yv18WwotYWYa4ERZoS36LQNQtI=\",\"Cvg4aFnbJS/ylaGUZtjRAGIskFAhN6oc1MS8yWVtEeI=\",\"Eh8hg5L3PUwWq+OCECpFnmwICzyk7aUaI+ZRoTpoBVA=\",\"HqOCc/XVnmUGH4x3XFcf/HXvZ9KUBbXgKRPLMBnVb44=\",\"Cb0jSQBWmbzArDW2J+L48Iv8OwvzCxRvN3QqwVVhh/4=\",\"CRxQWx6SRIwRrqIqqsTUT2p/ITL4npG39V+UBGlsFDM=\",\"CzFvHClonU9JD3/N1eny0lbUQ7oUzaS7eZsFc6kxqZ8=\",\"IEklGRmo8/Q5gYi4H5nS4tDj9TWc+lW986p1/a3zZ+c=\",\"H+f562eIEBkIgUFo4+TPeomaEFv55YSvAGQYikqsVb0=\",\"FY5lebA4gVOwrNYw6pTej22WbVKcLQG56bHGfB7B1XA=\",\"GZT4LycVOvud4qo/S+BcSyxIfjk9ztyiVmqmt/vDaWs=\",\"G2JQVT6GKaWopAtWhDLOfb2DyHYD7szI2tVyzOvvbh0=\",\"AgKWlAp9Ht7Srnn9ePoqwRq7IhC/JFQv6r7nHw0NfJ4=\",\"JVOUP54P/OnCl80xwp8fpfAYg8yeUE/e16kFAywXDIk=\",\"HFbrNiiWwvAK0Y+urwTVd/X+tNtOB3llw48ur1974Iw=\",\"DtiFcgXgaABV3n6CK299YqwPdf72faH/e3c1IIiFz5A=\",\"ARj5EYWgk1X52MP1VjZ6K+vnnn2VKKjXKlkmgWcarHU=\",\"KnHmpnq9slp4AQ/m/gog0dhOIcunWtVZN9wYNME68MU=\",\"AjJ9vAWZfOhXVoDkuJKdTp7SX7kgQnfWAwYZhtvuV+A=\",\"DgUjXgHyHMPylxw4LRjBTkF4Wl7I1EfNk9EygXkubW4=\",\"CYr6Lqf/Blsq38SrAPOwRJbB5JDqsmTSNwsQflpJIE4=\",\"J73be/BuqmNBmtrkQgndJaTjXty4Y7AJvTTMxJBdIEs=\",\"JwRAa8gG9MyxkIXLnTdxsSq1znqr8GAengaivJiDet4=\",\"IcdcVGZLn+yGdWqpAnJhl1JE9Cz5HJzAszwqYrdWo+8=\",\"K+hMHYTBYDjqX5MykGmdqqqBZMXqOaAry93GbPaf6Ow=\",\"LJcOQdSGSc8BPGdsjGiKwWVWNyDR1fMmKKxbI5SIqW4=\",\"DhrSZgoulY2qHyZUs6N/7mBUbKAycVBzMHB0LtyAZDU=\",\"IGDuf993X8fjiaVTdjdMnjXVyHY9WX9CYwTiNvV3uCk=\",\"HgEWgYyEPthvCdruClga8Q1S3ura13ZW5zbqwI5vDxc=\",\"ConBSY7yWjg9iGu1hCTmlArDmePlV+nelRppfFSnV2w=\",\"AwN0PW822SXhCXSDNQ9b0sspfU7JI5IJ9jxRa4SaZ+Y=\",\"CM9ERG2WhDAjLfF11GK5ybDi4sN+hAZ2TLlsfDRGAY0=\",\"JBmBHLrrP1UbCpIy7uXVPjdp+89SOVMwdDdfGwB3fxY=\",\"QjfGImJts3a3dISdu+h2gJCC8bE/WCT0xYNp8n/ntg==\",\"HltJDHLutgfhFKXLh6hJSxeJN83uNLno6Uc0LBRFRVg=\",\"BCZTM+WeGl/3SSA8tKXRQVpyhixhOAscJC0PMsoVuXo=\",\"GJ3q90JYRRrE2mglMr5D0kpcaDKTwf90ht4m012YLoY=\",\"BOxRaw/UL6U6NJBc/e2q0CGzY5nQPYJjrgjEavPsp28=\",\"LOHIoAhFqCs6obZkL8mIV4V2zvhhllJebVlcdwGtcA0=\",\"JHgW/Q00+dOzlpF0eGBclKHAUqbtZjvcNE567paGtrQ=\",\"xnbb5sSU1WCcRE3mIrz2DPVVCRpQf86GR3AZ2uqYfQ==\",\"HLOVreUw/CQHqnshSNLfruMPTd8lj8FJzOPFzegKhdU=\",\"GQ4UlOPP2to7nmXY/jwex2lUDaAj+ewuViWfalaJCw4=\",\"GPKUGyM1E4M2w1GnkjQyIqhF7goupaO5FgwdbZsin+I=\",\"FOojzosjEuB99X4K7OHaXSwOAfdX5qXIarXkA2iFRNw=\",\"KBitEAX077XVVDYaKfheoQlA1ucfOOg2m+/zVjpmC74=\",\"I846mlIpFaKBeTl3tJBUw31l+QuEHgypCBe6tJ1520o=\",\"BsLtK+h2MJqbO0Ts43scQjgpJ90EJJZYo9QePzjV4CI=\",\"GLZ0D3LXfrz2QrlFyi7WyKmFOjdJ1/q2BR5Mo29E/EI=\",\"H+rLnrKmh4BhN00Gmp2uMoNp7mPnWhuZzbBqSLDZl2o=\",\"GkTuRWWpZ2RzAMde0rJUPY1F1Ud/1gajVtEHO9E4MdI=\",\"BB87O1sQUMFr89Yth9XSc7Bn2khGeRAyMe1loY2p/kg=\",\"H9lYzE/gopC9D7+4uKUTrLWJjWO8DX5YW30IHEnrVlk=\",\"F12roHxe2/hPCch6jDTdczJZQ6SPwSy4OdykdRJWHS4=\",\"Cc8KTm4x3CTf1aWieneDPkd9Wy2Sz/X8XMrZUoxDung=\",\"EtSUZb1BIMv3jlo0FNRMZTC8ljvXAcVNTGQYps6+gLE=\",\"EBsvK2dYBNOyayvR4HxzZa8L/C7fAQkW7vs54oIV1Eo=\",\"EU/GX6ugmll0ngtfERkweDUpoGOEViFiMst+WjOXNqo=\",\"Hf+ZtSeZr8gCwrv5tn3QRNPLUQF9xPiDWN3Wc2bTqfU=\",\"KQ9ElqUt1N2lntzNcyUDi73AVUrTqaC+eTHJEGKmcCc=\",\"CR6HBGY8UWw7lnIdIDPZhQifuZLcpIyN3Ll9fRXH4Yg=\",\"Lc4iWZ3gQZagFp/CEdD5yGkmQ6oJco6t9tULtTTA4yM=\",\"Kaf/ByDhcMDmfv3nJ5Uyj+zvZtqtpfDiyoWKjGE1/Ug=\"],[\"FEhhRZjgD5jnrn3qRfvYO9loZT74OQzeLoa3Bq1AxlE=\",\"CreykTiOXJ5DwNwfWR+4Ps22UCLhtwr0O4p7QMHf98M=\",\"K3y7IXiW9SyajAiOZUryHoTN51SjzvWxXE1UZmEtat8=\",\"K8aw3b4dcBtlcEKL3Byhvw2ln/O7u5X8K8ccDG5nplw=\",\"EjpVoxmAOE89ILLOy8RO1gw4wR99IOknHvq5qQXu/Tw=\",\"A3UBzIydyBkwmnafTfCY5YiwGFi8jrfieeKIO+n7jFM=\",\"Fd4jFjeo6jRzwkmeG+4yDBfGoKT0ipsorRRE1TUd2zY=\",\"HJsdo2mJIG3pFzsN37U5vfB/id8FXvwcxIkALaP0tTQ=\",\"Hyjsn9yzhUyzJ+Pi/jlYVQw3/ReRmKQc8goaTIEGVMs=\",\"KgQY4S3SbnlsCRvB+x5Q+CkCY7PID2gDbmWTwtsvg8Y=\",\"Dfa8mQ3WiPq8H4pfj6Aqaob3o6nuRS9WhNEj6sFQeJA=\",\"JM2ZqzAe504jguI4vplB2YdvMg6ZQEgWR/y/vKfraow=\",\"EDbuxrOrZZpQwirjs1clLmRkHOCC5cCEv2Gk5hGYrIU=\",\"IezhAwv1rVdZ81upavk22Cpkq+T5uy9QwopIggkoYRg=\",\"Ll2QWeYjA9jRf7UJpgr9xNjuHZE3+P/w0MbpE1qvZss=\",\"JZHYjBFYC3XE7fRNumujHGlvZ4niLT+mO7ruccaYaFc=\",\"HmRzRcEIAFp+L4cPARQiI7siq0SgPHGYhSqvbXZcO90=\",\"EH4nnXEOZTWO9E+WbllNK6BOPhXjfKWqURetxxtEHwk=\",\"Fzspgpit9lmz9pWgL1Fhfsyn4iH2eDdUBfIEBeN3pEw=\",\"EiigzRBZRocKzHWGlp5+Oz6NT19G1FCxRpggKtueoc4=\",\"B3jLRdmMDsaISb8gPcexUYQJKMydf0BnC/fUizxmHWg=\",\"Byp/8ScG+js0ADCP6zPvPd6uuaVni9Shff8Jb6menmQ=\",\"KwmXsBFlwodFA9wS/nfWq1ikTFg7k5w10IBbtVXNCfM=\",\"CAgFEpJZr1Di5fLY773jWBMtocGfy32vSJhUkcnSh7U=\",\"FD5OHyr03vGxkDig1qyWBuM/QHBHmfCJC0q6Cy1suSM=\",\"HBa0R98KMCbVuRI6uvAtaQdsWRUwUmYN8je1IhSF2j0=\",\"IhJ2NWShfFuBZwPl5Sp9sMW/tmj+LkJMslE2FCaDC5I=\",\"AW3TCkjZb3bpN49lvDQXgel8+5SvWlcJG/NBNCwNem4=\",\"DvrkpWlRRlf2fhnKEcAeJCbvD6or7Ujv4HEdM46juGs=\",\"KB3NUy3EUL5VlTbiUuAVnuIdW5H7+XJfSlfdhw2A53k=\",\"D+TRGos/JNxVm0o3EY8Vq4Pa1adN+u1BY36ZSoEzP5U=\",\"GFeTjgJ5CBkygnipEyIjRGQPIAxRQQRWCJdov86lYaU=\",\"IAfQQ938VP2Zn29LY9TKZsXxJpUTiM3bHc3jKUQVVnU=\",\"I95muSfVdnksaaLG598g0/x0VhT1ICeAvCtML7J+njk=\",\"K9/L7+NT+i/+edLv1aUcmBNFot5A71x2S/kNqG/tz+M=\",\"Js/8DlmEkzMT5PBt6tB5Q4gNpmkp063td+D6f5lCRP4=\",\"IcUyrQ1QZ0vjlH/y1Ot0Tq26ooEvwPwlpBy4TA/T77g=\",\"JG7PLuRTGGLMWi14Qv48eAuGjvRF9wyaHiv/RhScxG0=\",\"A5ezmAo876D9xzOcT5UAs2Q8VKPuejlgAwR0Gi53LpA=\",\"FESQlXZ3Y2qae/ErGsma+VXqcJmbL5ciEVUqx1Ysau8=\",\"SpZml3eTjNlkP/JX1fVsX08eta3qSaZ4zsPqFwZ/HQ==\",\"JCOlCHFCmoxIuhPk35OOYoDXFbOa9DRJ/wYDDjRuPis=\",\"HKUGQOj0LAPCiAFOjvErgBTDxApi/FhW7ptjMUbsYCo=\",\"CoM1wvp2LQm9oet+IrEcwRffeIwNAj1tiUdydoGnqes=\",\"HFevemeW7Te9lkwzzRvJyJdHuiHfYQAgn8Pfn3B/HNo=\",\"CPCtWmwB8L3n0ajn0mhIF59e4x1tWbuOLHAeN6TPuyI=\",\"BQx4IcblProYWmJ4/gSlwfLyhkG9yEPJ+rKsiX6KJGY=\",\"C8XURcXfUvubS51pVLx1dj1TsMIImDLr3KlgVnn2jQ4=\",\"EKayoHxHLCoy6dwfBQH72lyfBbhh0ceKXP81lBl7c9Y=\",\"GiREizRCR5x6yBkb+vxn2cdeQCALMY98ctDC2Qiz3bM=\",\"BeIwx7kdwGeALGyf6tUIl8AzeTieKn3vNw70wo5Wcb4=\",\"HurWhdnzV39+Nk2kf3TY7iz2zuMWYAVWFdjylKMClKw=\",\"BKIuqhB5G1mxvYrZYm33QnVTXr6jAfj5EsUh7ynFBLE=\",\"Bjd7YGFbe5qfDrInZ4bQKMyoL7zn2xzCf1C4SGyIBto=\",\"x2SV2keLvf1iP8rC87CNZBxMZUc4+tZ7npDqBxVxTw==\",\"JQrWuU4b0GgXz9JCFCOpXhi6hysnbBmeFqj8ZQxanWE=\",\"Gy4OZhRvtbEiHIeChqCYPpA+apU5D1fSmKUNzm9Sq0c=\",\"GMqJCq6u+Xx8F8qyw1GPzPEYC4+9E0+8vOOPeG8sDgM=\",\"G1w9uU2eDNRVccG4gIQYbrWJMLzs6yyPd1sS83lhvqA=\",\"BilMcmhqabYGk0mnOoFULLFqatcTN7fH/1pd/gaiYK4=\",\"LBiiWowsrhebGmQ+ERWej1ydpEiq7jpE3ki+Psp7slM=\",\"D8RaK5vW9BkBuqevrUDMKNRHnDBNEBBnw1Z/5EkzLrA=\",\"A3i8O1oyz1ygiCJ8W28KVm4LdXM8cEgEYZ5ql5vB028=\",\"AlU3U0a+q9CSv7/XJ4tDe908GL2VHX9CIM3FATYR/Z8=\",\"BSSFOiqXF69kUA/sg2wTgH5ZeL4yiGBHvTaDpaZbaFk=\",\"GzmYVTFU/CbOiPBIgWDCROHexki5MMEy0HfLk5l69eo=\",\"EgdLTYPpL44KuSQprrUnAUAzipfujlx08rWZ2Vd/Jf8=\",\"GkCx4BoJbqfrznTAJ1NrxYd4tF3O+3zAViVt0HMmpmI=\",\"D1IovAlLnuwZZ9d4orfWtN5Y7ejg+XQWXTerbyM2vuQ=\",\"JzFLlh0vlpcJd6M/L6xoI8BDIH5LakigVTfqeNd5wW8=\",\"Knj1vfmK+h2m3UWrNguHdwPh+fDnl/7MpFMn7kq0ZZU=\",\"LP3lnKLwGif85VTCZbwj/aMt3Z3/PdCi8d/d0HZMILQ=\",\"AZJafRys7lYAEPhD71/J57ApRmfYcdSeNSOoj+CvVqo=\",\"GZ/0u6+U7jh1YPu+w5XbGvnu2fUN1g3Dyiy5LpJFImM=\",\"Jvf5HZWc2ukZB7KPsvFJ28J18T1Vd22lGoggD458rwk=\",\"JM3dZBt8o7xsTSV4MqWuXpISbDvS6fBeAScxEU1i0MI=\",\"GFR+31C9d7JlPCpTKEyZnc5dxp3WE4BNEKDulrylVzg=\",\"KycXjspLeYunKy5rVmvf7MsqHmDYUE5MjskZLyuuuw==\",\"MCDriK56z9Y0Jwnz075FzywUa83JBu5XlSc65LbnAEo=\",\"VLgabTsfACIwxM1iP3ew+27so6/vr+aUVE7u7BoXDw==\",\"BNHgPJNRC6b7Sb2atRBj07FeSOLtRJvaJ2XQMGX2z/w=\",\"LKaijmuYuMgiCrwJGi+v6G8nHu8dk4ZLeyu1oWDdjZk=\",\"KlhmAGeGUfFEvx5U3j1vj9UZ2q9KStmh8yIz6J+dZzM=\",\"CpSp+4VKPFNBHXNs5Y3IIZayzRMUSiQKb+FzUIoiHZE=\",\"LTNsZHy7VHjjpy8g9B0TXTX5b73ZsrKITmsj7CAeR/0=\",\"A9vj+JlI+fRxXEkaSD379vb53PtYU8XTztcH8AUKIYo=\",\"IkZuwVM4EUw7MWstmGyMDT0UgA2CJ1pC9Haw/9+UNbQ=\",\"HC1sWxgvOU6NNpmekanu532nH1SQlh+3g6T45vhC5oc=\",\"BPxWUVz4MkfjcOSICdO9JFq7UmONhrSKHLdDFn2yKU0=\",\"Gq68kGF+WqS0+QNvzFCS2n7c6cEQ4+rwDX/Tmxeq7Sc=\",\"AV99rZKMs05oWKLesvnZLEUqU1oJbF1xP3MZwMV35BM=\",\"BgAoMHIhMj9G61Z3PFMg/aotcSOHW0IBduNLPuB56XI=\",\"FXsojOybU1bmA3O/pD5nUR4qfmJJNlDI842Bn8NOWdA=\",\"CI2+iPP+j9y+vDTOPwDwf9pBHXgOz/HaV2YK6/0S6/w=\",\"CfE8iSE8gtW/04+Pi8/kb99APSjm00nsAXbjffnJEv4=\",\"Bb/61TcirGxCI2EkwyAGaav/ptySP75RQcjkFXzTF6M=\",\"KQp4KaTO8uJdL28oQhRjNEv95SID1MynNlc1N68zQh4=\",\"CecgnaxxUWl74X0+OsUrDuZGeSm4eNgUrkzCc0s5NI8=\",\"B2KfW3zT3VNt9qhmoHH7XfVjUvr9Dwl3Ec0WZ+o0QDk=\",\"EWQd4K9dAztELc4fgzTq/UlZ8SIwTqbCF3w3fVXq4EU=\",\"ECHoBtg95Mvss8FlDHYXdOg8rk7Luw3xMxAVDLraiPQ=\",\"BK434ednbh089kKF9wQTXIzWQPcMiVve3VHe0mD7tp8=\",\"KkkdKLMg/3e/ciG1n8wlNcfPycDxGl/cXknIN6cfAjk=\",\"K6fCaVgRjwt1FETo6jUk1F/M79h0RhjmblVnnkK+KcY=\",\"DGUW9Musi48pvpQGxsMJ3zTi2n2TETPko08p7GKD6bM=\",\"KZGsx9tesxWfh2bEnWkgeQJbSApwZWQ17nDFaH2q6ww=\",\"KddgW0E83dGSd5tzJeGvuOUu0+l+kq33AcenDBGMZI0=\",\"JQe9N4j1fO/udU0/9akpgNzwYq5KP62T7ABZ6y/lRew=\"],[\"IZdwP860y/B8bb9GxK2T59FOVU22bQkQL/hIJHQ/5Oc=\",\"EyLw//x+SFS9i1/CPnEGtR9ZvVBh2LVlrKL9Pv5RL3k=\",\"GeQU+AOAqi0iITMRjDN9gqjFiUwviIYe5G9Ej6nWE1k=\",\"IiQRmaTfnLfWUknZViytbGXxZGDnmnk5y/3W17kgnZo=\",\"AwEGFzU4Tfzs+aMRwireMntRx4shFhX0HHf22F6KQbY=\",\"Ip4dhsHygQ9KJjO3tLW7YbfcXRmslf2NN5VI/ytoUO4=\",\"DjHc+cUyCagX7rKS6YlyfD9Wv/ZYg6/l/cKKw9++pnU=\",\"Bo+Re7GwgF5bWIi2qXgkOVuu0ZW12gtxxCq9CRwu9Us=\",\"HQv7i7kKwjQALYN3FWEyl4AqW7y2mqLajPq9gy9S17I=\",\"DWfBgvv0HBjVr8tIviAjdBPwKmTb8J6vcfI6FPueIQM=\",\"MFiQnLEDVXcGMEubtk2UrqTlBNj9qLgjE5lveWKISIY=\",\"BNBqgBluEOZkrf79B10MygSWHuion0/W1gHuubYMjbs=\",\"CrBi+NS17Q7CG9tC6z/LCoj6E6/K5FI9I4ZFUihAe1Y=\",\"FzgHVHkq1fgZXjJ6WmPNdXDNGZS9ahMOAcH6Ghc9RjA=\",\"LU83gO70/5mskW9LEt1XVhPLliG8X6CYDtmk7Iqt5Ww=\",\"KrvvSBs2jKlx502uBGkUOfhFwQ0dV4lCabJ1wZaq+e4=\",\"DyQyT4LWgjHdndb4wF9S2OrLmuAcyx87MCKCIjd9DlM=\",\"JnYXMX9RRmVCle9gK5ElDbAQtF9HJM5+xUiEspxARZc=\",\"AVf54vc3SYghuwGrEAHXFessM229/Lhnvs8KK7ZJDAY=\",\"Dae+wMuY0zelLN8NZuipfyQilnE0aEilUurBTIowxwI=\",\"FfyCDvUzAtynCfPuSAuhNxyRreefn1h/x4eNcxwFltE=\",\"CEVxWt/KNcPoBXwPzUzmphKNDoEX2I9VHT7GWH0PQpY=\",\"BCL3ROK3NglryHdaOQaJOmTNqHSqRFfStEKpp3GVbQ8=\",\"FfQhVQv2Y51Gq1d5/Sax4RYY4El+BcyFxgiwD68zgqE=\",\"BPF8rSug72+GAuk/W5iNXzV+Ya5fPsNQZvy00ae3IMg=\",\"FzLvVmDYSuUMoJwCHrDXfx+yoAzHkFskeViMScSIZz8=\",\"KbElAfp54IvCUlmYX3MM3OniQ0GS7IJuD0udVovTUbI=\",\"IHyABqp4/ECoTbQK2CFC0PYbKN7fEOIgHYFc9PYnRZA=\",\"CiVwTOTLdKlNe9y9tfomir1YnYj+RbLyyC+QMmzQSag=\",\"ESEfOnGvMKABAcQj6kCpWFqe7HVodyXX7iifQo9A77I=\",\"DgHou/XuYRRxOAzou4w0uTKsdulvqry3rSC+lhh8L6c=\",\"HIlKFDBRPfNVI+IuT+n0EKQ96R2sc64zjHcv7x+3Q2M=\",\"K+40k5LfoLW0oI7ljvVPAC4GqyaDT5SEPUj/DO1SbVw=\",\"hKYMHXCIfZ8tI6jHcTMygp60HPMYEUn7Ijt6v/TX8A==\",\"I6RQbJDAfzrhdqDiv2f1f4jUWJjJe83ryKgmOrYCx8U=\",\"GrZolqHflcAgi5kOLGNHBzlKERDLMUu4LgouK0lYruc=\",\"LGuEKqvrhO3knlWdjuplgpP/S7qTJbWh1MtknTF/RhY=\",\"FjIa9jhxMowriPRt9DK+mqFLAIuT+FzZcd2YbcFtLjU=\",\"E9ZHII09vMnfENHuNbWY5sjthWCPgbppUwiOe8bbc+w=\",\"Acau2p4Ppp9RQ+byLnR7fnTmkrklTVXGG4kEcMvX8Gs=\",\"KH10pfoDpO1lvUp8ba8DNBj0dMfdm5V78rF5ZcrAJLE=\",\"J6Qye