Browse code

Add matchwithread.cbc to unit tests.

Török Edvin authored on 2010/03/24 19:46:34
Showing 3 changed files
... ...
@@ -125,7 +125,7 @@ const struct clam_option __clam_options[] = {
125 125
     { NULL, "bytecode-trust-all", 't', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMSCAN, "Trust loaded bytecode (default: only if signed)", ""},
126 126
     { NULL, "info", 'i', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMBC, "Load and print bytecode information without executing", ""},
127 127
     { NULL, "printsrc", 'p', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMBC, "Print source code of bytecode", ""},
128
-    { NULL, "input", 'i', TYPE_STRING, NULL, -1, NULL, 0, OPT_CLAMBC, "Input file to run the bytecode n", ""},
128
+    { NULL, "input", 'r', TYPE_STRING, NULL, -1, NULL, 0, OPT_CLAMBC, "Input file to run the bytecode n", ""},
129 129
     { NULL, "trace", 't', TYPE_NUMBER, MATCH_NUMBER, 7, NULL, 0, OPT_CLAMBC, "bytecode trace level",""},
130 130
     { NULL, "no-trace-showsource", 's', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMBC, "Don't show source line during tracing",""},
131 131
 
... ...
@@ -29,23 +29,31 @@
29 29
 #include <limits.h>
30 30
 #include <string.h>
31 31
 #include <check.h>
32
+#include <fcntl.h>
32 33
 #include "../libclamav/clamav.h"
33 34
 #include "../libclamav/others.h"
34 35
 #include "../libclamav/bytecode.h"
35 36
 #include "checks.h"
36 37
 #include "../libclamav/dconf.h"
37 38
 #include "../libclamav/bytecode_priv.h"
39
+#include "../libclamav/pe.h"
38 40
 
39
-static void runtest(const char *file, uint64_t expected, int fail, int nojit)
41
+static void runtest(const char *file, uint64_t expected, int fail, int nojit,
42
+		    const char *infile, struct cli_pe_hook_data *pedata,
43
+		    struct cli_exe_section *sections, const char *expectedvirname)
40 44
 {
45
+    fmap_t *map = NULL;
41 46
     int rc;
42 47
     int fd = open_testfile(file);
43 48
     FILE *f;
44 49
     struct cli_bc bc;
50
+    cli_ctx cctx;
45 51
     struct cli_bc_ctx *ctx;
46 52
     struct cli_all_bc bcs;
47 53
     uint64_t v;
48 54
 
55
+    memset(&cctx, 0, sizeof(cctx));
56
+
49 57
     fail_unless(fd >= 0, "retmagic open failed");
50 58
     f = fdopen(fd, "r");
51 59
     fail_unless(!!f, "retmagic fdopen failed");
... ...
@@ -78,6 +86,18 @@ static void runtest(const char *file, uint64_t expected, int fail, int nojit)
78 78
     ctx->bytecode_timeout = 10;
79 79
     fail_unless(!!ctx, "cli_bytecode_context_alloc failed");
80 80
 
81
+    if (infile) {
82
+	int fdin = open(infile, O_RDONLY);
83
+	fail_unless(fdin >= 0, "failed to open infile");
84
+	map = fmap(fdin, 0, 0);
85
+	fail_unless(!!map, "unable to fmap infile");
86
+	ctx->ctx = &cctx;
87
+	if (pedata)
88
+	    ctx->hooks.pedata = pedata;
89
+	ctx->sections = sections;
90
+	cli_bytecode_context_setfile(ctx, map);
91
+    }
92
+
81 93
     cli_bytecode_context_setfuncid(ctx, &bc, 0);
82 94
     rc = cli_bytecode_run(&bcs, &bc, ctx);
83 95
     fail_unless_fmt(rc == fail, "cli_bytecode_run failed, expected: %u, have: %u\n",
... ...
@@ -88,7 +108,14 @@ static void runtest(const char *file, uint64_t expected, int fail, int nojit)
88 88
 	fail_unless_fmt(v == expected, "Invalid return value from bytecode run, expected: %llx, have: %llx\n",
89 89
 			expected, v);
90 90
     }
91
+    if (infile && expectedvirname) {
92
+	fail_unless(ctx->virname &&
93
+		    !strcmp(ctx->virname, expectedvirname),
94
+		    "Invalid virname, expected: %s\n", expectedvirname);
95
+    }
91 96
     cli_bytecode_context_destroy(ctx);
97
+    if (map)
98
+	funmap(map);
92 99
     cli_bytecode_destroy(&bc);
93 100
     cli_bytecode_done(&bcs);
94 101
 }
... ...
@@ -96,32 +123,32 @@ static void runtest(const char *file, uint64_t expected, int fail, int nojit)
96 96
 START_TEST (test_retmagic)
97 97
 {
98 98
     cl_init(CL_INIT_DEFAULT);
99
-    runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 0);
100
-    runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 1);
99
+    runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 0, NULL, NULL, NULL, NULL);
100
+    runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 1, NULL, NULL, NULL, NULL);
101 101
 }
