runtime checks verifier.

0.96
Török Edvin 15 years ago
parent d4c9f766ce
commit 1e30496d2a
  1. 2
      libclamav/c++/GenList.pl
  2. 3
      libclamav/c++/Makefile.am
  3. 28
      libclamav/c++/Makefile.in
  4. 21
      libclamav/c++/bytecode2llvm.cpp
  5. 1
      libclamav/c++/llvm/include/llvm/Analysis/PointerTracking.h
  6. 48
      libclamav/c++/llvm/lib/Analysis/PointerTracking.cpp
  7. 2
      unit_tests/input/apicalls.cbc
  8. 2
      unit_tests/input/apicalls2.cbc
  9. 2
      unit_tests/input/arith.cbc
  10. 2
      unit_tests/input/div0.cbc
  11. 10
      unit_tests/input/lsig.cbc
  12. 2
      unit_tests/input/retmagic.cbc

@ -9,7 +9,7 @@ my %compdeps;
my @codegencomponents = ('x86codegen','powerpccodegen','armcodegen');
my @allnonsys = ('support','jit','fullcodegen',@codegencomponents);
my @allcomponents= ('system',@allnonsys);
my $allJIT="jit core lib/Support/SourceMgr.o";
my $allJIT="jit core lib/Support/SourceMgr.o lib/Analysis/PointerTracking.o";
for my $component (@allcomponents) {
$/ = " ";
$component =~ s/^fullcodegen/codegen interpreter jit target/;

@ -44,7 +44,7 @@ libclamavcxx_la_LIBADD=libllvmjit.la
libclamavcxx_la_DEPENDENCIES=libllvmjit.la libllvmcodegen.la libllvmsystem.la
libclamavcxx_la_LDFLAGS=-no-undefined
libclamavcxx_la_CXXFLAGS = $(LLVM_CXXFLAGS)
libclamavcxx_la_SOURCES = bytecode2llvm.cpp
libclamavcxx_la_SOURCES = bytecode2llvm.cpp ClamBCRTChecks.cpp
if BUILD_X86
libclamavcxx_la_LIBADD+=libllvmx86codegen.la
libclamavcxx_la_DEPENDENCIES+=libllvmx86codegen.la
@ -441,6 +441,7 @@ libllvmjit_la_SOURCES=\
llvm/lib/Analysis/CaptureTracking.cpp\
llvm/lib/Analysis/DebugInfo.cpp\
llvm/lib/Analysis/MemoryBuiltins.cpp\
llvm/lib/Analysis/PointerTracking.cpp\
llvm/lib/Analysis/ValueTracking.cpp\
llvm/lib/CodeGen/ELFCodeEmitter.cpp\
llvm/lib/CodeGen/ELFWriter.cpp\

@ -106,7 +106,8 @@ CONFIG_HEADER = clamavcxx-config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
LTLIBRARIES = $(noinst_LTLIBRARIES)
am_libclamavcxx_la_OBJECTS = libclamavcxx_la-bytecode2llvm.lo
am_libclamavcxx_la_OBJECTS = libclamavcxx_la-bytecode2llvm.lo \
libclamavcxx_la-ClamBCRTChecks.lo
libclamavcxx_la_OBJECTS = $(am_libclamavcxx_la_OBJECTS)
AM_V_lt = $(am__v_lt_$(V))
am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
@ -279,8 +280,8 @@ libllvminterpreter_la_OBJECTS = $(am_libllvminterpreter_la_OBJECTS)
libllvmjit_la_LIBADD =
am_libllvmjit_la_OBJECTS = AliasAnalysis.lo BasicAliasAnalysis.lo \
CaptureTracking.lo DebugInfo.lo MemoryBuiltins.lo \
ValueTracking.lo ELFCodeEmitter.lo ELFWriter.lo \
MachineBasicBlock.lo MachineFunction.lo \
PointerTracking.lo ValueTracking.lo ELFCodeEmitter.lo \
ELFWriter.lo MachineBasicBlock.lo MachineFunction.lo \
MachineFunctionAnalysis.lo MachineFunctionPass.lo \
MachineInstr.lo MachineModuleInfo.lo MachineRegisterInfo.lo \
ObjectCodeEmitter.lo PseudoSourceValue.lo \
@ -929,7 +930,7 @@ libclamavcxx_la_DEPENDENCIES = libllvmjit.la libllvmcodegen.la \
$(am__append_10)
libclamavcxx_la_LDFLAGS = -no-undefined
libclamavcxx_la_CXXFLAGS = $(LLVM_CXXFLAGS)
libclamavcxx_la_SOURCES = bytecode2llvm.cpp
libclamavcxx_la_SOURCES = bytecode2llvm.cpp ClamBCRTChecks.cpp
LLVM_CXXFLAGS = -Woverloaded-virtual -pedantic -Wno-long-long -Wall -W -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-variadic-macros
TBLGENFILES = llvm/include/llvm/Intrinsics.gen X86GenRegisterInfo.h.inc X86GenRegisterNames.inc X86GenRegisterInfo.inc X86GenInstrNames.inc X86GenInstrInfo.inc\
X86GenAsmWriter.inc X86GenAsmWriter1.inc X86GenAsmMatcher.inc X86GenDAGISel.inc X86GenFastISel.inc X86GenCallingConv.inc\
@ -1186,6 +1187,7 @@ libllvmjit_la_SOURCES = \
llvm/lib/Analysis/CaptureTracking.cpp\
llvm/lib/Analysis/DebugInfo.cpp\
llvm/lib/Analysis/MemoryBuiltins.cpp\
llvm/lib/Analysis/PointerTracking.cpp\
llvm/lib/Analysis/ValueTracking.cpp\
llvm/lib/CodeGen/ELFCodeEmitter.cpp\
llvm/lib/CodeGen/ELFWriter.cpp\
@ -1900,6 +1902,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Passes.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Path.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PluginLoader.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PointerTracking.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PostRASchedulerList.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PreAllocSplitting.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PrettyStackTrace.Plo@am__quote@
@ -1994,6 +1997,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VirtRegRewriter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/circular_raw_ostream.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/count-count.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libclamavcxx_la-ClamBCRTChecks.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libclamavcxx_la-bytecode2llvm.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgoogletest_la-TestMain.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgoogletest_la-gtest-death-test.Plo@am__quote@
@ -2400,6 +2404,14 @@ libclamavcxx_la-bytecode2llvm.lo: bytecode2llvm.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libclamavcxx_la_CXXFLAGS) $(CXXFLAGS) -c -o libclamavcxx_la-bytecode2llvm.lo `test -f 'bytecode2llvm.cpp' || echo '$(srcdir)/'`bytecode2llvm.cpp
libclamavcxx_la-ClamBCRTChecks.lo: ClamBCRTChecks.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libclamavcxx_la_CXXFLAGS) $(CXXFLAGS) -MT libclamavcxx_la-ClamBCRTChecks.lo -MD -MP -MF $(DEPDIR)/libclamavcxx_la-ClamBCRTChecks.Tpo -c -o libclamavcxx_la-ClamBCRTChecks.lo `test -f 'ClamBCRTChecks.cpp' || echo '$(srcdir)/'`ClamBCRTChecks.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libclamavcxx_la-ClamBCRTChecks.Tpo $(DEPDIR)/libclamavcxx_la-ClamBCRTChecks.Plo
@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ClamBCRTChecks.cpp' object='libclamavcxx_la-ClamBCRTChecks.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libclamavcxx_la_CXXFLAGS) $(CXXFLAGS) -c -o libclamavcxx_la-ClamBCRTChecks.lo `test -f 'ClamBCRTChecks.cpp' || echo '$(srcdir)/'`ClamBCRTChecks.cpp
libgoogletest_la-gtest-death-test.lo: llvm/utils/unittest/googletest/gtest-death-test.cc
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgoogletest_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libgoogletest_la-gtest-death-test.lo -MD -MP -MF $(DEPDIR)/libgoogletest_la-gtest-death-test.Tpo -c -o libgoogletest_la-gtest-death-test.lo `test -f 'llvm/utils/unittest/googletest/gtest-death-test.cc' || echo '$(srcdir)/'`llvm/utils/unittest/googletest/gtest-death-test.cc
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgoogletest_la-gtest-death-test.Tpo $(DEPDIR)/libgoogletest_la-gtest-death-test.Plo
@ -3936,6 +3948,14 @@ MemoryBuiltins.lo: llvm/lib/Analysis/MemoryBuiltins.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MemoryBuiltins.lo `test -f 'llvm/lib/Analysis/MemoryBuiltins.cpp' || echo '$(srcdir)/'`llvm/lib/Analysis/MemoryBuiltins.cpp
PointerTracking.lo: llvm/lib/Analysis/PointerTracking.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PointerTracking.lo -MD -MP -MF $(DEPDIR)/PointerTracking.Tpo -c -o PointerTracking.lo `test -f 'llvm/lib/Analysis/PointerTracking.cpp' || echo '$(srcdir)/'`llvm/lib/Analysis/PointerTracking.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PointerTracking.Tpo $(DEPDIR)/PointerTracking.Plo
@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='llvm/lib/Analysis/PointerTracking.cpp' object='PointerTracking.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PointerTracking.lo `test -f 'llvm/lib/Analysis/PointerTracking.cpp' || echo '$(srcdir)/'`llvm/lib/Analysis/PointerTracking.cpp
ValueTracking.lo: llvm/lib/Analysis/ValueTracking.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ValueTracking.lo -MD -MP -MF $(DEPDIR)/ValueTracking.Tpo -c -o ValueTracking.lo `test -f 'llvm/lib/Analysis/ValueTracking.cpp' || echo '$(srcdir)/'`llvm/lib/Analysis/ValueTracking.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ValueTracking.Tpo $(DEPDIR)/ValueTracking.Plo

