From ae822c7a4dc908fe483d622ff4b391719b447703 Mon Sep 17 00:00:00 2001 From: rnet Date: Thu, 4 Apr 2024 00:48:36 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:=201.=20exec=E5=91=BD=E4=BB=A4=E9=80=82?= =?UTF-8?q?=E9=85=8D=E7=89=88=E6=9C=AC=EF=BC=9B2.=20=E6=96=B0=E7=89=88cook?= =?UTF-8?q?ie=E4=BD=8D=E6=95=B0=E9=80=BB=E8=BE=91=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=88=E6=97=A0=E6=B3=95=E8=BF=87=E6=A3=80=E6=B5=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 3 +- package.json | 1 - src/config/codemap_v2.json | 2 +- src/handler/Cookie.js | 156 +++++++++++-------- src/handler/parser/common/dynamicExec.js | 72 --------- src/handler/parser/common/index.js | 1 - src/handler/parser/common/modeEncrypt.js | 4 +- src/handler/parser/common/numarrAddTime.js | 4 +- src/handler/parser/common/random.js | 4 +- src/handler/parser/common/runTask.js | 165 ++++++++++++++++----- src/handler/parser/r2mka.js | 7 +- src/handler/parser/task/index.js | 25 +++- src/handler/viewer/dkeys.js | 14 ++ src/handler/viewer/index.js | 3 + src/makeCodeHigh.js | 11 +- utils/getCode.js | 42 +++++- utils/initGv.js | 7 +- utils/request.js | 8 + 18 files changed, 332 insertions(+), 197 deletions(-) delete mode 100644 src/handler/parser/common/dynamicExec.js create mode 100644 src/handler/viewer/dkeys.js create mode 100644 src/handler/viewer/index.js create mode 100644 utils/request.js diff --git a/main.js b/main.js index 0d6e1d3..98cfa8a 100755 --- a/main.js +++ b/main.js @@ -120,7 +120,7 @@ module.exports = yargs coerce: (input) => { if (['1', '2'].includes(input)) { gv._setAttr('version', Number(input)); - return paths.exampleResolve('codes', `${input}-\$_ts-full.json`); + return paths.exampleResolve('codes', `${input}-\$_ts.json`); } return input; } @@ -131,6 +131,7 @@ module.exports = yargs Math.random = () => 0.1253744220839037; const gv = require('@utils/initGv')(argv.file); Object.assign(global, gv.utils); + Object.assign(global, require('@src/handler/viewer/')); const output = JSON.stringify(eval(argv.code)); console.log([`\n 输入:${argv.code}`, `输出:${output}\n`].join('\n ')); } diff --git a/package.json b/package.json index 0c24453..f70715e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "README.md", "utils", "main.js", - "test", "src", "example" ], diff --git a/src/config/codemap_v2.json b/src/config/codemap_v2.json index f628474..efefbf5 100644 --- a/src/config/codemap_v2.json +++ b/src/config/codemap_v2.json @@ -1 +1 @@ -{"0":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] != _$cG; _$$o[_$fF++] = _$cG","1":"_$fF--; _$cG = _$fF; _$iZ(); _$cG = _$j3[_$h8](_$$o[_$cG])","2":"_$b$ = _$el[++_$$w]; _$_S = _$$o.slice(_$fF - _$b$, _$fF); _$fF -= _$b$; _$iZ(); _$$o[_$fF++] = _$$F(_$j3[_$h8], _$_S)","3":"_$cG = _$$o[--_$fF]; _$iZ(); _$cG = _$j3[_$h8] |= _$cG","4":"_$cG = _$j3[_$h8]++","5":"_$fF -= 2; _$cG = _$fF; _$iZ(); _$$o[_$fF++] = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1])","6":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] - _$cG; _$$o[_$fF++] = _$cG","7":"_$ji = _$el[++_$$w]; _$$o[_$fF++] = _$jH[_$ji][_$el[++_$$w]]","8":"_$cG = _$$o[--_$fF]; _$bb[4] = 1; _$bb[5] = _$cG; _$$w = _$dp","9":"_$$o[_$fF++] = _$gk[_$el[++_$$w]]","10":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] > _$cG; _$$o[_$fF++] = _$cG","11":"_$b$ = _$el[++_$$w]; _$$w -= _$b$","12":"_$$e(_$jI, _$el[++_$$w], _$el[++_$$w], _$b$ = _$el[++_$$w], _$el[++_$$w], _$$w + 1, _$gk, _$bb); _$bb[4] ? _$$w = _$dp : _$$w += _$b$","13":"_$cG = _$$o[--_$fF]; _$j3 = _$$o[_$fF - 1]; _$j3[_$go[_$el[++_$$w]]] = _$cG","14":"_$cG = _$$o[--_$fF]; _$iZ(); _$j3[_$h8] = _$cG","15":"_$cG = _$$o[--_$fF]; _$j3 = _$$o[--_$fF]; _$$o[_$fF++] = _$j3[_$cG]","16":"_$$o[_$fF++] = _$jn[_$el[++_$$w]]","17":"_$fF -= 2; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$$o[_$fF++] = _$j3(_$$o[_$cG], _$$o[_$cG + 1])","18":"_$fF--; _$cG = _$fF; _$iZ(); _$$o[_$fF++] = _$j3[_$h8](_$$o[_$cG])","19":"_$$o[_$fF++] = _$cu[_$el[++_$$w]]","20":"_$el[_$$w] = 102; _$h8 = _$go[_$el[++_$$w]]; _$el[_$$w] = _$h8; _$cG = _$$o[--_$fF]; _$$o[_$fF++] = _$cG[_$h8]","21":"_$el[_$$w] = 23; _$h8 = _$el[++_$$w]; _$cG = _$fW[_$h8]; _$el[_$$w] = _$cG; _$$o[_$fF++] = _$cG","22":"_$fF -= 3; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$cG = _$j3(_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2])","23":"_$$o[_$fF++] = _$el[++_$$w]","24":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] + _$cG; _$$o[_$fF++] = _$cG","25":"_$iZ(); _$$o[_$fF++] = _$j3[_$h8]()","26":"_$fF -= 2; _$cG = _$fF; _$iZ(); _$cG = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1])","27":"_$el[_$$w] = 64; _$h8 = _$go[_$el[++_$$w]]; _$el[_$$w] = _$h8; _$j3 = _$$o[--_$fF]","28":"_$iZ(); _$j3 = _$j3[_$h8]; _$$o[_$fF++] = _$j3()","29":"_$fF--; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$cG = _$j3(_$$o[_$cG])","30":"_$cG = typeof _$$o[--_$fF]; _$$o[_$fF++] = _$cG","31":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] & _$cG; _$$o[_$fF++] = _$cG","32":"_$el[_$$w] = 64; _$h8 = _$fW[_$el[++_$$w]]; _$el[_$$w] = _$h8; _$j3 = _$$o[--_$fF]","33":"_$h8 = _$el[++_$$w]; _$j3 = _$jn","34":"_$$o[_$fF++] = _$jU[_$el[++_$$w]]","35":"_$cG = _$$o[--_$fF]; _$$o[_$fF++] = !_$cG","36":"_$cG = _$$o[--_$fF]; _$j3 = _$$o[_$fF - 1]; _$j3[_$fW[_$el[++_$$w]]] = _$cG","37":"_$fF--; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$$o[_$fF++] = _$j3(_$$o[_$cG])","38":"_$h8 = _$$o[--_$fF]; _$j3 = _$$o[--_$fF]","39":"_$b$ = _$el[++_$$w]; _$$w += _$b$","40":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] * _$cG; _$$o[_$fF++] = _$cG","41":"_$cG = _$$o[--_$fF]; _$b$ = _$el[++_$$w]; _$cG ? 0 : _$$w += _$b$","42":"_$bb[4] = 2; _$$w = _$dp","43":"_$h8 = _$el[++_$$w]; _$cG = _$$o[--_$fF]; !_$cG ? (_$$w += _$h8, ++_$fF) : 0","44":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] === _$cG; _$$o[_$fF++] = _$cG","45":"_$$o[_$fF++] = {}","46":"_$$o[_$fF++] = false","47":"_$ji = _$el[++_$$w]; _$h8 = _$el[++_$$w]; _$j3 = _$d5[_$ji]","48":"_$h8 = _$el[++_$$w]; _$j3 = _$jU","49":"_$fF -= 2; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$cG = _$j3(_$$o[_$cG], _$$o[_$cG + 1])","50":"_$el[_$$w] = 23; _$h8 = _$el[++_$$w]; _$cG = _$ke[_$h8]; _$el[_$$w] = _$cG; _$$o[_$fF++] = _$cG","51":"_$h8 = _$el[++_$$w]; _$j3 = _$gk","52":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] == _$cG; _$$o[_$fF++] = _$cG","53":"_$$o[_$fF++] = true","54":"_$iZ(); _$j3 = _$j3[_$h8]; _$cG = _$j3()","55":"_$h8 = _$el[++_$$w]; _$$o[_$fF++] = _$gI(_$jI._$gr[_$h8], _$bb)","56":"_$$o[_$fF++] = []","57":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] < _$cG; _$$o[_$fF++] = _$cG","58":"_$ji = _$el[++_$$w]; _$$o[_$fF++] = _$d5[_$ji][_$el[++_$$w]]","59":"_$cG = _$$o[--_$fF]; _$j3 = _$$o[_$fF - 1]; _$j3.push(_$cG)","60":"_$h8 = _$el[++_$$w]; _$cG = _$$o[--_$fF]; _$cG ? (_$$w += _$h8, ++_$fF) : 0","61":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] !== _$cG; _$$o[_$fF++] = _$cG","62":"_$cG = _$$o[--_$fF]; _$iZ(); _$cG = _$j3[_$h8] += _$cG","63":"_$h8 = _$el[++_$$w]; _$j3 = _$cu","64":"_$h8 = _$el[++_$$w]; _$j3 = _$$o[--_$fF]","65":"_$cG = _$j3[_$h8]--","66":"_$$o[_$fF++] = _$j3[_$h8]++","67":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] | _$cG; _$$o[_$fF++] = _$cG","68":"_$b$ = _$el[++_$$w], _$cG = _$$o[--_$fF], _$$w++;; for (_$ji in _$cG) {\n _$j3[_$h8] = _$ji, _$kB(_$jI, _$$w, _$$w + _$b$, _$bb);\n if (_$bb[4]) {\n _$$w = _$dp;\n break;\n }\n}; _$$w += _$b$ - 1;","69":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] + _$cG","70":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] << _$cG; _$$o[_$fF++] = _$cG","71":"_$fF -= 4; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$cG = _$j3(_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2], _$$o[_$cG + 3])","72":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] / _$cG; _$$o[_$fF++] = _$cG","73":"--_$fF; _$j3 = _$$o; _$h8 = _$fF","74":"_$cG = _$$o[--_$fF]; _$iZ(); _$cG = _$j3[_$h8] &= _$cG","75":"_$fF -= 4; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$$o[_$fF++] = _$j3(_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2], _$$o[_$cG + 3])","76":"_$fF -= 4; _$cG = _$fF; _$iZ(); _$cG = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2], _$$o[_$cG + 3])","77":"_$h8 = _$el[++_$$w]; _$cG = _$$o[--_$fF]; _$cG = _$cG[_$h8]","78":"_$cG = -_$$o[--_$fF]; _$$o[_$fF++] = _$cG","79":"_$fF -= 3; _$cG = _$fF; _$iZ(); _$j3 = _$j3[_$h8]; _$$o[_$fF++] = _$j3(_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2])","80":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] >> _$cG; _$$o[_$fF++] = _$cG","81":"_$cG = _$$o[--_$fF]; _$iZ(); _$j3[_$h8] = _$cG; _$$o[_$fF++] = _$cG","82":"_$ji = _$el[++_$$w]; _$h8 = _$el[++_$$w]; _$j3 = _$jH[_$ji]","83":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] instanceof _$cG; _$$o[_$fF++] = _$cG","84":"_$cG = _$$o[--_$fF], _$iZ(), _$cG = _$j3[_$h8] -= _$cG","85":"debugger;","86":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] >= _$cG; _$$o[_$fF++] = _$cG","87":"_$h8 = _$el[++_$$w]; _$cG = _$cG[_$h8]","88":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] ^ _$cG; _$$o[_$fF++] = _$cG","89":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] >>> _$cG; _$$o[_$fF++] = _$cG","90":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] in _$cG; _$$o[_$fF++] = _$cG","91":"_$fF -= 4; _$cG = _$fF; _$iZ(); _$$o[_$fF++] = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2], _$$o[_$cG + 3])","92":"_$$o[_$fF++] = ++_$j3[_$h8]","93":"_$$o[_$fF++] = --_$j3[_$h8]","94":"_$$o[_$fF++] = null","95":"_$el[_$$w] = 102; _$h8 = _$fW[_$el[++_$$w]]; _$el[_$$w] = _$h8; _$cG = _$$o[--_$fF]; _$$o[_$fF++] = _$cG[_$h8]","96":"_$b$ = _$el[++_$$w], _$fF -= _$b$, _$_S = _$$o.slice(_$fF, _$fF + _$b$), _$iZ(), _$cG = _$j3[_$h8].apply(_$j3, _$_S)","97":"_$cG = _$$o[--_$fF], _$h8 = _$el[++_$$w], _$j3 = _$dY[_$h8], _$b$ = _$j3[_$cG], _$b$ == _$cq ? _$b$ = _$el[++_$$w] : ++_$$w, _$$w += _$b$","98":"_$cG = _$$o[--_$fF], _$iZ(), _$cG = _$j3[_$h8] ^= _$cG","99":"throw _$$o[--_$fF];","100":"_$cG = delete _$j3[_$h8]","101":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] <= _$cG; _$$o[_$fF++] = _$cG","102":"_$h8 = _$el[++_$$w]; _$cG = _$$o[--_$fF]; _$$o[_$fF++] = _$cG[_$h8]","103":"_$fF -= 3; _$cG = _$fF; _$iZ(); _$$o[_$fF++] = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2])","104":"_$fF -= 5; _$cG = _$fF; _$iZ(); _$$o[_$fF++] = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2], _$$o[_$cG + 3], _$$o[_$cG + 4])","105":"_$b$ = _$el[++_$$w]; _$_S = _$$o.slice(_$fF - _$b$, _$fF); _$fF -= _$b$; _$iZ(); _$cG = _$$F(_$j3[_$h8], _$_S)","106":"_$iZ(); _$cG = _$j3[_$h8]()","107":"_$cG = _$$o[--_$fF]; _$$o[_$fF++] = ~_$cG","108":"_$h8 = _$el[++_$$w]; _$$o[_$fF++] = _$cG[_$h8]","109":"_$fF -= 3; _$cG = _$fF; _$iZ(); _$cG = _$j3[_$h8](_$$o[_$cG], _$$o[_$cG + 1], _$$o[_$cG + 2])","110":"_$cG = _$$o[--_$fF]; _$cG = _$$o[--_$fF] % _$cG; _$$o[_$fF++] = _$cG","111":"_$h8 = _$el[++_$$w]; _$cG = _$$o[--_$fF]; !_$cG ? _$$w += _$h8 : 0","112":"_$cG = ++_$j3[_$h8]","113":"_$cG = _$el[++_$$w]","name":"_$j9","params":["_$jI","_$aj","_$dp","_$bb"],"varible":["_$$w","_$j9","_$j3","_$h8","_$cG","_$ji","_$b$","_$el","_$gk","_$d5","_$cu","_$jH","_$$o","_$fF","_$_S"],"taskarr":"_$el","ret2":"_$gk","ret3":"_$d5","ret0":"_$cu","ret1":"_$jH","dataKey":"_$$o","dataIdx":"_$fF","forcur":"_$$w","formax":"_$dp","commonFunc":"function _$iZ() {\n var _$jI;\n _$jI = _$el[++_$$w], _$jI <= 38 ? _$jI <= 27 ? (_$el[_$$w] = 64, _$h8 = _$go[_$el[++_$$w]], _$el[_$$w] = _$h8, _$j3 = _$$o[--_$fF]) : _$jI <= 32 ? (_$el[_$$w] = 64, _$h8 = _$fW[_$el[++_$$w]], _$el[_$$w] = _$h8, _$j3 = _$$o[--_$fF]) : _$jI <= 33 ? (_$h8 = _$el[++_$$w], _$j3 = _$jn) : (_$h8 = _$$o[--_$fF], _$j3 = _$$o[--_$fF]) : _$jI <= 63 ? _$jI <= 47 ? (_$ji = _$el[++_$$w], _$h8 = _$el[++_$$w], _$j3 = _$d5[_$ji]) : _$jI <= 48 ? (_$h8 = _$el[++_$$w], _$j3 = _$jU) : _$jI <= 51 ? (_$h8 = _$el[++_$$w], _$j3 = _$gk) : (_$h8 = _$el[++_$$w], _$j3 = _$cu) : _$jI <= 64 ? (_$h8 = _$el[++_$$w], _$j3 = _$$o[--_$fF]) : _$jI <= 73 ? (--_$fF, _$j3 = _$$o, _$h8 = _$fF) : (_$ji = _$el[++_$$w], _$h8 = _$el[++_$$w], _$j3 = _$jH[_$ji]);\n}","globalRes":"_$jU","loopRes":"_$jn"} \ No newline at end of file +{"0":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] != _$k1; _$j5[_$dJ++] = _$k1","1":"_$dJ--; _$k1 = _$dJ; _$h5(); _$k1 = _$$N[_$$v](_$j5[_$k1])","2":"_$_c = _$ae[++_$c3]; _$kX = _$j5.slice(_$dJ - _$_c, _$dJ); _$dJ -= _$_c; _$h5(); _$j5[_$dJ++] = _$aB(_$$N[_$$v], _$kX)","3":"_$k1 = _$j5[--_$dJ]; _$h5(); _$k1 = _$$N[_$$v] |= _$k1","4":"_$k1 = _$$N[_$$v]++","5":"_$dJ -= 2; _$k1 = _$dJ; _$h5(); _$j5[_$dJ++] = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1])","6":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] - _$k1; _$j5[_$dJ++] = _$k1","7":"_$kK = _$ae[++_$c3]; _$j5[_$dJ++] = _$cx[_$kK][_$ae[++_$c3]]","8":"_$k1 = _$j5[--_$dJ]; _$iN[4] = 1; _$iN[5] = _$k1; _$c3 = _$eK","9":"_$j5[_$dJ++] = _$dl[_$ae[++_$c3]]","10":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] > _$k1; _$j5[_$dJ++] = _$k1","11":"_$_c = _$ae[++_$c3]; _$c3 -= _$_c","12":"_$d3(_$cK, _$ae[++_$c3], _$ae[++_$c3], _$_c = _$ae[++_$c3], _$ae[++_$c3], _$c3 + 1, _$dl, _$iN); _$iN[4] ? _$c3 = _$eK : _$c3 += _$_c","13":"_$k1 = _$j5[--_$dJ]; _$$N = _$j5[_$dJ - 1]; _$$N[_$cF[_$ae[++_$c3]]] = _$k1","14":"_$k1 = _$j5[--_$dJ]; _$h5(); _$$N[_$$v] = _$k1","15":"_$k1 = _$j5[--_$dJ]; _$$N = _$j5[--_$dJ]; _$j5[_$dJ++] = _$$N[_$k1]","16":"_$j5[_$dJ++] = _$dO[_$ae[++_$c3]]","17":"_$dJ -= 2; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$j5[_$dJ++] = _$$N(_$j5[_$k1], _$j5[_$k1 + 1])","18":"_$dJ--; _$k1 = _$dJ; _$h5(); _$j5[_$dJ++] = _$$N[_$$v](_$j5[_$k1])","19":"_$j5[_$dJ++] = _$ix[_$ae[++_$c3]]","20":"_$ae[_$c3] = 102; _$$v = _$cF[_$ae[++_$c3]]; _$ae[_$c3] = _$$v; _$k1 = _$j5[--_$dJ]; _$j5[_$dJ++] = _$k1[_$$v]","21":"_$ae[_$c3] = 23; _$$v = _$ae[++_$c3]; _$k1 = _$jD[_$$v]; _$ae[_$c3] = _$k1; _$j5[_$dJ++] = _$k1","22":"_$dJ -= 3; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$k1 = _$$N(_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2])","23":"_$j5[_$dJ++] = _$ae[++_$c3]","24":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] + _$k1; _$j5[_$dJ++] = _$k1","25":"_$h5(); _$j5[_$dJ++] = _$$N[_$$v]()","26":"_$dJ -= 2; _$k1 = _$dJ; _$h5(); _$k1 = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1])","27":"_$ae[_$c3] = 64; _$$v = _$cF[_$ae[++_$c3]]; _$ae[_$c3] = _$$v; _$$N = _$j5[--_$dJ]","28":"_$h5(); _$$N = _$$N[_$$v]; _$j5[_$dJ++] = _$$N()","29":"_$dJ--; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$k1 = _$$N(_$j5[_$k1])","30":"_$k1 = typeof _$j5[--_$dJ]; _$j5[_$dJ++] = _$k1","31":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] & _$k1; _$j5[_$dJ++] = _$k1","32":"_$ae[_$c3] = 64; _$$v = _$jD[_$ae[++_$c3]]; _$ae[_$c3] = _$$v; _$$N = _$j5[--_$dJ]","33":"_$$v = _$ae[++_$c3]; _$$N = _$dO","34":"_$j5[_$dJ++] = _$cN[_$ae[++_$c3]]","35":"_$k1 = _$j5[--_$dJ]; _$j5[_$dJ++] = !_$k1","36":"_$k1 = _$j5[--_$dJ]; _$$N = _$j5[_$dJ - 1]; _$$N[_$jD[_$ae[++_$c3]]] = _$k1","37":"_$dJ--; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$j5[_$dJ++] = _$$N(_$j5[_$k1])","38":"_$$v = _$j5[--_$dJ]; _$$N = _$j5[--_$dJ]","39":"_$_c = _$ae[++_$c3]; _$c3 += _$_c","40":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] * _$k1; _$j5[_$dJ++] = _$k1","41":"_$k1 = _$j5[--_$dJ]; _$_c = _$ae[++_$c3]; _$k1 ? 0 : _$c3 += _$_c","42":"_$iN[4] = 2; _$c3 = _$eK","43":"_$$v = _$ae[++_$c3]; _$k1 = _$j5[--_$dJ]; !_$k1 ? (_$c3 += _$$v, ++_$dJ) : 0","44":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] === _$k1; _$j5[_$dJ++] = _$k1","45":"_$j5[_$dJ++] = {}","46":"_$j5[_$dJ++] = false","47":"_$kK = _$ae[++_$c3]; _$$v = _$ae[++_$c3]; _$$N = _$be[_$kK]","48":"_$$v = _$ae[++_$c3]; _$$N = _$cN","49":"_$dJ -= 2; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$k1 = _$$N(_$j5[_$k1], _$j5[_$k1 + 1])","50":"_$ae[_$c3] = 23; _$$v = _$ae[++_$c3]; _$k1 = _$i7[_$$v]; _$ae[_$c3] = _$k1; _$j5[_$dJ++] = _$k1","51":"_$$v = _$ae[++_$c3]; _$$N = _$dl","52":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] == _$k1; _$j5[_$dJ++] = _$k1","53":"_$j5[_$dJ++] = true","54":"_$h5(); _$$N = _$$N[_$$v]; _$k1 = _$$N()","55":"_$$v = _$ae[++_$c3]; _$j5[_$dJ++] = _$el(_$cK._$b1[_$$v], _$iN)","56":"_$j5[_$dJ++] = []","57":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] < _$k1; _$j5[_$dJ++] = _$k1","58":"_$kK = _$ae[++_$c3]; _$j5[_$dJ++] = _$be[_$kK][_$ae[++_$c3]]","59":"_$k1 = _$j5[--_$dJ]; _$$N = _$j5[_$dJ - 1]; _$$N.push(_$k1)","60":"_$$v = _$ae[++_$c3]; _$k1 = _$j5[--_$dJ]; _$k1 ? (_$c3 += _$$v, ++_$dJ) : 0","61":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] !== _$k1; _$j5[_$dJ++] = _$k1","62":"_$k1 = _$j5[--_$dJ]; _$h5(); _$k1 = _$$N[_$$v] += _$k1","63":"_$$v = _$ae[++_$c3]; _$$N = _$ix","64":"_$$v = _$ae[++_$c3]; _$$N = _$j5[--_$dJ]","65":"_$k1 = _$$N[_$$v]--","66":"_$j5[_$dJ++] = _$$N[_$$v]++","67":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] | _$k1; _$j5[_$dJ++] = _$k1","68":"_$_c = _$ae[++_$c3], _$k1 = _$j5[--_$dJ], _$c3++;; for (_$kK in _$k1) {\n _$$N[_$$v] = _$kK, _$bo(_$cK, _$c3, _$c3 + _$_c, _$iN);\n if (_$iN[4]) {\n _$c3 = _$eK;\n break;\n }\n}; _$c3 += _$_c - 1;","69":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] + _$k1","70":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] << _$k1; _$j5[_$dJ++] = _$k1","71":"_$dJ -= 4; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$k1 = _$$N(_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2], _$j5[_$k1 + 3])","72":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] / _$k1; _$j5[_$dJ++] = _$k1","73":"--_$dJ; _$$N = _$j5; _$$v = _$dJ","74":"_$k1 = _$j5[--_$dJ]; _$h5(); _$k1 = _$$N[_$$v] &= _$k1","75":"_$dJ -= 4; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$j5[_$dJ++] = _$$N(_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2], _$j5[_$k1 + 3])","76":"_$dJ -= 4; _$k1 = _$dJ; _$h5(); _$k1 = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2], _$j5[_$k1 + 3])","77":"_$$v = _$ae[++_$c3]; _$k1 = _$j5[--_$dJ]; _$k1 = _$k1[_$$v]","78":"_$k1 = -_$j5[--_$dJ]; _$j5[_$dJ++] = _$k1","79":"_$dJ -= 3; _$k1 = _$dJ; _$h5(); _$$N = _$$N[_$$v]; _$j5[_$dJ++] = _$$N(_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2])","80":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] >> _$k1; _$j5[_$dJ++] = _$k1","81":"_$k1 = _$j5[--_$dJ]; _$h5(); _$$N[_$$v] = _$k1; _$j5[_$dJ++] = _$k1","82":"_$kK = _$ae[++_$c3]; _$$v = _$ae[++_$c3]; _$$N = _$cx[_$kK]","83":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] instanceof _$k1; _$j5[_$dJ++] = _$k1","84":"_$k1 = _$j5[--_$dJ], _$h5(), _$k1 = _$$N[_$$v] -= _$k1","85":"debugger;","86":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] >= _$k1; _$j5[_$dJ++] = _$k1","87":"_$$v = _$ae[++_$c3]; _$k1 = _$k1[_$$v]","88":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] ^ _$k1; _$j5[_$dJ++] = _$k1","89":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] >>> _$k1; _$j5[_$dJ++] = _$k1","90":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] in _$k1; _$j5[_$dJ++] = _$k1","91":"_$dJ -= 4; _$k1 = _$dJ; _$h5(); _$j5[_$dJ++] = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2], _$j5[_$k1 + 3])","92":"_$j5[_$dJ++] = ++_$$N[_$$v]","93":"_$j5[_$dJ++] = --_$$N[_$$v]","94":"_$j5[_$dJ++] = null","95":"_$ae[_$c3] = 102; _$$v = _$jD[_$ae[++_$c3]]; _$ae[_$c3] = _$$v; _$k1 = _$j5[--_$dJ]; _$j5[_$dJ++] = _$k1[_$$v]","96":"_$_c = _$ae[++_$c3], _$dJ -= _$_c, _$kX = _$j5.slice(_$dJ, _$dJ + _$_c), _$h5(), _$k1 = _$$N[_$$v].apply(_$$N, _$kX)","97":"_$k1 = _$j5[--_$dJ], _$$v = _$ae[++_$c3], _$$N = _$bS[_$$v], _$_c = _$$N[_$k1], _$_c == _$jt ? _$_c = _$ae[++_$c3] : ++_$c3, _$c3 += _$_c","98":"_$k1 = _$j5[--_$dJ], _$h5(), _$k1 = _$$N[_$$v] ^= _$k1","99":"throw _$j5[--_$dJ];","100":"_$k1 = delete _$$N[_$$v]","101":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] <= _$k1; _$j5[_$dJ++] = _$k1","102":"_$$v = _$ae[++_$c3]; _$k1 = _$j5[--_$dJ]; _$j5[_$dJ++] = _$k1[_$$v]","103":"_$dJ -= 3; _$k1 = _$dJ; _$h5(); _$j5[_$dJ++] = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2])","104":"_$dJ -= 5; _$k1 = _$dJ; _$h5(); _$j5[_$dJ++] = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2], _$j5[_$k1 + 3], _$j5[_$k1 + 4])","105":"_$_c = _$ae[++_$c3]; _$kX = _$j5.slice(_$dJ - _$_c, _$dJ); _$dJ -= _$_c; _$h5(); _$k1 = _$aB(_$$N[_$$v], _$kX)","106":"_$h5(); _$k1 = _$$N[_$$v]()","107":"_$k1 = _$j5[--_$dJ]; _$j5[_$dJ++] = ~_$k1","108":"_$$v = _$ae[++_$c3]; _$j5[_$dJ++] = _$k1[_$$v]","109":"_$dJ -= 3; _$k1 = _$dJ; _$h5(); _$k1 = _$$N[_$$v](_$j5[_$k1], _$j5[_$k1 + 1], _$j5[_$k1 + 2])","110":"_$k1 = _$j5[--_$dJ]; _$k1 = _$j5[--_$dJ] % _$k1; _$j5[_$dJ++] = _$k1","111":"_$$v = _$ae[++_$c3]; _$k1 = _$j5[--_$dJ]; !_$k1 ? _$c3 += _$$v : 0","112":"_$k1 = ++_$$N[_$$v]","113":"_$k1 = _$ae[++_$c3]","name":"_$aW","params":["_$cK","_$cC","_$eK","_$iN"],"varible":["_$c3","_$aW","_$$N","_$$v","_$k1","_$kK","_$_c","_$ae","_$dl","_$be","_$ix","_$cx","_$j5","_$dJ","_$kX"],"taskarr":"_$ae","ret2":"_$dl","ret3":"_$be","ret0":"_$ix","ret1":"_$cx","dataKey":"_$j5","dataIdx":"_$dJ","forcur":"_$c3","formax":"_$eK","commonFunc":"function _$h5() {\n var _$cK;\n _$cK = _$ae[++_$c3], _$cK <= 38 ? _$cK <= 27 ? (_$ae[_$c3] = 64, _$$v = _$cF[_$ae[++_$c3]], _$ae[_$c3] = _$$v, _$$N = _$j5[--_$dJ]) : _$cK <= 32 ? (_$ae[_$c3] = 64, _$$v = _$jD[_$ae[++_$c3]], _$ae[_$c3] = _$$v, _$$N = _$j5[--_$dJ]) : _$cK <= 33 ? (_$$v = _$ae[++_$c3], _$$N = _$dO) : (_$$v = _$j5[--_$dJ], _$$N = _$j5[--_$dJ]) : _$cK <= 63 ? _$cK <= 47 ? (_$kK = _$ae[++_$c3], _$$v = _$ae[++_$c3], _$$N = _$be[_$kK]) : _$cK <= 48 ? (_$$v = _$ae[++_$c3], _$$N = _$cN) : _$cK <= 51 ? (_$$v = _$ae[++_$c3], _$$N = _$dl) : (_$$v = _$ae[++_$c3], _$$N = _$ix) : _$cK <= 64 ? (_$$v = _$ae[++_$c3], _$$N = _$j5[--_$dJ]) : _$cK <= 73 ? (--_$dJ, _$$N = _$j5, _$$v = _$dJ) : (_$kK = _$ae[++_$c3], _$$v = _$ae[++_$c3], _$$N = _$cx[_$kK]);\n}","globalRes":"_$cN","keyname":"_$cF","loopRes":"_$dO","taskAttr":["_$aY","_$$M","_$$a","_$_2","_$b1"],"taskFactory":"_$el"} \ No newline at end of file diff --git a/src/handler/Cookie.js b/src/handler/Cookie.js index 0f9da04..4b16b75 100644 --- a/src/handler/Cookie.js +++ b/src/handler/Cookie.js @@ -13,6 +13,7 @@ const { uuid, string2ascii, execRandomByNumber, + execNumberByTime, hexnum, ascii2string, getFixedNumber, @@ -28,13 +29,27 @@ const { runTask, } = parser; +const developConfig = { + // 开发时用的配置,比如时间值固定、随机数固定等 + // 'window.innerWidth': 150, + // 'window.outerWidth': 1336, + // currentTime: 1711730658454, + // r2mkaTime: 1711712705, + // startTime: 1711730659, + // runTime: 1711730659, + // formatUid: 58854, + // random: 0.123, + execNumberByTime: 1778, +} + module.exports = class { constructor(ts, r2mkaText) { parser.init(ts, r2mkaText) + const current = new Date().getTime() + 1000; this.config = { 'window.navigator.maxTouchPoints': 0, 'window.eval.toString().length': 33, - 'window.navigator.userAgent': randomUseragent.getRandom(), + 'window.navigator.userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'window.navigator.platform': 'MacIntel', 'window.name': '$_YWTU=LjFNq_oZCsth6KJ9xHOin6RRhL4fQt7Vsn8YCz9dRjl&$_YVTX=Wa&vdFm=_$hh', 'window.navigator.battery': { @@ -53,46 +68,52 @@ module.exports = class { 'window.innerWidth': 1680, 'window.outerHeight': 1025, 'window.outerWidth': 1680, + 'window.document.hidden': false, + formatUid: 46228, // 代码特征码 + currentTime: current, // 完整的时间戳 + runTime: Math.floor(current / 1000), // 运行时间 + startTime: Math.floor(current / 1000) - 1, // 模拟浏览器启动时间 + r2mkaTime: +ascii2string(gv.keys[21]), // r2mka文本解析出来的时间 + random: null, // 代替Math.random方法返回值 + execNumberByTime: execNumberByTime(), // 固定时间内的循环运行次数 + ...developConfig, } - this.runTime = Math.floor(new Date().getTime() / 1000); // 运行时间 - this.startTime = this.runTime - 1; // 模拟浏览器启动时间 - this.r2mkaTime = +ascii2string(gv.keys[21]); // r2mka文本解析出来的时间 + // console.log(this.config); } run() { + const basearr = this[`getBasearr_v${gv.version}`](); + const nextarr = numarrJoin( + numarrJoin( + 2, + numToNumarr4([this.config.r2mkaTime, this.config.startTime]), + gv.keys[2] + ), + encryptMode1( + xor( + numarrEncrypt(basearr), + gv.keys[2], + 16 + ), + numarrAddTime(gv.keys[17], this.config.runTime, this.config.random)[0], + 0 + ) + ) return '0' + numarr2string( - encryptMode1([ - ...numToNumarr4(this.r2mkaTime), - ...numarrJoin( - numarrJoin( - gv.r2mka("0>one>32-126").taskarr[73], - numarrJoin( - numToNumarr4([this.r2mkaTime, this.startTime]), - string2ascii(gv.cp0[399]) - ), - gv.keys[2] - ), - encryptMode1( - xor( - numarrEncrypt(this[`getBasearr_v${gv.version}`]()), - gv.keys[2], - 16 - ), - numarrAddTime(gv.keys[17], this.runTime)[0], - 0 - ) - )], - numarrAddTime(gv.keys[16], this.runTime)[0] + encryptMode1( + [ + ...numToNumarr4(uuid(nextarr)), + ...nextarr + ], + numarrAddTime(gv.keys[16], this.config.runTime, this.config.random)[0], + 1, + this.config.random ) ); } getBasearr_v2() { - // 第2版计算cookie方法 - const name = this.config['window.name'].split('&').reduce((ans, it) => { - const [key, val] = it.split('='); - return { ...ans, [key]: val }; - }, {}); + // 第2版计算cookie基础数组,cookie位数257位(当gv.keys[22]存在值) return numarrJoin( 3, numarrJoin( @@ -102,8 +123,8 @@ module.exports = class { 128, ...numToNumarr4(uuid(this.config['window.navigator.userAgent'])), string2ascii(this.config['window.navigator.platform']), - ...numToNumarr4(_random(500, 1000)), - ...execRandomByNumber(), + ...numToNumarr4(this.config.execNumberByTime), + ...execRandomByNumber(98, this.config.random), 0, 0, ...numToNumarr4(Number(hexnum('3136373737323136'))), @@ -114,50 +135,67 @@ module.exports = class { ...numToNumarr2(this.config['window.outerWidth']), ), 10, // 下标43 - [ - 0, // 运行时代码中传入的初始数组长度,由于传入的是空数组,因此为0 - 1, // 任务编号0>one>36>one>2-131的任务列表取得 - ...numToNumarr4(this.r2mkaTime + this.runTime - this.startTime), // ramka串返回的时间 + 当前时间 - 启动时间 - ...numToNumarr4(+ascii2string(gv.keys[19])), - ...numToNumarr8(Math.floor(Math.random() * 1048575) * 4294967296 + (((this.runTime * 1000) & 4294967295) >>> 0)), - ], - 7, // 下标63 + (() => { + const flag = +ascii2string(gv.keys[24]); + return [ + flag > 0 && flag < 8 ? 1 : 0, + 13, + ...numToNumarr4(this.config.r2mkaTime + this.config.runTime - this.config.startTime), // ramka串返回的时间 + 当前时间 - 启动时间 + ...numToNumarr4(+ascii2string(gv.keys[19])), + ...numToNumarr8(Math.floor((this.config.random || Math.random()) * 1048575) * 4294967296 + (((this.config.currentTime + 1) & 4294967295) >>> 0)), + flag, + ]; + })(), + 7, // 下标64 [ ...numToNumarr4(16777216), // gv.cp2取得 ...numToNumarr4(0), // 任务编号0-0的任务列表取得 ...numToNumarr2(getFixedNumber()), // 固定值5900 - ...numToNumarr2(46228), // 根据方法的toString()计算 + ...numToNumarr2(this.config.formatUid), // 根据方法的toString()计算, 使用了$_ts.aebi[1]作为任务的方法, ], 0, // 任务编号0>one>63-287的任务列表取得 [0], // 任务编号0>one>63>one>4-290的任务列表取得 - 6, // 下标80 + 6, // 下标81 [ // 编号510方法执行返回 1, ...numToNumarr2(0), ...numToNumarr2(0), - 0, - ...encryptMode2(decrypt(name.$_YWTU || ''), numarrAddTime(gv.keys[16])[0]), - ...numToNumarr2(+decode(decrypt(name.$_YVTX || ''))), + this.config['window.document.hidden'] ? 0 : 1, + ...encryptMode2(decrypt(ascii2string(gv.keys[22])), numarrAddTime(gv.keys[16])[0]), + ...numToNumarr2(+decode(decrypt(ascii2string(gv.keys[22])))), ], - 2, // 下标98 - [ - factorial(5) - factorial(3) * 2 + 100, // 100是cp2里取出来的,可能随版本变动 - 203, // cp2[76],检测window.HTMLFormElement是否存在 - 102, // cp2[120],检测document.createElement('from') - 103, // 检测window.top值是否为null - ], - 9, // 下标104 - [ - 0 | 8, // 8为cp2中的值 - ['bluetooth', 'cellular', 'ethernet', 'wifi', 'wimax'].indexOf(this.config['window.navigator.connection'].type) + 1, - ], + 2, // 下标99 + (() => { + const taskmap = {} + runTask('0>one>71>one>4-342', [taskmap]); + return [29, 30, 31, 32].map(it => { + return taskmap[ascii2string(gv.keys[it])](); + }) + })(), + 9, // 下标105 + (() => { // 编号133方法 + const { connType } = this.config['window.navigator.connection']; + const { charging, chargingTime, level } = this.config['window.navigator.battery'] + const connTypeIdx = ['bluetooth', 'cellular', 'ethernet', 'wifi', 'wimax'].indexOf(connType) + 1; + let oper = 0; + if (level) oper |= 2; + if (charging) oper |= 1; + if (connTypeIdx !== undefined) oper |= 8 + return [ + oper, + level * 100, + chargingTime >> 8, + chargingTime & 255, + connTypeIdx, + ] + })(), 13, [0], ) } getBasearr_v1() { - // 第1版计算cookie方法 + // 第1版计算cookie基础数组,cookie位数236位 const { getTaskNumber: gtn } = this; return numarrJoin( 3, diff --git a/src/handler/parser/common/dynamicExec.js b/src/handler/parser/common/dynamicExec.js deleted file mode 100644 index f546039..0000000 --- a/src/handler/parser/common/dynamicExec.js +++ /dev/null @@ -1,72 +0,0 @@ -const gv = require('@src/handler/globalVarible'); -const monitor = require('@utils/monitor'); -const logger = require('@utils/logger'); - -module.exports = function(...params) { - logger.trace('执行开始!'); - try { - return dynamicExec(...params); - } catch (err) { - logger.error(String(err)); - throw err; - } finally { - logger.trace('执行结束!'); - } -} - -function dynamicExec(taskItem, start = 0, args = [], loop_res = {}, global_res = {}) { - const codemap = gv.config.codemap; - const { key, taskarr: task } = taskItem; - args = monitor(args, `${key}_args`, { getLog: true, setLog: true }); - loop_res = monitor(loop_res, `${key}_loop_res`, { getLog: true, setLog: true }); - global_res = monitor(global_res, `${key}_global_res`, { getLog: true, setLog: true }); - logger.trace(`动态代码运行,任务列表:${key}, 起点:${start},长度:${task.length}`); - const data = []; - const ret = []; - ret[0] = args; - ret[2] = [ 'window', args ]; - const vars = [ - `${codemap.params[0]} = taskItem`, - `${codemap.params[1]} = start`, - `${codemap.params[2]} = task.length`, - `${codemap.params[3]} = ret`, - // 任务列表 - `${codemap.taskarr} = taskItem.taskarr`, - // 数据数组 - `${codemap.dataKey} = data`, - // 数据数组游标 - `${codemap.dataIdx} = 0`, - `${codemap.ret0} = ret[0]`, - `${codemap.ret1} = ret[1]`, - `${codemap.ret2} = ret[2]`, - `${codemap.ret3} = ret[3]`, - // 全局资源 - `${codemap.globalRes} = global_res`, - // 本地资源 - `${codemap.loopRes} = loop_res`, - `${codemap.forcur} = start`, - `${codemap.formax} = task.length`, - ...codemap.varible, - ].join(', '); - eval(`var ${vars};${codemap.commonFunc}`) - for (let t_cursor = start, idx = 0; t_cursor < task.length; t_cursor++) { - idx ++; - if (typeof codemap[task[t_cursor]] !== 'string') { - logger.error(`codemap中下标${task[t_cursor]}不存在值!`) - } else { - eval(`${codemap.forcur}=t_cursor`); - codemap[task[t_cursor]].split(';').map(it => it.trim()).forEach(c => { - try { - eval(c); - } catch(err) { - logger.error(`代码: ${c} 执行失败,当前任务:${taskItem.key}`) - debugger; - throw err; - } - }) - eval(`t_cursor=${codemap.forcur}`); - } - } - return ret[5]; -} - diff --git a/src/handler/parser/common/index.js b/src/handler/parser/common/index.js index 2123dee..69bcff3 100644 --- a/src/handler/parser/common/index.js +++ b/src/handler/parser/common/index.js @@ -21,7 +21,6 @@ module.exports = { numarrEncrypt: require('./numarrEncrypt'), numarr2string: require('./numarr2string'), numarrJoin: require('./numarrJoin'), - dynamicExec: require('./dynamicExec'), numarrAlterByNumber: require('./numarrAlterByNumber'), runTask: require('./runTask'), } diff --git a/src/handler/parser/common/modeEncrypt.js b/src/handler/parser/common/modeEncrypt.js index 9d4720f..bc490cc 100644 --- a/src/handler/parser/common/modeEncrypt.js +++ b/src/handler/parser/common/modeEncrypt.js @@ -56,14 +56,14 @@ function getCfg(numarr) { return [ret, arr]; } -function encryptMode1(valarr, keyarr, flag = 1) { +function encryptMode1(valarr, keyarr, flag = 1, random) { const cfg = getCfg(keyarr); var _$iv, _$j7, _$kb, _$ka, _$dV, _$du, _$jb; const max = Math.floor(valarr.length / 16) + 1; let ans = [], arr; const fill = 16 - valarr.length % 16; if (flag) { - ans = arr = new Array(4).fill(4294967295).map(it => Math.floor(Math.random() * it)); + ans = arr = new Array(4).fill(4294967295).map(it => Math.floor((random || Math.random()) * it)); } const copyarr = numToNumarr4.reverse_sign([...valarr, ...new Array(fill).fill(fill)]); for (let i = 0; i < max; ) { diff --git a/src/handler/parser/common/numarrAddTime.js b/src/handler/parser/common/numarrAddTime.js index 4efa162..98e96ce 100644 --- a/src/handler/parser/common/numarrAddTime.js +++ b/src/handler/parser/common/numarrAddTime.js @@ -2,9 +2,9 @@ const gv = require('@src/handler/globalVarible'); const numToNumarr4 = require('./numToNumarr4'); -module.exports = function(numarr, time) { +module.exports = function(numarr, time, random) { // time为时间戳除以1000后向上取整,如果不传则取当前时间戳 - const ele = Math.ceil(Math.random() * 256); + const ele = Math.ceil((random || Math.random()) * 256); const now = time || Math.floor(new Date().getTime() / 1000); const arr = [...numarr, ...numToNumarr4(now)].map(it => it ^ ele); arr.push(ele); diff --git a/src/handler/parser/common/random.js b/src/handler/parser/common/random.js index ece7126..dca2764 100644 --- a/src/handler/parser/common/random.js +++ b/src/handler/parser/common/random.js @@ -10,11 +10,11 @@ exports.execNumberByTime = function (times = 3) { return i; } -exports.execRandomByNumber = function (nums = 98) { +exports.execRandomByNumber = function (nums = 98, random) { // 指定次数的随机数取平均值后四舍五入 if (typeof nums !== 'number') return; const arr = [] - for (let i = 0; i < nums; i++) arr.push(Math.random()); + for (let i = 0; i < nums; i++) arr.push(random || Math.random()); const avg = _sum(arr) / nums; return [ avg * 100, diff --git a/src/handler/parser/common/runTask.js b/src/handler/parser/common/runTask.js index 6e32fd4..1bd95b8 100644 --- a/src/handler/parser/common/runTask.js +++ b/src/handler/parser/common/runTask.js @@ -1,45 +1,138 @@ // 直接通过动态代码执行来运行任务 // 该方法并未完全还原,谨慎使用 const gv = require('@src/handler/globalVarible'); -const dynamicExec = require('./dynamicExec'); +const monitor = require('@utils/monitor'); +const logger = require('@utils/logger'); const custask = require('../task'); const error = require('@utils/error'); -const logger = require('@utils/logger'); -module.exports = function(taskid, args, allowTask) { - // taskid为任务id,allowTask为允许执行的任务 - const task = gv.r2mka(taskid); - if (!task) { - error(`任务未找到`, { taskid }); - } - const global_res = new Proxy({}, { - get(target, property, receiver) { - // 由于每个版本下标都会变,在解析cd值生成8位偏移数的时候只用到了cp2数组,因此这里只返回cp2,需要注意! - logger.debug(`global_res 获取下标: ${property}`); - return gv.cp2; - } - }) - const loop_res = new Proxy([], { - get(target, key, receiver) { - const child = gv.r2mka().child_one; - if (Number(key) < child.length) { - const current = child[key]; - if (!key) return current; - return (...params) => { - if (custask[current.key]) { - // 自定义任务 - return custask[current.key](...params); - } - if (allowTask && !allowTask[key]) { - error('当前任务未在允许列表!', { key: current.key }); - } - return dynamicExec(current, 0, params, loop_res, global_res); - } +module.exports = function(task, args, allowTask) { + if (typeof task === 'string') task = gv.r2mka(task); + if (!task) throw new Error('任务未找到'); + logger.debug(`${task.key}执行开始!`); + try { + const global_res = new Proxy({}, { + get(target, property, receiver) { + // 由于每个版本下标都会变,在解析cd值生成8位偏移数的时候只用到了cp2数组,因此这里只返回cp2,需要注意! + logger.debug(`global_res 获取下标: ${property}`); + return gv.cp2; } - if (gv.config.offsetConst[key]) return gv.config.offsetConst[key]; - error('loop_res取值未找到', { key }); - } - }) - return dynamicExec(task, 0, args, loop_res, global_res); + }) + const loop_res = new Proxy([], { + get(target, key, receiver) { + const child = gv.r2mka().child_one; + if (Number(key) < child.length) { + const current = child[key]; + if (!key) return current; + return (...params) => { + if (custask[current.key]) { + // 自定义任务 + return custask[current.key](...params); + } + if (allowTask && !allowTask[key]) { + error('当前任务未在允许列表!', { key: current.key }); + } + return dynamicExec(current, 0, params, loop_res, global_res); + } + } + if (gv.config.offsetConst[key]) return gv.config.offsetConst[key]; + error('loop_res取值未找到', { key }); + } + }) + return dynamicExec(task, 0, args, loop_res, global_res); + } catch (err) { + logger.error(String(err)); + throw err; + } finally { + logger.debug(`${task.key}执行结束!`); + } +} + +function taskFactory(task, args) { + return (...params) => { + if (custask[task.key]) return custask[task.key](...params); + return module.exports(task, params); + } +} + +function getParentSubTask(task, loopRes) { + const subTask = []; + if (!task) debugger; + while (task.isReset === 0 && task.key !== '0-0') { + subTask.push(['window', 'args', ...task.child_one.slice(2).map(it => taskFactory(it))]); + task = task.parent; + } + return [loopRes, ...subTask.reverse()]; +} + + +function dynamicExec(taskItem, start = 0, args = [], loop_res = {}, global_res = {}) { + const codemap = gv.config.codemap; + const { key, taskarr: task } = taskItem; + args = monitor(args, `${key}_args`, { getLog: true, setLog: true }); + loop_res = monitor(loop_res, `${key}_loop_res`, { getLog: true, setLog: true }); + global_res = monitor(global_res, `${key}_global_res`, { getLog: true, setLog: true }); + logger.debug(`动态代码运行,任务列表:${key}, 起点:${start},长度:${task.length}`); + const data = []; + const ret = []; + ret[0] = args; + ret[2] = [ 'window', args ]; + ret[3] = getParentSubTask(taskItem.parent, loop_res); + const taskItemProxy = new Proxy({}, { + get(target, property, receiver) { + const idx = codemap.taskAttr.indexOf(property); + if (idx === -1) debugger; + const name = ['lens', 'isReset', 'taskarr', 'child_one', 'child_two'][idx]; + if (!name) debugger; + return taskItem[name]; + } + }) + const vars = [ + `${codemap.params[0]} = taskItemProxy`, + `${codemap.params[1]} = start`, + `${codemap.params[2]} = task.length`, + `${codemap.params[3]} = ret`, + // 任务工厂函数 + `${codemap.taskFactory} = taskFactory`, + `${codemap.keyname} = gv.ts.cp[1]`, + // 任务列表 + `${codemap.taskarr} = task`, + // 数据数组 + `${codemap.dataKey} = data`, + // 数据数组游标 + `${codemap.dataIdx} = 0`, + `${codemap.ret0} = ret[0]`, + `${codemap.ret1} = ret[1]`, + `${codemap.ret2} = ret[2]`, + `${codemap.ret3} = ret[3]`, + // 全局资源 + `${codemap.globalRes} = global_res`, + // 本地资源 + `${codemap.loopRes} = loop_res`, + `${codemap.forcur} = start`, + `${codemap.formax} = task.length`, + ...codemap.varible, + ].join(', '); + eval(`var ${vars};${codemap.commonFunc}`) + for (let t_cursor = start, idx = 0; t_cursor < task.length; t_cursor++) { + idx ++; + if (typeof codemap[task[t_cursor]] !== 'string') { + logger.error(`codemap中下标${task[t_cursor]}不存在值!`) + } else { + logger.debug(`(${key}, ${idx})执行代码:${codemap[task[t_cursor]]}`); + eval(`${codemap.forcur}=t_cursor`); + codemap[task[t_cursor]].split(';').map(it => it.trim()).forEach(c => { + try { + eval(c); + } catch(err) { + logger.error(`代码: ${c} 执行失败,当前任务:${key}`) + debugger; + throw err; + } + }) + eval(`t_cursor=${codemap.forcur}`); + } + } + return ret[5]; } diff --git a/src/handler/parser/r2mka.js b/src/handler/parser/r2mka.js index 78c4356..e4d4f46 100644 --- a/src/handler/parser/r2mka.js +++ b/src/handler/parser/r2mka.js @@ -27,8 +27,9 @@ function gtHandler(str, curr) { const parse = (() => { let count = 0; const valMap = {}; - return function(val, deep = 0, deeps = [0]) { + return function(val, deep = 0, deeps = [0], parent = null) { const str = val.taskstr; + val.parent = parent; val.taskstr = str; val.val = {}; if (!str) { @@ -41,12 +42,12 @@ const parse = (() => { valMap[val.key] = val; val.child_one.map((it, idx) => { if (it) { - parse(it, deep + 1, [...deeps, 'one', idx]); + parse(it, deep + 1, [...deeps, 'one', idx], val); } }); val.child_two.map((it, idx) => { if (it) { - parse(it, deep + 1, [...deeps, 'two', idx]); + parse(it, deep + 1, [...deeps, 'two', idx], val); } }); return (key) => { diff --git a/src/handler/parser/task/index.js b/src/handler/parser/task/index.js index 997e205..f22307a 100644 --- a/src/handler/parser/task/index.js +++ b/src/handler/parser/task/index.js @@ -1,12 +1,29 @@ const gv = require('@src/handler/globalVarible'); -// 预期任务作用,实际还没有用到,需要多版本对比 -const expectTask = { - '0>one>71>one>4>one>3-344': '计算阶乘' -} +/* + * 1. 0>one>71>one>4>two>2-348与0>one>71>one>4>two>12-358返回值来源一致 + */ module.exports = { '0>one>21-23': (num) => { return Math.abs(num) % 8; }, + '0>one>71>one>4>two>2-348': () => { + // 该任务首先检测document.createElement('a')是否能成功,成功则返回gv.cp2中的固定值 + return 102; + }, + '0>one>71>one>4>two>12-358': () => { + // 该任务首先检测document.createElement('form')是否能成功,成功则返回gv.cp2中的固定值 + return 102; + }, + '0>one>71>one>4>two>4-350': () => { + // 该任务首先检测window.navigator.userAgent是否为string格式,是的话进行计算后返回 + // **需要注意是否返回同一值** + return 224; + }, + '0>one>71>one>4>two>14-360': () => { + // 该任务首先检测window.navigator.userAgent是否为string格式,是的话进行计算后返回 + // **需要注意是否返回同一值** + return 225; + } } diff --git a/src/handler/viewer/dkeys.js b/src/handler/viewer/dkeys.js new file mode 100644 index 0000000..f400a06 --- /dev/null +++ b/src/handler/viewer/dkeys.js @@ -0,0 +1,14 @@ +// 遇到的gv.keys使用放在这里方便归档查阅 +const gv = require('@src/handler/globalVarible'); + +exports.dkeys = function () { + return { + 7: gv.utils.ascii2string(gv.keys[7]).split(';'), + 22: gv.utils.ascii2string(gv.keys[22]), + 29: gv.utils.ascii2string(gv.keys[29]), + 30: gv.utils.ascii2string(gv.keys[30]), + 31: gv.utils.ascii2string(gv.keys[31]), + 33: gv.utils.ascii2string(gv.keys[33]), + 34: gv.utils.ascii2string(gv.keys[34]), + }; +} diff --git a/src/handler/viewer/index.js b/src/handler/viewer/index.js new file mode 100644 index 0000000..2daa7f4 --- /dev/null +++ b/src/handler/viewer/index.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('./dkeys'), +} diff --git a/src/makeCodeHigh.js b/src/makeCodeHigh.js index 5dc1ea0..2c487c5 100644 --- a/src/makeCodeHigh.js +++ b/src/makeCodeHigh.js @@ -6,6 +6,7 @@ const Coder = require('./handler/Coder'); const Cookie = require('./handler/Cookie'); const unescape = require('@utils/unescape'); const gv = require('@src/handler/globalVarible'); +const getCode = require('@utils/getCode'); function parseR2mka(text) { const start = text.indexOf('"') + 1; @@ -13,15 +14,15 @@ function parseR2mka(text) { return unescape(text.substr(start, end)); } -module.exports = function (ts, immucfg) { - console.log('还原更多加密文件,如app.js等,作者开发中,可关注微信订阅号`码功`获取项目更新推送!'); - return +module.exports = function (ts, immucfg, mate) { gv._setAttr('_ts', ts); const startTime = new Date().getTime(); const coder = new Coder(ts, immucfg); const { code, $_ts } = coder.run(); const r2mkaText = parseR2mka(coder.r2mkaText); - const cookie = new Cookie($_ts, r2mkaText).run(); - return cookie; + const cookieVal = new Cookie($_ts, r2mkaText).run(); + const cookieKey = gv.utils.ascii2string(gv.keys[7]).split(';')[5] + 'P'; + debugger; + getCode(mate.url, `${cookieKey}=${cookieVal}`); } diff --git a/utils/getCode.js b/utils/getCode.js index 0526ba0..b4dee72 100644 --- a/utils/getCode.js +++ b/utils/getCode.js @@ -1,5 +1,5 @@ -// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" -const request = require('request-promise'); +process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" +const { request, cookieJar } = require('./request'); const cheerio = require('cheerio'); const isValidUrl = require('./isValidUrl'); const _get = require('lodash/get'); @@ -7,16 +7,26 @@ const urlresolve = require('url').resolve; function addRequestHead(uri) { return { - // proxy: 'http://127.0.0.1:7777', - // gzip: true + proxy: 'http://127.0.0.1:8888', + gzip: true, uri, - "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", resolveWithFullResponse: true, simple: false, + headers: { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', + 'Connection': 'keep-alive', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', + 'Accept-Encoding': 'gzip, deflate, br, zstd', + 'Accept-Language': 'zh-CN,zh;q=0.9', + } } } -module.exports = async function getCode(url) { +module.exports = async function getCode(url, cookieStr) { + if (cookieStr) { + cookieJar.setCookie(request.cookie(cookieStr), url); + console.log(`当前cookie:${cookieJar.getCookieString(url)}`); + } if (!isValidUrl(url)) throw new Error('输入链接不正确'); const res = await request(addRequestHead(url)); const $ = cheerio.load(res.body); @@ -34,3 +44,23 @@ module.exports = async function getCode(url) { } throw new Error('js外链中没有瑞数的代码文件'); } + +// Host: wcjs.sbj.cnipa.gov.cn +// Connection: keep-alive +// Upgrade-Insecure-Requests: 1 +// sec-ch-ua: "Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123" +// sec-ch-ua-mobile: ?0 +// sec-ch-ua-platform: "macOS" +// User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 +// Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 +// Accept-Encoding: gzip, deflate, br, zstd +// Accept-Language: zh-CN,zh;q=0.9 +// Sec-Fetch-Dest: document +// Sec-Fetch-Mode: navigate +// +// Sec-Fetch-Site: none +// Sec-Fetch-User: ?1 +// +// +// Sec-Fetch-Site: same-origin +// Referer: https://wcjs.sbj.cnipa.gov.cn/sgtmi diff --git a/utils/initGv.js b/utils/initGv.js index c6ff182..708f326 100644 --- a/utils/initGv.js +++ b/utils/initGv.js @@ -3,14 +3,17 @@ const fs = require('fs'); const { init } = require('@src/handler/parser/'); const logger = require('./logger'); const gv = require('@src/handler/globalVarible'); +const Coder = require('@src/handler/Coder'); module.exports = function(filepath) { if (typeof filepath !== 'string') { if (typeof filepath === 'number') gv._setAttr('version', filepath); - filepath = paths.exampleResolve('codes', `${gv.version}-$_ts-full.json`) + filepath = paths.exampleResolve('codes', `${gv.version}-$_ts.json`) } if (!fs.existsSync(filepath)) throw new Error(`输入文件不存在: ${filepath}`); logger.debug(`初始化GlobalVarible变量,$_ts配置文件:${filepath}`); - init(JSON.parse(fs.readFileSync(filepath, 'utf8'))); + const coder = new Coder(JSON.parse(fs.readFileSync(filepath, 'utf8'))); + const { code, $_ts } = coder.run(); + init($_ts); return gv; }; diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 0000000..35a05e7 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,8 @@ +const rp = require('request-promise'); +const cookieJar = rp.jar() +const request = rp.defaults({ jar: cookieJar }) + +module.exports = { + request, + cookieJar, +} From 7757ad59341e1278f1f3ea37f2c09fe6374c9193 Mon Sep 17 00:00:00 2001 From: rnet Date: Wed, 10 Apr 2024 03:37:47 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=201.=20=E5=A2=9E=E5=8A=A0makecode-hig?= =?UTF-8?q?h=E5=AD=90=E5=91=BD=E4=BB=A4=202.=20=E5=A2=9E=E5=8A=A0basearr?= =?UTF-8?q?=E5=AD=90=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 66 +++++++++++- main.js | 34 +++++- package.json | 1 + src/adapt/index.js | 6 +- src/basearrParse.js | 165 ++++++++++++++++++++++++++++++ src/handler/AppCode.js | 94 +++++++++++++++++ src/handler/Coder.js | 34 +++++- src/handler/CoderHigh.js | 1 - src/handler/Cookie.js | 15 ++- src/handler/globalVarible.js | 4 + src/handler/parser/common/temp.js | 28 ----- src/makeCode.js | 4 +- src/makeCodeHigh.js | 102 ++++++++++++++++-- src/makeCookie.js | 2 +- utils/getCode.js | 64 +++++++----- 15 files changed, 534 insertions(+), 86 deletions(-) create mode 100644 src/basearrParse.js create mode 100644 src/handler/AppCode.js delete mode 100644 src/handler/CoderHigh.js delete mode 100644 src/handler/parser/common/temp.js diff --git a/README.md b/README.md index 15288d7..f1ff525 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,63 @@ Examples: ``` -### 2.3. exec子命令 +### 2.3. makecode-high子命令 + +执行子命令`makecode-high`生成cookie,解码两次请求返回的网站代码(功能涵盖makecode子命令),调用示例: + +1. npx方式:`npx rs-reverse makecode-high -u url` +2. 文件方式:`node main.js makecode-high -u url` + +该命令第一次请求生成cookie带入第二次请求,将两次请求返回的加密代码及动态代码解码后保存到`output/makecode-high`目录中,和makecode命令区别为该命令只提供-u方式执行! + +```console + $ npx rs-reverse makecode-high -h +rs-reverse makecode-high + +解码两次请求返回的网站代码(功能涵盖makecode子命令) + +Options: + -h 显示帮助信息 [boolean] + -f + -l, --level 日志打印等级,参考log4js,默认为info [string] + -u, --url 瑞数返回204状态码的请求地址 [string] [required] + -a, --adapt 已经做了适配的网站名称,不传则为cnipa [string] + -v, --version 显示版本号 [boolean] + +Examples: + rs-reverse makecode-high -u http://url/path +``` + +调用示例: + +```bash + $ npx rs-reverse makecode-high -u https://wcjs.sbj.cnipa.gov.cn/sgtmi + +第1次请求: + + url方式提取的ts:/path/to/output/makecode-high/first/ts.json + url方式提取的静态文本:/path/to/output/makecode-high/first/immucfg.json + 程序生成的ts:/path/to/output/makecode-high/first/ts-full.json + url方式提取的javascript代码:/path/to/output/makecode-high/first/cCdzB9ZjDFks.a728b22.js + url方式提取的html代码:/path/to/output/makecode-high/first/sgtmi.html + cCdzB9ZjDFks.a728b22.js生成的动态代码:/path/to/output/makecode-high/first/cCdzB9ZjDFks.a728b22-dynamic.js + +第2次请求: + + url方式提取的ts:/path/to/output/makecode-high/second/ts.json + url方式提取的静态文本:/path/to/output/makecode-high/second/immucfg.json + 程序生成的ts:/path/to/output/makecode-high/second/ts-full.json + url方式提取的javascript代码:/path/to/output/makecode-high/second/cCdzB9ZjDFks.a728b22.js + url方式提取的html代码:/path/to/output/makecode-high/second/sgtmi.html + cCdzB9ZjDFks.a728b22.js生成的动态代码:/path/to/output/makecode-high/second/cCdzB9ZjDFks.a728b22-dynamic.js + url方式提取的javascript代码:/path/to/output/makecode-high/second/chunk-vendors.66e24864.js + url方式提取的javascript代码:/path/to/output/makecode-high/second/app.9f7a91c9.js + chunk-vendors.66e24864.js生成的解密代码:/path/to/output/makecode-high/second/chunk-vendors.66e24864-decrypt.js + app.9f7a91c9.js生成的解密代码:/path/to/output/makecode-high/second/app.9f7a91c9-decrypt.js + +``` + +### 2.4. exec子命令 exec子命令用于开发中或者演示时使用。命令示例: @@ -154,10 +210,10 @@ Examples: 适配文件配置在目录`./src/adapt/`下,已完成兼容配置: -网站 | 名称 | makecode | makecookie | 适配版本 | 是否逆向验证 ----- | ---- | -------- | ---------- | -------- | -------------- -商标网 | cnipa | 👌 | 👌 | - | Y -瑞数官网 | riversecurity | 👌 | 👌 | 版本1 | N +网站 | 名称 | makecode | makecookie | makecode-high | 适配版本 | 是否逆向验证 +---- | ---- | -------- | ---------- | ------------- | -------- | -------------- +商标网 | cnipa | 👌 | 👌 | 👌 | - | Y +瑞数官网 | riversecurity | 👌 | 👌 | N | 版本1 | N 以瑞数官网实例如:`npx rs-reverse makecookie -u https://www.riversecurity.com/resources.shtml -a riversecurity` diff --git a/main.js b/main.js index 98cfa8a..adf507a 100755 --- a/main.js +++ b/main.js @@ -7,6 +7,7 @@ const fs = require('fs'); const makeCode = require('@src/makeCode'); const makeCodeHigh = require('@src/makeCodeHigh'); const makeCookie = require('@src/makeCookie'); +const basearrParse = require('@src/basearrParse'); const utils = require('@utils/'); const { logger, getCode } = utils; const pkg = require(paths.package); @@ -64,6 +65,7 @@ const commandHandler = (command, argv) => { const ts = argv.url?.$_ts || argv.file || require(paths.exampleResolve('codes', `${gv.version}-\$_ts.json`)); logger.trace(`传入的$_ts.nsd: ${ts.nsd}`); logger.trace(`传入的$_ts.cd: ${ts.cd}`); + gv._setAttr('argv', argv); try { if (argv.url) { command(ts, adapt(argv.url, argv.adapt), argv.url); @@ -88,8 +90,15 @@ module.exports = yargs }) .command({ command: 'makecode-high', - describe: '生成动态代码-高级', - builder: commandBuilder, + describe: '解码两次请求返回的网站代码(功能涵盖makecode子命令)', + builder: { + ...commandBuilder, + f: undefined, + u: { + ...commandBuilder.u, + demandOption: true, + } + }, handler: commandHandler.bind(null, makeCodeHigh), }) .command({ @@ -136,6 +145,27 @@ module.exports = yargs console.log([`\n 输入:${argv.code}`, `输出:${output}\n`].join('\n ')); } }) + .command({ + command: 'basearr', + describe: '接收压缩前数字数组的序列化文本并格式化解析', + builder: { + l: { + alias: 'level', + describe: '日志打印等级,参考log4js,默认为info', + type: 'string', + }, + b: { + alias: 'basearr', + describe: '压缩前数字数组的序列化文本', + type: 'array', + demandOption: true, + } + }, + handler: (argv) => { + debugLog(argv.level); + basearrParse(argv.basearr); + } + }) .updateStrings({ 'Show version number': '显示版本号', 'Show help': '显示帮助信息', diff --git a/package.json b/package.json index f70715e..2c8bdfa 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "license": "ISC", "dependencies": { "cheerio": "^1.0.0-rc.12", + "fs-extra": "^11.2.0", "jest": "^29.7.0", "lodash": "^4.17.21", "log4js": "^6.9.1", diff --git a/src/adapt/index.js b/src/adapt/index.js index 90af39a..b9509bc 100644 --- a/src/adapt/index.js +++ b/src/adapt/index.js @@ -21,10 +21,10 @@ module.exports = function({ jscode, url }, name) { gv._setAttr('version', val); return ans; } - const idx = jscode.indexOf(val); + const idx = jscode.code.indexOf(val); if (idx === -1) throw new Error(`${key}值数据未找到,请查看文档:src/adapt/readme.md`); - if (jscode.indexOf(val, idx + val.length) > -1) throw new Error(`${key}对应的值${val}在代码中非唯一,请检查!`); - const fullString = findFullString(jscode, val); + if (jscode.code.indexOf(val, idx + val.length) > -1) throw new Error(`${key}对应的值${val}在代码中非唯一,请检查!`); + const fullString = findFullString(jscode.code, val); return { ...ans, [key]: fullString }; }, {}); } diff --git a/src/basearrParse.js b/src/basearrParse.js new file mode 100644 index 0000000..d77e2a0 --- /dev/null +++ b/src/basearrParse.js @@ -0,0 +1,165 @@ +const logger = require('@utils/logger'); +const error = require('@utils/error'); + +const parseBlock = (item, id) => { + if (typeof id !== 'number') return { ...item, show: id }; + const val = item.val; + let oper = 0; + const next = (val) => { + switch(val.type) { + case 'div': + oper += 1; + break; + case 'val': + case 'arr': + oper = val.idx + val.len; + break; + } + return val; + } + switch(id) { + case 0: + item.child = [ + next(div(val, oper)), + next(value(val, oper, 1, 'window.navigator.maxTouchPoints')), + next(value(val, oper, 1, 'window.eval.toString().length')), + next(div(val, oper)), + next(value(val, oper, 4, 'window.navigator.userAgent')), + value(val, oper, 1, 'length'), + next(block(val, oper, 'window.navigator.platform')), + next(value(val, oper, 4, 'execNumberByTime')), + next(value(val, oper, 2, 'execRandomByNumber')), + next(div(val, oper)), + next(div(val, oper)), + next(value(val, oper, 4, '3136373737323136')), + next(value(val, oper, 4, '0')), + next(value(val, oper, 2, 'window.innerHeight')), + next(value(val, oper, 2, 'window.innerWidth')), + next(value(val, oper, 2, 'window.outerHeight')), + next(value(val, oper, 2, 'window.outerWidth')), + ]; + break; + case 1: + item.child = [ + next(value(val, oper, 1, '0 < +ascii2string(gv.keys[24]) < 8')), + next(div(val, oper)), + next(value(val, oper, 4, 'r2mkaTime + runTime - startTime')), + next(value(val, oper, 4, '+ascii2string(gv.keys[19])')), + next(value(val, oper, 8, 'Math.floor(Math.random() * 1048575) * 4294967296 + (((currentTime + 1) & 4294967295) >>> 0)')), + next(value(val, oper, 1, '+ascii2string(gv.keys[24])')), + ]; + break; + case 2: + item.child = [ + next(value(val, oper, 4, '16777216')), + next(value(val, oper, 4, '0')), + next(value(val, oper, 2, '5900')), + next(value(val, oper, 2, 'codeToStringUid')), + ]; + break; + case 4: + item.child = [ // 编号510方法执行返回 + next(value(val, oper, 1, '1')), + next(value(val, oper, 2, '0')), + next(value(val, oper, 2, '0')), + next(value(val, oper, 1, 'window.document.hidden')), + next(value(val, oper, 8, 'encryptMode2(decrypt(ascii2string(gv.keys[22])), numarrAddTime(gv.keys[16])[0])')), + next(value(val, oper, 2, '+decode(decrypt(ascii2string(gv.keys[22])))')), + ]; + break; + case 5: + item.child = [ + next(value(val, oper, 1, 'taskmap[ascii2string(gv.keys[29])]();')), + next(value(val, oper, 1, 'taskmap[ascii2string(gv.keys[30])]();')), + next(value(val, oper, 1, 'taskmap[ascii2string(gv.keys[31])]();')), + next(value(val, oper, 1, 'taskmap[ascii2string(gv.keys[32])]();')), + ] + break; + case 6: + item.child = [ + next(value(val, oper, 1, 'battery and connection operator')), + next(value(val, oper, 1, 'window.navigator.battery.level * 100')), + next(value(val, oper, 1, 'window.navigator.battery.chargingTime >> 8')), + next(value(val, oper, 1, 'window.navigator.battery.chargingTime & 255')), + next(value(val, oper, 1, 'window.navigator.connection')), + ]; + break; + } + return item; +} + +function value(arr, oper, len, show) { + return { + show, + val: arr.slice(oper, oper + len), + idx: oper, + type: 'val', + len, + } +} + +function block(arr, oper, id) { + const num = arr[oper++] + return parseBlock({ val: arr.slice(oper, num + oper), len: num, idx: oper, type: 'arr' }, id); +} + +function div(arr, oper, show = '-------') { + return { show, val: arr[oper], idx: oper, type: 'div' }; +} + +function print(divarr, deep = 0, parentIdx = 0) { + divarr.forEach((it) => { + const idx = deep ? `(${it.idx},${it.idx + parentIdx})` : `(${it.idx})`; + console.log([new Array(deep * 4).fill(' ').join(''), idx, `[${it.val || '0'}]`, it.show].filter(Boolean).join(' ')); + if (it.child) print(it.child, deep + 1, it.idx); + }) +} + +function parse(basearr) { + let oper = 0; + console.log('\n'); + const next = (val) => { + if (!val) debugger; + switch(val.type) { + case 'div': + oper += 1; + break; + case 'val': + case 'arr': + oper = val.idx + val.len; + break; + } + return val; + } + print(new Array(8).fill('').reduce((ans, it, idx) => { + return [ + ...ans, + next(div(basearr, oper)), + value(basearr, oper, 1, 'length'), + next(block(basearr, oper, idx)), + ]; + }, [])); +} + +module.exports = function (basearrs) { + try { + basearrs = basearrs.map(it => { + basearr = JSON.parse(it); + if (!Array.isArray(basearr)) { + throw new Error(''); + } + return basearr; + }) + } catch (err) { + error('请传入序列化后的数字数组!'); + } + basearrs.forEach(parse); + if (basearrs.length > 1) { + console.log('\n'); + for (let i = 0, j = new Set(); i < Math.max(...basearrs.map(it => it.length)); i++) { + j.clear(); + basearrs.forEach(it => j.add(it[i])); + if (j.size !== 1) console.log(`不同点下标${i}:${basearrs.map(it => it[i]).join(' ')}`); + } + } +} diff --git a/src/handler/AppCode.js b/src/handler/AppCode.js new file mode 100644 index 0000000..c955802 --- /dev/null +++ b/src/handler/AppCode.js @@ -0,0 +1,94 @@ +const gv = require('@src/handler/globalVarible'); + +module.exports = class { + constructor(params, idx) { + this.oper = 0; + this.params = params; + this.idx = idx; + } + + getLength() { + let one, two, three, four, dkey = gv.decryptKeys[5]; + const text = this.params[0]; + const flag = dkey[text.charCodeAt(this.oper++)]; + if (flag <= 80) return flag; + if (flag == 81) { + return dkey[text.charCodeAt(this.oper++)] + 80; + } + if (flag == 82) { + one = dkey[text.charCodeAt(this.oper++)]; + two = dkey[text.charCodeAt(this.oper++)]; + return one + two * 86 + 165; + } + if (flag == 83) { + one = dkey[text.charCodeAt(this.oper++)]; + two = dkey[text.charCodeAt(this.oper++)]; + three = dkey[text.charCodeAt(this.oper++)]; + return one + two * 86 + three * 86 * 86 + 7560; + } + if (flag == 84) { + one = dkey[text.charCodeAt(this.oper++)]; + two = dkey[text.charCodeAt(this.oper++)]; + three = dkey[text.charCodeAt(this.oper++)]; + four = dkey[text.charCodeAt(this.oper++)]; + return one + two * 86 + three * 86 * 86 + four * 86 * 86 * 86 + 643615; + } + } + + getKeys(len) { + const keys = []; + for(let i = 0; i <= len; i++) { + const j = Math.floor((this.random || Math.random()) * 4294967295) % len + 0; + keys[i] = keys[j] || `$_${j}`; + keys[j] = `$_${i}`; + } + return keys; + } + + decrypt() { + const keys = this.getKeys(this.getLength()); + const name = `$$_${this.idx}`; + const num = this.getLength(); + const ret = new Array(num), res = []; + const staticText = this.params[1].split('~'); + for(let i = 0, j; i < num; i++) { + i % 2 == 0 ? j = this.getLength() : j >>= 3; + const next = this.getLength(); + switch(j & 7) { + case 0: + ret[i] = res[next]; + break; + case 1: + ret[i] = keys[next]; + break; + case 2: + ret[i] = gv.ts.cp[1][next]; + break; + case 3: + const val = this.params[0].substr(this.oper, next); + this.oper += next; + res.push(val); + ret[i] = val; + break; + case 4: + // ret[i] = `${name}[${next}]`; + ret[i] = `"${staticText[next]}"`; + break; + case 5: + ret[i] = this.params[2][next] + break; + } + } + // return `window[${name}]=${JSON.stringify(staticText)};${ret.join('')}`; + return ret.join(''); + } + + run() { + const code = this.decrypt(); + if (this.getLength() !== 0) { + debugger; + throw new Error('预期值不符,需要增加额外代码适配!'); + }; + return code; + } +} diff --git a/src/handler/Coder.js b/src/handler/Coder.js index 5f67b80..4e29957 100644 --- a/src/handler/Coder.js +++ b/src/handler/Coder.js @@ -18,6 +18,9 @@ module.exports = class { this.opdata = dataOper(); this.r2mkaText = null; this.immucfg = immucfg || gv.config.immucfg; + this.functionsPushStart = { 1: 938, 2: 0, 3: 0, 4: 0 }; // 生成方法排序数据的开始下标, 938为键值为348所命中的代码中获得 + this.functionsNameSort = []; // 存放vm代码中定义的方法,用于计算代码特征码使用 + this.mainFunctionIdx = null; // 主函数(编号为1)在代码中的开始与结束下标 } run() { @@ -88,6 +91,7 @@ module.exports = class { this.gren(i, codeArr); } codeArr.push('}}}}}}}}}}'.substr(opmate.getMateOri('G_$gG') - 1)); + this.mainFunctionIdx.push(codeArr.join('').length); return codeArr; } @@ -133,15 +137,21 @@ module.exports = class { opmate.setMate('_$$c'); opdata.setData('_$$k', func2(opmate.getMateOri('_$$c'))); if (current) { + if (this.mainFunctionIdx === null) this.mainFunctionIdx = [codeArr.join('').length]; codeArr.push("function ", opmate.getMate('_$jw'), "(", opmate.getMate('_$$6')); opdata.getData('_$_K').forEach(it => codeArr.push(",", keynames[it])); codeArr.push("){"); } else { codeArr.push("(function(", opmate.getMate('G_$dK'), ",", opmate.getMate('G_$kv'), "){var ", opmate.getMate('_$$6'), "=0;"); } - opdata.getData('_$$w').forEach(([key1, key2]) => { - codeArr.push("function ", keynames[key1], "(){var ", opmate.getMate('_$$q'), "=[", key2, "];Array.prototype.push.apply(", opmate.getMate('_$$q'), ",arguments);return ", opmate.getMate('_$$g'), ".apply(this,", opmate.getMate('_$$q'), ");}"); - }); + const functionsNameMap = opdata.getData('_$$w').reduce((ans, [key1, key2], idx) => { + const arr = ["function ", keynames[key1], "(){var ", opmate.getMate('_$$q'), "=[", key2, "];Array.prototype.push.apply(", opmate.getMate('_$$q'), ",arguments);return ", opmate.getMate('_$$g'), ".apply(this,", opmate.getMate('_$$q'), ");}"] + codeArr.push(...arr); + return { + ...ans, + [keynames[key1]]: arr.join(''), + } + }, {}); opdata.getData('_$cS').forEach(item => { for (let i = 0; i < item.length - 1; i += 2) { codeArr.push(keycodes[item[i]], keynames[item[i + 1]]) @@ -157,11 +167,29 @@ module.exports = class { codeArr.push(opmate.getMate('_$$6'), ",", opmate.getMate('_$aw'), "=", opmate.getMate('G_$kv'), "[", current, "];"); codeArr.push("while(1){", opmate.getMate('_$cu'), "=", opmate.getMate('_$aw'), "[", opmate.getMate('_$ku'), "++];"); codeArr.push("if(", opmate.getMate('_$cu'), "<", opmate.getMateOri('_$bf'), "){"); + if ([1, 2, 3, 4].includes(current)) { + this.functionsSort(current, functionsNameMap); + } const codelist = this.grenIfelse(0, opmate.getMateOri('_$bf'), []); codeArr.push(...codelist); codeArr.push("}else ", ';', '}'); } + functionsSort(current, functionsNameMap) { + const start = this.functionsPushStart[current]; + const { opdata, opmate } = this + this.$_ts.aebi[current].slice(start, start + opdata.getData('_$$w').length).forEach(idx => { + const numarr = opdata.getData('_$$k')[idx]; + if (!numarr || numarr.length !== 5) throw new Error(''); + const name = this.keynames[numarr[3]]; + this.functionsNameSort.push({ + name, + current, + code: functionsNameMap[name], + }); + }) + } + grenIfelse(start, end, codeArr) { const { opdata, opmate } = this const arr8 = opdata.getData('arr8') diff --git a/src/handler/CoderHigh.js b/src/handler/CoderHigh.js deleted file mode 100644 index c060d83..0000000 --- a/src/handler/CoderHigh.js +++ /dev/null @@ -1 +0,0 @@ -// 整站代码还原 diff --git a/src/handler/Cookie.js b/src/handler/Cookie.js index 4b16b75..ec6f151 100644 --- a/src/handler/Cookie.js +++ b/src/handler/Cookie.js @@ -43,7 +43,9 @@ const developConfig = { } module.exports = class { - constructor(ts, r2mkaText) { + constructor(ts, r2mkaText, coder, vmcode) { + this.coder = coder; + this.vmcode = vmcode; parser.init(ts, r2mkaText) const current = new Date().getTime() + 1000; this.config = { @@ -151,7 +153,7 @@ module.exports = class { ...numToNumarr4(16777216), // gv.cp2取得 ...numToNumarr4(0), // 任务编号0-0的任务列表取得 ...numToNumarr2(getFixedNumber()), // 固定值5900 - ...numToNumarr2(this.config.formatUid), // 根据方法的toString()计算, 使用了$_ts.aebi[1]作为任务的方法, + ...this.getCodeUid(), ], 0, // 任务编号0>one>63-287的任务列表取得 [0], // 任务编号0>one>63>one>4-290的任务列表取得 @@ -277,4 +279,13 @@ module.exports = class { getTaskNumber(name, idx) { return gv.r2mka(name).taskarr[idx]; } + + getCodeUid() { + const mainFunctionCode = this.vmcode.slice(...this.coder.mainFunctionIdx); + const one = uuid(this.coder.functionsNameSort[ascii2string(gv.keys[33])].code); + const len = parseInt(mainFunctionCode.length / 100); + const start = len * ascii2string(gv.keys[34]); + const two = uuid(mainFunctionCode.substr(start, len)) + return numToNumarr2((one ^ two) & 65535); + } } diff --git a/src/handler/globalVarible.js b/src/handler/globalVarible.js index e1d30e6..a67d45c 100644 --- a/src/handler/globalVarible.js +++ b/src/handler/globalVarible.js @@ -66,6 +66,10 @@ class GlobalVarible { // 返回密钥集合 return cache.keys; } + get argv() { + // 命令调用参数 + return cache.argv; + } _getAttr(attr) { return cache[attr]; } diff --git a/src/handler/parser/common/temp.js b/src/handler/parser/common/temp.js deleted file mode 100644 index 7466571..0000000 --- a/src/handler/parser/common/temp.js +++ /dev/null @@ -1,28 +0,0 @@ -const gv = require('@src/handler/globalVarible'); - -function (text) { - let one, two, three, four, idx = 0, dkey = gv.decryptKeys[5]; - const flag = dkey[text.charCodeAt(idx++)]; - if (flag <= 80) return flag; - if (flag == 81) { - return dkey[text.charCodeAt(idx++)] + 80; - } - if (flag == 82) { - one = dkey[text.charCodeAt(idx++)]; - two = dkey[text.charCodeAt(idx++)]; - return one + two * 86 + 165; - } - if (flag == 83) { - one = dkey[text.charCodeAt(idx++)]; - two = dkey[text.charCodeAt(idx++)]; - three = dkey[text.charCodeAt(idx++)]; - return one + two * 86 + three * 86 * 86 + 7560; - } - if (flag == 84) { - one = dkey[text.charCodeAt(idx++)]; - two = dkey[text.charCodeAt(idx++)]; - three = dkey[text.charCodeAt(idx++)]; - four = dkey[text.charCodeAt(idx++)]; - return one + two * 86 + three * 86 * 86 + four * 86 * 86 * 86 + 643615; - } -} diff --git a/src/makeCode.js b/src/makeCode.js index b0aa591..73defae 100644 --- a/src/makeCode.js +++ b/src/makeCode.js @@ -23,13 +23,13 @@ module.exports = function (ts, immucfg, mate = {}) { mate.jscode ? { name: 'makecode_input_js', desc: 'url方式提取的javascript代码:', - text: mate.jscode, + text: mate.jscode.code, extend: 'js', } : null, mate.html ? { name: 'makecode_input_html', desc: 'url方式提取的html代码:', - text: mate.html, + text: mate.html.code, extend: 'html', newLine: true, } : null, diff --git a/src/makeCodeHigh.js b/src/makeCodeHigh.js index 2c487c5..a7a3385 100644 --- a/src/makeCodeHigh.js +++ b/src/makeCodeHigh.js @@ -1,12 +1,16 @@ -const CoderHigh = require('./handler/CoderHigh'); +const AppCode = require('./handler/AppCode'); const paths = require('@utils/paths'); const fs = require('fs'); +const fse = require('fs-extra'); +const path = require('path'); const logger = require('@utils/logger'); const Coder = require('./handler/Coder'); const Cookie = require('./handler/Cookie'); const unescape = require('@utils/unescape'); const gv = require('@src/handler/globalVarible'); const getCode = require('@utils/getCode'); +const adapt = require('@src/adapt'); +const { getLength } = require('@src/handler/parser/common'); function parseR2mka(text) { const start = text.indexOf('"') + 1; @@ -14,15 +18,91 @@ function parseR2mka(text) { return unescape(text.substr(start, end)); } -module.exports = function (ts, immucfg, mate) { - gv._setAttr('_ts', ts); - const startTime = new Date().getTime(); - const coder = new Coder(ts, immucfg); - const { code, $_ts } = coder.run(); - const r2mkaText = parseR2mka(coder.r2mkaText); - const cookieVal = new Cookie($_ts, r2mkaText).run(); - const cookieKey = gv.utils.ascii2string(gv.keys[7]).split(';')[5] + 'P'; - debugger; - getCode(mate.url, `${cookieKey}=${cookieVal}`); +function mkdirsSync(dirPath) { + if (!fs.existsSync(dirPath)) { + mkdirsSync(path.dirname(dirPath)); + fs.mkdirSync(dirPath); + } +} + +function filenameAddDesc(name, desc) { + const arr = name.split('.'); + if (arr.length < 2) throw new Error(`文件名不正确: ${name}`); + arr[arr.length - 2] += desc; + return arr.join('.'); +} + +function writeFile(step, ts, immucfg, { jscode, html, appcode = [] }, $_ts, code) { + const files = [ + { + name: 'ts.json', + desc: 'url方式提取的ts:', + text: JSON.stringify(ts), + }, + { + name: 'immucfg.json', + desc: 'url方式提取的静态文本:', + text: JSON.stringify(immucfg), + }, + { + name: 'ts-full.json', + desc: '程序生成的ts:', + text: JSON.stringify($_ts), + }, + jscode, + html, + { + name: filenameAddDesc(jscode.name, '-dynamic'), + desc: `${jscode.name}生成的动态代码:`, + text: '// 该行标记来源,非动态代码生成: ' + JSON.stringify(ts) + '\n\n' + code, + }, + ...appcode, + ...appcode.filter(it => it.decryptCode).map(it => ({ + name: filenameAddDesc(it.name, '-decrypt'), + desc: `${it.name}生成的解密代码:`, + text: it.decryptCode, + })) + ].filter(Boolean).map(it => ({ ...it, filepath: paths.outputResolve('makecode-high', step, it.name) })) + if (!fs.existsSync(paths.outputResolve('makecode-high', step))) mkdirsSync(paths.outputResolve('makecode-high', step)); + return files; +} + +function decryptAppCode(appcode, idx) { + const $_ts = { l__: (...params) => params }; + const codeParams = eval(appcode.code); + appcode.decryptCode = new AppCode(codeParams, idx + 1).run(); +} + +function firstStep(ts, immucfg, mate) { + gv._setAttr('_ts', ts); + const coder = new Coder(ts, immucfg); + const { code, $_ts } = coder.run(); + const files = writeFile('first', ts, immucfg, mate, $_ts, code); + const r2mkaText = parseR2mka(coder.r2mkaText); + const cookieVal = new Cookie($_ts, r2mkaText, coder, code).run(); + const cookieKey = gv.utils.ascii2string(gv.keys[7]).split(';')[5] + 'P'; + return [files, `${cookieKey}=${cookieVal}`]; +} + +function secondStep(ts, immucfg, mate) { + gv._setAttr('_ts', ts); + const coder = new Coder(ts, immucfg); + const { code, $_ts } = coder.run(); + mate.appcode.map(decryptAppCode); + return writeFile('second', ts, immucfg, mate, $_ts, code); +} + +module.exports = async function (ts, immucfg, mate) { + fse.moveSync(paths.outputResolve('makecode-high'), paths.outputResolve('makecode-high-old'), { overwrite: true }); + const startTime = new Date().getTime(); + const [files, cookieStr] = firstStep(ts, immucfg, mate); + files.unshift('\n第1次请求:\n'); + const result = await getCode(mate.url, cookieStr); + files.push('\n第2次请求:\n', ...secondStep(result.$_ts, adapt(result, gv.argv.adapt), result)); + files.forEach(({ filepath, text, code }) => filepath && fs.writeFileSync(filepath, text || code)); + logger.info([ + `代码还原成功!用时:${new Date().getTime() - startTime}ms\n`, + ...files.reduce((ans, it, idx) => ([...ans, typeof it === 'string' ? it : `${it.desc}${it.filepath}${idx === files.length - 1 || it.newLine ? '\n' : ''}`]), []), + ].join('\n ')); } diff --git a/src/makeCookie.js b/src/makeCookie.js index 38efe90..a81108b 100644 --- a/src/makeCookie.js +++ b/src/makeCookie.js @@ -39,7 +39,7 @@ module.exports = function (ts, immucfg) { const coder = new Coder(ts, immucfg); const { code, $_ts } = coder.run(); const r2mkaText = parseR2mka(coder.r2mkaText); - const cookie = new Cookie($_ts, r2mkaText).run(); + const cookie = new Cookie($_ts, r2mkaText, coder, code).run(); if (gv.metaContent) { logger.info(`存在meta-content值:${gv.metaContent.content} 解析结果:${gv.metaContent.value}`); } diff --git a/utils/getCode.js b/utils/getCode.js index b4dee72..bebb95e 100644 --- a/utils/getCode.js +++ b/utils/getCode.js @@ -1,4 +1,4 @@ -process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" +// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" const { request, cookieJar } = require('./request'); const cheerio = require('cheerio'); const isValidUrl = require('./isValidUrl'); @@ -7,7 +7,7 @@ const urlresolve = require('url').resolve; function addRequestHead(uri) { return { - proxy: 'http://127.0.0.1:8888', + // proxy: 'http://127.0.0.1:8888', gzip: true, uri, resolveWithFullResponse: true, @@ -22,45 +22,53 @@ function addRequestHead(uri) { } } +function nameHandle(name, extend) { + return name.split('.').pop() === extend ? name : `${name}.${extend}`; +} + module.exports = async function getCode(url, cookieStr) { if (cookieStr) { cookieJar.setCookie(request.cookie(cookieStr), url); - console.log(`当前cookie:${cookieJar.getCookieString(url)}`); } if (!isValidUrl(url)) throw new Error('输入链接不正确'); const res = await request(addRequestHead(url)); const $ = cheerio.load(res.body); - const scripts = [...$('script[r=m]')] + const scripts = [...$('script')] const tsscript = scripts.map(ele => $(ele).text()).filter(text => text.includes('$_ts.nsd') && text.includes('$_ts.cd')); if (!tsscript.length) throw new Error(`${res.body}\n错误:链接返回结果未找到cd或nsd, 请检查!`); const $_ts = Function('window', tsscript[0] + 'return $_ts')({}); $_ts.metaContent = _get($('meta[r=m]'), '0.attribs.content'); - const checkSrc = (src) => src?.split('.').pop() === 'js' ? src : undefined; + const checkSrc = (src) => src?.split('.').pop().split('?')[0] === 'js' ? src : undefined; const remotes = scripts.map(it => checkSrc(it.attribs.src)).filter(Boolean); if (!remotes.length) throw new Error('未找到js外链,无法提取配置文本请检查!'); - for(let src of remotes) { - const jscode = await request(addRequestHead(urlresolve(url, src))); - if (jscode.body.includes('r2mKa')) return { $_ts, jscode: jscode.body, html: res.body, url }; + const ret = { + $_ts, + jscode: null, + html: { + code: res.body, + url, + name: nameHandle(url.split('?')[0].split('/').pop(), 'html'), + desc: 'url方式提取的html代码:' + }, + appcode: [], + url, } + for(let src of remotes) { + const jsurl = urlresolve(url, src); + const name = jsurl.split('?')[0].split('/').pop(); + const jscode = await request(addRequestHead(jsurl)); + const data = { + code: jscode.body, + url: jsurl, + name: nameHandle(name, 'js'), + desc: 'url方式提取的javascript代码:' + }; + if (jscode.body.indexOf('$_ts.l__(') === 0) { + ret.appcode.push(data); + } else if (jscode.body.includes('r2mKa')) { + ret.jscode = data; + } + } + if (ret.jscode) return ret; throw new Error('js外链中没有瑞数的代码文件'); } - -// Host: wcjs.sbj.cnipa.gov.cn -// Connection: keep-alive -// Upgrade-Insecure-Requests: 1 -// sec-ch-ua: "Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123" -// sec-ch-ua-mobile: ?0 -// sec-ch-ua-platform: "macOS" -// User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 -// Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 -// Accept-Encoding: gzip, deflate, br, zstd -// Accept-Language: zh-CN,zh;q=0.9 -// Sec-Fetch-Dest: document -// Sec-Fetch-Mode: navigate -// -// Sec-Fetch-Site: none -// Sec-Fetch-User: ?1 -// -// -// Sec-Fetch-Site: same-origin -// Referer: https://wcjs.sbj.cnipa.gov.cn/sgtmi From 36848f8527ab954723dccb886b2931047c3c35a6 Mon Sep 17 00:00:00 2001 From: rnet Date: Wed, 10 Apr 2024 18:57:37 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E3=80=81=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++------ package.json | 1 - src/handler/Cookie.js | 13 ++----------- static/error-makecode-high.png | Bin 0 -> 129751 bytes 4 files changed, 6 insertions(+), 18 deletions(-) create mode 100644 static/error-makecode-high.png diff --git a/README.md b/README.md index f1ff525..4e7b28c 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,6 @@ 该项目的研究网站仅做参考,项目不鼓励直接请求该研究网站,算法逆向研究请直接使用`example`目录下的样例文件,如:`node main.js makecookie`(默认为最新版本代码)。 -该瑞数cookie生成过程中的算法逆向存在以下变量: - -1. 预先设置好的配置项,参见:`代码中config的值`; -2. 代码中的数字`46228`为作者代码格式化且代码修改后计算出来的方法字符串摘要值; -3. 代码中中的`_random(500, 1000)`为作者电脑运行计算的大概值,此值与浏览器运行环境有关(如电脑配置等); - ## 1. 博客文章 1. [瑞数vmp-代码格式化后无法正常运行原因分析](https://howduudu.tech/#/blog/article/1699807978000) @@ -124,6 +118,10 @@ Examples: 该命令第一次请求生成cookie带入第二次请求,将两次请求返回的加密代码及动态代码解码后保存到`output/makecode-high`目录中,和makecode命令区别为该命令只提供-u方式执行! +需要注意的是,请避免连续执行该命令以免触发风控报错,报错如: + +![makecode-high风控报错](./static/error-makecode-high.png) + ```console $ npx rs-reverse makecode-high -h rs-reverse makecode-high diff --git a/package.json b/package.json index 2c8bdfa..423e9a1 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "lodash": "^4.17.21", "log4js": "^6.9.1", "module-alias": "^2.2.3", - "random-useragent": "^0.5.0", "request": "^2.88.2", "request-promise": "^4.2.6", "yargs": "^17.7.2" diff --git a/src/handler/Cookie.js b/src/handler/Cookie.js index ec6f151..670401d 100644 --- a/src/handler/Cookie.js +++ b/src/handler/Cookie.js @@ -2,7 +2,6 @@ const _random = require('lodash/random'); const dataOper = require('./dataOper'); const parser = require('./parser/'); const gv = require('./globalVarible'); -const randomUseragent = require('random-useragent'); const { factorial, @@ -31,15 +30,6 @@ const { const developConfig = { // 开发时用的配置,比如时间值固定、随机数固定等 - // 'window.innerWidth': 150, - // 'window.outerWidth': 1336, - // currentTime: 1711730658454, - // r2mkaTime: 1711712705, - // startTime: 1711730659, - // runTime: 1711730659, - // formatUid: 58854, - // random: 0.123, - execNumberByTime: 1778, } module.exports = class { @@ -77,7 +67,8 @@ module.exports = class { startTime: Math.floor(current / 1000) - 1, // 模拟浏览器启动时间 r2mkaTime: +ascii2string(gv.keys[21]), // r2mka文本解析出来的时间 random: null, // 代替Math.random方法返回值 - execNumberByTime: execNumberByTime(), // 固定时间内的循环运行次数 + // execNumberByTime: execNumberByTime(), // 固定时间内的循环运行次数 + execNumberByTime: _random(1500, 2000), // 固定时间内的循环运行次数 ...developConfig, } // console.log(this.config); diff --git a/static/error-makecode-high.png b/static/error-makecode-high.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7d7a59a09016ff250e9cc1df03cc1fecbd1446 GIT binary patch literal 129751 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 L5kPA*sRNE}ov1CC??okgY( zs}86yxeW9_TsWAJMQC8aFrx}3ACeGjK0GFgVp}G}$)!)D4)`}Fb50#deI1G+e77)( zHcW4NS^dSRgJHdc;e6+AzaJ*ZjL80E`}}3!hghuu4}r>PY0&mz#{_@r4d8>VbCHf} zGwg%deNY7|u#LTssdAPf{DGi|=HQi7Hq!)4^u2!XYADJ#GJn?)NpbnnI zC}r~QMGT?mvp;zS+?hkgdEoBl^%1KTk}>Dj$;cuVu|_2yyt#5uHSarSBLaKRU(1?# z0ItSdEN#DgJ5Lf$<^+zBmd$*DB5YeMf(%7I1SxG_t1iW`#)RY*u6;!|mLndy!*jd{ zlp$o*@|~s#Z}#qX#pBQ&;OapbQ4xKYrXZUcc@}wK4Yd3buJ-5sW;bVCatZ^Ai-CR``Y@ah|jp&2HW@@AryN)8oa_H%yoC#y3G zRQ3RlZwrhatz-|F=JY)dr_c)$9aTu}n*+2tNrVP=wAhKFjPCAFl%L7i-zMsuSENZ` zU4SB9TSz)7OpL!K2_st;uE_um#)O8k$ULzF-G7dA6k6{t><4^z zXK;N05wv9xzqsH*7SnvQwXOLXtGr2%dk!wQ>N<80+!^N?W3#*MOCaz^<7~Ti@c66mRNAEP$Pc!n4yh$MR5S~lWzB7AJXqz8OsdM&@)>OESpu?UT z2EM^hCcl1CC(X`6!d@HOZUk&IXz7wv8?|C%@xoF!GxEMFr8@fgamG0iBMYFD^ge5j zE>6d_>riZb1B5Z(oe>X}$qpT^qXDlYbac<@(){9}%W$95V>DSWpuMSlD4^K(E%MDu zViYBj*O)amrJQ+BRn7IlvJOT!H~zZx((2i~>mqCyNmO4&Vg!5vl66a=7EDM2kFsIB zaQCMV#|GAPNyH|wJIErayMlAqdEzBMlNp}9aah-1`BSen3>Sa)~P)2|G1_AG52XnVoN>Bns$Kf=@ zM4#Q3i(w;%VUT1Makg_K3>9koUT*Dse>F^Q9$@U&iP{iGmY|A5^*mWcTBMQJi!~q& zE)Ndj77zlxuL&r=qE7@+eIW9u>WhCg8=5fRn$!D!Kk>CWB)7LmLoQm^JMQhth_Ya&@-xKu{I#fC7u`xGp&xt z4^y7J4tL!*P4R}*h%ygYd<=t^HLT+h_r9OufLfj7(JD#5U+J}Q0AknT^n@f_I~)d3 ziSe(ub^8EoP6kcRzrs_}7qgwuhZ0&gQfqWPmi@#Y_Q{za zf*$wvK+cQ1v`5iqTZ!Rz`1ebHwvZK;IOl6fD9aJti#|EUXV+uRya!#16%*Uzf@9~# zKv3mf;o&$J7wZu8Cdj*Ua~|EfAKk1uMP}=A3|>#kZ-FvO1Ob~7UJTd)U_#=sF@9hA zn+<}dKIgH~dM0VEv|tpZ6TrOId#4h3i&XesJ z!>p}Eb?ZcACm#q7s6&%z6lRHVPQDYn6q1q|8&Z3)Re z&Pkp}^b`J>{gk@^Ixe!(VejSzF`$w>6=GdS2#WUyqd~#Hz)Z znoak!?J=LSec|GE24udQda_x4uhl>#>~YmE$|uciXWXuX5Yn87{yOXl=#nF<+pU!5 zwoix^muJprel2oc?LWp>+ac}iy?fF2*LK%Zb8lJK^#=r!dp7R^KA-%; z0BeOvQ10`;-ZwQ7{;w9;W%5z}!HmX`QKWJz_J2Bv*2>mgNNXnK!5|_NDV(uy-clxq z*D7*_u0902@Gxn<4x+AppcPsj;GpOkVPgINpogR$XtSL?AIv45xIBRhJh9UprTU*M z{(bq_YZ!th2wV^U^DneNRJv1WOg#B9&xw&uNs}EIic;>MP1he9hu9yO{HmWyI)*AP z$e)fLElw6&6J9zH4^dW%C+=+`@ILw4cGL7x^dWU_H#75SWaRgfh;{voFTO>M`FlIt zOD>3H@Cxm?Z~pm0goz>q6(G?cKkWF|OaK2T|M?~RHMr`hU||c@-`_++hSzy#09yLJ zt8Hiltm0<^1Je%#ozrdiu14$?BSmkWtzM`Je<^Ff0E}I4LG{ggPvoRX<=Hi0IMO3u zY;OQx5-6(+u**@J{T0qurTEu(JPM!yFdyw5yZ1n+Ut0zmM*7TFKH4FBJA?~slZo2; z-15A~%i9ImxLD0u%@p9|C;-lS=T9aASgQH{XX`MPIlNi6_Ag|p z007}Wf`CG+zY+ve*_vOXea~`N>*k%%nF80~Vmt2M9)PZ|Rrv^{ef1)%pa-p;(D{t{ zo@^=k#}g1;{vNoDi3BY{JO!|JyZ#yu0j>ZA^lUX3z+wd9>h}rz;|~D+k<6ypmjhPn ztexOb8>A4hdr!hYLV1A3;AB%b|r+8#~Fir~jH-*;%kDqh8a(_Ro|- zfe#G?0Ii7B&uqRxqA&ytG?qFreg#TEd(u^aQH63&FIiV%nO*?1@ejuLCrQuBe6~fG ziQ_18Y)fl@qWwkJVB=>)#3~#3mu$qG?u7Z`*%fB{g2p`d1YrD&XrD^++yO&%2QBn9 zq#uhQpv~V{1Ev>*SYk&~-|-igfq|3!LRCgTLz>F4)?iuhHVDNQxqv~f9XSB+!!Dms zN}x4>ej2qqhVT8&_5t#yrampf@hPXS3Y_i2hC4fINfnxjj`Gbk^;GN82TsImEA8y% z+$~ruMlAw%L$_JW+G{II2K-+%bo4V6z|p$s+aQ6=L&#1i zKY?x3L}&;eGXBr04SYX4n3pi^63EYVpV1^k*cqmNzVdS954W^$-6GVtfmQ&D<16Ye zu!LLI$Xjju4Fli4?c}FD8fezH1^7VH*f>jI?Ha|%Z z_T6{>zEq_3-txISAi|IsvJQgFeGcs5%v@nbMY7<;o>eByA(-UZcQ^96+)kN{X=Mmz)gM4ACf;xU{yz7G z11bQPfRC`XtD)pp|hydL4rm)hf0hk?!Xw z%l5$9ueoSYgr3S5SS276ie@jbP?kS69Yd)F2FqgJo2CwyXB8-S3< zt9$Q!*&V66y>_KA!-&`EWAFO`Yt4`j=5XYiW)Mf?ubd*ou5wdOaI#sat*Hl}_+27| zH*eiZ&q%l10zkOfg`(Ww)nwXw_iDT)-Tp5k2yQ0=oKc-`pFX}H?3}Lr|ryj8@ zA=H%(*v{leJ!t?{PKKWfB$*73>Xn>Y%rW)AlG1w$a=ZrK0 z7lo-?v|4;yP3H`-Z0rUpCK;L4dyV9DH7q_jbn)e zm<*}@slA;=gXY_IOQzLjBqISK?xj78Ds6CTKCW3YpPHe3vClER4ocX|P?8E9#-r2% z9IwZIi8{B-%!CU`I8OSnn{=#MgHwO%>HKim&|@Tb{v|q9>g27r`C{==Ns0)Eg3ACCOSKWn5^KhI-*BsX z>@S=td>plI`aW2lUFASyOY89y!9qLWR@M-5_!U$@weA?SQ+8L|&|UFc6I{TE)=z(0 z{Mro77LC6tB-IJ{H`aFzuwz{uM{6@?YjlkgexlbQGy>V!RIE6|XT%h#VkN60jV54> z)CDN&3wc}!gr6CW^r;1-PNAvVM;_c4I)wBla?elXEs2m5_zF)o9&PEYJi%is#)~+u z@VT8Ezc_l)lY^Z62w!6WcW5KtC%r0O5dBp}4()+velx8vnF=(7*tYqR9a(`xR!zK` zh^>Oel*?$;A31N7s>?w3-?&My4<^d6`KkMAve;?>jRzc0$E;_D?rj9GnYZE#Nj1~| zA7gJF6=m19aZ5K03@u1Hbc0e714=l+(A^A33ko+N-5mllAT2Sp(%mJXASoC~i6BTS zA>g;i=YHSk{r>pY`u=h)MZ~$Tz4y6~^EiLU6`%^~DY| zdNj^ysO7+Go_pPPFUJdZzIQKF%UF#_FnjHj?s#h{`w%RU&Mc(}X@Afgbd)BqF?Zu}gvIkgMg-FAtv zjl?L`35biuwQjL(cAbp~$s1f`3h zcV8S!(XjtH?>gzJ(#vU>4?UA8oMQPOuTK~v$~{vIuHr)!j^5Y=a(wl@zq;Z@t?oz$ zG6H`nm!9aPIiQsH_T1pibi-~W@pV1$}WSG z7qkd|hy9gmAB3OZMo^Oepu1p0JuVdo@+fUH6N}Bx8y`kSscc}ki_JxlWpqQgyO4W2myx%R#7l0SVC06&!8-~%qgujxQlK4Y6(=yAC_G1;&a!sY|1 zi6pVbOOTADPn>Nu#h{v2KKaQmL1>f{( zPC<~2TXLcva0c#ld9E67$bDRhR5g|t3%fP*Xae15GFzwR!vJ?z%?|X%J_ox=yfs9i zLd){xfvj{HLBd`n|{Sa?$W^d4KI! z_GDlgpU9}(IftK;+4`aOnXv8;eHnA4Bb(KZPU5Hhx?K5MZ$ehw4CuVNiNU^K^ zZ#pvdkb)UUG*KEO`H$apD}`4SJr>lqY_y3qvQDmm~k#pRpe+`8~FW={j3+H~vas z-{^3~ag6^Mo{ESUSOU;-My)0`Ch^u8PCAJhL@M#z6%2_ni_Y~MKo!+a`MmmB6HynafH0Bo9N)Il+SxO4koblF`7NR|dAE~|urSB-rit1Q`xY7uSNLc$wn4zB7&;H3pz^SZdBo%|+08O#7IW95i%{q%h zR#7>7lp5kYaW!}R8Nb5u1D%QOeak4*@AT$wMOEE)!Vjtf?dq}fKb0Xes|EzR0^9M4 z=(~E3rVzN6$dJP9bn7V|6s~^xYsfLzSw8vAdV^c0&e2Fzg~ZjBNgN$Z>+Qhi6#?zo zOtbEl)|U6{Ge(vfLk#_(Ls=6%Gf~In1EtZqjIhP!UpIzCJ@^1CI7K`M_oPPF{TI=m zGUvDganr%o$8l`Zfrnww-J?QvXY_w$HNQC2(4j4CIMg_`}2#Giy`#({;`p zQ@eBSY>5BR`Zo2p)zzoSqgp9ZL;hr$pZvt{Q)O`Qr~itO=P993m&=il_a6fhKrHkc z)JqJi?@eK?Prq;P1Jt#xBCVn_@jFToX{#JPh zSzd{ZK~`xNSh<4v8Cm7GO2taxsa1ZyeYH4fAP!VaF_pl*Qq+4d1ZHJ{{3*E}^M#+0 z9$Rq9Ko(Q*n|;<%IDugMwRfif=;BUKQDHXSTw0kEDF+JGo)viVSp*eByjEQZjZmg7qhlBQ**%5_}xLjjac;gV&2hTu7No#rLw#a|?c$4VyBI#D;#EUHO zvgG!UJg+V*N7)_5Ip-m|@Bb0C#V;^|6&wWFlg2I!ytNgN^|!fb0h~YAd`FKs5;oMs zIxqQOYk_M)5<-K=I_gYXIyca7ZNEk@UJw4*swnY$B0G@utjrl`FF&U1SG~=5Tg1=Y zG8MY4P>0T5eV*Vn_po6v@k%=%Z)i3A@P0l07R{>ZG%&0dHsdL5EwRw2oHxXn zewKfZCawdtv-TXG_y(ZfvLnl*7_3aRbe$Cup-~QcnS5hyV1$37{y`fGHH*F9evdt; zAaJeJbkEj!PK|`vc_%pEjz=PbOyhjPK}=#Z9A5x`SoNCg#2;)Pl9|1C>}kvw1nc<@ zLRm`IYE!$EM?Iwa%DRBv;mS;kwf3OhXhZ(#|0!I^uvbj79V^V=-}|G6iF4tO<%fNd zNFou$X^?EYKSMUugA!flXH~Sd(1a<6Bk{do=-1^#<(F9|b|gs&J)Iu?k=(NmKGW<8 zZoG>EE-JeX=n1bLNGX0`;k)6}-EbTEl}Ko~pggsxgd1HVa^Me3Symptx&U!WJCGh; zpsQ9NQ5KUQS(;YdmIw4mvp@vK3zvozeomx#8kTbgPkrsu?$T~i-VHH>IOFH51hQ#k zuKDZupOQzu92&`^_Cr@3y6K1fU`W?lItCmtk4nnPI^M&3l11~6RlGy3HHXatf5g#< zcUc6ufeY*K_v!dkg8!ppFk)25iwFl5nQ7Rmq@-4Hc8JnAN(krIk3+a3WlyZJPS zxjN;=gCYfIDbxI^NM>#d?X#h3qq$hXCd=V(W!D->VOwrY#kq~U*gC6szk*q8lgDlJ zjZrSxsvQ$3m10*0DD+Z8$7rVG6)_^ ztftqYC!Up2!?o7R6lV7Yvc8)8x^=hnwg@KYWknI?Y)99Lbj*KuuM5JEFkyVMhD1sC zsl#g^`jciq%O}5--=DA|GnHw8Y?z>AIc6ILm$Z#u?tV*YJjOe$?5AITxLVR<0vc^| zo>nYboA1tPK2+WsR%AklcKj@tu6t}9+a7);=+ZNGUb?k(r%d=%VDL5zBZK}N>|>-WGw)ep4V+_3`e3(NG+o*=T5x$cO*dSpW0J{%?2GW{?Bir(<2k>t6nMPyO$88{06&ZVwMR z!B;&j-b2Y@yMh1Ph4_DeVWK+zl9jB*kLej{!vEZ9!0E?%9$LL*A_$OMP21<7Rn=+o zpeQO{B;;(oX_abZuc(^d)U9qfW{=GJ6t0|mwpq|4sojBkHe?NehmEYLsI_~h*eXgbNW-Y1HgI@+8&XgJNSw?+ zV<(Mwsc7;Ie;&Ikl>Y)6lTFD9jxk1qEa2agjnR@Aacj}R7I22h1ZrFDQZ=koHGJL! z3>>y=`L0!$Lo6Kev>)5=8BV&+KyT%@@)88pMq@h|D?rJnf}2ULKHIGZX(7s^$@Sw+ zlOU-jgpvyM32RO>_##cE0iu5Z8$84P23&i~P6EKiC>p@zAC3O>)y4+ZD#ynC?N)&{ zTLa$~=#Q~EfLZSS7)8mqe*o%)1awo)0g+hfI2VCGfQ{;Y2tI0TI!gz&NQ(scMlqAY zzZ%-^yXSSBt|kls)qlz;$6_6u$+P05_}f$(1ikhH*k5+S^t{YDz54~oKaiRx;iLYG zzr=1h#NDdJe|}&Qmsq&wX6_?xF3V4>9Pj$U;dcYHW=r?6)KJejnK!;839QZjNy37VYzpVMgS(&Yw{Zq`C_nb)fFu56q^_D!JFki86MAmy;JTo ztI-8&2Yc=CxxP2^1AfDWW%YFo^vzRQfPlU3{AWjBS3RV?OO4fo`70g*KY~C}FNmGxhu$J)BTE%cRUYgC zEdPEW7%Fxcv_}b^1Ji+dK-Uif-RVf+8|^lF3`+-jEP2|edQTI`Ddl!viUKrz6xRNs z>98TbaRb|2{#aV}=vEpnonheR2wL-zv?bEKZ(Xu5Is$bG{M0gWZIc6tTxZ!GkBJ z|8BuhavXIStvQzLid6&*P`=lo4q7&6G_|>pTxagi0W)VwkeF$O>22HoFKrl9~w)9FQ$L0*Q ztW$lme1w-9Jt~$RxgW0rm<1WZcB}LZ@8%Us!qMG)^8nK@dmS4B@PYq@p!kOJx*@?2 zY~OzBH7BXMx@;_$K1O*$+%yGm9mvc&wd;D7+F>TAz(+)<=DDP1*b3UFTih4G+Mstc z9lcFJ8;DIcf{O+sE_67~VKcqp!XXrY>u%`B zCtzapena?|2Y1y|(XVA(wDU88|E5Y(QMeNn{-yXd3x5u?dLI0->-o^zRr9i+w5eX% zs~u?Pu5716BEd!YWF)#e#l_Xv*+)2>yu&u5smSriitCDY?&Fc(8`cE~ zPx$%%TnUM@cclWsp|dTm{hPX-V|Fl7-*D9DdmA98KQKRf60Z4nY?JBhKM}9;m$BVG z4C)zQ(LLO4JQ*_Ok!1j;eBt6ueD|EGQgO7=H&(7nU2(s$KA?*LdXBp;zjg-5#S7m# zg>Wb5TDpG<88X8=6#Y>kf8E1!?*?~+Z#$CiL3HS0eAKEelaN*&-Xcpn9wcor4JSX2fsPq>9zg%3OFy#+{n($_Kv#s%5p`HaS>(7;SPRb-FG45`wLJ-? zjj|aE$s>S$IDUfo#U8*O0zkk5h93$88$<0#;P~~_H$N7Fp~X5_cw2z7!-^bbl)l^w zIMSw^syvuMW>6XYno^+{ec{Lcm>j{0B7ACYI>s9yRMM2D)WdX8h5BB|-FK1BLL;C6 zGA0NNQC2bvQtF+}@xqt-2vW`{f|?)2n@@bgn(Uah!3*avpUsj!T=q-Un2RJkvnkN*d*QML8^Vsecqfnk)>wtc zSpSv)_Z_ystIdqPH-R$*u(>0L9aj4WnKQ|uBnCv7g!fL~F|XB_*+r3XKgRe_&>(tZ z_bZ$5;>Ak(5Uq@J+J4#i0;Q|@WK*gdg2GeBJC2RKBj0T2nBUE9YF8Wj|t*_ z4L;41fX+$>&nfV~)JAYW@?Y{Jc@^!_@JZ><7d&DdyX0l}mm6&=L8!_O-@~Y0uDVLm zSiiEpJE))KIx{UC_x&BGzwF)TiRU5VjkytgYAaRR7xMJ%pSYQ%xgf6Du^()u#AB3Pv-?h{ z?HCK@493&f6{NSql!ufqB)>@Kl1RHhBjb(SPn#QChoYFE;^$Q9TC}%>l%$bm{pQ|%m1ZJiu z&n&~I)adS?rRt=rCW^?*t>dIQUQK!bTx03+FKZmi$Pg!Sd^;||_&l-RMS_h)8~6@~ zJu$G;eQSaG)McWHM^(6NcE~*Cl7pQ`p3UmGTkJF(rDwZIAz4+2h#<^C=kur1+A$hp z_<~;>Wqjz_#E=g&qk`8=ji}_Te|@%JSQBD<$e3~#)aP`AZRr2=c^eXo9`tQVrYAEw zqLufO7#>d8ppn!&1ZgA!n%FEu)l7EucQ>$xKl>w@AaflRQiCLqn62>7T!DEW3d}H(sPbC)rt=KEU=Mz~gQQozgnl%L= z7wyiQY{hihN3mA)EkFDxzOlpD4cU1)_?>SDE@e|m#p=W|&<4;Wx0L#Ax9Q}z%6m!^ zR84aH$YeB@dC3r8DxmA$+G+SeQ*#WrWk%(O?G<1UKqgtk zvu8c&+ipAo(&a(bZ*ADPBL(Z@MQ(!z5=;J^#g{g?Q24+feq2s1GH0`UjPM*=ej?LeP4vC+ z5`|gz{lteFM=2@JlOOpLy>exLqpwBW&2D2^SB%d~Q^n{y&1$Bq)Zk8Px05~;rYM_7 zbIb%M4q;kkNielYn7GwTX;tkwm2L?6J&f4rnS1vzrft=o3H-M_t`pxHu0tbV=oF1b zv5cR|b19B-D&oR6B3VGyCo_3xk~xw_nAFcvcl%x4nW$2b9xBW6bVYG2oZPV*8-e!I zDhVk8vdLP`O_r>vT`qo8hW%;BScYvGM7z>V?>bkt3ySZPmf34*>ZomLnEh zkE9iEULAqV7zdAw1tqDNDzXa8*LY+szkQNY+8`ud7{5NC+$kDm*;3OZ!bH>UgZ1!Y zZH3CN)O9J~YMLmGkHlAcSai=GuA)RTxSo@>_nw=#Tjq%}!0d%*=A;%X^dIy55`mVh zaYX9H*1OZZ#i!oD7g;_KsD|;CBuse_?e@qFxQ`s`uhh|;2Iq7-3w5LX;- z*~e2^qau`$r|7IAhk6TCd<5H5pE1PUes%dmsCYGs`jR%aWCWYnraBYxl{; zhlr)NUx6`#Z)zoyU2|#6S{Zh`gy6E(2zML~JBRySFB;wx?&%Q|YXee(>-EO(qRYfm zV@iwB9|(sZ=KIXPPAyJsvhe~5t9<##LbT>yy&-1F2G@n<<%0I&_TnyYDo9>Nfn0|A zx$@s<-5K-mQvOa0VBp|6^FO}G`Kv$(L2Nj~m?@xiqXJg5*}O^$>xgS>J39o_8#>zV zcF=1V6^(kTg%e>W1FG+GQyao>LQ&HaIAYU6wJNuNquxezyl!~jXdi}DY3eP>j1xS5Lx@YW9SlF4k84JDHGw+Hv?}%7cI||a zW-Ox`(t1JP#7P0@hO7Ipqqjj{d2CZ=bglsu|0NvwXMoy$9a(X35K3j9NMSRjEee3! zBp*dClY>>*R0#q>+zv(~*zGWGDbp#d_Zgif`1`BJ*C#zbKf!pi_*waT=qgS#jKLL` zv&Oc+Z2o;pqd?;|qoh;Z{3|19;h!!go`=>|bxIp+txgN>5~R8RNa)ZqdYGH?v_w0U z+a~-$6}NcyFn;V&XYYx)l37XobE~h*9#&{hF|oCL`wjXNN~VmQz+ZYr(OWlz*eNhg zXx^fnF#-dgQ%jc(l{eFNno*v-2!%IpBv6e}@n(Ej1LD2++hZ{{l{CDx8BOYkAhxbT zkvH(xiV3Ut+jHo)`i19Em;%u}<{xhy@!I%aE{aIA@&uaoF}F>Y!E2K&kxZmH7GIc4 z96APxVG&@uXdJcpIJr}oK+HeJq>2cz;2F-%@-LvG{*mZ zLB8NrPmpYjh+$%gsRfy5_Po$9%AmeC=Ekb>R0FSiN8bc*5^^94r^G^7wENYe@EWm$ zBlGDU@tc+bN%mY)-+5Ds2 z7wx{*F$G6p4lc}lCpqnd>53e^en&ao-n(OD+??oh@pj4sebcy0=lCdyulB{>U-f;8 z6zKY99P11JS%FHSB1dS?LKZvt*tocLlh_I-K!*GN6J^P#oI=AB&dBZzYVl`;G`LaB zK4MM>2txL2-h=U_*R{+iCMs#U?qRZzc4y0xJg|bsJU){4zIw_cLcWMIx?o@SK;*sE zm{?g+j=NGrs!$)w%P107{sx2Hz7o1jeCXP&j&2~;sTB~tN+0VzNT5|3wuQy4QWQ7m zUE{N8s^s^lU?_^7gy&);w(jOV({Eh~WxY$XO$}Sz#n-QBOfNIEP`955uENE~zxq8k znqj0cTX}e6&=r%ar$%P z6VNuK;FOZ`FTatv=6I-a{>cwhEQPKa0p!( z38Bc3RM*=dAF3E#+KR*;tn&~?YKW$HVKu8Do1umGBjhRG*-Fa!5cK*A4;g1^Et{y8 zH0f2gY!r#3wh-YW2~#5&+rhMxPRIGygKHllM^uF~lh{yv8U{LsFhyFv6t@xphHdKZ zarXNhnx=O$LOE$NiPO7)AgMCBQb+dG9i+$@g-D{=UikIW*5`$0v;DLar)=hx6XhFv z{F+#bE5dzRCz}_6B+8y1XGuCqN2(-ca}9Z)q{uK-GURj6Q}*HW8O9V{ggqQM<}ZKv zdgFS*KyJn@elkQehk0+(m7QbVK`~RwUA|be#OAM)87inVyI{&i>t=pVdm?-Kv25`u zX8$!2>VDr;yi3Zb)EoIi!@5S+vAnBBXI%pKT|w-St>suYPq4adAk@4idRLo_SVQEOphBV`C97~U zFPH_e2#)fHo%6U9!(n<+5D_iLak65othz3(O?SjIjUuZohO=RxvuVpwGGC6dP&lkL zN!+2|A{Jf zu*(^oqgj`*RW@%*+%PSjAv9Pq47IBU?OcxZ2KZ>x7$9}=4d&LoW4PO86zlB5F{q7_ z?JyQooE4Ai6d2sWKqLynpL}hHxCCg?UJnpVzjx!@qLGOWv7m_@t3HHchO7 zoMK}V=rtKd4m~?i37n&Y|B@Pm!s}Zv4#$5kij0dW=zP9K=+i-0T%?=Qny9?Quu<{3 zjyK+H-VmWDRV%3dPTV6P<=Eb}?$~TmEGSJ9p5J1bf5%*Y((4Mo$^hS&%xlh2i5q)m^Rej4tGnJWHXn35J{`BGwwwzZZsb`(;aW$K!%Ebr z!I+$3)CA(F;>kpp;pNboDD1-{E|-tZdv6Y(rr71^Tzn8DZMye4gF|yB{1?hv!Ho8n zquH4old;fby?f6=V?g84XM1N=nTitu*pSd(g5*{A`Xit3a@{|>MMHynucNMAFP%?G zSorX}_9U!t7cZ556He+yfCw8L-^?=T4v?GBvPi9S|5rNAvgbk@*FXY7A*IveI%%f zdozZ8_L~Gm$Y(lkQlv{!>^lD-i4RBBl+^U%U=V~vitDMW?F_~<@Au8*(-Qu{^#)~j zrRew+wwp_Xw=LYo>ka+C5XD`4C2(~~s{2c7ZjP8S-&0*m-2gUM>?ky78=(KOzMh@( z!S7?8iAXZtem-hJ*mRD_x*Kzf{XtXtf?QvHwH0(#-VY8JR}lZ&$Uku2e46aabo&jc zJ#=m8!LX-EjpD&pnY8bH%sW`UP0TzKJW0`Ob@>!JRP_uBwLZ3v{d26aY9CxRXweKA z${0?HV^R1R>#Z5$x|%`(>4r=dhr2+od`2f)Kdx|wuFAfgM01qAJKu>A+dTCn2&14c zcJ$~^*)*hwI?HB#bsj-Q=Ah-a(b~&Vt=KjHJs#yv&hw!DSvcywIsD@X|O%C(G0Elsj}tV^#{AKrz)xTiv`IDzH!eJ6HmV< z;}qGkyEiZSbsu-q9|k|bXUk2;%ROz-54o!Nu%b- zI?||>g{ICDPLavz?x0z1(bmN|>+S!Da(XaBzz&AdRBuMPWVAal`zK`E<2a8htP5XK z;^NlFkWim^TrL_&4zhYg88# zNvdgulbcl$+d*J*qb4B!taLa=-Q~n85&1%E>GHb+OQX~Mi7QeuEhA3c{-N``wUlB- z!)mMwO9r2Kg2=p8=oxrVzl3^EDts#$b2+5$aSqt4mu>ob|BrG-f+mGtdu8?M5~z3W zepKP#vS%vcjr2|Az`yCEDudbtVX57?*2shw)uk9CuM&td=bbfRRYR~x-OT|e<^8U|aW)9GI4X4X_hw4 zO%`cNgyYW`Nub>CVwk-276NYxwXluUAJ(kCPnN08o>9qZHdj;EihZShW!KQtzA^pJ zH=b0xM9V+~hft(~<5gRaA0k||Sj0FphF@TJ5<|nsP->9t3kFAw#p7IG*-=C>Y_gxn zLd*F+>;aJfyLPMvj!&C)m&)!sXKFWB@HFWG4~C7)0cD>w(D2q%jLn7Jqm3&6{((L~ ztf5Zm3fQV5b8J()Pn1j!6|ViNpSoWY47ajh33@GhwEN9(^Td}$ZueUPjk@Q_zkU&R zc9GcaR4c3F2!z>eS~Ft4k-wUJ*e5%XN^LH{4EDC#ltLTkuiT9w5__@beC05_oi5!o z!X)#ye;k)G-;^nB?i#9omR4(2$Z|zDHo1D{yL5dGZvdEN{9b(RpvljgSgOm@$P5vI zm}q$we~RX=<$!d-+efDMvC=jWv3R#aVHaboyUd$d3*(W zSwfbGK5>UI;(?UzfjiBl@K}6~v!7QFBK&Nh8ac7391=H%gQ7RxfdhE@uB%C4lv4^_n*SAVdc8B*QY78uC^t4e zqX4*pN!XAx(CkbMBE1%IC#fd+?W>chE$n~l(l>r{(8V2>YuP27vf*3+k{JFfgDQ+?wc)PuNdzK-HUP|&t5I+khfd8w zvn7=TKZ1_14dRC=6&p^e@I{x{%>p94_-XpCV-EZ==1tfm4P!sk(brj*&K>{(ZjyI!M z-KrR5Jn3WOe#*-yDO+VJz8K**mZsjw6hzRU98eEu8)OzZpQFgQ`yBpQm)=2Q_iiYD zq(kUMJ-cId`)VC^Q1Q!mB*9E={Vr9hsEh&W{=qytFh21^W?Zj@uV}b|L=1&fuMxP% zmu9o+ZT^y`N#lp!$mS1#3bW)8%feZIbxK19u}e)$y}i|C+Kx>+oBI6a+Urr5hU#zp znqSx*JLzk@$zH!EP3Zk12}o#&lV;(wpVS^qovPH#e)H_( zz$m5v>9Avhi1GYdReQMDB)vlYg+ltR}=L3Yl%rY>hI32`ZwpLa?= z!HI49cxo2?+9bf5f1q~~T!njWu&y+l=7fbY;BXthhPy?!`k-e+Bxvita&Bc6zY^kG zfNuvT3JC(>;wtP>-KkQD>IFJFJ!XJa9;`-^2-9*IDqpZ|4aRA}aH3-P#LyOEMWN)X zLb`N=oru?xqj^@XtsG(yjqfO^)=r!Yth#X?6disEyBHclq{hZsSX0sr~ii9Y`4>(t9 zo;Emt-V(#dbKp23-*VW^86IbqcvX_$NWe|98v=&;0okKf`Sn+e>(A}Tn;y;kao} zh~&i5>kK%jH^Is{x##o1b(oY`OMhER_}R|>#ngNk`D{-jBxyX%E$H~2+Vc#9gP(o{ z!36#;k&cF-)V<`1AN}2v_O5vWxkAhdxSB^M9&~n5qm=S8@xAjq>p^n1)mjpvE480#FAtnSS| zXScg62L#gs^-o{=_+#KUjd?NXD|MVTdwo0G-)z|f^m*Xg@|JE zRN=i-_27xkc9uv|mfVemz56mO7rBq{yvS6NM|JRBs z`V_K%QkphvW@W5qt@a?kiGW|7&ahUz6y6;Xydqufk=1UG?oRb>gq;``@49-|zeX^Lud+&zhm`{TN!4 z`LA2l?);iSJ!{~8-;hgHjgi@Arjc0%mLTiXG?I2IH&W?Qy`5DhSEVG}{N8TSwe8gY zfJJ~2YeE#n8b8gXUoCwGPBo-}2c?b?`T`(&4wWoYzjr1sf2rfK#6S&)%QQp0PlaJU`H2TAn?0VY|3ki3%Je{$F^z7RdS znj!fg7Qp$%Nr#2V`{c5^3BQR5%2XBSL5KEmP{U51jl+<^gi1sg7p#T@k; z8e7s?lVXWXpBI3|j{!^WDRcFqbiifAjvvbEnh&>u#O?uXxc9Szb5>j6FQatI_jf!6 zmOX0VHSKveMCMFQZ~6G${u|HW2GmCjd=8lbI%5lJY%=>x(16%1mdtw&{BZ+Vu^St$ zj(_gbVY?c~Ly4s?_<{4hNd&wEL_!UaaNXbO5Sx{+&pkbu6q9--UICy_G&Z>%*hB9m zjXMF;^(pv=YZrD(AfIi+2|XQ~CJuW3IN zLpJ~@#c(A{b6NmUrEG8)01BaW2goHRAXmUk<X5RZ5T`aOw${E^G;455XCqrPR%gO{b3CX4m%lw|zIB>`(*9kTdHE_@K|G zOR%V{_aT2S2SBrlmJ$r}O#Ar=?~~K`HLqgbOGF&RYx;|qYsqrL*zD~^S6@B#^L=2Y z{6u-b1;~IelKD{753dx#TNmjGB3e7yo^XWRl z*m#4u7C@je{4HJrLobk|Mj@{JDcK+F=wzrV&pN4`M{a23u|EMp*ngscwNKD;(>p}+%)Wm}vvf z-EtILX`PY-D7_p-ld0M1IkNiZmTX(WU&HqrSBvotftr8nu>J?TOWVM)!|;(xb4P#u zWHw6Fp@Ak~(6pnHRWsH;S*EN?{yeP}^p!|kz|gbrsC!dRuBdLY7MKOWvS(synwR)< z1GXzxdhw`O^lm}>v9Z#DUnL4ifbi$yx1OdJJy;=Y8@Z$te3-ruyyb>>g}Pvl5i8(j zdd^P(9Dm@&H8%m1u=kJZ$?WP&@zYpen1mS!k|D+@?;KC=pn5*&bD`6oy|BDK5bPOq1*_fCLg~ST?jRBvwEMahH)|{2AG+T%m8w_uyxA zs?FggctTQF$hCtV5kQrwl*P_?{9MHPE^$Nn4&40b7MWk;o?X*+)BR)#ej1;rw})^F zfS0sp%i_ni!{k;f#fz6uQK(A(bMf6vU@f~HYw9grwY15uq)QIh#;)#oF6jgkf7Fd* z5n6A+jmg+?VsWSr?**pvtmup(G?8vhyUb0J$JDJqh=^7inUbl}e_YeN(ldYD_m z3z?++_$#i%gIoqp72HeUTjS?9B$f(R)a!rl=UV+LdUcVqs2NzK1x#Hx-v7OrqfiJ; z(MK!q*EjK8I)T5-`bG2koB9jb;Im-0%U&uUp2(K}9QTB*pxr~*71bI1_n0c4eJ_g6*twv8{~>7g$cIVq;CKz5%vqyEvjfgZRjW*Zx%%&HfW}O zGrcN3PXewLxJ{nDV`~>Zwtn?{&y)AMAS+Y@w#qvQOe%;uLrl@LmoLGVMf3yOFL=xJ z4j5v~fwkPjSo*C*Ro>#f6VGuNe$D17RT#cD7}(22)qQw}0IG$OT#k%rj- zXr?Lx1X?#vDOV9}ufAq+;s%C>eFkY*@(rHj1U)+iJ9Lm|4#F8JjVR>!_!W$MD0O5} z(>=4E`z2s~7Egnj%@nuSmoae5RY~&&El={T4#P9=q$~W20MI&=LKtklKwFp>l87O8R4b!7d{eovo#;5k~AgV zTH-CtMRmq!R*QLb?_qb^-a>3?R@fA~F!G<7oI);qBNN*wSbeI-ITqxYUIykOM4$5n z#}6K~@ZYs#y9XgJyJs{~@4i@~n4DrqLr2Yx1IwgGkm&!)g;3GZk|Xha zm>t2$=ff#wBEF())HoHcVHX^k2V}AFl!g{d{|I?_kcp9L5aYbQ12-$|j1VmknO-2N zC)ULJvZ;S9xr(^oe@mUx?(<@2C>J|sX#A8JSAlXChs_BcVAe6b;Lg^+)wE#MFiFD&*kXMCDmu*bW+v(o`Z zKenDBxpYPqVJ&DATg`h)Ly`WRk#v!)+w_m(Q{d4Gcvh+0GGI`jh&!iR9&>h(66aU_ zt)8qgOAE6|WSpU~u3Tt^n0PZQZsg?y$B2~`9`_A?2flC*UJq$cQkZ^@vZM_zN%kRN zBPnNcpsnnT)b3z-(x3dOp)87iz4CZQtK8lgu_KzjDdQS5^~v{xyQ{z)JHIo}xoip9 zAm52cSQN3SOf>tdLQTzXK%P*U7bF7WmAZTUB(Owz%&uO||054$A+ecp#;so#p*Itx z27?#2GfZz&!lF_~uqd`q+$yUZ#7!J&X1U*@kuQSSSvjihG8r!kIbU6$qfyPQwyJD$ zaC2Caa zh^6#hmG}2^i!^bmMl&r!1F@qI*CUy)s`f{sXp%DbkO9=liNae0gLK|CZlxyrr5j_b zxqJ=*cQI)^{DPy`xum6uvSTNOFKE1|Ao+t~#NmjrNcfP`wwlDvvbuMhZqqteZA#W} zWolvuRY>B2)uY6tmm@fv?@=z1d;gJ&^+4`Hae}a3)Afy|WdnV!Qf`WM7ajqR>1Z^w zN^fEBIwR3O1O<5v5yxj4mptqdhcijpOcR=P@PX=L-i~= z?ol?Wz}s>+MKw&(w*5y8X=+Tf(*MKRTZcs%b#J56Al)V1CEYO6IZ^^rB8`AZNlGZ) z-Q6K2sVIVU_s}Q}(%p6T`2ODSeCM3+uXA1c$2{mT^E`X6z1F(#b>AP)zPde!T%`t5 zB7~N}Xc&Exj+oEB>gtqyw$owG`KeV}v>qc5CV_vlbOoD3GC$&vDBeobMeiJ_@>2W@ zx&iQ1HvmRq3|HzT6GZ1}vM>t@Fd2M?j%N-vNPB_@_(?8u%$X^nSJZ^Yp|s;NfhPAs zTd^paZmWN@eyv6KF%ZUqYG^Y5@>~}ATDf%jgv}ZfOz=3#NdG1`aj6=pYFnUL;A}|M zJY$4G6GI5^Qv*?O_574;Cg72DSEuXB2`7QZu+;n19PX;L zMH=+-C#J}Kp=?wL^r-Pq7F{+N9?M`RL5cIa<(}=mF74%U;lPaLyo~O+AVFA(=Ch&s zAjE^lpvDbQaxV?_YrMNY@1~@#y)_BuaJ+z0j3(0inI1;M+Ne!`UXqd%yhRD5ded-g zo!L|!{^SJQy)eGGM!AMCubAe+5%M((NDo=bUd-krKV8;X-ixlnsFoKbv_*7ttFhO& z;nmXT(keAeawT+%r8VgrAgMP44~qt?IwHxNGnrmHJu66u1PPf7Eu z*enps{miIe_NtoE5oR+-uA|i8EB3|}+pUl_$M%)nhs75=J!j?&61ji6Chws{&X>nw zK`<36KGow!hfVZ4?QM!#yWm{dx2z@0E%~mv=iG$~bnL~u0MI5B zc4;;z$k>8M>h+xYk8D+(uutTNB8UDp2qjBZ03I#H>)wz4&(hXNWrT=zqwzkahs1hQ zsQ0GHFfV=Q?)+rTKxG;KGSfZF=RAjrIx~ei#(Mc`lrI_u0VGsNIj)Z&|4cL z!XzC!=2S0Z=+I-$L8AO&_E3(EylZIp8L41=_w$?sk?1{4i~^@1$G3^r(}5ZjcKLyJ zMudFQBViOZc&?@sIe2GL9?6Q$MF$w4rb0V>_!RJZva#thAJg5`V`)}w3EGW-iBZj% zpxx1(ddp0|ET3+U?WdTJh-AzfvRc&0n?z(hh-GYTev)&@>y%kW5EPp%6j6~^yV$sF z1}1XJ(dmTtSKuXOylZnQD@q=h2>deT+a{V#*!}K&^%-5@V@;}^CS9NOoqA%w+U@*e z{DiOL*Zwu$dTfECz4sW>M(I=gFVO|LLWJsE&Lsj!&2?_w!Km3AZ%qfGm4xIE%-jPE zU)P%$vr7#HsaxZgNK)*#z(nhGC`b7_lBQ?bgb|CjKoM>uWra<}pb}}-Vv@$Scwc5M zIhjpmMh3zoaR2w=wrlenE}gC*_lL$^{Q{~cT*|sGMPnO%x7Oo4xf25UobGkc;%tf4 zPCE5yd4#Fn2g^WaV4-U&)=*cxEtE^U^Gz|A!SGrAl;Re%I=dt|{vU`GA< zDopg15U%D7k(t$0>VoD|Mr1-%=Ds~BnWFgv-?#~AamNapZIs_h6Di7G2e6hs*5qJc z)=@ATrFqN8#@;6bdnkA~J?y5h*}fg!x7 z-7z%PekPCfdwB^zM6(Fwp>9cuno%2tzAjAmtJj~DZ1~>2mdT4R^ASRkkdUkk{n((E z&sXt^9(S7w@~sF3^g8}usy9JU_Xd@U+?Ml%(6!a z)t_ar`$WnJy@4HT!cHeJz4Y2(gDJd+E|9{0$l=?a8!lho)Yb>}xu>x)CYW?a=kxLu zey=GO+?VQ~-_6Y1Vx1#6obt~6ZFnv5gwhYvjH`Wt!2G>9Ryye;z1(2`HmegRhAh$ktO|1jqpi@}Y$VL!*F>t+d>L~T3xTN|k#1TC zQkavq{w_sr8dl`#RfCzh-haMMxkTjXj0(6vTJ}E*UHl;4Lqad0Q#$tblGXH#N*f6F zT~PlJp3i?$j7|4_&*&XEaVHP*MF(#)%{P2<9l#$H9h}5JOMh_w^(;FfA1Ojoq+6=e z(+q##d?A(VjWwb;3Mug9uNiqYl11qEO8(ZhIg9(E=~kg%lv#?EY313GY{{jxbNA+| zPt}-jXVggD>z=`GD8$lImPwONYxNnllh$j+ng1D3op&RI}BLC@Cnt)Wiz7vclepma_!&sMzWp+WkS?n1if0-pQw2wHE~T= z$-1t7M}iCltY|U_?Ge72H~cOQx}W<*{LZ@+^`&#_YZ4nv910WyGZS>)ocaDmTe(nI zri7)z!k(S?F${g(ow@$T2_02J((L}GO3}-IyuKQ|Zfcbv%5NX>q5*IMq?t9D?K3ty zzO@TNlPB!9jvNVWVU~G8B;(&@=(}9`wMYoqAtNni(*{0DzlafOzLQm3E@N|{5i?kb zT$vGIsj-So@O_uu`1+}tmsssY1rUvXHf;sS34_j%NPmNGk4ul!Ey4);^rd@2bRV33 z%8P3CE}CK{JMYq~*WV^E!P@f^g!MKlj-;Z|KJ zMOr;?o86hS()=8z8TppwhL-DX+S2QYFjDT~X5i}!Cf?z zR21@eDigak+2OJ2oCy`tZyV6+Uh(V3GkRVY4%~c^u(91mMXNFx$O#fGyaDg48M#5I*7zwagU7Pa3-SK$ueclbcyDcP$Git$dgxo$ zl=z)nwmueS-ew)udch%XMc*4ZA3afd_DKyx@OEZ&1IECF!XqiG{BhQ-LaOw8&ZU7$ zY2HjhjP!yTdr!-ii}^CvegX!8+|vX_X2*gw4cQ??)CKpf7R1IoMwrImE~}rgNhtf! z6N(^;Rnp?+b8E;l*~IRXc`@e7DZfE1{P-jnq2waw0lc@DUIp*UR>qD$&uO`9n|pib zMzbyquEk%ci@t0AqMDh*^#!4cBuD+CZ`%9qG6!}Lvumv^NHDrTn(B;>w=J*}g#PB)!i~}Dnc)L{EFX*tgMd4xTDqNYloZIk)(`pC@Bxk?Q z5uK6cvCMJ)o>|U&&eM)2-8kb<{GcznO+eW&0*}P}o zF6+e%b;FUzv(ke~3`$Elr6%Ufd`Yp6csBLb`wZ=7f!z@*b<{J_e_DejJI;S)?*ED; z#7!FIh1+lM99NanJjz}H)wkhNskiki(8*n z%EeI+OUO7hFZA)?@tcMrFqzw_MbmGW)be|$BDnwN5%M1(jaCX7AIve%BppGMt4y2h z@nMaA*$8m$)R<$_j+KjajXLkyMnL}D8cfVwBo}|#&`{I9nBx6Zb5i{_{UXM68wux@ z2jTS&TIbHj-NenW-d!YCl2l|Kgk|~P_o+tu8FQHQ8ye^Gf2wM_>O!!{p-(V*=lN5TANDZDl`%%picukt#qiH2-4OQ6e@ccP-U zuf8kjOJU?YD1?`zfF?GkOdHIB>Ou^)wZNeK-&hDqk7>?%E>5jl*5Vzu8E6Orvc>RY{GfkZK-Z72V!<%aPTc#!I=ucj4HW3$QD43 z8^DCN8LO1Qh8K^Qv(&^gL)m1OJ$vJ%5@$J)0roe7wXpo2jIsifg=bq@ra3PCSw`Y$ zA!B947ipmTshxVaOu1~ieY8dgEWy`?2Gd|&^Fr*R?M{k1E_e~En_OvDFDXa{`#58B zTssIH0GE#I!cj3wR_*O^l#rD7yC79XLxC8$FXL~#$@C|~Re6~Ajd$E|vX{D&JZ&iYq}Myjt}j-c+zi-Op%KWUHYV^rv$;;y4_ zdXmQwYeVCmC?W}cUg&pjq1xy4i4%spF-!dXh8BvR@nu!K4BCW-VGcP2bM@t%HTt?V zE}>CnHu{+u@}<0Oih_u|FNFHOikS+@y+%Y6e`yV9@d-3AoLH+eT-s1%Z)#}^sb6|6 zA_&(0(XUzhsTpOkwJ-%)5}qFx_(H8TJ$S+_SNeR`zPv{D8#i1$L~&MZM&+c7d_Ll~=p+MM;s z!*{pETm~D3jIjd$Yvpzz8{|s*DR%=*YdZjk$tgYhn3iwVdxujcb|XO?PA#pHOaUO( ze5}~|@yddp$7}WD)zX8qg;O(Dec#4YUOtZw{w2Rqgj2Crj+8!0d z)uNTL&8*{D&+imkBPAcCRhHt{Ow?n!c1~xmAU*4kuT|zhJ zj#$*rkVoZq?IG=<0?;S@+Y8|u9W+>;oe3qi&ASo_EdVlBpWwZ!J=sde5DrI17vw*R zm=w3UJ)J=p+>gPqo+Ax&D0ajnxABUe=e-IvGRwE|TWZgtnipci+tV*A*Dy!K#*h~C z_FkTmP*mGQZ&;9Yj-lwJR=yG_%lZzZm`NowMp z4kf(V>rZNH0+p$Tt+dFP^;J~iQ`Ri9I*)f`9sS#big^1YMD~_PD<^Cq1ycCC>D2u0 z!qb>c*pqtvCS`JcD~uuGf%bEalyUtX9OR*M8Yh%tMsW(J2_(aWR~L8_ zf_vhpH1~2tGc*2*6iN)8dR}55I0>6+30rCJgAgwz?k`uD_r5N^3+IrNiN!F*lb3@- z?&(!dw8aL}gE#@PIMTNg*iFRXqFEmf&fjEaSs{vH%%~E66C(_f}cPWEc*~he+j=rdr3Ea znt9pucqM=XeXG!ZK)JsJchRu}d%3hA+E(QT+}|L;rTDp(NrgU35I8e-Uho^8&j!~F zk;)>UD)8@=5dOphEupzOKy-BZ zw%gkW#63FpN?N&<*iC(J162Ja{T%XcK)pTp!$^=kA}l^5N=l6$OLPIMU8q-jxvA)E z<>quFJTqfLB%rZY6LchxUL*B8sQIzkW12v@hBvcZPM*GRs)1y`0D2P%kegVRdTsi| z1MsZR{`>*-pSND!ueQ~0zo|9#!jwb1X#>?P{YHu!T+GJF0%>)if4MECwe_Wyi1#p0 z+eAhczX{U?AdS%aFp>V{PXv;_{+PAXZcJoB@s5#$(r^h|O94cxXi%WOioUE|Dg4miOaUxTS;%mMg?AyXUS(yOm z+#)DG0%A2MzW?EK^U&e7(#qWP^euH!^F@&^*D8xuzT!`Cmb zio&|ybMVl8S~BGuF2s<@&H5D>h#`X94|p6E3DW?P=gL4KbW$SNFXF_(cp-yrhAo3> zrqTl2DWpKGp6r}sM_|JU(0UVDQm@^flFy zKwcToMS8CXiqo~m8tTBtMALsv)_D>eh{p@J6uV#F?p@32W4|*@8oCQ=4t3|*F#3U(5W&eAidVdf5iKA zs-DfleBK1t(M3ULKeot+<}8WQXI*;07$r_>e}xlhI#J{8=fkj89@s+D<-=%{-1P-T z7XWL`3DylMWVg5nQ*Gt*slN6HdzBO+l0n%{7_| z%^g0W`o3_xDgV;B(}G7M$a)TdTVe|QMRW*|YH6wF<)}&+H(sbq7ReEgpk2yx7F%c; zG2bkq+W@^f+^tL0IILka|H@Xh}3Yod%^`T#GcWo$bIf<78rp*J;Be!+pkWd5Cn_E&ny7>2~93^bIiq_NN zk7Qa}cOaHdclOAAKSpB9?iN+5w4_xvwg|5x5oxyD<@qDr<0av+)0K9q9L?(w)d80z zu$r)=cxx2z?ckcz7Hv|(82IRNz$ZA8GlpY~2}g1Q&^hOmn$ocjF!yX#vOzoBR&W*=E=^yuS1B7m?BYVtG{${<1omhkxy)kh_w1yVM zQ;#tE8Cy6d0KGx_)`_iAi0x@aMz*yx_STrP2_lwLGO7|=HwnzEG=r0eE=1syqyJm! ztN=vKLBs|e=$ES>U_Rgsw|yAVA}{qV>Jg1~NqQq5+o>d&ImjeEnffS(t@Y72B)@^3 zr;nLNTL`*q7&i&autryVV+vBqC%l44qZ(J^x zj#Z%I!)5YDr~kNE`SlNl#o4k-k|}u}swQe1)*p!vWoFPpTS^)lfZB-q?3cQie*udW zwc8AF1bdZ`MqJ~G3}4>+iV2d+{+b;LZdN3^M-xslC#CzB_IbOBm-M*Wt*ocNkf3y= zSJ+K}kyRPmO%lY6%psSVO1D!t5|U^n#npE};a6;|nnOCSMbha}jbtxn=r|%lxEEM+ z-U7oBqMinDdN3(m)0EVY8?GDQ&4Xxugc7GLTC55LAq_?hsS!H|=f4j_w^bV|fx#aIE?{t4v!Y8LcdXS6CrXSv7Hf)XssB_`PEwBUQ)6(cJ@H>sypq^4 zyeg+(gK4)K!Nmy2p&tST6zKHajq)Cx9gwf(A~Ai6R6b=)Do}h%u4CX zx7Ax$AXia+l08n@c;6+2E!Vr8+PInX+R~5wA7RXwFOGhL&Z80b=Q}iB`!onNQUMCF z+rd9Qjy47O0L43+>MZyGg&FcKiW8A=)#86-8~(#9LPqd=y^Rr>4Ii<9!ef8Nqg=1# ze?NmsKO&S*M7_Le*Y5d`c<;ZrTc5KHQRjzUcRmP1*!jXfRwK?)@1=*U)_ZE8M`& z2u%D)axeZ@L+^k8oc}KYFjTTna4}0$Kr(x$-vQK7UaZ2Yn_R1Z0EvDX@J#H;W6%Ky z)m>yIl%XBYZjG#mb6N%O-~ynYdQWsu#6WbgTi=O$^2wN%XH1STNOU8W0nTfM%cuQi zS3SP^tN4s!9|-Rq0)DGo67X36g6{D{UC&$69fY`lAI_wn0o<=Q4yLXDQ2|8$1iYPi zo`83e>;h`5jp%R%%t{Hki{uv|r5!XRG|vfKJh0O@;1;KFuO2-hPkQ#vP{tn61FGdI zsDUKjGH@^*?Nt2`8)i{Mm;MT9!rNuQzsKOK#6$(b;K_S1tJO2svv$u} zH%O4}b3S{x62U#y^5ENW^X5%!QHrq`^x56%GSFCeLUG!op1KMBgY&Zo=JJoqm`e#3 z;0~&!`ago|FLY^>+CJuTd7-_U9%?T|z!S9_5SPt62dQjhKLgj1a9sp^VxXquH|5o(6dCuEKBo^#K11Axi>|TueAvaT9$26tmaZG`dP2Y1;=VcH$CB8pxrmpTm_Ygn*U*?_EV0RnfN}Y24+y7+B=th7-31@ci zm-eTs$QVsx!_{v)09n0w3~oALaz757bFBr>Ea)R`m`p#H6+cd`TL7eExM=aT%h9u5 z;n3>u%MW$#)Js}KThrX6uvb{}rusH>C~ ziH@7?{7J=V(5*CRx+CP;g!o+dHj6yZV=LgQlqEMQD}`G;=LQ4A=W@E4Z54F%Pa9E> z&)+4_=e!YM=_-HL>Ynf{kLTFnDt<492yy-w)8ifH{P~M1$Q+7ckP32HbREf_=-!UjxhXB#X7Sx-#CqQgj>_v@C^mQCsedO)UBl7SVj&5booL!=v3ilR?leOB<-E|4z|om^!oo zm4RlTf~g(j{p+Hd5j5V=@7#^*$OGoOk)FH{eV-bgYGAPQlVzCJ#D!aEG@*os2S0?}0ZwS`cIn8)C+`&9a z8An>Hd*JhBXS^6WFJAu)oGkPWJICxg%hGhB1sqCcz~`n5?k6oOS#Tt5KPP~se+{DQ z#u`(cI>oP)Ne~_F#9X%%C#YZ3+K!&f4!0Lh!nt~fxTtLYLZ}9j($7^g4`fHj6%4}M zu?QDU!dGRZE=Y!YXxXsvLs3UY^JHJ(s%Si=TirzRHE9HAiO7ldL#FGdB*SslGzAkb zxoI_psB_^FzMl`3UsnZ1oy`<(t;9F#^>f7x<*A?6BiS2&3u4Y?*}a(l_JN3!@uK*@ zPiYe>a#%D2!DrogNB7e6B^~XNYhN}+Qu_A&coMRZ=yPD#~I% zC&l>A)E4Et_0Iz(@|zAmhUBwnVY<|%AOqHV4(H=yH03Nj?A zUZcz_InyW($1*5YL{o{2?J0S;=cOsU5>Ofa5&)xhl;Z(UW%~dWf5Y16;BAEyn4ddS zXyRD_G4f9g7DtPu4c*y#(#7P2_vxe8+oO2_ZJX450k?2hwKh}T_kOWanHV^X-le>a zT7eV>E^uLIh8wa)kaKJbsME#LeI7*&2vy?mw{8lIL<_pJ0y@i%o#H#u8yt2xPJKV% zgA1u(B;yaMd*BYJMy(G?(Kn=Phe-Ve7{B!bcf==GTRARV|Ji7_QtyDsxVAe+JoVMm zGxGK|a!t(+gVYA&3+HL>D4##(9fHFUe9nUd-Vcg9$&0M@t_9HjjN|`#c3J1Q%?p3o z;ga&x50@EK1LtQPy#l()uMUfuyuzI+&g*b7 ze}1^vwdvlk#f&F6H7+yEWJt_uZHaP_vY1)EHQqHxk-VSXdbCpAnj6owB)f^jEM+4KN!sgh4`kR zyyk+Cg&t}FewM8FTHWbLB%PD@2)q3T3GI=09YWQaQDR%il^90G)HjW1bcr>Ea^1Ex zmNyLs`s8*(X*FnNk&+tglLa`dT&Fb;=2^=xSaUX$SqJTeFU8FS|1Nk`l<60n_eAgi zNpJWrmMkzZgXC#Jx%O!hBvMB8cP6j9_S^i=IX~%rkyM3!4pJ&6>>d0l?CjMvJ3HWfdZU<=VEh}uy`z{6^5Z?Ms$R#&03++ppH|Wrx z1lS?>J+iTEFfgLR*~KG`)oyd1!qpRMh2^zq+yi~|^a-mkK7M{+^iFJikPt6hgCPeg zhnuu{iX+cT(Bp}f?hUu|LYt`eP78r(-JJHjTe!Bp6+l8F7!3-#vx2>ksii&}xQs*! z^1r9q5g&P@^(QBR}Ivuc>; zTle<2(24iducQ~o32m0Kzq*L>p`Qsk^V!@sAUutX8qY}BTtu;(OFLeZG}}Pe+0v#ZO)p=Wl!4oyPUtJpZC+4+7~9#2+>J8^CYca)yFKBieNlA zi9EXiN~&!HdED&FCA;yePo3Hx^9Vj>f$sR;9`ziq`Y%o#=PBd{0=c27B|@x4P3$=K zIQ~JeSYB_xI35J=yR+$6hscN^FXUs_q0dRKaB69S&vjIk8GeiTGF#20o9R&f<*Kea zB#dXnx+}BbrdGMi3Hsm-o0h@HZA*7kl1><5TrDfaISyaA2Vn&zz{148-}hsVKzURm z;cegraclJMvzTZ1-zXouFpz~ab-E17^;HzM3QYZ+W6n8i+zf}u-nX)XcoO_*6>U7h>UT1n24V9uR_V*%wVOYUh>s0Cz0qGkR9B- z)xdm)>-|YO(;FnI_i;a%lScmh{E&f!D=~_1gEt63LiZLVA8qy9Z_-mss$5E$US>?t z`YY*4q`VEP-H*484dne(P?o?3eq%2GiwER^|cJ5uR7e zXqQC+-X~#a43Bx%XfCQ;K3wuD2u;|5;W&G~A5*xAVklA$r8VJj8H*Yh2!RU- zEXxeKksZLqt_9WG97;6p1IVd);4`#pV~odPb=M%_6%W~XBbq-(qy{etBLrs2Fa-0J zS2}Y{kTh!@e4dlr8SE54VT3hrXplw7EYgijHoYo^)@;5ZmcAz-^Z$sv&U}uLe?-vh zf42?>V4bBO&#YF2l}Zl>l*QjuAmt^${~bWa^wauv}RJz-A?t zVcI{A=#J*s6iq@+i^FlZzb9Qfes#36l+=v_|pVBRJocbIXR>aKI zXRAe~BZT6q;SCve6ldAsakRDc|GY3zll#t9IBDZ!)8tOfN8T=8S|sm>H=n8+?+?6M zD`Kv9_*8FY6JMQ27KX95!IM8jwBA(4zH7tx_=a=}S1}0Z$VyjB&E7wfPE)$S-!#-A zJRbx^jMWh0o$Vc6^WWy!wD}t2K9B|Ncprbs!D|H9D#X$3Dn`NcyCU97+4wuL$}1gu zhR+=T(zeIwM6N=%ET!J2@MJ*=wLcL-)wteYE2>aKNL(b%LT$9aH&(ptSahlwF zd2{PDK;wT_?A&B0dyFJbF6>b_;Zgm$ExrD6m@RI|`6(p}>!)f548fNyWQo5vgR1{1 zd;OHV>P-6~c=3MKnyY>FY|%+hy-*jjaI@L)tvjyHY?YRs-p;nKr&-BYd2K@6fki|? z+d@he^8NnrM0~TTp1xVvy1spG=BDp$a-#DUC}TY>TDVhAZNqq`A#GBR8)`;nFfGyd ze_aMhqj~=`&sZn!zgYk5(_ow9Tgq2}G@ipf-SO8HJHy#s zMozH@Jwz7=9&ZUC>yHy-D#T zXvp;&VZ|vSiDJfM8^L;`4@;;Bly6=7m{JDgCDw8r+c8A1;7jqo|L52Hl3G2zgr3YA zl=+q4CbuS54a2qT6-{=-xB2K_O~fZ#zP4;Hh|qc2AAZ^u@oA0B^69iC*jU#rcHNnZ zmXN!rn@p`cOCr%vK32X_HUC}7)<~Iy-HFGx={u}B?PYYKa&cAad2JnZj&U3&G9+dg zHSfQ(JAX9&zmnFMF22T)_s`GW3mggG#eeE%K;pZqAOFk;kRflnm8dNbG34iflUroW+i(ny;kCBkEYSD7JzX`v=E|m` zCpfF1u&`q>pD2Fra)05-*9sb?B6aerf5j$NmYyW^vYc@(TU3yw@zZp@KL*hLduKJd zz8J`LFP?tlo0?^%v}8ReO$a4BE5ZTQMtZ8W>F54$O}?Pf_EaRa2c8`VyN?s7p+dQq z*Z$Z+zqH;StA?=oR^&q&d?*{fnc=9x7NUgz%v2tMhUNzSclyQDVgs`-&M&_ZQFGjo z|AeZ*z9M@GVZJsCI?pMDA73J)7x&n_iVv5oF?DTZ9)1xh9;H35)$emgp6bPA973c| zb#FIJ(-+ELa`RjEC(<`OaF?_FcTG2>E+@snQyb<=U{YEhJvuB?sF>0 zB#Gi5<&TzBz54N8iv9irtbwiS156@9@+1yAi&=60rY2w1bMCeCQt74YxU16l*DobZ z1Zm;x5f3p+F>AO==PmL3Bx2oogg&XC10TW4Oq-rTDxIINu!5pKGfNFedEWO~6qnMK z-@HMb4duZZh4wSNkeez!CYwLe!!M_o*P@oO@|R?Qd!ETE)rYEcYfnP1GWde4g1`o z{2$7qT6Q2^77}_PH^txfmqitPavWN&YB&0CQRS1^&Y(A{>wYdewKz%p(?wG+uac^( zd5D7JKQVJ4J$Ew;yQhuKRi$P`ivMKLCv}OtWN=2gYYkl8TneduT`rem=Lo&qoRtsc zO9lU2lu@tomo1bTuO^9CzS^6v0*#+{51U!l#P@TrkEfgBUGcK7Jf>8VCu6>(Ui%v~2FR_t%lwf8PlU0fec7&8)wyNXmTdAo6b|b z13C23meXQNvO&j>7TGpPYUp0LUrose1F7#L2-$}zSToN)xe8Wp~LS>+c@6t@zpSM@!B}`=$Sps@%t3TJWD~1yhZ)TA!Qq zjl&LHVO+`6*oa@0`bxM#@FoA>-%NoFVgokf4>96@mp;j$O9@CtdILKp0ARJSX;-|< z`D!!K4L>xk09nY*JX63XzRcaZB(Lpue(~PwY0ITq9f+iU&iiM{6m28a0!_Gvea>|F-F9a>&vZ2Z zwN5-tM~{~%Q04rnz!47fE8y1+o^1b}gAN2@(4zt0=z-`T+xUHDDgk&$c&pp$>O zXM7L;DEtrv{)Dwxzz%Q--n4~xwBHKJksBBUjXSj7Spn)5(h1;Dr2(vQx*2eTtojq# zg2I1nf|UCE1RjS0tJMa;+HB#>+ti{5zZy{aE)H!)aJTT>9JKlw{{}KeJ&|O*?Sq2T zMpj@G^FMpIbumtp!M#4)vGzLstH~-p=JH4WPoF`F*|Gjkjdnq6F{IVjq*&;`&l`pb z*4(xwlK{?t7L+5pfPze=PPy&|=#BI4%{B1zTMhESn^;!>5?Ju&*^&)liwaa;1MHOb zbpQ8^RKNh;3YdBF!`W>^e)lId7o7XgFuCeuJplxoRc2Xj{PPJLaYcrkUt43rzVNIC zp(6AX=}Een>t~J)j0SM`yMScFFuXS00L^hnn*G-6ZH^PrLQxRZKLiawkSkgEg4)}E zJ>2pmE~5#Xj6E=g;Gq(C8?>_p8J7S@Wqo`TxO*q{$E>(%&2yZ07a$GI&9lD=QnKgDgD+p_ZRb~6s>&bYp{eU$h8 zzq@uc7v7Q8xSVYI&qfZ!e-jxv2auvS(SV%@EYU_pqKXbP$FH-Q+k$kd=4>t*b^tzA z*z_j-E-3&3@(TzU*^wH3^fH#+1Dz*lMh#JWVs=At@+Zsz9EXG=`~!|CT3l$K?URXq zuy}>a+g?^I6YJ`=!ChZH<$>+0eF*{@?*$yGSU)j2UhA`(tG9{sob)AAgp^AL+cqwO z`}=$s*7!e>=98DSRG`7niok9yLPukz} zWb)vy{(3b;L|t+a5gKrbX83+gK5GiErRva7C)$B!QMbk}RimTn;d6P__I1}9E`6Sc zf8sAq$&KVU5pnmxUJ~w>*<)fH_iMAIAibDX} zH>}s=!f41xy5exDY?$H$cy0hcRSQtDTG0;E3I2tKETt45jsjI0r*?h3$Gv>M(#zu7 zKb!KIDW|QbM6lKC&If&1=i(ESa}Ta)Qz78=12DXN7O15eol5(S_G}Ul zuh9v9f4^nsXiNi@JCl9E^agSX!c2xbDYqX(?5DF3tgKco~aV~9=!i)AlLnv0Lj zgBG9W6Pcx_C_E;xjSUAKfnWw|8}Wobk?J)Crf8(++rT{3X|w5zxbVm8j|%n9G?sdM&LMf=#(GRiPo8 zt%z?cN7iNWRnIK?@)bju;1yQm*Y#w>jo#D|Fq?n20QrQ$-07rk#vRJx-qOMXgQFRG z6!tJU+_nYq%rW%Bmb-7$GB>K)cOu7W7Oy`id-H|VZ@zSB#ns#?wEjQeUlfG;JhwR; z7TL9Spa9u@)@FJM&^KpDipLTzl*Z>YZsN9mR$>eT?nU;Jbews2_ZIA{UR#A_C7<1y znx|Sz;8aX|L+#Yv1p2RJp}`=}U4*6!^x3?VHd@+w{0#cWuE-{Q6GJd_gs_busu|$> zvuSsq*aAt_7UaVnKIPy2Y_}{XkjmPs`L|uB4><- z!s9UIHLxkO`H=<2MhO@{9RM1L1DrCEpKcA2LbA|UV9k-Hu`S8=`uxFKax06U_6B8~ zGRNjpj)4iNHo4L|CNSowy{qXWvD7&Wr1*puyJI3_rEFR`1PY>sxZot)(yrOp{;Nk9 zPHX&qEs5HYyKn8&w!_ubzBKJ8lkWdHSU{YjB?a-c$>VPZJOI%0BI2n6UP;vi-|{Ht zmW+S>M>0xDuX_H2Q>sfO!bRZyDdqxrK3ANIz-p+- zd>j1@%oC4*2V=UNs01)f!p6DqIle^6@toju4DdeGdx1u%fnGCJX_x`i%%lM&Wlr8z9`+(AL0@>*n(g*Y>>- zaQ%b#K$3dQ>n~jS1v0RBT5&o_ef5o>KpszA@miWozJ8Ckoz{0%t}=35<0LRWCYRy~ z?!}v9Y44Z7%b>;Bby8<}Bf=MG9<7Nzmx+=L2t>8#(UB>oqgme#X!C7~;mA=wFDg7H ze_~#_F|E;x+t#%G4;BI`&PP1fs7DW6l`%ZOv z(w@&8x1RjN;Xql+`^+L=29N|&Pqzx%3~g0w|CG5()^OR=ulos_Iq`fa0M=>pwnI&w z&S8Sp>V15k2f20Osr4N(qOuDo)&FDL)Z|@GMVzK?n2hHPIwfz~_!8^plxL4T_1WAS zC^Y5gPfl1j=ZaKGg;7}5RnAq7+$*lUjebL}y0@OHrA^kF>z*5n+&Sv6 zreYdz>$F~4e02Yz-Q);yEv57|-u}T9_M5DdroH)l@1qc&r|Bx>R>I} z(cb>*m76bj7DK*Z{rxel07?mX=|M{#%7j$&c>S)1$uTJ7-vu6W(BNnCsF-@ueJwGd zM_3yvxW(S&aE(MLCq zj5bL>0I&)EM3Ik23f66;koVGr3Wn-h@P=pNG#(sK#%oZDy)R|>N!POKTl%6p(7@mZ z(=I^{!tpx=yp8N&b#g22eb%Us-?TDVbN}v1t^~X^Od?}~hXN@r6@B8@Q#p>J#iR|nw)y6_J?eXM(!7)g90P94c3(N#!uRCU+}7cn;w$!@N-*u^O-x*wQXlmfXAo|CAid0!u6yLJ)9uohmv@9-AdL$55_&{2W}oQ1mC zH3&T)T|0q8MON8M2SeT!O>8gC9m$&=0TK8FR3CTMh0Z9=ERlDX8GZTfZzwemp(O>i-2pGz5BCnSQD7 zOY>WxAH>6;7%ear`Grw`85f#;+HW)CJ8O~f+$d4jU5#L*nP0V4%v(BSuEm?;}!46d_2`sS3`0t(28^G*G-<1T1 zAc?mmOF65s;8BK@dqv1?es&1f(RS8$nd0q>&P(LqY^;kd!XzMj9lfq?B&q z9k+Y$^MB4cp6~Bsce#wfP-wj#SO|Q^K`R zREJ7V1}uz!&kpK{*uU~0Uokf*bemfh7=PC(uQ9uzu<5ZB46Es%p?`ExZWa)R^yVC) z$3Hx+=LOD17TcFHpjv!2R4xGCzkh2&Oem#UW?m7KosdG7>P?=uiT-@;)j8ixG7+~= zPQ)H?XHGl;gUozr(@~Kl0oUqF6^8F(u~*wDKe^BNP+fBHdVwl`5B7|8<>&Pe1I)n< z9-4ZOq)83Wk4=ID1lQyN-@S^he^+7!9Ir&h2cqoDCT6T1x9*Hf%YR69%vOPW93V6UfP04;*BtKYzO0DW`c<))}D5l zTgFGuDAwfCMA}b-NBdVkkyHY6_cxsI?Ft|WGJtCW%T1U6C+86R3D zqGlaIy+$!#o#@+My1N@ik=ioVNaOSJ)2?U?Pvli!okFiq$BKn_1-9ZI8z@MMkUNzw z$7|CMK){ta`_I6x|q-JDO8+4=6$KOG=#z zg_Eag9lGxtN-evO=_iWcM|PG6oL0NhM%EL`xVWggYv&OKFgWF2RmcLdL2Rz2R<1`{ zi(0q&@F1^oJM+?~=_87qak4Mr%8Ho+Y*-5Q!gDlyR_gqH0Yh*wi#p_A{E2Ce`DFM^ zqos}qk`R-20Ue3%Qi6~z?H?3ZL$_X5GahPj=g(I+It2!8$r}>TN9*K?2Izjm`$;mF z!`mm9^{aVbH{XrvYs^5nvZz`9P&}>eNYhVAhy2PBa+%+%5hOc!&3);xa7}a+HQyof zce>EeZFnb+TNCHA^wl-sYoB=TVld(5|4nh|;9h*1vd}jHKdTK5#tKxm=DGelEl0MU zBFYzzGau>P8(3@b1SLY}vi)y1Lba|Eq`%MdzG@RhoAB)~ zZ9=KoIU*Gl^h*ShCiqGm&*ve}GY-^}+c@XuGW#j%1uAej4k86eQL?rXXeZ#jGPt&H zHR%hTNPal%^^k3zNewEB9K=6|i2Zh%+U1})n|EknKH}rIohjMZi2#f?EKxJL%)GJ} zbXDQM<1Fz_A|u%&fuuyxEAtBgtXM#Q@f z4+Q8qtZ5c^YHdxuAn+jJto%+-+IPOr35;CTtO_@X+!zVe`H)z%pPtk3PFrsERzw zr~}nA`Fw&HY8%g0;RYGHaCek5;l0r&vC3KNi*?>>qBD|(5mu0EYp=RrUp|TGDfoCI za62_qUDT6}&QgH-U2MIj8^gWfmuBrx^#; zWtS!1w;RcFxos5O`!HDvfIn5vkfFATS--)@x+Cd*xzKKyYMelJHZ!F`+!ajZ?d1er zubh-UcXZ*>imIfmA8&rXG8ilRS`X<=T?~yQ1e9VK-m|^i0Ab%%YoZ$Od z@dt5Nyl%nO#9HxIwOprndHV2MqoZ8B*JS8z!i2Jl&6;Znu+nOqcpyz6TN{t^d$d&t zWvRaN7tnoa&Ff&`c^%rtW~Rw8P7#Ci+pr$HWUxagXczOr>S4hq5z1dsxx(_{HTugV zXjoia^&mIwGbcU<~Ap7cGwITV*?RV*ipvNR(i{MS;YBzr)p!s_Y z;(E^itdl_!WDL!^HNVGDg!#Qb(of>%U(3U>a-9=>RA8^u);2-zx z5FpG%aHRZuVYkfdzyEjm&~xX1iOAvo>(fOMMAtKvR|3hl|1YfnuRpv5B_R2vX7~4} z{~!MXM4e}doc)Y%0P`QH_`f-g6-;;#=MplCpuZu#^Z)ggV!s$5ES!$WF%YBh$r=LJ z#RF0D20$H2hX4{W947;7c5z{`E6$kdZX%hs%)c`c{|uQ|8rfRS8bgV`^#+(WaITm^ z&t`roA8vsD!^%c4=^5yhKx7{$i6`(G5!e(>0TyWGf06v#)*jFX+kn5yMt_m~uK^+x z^naLv4N{bUupu9zYY>CsWxHhp)iz-^?L0L}c94?zL_u)M(gpWX1!NPo`~ z1tMgj*j}+*lSsit`G>G@`5PTpd2iyONhN`cTL!@4M4a0c$aWV&`q6DKr~Gdp^Uoi= z;>goCNDoE&BB@K_lW`OrHp8QxWn<{-W~>+yG2aHxz1dc};iVW~&d0jzN^iZLb-+!S|7H zuh&!C<8YxHlzoeG6#xYYZmk2I!Jq85^^%#&YxDY7rHd;7oWz0 z9zQW7R7{q_FL!UpA?FjAp1AX85(S*PeoNKcu!q)$^AgCxa)Cowcy@Z6pu`k$KN9mT zqU!;pl1n1V=x<&3G(flCI?8P)hApF{r4K)IQW`VNO5)}fJ@g$1cakx*(-h>f9%d^B z0xceFZo>9LvFS7p_2xsh^FQKF2~hs9 zB>Pklc7S<)sNhnd*f~clum?F)JU}`;Gn6vRpmu}VeK3SZcsxZ~llj-Wy(iB@7eh{iQpDr$sR8lw5lj`wnVxj@-;2q> z9TCW12^1h%$xxpV&Nbc@!N=bX5pDyh8M2r=RUwa{5dnXKZJ9P6$t7!xJR_OEbRZD& z{*66N8Aieo-?tTIOewlPNP%RjQbWr=6DocpjJ+iSAZQpdtBe&|f@ISgP=~yTY;+8! znBiA^>bi{jT|x?*gS$8x$T6PyctHM#DtIt(ch@IIcKxEqUkQ-ExwA7VtfS6ghh1 zC_#_K2?$t8h%bHgO7Uh+c_^!@ZZqN^RFfL$O}}R?y=Hh{3XLOBA<8aIUN$J)zOM7E zCnm1F>uQ|9QWw>fP_IDy+S<_sYn(~h?h>q!mVW|b0e^&`RNEf^$3 zw|0NuNFt0N>-WG%^nN!H$eDP1&7gBj9KKV&`(fNT1VTaa#0X&Dek{q^c1f(2t6ppEN!()ODHm1H znJ+}1?>J}r0{(2nARk>m6SRCXDfa?3$h#iU7UuPd@|b~i#o)PH+|DcNE|6m{d{Guf zGSu4+G0^|Ph)dx*5+Q_k2k*&uJ^HKIl4g5F_WIkh-@p9(nzq`dD;s78sk_!J2_)3h{?N=YGN6XpNp*a~F|- z#nO>-BY0XNn(aEWhnURorD_(N-Ejf)qv=GMts@{eZBVGs!!0pixPYL|*@8|4%}<+u z>E-G0E%-RLP~82JY6F+vC6aZDAfYrN2IHz2%74C8`cN}fSS=cJlTjrIMiGSO$dW9zuv~2^kiLUc`)mq zw+0!prkP6yiTno@pGJK5wUGh?y46C^w+3quvq<`1?EhE|;t~{Ap1LOrQ7nwI)XtGC z(?Cn6MLT>ajx;xJ33&|+en8R8Hunq{R`|L9e3?kRz%Et#{*eufn9j>_q2uM|&5Vvx zraSSU*uQ!luV?EOW0hKukZ3(Ks<7Dq@pS>ax@@|(#Q>N+C?TW6FrWWu?|13mBKg1 z*LwVV&Q&`*NP*jVyW;hKjWAqHl`usjk9oP+mJn0!oTA`IsuIwhp|Emly&JRbOA&Vj z_ds^zGBh43ZNI+1Kk4*}3Y7lbaJp20Zq)?bQSo(PY^;1ttf=xa{a$9n*#y!-Z5Q!S zqbOFY>ox~nZbrQlPROW$8U3*_U>x=aI{=hQ%x2zv7ByM}hd`RPEp{gmZQbxfg3QnC118rn$ zp>qMEWdHMzC63Dj>1t^*xL#`PZzXVt9~G)KZ7ChdB#5|I{vc)7c|UCK@wVb;?eTmd zLzshd!-t7)&B0%L_fjAf)GqG{?f>Trgf*$6jx0i!Et?qBBC&dzHD3vvnR>5OE8ihX zw(;BuPh$V(akw6d5$Q2v7-uQyN72D+GpZ8vh~I8fD`m9F|M}70dQR)+*~}`g$aG-? z?KtEZl*xX{^8fYla&#ZCR8phAd}-==E#`=_&>3@o>7?+g&qLtxEZccL+`5;pa9Ja$ zq0$y+`MP6r#k-?>Xv=|1kXU4>0`BFE5SDCq?W z`=67K{1zz=m@287w-U#&u}t2I!BK*yX|>^E=ALa@L!c@5Ut1I=C|nFyJ?d4Z|Bg6+ zzvDFzLs0DTH~){{`v3h&=LNqymR#(Ahk$?HX-6g|5x4ihH{IXwh@qTk86*t<xc%|o z`WBr1$BRbv|GD}98pk{Z48ze@#xYkEIVd0qc0hhi2YVK8vI^#1t0RV!6WagfcO?pZ zDW3#Zf)#ehpc9w^iA54PlY%;iMl1($J)9IW*Pkeo*&X@~>95A&em zTmFZiG4nvRl~iQd;9bAV!|>-(5?_W73kq_hDRBjCTOnD*eI7Q@Yp)9!{wt3z`BAWq z-i6y8A8Z|VuofVjRkF09>kn%S*&W2l?!aDg=`*WvTo@FDocT!vNRG7NI3dX%5hu1v zWic`P&!gzC32!5S`Ce#~BG$Z_Lf146M&zU-dA0@w^*I4`!a#vR-Fp}45<_Y^nE86J zz`$U!H<=S2E*f}MS+(nf+4l=L7!{*KvYZaL7IZk6HqS($Ipv+co_IcMlev~q4{hE& zv+j6rF$~uG`H}3pWpeOlsi-{82I`-uMT$<$PY2cFQ0qO2n7j(Qn%oY zxkim1dEdTz(_d_p4{C}-ILzI*%PjgO5IQqUucFA+19qiV{~r7#Ot=agp!aGARn&5H zgE$MV6?lr@?)`#ir<`|7Yea4sQZaCCD+ABjjAE>8l-K(G|W498Iwm}6a-y5Xw z1I5)DkSGwgJ|Zllmslz^YI?7prDlb;2lZLb!bHC;ZQfyyde%ElQx8><*%(~+CUjb> zLKekz73-nwD5RrUkx>&moS+dlUn}`iMYW=zBN>e^7STL3TNvI(T(*o}Q1v(=z?(`Y8h?YA1q&l7HjX`O4yQe%r!>%7gT6^l#G zEd|vt6QX-5FyPUuy25geU#qa;Y5ddG@zNZ`(H|d)>qo&-30}hzcCEOt(1&4a5p~!R z;y@(C8eR4+e%oYZC> z0d++OxY)w0Y3#b#rT(~-9Z(s4P`vqZji`gC3YYAL7?S*z-a5hk$qR_$RyIK)+M(qjxjm@DHQs5&-ZJ_2mi?z+h19GWNF&;D|@B7<#wqZAF>mco++pPdqV%O{9bG`>by=S`Et+x zdJCm}Bw!Yb5Kf0AY*z-eyaQvCVTwW+?^iw&IoW7>7^%h$Vn7#2joz4*pFal)-BnnY z74{-*=~A9Wrm6li&-Z_@BNsm_&3Hk&Zap{v+?nDfrSsyX1Gb<(*TCVs(WItg60su}+y@*un5p#$+Ne1`#i zMk2OC(4eOI9Ko5m0QHs1!Z=hZ@i+P)$aOwyrT$RcO9MOHcY6wTRnivpp(vhao0>){ zT5$_;I#(e>!xr87Xi(?jmD}WxPs?GZor8Y&#bp}$n8uE-g12hv3R(67%>76P-Y?aE zow@fCA924}P3>s4@%*3iZ#aUlGQi|y|I29%`+ma9Zs0jwn`ZLHZ<$X$PxN|An{zD}b;daqmrM zv7^=iR|>Dlqf?AQV<86M?%sFB^C@zCnn4+>bk2#+ z(a4GBpl&8qw^=5(+Boxzf!be>q5vH$r?RNRmV@3s`p!0^ZUJ5R`b4)TM`=hQXj z|CF#JY1{v=KB8`g4lgyeDx@vuFH|549Br59M;xbj`sCs+7FKm&L+=$eG)0 zk%W2g#H8jaoWcn+KS4UGoLL3JL$wcgsgWG?h|z~{7_P=4+G@T=Cnp9TkM~d3$JO%n z1hgw3XLSKcq?xNlkgOrv)R-&bhh1d%RZzRmqb4JYT~|}5)QS-)Ee^MrI=kX{h&nV2 z^dA7kLmq)wXLfe7t*jKkFFBO0kq*h@cubydxdNn8CV+pDQZb}7Kn$!I+a2BOO?q*e zYULAPKBe~j)UF|y8wd*d>?UIsC8AKz{sc&DGC{=NOfq=-7&3I|PbMHeUTS@918Wb0 zTh&sE6lj@O)l(Ok;xDv5GHHLqh(Jm0ps!vPUZA0U+$ZkX%{P)s-*bl-1CqE1&bkvd zyP93iu_Dvp{YV5Vbc8mO?a&M9D##OkCqdpdP-d$O?>(4wgRUxmd+m2_U_h(D_%$fY zr>@E`Nh0X&8}M+*fe~#1c$;Xz@7XhiR@|T`(SvldyL*3a?15Ofb`b=CgL^SKg+oO+ zbxPz~!l+qkJq}WH*pxJ*m;bnX59Og+K1nPWtMM-#0r5W_;`tcNxv$(=AHM>go7YH@ zDB5&$G*dOr1jeP7QwmUdR`QKVzvgkcpz=C`GXQPEl-dn>NE;;csKcfJ&XGjE1vqgq zTSE~~XhV#B`lGR|cGVMGCG8xQW5|zos7_KLa4EtT`%v3qxQ@Hq6q=#(iXi+nX(`eTNZLUsw(IGNJBr3oZy&EoJt3!{TwBnOF-^w4cC=m@-p;gleh=>(m6u4Xc;v z!TeS0aDES@$>M8#wjC{OU|OAG8BFo@d55iOgY?l#z%a#!TasgW_vg>3m11v*hjV61 z;5I|cyGKauF?<3<~M=#Jz+aBgQhNxu?g+J`&*kW~L! zD$BSEM_>V;Zn*|r90!dJE)|~)F3OkV=cxFI-ee}vtK-oXjjk)R`>KPqUZ{X%!`87& zBvYbW7gOXLP$MZ$D2gIB8x!a_0?Z>|q&ZuDqhn7_^XDLi0YPfZI7w}93km{tYhEqa z28A`?pJM<|z3(2|e9ReKfEjJL@fyAL6q*G@1Hy@+wu7`+siY$Al%D;-)@63tDuLft zEuDz?j!}6bHXoa|bn@KIi5SZ-8SQ{gQhDl#%Bp6%ur>~8Gv9{w`>gbPlfXen6^OP_ z*B$?ONVRbyp=`wMaF3*CgTT)b_Nyc06rBK;%p~-35_A%$UYdXr?(#-oZG6507N-F* z)WA>6)^V`~Yka&^n|OKir}!i4v<;I|1K_6bY@mz(E9LDXd9 zz(s^p!FlKGKb9+j>xGGqM@5#AnQ${#!WNoRc++8TQsy=r4h5v(fJOb4XkKy}Genb| zjBPKucYz#1xE*)2wi_z#fqRc{`E&MjD2s%)gyIt6maRKbOcS83^4I`Y^MR!{MKAc( zXk4xYoAPJww(f+RIlIv}gRY&F0UUl8>1s{RZ=+Sj;`XIDRi#)V9}cwilC4IyUWme( z$^ttA9=Degod%zd&$maUd!C(ce%LLx&4D}*!KJ5#x)=!4-aNK6dkyc*ewH+Yb|zb&u?(L#E5$?~?h&FE-uE|MV>=)~&@nK8fda zCJ{iS*2L|ySDUHTs!~UeMJ{(7FqZ(be;nc$Z+tSwnAf|wl(bL%H$V2Ta{4d2Eal?- zhl_m@-Eu#|N{q0Wspc5ynaiLwG(gxcZ73T!-Xcgr{n>p;ulRzNAlGYVeut_^KX>y$ z*9T1t@Ux-kxUa>b-C?R1ZeiB|a~5yk`P`;zU4FJfKwH=W&gbrgIcNub$+^y=pB|Un zaH5#RN-GYUm|~O3%2)WX(_QE`(lGV3azr0l;K+yOSjGrhU?ptmMWE6H0n5dbK6s zbx0#jp#-70Xaqpwq90(RCXk;Sr&}H9^IJ0eu z>;BtW(IMl{5yzdlHgh+mCN~puJLNvEMN$3inL)%Oo?-f zxe)CbR7_OV5fMht5a|k%>giaeCN+*4nxeA`*c58&7Mq1mhWse|`` ze*&t?gqz>b=YH#B;+Im}MYqP(!Px#oigpfbo)bAlp8go!K8O14veo&Z8#sR&;W@1L zS0R~G5E6>}iPS;+V8lzA=)n^N*(>AOmYE@DC~(HgL&yEIZI z&=3WJDJ=aWo3Wz6(n76AboHzJ#oF`E3FM;DVKOg9YnwyfnsxI5RZn~Oq8+P9s(=6JPOOZ0%0bVb1cYZ8L7;h*i|*mN{*=)3nseEyhd!zPQEE_SB75ub{031CmNHI)%>dx zx5Ml3uV0({+Dt6Vfh>BnK01hURuI;oi$tv1BUjq_P6CFT>12uJ7kcAK5I3w}SUduF z+#!TfQ^Ei=R_QKqW*quDNjKXey$BGzxRv?bTi`$ae%yynos*9|4;Ny*It(Cm>tx8j zqVd`??^uNV{>vT+EL7PhIwO@;qn4a0e~|}{*gk&JK3`M#lc@dZ_3Co9U0UZs>;7Pu2YRP@3JR2(nn~?@yYhWO0tAD+(uYIvMV7!33SU zx2^IER+((|uJV)J(=Tthb=W=zgE$IJuR$*di)=iEa28W~4Rw&-z{s4QXm+&4|ZXZ3l9uTA(HD1_7)$01eARS?ix zM7tg!1exA2H-LdSdQ28yHxIFYk0+SczSeEgnR0y!#zRs5cm%Cr!cfoUEBYKUr~T~? zXG&2!k1!_Ac^NxUNQj*yr+a@c9Q#C?CqkrN&=guO$yF)k0^t%5n3@{aT$X-KC8Eb& z0?(LZp$VR1QAad;LU`|l@*Jz;>b6czSsWz;`?i6I@|#J3?W*~0AZwn|JpX>>tgtGi6YfIxfM(4!g(?bJp!N zdZ>nt>&I?xR))I!2R;|xs9bQi{z+bKXIyaIWBT;Wd^mHTlvQ_hX<|RG{HIV@4S$=D z5Xe%zs9vAHD;1_BH4`&-aHP@yE=#aE1j)dMXJA5 z@8j1dBB=d+?T4MCzd&`Cet5k9v%uvCY}e8^o5PQQ6sWQtb5z||$wqh{E_W&2!j(ht z=B`pXwq4<})lPp|F4`Wp8BQ`?&`4ttx%aMT8gSlBs#GP*>Drncn-aH_(anyRF}RU= zDw<=}qmvXUZ_7v$3Afc*rCn zYCZO!?py)i@RkBVf0@*(m230)SfyBxZhwkv!nlom#fPvnLwfxK`>S729cJ%7%$?eK z+`3V^2Sn3trb2IHZvrW`%vn?1kxMOTjHZ?Rk30@GX5;IiZ1&ok5L~Ze8gb9`Bd0Bx z7&Q;f9Jx?1;egGjU;fdNbg%aFDt|Qm2Q8Yt+nrUM**_-$d$^6)TXzNi1-oOC=b^GcrJr+U4L7ir{(PpY(8;fP2)S)AeAzn z99#1Y`D=SFICrk{SB-EKOnAC%9Y;@>LmP=mUAqeD}v=0 z2Owy}Jqa+ym^$^h#WzjsNiO}2^5wvzejI06Mm(Z$r=KI$4Vu+IjP`3hx~OTz93aX@ zxf|AfwCBxuIoj=cul7=Xpu=*goh7k`4ry+GIISbz(qSg;?wDZin(-LxKy@_7flZ`{ z<i7PMyTQembKbPRTNy=$aW~D-F2;_fixkHbx0%x zEvB5N>&j`hC7KIWY0ZtfIhe%g5!)xp$x3f1sjr^%=T@&`xTBplOTIj8QM)7*(VeUT{h&Up z(F=Vty0~%Q{BStuelK;*&96!2PQH%%eiSP{YgfK1-_7+gOuVTXX6LGzy7)j}z;RwK zueC~Qkb|MLUw7`ZRg2)A7{OQ6w}-i+pXzvuGY>ZIeQ_-Q<+nxA$#45STi9*52E@*l zpU1VjDoo$842BG4JBAvdB;?{75#McJXv(wLr#oyErD(yRbpR$g&}4z|_uLc?U~iM2 z5k_C{y|Hb6*$UKT=|8Krb2!_)-`;1|;KC?uEVi5yK5?57I<3a$V|KF2eDue-BrWP7>JW5a!YNBV0}rl!0weenW^%t2G1!)K@eAafw*A#?^@;Bf1`Y=`GQ(n;zI-AB{VCxS}q-;JX^B zv)M0~#xj^&L_8wrmJp|--!eivUtAhnycKElGqjB2y?&igTv)F@snJiOYCD&&Ixh3h zl&1obBkXnd>$^nr74?hVyFYa&lz%i$6SakOA?Fx<Dz3OzAG^^)^bEx>tqyz0Q|V5m)hlWf@eWL%F#QCs?0bxOGCWPI9_h=9QlS zp1dmxJG_qhR|J|HN8u4&y^+vbb<>NUS2X{g)``nmZh9P6>`Vs6M;g8c%96VW4cldY z#%+x6UOhisX>1FP1lb}N$oCNtkb{sO0)pH_mMAh8-lu(IgTJ%TbS`3OX}SV zu2>fx4+1M5G-Zqe_wrif$JTU zmdw*15z{#B{x-jtO!WD?Vg$-Ba>UwXMAt4bM&40zpmTg!?cG!c-JDv#3$P`Z^o*|y ztf|s;2t@AdQdrO~`qaujU+r1kguW1I?!M0IMT~wHy)1+Ayq1K4E~A^X_ZJ}n;Mt(n zr>miAEQ@JBkygzdGxZ9;F4{Z_Ew1vmFLBxzVisf5GP~Cpm$g0_TTBu6ncN=p;0lnY zGeO-73rzlgubRjMbyuu1l+NrpK)A)G0An>6cUkq=a@7u`(Vea6nuSXzd(Tu~yqoxm z?=jlv$u?cKgb!eUOqPMW9I(nM(c3sy-|n|enS1LidN|KJ>L4lk+wU8dwvl@jbI!UO zz46s{((Lnx?yPsY{d7b;rWd!KG9GJg?DKIm8Fz^3w~6UL=3Z}N@mrsESsO?Xt|en= zBw)L@Vdy9K%EK+!8?{qBRVcXk3y?AFuLNhF(x1AGlC~dgjU8QNL_G>Lwey%OTt^aw zc>MEtHagkvMz1(+T;sY7h@sdR)bV>Wg3`@hqDaa`I<>9kXmPnpE81pzLYVl0<`~vt z>9Xo&jdr#NDx8Vm(>$MCcdC|H4`R*l+x9pww6+dHwADEsd{_I=@esMk;{PjT?5ERZ~43gH7FL)Iq9gD}lB^`t{B5^IMJC7AFUr zM{hz&ZM6zNj}YuhbJx1X_Ws5%m(0mcsmEVY@Uf)6n&Qv(UW7z`Kd&``wAD|bmU-Qj z+f$X;>iZn1Akw(c59?3sX?d(fkrqhcE`W(CZDEGU8cOg-OIX`3U+&yo7C5+s)Vr=d zJ@>T?u7l!h%HYG55v1$Q1kKSHh`ZKth}||`2JoKDRyM|}qI-_1XQq1GruB$^RE96U z2Vb>ej%v!=a+$YYHkNdR?pIH#kWmZio=5|18Ecj)Z{Lx1DO`TS9i18Hgo7>!69!Bt zwRiHNyo*wvF5e5d=O+3JZ0qg*XALR)WQ&T`t>IX4h>gI5yYR~yV?1^FH;EY#dPXpW z-D;!`+Z1O&XeLot{19)c5K-nwRI(rkx(3bTDoa33cm^f_IzVdjV&&qW=Yuw8>fJ;A zs|!%)5~WoWr8xu(#H{1XTxT|mOJXyq)jKXSX(!Cm%!?<>xss)t=5I4y`yj;mHR5Tr z{K7Q;o{TXx2`JiW)7eHpkXMoXveExx0;*mvQyeEZi(3k=s!P2>DjiS_WD9kv4aGj1 zyD-pIkoqv%@uh0nrzN;Tij#|z{UNcEAZhF|_GK11Ac9OlDJ4kS@=a;U3N9wF6PTk^ z3XxD)1)#|%Hb7Fl!ZE$XYDj^C-zIY_K;Xvk8$0r@%Zpv8`YIKlv5Kp;z=(2#%cF0y zLPlV_?|O@PEt#n8L;bD=XloV?(zx-l6@iM;^UWkM)ICA*oL_KRey!Q2C zjnh;jDD6IpFN`z)Lb=SRAjPF{2i&k>u?7tnq8btr0v2He58>)m6u9zS$*83jl2-PD ziOEluE?-Y?eGFGV}fK zRlCyuLNZy4bXpQXzEM+VaZZp}74G@$(u{8#8y!d6*|++iBVXPc-*&JFdqOZYlJSW4 zr0Pb8yZ4CgJ2ZI~9KN=+C|i96VXE!YW^Ajxnc=je&RXH@a+2oq1n}lj2wI#^SyRa6$&WjPwQHaRrpdO6 zeZt+2gGNeYLcoQ~9V7ohypsY)#of?cM$&5st?5%q5rTP>0{?pV^{ar$h`S0XyI%*cAEf%4JIDeGzb-nku@V{kc_!^Q_bP z6L8zl@>4#KkoQW&Axhz_6>1P9$lK1%nx1=QU_+oU)|N0rWm<25UbseBCxK6PBc=W) zJ3^~3lmmcNkP{#zDrKZGFuCkew5fJedy^F3(WiTfliGA zi0TnKZ0n)@mZH&-V#cOZQ+zT4)&=dy8f^nZ*8n4E21`#D8V|-W2-{>)s_nKP4UaBS zzZDbFD+m5>giZ+%17g&xV&{nM{sOxzq=9{yjK|;e|98sD5QC`@92G%W?--#YTyX4+ zk$T2@eNlZX0P*wu2x;l+F?##o)hu4rAunD!aGF(oxP_wL?~wZ$NgXRnPC8;QS`re3Vf9!DAyN& zYmb6hWCmlvVC>6OWk9I1T%A%Di`Ug1q>tSIK0^W&=lUq{p;yB-s%k*ah`3yiRrdkw ze0!1X1|5^F?Aav~n%@o?;7SQqu5|r^k!2|;Z1gTZ0e!VRfSUuFhae#aLyhjhVllb* zR4<}~y#K&CO6YJtVheQZ|}ImjAXaw3uU^2nozqvJ-}yFvv3OQwA7u5bJeMNlM&b5scf=Y`n2k`M>d=Do z%dEv$5gue8BNCU7&Wyxe{l3g2wqbaFU+MqhbOPmInFh|-d{pP8=f~e4W4!VByGldw zIsE}}MZEpm;gnK#W3CDu81rydm(s*4A{c_6q4SHkL4lbLqR}IAPW4P5Y(COgG^lSe z98TsVlpo@>x;J*tF}xC@hod{}HqrVV+?BurV33mTCukjk(%F=v8-9#ixRRLm11KBonc=4&h{o@f;v3MA+ijTJQJuflMm5u6LUY-R-U)$OfUi_Ln%DUr$hTh%ZNPGnp9E5z-8g`Shb6jTXcQ$J@;3p#;1l+yufxwHG@R84I12D*k`wC zv2nzjc*3#p>Ya+u(06eR>c|@xPoAME>Yd!UR98)w&taJA@1znfjt3kP3vvU7lJLPr z9E-#NrG+X9_7!K!3x2f!Vk(2s&bNkmdlHbxk`kChGor9fd1-$Fa{nmNZMvMUZpYw< z?Lu7#Arg1A5oP>q?bsN{ygA?i!t`WE1-b%G#FrYF2P0{JTmWG8F-p?~yj%6c_`_&i zPmH}XZOJ;DLROTYit=zahN(^pE-s95Df(Y1_2ULcOm+c13VRJ>*%ki6}ksHj`6nt9zm%|y9lLMzjfCN2Cnr}ycyJi%JI3D`=DyLR4Yp@J?K>JqNuV1MJQZc z#j!&`>Bh@vIUx0=&#nk}&ZmxKa39uxwqFlO72J!{XbU--xCssh&fh<%hQ6g?Ww${S zQu=9w1l=H{*RHUoUJIzP71V1-hN!`zHg=$2BuXPzEdzz}{Z;G|{Lc3v&tFb9a22mG z;TEw@HKX~l0LJx=RhjXUOcE>c*87tSUDm1ojGD=3(_1o}2hi{JP63xzA$hZRQnpTM zb_Z9qNk-AA*U7A)d=$Ro^Vb+#H^8)R|E0E7^`|*JY&3Koly^^VP-AaHwm6m$< zmZ53k{haq8&&=^lyVE-?f*r%W9dIhczC>+JCLk$rEIeC-Uyoe|IW&r>^Nf}In=78g zIDC=Y6R-&ThCyeR(pmFsOACi@lJ>`^IXo9IF3p2^voE)B&>gf_3w39|3PirlXfxbr z8{AL|SiMvj;_aNw=ZUd^pG`PAE?OvTZ5j{1BKd}+L6U~8>Jv2a-Vw)7UPt$2e&*tj z&sb2ri3qwkimY-&c2b8H%Uy-qz({fbmqn@&|GY4?)Ywhk2h08-qp@78R{uUIgl5z1 zzH>&eJ-f*q1wE8xyo}x0ZWdFzvCbM1;eXl0%d{0uz34-afx8?^u-pqqDteIed-GZIGB7EK(C9Y*saxvoi2bFy=c6?BIgs!Rq-!(1Cr$yN!nz^-@lYyT69DA%Zx~K9~ zb+R|tarkx_oyg$39@oLc?LGWfl|^@G1eM+8E6P{JD=1#isXyvvy&y!BR!Mcz7oz@`vdDLaPy*` z5;=)OmP?@}er5UV2KB3jL!`yK8_2|dWGU5tP?aA&bfVm&nrYQQC5kW9TeSbD7XWnQ zz7`emuk%70(X{gJ7zy)17Xo)o|6LL{;)d(x+T-c{#VOAkgC(jZa7i?tZTMZrj9*_< z-JP7pq^+~^VU5InE9k7oDk$ZPT(bW4A=$Q30QI7WKPQP)l8+<3zKcJzw?`dEmEQ%L z`XD?f!{{xmtNoxvm0Ln#+u(j-P-N7w^g#uulQClRvY!MnFu4+WpE|U`>zjXFs_Cz`^VccqE)_d1QD@ayK)gkkmC$bnj4q+7Qj=A;=zxzuI z2JyEOrK1=k{0d_;OORRHmYVx9y+LutrHZH~64}0Pa;&u~N2W~Bz3N0pT zhs~1(6ARmWcs=QAy4U5h(;yTp(89vO^i}A@l03~ONWQ!a;#Y41hV*{5>SK#|m+wQo zC1_`IWcWw+ofOUS8F7q!cJVG2BfM#Yjv)&P31Qr1oCB(_RK=PTi+_C`>!Y2B%Czs&Nz9jhLxg>4k5348PCpW0X2x5Naw7 z)Ty85&y3(0dkH-|o_$JXiUa`%Tp!xg5H$Y|p?R9^^V4E`M_il^VJ@$Ojcka;bb3%P z2g;YPg)+t_m5*fJc{NQ5GCRd3N%oar7uVxr3~evW@phO@pSJ9GdbHFuyK)Af*=&!w z6AMVbjV{F+pP3LfzMg4}+y>Nj$h@9fAnh*76C_UE3$Q3P4^3zP51zQEg9M@mo5{Af zm-h~6{7y{1ZF4=KyhR(SICvPW!;zh6q;xQaaog=0)GR$*qTJ100!g^lmV37^)^@*f zzd8Ezl?`+>`^oEO{;psnDsbrn6(x@Ddcn)n|BtZm4#cv5-!3C7dz2NCkr}f0jL4|S z%E-!=kxjO2Wh7gP>^-u#5S5j^cL>?>yyw-kzR&u-e>S-9`?^2lJdg7jZ&P`8(*rFJ ze@+*dJSVSdRE%OA#Pf(Rw%MUszS49EqYU$REc_a9m=eM5Jy~IAmFHL9XYkakLtMCh zX=$n1Tc6f}JL{+9PB`!U*CJGv!yL| zmV&gNZ+ae!_a5i>v*}~)HX74>1LkS%O+EpZ)w4MCoW^}TEsd>?G5+(M0UdVTG#?^EoT+0I_iI^ z1z(0Lmt!(hkG%lQp4%tX;H!W&S7bd}eKSinR7fmWm9@Zr5e9@G&Mx+A$_kpkz1K{2 zF&8zN->4cux90KbOcKtPgV1|jW7Va{wAkg@`#fWT#Ydm(GsL$-Bomn^kF)IqE7l`P z+k@_)SQ=$!o^;f8kNu)F%DQ^2MbM`9W+x?Fu-xfI=BW?{Fzh{=e|!-c`GPUy`#7Ul zKgK?xll;hn)S{{b4eP4`sfE}6>w_{Y)`5@u9zhg1oEYL{X`;trG3)^^wI*|R+ano9 z%nDJ!^zcwL2rahZ+El;VB4<5Kdz-(oo)Niz+OUep*pHt5D}S&wU&r{wFgY)Cu0svJ zf_mNyeV3T-m^E+Tknr#;XNf$&qL^nl42qY+@graCXh@rVc1w+ergtkNVtEBmpLvtX+*^1{kf5=ts_7APpH*7asXgjEM06I$VYwseC?TQ&u zyqy32K5%Ko#<|4yzT-O>#R*m4EC#0%LDLcA9ubN6=PZdkUuxYZaoB*KcGyw#g6mTE zra&;%=_frEX8D%1mVEiNduj{kJ$;=FTvyv*Gb>&x{Uf%bTujyq0Nz` zIfSyYL_6YaQ89|$jBYKP+`zoR9nJH7kY(W8$&<}&$2=H!PMN%~r_5V$gNg6g6BI(@ zEkB=i+X@m3O$LI+zT-S#%LHXpA+kzk@SGv?>M8QPRgS+S8t&HItM4(^o|TKLXhM9z zxPTwAwQ!KIDezl0EkVw#NuGw!OK97rQkSMA zdE+olNK6-}iZLWNi9FzCBNHuO19Pg}`&Uiu(@GRgLOmt?n~u4uk_SxR&#_$_Vq@|9 z#*Rs25nK{)fisJoiaixLL9>uCGbr!-E&Q&k&RxOM6Q9kSrD(TLa7WykHwH0tP*UTn zre^CcD}U}M@{Nv*iE4VC0LFZcda#$!>#k%%?sct8l&g#SWTVmfrlhrGRoZ&?&V@`} zM*G0}QP)-xqxybpx%4;t^l02dkf7~RO0Rkbf`SFQbWDfl!rDV`=klZ5p5}}Y0J{CmX9?4Yu=JYHt$u)S;zQ~~1^;<5_YIEvS zwv{(yJ8$9id9s#yUo~GOLb%x33gjU)TSOoQtZU3GLq~A84-Qj z*`)UbcR=#IP+VARfWZ*^~o&>v^}#vfaX**J!JBWtplQMiK4!tPZRTcldHc`~|TdLZ8|659^6 z%fVaKFW7N-^9Y`#mZo_ZecQHgbij&JYwlw&xV%Z@ancm|k{^Kj7n|lWxWe9B>svfi zDhL$&^Q?<1<&G+)Ry@3R=OPOF0?DNkrFr?OdV|9_Ps|+{q_^mZ40JTqj(D|badx$H zE|n;krpJ`J`hD#eogNF4E2PQI4#5);yD_z8K=s;oQe@@GJU-3kc!fQ3t_Z(mYoXt> z046QMg^buQHZSHoSQoTBMZ)I0npjF+Jr>Ly;go)BEWaq*gIV#>NFve+dIF0eVY*mLC8wtjZ|wyR^2qTmj< zK2C-}m*XV+u+`W6+fB#PxA|7X3+XX0#5@)9R_ijMGh5Czxv&|3-RtX~0|)bfm45B9 z)zty+t@Oop{D@+z3$@(hqA+-@vD`Ir6`OVR0Fjillvv?|re81BDZ}=7u$MrQkl;&;kwnwB)vxVP>$m{4pK{Uf)z=o- zf~7vNus4m^UX8x@G_bRzGhVrAB{}i8l13RYaa~#coa|yg?*UK79h{mUDq7LGp4^e30&9W8Iy^`4bfi5$vP(!H!F6oI>HOj2gw(`sP%6Ua4-`) zoo2*z%k+L6F2YWjEl>?j-Ldj)k3_H1pH9IhSJJS3vAM#$b76|ZYgzgXy2zd8431L~ z@tymDe;BdJGNQ^3+3AT8Xa=-_9`b<)Il0+P!EG#j{VnWDG0&rAX>t$RrW?;l?LprH`aAXd3@0Tv z?|}7*P1A*lDIz{*QWb$2G>nrH&n8&K!IdHr`M&3Fa()XFPyJfz*>na&v*=29kfV&Q zj2IjB4vQ$4xMqQ|s~f2W^M%;ZN=~Gj;UR{bEyk3T+r`{(wsnkV^HI#!$d>;u@b&we zV@izy73F_ojTFJ|=o!myu5OWpbsxH@_5iTG{keA1UZ7$JqwW3=!A&z(PD5Djc-@12 zL_>@3+r>hXT*ulx@x=qDj{Tj z5i4tD)^Dv%dk-#LZMA7nAKm2yx2jLek-_6;F*>v0IDXWlSn&dbo2%hU7r2VFilDs* zF;ym@RKD5X5pxgAc;>DMr@O{*b<>r709yYIdX*2ro9)4QF4w_5r2hF=A#1+Qkch6i zzv`=R(J+~Ls~0Rg0aqaQm*}4NK{3r=;~s_?w#aZx+;+4~A?%flBwCp< zW!1&D>=e1zeefTjVrkMU#<4}WgOCmh!N{8c>Y7#wp5 zDEY|i7jYM{P4?gm9G!m<*XtIv<{q{w zbd4>CIki5S`>9KXB${1k*5Q_FspKW4Cuc+>8iLw}{oGTFqas!Cc1M_pcN1{?9D~0; z-4vb^RuAKC5M!N5XxBXH@YrwTCx9}`qy_FS_vJ`_B38OG=Y9&htrtFQyTn@@N}d_j7Q6WlRUiZI%^N zNDMB_db~|D=7F>{g^C$je35Y8lzP=K9xkq24S{2k8)7{N+(4f?*HRY59dOkQy6bh$ zy{dC|`A90_5z50j9~_eTw|u&ss$R658-nlolAsuRw%~`-ldCFS51nibZ(J5P3`=}w zCvzP;s(rsS_tsS6tG<{M3$+IE(u2I!+APn=mWq2X>=(xjp9j-C{3eQOBEE=0S)cmT z+zu!)J2q>b#s&(^_s zeld*H!j!z~R5Q?w(PQ7W5=;}`gP#5Fqm^6x!gxob;U$Jkob{rerC1Lb;J6sP(>|)@ zT@=>W(f0@P7=S1_32HxVvwL1{L>&$xWkrei-+iLB_m<3zIaFWP&jy}ujrQf~OzJr4 zqA*`lr4n4uyDpbIa5kX}&%2ps>{^--5hOAvao-?)4}2$b7Bp*{ITP1i*HHA!LUC_~ z-EFXIc}LJ7)0Zkfr6W6PWEa5QI)t0s2Ampw(pW|T>Cf9E(?q5o3c^IQXlxvx82L1h zwbsNNSW39W8r+^|l0J5y^dk8#GEKp+n5|BTuSlZlNj6Wm>oruUFRrefz!00$d9_n) z^c{}-BuzfT6 zmsh5w>DHQHuT?QGr(E&}1Cu5@nDcj^0YVb)4e*b>$#>)G-U~ zAN;)Z{jc`b{_zaarJs0R?74Z>FV5ST015fNI!D`l)gu8d{G06I>~5^`xiH?>T_kj! zZ$dcY3sQW=@Eamb-@ZFy+BvdhTYjwNeX1u7+y}Lhz%YkPJI)yRsfyKVl^j{dATisld&&120=*i2KJ=X}$MzFi2)jQaK{$fSH+ zo|fh8!E;~RB(VLJ&OLw}RNjLdhV1bXqqc0KQr}3v6E~4nMN4p_Xi7zx?19t5P=oQ| z3uW*q_m+#~zw;da5b3cGp@CwJ0l}ZA?D#_H^soty&z{Ad z?vJ3vGL||ciHX>@)e{m*p!F8{9mRLOz909iKCu%Y1vBJ2(9c22rjO?1o2}Fx>1xFJ ztDf@ldEiQ{U)PzFj)bbGy;Md6jaqUaLUM_|-s43su4TR+l8ejo6UxJdyDk;eqEt7}0=$zWYS`!d~qf5U!I z{oZ@f7+pmqjcJA&Id>H%-PYLEvv2Y}&r(9|oG$a`32h6AAaS8Zl!y_4WShyNHv=u91|AW{_S1Z@(&89AuWp zh$$XSuCz^ilUCj|fYv}bF969bXEaN8iaSpurVIM@b#5$sRgfH#3qQ^)Sp#Bfo_>Rv zJlEpituK9&5GqRVEi7RfSkJ6z5IL)eSfk8?abYxAOwQk|49TO(RE&>78TQ!s0ZO7?&1c*daEZmbVXnLYlW&W~?z%ccn&0NY~lsaq%+yD31>%|&PkJjN8jxY8JeibwHfb`dGrpwI^cWVsWACJeHe zTiEP+8Ncr) z;9~(1YA(;@Z69JAnFJ1S+i)!5Dp#I;%w zW~}A5h&u_#p|qCfRY_Oy-xRORxhx&HOvK0EMD-QSoO7;y0U`5*amORH)9O8l?yO$U z2u19PV~{*4(Ns#&_&9OwSG>v8;rA;yPn?axO8ZTH>98`XU<>L zM5Np4>vZ=Qu&K*=hR4lk{`pEG@5&`fl(gkq7!NzTntl$utb(SNZ9>PHpnF4YfvrcR zbQJ(5Flb1XUjY#qIkarGof<%@e}sSaXRomsMTJTRM>+Z zpa=wCbx91IQm|RHn3pGcGK-5nPOEmsaN+GMQ7z!GzK8JB;Y7C1Qx`;OUjz|y}H+l@?xC0t)xNJn9QCm&{CJcR6Qm7K34H-4W2 z{_fHnAlJynzGaJHY@nw~{ff#yjIM>N_lu`Vqh`X&A-FwsB=Ha3i%=tId#xqNt-&9m zRwf{~GJ8>0LF&>g)qbIHsSo7f3GVR4FsN;wYe*5xykbLXUydu=I?*JD%i3*?m+Z#N zC7{a%}MZD&U0`IY27!VQQnE!vqjf$^w= zzxXQ><*pVT#*r-`jAiU1>>u+rE{#VvHH-rOMkM>@-B&E*SAG=yIw$)Bj6;y55@uBY z1lbp^`xzK*czRKrRdW&k^_1OgqWfSqDAZ2JIOD-$)4nRxU12%Qk)EWUojw6K5JQrR zy6u~#X6At~^tiFgX!;wgEG?ls&YQo~Vp)ANBDM)t903W4R z%3~!rBOH$rf2(wr3R}s2jdartVa5TIxNSjImo%F8?H*D5fGftBka^`0mbhWvuZg$n zI+v~2C%qE*!&J~-=@fXB!tEIM!fv;*Q4Z7s$1vpmTE6(|ql*FBB(4g>g~r2bB!Z#b z_>-sPI5G?8OFTL6CNyB=G#lpqJ^juWT{#p2#PEyJH+@z=9_b z&d=Fz=Q{ z=RKH|E($rob+9Jke~{OPcG^*tu+VG|JQ2&g{a}@PwLaKO?yma53qP6?D0Z~z1L!c( zew0msOXO+|PW|EZb9~A3(}{RZY(;gz@$;3BZy!|yItTx)?jiB8Cg!5+v~4fAj68D7 zC9#^jLi5?aI+3XNX7u{4FQH%1rA1~#n6+|ECeP{D!xwT8OMe#Ps=$93fk@O70v&0} zH1EvOSdFu7xCmAzK?eT=>F<)IuhkHjHm=jWyG=9J6rVWN@IuO9*GrPBfV-pJE4SuD z@fgQoY^0TU4-HYzmQ=tnxo>C#6rPK7;5Ae3ZhAH2qQ33t25)b~0rZXJBs3G`ra%(!7G{Xm)UbX zj;Mbif>~v73{$a}rtv-$tXEIMJTy@(cU<>}$ldwkJjgQf%aL?BXAil<%=5LUtO0%v^MsVNcATyQV1C(xo`C#+;KR zn~c%@Sw_`qLAby1%-*FZnKKn$8;7Eb|J)h#3Fqyax2>A7=g}QO^M6!w9$gEVbJV4; zmBsm?WJ?znhzlY@J02E5S;Ua^ z%C{|(SY6;w-MYxX%BLt*zF`HRORXD_<4}JwY3X>en@%Q|Zu-hjO0QYhGK&6S549hf zmK>$@`v(-#?}|11AHIE|g2sz^$N6I|Ixu0~sAXeIvv&-%5*R93YNpq5TMheyMvzg& z+BQxg(VI()3;XW|*gj%=YyHWMFAl zOg4{$S6kCtpzhAahUyOt-#y{4A1zDLqIi2O!%fXx(AI2?E)% z*C&@CN5wC*V9T>*Nr}V)k9EB0>HeC5X1;z>+%GCST7hSET$m-+dGKoIlQ`v>bo!RN~$^K1GE{3)$R(0 z3gO4SRnMkdeRB(^CMY0%LA$~0q-b%wFqWGX`s^4YN(3@W$Za(BN^*rIX;#!QwKTKcM~_d@Irm zb|-y01GqO0Vw4|{*l;ajAE8nm(&xN&eH#x8(7d5ozwBZ3I8@uCB2?2f9^aZ)uZbzC zqKr8Uyxi>1iu98Ci87lv`ho*Kvx*F_jK7jhS5GDTO;wbzPt3Jw+X0Puh&%zzdpds{ z?zCx&nt#JC^;Zr1rQY8F_XS1|2A>hvRiv`JL}`*;3rZokAAo6fL(QAsk#H*gS_dt> zC=vJQjNraaXDRrE-s+Ok`*kG@xE2}lV>^ZygjDl{JW8apu#I_R4^lkDlH&SD8Bp1c z0i~kNLeKpm-PkfP(+CmNu<(|z?s8RLVUKs!a4^YUmx0_g~!32@z zIpZxNnG(c|*%*9YDRzl>Z6<3+@^Lt4+ocqNni;5k9RfEHcV=~a@^0q!;XJL<*N6*n z(oyMfk}E{M1nk;LO8q}Fnw3?mY4)q5 zwB3g71&zwG(Op3tVf;9Zf_TW<3MsA%d+K7@hcNP}tr*v9WLfXd z0|Rmsm%RntRtHKjRn@=`t#P6F^)SaTqARbTqr`Xbi4=>8;rt~B>DRTcaqeNdsk|M% zPcyCR8zu7cPOdKD@<2azDt@9)J|EvWo>!Q}#Q7QqCSU5@oqsCn@C`eoF57?qbR!gt zCEW>);~_U5C7+Vg>)Yi?0qE@ixUZNkP=1uB4w=RHuyviuLoAeH8yz8(#v&P&mDl0Z zPULy+XFeG*rHJd4$p~8uuE;sGvkAbL+<|-Bvi0M&VZ`y43hn6H&GN?efVZixuHqTL zZqwfrosdt`+yw;o^ISGpqHdwc88Si{lPWZEqX<=?%obiz`#XRodeb;x0S)doeV%8D zaYZ%8K5+UR3Jrzgj`oKm2cl0f@SE%gVwdPQ{r zkPy~Ya)aZx2#G?yy4QEIlvl4!owIsEbhdY|cmOwAygC}(%O0Z%N~_|dB_AMgAED-3 zrS7|6ru|o;6Ri${s*ouRNuxYM18d&58s3PL_kivnvl$5^mib_38&O6+EueJw(E zO`|1X6#W`nXze-hugO0K8k#%;>i|5>4FkrH`Q-$i3L?aLi_corsxON>8aU4~`?zqFa zEyH*-o@2c?u`UkrOEQNF6jwA7^iB4Ny$t&lh|&GGM{N4`s?+wM@E> z`oe7|-0VfM$+LLfgSw=rKZ@8Eg8sZLkX4vQVEiNs=d8VQeP>5x4V)}^B-g+dwL;&)=DU zmbjm2^?`G324qZs6cEVmM1o2_eTB?Vp+`aXY&BVLdF-t=X+XM?khBVv901ko?PEXe zVN1)w>ZB6v+0$K2Ofqr*k;f^%5VzCriikA-_UBzPkg)yqt2Who-IFS=4_IhInTW5*bpT(GR1PBusCv7t2?*$CZZ%~Cjvk_0>;Osy ztxmEX#(*2iX~SMGs%{9K`*CJAEp`a4>D@5qKy{K98kwFKq&ydgf|qkb3pfe{4SKbD zLI`EUUN{(&N?yxAlO-fJmH1ldwd-o?eze!~y(c;Gn`j?T<(*8gHOIbuXJtDCutQ=$ zx%m~TS3w9doE>b>%y2VV2q6@)JeRSadYIlkbl{H3MnxY0M0zuPBwc3 zsWH8)A0S>j;zg*4ipV|$>3HE%J;#kbt{rCLcwfA#iTU?5R#j}s`OG9Z!qIJj1&_)_ z)}S67t0I1K-HW9Xku_IA>g7AI6B~8im*9sKupmn$v&hdXl$Z;8eEXIl{JudGGl&s% z1iLdy&Cam^=8$pl&0dYue1PQ)_)Rrp8h!s!8|mX}4IQ!*rX)Kl+U8l@PfW(W02h9R zhQ0hCv#0@qwGml7*kWE8Uo+22UWChfk(O8qG5GsfK|S`kZg#7DI z%FE+xU{F36&oWs^w$S%NL!e@WD>3ceBELhMbHl+7#e zT|gx#*r_eAfVqh%D12U&c3o)@0GrndXbacx+UTt8=;7+pmO`nuISDQ8xJ%jZ8P|U% zQ)ZuofY%(K2gJ61=c6@sFC#O_mJ$}6^uT~_NJqH9ralC@Fa`@!lmI6h&_1J`5Ig?L zQ#oc+^GFC&+7Z)H`>n z*mQ1k*#SJYZQ$#7gd5Ig**Q1A0^7QMP5qrd?yOHect*PO+f6r0ytdyYh%mn$ep*7L z9NR;4(YEZ9Ty^>;nBhi*MFXtrg1a4-m#x6sc5_K|IDP89oAy+u|v^Iz% z(Yo7VxPZpm1-%%0ofjBYjYAohFdRl`0c+6F#T3bZHt-2iwk`d@cXkTu{>Eg`2fFTB z?9>jET}UYgmw1NSKBTooV7i6yTNr=M0fk5JGfEdl!StR#XUALeydK245{Tz&#;Mpg z5q14I+4RO2n#HPG26MXeOVFXm_fx9m1vpI3UUjws|1``c5d~7$wdirz?;muk{4I?s zcH<0Phgk-1*j^IcJKvX{#*S+~WnENwS!+MZUD#d?OI&2z zUnYBreUz@~X=JicnIa0N@MeB<2HemBI~_Xe3#;0c--$O_U9A?dt;vUhaZlZzJmgiP zS8_7{sKjIY3$b!Kr;6B6RlLi{XisYS9h>vzHy0<4O00*DOSct%JnPUXsL)Z#Mjv-= zuVv7`v^RMov@N4`;JEzp^5#pX0sGx&M}~c6&cYEQPm}KT6{sK8GCh*NbfIMqoFux# z6P8jBp0stXy{zBKME!hr<%y$&5G{2So;=2D)XzTLP7+UIvA$5%F|!7#?hM@*WIKm{ ziHfWc0BF~Zai~u&^|qC=f;V~i3{}FF=T(&!gDfSdxw6^o@XOO1z#uJC&ino8^A5Q@ z2{A~s6u#qWyMEzlr@$fM!naB5>jUYjY&4s1;?3FKA76d^b>bJPsi-uu6urSQmA&Lx zyPOX{v{GYE^s5cH?Ou_2obX0Lj0Bj0mv9#rCwLD6U)VN5R}z%?8NLinr3n&&Z!#Wk|D{a;o# zW3`fzV-fnkk=~G8j1GRHlpN67i9UNv@|r0jJz4O?{De&DUGs0;1nC4Btxt{gVCXlT z6M=O*;A_4XI$hj6ro8oH-%)OiYPZm4d9^sDk*9UIs!?Lxi4%Mec#k^j4`y+e@=+aH zN|ug6Y~YBTN*lH75}L03pK6WCaJOp5T*^rQmJ2L_Ilv1?@G8X&y&7ug*_m0-Wbk}PhSc3X;lt#)|t)GBGW zm{%%%X|QwMr9m@B>fwX4SmZVj{3+g{xW>g?m[*`NR7$o7xG>}*yv5}ifP7aonQ zcUEiNrPy1kyPm}~n(g(J&sGuCeL?LAJl0eA2&ti~PPV3sA4erhNk6G#(jD-iq_WZRQXJK%x zlx+E(EHC)%#mzBdi<#QK7cZSByIiE$bt5~}t2%6q#+*exXMD*vy`oD{AGi7Kz>g6Z zr7T4glJf1?o|?gOYu=5%(VWF0OkVEQH|21XAD{E26_otp#^A4Qc_HKals&QqI2QdQHk2{ALJ81fN@j zPv@?r_j7+c27e0cdvmTT5nO9r{wXSqM2E&CP29YeqOtwIp#9H>`FT&AU6GKZCQv2! z$tgZaB3?7BMoC|oGnW;c)La!E4piMa`%U_|uy*_A{M^HZ(T<645Gsp1e3Q_k%IbC? zeyeP;Ya>wve(0KUHMGw`d{x8qyb-LIHLCFG?HbJ?4!h5C3}Y#BdDx7$M>uuJ`+ll0 zXeC=tj;ow@#p3e(@4z|njmI-!T%jM8)octt-0CRb+KJZTs8zS?r7+dGku5E^oyCa` zC7h!(O-WaBSQ!R#wrcN%ghx(Y+z4{t#gd{+sk=FLTl6ILkE`#`uj`7FgaVcb-LqdV zOFZ$g%_J+~?oAODzCvvv{Ajk7ATQ}zN}3(GPC6|xG8E}$-*|S$7#!IzGmD<>VNyx? z3ehYizUj{uqQZR5x4}+#%$4Y}E}hE}cpPn9GP0X-?-XN-geY1TeK zLpyl_^VwcvoN5{DEk2Rr+1kvco%z%qj_55#+5PvAm!INPew4zgMl#;N3)_rW5%_zD z^A6di@tyBGEQW6H3%iNov)TDaE}!>hRF1HNh05g$nBFCG_J0xLRK=vj~MM zC2+Uh0w&c52z#S?E`(HWlXVlOiPno6`kqev z-JA{n0UYbks2$)Ecs#k=GXb?ndc%AwkQl}eU!(YZr@wQV90v#M%Gvn|i`@LhTBqB3 zT=K7T3*NC1n7Up#70Jdeo}IWSZK_IR#!gX`>dUpI31#Zm zQJ~aQ*b5{a6)gU69d0mqD%+tc@N&b1LY|&IX4f^C*aG@I{MXlwd5lNFq~h+<72C`{ z_sk;c45Nk4$g^gto)zxURI^y$-1UD#K=9W)mzO|Qmz;*P`&EVts?kTtg6n+#@bZS* zP*~W@%I)0>0CvtAsT9aBQED!&>3AnNJP09l&aXdK-n*yYS5qm4yRY>5`TRvk-P2>~ z7g#)hui_+>G3lu{pVy#n+Amj(m{L}PSxQayq7-`aF>rmTN6sl+ zlgQ(G3XgU0#x!Kf;%bTY2`*9HIA4Ag73eal@R%FiKK9|bs6isLjI}+L%KrW`-dwQH zPTCl2xh6J%u|k~px$`krIwK*9ltHg-T79ZBcdMIopCH{zYf>)hJD$H*fgc?S3DSog zmz3!*{Pl}P*6(n2@zn2L0B3*wxrb-q#dyywuipO0ey9DdL`hqrLq2tHvK+^6fAeRH z{QDF7cm^s@%QGJbO7RRa*bw3ZB|DfU3_-xnG3UVH>m0LyS_y*@N?%c{7I ztN;MH4QLl10YINu6S10Z(*5JcJtVv^@tUDj^8P!R>DR!?i^PBz^d8^-XY2U$6G@!V z!khK7vw2p>R{O2l1_(L@Ku|7#xxxmx64^Z4H}q>4S_efFeh|#!Dvu$tc>Q*=6+-kI zhLK$*lod4y8%p^|_0>Q2{BJLTtb$W6TW(SCnNRmQ@3s(oZ~Vzw)R#R~IJk~J=wxgfmizwy7zX?T43U&CcfBSif1^6m*scIOth<(HQfD;!IK@$(ANg|(- zBn|}E;?S;u@OYa9lek9!$znZvU(|jC-C@Yk44ndshK@CF<-l!4K}^J#!uq*olwu*;gOr5-<+ zNMR5jE~l6`)%iKrO?KC*Ns(N<0A(I1{i~ zQ|NJU1_xdL_0vnG86q3K=wR4vVEqFG-0>$+-Bz1xi?5eC3w;Y2h__cLN z6es2={!?_xIFbi`NOG}F^+FuZkPTdnroqH=shW9Co0Ajw9Y4u7Szp(32J)>F;xE?n z?kh-WoCm0Z-K7Jx*a_egQm)#T4{B@xAkvv@;Xew~J+cBq{B=OLoFO*@zqqUDF+B%` zv6ikpc4HO6ssVX?tSbGZCYbbW0y|ZZALeKVw=mv}{{ky=winJf-Fso4ufqAds1YQp z0F1?auJCO4a7==BLy)x|0g>3Dd7L4dLnPJ{kYcb5Oj+x;@_#mqKhaVOLb#SGJ{jLN zVvdp}5Y~KUUGkn$aE(3qGG-dY6O%Z;efV^YOEeAFCq3g()H60Ij7Uw3s1SM~Gv%g*4y zB38<-X*x$apImBL;R$Tm7Ex1%fox|u8Q#G+F!9pP`*>`sSy1^aytd8f*9z5^TgiD` z16Jdj`EBeQFL;7^^M>B2q+YVsKK_qW2NgMm&o&jB4!8dBjcTF@e_@RIsGT;Swyo$) zH(eD!9>w)eSeEyiJ`}4a72kh6!cb*J#2L;Or-g3GRT3msrpBq5$7?x;$r}MKtIZiU zxf)E>?D4AfDU|cC+k{K^>=M^MXDZr-*MY~(SI0>{)^xH$nXoEgDRTEP#Cc#o8Y_zO z({+bZZX2`H<^DR(&(rW96~u1PnNyFW>xSpS|0{19Y;S%6O0!Q#Vu9MsOGcfUaizrvnl^8TS3)0gGlB6mlwDiLiW~03Bb`iv z!6KI_M$_|wrNFek^^L`XbEH0Eck=nKh}oZQ!|#oei4ZLgZ=v9=`7tP0TsT>P@wh_dkdJOY3Cu1~*_pFRa@j%Z911L4}$65nURPr?$-ePh*uI4@1b zpSRRSSgP7W%1zG1ZYjK=o&6}XHAJxs8Y=3I86+7;b1hSWfy}~uoxm~z4R6e<^j4Mb zTPHp3F(IaZziMM5pJ0}6b6Gm_B2?naHZq+mpz>ijH^QwlhLpw|NFL(N5C&WSyjbXS zaM6flZeP88O`Id?3PDlYk;W3BW0?NLTfIu1?dIgt_`+X{N}h_-4Z0 z83wSU?*Xn>+%mWWzt{l*j#e*PC}zWe=W3M~cV(3?9gXMrXqa8>pgc+#eXET9?`y#+ z0^Y7rP?eVu?b$OLcUq6N;Sow_MTtfUMOpp=cy4I>rDl zMVEUrl_RE!)j<0YzsvA^S%E1zX1M2Ly0kQ3A2i()(fOrR&}qw{0ilpN%c8)l+J6*m zx}}K%bWy!G4A=vCX^W>JnX7Vs!A=(|9b!6au0i`u73L zZ+8oB5WMfemik_|c3k2IxZR9-ol#IBa1&@oS-$T{)D@o#<4KCFAwxMaidCm<5+&sC zgd`8NwR{&c6`IWtAX4auzQcM05|3GO6D?{S>w`wGIlufZkRm=OI zwfoPqN=RD5UprZH>>F++)DFgB{<@`M(P1p+)N&fCG+)Iuiwv!0b&E!WwQ8c1iMH8N zu7bXx2d%*d;eqa1|5f88VKN&T5chstQD^D@ z5pDiiCqi}-muD4BO!cU_wVp|C58P4tAgrIa4oq2Dk6K>!aG{gqef;%9gHzrDb~wPI znO-(Kl|&ysId(PaRJ!T8+5FNur5KQ?fgLhO-U3oe%O5Wz`Qs@QBabzTsNvKAAqN<0 zF2wF|^*8gZW+7T)L z6GB0dch!5yX%YEVU%~DyL!&6UWHgZV-@%PJ6@BeYXfY&mn)%KF{lgw%Kqc~7YuhC! z0Sl4-6bZYMBI|<+xy6-^rAmg8^2#IynE?)anQD<9JJN#>Op78Ycll0E3X@9=?F zBeOjY4gZRp1TtVk(tBXsN*?iuzKsI+Y$VA113XWlr}$?rPm4w&j@+TYPz|nNK1G!i zDY8dBk!FdWae#}zyX{Abk5m^SO*kJ87CGDdfodTAFOnWY1q7Q98vfeAL=#?2ULhUx z%-HdU(_PNWE|y$0x@ZRivsNJIn%XXP@|h7k^bvvz={kLC_7+O^L zrQA>{J zKr%Jj-oIP{LOdjBR)4Yz2|3;e1Z6(C-{-$Rlz*c>s*e!U0Kh0X!|Bo($Q51%1p7tR zIsj$I!6|YXF>7^(PGPAxzNYkld&}{hgf4MV)f51G#MK0eLPGAvrT_1%F$|FDxfmiS z%`i}ChQTZqY4ev<^UtL}hJvsLTqLTXN}lqBNU7?I-0D)`?^gpMB9L)d+md}4xK~V4 z`7beZ+5dF~z_Y*3jw-awae@fO4KnNu4erx1YS;Pb4R~26@PxDrFHw-PhH;4#&=KD0z(yR0G2}`;SRhk4 z0i5L%)!E2_Xe=%pHbUL6L$AfVB5E9WNSC&V2`9Ed?n7bV*4d9-f5nWgaNe%)2Q=^YPRHL@ z<{;rCRhXlq6j%w1@`6M(j_ad?NK=T%KLE9>@LdQ&aG*BUN%}?!@?}%dZ$crQ8tL#f_Ji1@F~? zDd99BM`;}+JPG}qE<(P0t^PS<9rlGCn1L%Y!`K#Dbriy2hH?0T6#==<`Dy?v(LS#O zpUDBbRULuUAJ1b|-KTvp#%Du0FXi;T;A#J~M77PIu-Ao>aVB@*`I%_82W-ap1(IQ|-6ZxekBUtwu2Lq%lD59hNw% zrhV-Y(C2+}=u`vKK(o_mXlma(NUiVaWU>erkt82ARDz|iGC$X^KA<<`rCuOHO{UkZ z_;;lCkI9V>k1)RgT*pZ_;r~-`7 zQ{0jhS>Op0-y8ByDiVe!T{`vAGj=>ZYb;(%94lzp=09F|tqpSsoXJ;%pEU4G{+A>1 zw~o(8?iDJB5YU3?H+?T+USb<4sNL@B?D&O6A%ubH6I&A=B+x%Yizd_-E0(Yrc}F|o zLFcQh4^$?@D*esb1mU2}OKA7*6I#IS6awkpUoe}ay$%j8+Ndq{COa6(KggMr+ev#E z(N(4qyK&R`pOg*c?HJ$<`TQbYEhgbz6!Q+w6MJKPG6T)ql0t_Pr?Ob+;~bZRv*$|v z$k=gSc#}%yLsO@gD(0C1<@vmwC&(Q$h?NB{`x+$rkt*&pqTKxNCoQOsVNsF^E7a{e zLI;XSU>HO~>1&;6UGbhi#zW(y1Xc7GgQpB}oi!TEaygROz!1A0X6c8^$2@9Q zj#&;(T;Qo51YKnVqKkg)0oSsFizs;DH+^u(jMZS#tp9&~oq0IaZTtTb8pblV5s|S( zF=%AZI!cy`RE(``5weV3mMk;&U6v3jqzoCm$UgRL$(CfNlzmtEUh_QP=lDJMeSGhq zzd8<0GtKq6uIoJC=j(l*FipjK7&&}wY2rU5_y8lJ^hBKAukknojL?H*B3Up(<*6e7 z1W@{hd-HCB&{eP-xVg6^xSH=D z?TG5s%S`9JiZh+-+C@S{W`zFX{~p{}#nij=ifaG5to`5%{J*qR;Gsq1|C2M2Nx(k4 zA09wO>mN=K8U9z4qBOqXPZh%LDNl}Kmbw&|vF4I~&&({rx*H6uC zlW$%ihPM6zT2GQ=I94x1`n>U-j(@tBU{vl9s>(7$fPCI79TRXY=n&j`#SM4Z20_f; zgZ1g=K{h?5MECNxkY2WcTH@^J__@e|D=I z7vkndA0C5Yz)@iE!*RV7xk%>muZXyO6JPanqB43B)Md-QvpW=_vhRV5>ct1y&q#-< zdfzGKJ`e}_c5D#Ig5w|=g(6>^G(BxSB75Ew_OA+o{(Y0EQrN1LL%z6x7<}ud>hKoV zU9mTg)*$cqtN?a5O<+BADV`wies`z?f4mA@mw{a><;kf5WuyN0~0@dEZF8(wIeri`Ffqnrf1(4Q*St z_u)YJj>-ve)cAaS{5~>H`0EC~)EFq_A%Sl}yjWX%?snDK0q6rD-FyBkC#icwxn*w? z#9j9)%!sl&=0HJfZNccIeB3$yopTn6!~gev6ReySSrVQ&0CkkDC_aw?b#l$7 z>ypv(G{|Q>$Qn^@52M!~5bSve&digOojo8nsI7oz6Wl=| zCEF294ZcLC?Z^!!USa^zpLMUP4xsvY<|F@9GdJyOatf7VXmWn|m4H0Jg7Y*_Z?I+i zGw#eSiGDc-{OTl#&z`-0C&Jjeb-{OYKFEluqjZrRhJ!Oyhm?mgFA07slB~la<`V#> zQ>_ACO~U8>B(xw06lAPx??6-cY+QViI(t*+qGz}B;oLtiDXX$df{*&6^1 z!{>6mT9PZA=VIk<)IE8`^!pe<9GQ=P0>%DcdB{=Y@loUOif2HX`%>S``$O=#-hm9S z^2O@FYhJIhW?!qJ>(3NF{RA0FUoukNh+N-`ns~UZ^QkGHd#`D43?wX^4IMsdn*p}7 zk)EGFIE@8B z)Oim64Fq&Atb;FFw%{gZyvRE8lK3;8wv0qqUm6{rJQfErLMfUtgi`7upyEBrN2BEX zZG%`tKwo?9fedL_-bDoSJoHj@?c-l_e3rS+qYplJp1Q>OwG7OTn~UcaY6hn~texTp zX&y8ji2n?P&}fb>|5*GFGA;bNzWRpy@!@FWB$>WE6Rab~lT4a3FjkYre)V=iizo>Cb)f00HI6mH@EB zMGv!NuHTT0Mi!rsIYO=NQ!wOXynHi~y3rB{rov})PoQWXN3sgb#iKc_+VG0SS>@gKsS zJ2(D%I1fXqd~w`x1O{)3Wj{{gaf`iDZ=AEyf6+!aYkh_XZ0$yzI8;`PXb^IiZoVD# z$>GtGiGbtYAzv6{I9ZX6?vo&zs`YsJI4MAig&Ou(g*(6_=rK7%1RFw6``1_`PEq$I>&*DI?43-AA z4naa9n2*S~V|F0NN^1#Mt`~@l6d|v4+UoApn4b^VC%YzEem@Vl-3U+V0!wXV4Z+ZY z{WwdmM7&06cFr2~hq5>fhhwhmph8waI!Pzw1XxaLR>OQeHGw7Kqg9A!q2(UuDr`BT3m|d(PE^b?%fg5>uY98e)wZi4Ky#U5F>zm&cuj6AnrIfeX8u9c}F$9Akt;a;5P9yd#+${#<^ zRLu1Ps!=!%L*6(z^|R{&CIb+N(g#g$P9R)wHn;sCGwPvI@?;A;N>x(zygCX~N7|^` z>T=@FwN3R;$WE}RNMVPICHNp)5W2~~MS4DC0YDlGWm_<=!M@cjRM%AFG1Q3Bw@#!# zFp0GI){0gV%MCN-dekZ696(uX7-gdq7q8GEKujN&%caF~ieyK{7LUo43ya+@043Ds zXDKVokZ6a9`{g>g%W{rd5#wO1U4l_y9V-CRD8M$Dz;mK)9kgkgBM&g~CUF?ydSKU7 zgzx$+we`qxpkt3_8s40*XDhXJ5FHwW$hd|+=y=9w6yW})o%@1BjiAQ*tQ7N8F3!NV zvL!^Iic=$duI-wxSpf)9#@Bys2y%X zzlXjH_j8z9Xq-u}bkHIYq#&0a+E#=Bb2W0AEdd)ag7{E9b!tN+gIvEwg+0hi7*_ zg2}+?1u2pqOi4b8SKxGMauW|;PCLj0BS=;y{o##Ya!51&6BvRj5GR70+P*NzP1L}) z$em@Pb9BCRRFW%p{h1o{=*w!I>J>NJ3AS&p6k_@6>q;ks_XP^zBVO3iwfP|aF@6T( zubFU~@`uH=SZeLKI|fd(rNJCESmv5Nsk=!sFaZi(4alK^>J3+yC$Ea>RJ?>x?7F{Q z_0wvEmYz>^OfQsU7iCO)7ub|~9WK5d$~mcW!dXI^LZWe6%MB6nXzHr}JvI2PIB)8; zH$stmAr(^^LzSFtH6jA{AL=B-7op6 zGpQ#N%rF(ih&BUC1E$$r9&Pu7m{GZw5F&9pIHAoTK3&z~E~DjCI@@d*NBN`Rhd~#D zClOO-C~d*v0R=*46rDt;=5t%m102kfU(46Eg$jqGsJWK=s^)BgHqa;zqjFQdm^a)% z0XEdBfTZ90D28;g>*B0LA*^NjtPOj=oDk&^Ny}>`+MB`V9O`wtB(#l*cyf?tL#tjI zViRGL$BpA&)9!4r3A0+o%g4he6T-1GCmB81L)xfkql8d$erfjG7qr7RV$}6H*t8_F zRllQM)d-~G(~+bw5{qiW6MC_N33Zy!k>~rIUFBVnP2>eGjbjQm7C(Sd4fmrW?RSz)qrIb;LixYG@1^T!Su@X0 z_KErE6CfpSJ=nb`{w@RF^PyWKgEchSCm$2F8PMgwaYj0l&A}_~k&@AND>F5$6%(37 zEmHJ6$JP>*w>v}Dz7T%C&ie0l4uTcRQn~x0&xZ6`%yhkoe>{-fqS}tU(Zhkfl~m$V z(fsyX0vsFM+ocmlTDeo!AHv;brF_Tv=odP^k}s8Z(Zs)v0cI#F@eq3iwLchPf3iqC4_{jRntr3zV7iYQ+)Ko$&MpEAd63*!%Q zVET@W)&gNepm%GvG!G2fJ zppKhP=T-r1in=;oJ~!-0!20}E1agQV*lqvP7x z-U+9HA-GJvO#6cl6ACEAZmUpZMo4-RceNgJ*5szgqWt&tWSJfHX)Ac z1X>ost)au~m%{rv-49*@DSG;e=4G}^P+(m^E@Rl!Ok!^3c$F#j*YFCG#}1Cck6Moe zoXolu3oi8@0IP57{cL6kuLo%o|FM%Rn`8S_QE`m~$M?|PQrp)2WTHAo4-|v^(~Twx zgX$1ipjOjtqWFBav7zmU%}7&G!&s#{rAq}zva(Zj31_-|+%ZS%O!LO!0~d8s6T!Fb z?y^kA&KatM@NMezrIy24-ne}5JT5MFD5(GtDEE{^ix8qK<9RDYMs(}Xi)=boo^>U) zA+-`xmxBAVDn3WVr&%gu*wkq*mr+p?>HBDh>>uTJ_m216xnV^j@61Xp7)`rHxg0gL zkhnFYDeZ)Hm_zR^qMe}1nQa{3)g+sO6#f~8EnhIE`lRknq_7wZGQqdq7Ys5daMk+i zjgOUKP)1U+pZ>-eRH}oseS@~lWTS0m*p_ca2tJNQGooKkKAtMaD15TbN*Tf1geVEH zS(!a#aS)<3ye^DvAnsdWKcLy09Ymx3-mo|zafs~*_hca%?4|EB;ufXOK^EtXN*z$% zW`rO_-7JoKkD4E!PaWM0wgA>gD9kBYU61TsX>~B#$OkH zB~Y@^(wXV(V`!g-(@(6GVP0mZoUhoynG~)R+q8^GK5(c|=USuZIw0MRb;M7IdrX-Q z-~yG@lN@_GjOmx^7tH0CI6V{Zox-cUhw9IppA&TX4fiby?PN2oeS|-pRyu?TFTYCJ zGDOW}@rqPWu?lQH<#At#{^nIy!s{2EKM)?z|HQGQ`UX zHwiR8h#%lrQSmaH|FTP;`bvDFS4sl-c9oPPxvNx43~)@OmBaM7#Q2po?>@G^L~mlW z|Fwept&K;dU1e>y!!1J#niY3O-YuL)NsP#?&=R;~rsI^d#PH6%dWrLEMWB2!cs2d9Z7x~@>s;ojjbwZA2?V`!21?YT&zU=9qiiSxW$r(&;O2<@{E z$a@CF|e}1*T9jtLonh(0ySFV+TH!)F$ z-u=pMrV1%=a*n`2EO<3w_Vb|N&VOdUh^Lh+xQNyM3O^+h`0YA<`cvGsg)(Flxo>sTk^%vW4@xQ^KnaOzkP?l4Nb|Z-6i#l?1^i#l$hsJ?+xjgJ@3-* z`DMvMeux+(Paqg?I{au_jJn3UB6&*)8*@ z+V7rOIuLF!hNGaBXd;L9So2m=Z%wcA05fV3=E3TCef8;OYV9JW?qOQa?{YZyGJQdI zO6Lv?Jtym=hOcaCP^_s#LCVszxU<}r-22%DOdF`kQB6LK8&Qv-LXh`;Y)Kd8_lB;d zv8FKTAwoBV`TJ8mH%j%VvdvG9i3ue`hg{9NwizKC3a9*UI=Ky=cmF0?oumrZ7Yt3S zo?@;7OReg_)K6B z+|4343TJ5P2JfT&#o#5>Rbd3QtNJxT)a$F$0h5l1w@s9Cf+6be*Vca-a7h<`-G?J< z;|-F8hB0b$8KHebD|1odJzT-P#*-Stwpgqc!_M`>nHwYwerLIx#CdMmuY@RA^OV8)i{Bh@ zCj9S3FBhUDviZ%do*G$wAklc=Y1e+JojfsZLu0-F~qMdH$^7J3F?0F9Q z^<&K-t6=<|W*O7!P7S50rqOAmtc2Ox_D^h^@5C$dI^=DFS2eZvW#y7boX{ z6)&|bRK^so@R&9MC{#*I4d)y5VD1lM81Xb| z&)&NE4J*|f_S~?YyTq6vnELh!TZkex=+nMf+_(=PilF8+ritd!x5gA6llyL9<&03zwCsL;4 z1gZ4lTW0C!pr#v%g7g=jZJMr;tx!gt2O*PaD3~oQ#Df(jUbw%?FYUXw$=h>4050-*3&WOlVuD#A*k?i)6s=P; zj5~_{W=?#r0)ya8>IFMF;qvz5Ut{!Jxdokqn_f_i4uV65xL-=+>~DsVx0u1fDwJwZ zEphG%X|um|IkNrTf>m01X8v|pR@ZgkyyGSbn-pYY6v*UAMi{F=o7ci1FU|UK;>8v0BWY zn_84m)_U<|>U0O1n?FKzo)dQ=xTT1{N^K8C?{1igMaQZ<#Kx5*;1DGm#vK;gbWto0 z6(sk$xqKR^D4_vxuL+gW`f+v;bT>|cbSHK%gJyAwd(Yysxf4XDlWrX)(0V9dC8P9s ze{%O|)S%W|A#eg>LgC3ieyQm}o1nbu+bQp`I!2l(bp(k$LAk1i!`g{dcN+S@ zuf!o*x1M=Qd0AaykNa(o=hy5UX*6R|x0NcZM)j+I) zV1jSi7jy^p;cj&Fx@Dt&t-~|B`t0SR!T4(Zo-f{IlBI|sPp2eSpBEx;^;~%26GAoq zpjW?uOKoc1syU%W25Obfqerv`81*}$vlcmsu|RcBUn5}kx;A`uU z>Mb6Yh_7{y_`^W;XSzDm+DonnLolJ1k%ec?uuQd>{kQTbLc$6i}`C(pzI z!4&*GYlr-i9p?;|$g9ht%-Z}(PJYnN!b!EIDMqP^CGB$VpTbgUMnJX(U%A9)-u+eIIp2x~CEpY|6{?0K zK8?*j(r4?hYz~&lsYl4lEbjw`QRS!EkCeyHbnIpe`bLPnciVY`hyJ|CS04{)%aILp zc(z4tRP$KR0>6e@iEq#@yh-58wp^^aZ4e^AJ95v2_xPn|n>X?OoVLnLmCA4CPzPNE(%m_LBO!5w8Fh(z?KBaVY_%J#?-} zia1b8(i~AtNp(cxxG%$@QhciCE$Ci%hWG)qGJRW2wO4nm^2%@S@o(nc0`TuJ2Nj9i z51;|4B#ts+?WR)9CY;$)Nkz+R@Xt!7zL>}Ha+cmNSi6Z4$ce=Yho~P~ZmblWZZ0Cmb1G-7&xI+foUv#_f9|szhYJi3Fls^89L`Ma z!d-(IYRBz(VymHDT|Qkxr&aGcs6umTDZA@>Is&^ZpUL!yP~$DX&Bc5g@Pvr3eu3OS zEjfR3@5CVQ;~e$N$sZCO{f8iO6VLBKP!M;Iu%(IbrTFRGtZMoX&+dVeoZDW9%ytKa z^R$th>G|Bn(4SZRlipo9Du7P2Eix!T8p5V0%k`8)PF6SL~FRU@6koAEye zwp)+RJDDk_9Uo_|!_NH0O7Pw2q|Q5k)~}IG;6uQFAfW+ho!Nn>*X!deugC zHG3hlHQ{W^zN4AsRr*?glhZY7o&Zo~sm~~;L#4VpBCkdqY5ow@YYDS~)V!au(#}Ge z-Nxd#sjs99N*(6Y8LK{Zr|O?OyrVT_rUFe7_sGV=-RvZ8hi}EOq$x<`0b~zXnp#tn%8gmPzYgo$YQlwmpj@^~BorB|xV1e1>!bj8eFp6WF+ro)Bx~=dczJL%u zzS)5d2B~{C8Tm^63aiCWlr@ zsdOhF0eac^`SaOIJs)MJII=y8J87OR;ZcSH(@lOa%=o1#A}_+G?A!K{ySz7@k3|1c zs6tRXM5{5Pi-CpL@@C&`_?TpZgpEb$fJL*Gnj5_SS8^6RTnpLV9hs}?`Vel^re&3A zu@Qr*XOWBAfcf*53Exm0SN%+#7ydv@gu>5l($klLrHd+QdN%>c6BAqC3=} zaP7P{%QJY7f6@u10{pqKtTWd>=IK8+gj=097lxia^_)2$_b_!T1(o)M;=N#|IOqlT zUPh;cuJcSbpDXV22|t$)?2uPz?222;@#Kb~LfpO{b&DOr=E2$5C)PNkiJDn_?Gv5CgU0`+7DZ z!rnka!ro~>vQ5&4_1#s?PY%$%D}+m0rVX4=<)XHVgU}wztJ3Is! zDJW=Hv@fgQrph(^PTS2tj2Rx}gxUs7X{uikGgDoxJPImZjn3T;Qq{riJdmOi-rITv|Pp;~r_?1FS z)Cqga8EPVBZEtxHhh7$gx}5Rlv?K!@_vj!r!qMYY(d9+{^CXDGDs)A>tWZjI>W(N( zt4mg1Q?i+@NDY}muTA_zU~<}ENIJ)#{bit}96uniuIL^f=+;~AxIknna2(FI8xIIR>q0hu(|h6YUFK7gb1DY zMlpAFVSF_a#Uj@;ZV$Z+`_shsg3hWUK@D^{WfwbPd}G>oEt^Nn1$lzMk^dA?(?+Fp z1X5zr=D$uDNeMd9b}qp3KDB+n&(NZhLKvY&Xk{D)e=;dKU-kQe<>(ut3>g17$pviQ zcNdp|hzO6wXl-7*AP0L4=qh@{3FG!BLc{4DR*}r~mD(YE5mnNZ7bAW<&_}Y+vlMm( z`kdkagvjs}*<{fE54renAz#fJ4OsoKg|K)#4lNG25*7&NV$o>01Cju$m>4yy$W|)& z44<=>u$dCp(t5-6TIreQM~s_cS2VdTE~X4%UNhjKt51ZNn0xcB5HXi7i}W$aXjqzN5#zF?|8 zM=(qeuc@WfZt8C=jLKyd2=1&g2WN*hz zWT%Q-O>lwi^40gy7(Rp{heiN}wp8w4U~<($Vdg~sr9aws*qf1R62xiUBwx}*%OT~90tsENb9zL1;!Q54{yLQFamI5 z#{KvND6gtal(nY9ojZnqm3$z<05HUvC{q?Ye}@N?TeR4I$f#vj{Wb6#sLr0Bjk$`; z^<73wo@IiDwE&n|>n?o#0{wggQA%bz^HWXUh@KGG67IL>HwHo2n~}5~^&9}JSGU%S z_b-FCAqyFDE~{t!eh_a{IRc~s3t(_2V+}sQp4T4&S1=a*COlIfYgL%zO$<3PWleUg zWh%HA)Xl|RGGo8OQSm|)d|@`~6lGb*e1MK+mh<{C_TmnhZZHp6mxg*Na#QysfHQ9P zeS2;%Fn~FZr~UxgtvWJebmMg4L8DbJ9_|MEleq8yqTwG9hXyxNQynu) X2(1gw|8aOk0e-Zv+_+qVwg~wjD6abP literal 0 HcmV?d00001 From 2d31257b4e57bc869a83d386e3c43bb72defc431 Mon Sep 17 00:00:00 2001 From: rnet Date: Wed, 10 Apr 2024 18:58:01 +0800 Subject: [PATCH 4/6] release: v1.7.0 --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c415c7..32f3dfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ +## [1.7.0](https://github.com/pysunday/rs-reverse/compare/1.6.0...1.7.0) (2024-04-10) + + +### Features + +* 1. 增加makecode-high子命令 2. 增加basearr子命令 ([7757ad5](https://github.com/pysunday/rs-reverse/commit/7757ad59341e1278f1f3ea37f2c09fe6374c9193)) + + +### Bug Fixes + +* 1. exec命令适配版本;2. 新版cookie位数逻辑更新(无法过检测) ([ae822c7](https://github.com/pysunday/rs-reverse/commit/ae822c7a4dc908fe483d622ff4b391719b447703)) +* 文档更新、代码优化 ([36848f8](https://github.com/pysunday/rs-reverse/commit/36848f8527ab954723dccb886b2931047c3c35a6)) +* 更新readme ([4caaf73](https://github.com/pysunday/rs-reverse/commit/4caaf73979105168ecfedcf0279fde2d279290cf)) + ## [1.6.0](https://github.com/pysunday/rs-reverse/compare/1.5.1...1.6.0) (2024-03-28) diff --git a/package.json b/package.json index 423e9a1..181ae4f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rs-reverse", - "version": "1.6.0", + "version": "1.7.0", "description": "瑞数算法逆向,website reverse engineering", "main": "main.js", "directories": { From b8702c0eeee0a32c11775af523c5e0ecb42fc5bc Mon Sep 17 00:00:00 2001 From: rnet Date: Wed, 10 Apr 2024 19:12:13 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=E6=8B=B7=E8=B4=9D=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/makeCodeHigh.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/makeCodeHigh.js b/src/makeCodeHigh.js index a7a3385..05c7f9e 100644 --- a/src/makeCodeHigh.js +++ b/src/makeCodeHigh.js @@ -93,7 +93,9 @@ function secondStep(ts, immucfg, mate) { } module.exports = async function (ts, immucfg, mate) { - fse.moveSync(paths.outputResolve('makecode-high'), paths.outputResolve('makecode-high-old'), { overwrite: true }); + if (fs.existsSync(paths.outputResolve('makecode-high'))) { + fse.moveSync(paths.outputResolve('makecode-high'), paths.outputResolve('makecode-high-old'), { overwrite: true }); + } const startTime = new Date().getTime(); const [files, cookieStr] = firstStep(ts, immucfg, mate); files.unshift('\n第1次请求:\n'); From b4ac98ef278529ff09ec2937f029d65e3477c99c Mon Sep 17 00:00:00 2001 From: rnet Date: Wed, 10 Apr 2024 19:12:34 +0800 Subject: [PATCH 6/6] release: v1.7.1 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32f3dfe..1161ef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## [1.7.1](https://github.com/pysunday/rs-reverse/compare/1.7.0...1.7.1) (2024-04-10) + + +### Bug Fixes + +* 拷贝目录报错修复 ([b8702c0](https://github.com/pysunday/rs-reverse/commit/b8702c0eeee0a32c11775af523c5e0ecb42fc5bc)) + ## [1.7.0](https://github.com/pysunday/rs-reverse/compare/1.6.0...1.7.0) (2024-04-10) diff --git a/package.json b/package.json index 181ae4f..c879c31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rs-reverse", - "version": "1.7.0", + "version": "1.7.1", "description": "瑞数算法逆向,website reverse engineering", "main": "main.js", "directories": {