102 102
 END_TEST
103 103
 
104 104
 START_TEST (test_arith)
105 105
 {
106 106
     cl_init(CL_INIT_DEFAULT);
107
-    runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 0);
108
-    runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 1);
107
+    runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 0, NULL, NULL, NULL, NULL);
108
+    runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 1, NULL, NULL, NULL, NULL);
109 109
 }
110 110
 END_TEST
111 111
 
112 112
 START_TEST (test_apicalls)
113 113
 {
114 114
     cl_init(CL_INIT_DEFAULT);
115
-    runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 0);
116
-    runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 1);
115
+    runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 0, NULL, NULL, NULL, NULL);
116
+    runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 1, NULL, NULL, NULL, NULL);
117 117
 }
118 118
 END_TEST
119 119
 
120 120
 START_TEST (test_apicalls2)
121 121
 {
122 122
     cl_init(CL_INIT_DEFAULT);
123
-    runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 0);
124
-    runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 1); 
123
+    runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 0, NULL, NULL, NULL, NULL);
124
+    runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 1, NULL, NULL, NULL, NULL);
125 125
 }
126 126
 END_TEST
127 127
 
... ...
@@ -129,24 +156,49 @@ START_TEST (test_div0)
129 129
 {
130 130
     cl_init(CL_INIT_DEFAULT);
131 131
     /* must not crash on div#0 but catch it */
132
-    runtest("input/div0.cbc", 0, CL_EBYTECODE, 0);
133
-    runtest("input/div0.cbc", 0, CL_EBYTECODE, 1);
132
+    runtest("input/div0.cbc", 0, CL_EBYTECODE, 0, NULL, NULL, NULL, NULL);
133
+    runtest("input/div0.cbc", 0, CL_EBYTECODE, 1, NULL, NULL, NULL, NULL);
134 134
 }
135 135
 END_TEST
136 136
 
137 137
 START_TEST (test_lsig)
138 138
 {
139 139
     cl_init(CL_INIT_DEFAULT);
140
-    runtest("input/lsig.cbc", 0, 0, 0);
141
-    runtest("input/lsig.cbc", 0, 0, 1);
140
+    runtest("input/lsig.cbc", 0, 0, 0, NULL, NULL, NULL, NULL);
141
+    runtest("input/lsig.cbc", 0, 0, 1, NULL, NULL, NULL, NULL);
142 142
 }
143 143
 END_TEST
144 144
 
145 145
 START_TEST (test_inf)
146 146
 {
147 147
     cl_init(CL_INIT_DEFAULT);
148
-    runtest("input/inf.cbc", 0, CL_ETIMEOUT, 0);
149
-    runtest("input/inf.cbc", 0, CL_ETIMEOUT, 1);
148
+    runtest("input/inf.cbc", 0, CL_ETIMEOUT, 0, NULL, NULL, NULL, NULL);
149
+    runtest("input/inf.cbc", 0, CL_ETIMEOUT, 1, NULL, NULL, NULL, NULL);
150
+}
151
+END_TEST
152
+
153
+START_TEST (test_matchwithread)
154
+{
155
+    struct cli_exe_section sect;
156
+    struct cli_pe_hook_data pedata;
157
+    cl_init(CL_INIT_DEFAULT);
158
+    memset(&pedata, 0, sizeof(pedata));
159
+    pedata.ep = 64;
160
+    pedata.opt32.ImageBase = 0x400000;
161
+    pedata.hdr_size = 0x400;
162
+    pedata.nsections = 1;
163
+    sect.rva = 4096;
164
+    sect.vsz = 4096;
165
+    sect.raw = 0;
166
+    sect.rsz = 512;
167
+    sect.urva = 4096;
168
+    sect.uvsz = 4096;
169
+    sect.uraw = 1;
170
+    sect.ursz = 512;
171
+    runtest("input/matchwithread.cbc", 0, 0, 0, "../test/clam.exe", &pedata,
172
+	    &sect, "ClamAV-Test-File-detected-via-bytecode");
173
+    runtest("input/matchwithread.cbc", 0, 0, 1, "../test/clam.exe", &pedata,
174
+	    &sect, "ClamAV-Test-File-detected-via-bytecode");
150 175
 }