@ -20,6 +20,7 @@
* MA 02110-1301, USA.
*/
#define DEBUG_TYPE "clamavjit"
#include "ClamBCModule.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/StringMap.h"
@ -190,6 +191,7 @@ static void* noUnknownFunctions(const std::string& name) {
.Case("memmove", (void*)(intptr_t)memmove)
.Case("memcpy", (void*)(intptr_t)memcpy)
.Case("memset", (void*)(intptr_t)memset)
.Case("abort", (void*)(intptr_t)jit_exception_handler)
.Default(0);
if (addr)
return addr;
@ -649,6 +651,8 @@ public:
}
const Type *I32Ty = Type::getInt32Ty(Context);
const Type *I64Ty = Type::getInt64Ty(Context);
if (!bc->trusted)
PM.add(createClamBCRTChecks());
for (unsigned j=0;j<bc->num_func;j++) {
PrettyStackTraceString CrashInfo("Generate LLVM IR");
const struct cli_bc_func *func = &bc->funcs[j];
@ -751,6 +755,7 @@ public:
case OP_BC_STORE:
case OP_BC_COPY:
case OP_BC_RET:
case OP_BC_PTRDIFF32:
// these instructions represents operands differently
break;
default:
@ -951,8 +956,8 @@ public:
{
const Type *SrcTy = mapType(inst->u.three[0]);
Value *V = convertOperand(func, SrcTy, inst->u.three[1]);
Value *Op = convertOperand(func, I64Ty, inst->u.three[2]);
Op = Builder.CreateTrunc(Op, I32Ty);
Value *Op = convertOperand(func, I32Ty, inst->u.three[2]);
// Op = Builder.CreateTrunc(Op, I32Ty);
if (!createGEP(inst->dest, V, &Op, &Op+1))
return false;
break;
@ -963,8 +968,8 @@ public:
Ops[0] = ConstantInt::get(Type::getInt32Ty(Context), 0);
const Type *SrcTy = mapType(inst->u.three[0]);
Value *V = convertOperand(func, SrcTy, inst->u.three[1]);
Ops[1] = convertOperand(func, I64Ty, inst->u.three[2]);
Ops[1] = Builder.CreateTrunc(Ops[1], I32Ty);
Ops[1] = convertOperand(func, I32Ty, inst->u.three[2]);
// Ops[1] = Builder.CreateTrunc(Ops[1], I32Ty);
if (!createGEP(inst->dest, V, Ops, Ops+2))
return false;
break;
@ -976,8 +981,8 @@ public:
const Type *SrcTy = mapType(inst->u.ops.ops[0]);
Value *V = convertOperand(func, SrcTy, inst->u.ops.ops[1]);
for (unsigned a=2;a<inst->u.ops.numOps;a++) {
Value *Op = convertOperand(func, I64Ty, inst->u.ops.ops[a]);
Op = Builder.CreateTrunc(Op, I32Ty);
Value *Op = convertOperand(func, I32Ty, inst->u.ops.ops[a]);
// Op = Builder.CreateTrunc(Op, I32Ty);
Idxs.push_back(Op);
}
if (!createGEP(inst->dest, V, Idxs.begin(), Idxs.end()))
@ -1114,7 +1119,6 @@ public:
delete [] Values;
delete [] BB;
}
DEBUG(M->dump());
delete TypeMap;
std::vector<const Type*> args;
@ -1154,9 +1158,6 @@ public:
}
}
}
if (!bc->trusted) {
//TODO: call verifier to insert runtime checks
}
delete [] Functions;
return true;
}

@ -98,6 +98,7 @@ namespace llvm {
virtual bool runOnFunction(Function &F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
void print(raw_ostream &OS, const Module* = 0) const;
Value *computeAllocationCountValue(Value *P, const Type *&Ty) const;
private:
Function *FF;
TargetData *TD;

@ -263,5 +263,53 @@ void PointerTracking::print(raw_ostream &OS, const Module* M) const {
}
}
Value *PointerTracking::computeAllocationCountValue(Value *P, const Type *&Ty) const
{
Value *V = P->stripPointerCasts();
if (AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
Ty = AI->getAllocatedType();
// arraySize elements of type Ty.
return AI->getArraySize();
}
if (CallInst *CI = extractMallocCall(V)) {
Ty = getMallocAllocatedType(CI);
if (!Ty)
return 0;
Value *arraySize = getMallocArraySize(CI, TD);
if (!arraySize) {
Ty = Type::getInt8Ty(P->getContext());
return CI->getOperand(1);
}
// arraySize elements of type Ty.
return arraySize;
}
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
if (GV->hasDefinitiveInitializer()) {
Constant *C = GV->getInitializer();
if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
Ty = ATy->getElementType();
return ConstantInt::get(Type::getInt32Ty(P->getContext()),
ATy->getNumElements());
}
}
Ty = cast<PointerType>(GV->getType())->getElementType();
return ConstantInt::get(Type::getInt32Ty(P->getContext()), 1);
//TODO: implement more tracking for globals
}
if (CallInst *CI = dyn_cast<CallInst>(V)) {
CallSite CS(CI);
Function *F = dyn_cast<Function>(CS.getCalledValue()->stripPointerCasts());
if (F == reallocFunc) {
Ty = Type::getInt8Ty(P->getContext());
// realloc allocates arg1 bytes.
return CS.getArgument(1);
}
}
return 0;
}
static RegisterPass<PointerTracking> X("pointertracking",
"Track pointer bounds", false, true);