151 176
 END_TEST
152 177
 
... ...
@@ -163,5 +215,6 @@ Suite *test_bytecode_suite(void)
163 163
     tcase_add_test(tc_cli_arith, test_div0);
164 164
     tcase_add_test(tc_cli_arith, test_lsig);
165 165
     tcase_add_test(tc_cli_arith, test_inf);
166
+    tcase_add_test(tc_cli_arith, test_matchwithread);
166 167
     return s;
167 168
 }
168 169
new file mode 100644
... ...
@@ -0,0 +1,49 @@
0
+ClamBCafhheb`ajkd|afefdfggifnf```ca`a```|alcflfafmfbfcfmb`cnb`ccc``becabp`clamcoincidencejb:1443
1
+BC.foomatchwithread.{ClamAV-Test-File-detected-via-bytecode};Target:1;(2&1&0);0:4d5a50000200000004000f00ffff0000;EOF-544:4d5a50000200000004000f00ffff0000;S0+0:4d5a50000200000004000f00ffff0000
2
+Tedebdgebcgebbgebageb`gebofebheebnfebmfeblfebffebefebdfebcfebieebbfeb`febadebcddaeahdakahaaaaaaaa`aabb`bb`baacb`bbadb`baacb`bb`bb`baadb`bbadbadb`bcafahbafahbafahbafcaab`bdb`db`bdbgaahdbccahdbfaahcakb`bb`bb`abgfbhfbifbjfb`bb`bb`bb`bcahb`bb`ab`ab`bb`bb`bb`ab`acboab`aahahb`bb`bb`bb`bb`bb`bb`bb`bb`bb`ab`ab`ab`ab`ab`ab`bb`bb`bb`bb`ab`ab`bb`bb`bb`bb`bb`bbjfcbnab`aahahb`bb`bb`bb`bb`bb`db`bb`bb`ab`ab`ab`ab`ab`ab`bb`bb`bb`bb`ab`ab`db`db`db`db`bb`bbjfdb`abkfcabb`bb`bdbeaahdbnbahdbkaahdbfbahdbibahdbcbahdaabaddbgbahdbdaah
3
+Eaoafagble|baadfefbfeggfoe`gbgifnfdgoeegifnfdg``aoble|ak`gefoebgafggafdfdfbg``afbme|b`adfefbfeggfoe`gbgifnfdgoecgdgbg``abbme|aebgefafdf``adbne|aecgefefkf``aebme|amcgefdgfgifbgegcgnfafmfef``
4
+Gdc``hbgb`@`bdgBbdBcdBnbBffBofBofBmfBafBdgBcfBhfBggBifBdgBhfBbgBefBafBdf@`bcgBcdBlfBafBmfBadBfeBmbBdeBefBcgBdgBmbBfdBifBlfBefBmbBdfBefBdgBefBcfBdgBefBdfBmbBfgBifBafBmbBbfBigBdgBefBcfBofBdfBef@`bbg@Ab`b`aAa`bagB`cBjcBdcBdfBecBafBecB`cB`cB`cB`cBbcB`cB`cB`cB`cB`cB`cB`cBdcB`cB`cB`cBffB`cB`cBffBffBffBffB`cB`cB`cB`c@`b`gBedBodBfdBmbBecBdcBdcBjcBdcBdfBecBafBecB`cB`cB`cB`cBbcB`cB`cB`cB`cB`cB`cB`cBdcB`cB`cB`cBffB`cB`cBffBffBffBffB`cB`cB`cB`c@`bofBceB`cBkbB`cBjcBdcBdfBecBafBecB`cB`cB`cB`cBbcB`cB`cB`cB`cB`cB`cB`cBdcB`cB`cB`cBffB`cB`cBffBffBffBffB`cB`cB`cB`c@`b`aCa`a`bheBedB`eBjcB`b@`bnfBcdBofBegBlfBdfBnfBgbBdgB`bBbgBefBafBdfB`bBecB`bBbfBigBdgBefBcgB`bB`dBedB`eAj@`bmfBndBofB`bBgbBmfBofBfgB`bBefBbfBhgBlbB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgBgbB`bBffBofBegBnfBdfB`bBafBdgB`bBefBnfBdgBbgBigB`gBofBifBnfBdgAj@`blfBfeBadB`bBofBffB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgB`bBifBcgB`b@`befBbeBfeBadB`bBofBffB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgB`bBifBcgB`b@`bdfBcdBafBnfBgbBdgB`bBlfBofBcfBafBdgBefB`bBdgBhfBefB`bB`gBhfBifBcgBifBcfBafBlfB`bBofBffBffBcgBefBdgB`bBofBffB`bBdgBhfBefB`bBcfBigB`gBhfBefBbgBdgBefBhgBdg@`befBcdBigB`gBhfBefBbgBdgBefBhgBdgB`bBcgBdgBafBbgBdgBcgB`bBafBdgB`b@`bcfBcdBafBnfBgbBdgB`bBbgBefBafBdfB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgAj@`bieBhdBedBldBldBodB`bBgeBodBbeBmd@`b`f@@@Aa@Ab`bad@Ab`bad@Ae`bad@Af`bad@Ag`bad@Ai`bad@Aj`bad@Ak`bad@Al`bad@Dc``h`bcdB`dDc``h`bcdAdDc``h`bad@Am`bad@An`bad@Ao`bad@B`a`bad@Baa`bad@D```h`bcdAhD```h`bcdAdD```h`bcd@D```h`
5
+A`b`bLbjeb`babheabieab`b`b`b`b`b`b`b`bad`b`b`aa`b`b`ah`aa`b`b`bad`b`b`aa`````b`b`b`b`b`b`b`b`b`b`b`b`b`b`b`b`aa`b`b`b`b`b`b`b`b`bad`b`b`aa`b`b`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```b`b`aa`bad```b`b`b`b`Fbdfam
6
+Bb`bacgbBma`b`badabbafBga`@db`baeabaagacb`bafabbadac@dbadagdbbkdaa@db`bahabbabagAedaaaieab`bahAedTaaaiabaa
7
+Bb`bajabbafBha`@dTcab`b@d
8
+BahakgbagaaaleaahakBkkaTaaaladac
9
+Bb`bamabbafBia`@dTcab`b@d
10
+BbadandbbkdaaAadb`baogbanaab`alb``bbao`Taab`aaeaf
11
+Bb`b`obaoTbaaf
12
+Bb`bbcabb`bcab`bbdaabbafBja`@db`bbeaabaagbcab`bbfagbBla`b`bbgab`bcabfab`bbhaabbafBna`@db`bbiaabaagbgab`bbjaabaaobgaaabkaeab`bbjaHoooooooodTaabkaagah
13
+Bb`bblaabbafBoa`@dTcab`b@d
14
+Bb`bbmaabbafB`b`@db`bbnaabaagbjab`bboaabbadbja@dbadb`bdbbceab@db`bbababbabb`bAjdaabbbeab`bbabAjdTaabbbajai
15
+Bb`bbcbabbafBab`@dTcab`b@d
16
+Bahbdbgbb`bahbebm`bdbBjba``fbbebb`bbadbgbdbbceabAadahbhba`bebAaaahbibgbbgbahbjbm`bhbbib``fbbjbbgbbadblbdbbceabAbdahbmba`bjbAaaahbnbgbblbahbobm`bmbbnb``fbbobblbbadbacdbbceabAcdahbbca`bobAaaahbccgbbacahbdcm`bbcbcc``fbbdcbacbadbfcdbbceabAddahbgca`bdcAaaahbhcgbbfcahbicm`bgcbhc``fbbicbfcbadbkcdbbceabAedahblca`bicAaaahbmcgbbkcahbncm`blcbmc``fbbncbkcbadb`ddbbceabAfdahbada`bncAaaahbbdgbb`dahbcdm`badbbd``fbbcdb`dbadbeddbbceabAgdahbfda`bcdAaaahbgdgbbedahbhdm`bfdbgd``fbbhdbedbadbjddbbceabAhdahbkda`bhdAaaahbldgbbjdahbmdm`bkdbld``fbbmdbjdbadboddbbceabAidahb`ea`bmdAaaahbaegbbodahbbem`b`ebae``fbbbebodb`bbdekbb`bBbb`Ajdaabeeeab`bbde@dTaabeeakal
17
+BbadbfedbbceabAjd``fb@abfeb`bbheabbafb`b@db`bbieabbaeBca`@dTcab`b@d
18
+BTcab`b@dE
19
+A`aaLahb`b`b`b`b`b`aa`aa`aa`aa`aa`Faiaa
20
+Bb`b`gbBfb`b`baagbBeb`b`babgbBdb`aaacfab`bab@daaadfab`baa@daaaefab`b`@daaafk`adaeaaagk`afacTcaaaagE
21
+Sfeidbeeecendadmdedoe`ebeedfdidhehb`bbbbdcdnbffofofmfafdgcfhfggifdghfbgefafdfbb`bibSfeidbeeecendadmdedcehbbbcdlfafmfadfembdeefcgdgmbfdiflfefmbdfefdgefcfdgefdfmbfgifafmbbfigdgefcfofdfefbbib
22
+deadbegdeddehbacibSobjb`bdehfifcg`bifcg`baflflf`bdfegmfmfig`bcgdgegffff`bjbobSceidgdndaddeeebeedceoeddedcdldoebdedgdidndSddedcdldadbeedoeceidgdndaddeeebeedhbmdjeffbgofmfbdodfdib
23
+ddedcdldadbeedoeceidgdndaddeeebeedhbmdjeffbgofmfedodfdibSddedcdldadbeedoeceidgdndaddeeebeedhbmdjeffbgofmfce`cibSceidgdndaddeeebeedceoeddedcdldoeedndddSceidgdndaddeeebeedceoeddedfdoebdedgdidnd
24
+ddedfdidndedoeceidgdndaddeeebeedhbmdjeffbgofmfbdodfdlb`b`b`b`b`b`b`bbb`cjcdcdfecafec`c`c`c`cbc`c`c`c`c`c`c`cdc`c`c`cff`c`cffffffff`c`c`c`cbbibSddedfdidndedoeceidgdndaddeeebeedhbmdjeffbgofmfedodfdlb`bbbedodfdmbecdcdcjcdcdfecafec`c`c`c`cbc`c`c`c`c`c`c`cdc`c`c`cff`c`cffffffff`c`c`c`cbbib
25
+ddedfdidndedoeceidgdndaddeeebeedhbmdjeffbgofmfce`clb`b`b`b`b`bbbce`ckb`cjcdcdfecafec`c`c`c`cbc`c`c`c`c`c`c`cdc`c`c`cff`c`cffffffff`c`c`c`cbbibSceidgdndaddeeebeedceoeednddd
26
+`eedoeeend`eadcdkdedbeoeddedcdldadbeedSbfofoflf`blfofgfifcfaflfoedgbgifgfgfefbghbfgofifdfibSkgSbgefdgegbgnf`bmfafdgcfhfefcghbceifgfnfafdgegbgefcgnbmdjeffbgofmfbdodfdib`bfbfb`bmfafdgcfhfefcghbceifgfnfafdgegbgefcgnbmdjeffbgofmfedodfdib`bfbfb`bmfafdgcfhfefcghbceifgfnfafdgegbgefcgnbmdjeffbgofmfce`cibkc
27
+mgSobjb`bddegmfmfig`bcgdgegffff`befnfdfcg`bhfefbgef`bjbobSifnfdg`befnfdgbgig`gofifnfdghbib`bkgSobob`bgdefdg`bdghfef`befnfdgbgig`b`gofifnfdg`bodfdfdceeddeSegifnfdgccbcoedg`bef`g`bmc`bgfefdgednfdgbgig`eofifnfdghbibkc
28
+dfefbfeggfhbbbed`ejc`bbbibkc`bdfefbfeggfhbef`gibkcSobob`bmdoffgef`bdgof`bdghfef`befnfdgbgig`b`gofifnfdg`bofffffcgefdg`bifnf`bdghfef`bffiflfefScgefefkfhbef`glb`bceededkdoeceeddeibkc
29
+objb`bhdefbgef`bggef`blfofofkf`bffofbg`bmfoffg`befbfhglb`bfgaflfegefSdehfef`bdfifcgafcgcgefmfbflfefbg`bifcg`bhfofggeffgefbg`bnfofdg`bigefdg`bifnfdgefgfbgafdgefdf`bifnf`bdghfef`bbfcf`bcgof`bffofbg`bnfofgg`bggef`bcfhfefcfkf
30
+mfafnfegaflflfig`bifff`bifdggbcg`baf`bmfoffgnb`bidnf`bhfefhg`bifdg`bcghfofeglfdf`bbfef`bbfbfccccbcbcacac`c`c`bffofbg`bmfoffg`befbfhglb`b`c`cacacbcbccccc`bSdghfafdg`bifcg`bec`bbfigdgefcg`boffgefbgaflflfnb
31
+jbobSobob`bmdafkfef`bbgofofmf`bffofbg`bdghfef`bec`bbfigdgefcg`bdgof`bbfef`bbgefafdfSegifnfdghcoedg`bffifbgcgdgoeof`gkeecmekcSobob`bbeefafdf`bec`bbfigdgefcgSifffhbbgefafdfhbffifbgcgdgoeof`glb`becibabmcecib`bkg
32
+dfefbfeggfhbbbcdofeglfdfnfgbdg`bbgefafdf`bec`bbfigdgefcg`b`ded`elenfbbibkcSbgefdgegbgnf`b`ckcSmgSobob`bcdhfefcfkf`bifff`bdghfef`bffifbgcgdg`bbfigdgef`bhbafkfaf`bffifbgcgdgoeof`gke`cmeib`bifcg`bbfbf
33
+ifffhbffifbgcgdgoeof`gke`cme`babmc`b`chgbfbfib`bkgSdfefbfeggfhbbbndof`bgbmfoffg`befbfhglb`bcfig`ghfefbgdgefhgdggb`bffofegnfdf`bafdg`befnfdgbgig`gofifnfdglenfbbibkc
34
+bgefdgegbgnf`b`ckcSmgSobob`bdeafkfef`bdghfef`bafbggfegmfefnfdg`bofff`bmfoffg`befbfhglb`bnbnbnb`bgghfifcfhf`bifcg`bdghfef`bfead`bofff`bdghfef`bcfig`ghfefbgdgefhgdg
35
+egifnfdgccbcoedg`bfgafoeofffoecfig`ghfefbgdgefhgdg`bmc`bcflfifoebgefafdfifnfdgccbchbhbegifnfdgccbcoedg`bjbibhbffifbgcgdgoeof`gkbacibibkcSdfefbfeggfhbbbfead`bofff`bcfig`ghfefbgdgefhgdg`bifcg`bbbibkcdfefbfeggfhbfgafoeofffoecfig`ghfefbgdgefhgdgibkc
36
+obob`bmdafkfef`bdghfef`bfead`bafnf`bbefead`bmb`bdghfafdg`bifcg`bcgegbfdgbgafcfdg`bdghfef`bifmfafgfefbfafcgef`bffbgofmf`bifdgSegifnfdgccbcoedg`bbgfgafoeofffoecfig`ghfefbgdgefhgdg`bmc`bfgafoeofffoecfig`ghfefbgdgefhgdg`bmb`b`boeoecflfafmfbfcfoe`gefdfafdgafnbof`gdgccbcnbidmfafgfefbdafcgefkc
37
+dfefbfeggfhbbbbefead`bofff`bcfig`ghfefbgdgefhgdg`bifcg`bbbibkcdfefbfeggfhbbgfgafoeofffoecfig`ghfefbgdgefhgdgibkcSobob`bdeegbgnf`bdghfef`bbefead`bofff`bdghfef`bcfig`ghfefbgdgefhgdg`bifnfdgof`baf`bffiflfef`bhbbgafggib`bofffffcgefdg
38
+egifnfdgccbcoedg`bofffffcgefdgoeofffoecfig`ghfefbgdgefhgdg`bmc`b`gefoebgafggafdfdfbghbbgfgafoeofffoecfig`ghfefbgdgefhgdgibkcSobob`bidff`bdghfef`bofffffcgefdg`bifcg`bbfafdflb`bbfafiflf`bofegdg
39
+ifffhbofffffcgefdgoeofffoecfig`ghfefbgdgefhgdg`bmcmc`b`eedoeidndfeadldidddoebefeadib`bkgSdfefbfeggfhbbbcdafnfgbdg`blfofcfafdgef`bdghfef`b`ghfifcgifcfaflf`bofffffcgefdg`bofff`bdghfef`bcfig`ghfefbgdgefhgdgbbibkc
40
+bgefdgegbgnf`b`ckcSmgSdfefbfeggfhbbbcdig`ghfefbgdgefhgdg`bcgdgafbgdgcg`bafdg`bbbibkcdfefbfeggfhbofffffcgefdgoeofffoecfig`ghfefbgdgefhgdgibkcSobob`bmdoffgef`bdgof`bdghfef`bcfig`ghfefbgdgefhgdg`bifnf`bdghfef`bffiflfef
41
+cgefefkfhbofffffcgefdgoeofffoecfig`ghfefbgdgefhgdglb`bceededkdoeceeddeibkcSobob`bmdafkfef`bbgofofmf`bffofbg`bdghfef`bcfig`ghfefbgdgefhgdg`bdgof`bbfef`bbgefafdf`bmb`bac`c`bbfigdgefcg`bdghfafdg`bifcg`bbbhdedldldod`bgeodbemdbb`b`glfegcg`bofnfef`bbfigdgef`bffofbg`bdghfef`bdgefbgmfifnfafdgofbg
42
+egifnfdghcoedg`bcfig`ghfefbgdgefhgdgkeacacmekcSobob`bbeefafdf`bdghfef`bcfig`ghfefbgdgefhgdg`bffbgofmf`bffiflfef`bifnfdgof`bbbcfig`ghfefbgdgefhgdgbbSifffhbbgefafdfhbcfig`ghfefbgdgefhgdglb`bac`cibabmcac`cib`bkg
43
+dfefbfeggfhbbbcdafnfgbdg`bbgefafdf`bcfig`ghfefbgdgefhgdglenfbbibkcSbgefdgegbgnf`b`ckcSmgSobob`bdehfef`bbbdfefcfbgig`gdgifofnfbb`blfofof`g`bmb`bdgegbgnfcg`bdghfef`bcfig`ghfefbgdgefhgdg`bifnfdgof`b`glfafigifnfdgefhgdg
44
+egifnfdghcoedg`bcfegbgbgefnfdgoe`gofcgifdgifofnflb`bkfefig`bmc`b`chgbcickcSffofbghbcfegbgbgefnfdgoe`gofcgifdgifofnfmc`ckc`bcfegbgbgefnfdgoe`gofcgifdgifofnflcac`ckc`bcfegbgbgefnfdgoe`gofcgifdgifofnfkbkbib`bkg
45
+kfefigkbkbkcScfig`ghfefbgdgefhgdgkecfegbgbgefnfdgoe`gofcgifdgifofnfme`bnemc`bkfefigkcSkfefig`bmc`bcfig`ghfefbgdgefhgdgkecfegbgbgefnfdgoe`gofcgifdgifofnfmekcSmgSobob`bcdofmf`gafbgef`bdghfef`bhbnfofggib`b`glfafifnfdgefhgdg`bggifdghf`bdghfef`bbgefffefbgefnfcfef`bhbbbhdedldldod`bgeodbemdbbib
46
+ifffhbabmfefmfcfmf`ghbcfig`ghfefbgdgefhgdglb`bbbhdedldldod`bgeodbemdbblb`bac`cibib`bkgScfig`ghfefbgdgefhgdgkeac`cme`bmc`b`ckc`bobob`baddfdf`baf`bcgdgbgifnfgf`bdgefbgmfifnfafdgofbg
47
+dfefbfeggfhbhbcfhfafbg`bjbibcfig`ghfefbgdgefhgdgibkc`bobob`b`ebgifnfdg`bifdglb`bjfegcgdg`bffofbg`bffegnfSffofegnfdffeifbgegcghbbbcdlfafmfadfembdeefcgdgmbfdiflfefmbdfefdgefcfdgefdfmbfgifafmbbfigdgefcfofdfefbbibkc`bobob`bceefdg`bdghfef`bfgifbgegcg`bnfafmfefab
48
+mgSbgefdgegbgnf`b`ckcSmgSS
0 49
\ No newline at end of file