@ -1,4 +1,4 @@
ClamBCafhf`olfgkd|afefdfggifnf```````|bgacflfafmfbfcfmb`cnb`cacmbicmbgfafeficfcgcecff``agafp`clamcoincidencejb:82
ClamBCafhdndbigkd|afefdfggifnf```````|bhacflfafmfbfcfmb`cnb`cacmbacdcmbgfafdfccacacbfgc``agafp`clamcoincidencejb:82
Tedaaa`aacb`bb`bb`b
Eaaaaaabfd|afdgefcgdgac``

@ -1,4 +1,4 @@
ClamBCafhf`olfgkd|afefdfggifnf```````|bgacflfafmfbfcfmb`cnb`cacmbicmbgfafeficfcgcecff``ahafp`clamcoincidencejb:66
ClamBCafhdndbigkd|afefdfggifnf```````|bhacflfafmfbfcfmb`cnb`cacmbacdcmbgfafdfccacacbfgc``ahafp`clamcoincidencejb:66
Tedaaa`aabb`bb`baacb`bb`bb`b
Ebcaabbcabfd|afdgefcgdgbc``aabgd|afdgefcgdgac``

@ -1,4 +1,4 @@
ClamBCafhf`olfgkd|afefdfggifnf```````|bgacflfafmfbfcfmb`cnb`cacmbicmbgfafeficfcgcecff``afbbep`clamcoincidencejb:418
ClamBCafhdndbigkd|afefdfggifnf```````|bhacflfafmfbfcfmb`cnb`cacmbacdcmbgfafdfccacacbfgc``afbbep`clamcoincidencejb:418
Tedaaa`
E``

@ -1,4 +1,4 @@
ClamBCafhf`olfgkd|afefdfggifnf```````|bgacflfafmfbfcfmb`cnb`cacmbicmbgfafeficfcgcecff``afabp`clamcoincidencejb:23
ClamBCafhdndbigkd|afefdfggifnf```````|bhacflfafmfbfcfmb`cnb`cacmbacdcmbgfafdfccacacbfgc``afabp`clamcoincidencejb:23
Tedaaa`
E``

@ -1,14 +1,14 @@
ClamBCafhf`olfgkd|afefdfggifnf```c``a```|bgacflfafmfbfcfmb`cnb`cacmbicmbgfafeficfcgcecff``bhaabp`clamcoincidencejb:313
ClamBCafhdndbigkd|afefdfggifnf```c``a```|bhacflfafmfbfcfmb`cnb`cacmbacdcmbgfafdfccacacbfgc``bhaabp`clamcoincidencejb:309
Test.{A,B};Target:1;(((0|1|2)=42,2)|(3=10));EP+0:aabb;ffff;aaccee;f00d;dead
Tedebgeebfeebeeebdeebceebbeeb`eebadebcdaaa`aacb`bbadb`bcajahbaeahbaeahbaeahbaeahbaecaab`bdb`db`bdagahdajahdabbaddabahdaeah
Eaeaaaebod|amcgefdgfgifbgegcgnfafmfef``
Gd```hbka`@`bgeBdeBefBcgBdg@`bfeBad@`bfeBbd@`bee@Ab@Ac`b`aAa`bdeBedB`eBkbB`cBjcBafBafBbfBbf@`bgeBffBffBffBff@`bgeBffB`cB`cBdf@`bceBafBafBcfBcfBefBef@`bgeBdfBefBafBdf@`b`aC``a`b`e@@@Aa@Ac@Ab@Ad`bad@Ab`bad@Ab`bad@Ac`bad@Ac`bad@Af`bad@Ag`bad@Ah`bad@Ai`bad@Aj`bcdB`aD```h`bcdAlD```h`bcdAhD```h`bcdAdD```h`bcd@D```h`
Gd```hbja`@`bgeBdeBefBcgBdg@`bfeBad@`bfeBbd@`bee@Ab@Ac`b`aAa`bdeBedB`eBkbB`cBjcBafBafBbfBbf@`bgeBffBffBffBff@`bgeBffB`cB`cBdf@`bceBafBafBcfBcfBefBef@`bgeBdfBefBafBdf@`b`aC``a`b`e@@@Aa@Ac@Ab@Ad`bad@Ab`bad@Ac`bad@Af`bad@Ag`bad@Ah`bad@Ai`bad@Aj`bad@D```h`bcdB`aD```h`bcdAlD```h`bcdAhD```h`bcdAdD```h`bcd@D```h`
A`b`bLaeb`b`aa`aa`bad`b`b`Fahac
Bb`b`gbBfa`aaaagab`b`AadTaaaaaaab
Baaabeab`b`AbdbadacoaabAn`B`a`b`badabbaeac@dTcab`b@d
Bb`b`gbBea`aaaagab`b`AadTaaaaaaab
Baaabeab`b`AbdbadacoaabAm`An`b`badabbaeac@dTcab`b@d
BTcab`b@dE
A`aaLbcab`b`b`b`b`b`b`b`b`b`aa`aa`aa`aa`b`b`b`b`b`b`b`b`b`b`aa`aa`b`b`aa`aa`Fbdaaa
Bb`b`gbBja`b`baagbBia`b`babgbBha`b`baca`aa`b`bada`acabaaaeeab`badBjbdaaaffab`bab@daaagfab`baa@daaahfab`b`@db`bai`aafb`baj`aagb`bak`aahb`bala`ajakb`bama`alaiaaaneab`bamAbdaaaok`anaeb`bb`agbBga`aabaaeab`bb`aAjdaabbal`aobaaTcaaabbaE
Bb`b`gbBia`b`baagbBha`b`babgbBga`b`baca`aa`b`bada`acabaaaeeab`badBjbdaaaffab`bab@daaagfab`baa@daaahfab`b`@db`bai`aafb`baj`aagb`bak`aahb`bala`ajakb`bama`alaiaaaneab`bamAbdaaaok`anaeb`bb`agbBfa`aabaaeab`bb`aAjdaabbal`aobaaTcaaabbaE
Sobjb`bieofeg`bafbgef`bofnflfig`baflflfofggefdf`bdgof`bcgefdg`bdghfefcgef`bfgifbgegcgnfafmfefcg`bafcg`bffofegnfdf`bjbobSfeidbeeecendadmdedoe`ebeedfdidhehbbbdeefcgdgbbib
feidbeeecendadmdedcehbbbadbblb`bbbbdbbibSdeadbegdeddehbacibSceidgdndaddeeebeedceoeddedcdldoebdedgdidndSddedcdldadbeedoeceidgdndaddeeebeedhbmfafgfifcfibSddedcdldadbeedoeceidgdndaddeeebeedhbjgefbgofib
ddedcdldadbeedoeceidgdndaddeeebeedhbcfhfefcfkfibSddedcdldadbeedoeceidgdndaddeeebeedhbffiffgefdgofdgefnfibSddedcdldadbeedoeceidgdndaddeeebeedhbcfhfefcfkfbcibSceidgdndaddeeebeedceoeddedcdldoeednddd

@ -1,4 +1,4 @@
ClamBCafhf`olfgkd|afefdfggifnf```````|bgacflfafmfbfcfmb`cnb`cacmbicmbgfafeficfcgcecff``afaap`clamcoincidencejb:20
ClamBCafhdndbigkd|afefdfggifnf```````|bhacflfafmfbfcfmb`cnb`cacmbacdcmbgfafdfccacacbfgc``afaap`clamcoincidencejb:20
Tedaaa`
E``

Loading…
Cancel
Save