From 91086dbb1b6d47e9e5c9dc5b63aa88f33a0b2b98 Mon Sep 17 00:00:00 2001 From: jontio Date: Fri, 29 Dec 2017 15:07:31 +1300 Subject: [PATCH] added libcorrect source with inline popcnt function and 32 and 64 bit windows libraries. reduced signal threshold from 0.5 to 0.6. --- JAERO/DSP.cpp | 17 +- JAERO/aerol.cpp | 120 ++--- JAERO/aerol.h | 10 +- JAERO/burstmskdemodulator.cpp | 10 +- JAERO/burstmskdemodulator.h | 2 +- JAERO/burstoqpskdemodulator.cpp | 4 +- JAERO/burstoqpskdemodulator.h | 2 +- JAERO/jconvolutionalcodec.cpp | 8 +- JAERO/mskdemodulator.cpp | 4 +- JAERO/mskdemodulator.h | 2 +- JAERO/oqpskdemodulator.cpp | 4 +- JAERO/oqpskdemodulator.h | 2 +- libcorrect/.appveyor-install-tools.cmd | 47 ++ libcorrect/.travis.yml | 12 + libcorrect/CMakeLists.txt | 84 +++ libcorrect/LICENSE | 12 + libcorrect/README.md | 38 ++ libcorrect/appveyor.yml | 51 ++ libcorrect/bin/32/libcorrect.a | Bin 0 -> 48668 bytes libcorrect/bin/32/libcorrect.dll | Bin 317677 -> 319952 bytes libcorrect/bin/32/libcorrect.dll.a | Bin 0 -> 55974 bytes libcorrect/bin/64/libcorrect.a | Bin 0 -> 46968 bytes libcorrect/bin/64/libcorrect.dll | Bin 362167 -> 363697 bytes libcorrect/bin/64/libcorrect.dll.a | Bin 0 -> 54844 bytes libcorrect/include/correct-sse.h | 10 +- libcorrect/include/correct.h | 25 +- libcorrect/include/correct/convolutional.h | 1 + .../include/correct/convolutional/bit.h | 2 + .../include/correct/convolutional/metric.h | 2 +- libcorrect/include/correct/portable.h | 19 + libcorrect/include/correct/reed-solomon.h | 15 +- .../include/correct/util/error-sim-fec.h | 8 + .../include/correct/util/error-sim-shim.h | 7 + .../include/correct/util/error-sim-sse.h | 7 + libcorrect/include/correct/util/error-sim.h | 47 ++ libcorrect/include/fec_shim.h | 9 +- libcorrect/src/CMakeLists.txt | 2 + libcorrect/src/convolutional/CMakeLists.txt | 5 + libcorrect/src/convolutional/bit.c | 232 ++++++++ libcorrect/src/convolutional/convolutional.c | 59 ++ libcorrect/src/convolutional/decode.c | 321 +++++++++++ libcorrect/src/convolutional/encode.c | 61 +++ libcorrect/src/convolutional/error_buffer.c | 43 ++ libcorrect/src/convolutional/history_buffer.c | 158 ++++++ libcorrect/src/convolutional/lookup.c | 74 +++ libcorrect/src/convolutional/metric.c | 17 + .../src/convolutional/sse/CMakeLists.txt | 2 + .../src/convolutional/sse/convolutional.c | 21 + libcorrect/src/convolutional/sse/decode.c | 319 +++++++++++ libcorrect/src/convolutional/sse/encode.c | 9 + libcorrect/src/convolutional/sse/lookup.c | 183 +++++++ libcorrect/src/fec_shim.c | 255 +++++++++ libcorrect/src/reed-solomon/CMakeLists.txt | 2 + libcorrect/src/reed-solomon/decode.c | 505 ++++++++++++++++++ libcorrect/src/reed-solomon/encode.c | 34 ++ libcorrect/src/reed-solomon/polynomial.c | 255 +++++++++ libcorrect/src/reed-solomon/reed-solomon.c | 187 +++++++ libcorrect/tests/CMakeLists.txt | 54 ++ libcorrect/tests/convolutional-fec.c | 123 +++++ libcorrect/tests/convolutional-shim.c | 122 +++++ libcorrect/tests/convolutional-sse.c | 132 +++++ libcorrect/tests/convolutional.c | 133 +++++ libcorrect/tests/include/rs_tester.h | 41 ++ libcorrect/tests/include/rs_tester_fec.h | 10 + libcorrect/tests/include/rs_tester_fec_shim.h | 10 + libcorrect/tests/reed-solomon-fec-interop.c | 138 +++++ libcorrect/tests/reed-solomon-shim-interop.c | 138 +++++ libcorrect/tests/reed-solomon.c | 146 +++++ libcorrect/tests/rs_tester.c | 102 ++++ libcorrect/tests/rs_tester_fec.c | 30 ++ libcorrect/tests/rs_tester_fec_shim.c | 26 + libcorrect/tools/CMakeLists.txt | 29 + libcorrect/tools/find_conv_libfec_poly.c | 279 ++++++++++ libcorrect/tools/find_conv_optim_poly.c | 330 ++++++++++++ .../tools/find_conv_optim_poly_annealing.c | 350 ++++++++++++ libcorrect/tools/find_rs_primitive_poly.c | 51 ++ libcorrect/util/CMakeLists.txt | 11 + libcorrect/util/error-sim-fec.c | 29 + libcorrect/util/error-sim-shim.c | 33 ++ libcorrect/util/error-sim-sse.c | 13 + libcorrect/util/error-sim.c | 188 +++++++ 81 files changed, 5724 insertions(+), 119 deletions(-) create mode 100644 libcorrect/.appveyor-install-tools.cmd create mode 100644 libcorrect/.travis.yml create mode 100644 libcorrect/CMakeLists.txt create mode 100644 libcorrect/LICENSE create mode 100644 libcorrect/README.md create mode 100644 libcorrect/appveyor.yml create mode 100644 libcorrect/bin/32/libcorrect.a create mode 100644 libcorrect/bin/32/libcorrect.dll.a create mode 100644 libcorrect/bin/64/libcorrect.a create mode 100644 libcorrect/bin/64/libcorrect.dll.a create mode 100644 libcorrect/include/correct/portable.h create mode 100644 libcorrect/include/correct/util/error-sim-fec.h create mode 100644 libcorrect/include/correct/util/error-sim-shim.h create mode 100644 libcorrect/include/correct/util/error-sim-sse.h create mode 100644 libcorrect/include/correct/util/error-sim.h create mode 100644 libcorrect/src/CMakeLists.txt create mode 100644 libcorrect/src/convolutional/CMakeLists.txt create mode 100644 libcorrect/src/convolutional/bit.c create mode 100644 libcorrect/src/convolutional/convolutional.c create mode 100644 libcorrect/src/convolutional/decode.c create mode 100644 libcorrect/src/convolutional/encode.c create mode 100644 libcorrect/src/convolutional/error_buffer.c create mode 100644 libcorrect/src/convolutional/history_buffer.c create mode 100644 libcorrect/src/convolutional/lookup.c create mode 100644 libcorrect/src/convolutional/metric.c create mode 100644 libcorrect/src/convolutional/sse/CMakeLists.txt create mode 100644 libcorrect/src/convolutional/sse/convolutional.c create mode 100644 libcorrect/src/convolutional/sse/decode.c create mode 100644 libcorrect/src/convolutional/sse/encode.c create mode 100644 libcorrect/src/convolutional/sse/lookup.c create mode 100644 libcorrect/src/fec_shim.c create mode 100644 libcorrect/src/reed-solomon/CMakeLists.txt create mode 100644 libcorrect/src/reed-solomon/decode.c create mode 100644 libcorrect/src/reed-solomon/encode.c create mode 100644 libcorrect/src/reed-solomon/polynomial.c create mode 100644 libcorrect/src/reed-solomon/reed-solomon.c create mode 100644 libcorrect/tests/CMakeLists.txt create mode 100644 libcorrect/tests/convolutional-fec.c create mode 100644 libcorrect/tests/convolutional-shim.c create mode 100644 libcorrect/tests/convolutional-sse.c create mode 100644 libcorrect/tests/convolutional.c create mode 100644 libcorrect/tests/include/rs_tester.h create mode 100644 libcorrect/tests/include/rs_tester_fec.h create mode 100644 libcorrect/tests/include/rs_tester_fec_shim.h create mode 100644 libcorrect/tests/reed-solomon-fec-interop.c create mode 100644 libcorrect/tests/reed-solomon-shim-interop.c create mode 100644 libcorrect/tests/reed-solomon.c create mode 100644 libcorrect/tests/rs_tester.c create mode 100644 libcorrect/tests/rs_tester_fec.c create mode 100644 libcorrect/tests/rs_tester_fec_shim.c create mode 100644 libcorrect/tools/CMakeLists.txt create mode 100644 libcorrect/tools/find_conv_libfec_poly.c create mode 100644 libcorrect/tools/find_conv_optim_poly.c create mode 100644 libcorrect/tools/find_conv_optim_poly_annealing.c create mode 100644 libcorrect/tools/find_rs_primitive_poly.c create mode 100644 libcorrect/util/CMakeLists.txt create mode 100644 libcorrect/util/error-sim-fec.c create mode 100644 libcorrect/util/error-sim-shim.c create mode 100644 libcorrect/util/error-sim-sse.c create mode 100644 libcorrect/util/error-sim.c diff --git a/JAERO/DSP.cpp b/JAERO/DSP.cpp index 6e62705..cd4d7b1 100644 --- a/JAERO/DSP.cpp +++ b/JAERO/DSP.cpp @@ -525,27 +525,30 @@ double DiffDecode::UpdateSoft(double soft) double retval = 0; // if the previous value is a zero and the current also zero just return zero - if(soft < 0 && lastsoftstate < 0){ + if(soft < 0 && lastsoftstate < 0) + { // last value is negative so just return to indicate a zero retval = lastsoftstate; lastsoftstate = soft; } - // if the previous value is one and the current also one - else if(soft > 0 && lastsoftstate > 0){ + // if the previous value is one and the current also one + else if(soft > 0 && lastsoftstate > 0) + { // last value is postive so flip sign to indicate zero retval =- lastsoftstate; lastsoftstate = soft; - } - else{ + } + else + { // retval and soft have different signs, so always return positive - retval = std::abs(lastsoftstate); + retval = std::fabs(lastsoftstate); lastsoftstate = soft; - } + } return retval; diff --git a/JAERO/aerol.cpp b/JAERO/aerol.cpp index 8e9664a..8b90393 100644 --- a/JAERO/aerol.cpp +++ b/JAERO/aerol.cpp @@ -1008,17 +1008,18 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit quint16 bit=0; quint16 soft_bit=0; - for(int i=0;i=128)bit=1; else bit=0; - - }else{ - bit=bits[i]; } + else + { + bit=bits[i]; + } soft_bit=bits[i]; //for burst mode to allow tolerance of UW @@ -1044,15 +1045,15 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit gotsync=0; } else gotsync_last=0; } - else - { + else + { gotsync=preambledetectorphaseinvariantreal.Update(bit); if(!gotsync_last) { gotsync_last=gotsync; gotsync=0; } else gotsync_last=0; - } + } //for 10500 UW should be about 80 samples after start of packet signal from demodulator if not we have a false positive if(gotsync&&burstmode) @@ -1086,47 +1087,55 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit { bit=1-bit; - if(soft_bit > 128){ + if(soft_bit > 128) + { soft_bit = 255-soft_bit; - } else if (soft_bit < 128){ - soft_bit = 255-soft_bit; } + else if (soft_bit < 128) + { + soft_bit = 255-soft_bit; + } } } } //non 10500 burst mode use a phase invariant preamble detector - else if(burstmode){ - - + else if(burstmode) + { - bool inverted = mskBurstDetector.inverted; + bool inverted = mskBurstDetector.inverted; - gotsync=mskBurstDetector.Update(bit); + gotsync=mskBurstDetector.Update(bit); - if( muw > 250 && gotsync){ + if( muw > 250 && gotsync) + { - if(inverted != mskBurstDetector.inverted){ - mskBurstDetector.inverted = inverted; - } - gotsync = false; + if(inverted != mskBurstDetector.inverted) + { + mskBurstDetector.inverted = inverted; + } + gotsync = false; - } + } - if(mskBurstDetector.inverted){ + if(mskBurstDetector.inverted) + { bit=1-bit; - if(soft_bit > 128){ + if(soft_bit > 128) + { soft_bit = 255-soft_bit; - } else if (soft_bit < 128){ - soft_bit = 255-soft_bit; } + else if (soft_bit < 128) + { + soft_bit = 255-soft_bit; + } } - } - else{ - + } + else + { gotsync=preambledetector.Update(bit); - } + } if(cntr<1000000000)cntr++; if(cntr<16) @@ -1186,28 +1195,16 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit RTChannelDeleaveFECScram::ReturnResult result; - if(useingOQPSK){ - - if(soft){ - result = rtchanneldeleavefecscram.update(soft_bit); - }else - { - result = rtchanneldeleavefecscram.update(bit); - - } - - }else{ - - if(soft){ - - - result = rtchanneldeleavefecscram.updateMSK(soft_bit); - } - else{ - result = rtchanneldeleavefecscram.updateMSK(bit); - } - + if(useingOQPSK) + { + if(soft)result = rtchanneldeleavefecscram.update(soft_bit); + else result = rtchanneldeleavefecscram.update(bit); } + else + { + if(soft)result = rtchanneldeleavefecscram.updateMSK(soft_bit); + else result = rtchanneldeleavefecscram.updateMSK(bit); + } switch(result) { @@ -1410,7 +1407,8 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit } - else{ + else + { // its a p channel @@ -1773,11 +1771,11 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit } - else - { + else + { decline+=" Bad CRC\n"; //allgood=false; - } + } /*if(crc_calc==crc_rec)qDebug()< &bits, bool soft)//0 bit --> oldest bit } - } + } } @@ -1852,8 +1850,8 @@ QByteArray &AeroL::Decode(QVector &bits, bool soft)//0 bit --> oldest bit } - if((!datacd)&&(!burstmode)){ - + if((!datacd)&&(!burstmode)) + { decodedbytes.clear(); } @@ -1896,8 +1894,8 @@ qint64 AeroL::writeData(const char *data, qint64 len) return len; } -void AeroL::processDemodulatedSoftBits(const QVector &soft_bits){ - +void AeroL::processDemodulatedSoftBits(const QVector &soft_bits) +{ sbits.clear(); diff --git a/JAERO/aerol.h b/JAERO/aerol.h index 93cbffb..439bcdd 100644 --- a/JAERO/aerol.h +++ b/JAERO/aerol.h @@ -542,8 +542,8 @@ class RTChannelDeleaveFECScram ReturnResult updateMSK(int bit) { - if(blockptr>=block.size()){ - + if(blockptr>=block.size()) + { return FULL; } block[blockptr]=bit; @@ -558,13 +558,11 @@ class RTChannelDeleaveFECScram bool cont = false; - if((((blockptr-(64*5))%(64*3))==0) && (blockptr /64 == 5 || blockptr /64 == targetBlocks || blockptr/64 == 8 || blockptr/64 == 50)){ - + if((((blockptr-(64*5))%(64*3))==0) && (blockptr /64 == 5 || blockptr /64 == targetBlocks || blockptr/64 == 8 || blockptr/64 == 50)) + { cont = true; - } - //test if interleaver length works if(cont)//true for R and T packets { diff --git a/JAERO/burstmskdemodulator.cpp b/JAERO/burstmskdemodulator.cpp index c3ecd26..bf69554 100644 --- a/JAERO/burstmskdemodulator.cpp +++ b/JAERO/burstmskdemodulator.cpp @@ -445,7 +445,8 @@ qint64 BurstMskDemodulator::writeData(const char *data, qint64 len) int size_base = 126; int size_top = 74; - if(fb < 1200){ + if(fb < 1200) + { size_base = 150; size_top = 74; @@ -494,7 +495,8 @@ qint64 BurstMskDemodulator::writeData(const char *data, qint64 len) int maxtopposhigh =0; double maxtophigh =0; - for(int i=0; i < out_top.size(); i++){ + for(int i=0; i < out_top.size(); i++) + { if(i > 50) { @@ -756,7 +758,7 @@ qint64 BurstMskDemodulator::writeData(const char *data, qint64 len) double imagin = diffdecode.UpdateSoft(pt_msk.imag()); - int ibit=qRound((imagin)*127.0+128.0); + int ibit=qRound(0.75*(imagin)*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; @@ -766,7 +768,7 @@ qint64 BurstMskDemodulator::writeData(const char *data, qint64 len) real =- real; - ibit=qRound((real)*127.0+128.0); + ibit=qRound(0.75*(real)*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; diff --git a/JAERO/burstmskdemodulator.h b/JAERO/burstmskdemodulator.h index 697b08e..8653b53 100644 --- a/JAERO/burstmskdemodulator.h +++ b/JAERO/burstmskdemodulator.h @@ -41,7 +41,7 @@ class BurstMskDemodulator : public QIODevice fb=125;//bps Fs=8000;//Hz symbolspercycle=16; - signalthreshold=0.5; + signalthreshold=0.6; } }; explicit BurstMskDemodulator(QObject *parent); diff --git a/JAERO/burstoqpskdemodulator.cpp b/JAERO/burstoqpskdemodulator.cpp index 7f5e6fb..911cedf 100644 --- a/JAERO/burstoqpskdemodulator.cpp +++ b/JAERO/burstoqpskdemodulator.cpp @@ -694,13 +694,13 @@ void BurstOqpskDemodulator::writeDataSlot(const char *data, qint64 len) - int ibit=qRound(pt_qpsk.imag()*127.0+128.0); + int ibit=qRound(0.75*pt_qpsk.imag()*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; RxDataBits.push_back((uchar)ibit); - ibit=qRound(pt_qpsk.real()*127.0+128.0); + ibit=qRound(0.75*pt_qpsk.real()*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; diff --git a/JAERO/burstoqpskdemodulator.h b/JAERO/burstoqpskdemodulator.h index 59947c9..8a4ac29 100644 --- a/JAERO/burstoqpskdemodulator.h +++ b/JAERO/burstoqpskdemodulator.h @@ -37,7 +37,7 @@ class BurstOqpskDemodulator : public QIODevice lockingbw=10500;//Hz fb=10500;//bps Fs=48000;//Hz - signalthreshold=0.5; + signalthreshold=0.6; channel_stereo=false; } }; diff --git a/JAERO/jconvolutionalcodec.cpp b/JAERO/jconvolutionalcodec.cpp index bfb1fe5..1909cef 100644 --- a/JAERO/jconvolutionalcodec.cpp +++ b/JAERO/jconvolutionalcodec.cpp @@ -135,13 +135,15 @@ QByteArray& JConvolutionalCodec::Hard_To_Soft_Convert(QByteArray& hard_bits_in) for(int i=0;i255)ibit=255; if(ibit<0)ibit=0; @@ -496,7 +496,7 @@ qint64 MskDemodulator::writeData(const char *data, qint64 len) real =- real; - ibit=qRound((real)*127.0+128.0); + ibit=qRound(0.75*(real)*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; diff --git a/JAERO/mskdemodulator.h b/JAERO/mskdemodulator.h index 8f76044..87d28e2 100644 --- a/JAERO/mskdemodulator.h +++ b/JAERO/mskdemodulator.h @@ -37,7 +37,7 @@ class MskDemodulator : public QIODevice fb=125;//bps Fs=8000;//Hz symbolspercycle=16; - signalthreshold=0.5; + signalthreshold=0.6; } }; explicit MskDemodulator(QObject *parent); diff --git a/JAERO/oqpskdemodulator.cpp b/JAERO/oqpskdemodulator.cpp index ffd9d0d..cce0d79 100644 --- a/JAERO/oqpskdemodulator.cpp +++ b/JAERO/oqpskdemodulator.cpp @@ -409,13 +409,13 @@ qint64 OqpskDemodulator::writeData(const char *data, qint64 len) }*/ // soft bits - int ibit=qRound(pt_qpsk.imag()*127.0+128.0); + int ibit=qRound(0.75*pt_qpsk.imag()*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; RxDataBits.push_back((uchar)ibit); - ibit=qRound(pt_qpsk.real()*127.0+128.0); + ibit=qRound(0.75*pt_qpsk.real()*127.0+128.0); if(ibit>255)ibit=255; if(ibit<0)ibit=0; diff --git a/JAERO/oqpskdemodulator.h b/JAERO/oqpskdemodulator.h index a32a520..a812f0d 100644 --- a/JAERO/oqpskdemodulator.h +++ b/JAERO/oqpskdemodulator.h @@ -32,7 +32,7 @@ class OqpskDemodulator : public QIODevice lockingbw=10500;//Hz fb=10500;//bps Fs=48000;//Hz - signalthreshold=0.5; + signalthreshold=0.6; } }; explicit OqpskDemodulator(QObject *parent); diff --git a/libcorrect/.appveyor-install-tools.cmd b/libcorrect/.appveyor-install-tools.cmd new file mode 100644 index 0000000..6a3a3de --- /dev/null +++ b/libcorrect/.appveyor-install-tools.cmd @@ -0,0 +1,47 @@ +@echo on + +if NOT EXIST C:\projects\tools ( + mkdir C:\projects\tools +) +cd C:\projects\tools + +::########################################################################### +:: Setup Compiler +::########################################################################### +if NOT EXIST llvm-installer.exe ( + appveyor DownloadFile http://prereleases.llvm.org/win-snapshots/LLVM-5.0.0-r306282-win32.exe -FileName llvm-installer.exe +) + +START /WAIT llvm-installer.exe /S /D=C:\"projects\tools\LLVM-install" +@set PATH="C:\projects\tools\LLVM-install\bin";%PATH% +clang-cl -v + +if DEFINED MINGW_PATH rename "C:\Program Files\Git\usr\bin\sh.exe" "sh-ignored.exe" +if DEFINED MINGW_PATH @set "PATH=%PATH:C:\Program Files (x86)\Git\bin=%" +if DEFINED MINGW_PATH @set "PATH=%PATH%;%MINGW_PATH%" +if DEFINED MINGW_PATH g++ -v + +::########################################################################### +:: Install a recent CMake +::########################################################################### +if NOT EXIST cmake ( + appveyor DownloadFile https://cmake.org/files/v3.7/cmake-3.7.2-win64-x64.zip -FileName cmake.zip + 7z x cmake.zip -oC:\projects\tools > nul + move C:\projects\tools\cmake-* C:\projects\tools\cmake + rm cmake.zip +) +@set PATH=C:\projects\tools\cmake\bin;%PATH% +cmake --version + +::########################################################################### +:: Install Ninja +::########################################################################### +if NOT EXIST ninja ( + appveyor DownloadFile https://github.com/ninja-build/ninja/releases/download/v1.6.0/ninja-win.zip -FileName ninja.zip + 7z x ninja.zip -oC:\projects\tools\ninja > nul + rm ninja.zip +) +@set PATH=C:\projects\tools\ninja;%PATH% +ninja --version + +@echo off diff --git a/libcorrect/.travis.yml b/libcorrect/.travis.yml new file mode 100644 index 0000000..a536008 --- /dev/null +++ b/libcorrect/.travis.yml @@ -0,0 +1,12 @@ +language: c +matrix: + include: + - os: linux + dist: trusty + - os: osx +script: + - mkdir build + - cd build + - cmake .. + - make shim + - make check CTEST_OUTPUT_ON_FAILURE=TRUE diff --git a/libcorrect/CMakeLists.txt b/libcorrect/CMakeLists.txt new file mode 100644 index 0000000..fe8bbb7 --- /dev/null +++ b/libcorrect/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 2.8) +project(Correct) +include(CheckLibraryExists) +include(CheckIncludeFiles) +include(CheckCXXSourceCompiles) + +if(MSVC) +set(LIBM "") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4") +else(MSVC) +set(LIBM "m") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -std=c99 -Wpedantic -Wall") +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3 -O0 -march=native -fsanitize=address") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_pie,") +else() + if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") + endif() + if(CMAKE_BUILD_TYPE STREQUAL "Profiling") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -g3") + endif() +endif() +endif(MSVC) + +find_library(FEC fec) +CHECK_LIBRARY_EXISTS(FEC dotprod "" HAVE_LIBFEC) +check_cxx_source_compiles(" + #include + int main() { + __m128i vec; + return 0; + }" HAVE_SSE) + +if(HAVE_SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2") +endif() + +set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) +set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) + +include_directories(${CMAKE_SOURCE_DIR}/include) +add_subdirectory(src) + +set(INSTALL_HEADERS "${CMAKE_BINARY_DIR}/include/correct.h") + +add_custom_target(correct-h ALL COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/include/correct.h ${CMAKE_BINARY_DIR}/include/correct.h) + +if(HAVE_SSE) + set(correct_obj_files $ $ $) + set(INSTALL_HEADERS ${INSTALL_HEADERS} ${CMAKE_BINARY_DIR}/include/correct-sse.h) + add_custom_target(correct-sse-h ALL COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/include/correct-sse.h ${CMAKE_BINARY_DIR}/include/correct-sse.h) + add_definitions(-DHAVE_SSE=1) +else() + set(correct_obj_files $ $) +endif() +add_library(correct SHARED ${correct_obj_files}) +add_library(correct_static ${correct_obj_files}) +set_target_properties(correct_static PROPERTIES OUTPUT_NAME "correct") + +add_subdirectory(util) +add_subdirectory(tests) +add_subdirectory(tools) +# add_subdirectory(benchmarks) + +install(TARGETS correct correct_static + DESTINATION lib) +install(FILES ${INSTALL_HEADERS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include") + +add_library(fec_shim_static EXCLUDE_FROM_ALL src/fec_shim.c ${correct_obj_files}) +set_target_properties(fec_shim_static PROPERTIES OUTPUT_NAME "fec") +add_library(fec_shim_shared SHARED EXCLUDE_FROM_ALL src/fec_shim.c ${correct_obj_files}) +set_target_properties(fec_shim_shared PROPERTIES OUTPUT_NAME "fec") +add_custom_target(fec-shim-h COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/include/fec_shim.h ${CMAKE_BINARY_DIR}/include/fec.h) +add_custom_target(shim DEPENDS fec_shim_static fec_shim_shared fec-shim-h) + +install(TARGETS fec_shim_static fec_shim_shared + DESTINATION lib + OPTIONAL) +install(FILES ${CMAKE_BINARY_DIR}/include/fec.h DESTINATION "${CMAKE_INSTALL_PREFIX}/include" OPTIONAL) diff --git a/libcorrect/LICENSE b/libcorrect/LICENSE new file mode 100644 index 0000000..8bb8fad --- /dev/null +++ b/libcorrect/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2016, Brian Armstrong +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/libcorrect/README.md b/libcorrect/README.md new file mode 100644 index 0000000..c0ebbe8 --- /dev/null +++ b/libcorrect/README.md @@ -0,0 +1,38 @@ +[libcorrect](https://github.com/quiet/libcorrect) +=========== +[![OSX/Linux Build Status](https://travis-ci.org/quiet/libcorrect.svg?branch=master)](https://travis-ci.org/quiet/libcorrect) +[![Windows Build status](https://ci.appveyor.com/api/projects/status/i3e84jmj00fa5my8/branch/master?svg=true)](https://ci.appveyor.com/project/brian-armstrong/libcorrect/branch/master) + +libcorrect is a library for Forward Error Correction. By using libcorrect, you can encode extra redundancy into a packet of data and then send it across a lossy channel. When the packet is received, it can be decoded to recover the original, pre-encoded data. + +libcorrect accomplishes this task with two algorithms, [Convolutional codes](https://en.wikipedia.org/wiki/Convolutional_code) and [Reed-Solomon](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction). Convolutional codes are robust to a constant background noise, while Reed-Solomon error correction is effective at dealing with noise that occurs in bursts. These algorithms have played an important role in [telecommunications](https://en.wikipedia.org/wiki/Error_detection_and_correction#Deep-space_telecommunications). libcorrect uses a [Viterbi algorithm](https://en.wikipedia.org/wiki/Viterbi_algorithm) decoder to decode convolutional codes. + +libcorrect is a performant, BSD-licensed library. It is also the author's hope that this library's contents could help others learn how its algorithms work. + +Design goals +----------- + +1. libcorrect should be a drop-in, BSD-licensed substitute for [libfec](http://www.ka9q.net/code/fec/), which offers similar functionality under the LGPL-license. Although libfec is a fantastic library, the state of LGPL-licensed libraries on mobile devices is somewhat uncertain. For this reason, libcorrect is a completely new approach under the BSD license which supports the same algorithms as libfec. Additionally, libcorrect can be built with a compatibility layer so that libcorrect can be linked in place of libfec. + + Achieving this goal gives [libquiet](https://github.com/quiet/quiet) a fully BSD-/MIT-licensed set of dependencies, which gives libquiet more flexibility in mobile applications. + +2. libcorrect should make it easier to investigate how forward error correction works. To accomplish this, libcorrect provides tools to test the fitness of convolutional codes and their polynomials. Additionally, libcorrect should be written in a way that leads to easy understanding of these powerful algorithms. This library's roadmap includes more documentation on how these algorithms work and how to increase their computational performance. + +3. libcorrect should explore further into error correction. This goal would help libquiet operate in noisier situations. One approach might be to use parts of libcorrect's Viterbi Algorithm decoder to create a [Turbo code](https://en.wikipedia.org/wiki/Turbo_code) decoder, although this is just an idea and may turn out to be prohibitively difficult. + +Build +----------- +libcorrect uses CMake, which allows for out-of-source builds. To get started, make sure that you have CMake installed, and then, from libcorrect's source directory, run `mkdir build && cd build && cmake .. && make && make install`. Additionally, if you would like the libfec compatibility layer, you can run `make shim && make install`, though do be cautioned that this can overwrite an existing installation of libfec. + +If you are on a host which has `` available, then libcorrect will automatically build its SSE version as well. The SSE headers are provided under ``. For now, it is on the caller of this code to ensure that SSE is available and can be used. libcorrect requires SSE functions up to and including SSE4. + +If you have any questions or problems with libcorrect, do not hesitate to open an issue. + +----------- +I'd like to thank Ryan Hitchman and Josh Gao for all of their help and rubber ducking. + +A huge thank you goes to [Lucas Teske](https://github.com/racerxdl) for finding all the ways that libcorrect was broken on Windows and to [Denis Golovan](https://github.com/MageSlayer) for finding an error in the returned length of the convolutional code decoder. + + + + diff --git a/libcorrect/appveyor.yml b/libcorrect/appveyor.yml new file mode 100644 index 0000000..e741a3a --- /dev/null +++ b/libcorrect/appveyor.yml @@ -0,0 +1,51 @@ +version: '{build}' + +build: + verbosity: detailed + +branches: + only: + - master + +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 + COMPILER: cl.exe + MSVC_BAT: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + MSVC_BAT_ARCH: x86 + GENERATOR: "Visual Studio 14 2015 Win64" + APPVEYOR_SAVE_CACHE_ON_ERROR: true + DLL_PATH: lib\Release\fec.dll + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 + COMPILER: "C:/projects/tools/LLVM-install/bin/clang-cl.exe" + MSVC_BAT: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + MSVC_BAT_ARCH: x86 + GENERATOR: "Ninja" + APPVEYOR_SAVE_CACHE_ON_ERROR: true + DLL_PATH: lib\fec.dll + + +install: + - call "%APPVEYOR_BUILD_FOLDER%\\.appveyor-install-tools.cmd" + +before_build: + - if DEFINED MSVC_BAT call "%MSVC_BAT%" %MSVC_BAT_ARCH% + - cd %APPVEYOR_BUILD_FOLDER% + +build_script: + - mkdir build + - cd build + - cmake -G "%GENERATOR%" -DCMAKE_C_COMPILER=%COMPILER% -DCMAKE_CXX_COMPILER=%COMPILER% -DCMAKE_BUILD_TYPE=Release .. + - cmake --build . --config Release --target shim + - cmake --build . --config Release --target test_runners + - dumpbin /EXPORTS %DLL_PATH% + +test_script: + - cd tests + - set CTEST_OUTPUT_ON_FAILURE=1 + - ctest -C Release + +cache: + - C:\projects\tools\ninja + - C:\projects\tools\cmake + - C:\projects\tools\llvm-installer.exe diff --git a/libcorrect/bin/32/libcorrect.a b/libcorrect/bin/32/libcorrect.a new file mode 100644 index 0000000000000000000000000000000000000000..b8fde09b0a05bee5fa66b744617ab2c08f300822 GIT binary patch literal 48668 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‏9H8W6+MnqvJlUjXv!OG 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�F*dU7hQpEKQlA-p> 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 N6<%4|xt8hj{|{9}!%F}F literal 317677 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 z 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
0Xqcy#^8t?(8+ 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

AS!r19sfIj1$s;`)W_@LyY|dW53MUA7Sh#dSc(s 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 Mou_+#(2tJ%A9DcgMF0Q* diff --git a/libcorrect/bin/32/libcorrect.dll.a b/libcorrect/bin/32/libcorrect.dll.a new file mode 100644 index 0000000000000000000000000000000000000000..cfffabf56dc71aec3a354056f3df90a3e1a6a0f1 GIT binary patch literal 55974 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 literal 0 HcmV?d00001 diff --git a/libcorrect/bin/64/libcorrect.a b/libcorrect/bin/64/libcorrect.a new file mode 100644 index 0000000000000000000000000000000000000000..f12882017904d3f4eba6f166b4a79e25b2523446 GIT binary patch literal 46968 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

(CGt&=Sl(jBp@%Ns3rUi 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 HPj~(wG2BMY literal 362167 zcmeFa3w#t+mOoyV?j#)uR?whPKw51y83EG>P8wnCO1eWebTkS$_)J0`5DiJ2bd%s~ zf}LP$%XTvAxXz5b!>BXktd26S!^78f5=aOr=Ap=A)PRZ=0vcuH_uHTOd~VLId(VBHd+xdCoO`P}@8)LC#BrP%Arj%ZO@Q?0WdFbWUp=zVn)1q7 z+{;OCU9^e!zID;!73DQnUv<^;>Y|m_;-bpRD!+AEskJ&#X)Uj`x~^MfU0GF9I%C|p zF*d#Gd^g9HtUZUD{%Ge??pre#pTKd0+@;pBad8v53LvdRNanb%a{yBixV}pI&*E`f zzv(fa!vp=TkLNhlQM)pMjf>-~ELkf{QC3M5L{qvrZsu4#^`U)~kN&OWI2Bb!|5A8v zMfBnHh?V2H^wX2M*YTIWZ+=}!EkF4EXz`+>(oF28U_Ns+$@@udh{ zJpv888X@M-$>oPVoD-6#l)#_t32klw^9vY6z>MPgq*qrns--7VO zX?WooIX5h(R7RIUM2Ify5MutEoHIPbU%~pP%^@a)@Sci6Lexq9t1hjmD(1Ag#+);} zXGY>>W?wN&OB=Z4|sK?JV)53kiVOR)AGh z>Cm5(Lw&PmvxJOG0Ia~X0X{wo-s~STycJ0R`M{%jd1WM?Gy94kW->f1K`NZyyV9> zQnl%gJs$bZJb7#2ZYBP)7dfsmEId2~*g=(-l*unWz;X779Dg@*-e7eo(_iW4xPipY zDyomXE6FDYCE-t3N{!*bVM&?yGZat~gD2vIhJ$Ew^A!A3x0GYg(tD78%k2fXiMNWk zwUx~frZgZMZJpv-cHqNONik0)CP&*>p(;u7S?m!>neL`W&l9H96TakV7a9^#;V7N> z$bJmn7^8QC7aAr5Pf5hE8ookN>KhWzLt^7Gp`nLrQ{t611VF~He_Wodz7mIIue?9f z6^#GM3mm8Q4wM|~ygl51MI;g_6Q;O;s!aU@YVat@Hns1^sH!n6$y@#Ny~_08u=G4m z-A3thyA=G)B00XQJx5X!sJYK6A<~7URYxSbUoC>n^K`h;K0&jMpgr7?NKksvbUGD< zDNb!>`s1Vh!Q?+^>bFIo!5BBO5su3S=pf2*>SbuD|H!wIh&D%7di(&7Ku*?>zp4is z3D=H9B1r!ZOHb*NB&85 z!g7uif-{PDrBO#vG+Y*D5G{SJ)>~~%_SlDKP;dWa4VUo{RWk(`=mVP`gMWjEC2-xlKVhuj zf%dTNkHH9~{@;Mc&0g7M%aRw{W=XQwmacwt1Lh&^R^l_HE0nGvo#Ed__)8@Dli2k{ z&m=OW;Jg%4QT&-wXxzqouwEzp%Ug^+{Z~k#3IC21$dbr}W<4lGE=b<1G z{kHzl^@xSyAIHE3-Y0(3+G~#fX_7>ecZ3%3@-8)0O7)r~dAD3+K^0gvZIC)c^p=#Q z{yHET>tFn_cw?+g@+hLkqnz(iGV_!=i=<>o%4&-%yXC_*KrZ0r#>ES|uLnWo$ zA3|Q=xX2#%Qad+Tz(@62kp1UN%3T)!Rhm2(aj{V^pNU~_HU71r`|?DAcTf+;D@(h+-Tq4V~1FZwlRAB9}u!OUK;2v zG5aNv${xnN??uH6cyw>l1q0^|tuIVxPP=(LCpyB_7d2p|wE7R{G$oH0Hgvl9J!NZ7 zf;M|1zydCs2A%(7-- zLmou%yTJ}#41UE+EeFg@lIF=@NWraq(?hH-m)tM4>^IA=B~ur@^1Ze~Z|Iq1>Zc_8 zZ7a%zs)th96C`lDkm0rE3mNy?e3Y(XK`3WZx>LRU>qx}$wM#w}Xz(bhwlYb${|i?r zhc6T6TzoW6Eh!`_H827S<1>YHo!03Zt)(?vXbOfz1Z2!G`8n!*X=VRH<=w(}OtOSNIS2l=Ic6`E z1xhue3@XZjO??a%l?kEzp>qO@TD0upy$#w_#^){MbXLireW`mZW3L^5-D$n7vbc zbxnPJz3}33T_2Lal#lY?dW08yrItgNiE@|N(q|Dfx?CA;nD)h!(W}%X3B7S_tL>FS zw-T!?wpraWx`DOml`CvknuL#`e@U1bh$2ibQqXp$;s%wLWQFo0>f+<4=jUtrODTWW zu>AH$asi;QyHJu<)Ug7amt?HUw&o#utL=|y^`>-5-YF>_s|3!rs*gcuqkcU^P{{?t zjp!8?my7y~o~vITqaI!BRLeD#e4s2Hj`B7`$t^_Ais3nbMo#@3tdjw3v=C-nGSR*M z$*itxefE9o*;=$tO=6L?^)w*maasw(>ndlhtkvY(6;?Wjk~U#FGVR#V3Bm(!<**ewP;SqIfBbukAw|b*Kb}5o_yLM69)gTKA`ZPlM*IwVkTHXE4~t6SJuY$X9?Kqt!t7W^ymt z_t_(A8zqOv9jGEO{R;qZXzCFF^-q*TlnRU+xF%G0_u#{!o2`ilDvF{0IgDULdU!3F&B_wf!$Z2uAoo7aG|J z2R999`um8W(hmUC3a!yy6!#%+?+o6*A`+M~Afg4-qTYf;CXkif712T3K+{6`Lo|^E z75x(^o!w|(y@D!34y6zL1x>nGlkkRwrq9llVc$??jDMNO>s7B=M8v<dZ{hYsJ! zntzhwgNVD7hpA$BW2eyY3&!)_Pzh}w70_ft^B!Yknf?t-xWw&q^vBje1Iu2>J>*}JIRB>hA!}|T8?fgY4tm6HsCe<2^x2OvqYyS zjpbhnan%pdOOlsSQhp3lb`dGNfUIXSQof2l9Dwc5`e4!ekVNhNGa-h?t)%#`5Z5HD zy|b|=aPhzbWBm|!-#4s%lE18d5;~{1pRct~nbG!_>Fv)ug$UTZ7(hKwYkwofCsO;2 znizk|!1en0wYkfIB<{jkF-f$wXp5G_Axw{xY9CG>Vkcq;CK%<^ZP9d0#OoO7`{ZE_ zZpk+`dhz!D$AA-cb|9krPFF|@tb7@q+3uC!_Byr-571`p&DcuTa9C{4FlB{ax=h!5B?45e=>p@BChL@_N?sq{WGjmPm^Fr67_q!yyyS5KCr)Xuu z{!3x0!2Unit1K)elng9`ZYslPH<=R&Q*w0GzOR@-;}t~XwoOp1BLjmm1RiGJ1P`Ob zVhZRiDRMJ>O2q+fGt~l+(_^XN?9FrH}BGM=7x*NHT!_7`h5)npe3q zMNuf(D<6_B*Q$f3LROg4;n*&$eGwDsg1M>LQ|!OJ$Iu77$}PUe9x>#%Mc`sd9xF8b z4Cs<_CwxDP(wRu}YCRgr)cjA!{Bwy0aWK_q%_OG;-wtQRF}N`NvpINrT=s2_?po|L zE%Kl!@66anh?!J`{04t<+mE4;fwyY6J8P%VKz$7*pY8ZUSUZt=tFYdauxol5S)Srf zcW9EsEq6jsfHws_{oI?e6Vq)S$aObF{C;ZV2l!`>dxg|^SH_pHuiVj|xn^_jOc+}O z#HIcvG&FrwQm`L{z7q=go;kt$N34Qbhiw%fTkbCFE#OW&nG)7drUm4Q%FJaCX7wlN>F=13oxF6*k3S zsH~wy3!B;9(CL!5`P-VM;(sS%!QtPO2TGx9AG$*3ABC=qU|9}&2B~xcoZF|5nShII(6{6N@SGxH_m<3csjx6}$0y0(QhAoWRP!%c+yadA8u4wG^ z7Pr)0JhXp$H3r8lz|F(MlverR$w)wDVh8Kb16PZQF~3*&74=4hc7(o+amhQynX|@< zO*4&dHYJbI=}-0*=^eg^nL4vxjXGT zX1HTM*e=^oZj_EVs?{lEK#tKrYo6kIpHtTyjzqv`N%CN@9e#&N2~gO1L-T#r#Ycp6 z^u=*pcnpSsCV=QLiurM){yX^2S9lb1Y+c}itBr|RJY+C|t99HExG|zr$fzKf(5=)d zc!JbR`{6pJM%sqy?>-V{%4#1uJ$5ivB;<=IaN3dtkp}_Dx2k4ci)T2YU}b|WNX3ST zo@44ss6n<-0qhv?S`b~7TM!;4kw(O6huRXPs=P`udgzBMOV;-aeG8CJ5!*xhe?cZR z+cFp#onE=bwnDu_Wd|O}wja?~7nVP<3W^w2#Iu@ehE^m^aR^~K{rQ3Phd8+N8R9g zYMy0@O=jB=(H~T>uEDszA!*u%qm;eT^)bZHE~NsrR*Ee4BXHph8@|Mmg$K@Arq(sw zi!RXqhc;5vAqC42aoNaEn3@V5G)e*_Ofn6e9j%{4k>q&Wf0eLdyeRhwFYc0xTlJyS zu-T|Zxm|2Ih#|LQYt-9_lhZ(i&0w@ksuHwOx2Zf7L8jF;fbeHG>hX?L!{fhca`<&^XT?1&fx7hD8g7 zunvDj)VLp=H0nbqzdPl?_Q;j|H^IjYr^FFP_5pb4S4oocBU0Vx z0m~zsKOko!Sz<8BU51ek*@rYIEme3tQqw}WK}5Z;?mejY!0~nUpEr}E1}>eiB-R01 zvGAJ?qz>_$@&ZewE~CA-7#?;LYDsT2+928i-Dp!`>hfLGknUL7gsCJ_9yxG2Gmt+> zn`v?osoNP!lsfWSD^fw{bOOOG&f%OpY(HId_z4Vv9X+^&jE8LXY&c|u;GootlNFi; zW{g~j8ya3Y40}YnTuiCoOstJY;8_o>6+kiIk6{ns9c7<%4C5CGG28cTM2a@BsM?PNr zmI&X5qPL}Jb(2oKnvFAfuPux7+r6~LyvQYrdP2!2>?iezV$2?S(327NIIxYhlDf;g zn)uqkg59%7zwo()bbVshY@yj2nog*tWzEE`nd&MW645fw?5}~mC3Rqr8VBcr%(Ph? zcSi5Wz@TYHEpjWYuym+$n3eIgZCH@84jHZ{^LTAbcC^;?&~7F_`Yh5lL-Ae+B=k(8 zDFBgzRKnQW7?$QF&DS?G%7QV<*c$^516#cu-dpTY4R2D>=w`|MznC)Yw8Dl(=No#8 zwyo3ZKyfBswEbJ%io+BdYlIL~t5GqrDli=Z20~#{5(`em*|iv49J!obr#ASTXL`2 z@@dT~4Ys8ONtl7wLc>i7l$zmjsKSHyvN+T}M~CoW6&}2D3$4nGmikxqMTwImp}~x- z(--BJ#-ePEF3Qxi-AyS&i}Kvj7bKbFj2^NI!cwP?cg2~+ADG8uO{6gU{XNZoZ;XiY z*ZO2j%5#JY{i7IX@;R8qMd|)Z)U?4hj&^c0+s@-e;l+1G-IceBEuUal-s;LYM7uHy zq(JjH9}#wxZ;mTl(+brG_YYdN+M3MlY)5qLsQp#655e_BW989J1VRt7BSuZhErykR zg4X|1EPi$xOh=H-3{N|pBnJVlx{=4rxK4!SO7jC@6C^oIap=cG$Bb4=sZ$5~XlZH( zo09UFjd}s0=JP7|LW*?Y#kc`6wr#e7_Ken=t>wmB1Nn~}^3?tYKs zZxX~>yR+d4Ra_{cE+0wIOnKr9H8k>IN4)%i4fE1L9&b3N%K-!M_)|)QXVt zn5~|$z(eZ*Ro^}mDaF{x_p4i+)SG*Jd2$~+K;P3bbMNqfvb=5sewfDcL4`O zse`rGuSs0sKUEDCKWfqRrcrCz+37J_CSfofoHjTKQb?J0H99-vx{ z*uxesh)OeRG^*Q;=q^nVv30$k`vilBjFqe&+B4KH4MKU2O1PA#2~imTsy4wx%bnV$ zJqSxF{fzsM8=EU}9Hbhi_mKMjkEm;V)Y~xl|N4I9L|s}hWv!PDuj4rSA6sz!|AZo> zAM9bqs-`Dgi*9>~`!!`@A9hh=Q9?QWu65bphBHU-r?$<_MBSQ`HF{r9l6Nt0>c6d*nW@KRvJ5v}8>bLnIrDF6G8BP*eOl#-44pGM!8NPPk zsb4|OG5#Sqx!iI%50-!Gz#{aIt{?E>u0wf_)+XLBx|EyDa#ygAAH%yt3*mu0X=#G< z(_;?o@+uzam^WFdMAxC5Ci7S+D5mfzs5gu*1paaq%{pWHr-;TI>f*zBjvax|L@3kz9uNBNPvMU?@$yY(?TQ%M!w6D58M|@G&?~o< zb*oa#fGJPj>or}Efx)t9gsUuhuh@i3)IUL^xW5!9Y^a8tv6T(HH1Vj_rY$Jp4W}*q7*^b{%d!+HpaU zHgwi|t@GW1&zsWRBhqCUj6Ix}LAnZP z6f=M(SbzqN3dle5S(H95FdU8(a7c#(pbg_U6J1;xaFjbOy$2*kN@+>~tKn*_Glka| z*wNVgB*KPn97c49)x?(liAjjHoQx0dkJDnN;C?g3x=#l8Tavcn1R%ISh2XoiKwA#P z2M;)d`>jdalDfdW^^{2W{Jo)ZUxAt6iYjY%$t~&=@Y!Ph@E$A*4_z6>&45o~dZxoZ zIbA-aqZaio2i`iG_b{;}?xzNRfGVHTs-z0%k5*xOd;u_sqx~1+4x~rE+3Jz2Q#>8n zX+#u20=VB3=asvtby_2kf7e?fPoPtX3=Q*(D8p>xk>7tcdJ-c~=>DiDP2S~^cX)6d z5`2iNL~|~=Q)E67vG)L5zGCnYFJ9E@QF1I2j@mr(LR@HF2)~?*=jCo!MyJT;3g~c@ zH<`pupbD3P`LzmZ+E{t15)KhT-e-3 zLNL$Kk|*z|-d)zB;wq>;d`nyGd0EW+9P(RoFO%u6P|0NOl`PZ^ufH2t!_Gn+_PCrb zFEzX5D?h}?TJ=u zudP|R-U<<)Cc#b1N$4QX3e>)0(jk(X4uH2R4 zLVq9|U_mM#i~kxJ7HK$Yj1V&%Ve(H5W#jraY$w+i%vYC3KIKvF{f4Wbo5;zk;BFT| zn55S3LvF|JK(BJAjquS46cJo4A}r3}Pcd${49D|6@i-1D=l(##2^w97uP2H$9>Xc4 z@bfK6@HpqBcOS}avZc|+<8^%KzY5-C7o2#FVb(9)+;+?FT&I+Lf)$lUH!!!zUD{*) zTr(GV8AcUk-=AF>TSXkukrpp^s-&Z2+-Vy&%aAL@rX@pmcnKBaOn{57TUFca7nH+5XFnyT4OT<^TxogG+XG~t|4Vb*WG}FYW_4SQ;4` zIaqMJ^>@DHd#s?nm3CBWpS?c@cEim?iyFC-me0Zz^%zCq5hld`emq3^m*Ha*OViG% zP%4iPtG@$^OUc19T8PtrN_mV`m18klB|Aay3RQ}>8;A~^GG2moR~C2Ed_%93v8-J! zP%*JCWih>t?o%*JUL+~m`w3>nV~^O68RelaqQS;}^4E+ueyfP3mw(ajqr#@}v%EYg zxLYtCJl`oMwR#~1{fk+%p9zr(P_ zP%hpY8pJCGtlQqut!vF}eZx4EPb%gh_LT0iW(9Y%L&*=h@OB99)ST^-ldx|=0*SIK zgp*smbt0!=mo|gp@*Hgeycn`W@5>%_j@AXZ&eh8hl~3xTS%sb<2hh8f7HoO)eW{Xs zTbjHCW>3K24E7QpUO#!2_PBvR#-85}@k^50WoPVSQ9HDVR=j^Ro}&DM>4P$u29?Ky z_W@Qdq}O#I=d@ufo>WO$YSlJk6aoL|D(0WMorNuXDAD;>PGYvOD|ph7VgvfdosBI6i8fCB7I58agzHSq=DBJ zPZFyh5!AvC8E}sX5u8rt6jH>go)1|_wy;`%f<@}o_n13+VHT^jf6o;$^K0;fT1=xc zM8*c7Xi5mXpA&L*@sjYOXc_rF6m#K&NRU1$*M@9cK`JmN%!+rR!!HO`T*UX%rCTcs zS6YIfL#>8Eq?(+^wkFbz9k1XDtH1n$dU-8QV{pmzkh%|cZC>NYLIb%2-1Z~T8<6P= z&C<^3=-mSKQ?h+G?56iDQMoJWs7uMUT=X^EX&X|T)zzpl&v7`=K~6#3n2h*m56K6V z;i*RJMPE}P5AK@i#j;sHa#JJ-GOwer_FckKliAf>6_g{9Yb-4LzJaGS`V5yhYfe1} zRTczs$y;lM5rv>jUg)OND%?+;jfk2)gIFZD4jHL<#v3*1su^iekh)d>#cVy{MLQhj zoy1)dvkM!i`nTzNzGHXoN9?vQXygseJ_6oS-$o`XdmC|FGwh?JmkoSBtZ^jZ#TBpo zg-iY%hi1@UA_OgaVB7KEXpUa`vzQodp z53_#(Fox(o?0k#vdj(ggfDPV)Q>h6PoJRuH1~G-#OyN1SB8dY`Cnz+GMF!)A#fSuv z%!`^=SaH|ENd~W?&r05^x^%Jklf2?1d3dR=VI7KMhtcgvN&Z0U{)|=fB{CHE3cN1d z2=52Ty~IMk7c43_mnXcqJ+HAxNyhnEA2P2CO-d%M21jF1A7OB$p3~hg2KV#g@jY+| zbhj0%qqr286~+T4d-v zB#7FI)d_EHI^9RbhR;^F8{7vUD$WufX>~lwC?x!IxS>^O{E8N}E@z^*S|D${iW^5o zxN1eCz-ty=7=o8Sp!(ri>i28SaTw*aE0eS2ZP-;?`fo=n-f{jh%gjp$8PvxifMD;S z6Vv)1LrZ6vzcq(9fi@%(WE>(r#I6F+i(ky&9=e&=j4IrDK}A{Q5_d`&xLZyZmgM-r zh19u1a8?}0<%Dq5(5+HRCc-T3ln^mV3ckjwLn{reerzz9lNV7)$zK62xWR%bncHkr zupeO}2zx|tA4D+}?q{@K;r0>r3ijrgcon&yDB}&y$^i>|`9tcB7%z?yZ5B*Vf_#D% z2S4L{&1m#xy>SUA)%p2eWrfqLloeu;K-xaUCWf6;kn0)}`7zxs4M#Mb`sC^)=|z*e z!Ye;-tH*;^e#W+rL0l!Gn>apo9h1*Si_SVQvK1_yKGX}zr%uE~!s9;|`u^2^+bq1U zmM#Q;jf%AWc0ODtV(3mYod@8~UXHRj#N`MZCtZhEL9b@CaVw;2K+C;OR8k+Cub3M` zv(CxIi=t&N$IjY#IJ4}LmP09GiwdvMF1{DGQJGs#URCDU;cS|lNjo;vJZjDC)m(@L z5$Z}=j+_kD{rzk>I|2{T+O*J$y!u|-Ea8FWjJ33Zd9hzA5*)KmtNJzx(uQebATbXn@R8D*l;DLkK)NwdL+&3hJao%cFrtL$DWa<5sj-F@J zVi8`%{UMDDJn~T-CO3A9@}Peav(53Arba)B2N$-27wKkB8Z7kV*hG3Vx_)8r!hKl2 zRm7ROon62%mF0m>De}oDflUJ+uzf76YfjXfMlOmueV6`GH zrK?ul$HiG(*vLSl#?{2ja*NQgl609c`e$#&%IztWQ*&r{a1 zWve3UvA;gWBfo_WIkX@Gg|q`5corl?6&YO)EiSATv7SP+uECuf;w|~x?#}?}0G&`n zH%8=L8MrSn=n1XjC4P|Jm&{~(hDJXRq?t#_^SO{d4Lg`sQdXp^WpKO0F+_M-9wmSU zd>D&S)TD32OvLjbw^(1@_K2~1uZD}?>!sJDu_8}m$?lRub8|%~`*5eKPklyf)@>=1 z6Inr4%H=pw`xY3F1o^bfA7XvhbW_okmjVf%r`*QLC&b?U@W{aN)BPDZG`(gut;%&6 zA6-6J4@j4tu+nd}Wx-Jcg3njxK8iJyy0|RclzP8gnHz-2!nH5#!bmaSuU%d!!{`O%T5QNHT#f0@ZJK*d^`Gb(Bx?v9P7M*QFbXR!GpJpl5}xaH{g1Rc z2e=*@ztHd;bq*6nB+Tr891IOii`J~z`>C7Q+=68WvEU_6Z^VVlz5Zp*7%~`~T)z#d z0d?@WK-SZJh}b)mJW%5Cz1YBdT;Oi-eak6qU|saU<1Kl-_f4!GuI?<$m6LBLzkwSj z@Y-L~dSWdEevR5=GiyKXUqiXUElY>3O!PKgq^;#@+}fnB6Qi?vGnjh;iVbJ(+$eL; zK%T~5G5(bmUfjvozEmRbXcseK9m?;q*B_y6x#WJg{3iC9;%zE7m3D}+FlbXqbq2fU zWI^vy`KGc!3f)PoEk_~~AC3fR(6jW>`d}OHDh(Ns4Red^HmU9YG zCrruSgYro*yj8soqeErL@u}m9>E)a{(1P85XJ0}YvTy2F!}b8H`k0Zk3m?>gkrTjM zS2=i7ofK#g-h-DTartBueF@BSd{C6Pg;Hg_F=-a@Zh^c9cgWQNqBdEcQ1PwO@fr&| z3xrA7uI96wQ48zT^Qb3e0qi8=<17;<%O3SE7#Gn88}^>)!$xKwEW+AFnK_V3q^CzU zURWVR`he!o0FUBrY`Qme{4Tt%4uuy&hR(IJB-pt>!o^+;2=1aDspWH%cr2VKh33P8 zaGyYv>PcLsr1hE=)%cLgw#_fpw=`aIl5NQJRhUaz9{T)9w6Q##^P>?flGycb){2T& zT8C_kwOTbl63|o(-SCt0+M} z0W7~)a5alF+ybeMW<1GV@)yh}069!ffiHUdLJPjtV~}IaQIHp!^pL2GZR{jJ0fg09 z<|IIr`~=x@a-!xaFylZh@B%psEU200b-dOuauj@f5gPj<)=_XDx~w@00{^k20Q-qy z50ZVl9<_lbEb8yIi0&Ww1)i`tHTk0RH(Ug8eWt)oKt2KT6jVy=`yM{4E{>TmqO3Vv znf6n76I~a*EB30w#%XuBB8audTUjI?t5BpwsrMsq(mwo`lAwP>;sMKy zN4K(=A(}+xUKWY-CiS`%FN^aG|7($O@IDHwV+Tv?#eb2oq@*2E@Ed;BG|$zy+AO#U zh5l+(9X_Q;bCdu6j4s^aAnd>AyC%Lq{>Cy2pz_)Oa2x5Z~8gvNJC z0JMB!CSP9vg)}AoYBxdXHM9+r$+VQw@mz{R#^%6 zw+yCZyCQ5{x63C4sXqx7GKT55k}gf`@p=mNn~Y;(lKzX4K4QIcY=Bs=$0ySW7p5~A z-rtX>=!uf?ZLlH#7Lh~!GjK-ww~DZNX#Opjs6p)mS>UEU@Ekl2^a0iIKj*WpP2S2QtL6*?mNRJv|~Hqc+69hZCI{0 zrjQh3iPo)U!HaFVX{}8?b%!zzBzjI(lG~gBnlh^t=v`%m*q#&y0ek z9e9yQz4jdU+i(!d9EdPX>0=-nACN}o#a+11KhrXz${_y$Jip}-Eir3(>pG+C30`OY+iXce1k}sH(yK0hek@SgvGd>>>=G8A9sr< zGXi9yRd*KlR%XSs4nhkT^-tMo&VZ|kKjBi0niE|xCvr4%;*h!s*R(YkfDD0(m5)NA zqoaCfp02Uy>0}mPL7QmjWsS&+Ze*~Hf;H@cL=@P?e5^;0Vs3ZI@5!yO7+Vgdd0P5Y zU`8w=pAj8GE^IjfSNL|A-~WP2IhithFb95 zj4V`>IZ8DwSG6J+7v#gJjGDo&nInd7;8}Ap)y-ndezdtwHvde-#}GUYxXRmv2Nywp z&~(-1VTyf_nvz$MtZ;UuBXL@uazmO&nbayk_kaM#cIASd?uDVtEG1WHDL!~Z{=_oj z^L^PN^UrBCa1dJY+=I{wQgdY<-2a;-a$bHANnwPKS<+&MMa#2^8uU6+w1~@*1_3Y^ z+fP>+E}3s3gUeYaWN{zhF^g+wRUopfO!#IJ43->N30d4uR%;1r)$rYDpVHe==o>T8 zveDV9!>ll>nbU@sRZ4e9>;9}P5B>C_X}unFM))SR#f7gE80~+^+Q&B;vbclDoJN)6 zP&jK2ZqAgx8%28$dCAl-ya>a3{*8?=!PHrE_5<_HDCXP1q^{+};XKr=C8M{=E!5DQ zZPddS(3M^MV3X+hiW=`=)Dbdpu98tPCq>98nPY|6^3KUD6Lw8PJG&N}Ecov=rQpBI zlqNiIGqyrZ;9NKsVU}hJ4KmH>t+rW?TWyPlhI{Y?_sujO|1x>>qgEAcAyDP(Al8qeh<+L(rgH>LA%8%>i0@D+f&458w)frqBaJ}ba1 z**8nQ2Bro{7<_&VAL~)W?9B;HZqbL6n2^Rdb=ILzxC>_p>GX$eVWf=qDJ81MqDcXq z@|A3C6ZzPFE+Vf$*Ex{DP8{Utg6 zW~yZ?5?I|xxSkU3C3L1oW!?g}Wqc}5NvJM`zQ`y;ts)hRvT&b^-M50~g%?>N){isg z%eWIn`6#~id=yu3r8DfGj0%+amnk8XZ-Ix}BFPheOOLpO`4K5@vG>pP`(MhqoM}|U z_~5CC+~s$mo=fCbI(rCB>XtHE@nUKB3EDp;dYgZMea7@?;7c4X-9!2)(+1fG1aWp6 zN4H9x{DR=z7Hqezfx&@44fzX{_?z*y8&sd5-Q4Vm&&4xj4%dGdY8pEKb>g$IQ>fRQ zW;y#bM-*3CA`|XI zMBa+;Vp1OYf#mkcglFmDN+=_+G$nRHhZOxyc(I%znUtJ{}w5PIQu?CI^uh8OE6$(L!9M*RJQe3Z2loN| z&S)jteZtV>qz9?9v*QRjKJb4?EDMHs~i z`Mc;j7J;oF_Cdm>%#VlNjV!%Fa(=B~6QXWTVZ?jsGPsLEQlYqMA_&ebO7%v{!tR%@ zKE{xwLioLKk3{`M06p`O)~sn&(f7k*{GVuWr!wyCTTunwk=Tl_K|K5w&7~6m1`=_u z91LUqg4E1rc1UIHTAxj;$76=uk=FH}AmWr^Ehuzy1J6ys!i(k)WU zN4U)SzSlH;1#0!k?i8`Zjcjyq$~e-#7u%A>O_@}Hhel1iH$D)DPB^G%iZ{&?nefY6 zR<+-cZ45Wg!odT7@lOk?=3w8~P&7@G&jPBr$w_sfI_MBs#2#7!H=!WrER;~XKrH*d{w(lVWWujkp_0(J*Dl3kZ&hz2yI+Za0fpICh@3l+1M@n~ zqBS_Wl_zWg;#x3XR!l!KExR)78Jm+3aDV1)l&3TmrUEHug7{V#0kxp)nN* z%0e@EqA`i0i!4|yLSq74OoZ;mr(c6JK`(r_S|);o0_#10q0SHyQBX1A9Sd-a>gD@` zr*LJS!!a5v64o9EQt*^jXsEe)vjI)o5=MIFM<6#prn zl@v&h_vvU%XFBs^XDO^m!d@CUY%*uWjE;pxp& ziT3xcXTudYnbBL~E(i$>+QefBY6#jQid6r#KL>Qd752b#-15c%p%8i2Y$s|p^mqiR z2YaN4?*a+5k%J;wzbM?#14Y;vQv_wo@Fn)s%aA`%okV4r*E=+BsSO?KaIZ%?r#=d8 zOwp^!OFA`b4KxCEFA)0~%}kRwETs{StGxsOClz=b#-ij~)cHU`au~_#)riLkG?LE> zKksMwv54B@c_DzBd*)#tLEdpR{SWR#8}rcBdZFR(6ooMicI!pd-m@9(kMFzDB7oaf zXs{Dw(9Bp6VVRLG`YIm;zQM2a9%FTHLc!Xcd5^G%XQN`mou-2^6N6%0ng~p|*G^WgSWt2S58qq(--hiG%iWy(?x2nHM#8Bj|N<4l447%M^dTHB=d0l!jZSuR2 z%GmH1m?9c-sxcb<<`U+>3GSHO`D5gVCbR;7Gl_9r6*@)-&3N7V!=uu3o2^L04&%u< zj3-0}X0#{b-r{mI9epeL@T9jT%ZvVIg0hKon+%*3by(z_zsrkGNWpKd{+YD51QJ*u z0$cH3htN<1GT=L_#I{%PkAbgOiS5+}E;f%y}$ zt~r^LGv6vSdgbFf zQ{3pt6FRccSPQ%uZv6=|7=Hh$C_^$fEsJIlr_y+1xYZNQ+!8H?p>k>_GSsKR0c?wo z5jKcM{m-Fs`@w*b34f`?2$ab$8 z15>aVSv|L;ph)1aV5px{ajY>q29hFEUqMkUaqyeb9_$dH*pJb7lc}z;Q1x~EwpY^7 zYwc?GR*i3Ak@@Gz>5`03)Q84pv5ub0IvPKgS_+M`5s)X-clmJUn-ZBo-))Sk^9@iq zGVsf0#?MOp`@oZTpk4a)4#s7={)wvgATKgu<4V+|#6Pd|*#$}p-d7qsuuvKA*z3=L z8j39t!|e=wh9bXXMczS?q3UQwP!)6vm!F~@B`FXZcQ3>IH((CD1Lq#{T42iLB6Z-e z(e*~ELIY$mSDi_E_CzS`fr(0dI5itgzO1?j*fjqnH}+)0O+qHeuEy1On9aOz5A6m ze@gsQNJlTuWsP>k{}hiT<}@n8{u}oTq=1j8(7tB%R}f|FAV%XmsaTvV@h$f78VCK< zRUoNs&FZwVahhpOn*JI`-p&3bm;qXQ13QT-L-w0qUf3w6LT%&IgpHmA3@L-X7?LdG z`%&A{;q6ZLIG_x))LKjuEROBfcy}?J?saSnd}I#~d;d#QGp$hNRUVYY+O^b{<99j! zHVJcyuQty?Z^mlg0214940NkmU?otXUnek4Uwp zYf2cqq`XJ{XLuoiupSaSU2=RKH~<@gIT~2iY(8oK_bTH8)I2UP!tuxmf)xhq340d3 z^05iik7^EkKuh*{gHA8MP3y(tXfLkRdjX2HrVr82rDQ|-Y{6lDwZ)VT+O$+ZgF^$* zW;so6jx*u!)jR~JjWR|f`4_qi`oq>Oy=#j4VhtUJCZ@5wt3wvMd|5kO+S`>nbn^}FLk|6-(sV#OE`dMKYOBeeFVR-_T#6r_Cd@nZ9WZD z==&||3f8_yaCb$AAGPOiE0bAPgcD)LmZ89Z_l~0fM--+|jZf{15hY!ProS%Sy z&Qz$1As2^Nyy*Bcl==u}q$}OnUx-)Pe6(Udu!B3gt5afll{KR{ZO6M>)G2zKkfKBL zsr7HN8~wvgAY4#E2d~B$EnY|{jbZkv4??Nc2)uBvm*1lu{vlzXuPZ^E^aMUai$*iXc)a}Xz&Qi($s6|(*d&Eh6$!Rb zAQ9>c%!dw`NI&_+rAWznJYK)nI;zQseIE@o@0+jBm*#P>!^vTkR(-y-rk_0plQ?NQ zi?Q6=PjTEQA#v$V!;3dFDHW48@;Nf~s&dUwd8rQ1)nS4TkFC)159)B24%>COL5IK7 z;o~}7tHV_~EYsnQI?UDKRXV&>hv(`rL5Ihd>+S1srw-rH;R`zaR~_WL#cyPhzN9NLEIFaI9> zcMI8WgAGIf(;xrGK>dHvFESEi{|x7-k@lAEeKelGhyQm`prU-)^5Q$D+pn5YQc=Mb zELc@=L+SGJ8h>eZPDN2oO=-=D;Y_`<#A;>#bb$C6uDYtqUo*#w9~WF+T3K3McXfUOGxLn99uUuX`z4oeER{UtHzkFq>wXCSTB2ZmA2Npa2 z#FCQg(wZ9URG)Q4QH`~-%38j%XnE=Mn$lwGHD|TnSYGW96jfXwD6L-23YV4;$1v2L+kZ-ms?iux7L*3T^fsT^vn2tQsdcLKb&5L zBji{8FNf!!_WZNq`O)8#)f;&J!0`Ok5$#Fahvz#-JZFx0&KmK|4Gu4F8S$Jl;@LXl zc~IvcgC6s9a^_gmZzx@5pJvStlvm*Qc2`^T7TvUHCQZj3n8^(5RWs}}$k9T7QT&262@ z{N&Ffo&s2aupaS3KogunFH<_;=My>Z9mEF#e?A!y@pXVFrr@X9|AcW`Ij&(Ua1p2T z*iSCSPp2bJXXVfQ0OLY@J>c@oaWI9r4={|d0&#*5&OjRC&44-hNQg!mw!!-?S`?gXqvup#aP{0w0l;Q*c`a$FYTDS#6Y z<|1wdd<(&eco(H-V;(6T@I!=r#QOj2v@O^}55bpz=n~S+d+zGfG;bp{qfSV9rLp%)F zhp>h40kh|G+&0AX0ZSzC0O14vGlGivI=~3RAmW?{KLU#Icf^|k2N06~9eIGY3qViA z>j8g>U_*Qz;EM>;5MK}Y%0kcp@i5>nFMNiG_W?eBEypb-e871(pnb%hfEO%5dx%>B z`w-Ru~AdZ;0mu(j_bN z%jh%Uyj#I1h&ut7BUlml0ltQij(8Yw_HEz+!U1$6I1$eWT!P?2yb$oGFl;5nn*qN@ z@FC8XV%`z%B^!C32rA<10mt6~`XFuvtiKcM3vq(0 zDlxx*MjSBBhdD*u3YdHs<`nT1zysCbIm8D6Z>|9y5HAG$5MeRmeSr7+!CQ#e1Ku3q zxC+7nydS}jcs<}F2z7|B1N;QxUc?6h?^%U>#OnbQYe6f-Qvk0;cntA;z*dAO5$^&_ zsKeL@2kV$BF1*k>EpJY#o3-1r;mN|>G>n)228;l z!JxOv#A%d>$)mnQ{_~@iH_93FGa4U_R?cX5G<>s}GpHTyUo3AJJZnIzE4IvNyk+3V zj&CG?(>yOTT1K5z<`Jw7qb#*ETHT|iory=z8H2ey@ASDL{HI3Y8=_C^2!0*eZ=y}L z&c8HQ%g)eGV;l+b+|a59E{%)YAB}H~GDMr~QD|e#M)0)O&ZH~d(Od5Ut zjn-Fc;|9>#;4=e`lsG(;w|zN`<6e zjTb;ljzW4D^xkgl**(}VmmtA|y$r$U#J&VQk@Utv#7Va$J(l!Q(rrnPCHU&bRp7{NarG*hjbm%vq+~R9gFl7(lCm@Hrzid0 z=|r7wz+B`Z7QwYiLz{WzDjo?MN4Z(*XBRq%Dits+dafEZ;#TXFs5ULPD2>*t#1K}{jxLq7~ zCBhPfRS3UA*od$j;co~Rz6X67p#b3?gl2?i5H=&ciSPkJKSBiI+}#{^If4t}7KB=a zM-YCG@H)aSgs%`1_dw4@n1LW7EJ3J3XhQfU!bXJc2zwE}L`c}nahD+c2q6#QR)i{q zAi}>Ov?6?rkg$*ArXmn$#&IUj%t3Z>iJXN?!fDf3E}0w0orMe8DcpGOZ0;N`m7Bnw z%bmxiap!Xva1*&n++@6#JO%7?5qB|n31`E{IWFZcB$6d=^ z$Kf2UxT?Au{&wvkt+=XkRaHfR&SZ)z3Q9`p2&JIBvfR%V=y-s!DBqRmFDXiW>^4L6%m>-?qqi1UKdxnzwWJEgQ({=AK?Jsf4gN0h z7cHwO)ef8smIcbnhSnuJt~Sz)l{qXCeJ%A5FI!VvsK6oc=~*IA2x8>dLB><=7LJ;k34-ptR0c zfNdf+L!X)$R4t{T47VT(*xiO$^k}0)Rnv`!SQL6jx0jD>NlPEzI=h`gJC<=NBDNyh zq|VTdl~pCNm@5Mn91(m3wPKTuj>o1Ar`E7lQ&v=rD;VGqEKl43LB;IS2QH4phzB-P zT7LA}#~CqL4cMS-&WJ%bM<53DElAt^NEi9v^EbC|Xe{?0gg+m%lcIohd4*#yh99eE|Ej~6bl9cC z-8ww1!&5pu_Y=K-9U7y_(w}p6xLAkFbXcjwRXVKK;Xmo{5gk6M!)J8(f(|$7uvLd| z>Ts71`*f)4@Jk*3U55#n1NuwRq4orSrB1i+>90}b|8M&5;asH^rT)?!Xwl`xMHP$m zJ6NYUcO_k*8A~^sQWs`($EGZh1v1#kk*7&f@ao zJ9DaV*9?CCI1l7I_9h6~k)6*oc}t5{otDgnP3)pserYw^IIz#M%AkBFns4w|pclD; zN_I7EG1G4>l$ulI^FzPNsREhm{G32(UbY__$RJ?#YFM9?qhDxSQdx^_nB#tHUR3H| zQn`YSxWrvoTNYTv3A|-$+uOd&hjn zO1PtDy-}2<+ig)LcQ)%9`ca+mXdB z;F;Zr&aLD&@U(5+$rZ;H=p|>F3IdfZ&1^1OR#oli(#&8bq~NT@T!zgJ=b`2@&7R`! zHbY5bc@LOZmaZ)Jfkq7!BOQrT%uM$!gO|bV3;2sy6jgISrC1Hlrp(|XR&<@YrhGY! zQjYtx8A>Wy4%{Y+RTi)Gal7%!XrmUc59{i`F)Vc7aIM>W4*%-4IJXY*X84!^e7~vtP5p1yKNWte>#4q{2A|@dPI=n;bmr5}r}LjK zeA@SP{nO1)uX}p^)7&8RQ{bnq%UqX5<>9ZTXY0E3XbPo%|M!0u1*V}pajZ)gtz){} zpJE=ppE^FY5)HqwRNDtSM@NT$o$7yoqk*4Urs2PR2K-43|8tyx>HQgjr`7k`l4$;N zt-gKy2t@r+!@qltfp6?vPmhj{^8)JcPo6RGN1|!<&H0^?->kpCkvbAlf7bBdIBDRo z*YVrGlfG}>7^jcFzET_CvhT#-{jz~SSgqmTp-t*(z0$__@LmIdB!ZToyYEc-+IVjG ztC3$A(AvA;JNx&?t4zjtR%`gCkqr-{m;Z+bewU7)@SXStYYhCp{{a6C)%-u3{Pz<0 zd)VkL{QPT|SaTc>?R^pJ^p$uCY5Gckpt5uxd#kIw7?0$4omZE2)pW{SZk>MJOzZR- zf62V%l>vu?OU{{dMRlpK>Izt1+G|YHp?ObVUhco5rn-12btp#pSLgxu)C`zCqe!4Q zK7m;?CVEY%z|Wa3c@2Gzvn0X*TaMSi@GnqFW)0qT!od)7;)il5!GwQ4e>D~T5l%ok zQ(!1zA=PE7r3NT}*?ABpadC+?D`1Tcuhz`6%<-%Vv(^N~<9&W+q{A{RuPm$LOwaPS zqLKv5GW<`B<`q?xQZ`Jj08Gk4-t-!O63f)`7PbF6Ka)gQQbjQio=Qr6c&Upsy}|zw zlVjErD=J{j78Lt9(_dJ!g_1Qhm^0xwqkx%AN#!M+sfE7}k2Y2irIzE}HO|z*<7aO; zX$&<{QGO@t-^LoX@MBgkD<}?B7pyF*<4m0_F_{M*ow#9u6*#0QD`rjt({|pDN>Yqm zypR`@xr1e<8JTooGgR_TmTA>9In!JGT&(JJeoV1{wXf73gSnGoW*Rx1>1{q6s9F3N zAH(HL_&qQrI4PlGB@Q}F-TbvkkSHO*5_(udKDAar@6pltsyS0He>d=!^3ge4xlEt4 zKkz9KN(q*8@qer~XL_DKVab?YeF_Woq!iQhd^zxwqBH+T-p!^lTI~zk9CPu^VO;_4 z)yw{W?7ew-9mSRZT~|xr+g@}xNmq-7g%>c3jV;-P9kg1qwIRt1B;+DXvMi7#MT-{* zYuFPYkU-eNl7JHe1cx<~um=*hB+ddekeLa|4Ebe-d6^-TnIXyi!h6oCs;*PreXkhi zdER;d7(b7%y3YAlb#+yBb#-<1rwbp9905@m%nXclG-cbHg;V%&;cgMi^$SgI0 zMUt zJRdm%{4v=8Uyv2+?lv{{eOaAQDElB2P7JY1P7K>=K~dB?;YzTb#&^KaC*Xeqe~R(^ z#Pbzv7b65u(>NY3wn-Hs{w9RKY{E%ufnsaXN^B`9cuEN`JC0>1C-9^zT7?HEQZqXy zW~X5?XgWI$^FBpKp*5BonVOiLgic5ltwuv41yQI8WT*G;+%_>Liq@dLB8ANY9?0$W z>~(0bO<~*h?XVs_E6C&9>00!xCXd&MXAMw#3WPqE;k74(_YqUabb_@0zyI~HxHrr_DtG(7Aa9vp@TDWd2&wDy7(N&y~J zWTz+LVVEd79?g9zcyP+aC!n<-thV?>G;hK*AgfT!(~#ej(6$++#&$B=wm?(Bx^iOJ zM4i}5`W<$laYSNXuT=k6~!lC3qdD#1N^4% zgr8FC50lxgO+EeDhNk}Z?k=HbUu0q>m_sMF9DbwOrtYr(maYBbK#_BS zlY&gTJ!{(FoowM;=sXTPf^eM-Uqs=U+fy&Y7gIRl_NO5R(CvlR%JI!GYd$fhSpvd&$~hJth01}oI|aS4^E5@fvuIv3F5d9W&ye}+ zMf31+N8=Pczu(b6LHl`@Jo~w)6`qTe?>X{)Tl&0nOGW%1IiK-4y|~Yl`^6$rxTU?T zvAerNL@&UTxUliG{uUAaEOudqTk!0Sehxdl!e$w`8hfCEqN43%69X`M?C9Ct4cGGM z&GPKQ%VIe^8`wFS&8o3WY}p=YtWFF^G}^UW4r^ld=+eeXZ9N&SaqL+ifsHazbgxv6 z5AT+vpI93@ARbz1_!DbamdP1CG>L7%kqL+X^l*hWtWV4MJ}C1z%) zMXW=1X?oZK9r^eOtipwj-M@@Pf|#@jWU>}U<_(A1)^dW(K)jKP08%~P0$|( zR43+@VRI@XU%i-DPFGV3trhb!7!9so*!muWO&TagMIog+uObVkBD5E_!(Qg~;%3ng zFx=G9hnCaH@|S37?d(U(09pP4EXC}))V-;{y$ed|y9H$>LR4ZE*TY6BUS3M^N>aKQ zN|v@naZgCZrwY12@5KHD2`|WYuBkhw0Sa$@@r7V@J0^Aur>z*4YC@oGbYzEc+Kc}g zQjLjXDRnj!_k%Ky^4sCRI!+3IQ-|XselWE2r*t?A`+FV&RhZp^SkchLEH0rcNEFdf zQw5#aZ$VQX#}U>abX07J(|f0JDG9AUoPYN}fJ@q7<=~W=d8L@| zT1I%%O4gL$x^v(xc=9~II$$4#1zckOGP0M$7M z(A&~b59_!KoU@$glh7Pgm%oL^GiTG)SGaxD2T9u)*$UkLfe~rg>0m1;a(iLX+tjY% zA-H;tld0IH2jkt7w93z!pooq#Zr_g2NS#T#p2LUS|0feVMeP{Igg zk8=$)#aegk&YjG<*TK``&UyNv;aYr-gJ;H_a4YLCUFTe97$)Cq?u;Q4na?ivd90SfKM5EREZDfA46;P@V-&;blVPWDsi zEeyf1;9C^>mw6C^@y|mPf)N1(VFdIr1!4LCf-pFFgn}?906`d^JW4^h@rNJ|Q68f( z+~#8#vh+BG;iewLkg0D|_)HmwZ2bj=CuJBi_8kgeD8rDo?^5{l5!un;P=z|02rLmV zaQ4vO^R1He zAiTH>*El#2l{|z2xMAA`r9c7St-*S@?DRJ9`-FtEpM*;=U9sfb@Qc?POcj!UwB*;A zVjC@lfHwSC33l0w<%|%7AEz)XUo0ts`RT>2qi`#L%~?1vm0+j7c(Vlc2OGoobQ$FgE;0cp#v9bJI~9E;|V%=cH_V_6w?coR7{#WMt8!R2j}}_OSpZr z+w{tlZNm8hSu2)cwrkynDOmbFH88bz6P(69cuNockn<{OR={w4Y`buNNST0!5W@o~ zR+)2tM8{Lyqr*Qgc?H}~?0)!NgqOx_XT#QPPxqFVUhH++yVm!?i$AI7;QFK7?OlHN zAanPh*3;h9(BYR1Nl90Cwr^A8`rhtMJ@V@A3`<8thlCX1F z^!9akHFUK1pC+6UCc>Lt=qj03I6IiX9R@UTE7{lH(caS4befkN;f&@{!S33-VV3DE zrfF{P+X(k|4IM3gO;Ad5m(ATen+ zf#H&;A7lE>?aeKwu!OTS;G<)-cQ_spHFR}#pVrXT)MEBB5fn8yz&$n=TT5>f4BoQs zT}^PU>4QPdWI){9-f7bMRKVTfrG-rhvj>+0rt0kOYVYsvRqX@jC7fyIZEo4z4tbT$ zucy1C9jZu{L}PFJ`nLYAmOf~XGao7jW|YU8WwB(MO`Cdq@o;sXxO!JW?Hw7^d{0Ni zX;$L9nH+BT`?{f-Xu8`JuzF$Kpo7cK8@Vgr~ z^+M}!U*FZ;3(d0)&dRp#4k&~R{X#Fl-cE&c5fk-ww6yfFrg!DIj@>u>4I!iO(T>+EiZMs+1~%0^{;R|R~~66sK>MZ$^n*?^+A zzbU(=VI!pcxqwgY+_cuKnM64oH}&^J3o{Mp8m6J@QwlXJ>0HbFRK`C4=b3*~AN0d8 znbzCd(A477UB`4C?afUc-F+}(mQ$b3^|rISr$t@E)T#Le=5NFb@8ws9FNS#G^k`~p z=v}Y(k%bHG4S97PEt^|9PDX&Z(8N3wc+>}=*_X@I`^UCC2L3T@C znc6Fi9&gR7lY0f(ZFyyKuORz!UYXh}j8SjTtCM>L*&TUha<3q}lgWB|yPM$Jg573I zKitnl9hf$JSEvwrtnU7P=;!tM{FVGN7+1A-Zt8@Iz&Uj7T~c>= zwRa4%Q9n6%4DSeJjHl*~(a_oo-B$l;**3Tn?}p2#mjqm^!2nMyK0+d_9X<13h`yx- z?-l3-d3Nq--J9W77jDfu+E14=2ssbox&KCD>`=b<5t3nt^!!JN&i4L7Xmovc(W!Lrf&mb zI4nohKVk}Xqf33dPT|MQ-_X?D1WD5@O!p?ZD;LfI=7te&-W{vY}gF ztn^LLSN%Lh<4fi>CZWS^Y-rkuGeB@t)!)zum(SOk!spC(b@#Wo!i|x<75Yo2Z0LcU zZ0dp{kaq&Y`77q_X=-oTipK)uxZr^9jc{c{Ur(o3pKmfvOBY^Bv#Q8jyP-bdj<9W0 zzntIrg_QPSY;QCrt3=IXy-`XNXttuc8*4+=of5ujgk}I|CG`uV@OIXhZEomqP)Yo? z5qL>hg1@l^aF^5swSoPmO5tyF3tF}+%`c6nzpbUWv!MgqJKVRznWZFe842bTW?5MA z&{H_)S4N^zQRQ!!%CAXQ+|%BPt+>CVFAD>p4s0vJDX+TjFnFXf2|rHkOYob%AAaP6 zH=LN258f7Jd;2@G-d%QI3*8yQRjP5*da>I1L=6Hg-F{qd<(yH2OCsR$3PJ`ZrW#?o zwjW=Qhvh26u&CgZiFl?;EaDQR2UX}aZgwtRoyt-YsMg3 zFhLEqS{x=6&iPb(h5p(V3$LDnsEanY_x5js{tX8v)P7EbwMUy_QU~t#Hg#?6!a2&4 z(gHd|^JzQVn|izZx?B52Ng1gNdwXE@AzXRnbMkm2J|J1@Oz=`e#zW)Tz-v64b01(LcK^Woo~7O_KwdC?CFBV&5&=P5~WUDVELg7 z+p||^?t0tTH#56UyZ*>rJ$+u%)Qk!mVoj zzCL_L4Nsc2FPShtD1mNzd3jo-9%uITv>eBC^(IY}K3J|g0ZT{Wa9?0%8H3sca59GF zyVj|d@|sSq8%k?%2P`+hRg5Whi|TjCM~Nb}I?Z-y;`fCp zQWgkGW%8qQDZFF;jhPUG6D7|eUNQ$n-~Mkk4P`J&AP@#y4E`@yy&}xnimRbT`Y_AaJT)-VJT);X(uZ62MxahK z&Fm5BBP=r(to+i|v`8PxT)1{=bP&3<0e~67URDNt&7;t=S4lI}e^c}J>CHf}!z>-e z#LZ1`Z#9T0Eqy+xS2H)XjnG~{y@rXP%fS5O^*&w4>=0S@=IMH7g&Kx0M`3fHQQo!8 z%dQ}%uTQUI3hV~GydKRQO-;?Mu=Z@@)cBZ4f6R73n}yzbW-q?hdvrX9nuq6H(IXgfLvwhcqB zPqMA@;;eUmvhBnhCQ9lQ+uk<_Yo5m%0n3qYus!SXbrp)z=yTBb)W+;WY6{VeVlT)F zvf0+O!qwRpwAg|s0PIcKidI`e1z{`J+X`KVwy4b(sS2<)?Y4%Ot}WbP3sp(mnvJ%` zYACj{BcP;4V~aX%kynYfs>@dC3bjSuwrH#D!fZ_s*T8wIy{gkXmAmou(0+OT^m6z5 zsZlSwboX)hmc9)QQ_xq9$@j?8{oEB!;EogF&UZ5`3h(TJnN-@O5l#e+?RBDn{;m~; z__uehD5Af|h+_PU%OvnGOmD%91h~}*b4(&eHkgZSfGJSnVhCoe;VHvBlHeN%^KlFE z(%t|wy$dj)Z}s8(-;iKS6HF#`h!PC6uMr7Sz(!JTz)hFjSS!*bIYyL9!!e?a43KQO zw7^ydx9IJK3f#i^YPi7{l^DR4_f@#j*U;M1(A(Q^nyAKLliXf}+c;<1+yakKU^1Wv z4IMproCnFxEx5fHx7ABf%WxYf+A!_q7}%skhhV6+y`zO5-JF7z zM!8M1A)?7RU{bTYaRW?^iDs=ZrWQ0|Qd-lBh9&^|(qCFL--es;@BrtEafVdxuKf^< z2?3dt58@c!47-5}6A28+k`T2dJgv8-6<+hhZJdkl-Ha0?7hdOb2JKW?!x;8{^3f#$qZ-teKgC>L2F_Y)^sv%^7N3@H zU2cptApsNdef{f2`J>Fy2eX#=c5C_8LyTJG0|{oLykSMa;YE6n`EV`}Z@s2P`L_-; zQE<;N3*HH5Wq*?>f97!8g}n(*NQ?5ZBaEjPK6L8sBzB~6Gz{$;ogVJPmqf}RHg-9I z!=2MB!y?s*@_Sc#4u350t~$!|w$qAqIZsvod!JqIN{#HxE7q7;oiLDu0#%%}@}Ef; zy%mz}n}xB|)Ly)))NcZopHcVkaF4P`3Yww$g=n%|gX?&khk?L3tS>sFSmpy<(>yvo z2rO%Cht|#pxu_k#Xd1S=VXkVJ9U7eoQ;l%d=Fy?yP}L|`bq)`W4q&SaOYdx{l=Bt% zQCzyWz*%)sK3!)D7~%uP&TDJ0F&A7DN8mPTx(lYNw!>L`Wxa{kF|c=H)-R7LsqYfU5~`Hc@@dPv-p6AtD7!4%z-7};y9UF%Hb=23WScxDUCRSi$cq+es+ zO;clV`ik<-qfHDLXAI+u&ErEb4Kh9rY+_OV1oQXrfY(gN0jv#^oG?#9MU(iLiQf!u zXK!0OJY8uYhglN5>ny*F`Ekqu#UnHGHgkB>T{w+~tl{#uV@$FJS4e&1@0hCr9wW@` z#96r=vokd3QGV627?Y-w+u?TBI#V+DnN-2oG%&bhSY)=bNn>rT6Pd%`K- zIpMY2>0xN{@b1mtF1+Q;oWLfFF{(FbmbuO6G55ZijF}L|jH?bj^Jis-Wx6!!jzgK% zX2L!5X9tHmi`s3!H`K{|p!_(44#~pYJ(LrS0@x%km^-jb%iLlc+W{uY^8R$pDm`@z zz6r-*l;kcp^$ST_x9Iw47O}ZsqmhH&%=@8E9rZmnFKnXr;k-fSIySkBIUXGc^ke33 zHmkdNba=N;=?|fHsPe7iv_|Datf5#gi1r=UOz^B207Rvze2g^? zEDSx~t-PF7I%W*+<0eJrI#$^xyKjV8VUIm*k{-pB#n)NsDK&1loBW3rUqWM+A^%y}N0$nKk+oCKT<^VYICYuuln%&wgEIn;fWs64dCxL^A`81K>D^9PqMWCp=k)Pbh59?wsDUb1b_W{`tC)s&}X* z<&k=Asp_9d+R@$!t*NtbYiEb3`cItZlOtFN!%BhnoiMeIow9@tREdaR(S@%rRvj9! z!}tT{$Hr%%KN!KkqU!(V)QGC>1!3vZW9+Kg!hjEYX1J0L!5!W6SZyda6?qx7;v`8BNkQhVt+iG2@zHM0(P9RpkrL__@k%`C5#E$$ES%S zgwGMHZVw2XaO|pq#8sK7KOtS9*z`oz^#MP0RjQKa$NX_yXaYb~U68}mI}8H^V5&gE z?*}AwO{8Wjss>z^bbkljp&+RTibUF*amXcGj?S(+AFEEBM=|9TGPEr17ge8_hm!(} zJP%Gq$fqX5Lq>I`RMD6Y_RuynGuexeK;a&zYJ{ha&i?)$&-p_;Vsl@&zVcW7+!v4g z7S5+!>HVoj0dsEn0xDHu>3mieaJHxhFRC_#JL*K$L$=3jY0DN^Nhv!-xY%~EcKf#N zQT3Cg2RN!Mu_C-oty;)RxvvoxD9sFQ>g~|?ebwj7vr|3z06&&6G~StsL7+ZVU*LDQ za_@zH@A`?!9q^8z7yTl?08{TX{)_#79NHWAXZ-HYvyJl-zZ1v9XX{(->P!9ZKKQH) zT+C)*9vYGm`BY~c&7qiVxo+Y(MeH#FdJfFN+$ak z_&oUdrur?PQNAPZJ*=yqWrH$I&i1$L5!Lsw1s^bk+yU1Ze11DDs)yL9je9WG0p`Pc zGYc-N8`yx(a@C3IXLI@LMfLG)$Orcb?c>8USnFygsrqT#4Yv?*|A~hL<*=z;RIg?O zLj)(OGe}h5${d@fMn&~XHY@~#xn-%|$42_#X~d7Qz#zN&PoZ`_IICX4#*QlIGzhD{ zhdHQq>jfXxDYi^QML~g#wl~~~xA!n9FfFRz4+`k!v~6@8-KVort4iFsp%&CKZG6m( z1=t4gK~cSqjarTMWMN)S2mYyuFP~(cN?PE3~9T4&ehLwH%;&lub$J5Mft)c&R}T;UG0 z?$tAF=31v}73uT&1$cBF%YsM8(x4+dLr!n2K@lG}+;)f=u~`F(SJ~uu6ObF=K{)o5 zvc>E<)a(=Ig!K^OH_YCGACH56Q~JDqY~Kos%F72P=UUr)JLSU@e9Qw+x~l6BGrQO_ zH843zbGvFh)4-hYSq}F=_QhQ*HE!-F239H+_I9N6V zzh6!CO^bu6Apj9`bL(cYB=c*axj>*D0~H9pDhD#~PJ%lvS&Ve5Lr+<94B-N`U!ZKA@UmS?v&6yf6;hBOvh%ASe)rV;W2DI1-|lU>b1z@QotE!_L4H z3-}@-+zrBze92wshI+B~#FDRk7o1M)S@=D|qyYTvov;EIK*|HtFlJeD_j*{iZ``{E z2ghJA;<@ip?rAkth1NB3_UN!!`sx3GJXRv*v+fh{?#Wy5nnNkQh0+ZsNN^I`d-K>> zC+tfsy}Sc7POK7si(26)eg{l~u+`62C2tSW`3-hLQIV(p2@gII2#Ps!aQfe`;iZtKemanx?yd=SeM{~a|B zKamHqWN*UYLlnd^UJcP!PYut|85j8$rg$xw){Fu|7r(+KBCr2R?V;`|wb2jFukIBU z$U>n0?^OU!6!B;HjP}|{Z^115o?0*szgr7-f#&y0Q+6h_%1?%B>dMmcU~muhhpPZa z=nIcff4tJ*j(6wK^s{ts;hM;5mAAUHl;k|z?>Q=fNA|L%U!#xZdM5dQEQwCC{thL< zoF$+}ydv@TT7SQi-~rZ$O4dEgc4ShhQ~3}_hqQ{junrHXc->IZ_%CuB?nJhVyRcQf z4>V5MD(=Eou@!ikvQ^xLt>W7d{MbLMG>(S~eO+d+@LwanP^<9gRLBDS*(&M^OJ$v1 z0|#0cQ-PZyaLi&Azyu)kh1YF$Aac=lLtiYy*w^iFpf87)%y4Z^d%swEDdxOKG5L>I zUzLd5_N#3==NmES6-7Gd8!_kqj6rJ88!_kS6bo_OemLR-1410%frq{sUo$!t_O*ID zQptc>AK8MYSu~BqJS?8fTk-U}4=g8i3<~j&Diiow8T=R7@~1O}II#wf%I|W%R(sMh zV0Qsud9vSm%6jm?zlKL4(Lbw1-vUGA^ur;4C(Q%*Du{T}AHd%W8;x(nhB#pd{H|8# ziav(N$mE`f?W z9XFDm6rkdt-)tO7rW0GlWw5LIxJv8S zkk%UT(@sQ0tgBLv-^-mqXNqj|{+343)}_Dh*gp)oyRX%5gLs8b43lpMP&hn7!prwC zezcIDE^6vsLAD6%s_;P&ZcvYq!A3#(u|lPQOBWWRl^8x2g;yp6Y4*!B@$}fx3?~$R z3lXO>3i@TjEqm~NCRkww2Hg7wObAxA!_`n(U_Urm7#f-W)NaIc7Q9^W1RQK3UI;cQ zBqrDpX1futR@yH*7J&-?N0xW$af1H4^pcL7!Gr%JAL|4RFb*QrpUAR~i@}cnm(Fw? z4S(=|fAIg3%dpAQza{&-=(CCRGyla%m-=L)`ZNEf zNXL^P#Q#gaDc*qPdqv_8g)mV5pZ)#`tS6#xNx~OU{NGe^pn&xkP(IQ(PYO`TtlY*zo%s+8b@J!?=Q0h;d6g(R_6N2_9P6~bynFJ&I#7V)6v{U;NCj~E& zae@9$3EZl&Pn;CI94UoF650!E63n+r3SJ>+_$N*ZUL_~sOy!3w3Vs;598wDT#7V)A zNV(ek#7V)A>EkTs6DI`+B42>Gz&=%~Vf~rwd#0$PD>p1v{lY$2$B@mT;;-ui= z$b*=e`NT=VBN1$J>=P#ikCKId;-ug)GI^gkDR?|G1j#I{EqE>xgM-zdI4SrZ1A5~} zf`^N3QbmYA3E>M(c)n~YP7G~M42!~vC1CeXY(H3npVGJktiexdJPKCtQyPUQze$O` z1;5F6;3q}rUE2PXMqxue49iOOr!)#1@z6x6`jkdt6UHebH?DVt3rAt|E1&=vIVO1$ z#Pxkjqi{VY$Um7O-?T4m!=$*KKBZCEF3rAAX%udd<}URqjlzu>&cq~pzvy#VLW;d# zbTww#WADSY5rS}A$7%b;%YFlya$;9Am*VOd*Q3kRYwO8qjbq_2fsrTB_A~GYR32@= zxD6f3LbUzjc4aZN{o)OHl7Pt2_KP=SR|uw&AZ@?6LmsuCwqM+->}nPP#t$?{Qrx9r z{>E<8_KUmmq=lUYX#2&_Vej@KY5UHa{ZQVLs2{C}EP`VyR-}OFHIc7DN!hsk=otk# z4pzAQ=qD+parx0K1rcG~03wddkDgh8rnIDPBx32;AXJKz+G|9tRJKeE)rnXcwtyn? z)r(j;oiP+zD`FXp1}zj%lDA=#PCAXtk5ya)rXsWxECehHsdH2`2BW=|1dG{SmU0Wr5-u*YsY*i3G?~2GP&}fVYG4rl#8DZLvtSP@$!sp%U zfSus;?lQ77`24(e*dbKWjCc?T9o?3C52{|d13>8LAajQUp`$}m5&%L+houAfE|Py_ z0imPYS;~Y*3IRe#N0_v^qj^-ovq2zq^em>qCk^?5(9yG* z{6hetqhn0(142i427DeJ*W=Je#{;4u5IQ;$6nPM5KM*=P84zl5P zzARx^@WdxN&AcB92pygIP%(T!=;$nqH75`{x+|dej!aXr7(Y6?o5?i^OzY&^cF{dd zBDs!Q;30OSdzmH=5ITAe(|P%lMH&P`N6%&IJV5B^rL+0A)n za<3q}C9h2FwN6BD&8w4p1=($RWpb||`*L2H+H1Xt-kw({_X@H*^2+31L3SsTh3Y)2 zpr`v z9~uZ9eeS=J7(0~jeS~D#AwB;QqO-lf5E?xk2p#=?UNK%eB#~G|e~?!Rw?rX8=;(`i zBZUB=qc4TW;6Ui;%egfc5IXuws1Q0%KM*?lDpQ67p`$-!l29OY^hZn)0)&qKnE8W1 z=;#6F&H;pu{)B1tKo)8Vzw%@Qp`$-#%1|J5^k+n9m~m zI#c+ZHV``cmrNM|LP!6KdGi9Hqi=*OIS@MfCe!2xLPvigr8e%FQ=Fr3l+py6tq1`^ zN8dC;Gk~*_`h`(=LpRQQj{da~cu81-zp(`YAawL^a|<*OI{Hha$pM6pzGWns(-0tZ z^jAib2M8VgHOa!^#v1Az{Y1^)#W0^vuW3flsJRy=Pjf+?qn{*q5b7Mw)?{j7UOWhO zj-FX_F3f>iQ0M4C&7-iFAk;a!jT{>4937-!KB#kah;qcC&e35q<%T*(cT;8=)H%AR zrUtUlq0Z60HOnF20jP8I9J2eM&e3yg>gXstkci#?5yYf$Hs!(NBu$P0BYIb2E*GN6&f@hx~rAyDV|lXR@K zLfV2l$9G1IN52uD7-dESbx!oi5~EZ&)H!i2bErh>MB*owm7vav&4p%n@REQM(`y%r zg+;~(Z+-fq&WTCp*XZWNJH{yKKAxws*d#}5gc#I0v7b5dMF(Aii3N^{MQ=bzsB_{Q z%pQO`Ct9N>mU`PR@gB1o9IN6VC)T+phTjWi_e3qxWhdL)t zTwwWOiN6PRPF!#M7}PoON9OWFofFS2G--0EbE2t)Ic%tNVkB;SxMY9WK%EmwC`CA* zsl`DFXmWGnab}mWPS4ewG*LXtjYzz}%%OPC#7cQxrhPFar%0&VOus`xofE6mY=?fR zbK=r)uX$rK@piaELY)(R@|s6GZwf%26VEZXd<$8Sz}$)vGEh0~cXk||>(i+-^^nPv_T>YOY! zR^6HEH?fmt#>b(~$?`CJok(WF?DZm9L3Z^TpLcN($;vd9ObFCDS;bs%J)u(omeqI% zQ%!z(>LS!RxybBW6-14(V27`v&dGypyF$Mu7u#lC<04sW9PsX&mxF^XvxYh+ml(5z zIwzO#XJP9AExEMk;Mt_X8VR8;aX%jZFzlZRV& zdM6Q}&dDPzGZw6dIwy~0E_|7uL7kH;13mE-L*&(vTHYe+u6>8XqIw#jMFS~-6zCO8*DLB+Qc{FoysB`jTwgcKM zz0pbh*yJ&`6REWd>YO~*cEO?TG*IW{aRIM{Iwy~}9UAJKJi)eWAhAfEXgeg-IeC(8 z<=A17JlS??sB`iZ+wSpzMY6&6Xa=xIHu@YPQ0HV*h{gwXPBz<`0Mt3zVhe&$=VYs` z2tu8c>urTDL%T}bY*850IoWP&c;v=T9$p2cXW$KJNBGos<3C$)L{3P0SI5 zIwv=CcL>xuxrGS=Q0L^<5HE*1Cr=9zP#=0aIcU+A2X#(YSpx z)SAs2>WnwODN!&}2Y0?e}sf+(M``{ROBq{za%W{ROBq{za%W{*_Q?+>%gd zvUyNv3@NBHNeJqUTaXtCb;f|c)nAAKcuFCm&KN+bGbs@2EH?n^EH?n^OcH=PO9Mci z$$(I2X+fwnZb_&!Zh25=3=q^AHyG3zgBt3L+ZNOr4GQWkHzm{=w>8umw>8FjIR*^W z8AAr@j3Ehi#w`tXmfH&IY#fH*+^iMG)Pg1p>Wl`2I@4bXb;ivg)cGKc$)L^{_Mpxf z&`@U*DyTDVGpI8L4b+*1Jg76;IMi9*CmN`8>60~PM6X9CrN=EcMjV&uVQlG!TI29R zolAe~^T8NFvMnXlx%8TYO*pZMy>LJTnka!up;2_BE83aIF%=%&ZXZv%tXOG8>n;XGl$zQd^Ai@=hCqw zjE6&=OJheG2je!EK5XoA0*5=NSB6EZ6Q%dA@*MtH;9Yf;=jBl6(%<{+7OJ+iVvUJq zL!C>1CS5t9&ZTG6Er)xQs(euA(k$16L!Cj)VXwot8zh| zOGmjXAJn<@Y^jv<6*knlbh^$IFtkbrbuN94x!@Yjq0XgO)|+TH)VcIs=CYv9rPr@D zkwT%)rT@VcHq^PaYn_Q4fI64H#=HvZT-tfGi4g*IE`5UeL!i#3iI181AyDVi%a|X^ z$AdbTzReuobeD!Ym$n^al5O{Z3J7&B{T*`!q0XgO9g8u;q0VLZnN;CcS3;f3wy{ZL zZLJe!hp|~;ZPsYVvY#_&0P0+J0-G$xs2^7grK%L7nW;y`-)=O zpB)_PRONy?mwll8INc6;0VWs{n9G*2NnS7$)Vb^y+h{|b%bt!|rRRq_m+fLxzmTML zi>`ReWsBI{uhGasZ`u2yP960W8_Hj0wYxD~0T=oI;;$=ufoy&I7lx{fGxx7<0UpT`2Q0L5ha)_Ht z=z(}Mzmp9F8-M{Y)02zL@vJ%8K0sV=V~-k)6N$;0hgd_gToCO$teJRF=gecQabRKS z@owgFR_XXq6Yk?CMP?nVY_!Vkz7b-DJ@&9kdK6O@UuUJSj37Oc&6U&MIMg{az-F`! znK|<&Gs~l8&hywrb^z*}sbzE4xIaCaotgDH^dqdy0p?&(=gcK+rkZw-Q0Gi7n>g0D zhzNDgoI?(H31@DobHzKHKJlWybEdX8Pg@GbH!|7z{jD^75f8zn4o4*=Zc~te*y-MTXAE+sZqNX z@nU~Gf;w013)peO0-??o%N>6db)kf@I)^$}+#V2GQ0IzF)Sr+pP;7dl;`)H!gF08t zkNM*&sB^^yIXnjHT=9ND!l2F-11?M2K%Fc0NqcUnbH$1CD5ji3=1}K~Pt3zffhx}v z3U#hHQ>ti8=Yu*|jPSI5Q0Iyt+7TJJx#H)(c-*&eKIKa9F9>z6D4oyBg7K3pHiSFs zM8!k4$7^ZJ7FbDnQ0Iz^Z3k<&Z`&RTb*_*Pa8y}xsB^`tg{+i=Q0L0?<=Lqod^Gx? z&XpJV-5d^Fd77tmD|0CsOj1-{B~{e&SpfZ^>hn&z%(f!#Z4Y>-F`p{GD9`4SUlgp9)HDGp{sEKJE{{{o)}AKz5Ivpje9WG0p`PcGf?Ns1~#CxT=0>MXLI@LMdk5q z$fr=mSnFygsq$&t?T0#7u4V&64t1`)l{paVT)C1B3oWQ~g9sOQR)nN{~WqOy|>Vzm|H$n4*r$BS*}5H@7hv2`;isB`7hc@(0O4{iPN zG5sxUg@xZwQ0K}jHVh6^z*(Z8&XrGwNHx^C^5jZ$i>uSIpw5+TY%PXX0NPVRohu&- z^)je)WtUuZAupLa0Y9y{@*#TKuP(`2Wp(%ubA{@Rf>7tm$E1upGo6mNHwAUBe1(>D z$RT_{q?YAWjT;_dNyaRcNGS8u8hmcYkD*^ z7u30OhRs~-RIMU?KED8uu47s7=vW#Eb*?-^PH(G05raBc-gbx?u~`F(SJ~vZAL?AW z=TNgx26e9d4YP+soh$dPps2ij!l2HT^@o{V_@T~~4a{jnoh$EQF6=J!Wy*s(S1vr< zq>R@?4t1`2oK3uWP6KtWDq`0{{RBZnovZfca!ROkRWr?-aj0{(T<$}qVPTu`C2+Bb zrjSDD!xHMeh^`nRZUc2*MAHx<5`sD}qB*1xuMKrxL|2#)nSweml5WyMbxo}h&0rB5lvf!2y#H37g1lI4uLw?-1P$h^p!HG zbIn(9UAib8WKidtuc9ps>Rfa8r4YXe6Jhvff;u0x{Fki1Z)gIM=Smgcgud)UFw-g+=|f9>=-14x=E)xmI(WYwO7b9A}koov2-l znE;M6dX~Z_!D=ExbDV3}UD5?)q!Yk{|B>U|2!EXzYBm3bahz*6uHg>Najxx=X2x-@ z-6?rDn&VtMZt-t+<6$DOx%N|>O5<^yYj<&mjp8`ho@>EsB*(e-A~YWCLRl5zDuCKA zAJYSi00JCmuqd$7=s7q}k8lHVoR?r4wRij;j<5vNfa4G4IM?3Q6zav=6SZIY3^<+G zmGHaNq%dT2oNMns9I|TMK8|zkJ?I9|v;{h@_&<=QTe$jVNg{P(BT#pqh^U^GQgV!v zEI%BIrt(x+8i5;Lh00W+1Xh8|iOqxGLjX{{2Y|@#8HCYGY?u3}gjo15a@z$UI&}N& z_@Ia!gZuq4B)Fnd$RUeF@U}pM+bkgu3|e z!!7YFW^l`o<4H}ZOgP&{CZ_fZfLopo#{VC|EiZ=bd`P(E6(F_Xme+v6f?IwOkB!4E z(GUW+d!yEL`39$nfvsjVlYwFC=13H@xTD01Krs2Ix<9m=9umdfI1 zS%S#VvINseE|w+u;Bo}bG&@KSU5A8ZS%O^+t-w8s-v^N_OUoX{vP1#l5O;3N4$e*i zIeL$nn`N0&L`f&T0oIA6B~j8Tm2E;2B^^nWBwxL7BvFz=YlV}+XwWvWd7ciN)Z8^u z(y1r}QxV#UDCzX#X3^OgrU?PzoK6;e$yO01odL334VFCA$fv-aDM6wmV%KS>SWTQ7 z8NK^ya7o+v@YEC_bMSQVifLeKWKcwj8p&VnmIspj+-B zHPYRd+7898+yQE&JILJO)JS(oN&?hKcUU@rh7&@KbhopVi8&TRjdVwtD1;j6?qGi6 z7KBkF-O)TMc2ub&VVn-?Q_Qiq98TWod}9@ zQX}2TfS6Mw-A@JFA%s77im3wBNOzifKNL06o%v8PeAGyHmc^Qr8tLu|sJ$bDn(ygo zI4#Slk?w9L52r@DdzeJRpL9YVHPYS7GGq*cjT36YNUH7ljWmEx_5;Nfy8A| zBi*m$muWbk`_(ygiW=$O9jcROx!O5WBi(yKb=c)eDxiYbx%)zO9(qVqBi*m%)P+$a z-LL1C8~U8-dhg9G_waT)$KS}U^^(@w`*Lf&bP0mz-k)3Pr7D#VtcaBd|(+(&ZD0@O(N(cI!7 zHPU@7R6Q3p(tUjHXr^XOQ~dVa(Y&Uko7rE?9mm_1j`N+l;}~kB``r(r_NbBW6LYJ* zV~~yd$+=^AM<8Q7HFu0Tsgdr}A0ZI~J9MAj<0YNY#8cnnUBbYIS`v8a*m zE1^Q@IQ`T}_f@70r$)LzWRg&7r28YL2%$#0KW6?QHPSu6+&QR`?oXIT4`iX1g49U& zr%V}2jdXv;6gjAo?$1LsHZ{_HjY;Sd<^w|t_jRW5Ic;jB`d3y>K8`g4c#~t(*0{A@RG0u ze`5;*)JXSla|<*z(*32;ZG=v)I{>n)5P$S)6OIbb~pymn8D=na+&Zjl# zz!l;2JcPA1&6JL=wTA?^`ixc zO9@8@F5H5LREEoKEf95<0MCbD`NCEMZq-T3TDOu*mpA(19hB%&!4~CGQxcJY>()SZtD$Ya9p0 zba|BQXHHyB=Q$QQCKj!;ljy*bZ!miR9az#DHL=v1ZdmzbYyt3J$vQW;7s~FJ%uUA? zOkrSN?iA`p$C4XeD9!(ZgJj9Y`7Me6UI!Q{um#iu? z*}}D`dO?55{mcPn+9uI~CG*OSJ{%obGRq_uIW6-z6K4lLPRZTuV^SaKh8s2&T}z3KD(UFOw` ze&<97mOQWscUDFZ(g>^*U$_emeso~Ggv?a`rVkMDxMe1EU_4=L932=>8apIGXS#@| zjFBvwbr(-Fhd#kYywq5AXR6=#iI*84M+e5s!|Zh;o(Z$pi+Bau)nak);vnLcS5V1> zpabJo%mvpIIt3UyFkVf5dFmoMFuus_TNOl&v0#U<(Sh-UY`a1S#uwXWUE?BNYaH+% zx>uYBTV{<8j4v@}i4Ke}^;uN=iZ3I(ER~)<$ew}##Fw*Ux6py{Lwp{C4vZgaxhyV$ zh_489N+3b}Fw5tm1LKEVc3Sxk=)m|9mKh6HqXXkdGM5h>7+)FiA@(Z1N}6F@!_a~8 zqnJ2|4vep6ZfF~!y?%TR6G4}O`NuV_@j7OQ$PyhGuV>Z(IxxPLdD#`j^!4#|Ou^BC z@uQi8qXXj~vmMZ8>Ae9$pT&={oeUiqKh}2P3)Ti57(XuHmFU3u@wP*e>tJ28ZP(a4 z5kJv(NOWNQB-_g2b|QYV?bPVN_$jvCqt1zVgYD6zIT3I4IYQ8Z@um=s4;>h9wlx8C zV7$c^1kr)>0Ud~c5gmws zB{~qdBs!369y$<13LQuiLI>iOMyV{ofWFmVhyj?YmgqnXAUco~hz^t+fDV)!fDR-H zpaZ1=(1Bz?bfB~#IuN%cIuN%!bRY%@9f%tY9f(1V4#aH>9f$^n4wRb`9f;c+9f;c= zIuHW}9f%==4#bc|2jZ4S2g+@Q4m1wK32fF1V`@Q@g$_gmq66u#LL zfWfBzZdlS!%tnn4B%wkF;xEjC6R zm*`<^YD2AY_|So=-}-zoM&Rhc)HMg2xatj5ks4hRFseaa>M7>(GH}*Xqu1!b)Yj$3 zND~qY9hiEQIWz?@we=9AR{6m9%tfkUMZn=jdXM=!Jak~{TZfq_xMzb7Og(eB?efrp zsj(xBhob{iu_KLx(E(Er8@rsq;m+xmVUgfey?2%8@W%r0s-rwFM+c^U@3ULzz*NN= z6U#;irhX<}InjZsGwN=Edz6ZN=)hE#Yr@fisR6FZfeuU!a#1dHU}~7Fa-joLBV3gW z9he&Bs(k3c)Y(!g=PPV=jg!HmGvf?jSft`%Ul*ZFm?S} z6DbrOnEDTM1Fx7dqi4lShOg+K;A?UzV;$tR$2s$uz8S_K= zc<8{?+sxrjcWHEBs_ht)Y`cXHO#P0zg6P21RmWmXno34go^__A?=z`_Poe|U+t{SB zw$_RCVQdyyoAHilYGO>Jf6kl%bYS`fHd%~OJ#=9DHlN3!1JfBZAAp z&khcCDsrI%(;p~5PPao|fINZd!1OXU$qQye2c~bajW#+k{dCMKJwG}yy^Br#LXy@k zy1MmGFJg1QMk5Ek>GwmOI_i6DUf4t>bYS{AHo1$XP3XY%-E3Bup##%@2(?3%AI@fU z4GK`Cf9kUKq+detSS@p##e^QGY_ZK(XnG^6LYB4;@%O zKjx3C(1GO_f#oO8qnL6EnWF>CKQRv{1u8sG zC_1qGOsS$Voev#YKEl)Xp##f*Xh&pt!1AB_;&I=?`IIZYzaToWymUS*3x*CX-w^Jo z6Xg%t9TVN&Sp##e=wjHe9zHNJ`8xiG6dVr(KlA{C5S1n|v97G3Z&X;GWdhp># z2WBqtyE%d`bD`hs!_Z|e@(T#o1?PrD2WBqz`z;(@<}-dbL(*j~@jET@T;@{0o0EPr zm-)S%O_#Ym;0^NWGFSLT8fN6fEQ!pOxs(i9Br;b?6}3G1I8~toGheXcTj;>d7r75h z*A(sz+-23uM$` z^R(^uqXRRm*}#ya12eZW2ciQrE7`EnLI-B{v5`JQ2WI{hYS)9a%nCMkR5_;sXyzW~ zpw_L?fteIrrlF#sKt|ge?)1=snfHSN!v++Y)7hw1C2rhM3u?Wsg$~TDW207VDTEHp zoXo7c&k>nUHi*?$j3cvue;zNkokQ4=RmaxNoX~-pr}HQTP_fO8r9VEVzlE)^@cRiJ zn5kmJ;4p!+)47RA&@K2WB3VGV089I^NzCIxzDJE$NU$_<%?)%gKzgDd`*{tgEXI z3YMU^LxT>?Y-W?$cwh`2n7N+KS?gVep#w8X2fOXnB)P81@=A1I6^a_%U25H>onimn(T$tZMS6?!}_3a^o9O%F*>g!V>=)mf`mTv^s2SW!|f8}mi#Vpc;3>{egRkVen z1FP@;yA9yMM9N08QzLy%15-o&gbrM^{6yPI=s>?!p#znfy3{aqV2x}Be!qtftf7Wb zh#)mUuS|)^{BOgpY{?6dgSX&6VrsJZz%knauW4knBC_B$%v?6x%#91tSmWXBhKEF? z4nZMq;VI8b3fe(gfT@g*i^#gS6rF1^6c+xA+_tF$_=F!QGX_L$Haj$-xG&kknTe@s z5viS2itQK+{zY#44rmV^hirp;3F21158$iK}nGYZI_>6xk7 z!5ML8B=SV$)dDEXE>K0Dj14Bh4K#Tk!awZrV0WI<(?KBpd$EZM&m&mvvGH+~fVtg0y zhGxdHQ^VT_CuZTWBQHmaAd!Uj!W1)ezCz9l?c6yr&YZ83vsO7pnkWvT%E%GB$ zu8zzboPi0oH6rrk$ax?&1hmM3$Y;P{2xyU?M6LvbA)rNmN(MgxE%LL-qo4~RphfPD z{2f$=6Z;4FoiFQb=Qd(2sR~;liA-39S!GH@?vI=R=q}f*`3E8uRE;XChBW4_G}6TEWRLQ(_0;H;F8?6rFcz8-rHRuoNzD zr5b})(1?d7N)-mJpb6s?ky~NV3YxzQikOIFl0-ZM1}MXz6|Bbuxk+Ns3feF!ZYK;{ zLAx~jFlYrEq`6CB&q>yNZS7VkL5)Ereb7m*$#1cizUWZIM zF+91nOTo{I>d~c*8i`hPGFszU_$efxiJ~a{LAdJh?!mF01Cyet4IRotNVKAMWid#! zq78VGfXE=xiZ)_b2&R!B60N919<@G$G!m_-Q`vn;w4yHTcOflfw~=T?-FVWXz>h>L zdJcOxxSpt9A9ghb7lUGXF~EMma8pNj*LqsQRlMd-DDPqn3#THo0Crm323(Ym7U5hI z`4W`W0y(&7>FV!2O(dK%3Wi|_;Bj-M@@Pf|#@jWU>}U<|5b4Ty?qR3alfXBMC- ztzc}?^a~Iwl`ytwsce}N#uhEZ7EnaKdJ!$BGloKIMKpuapoQW|@)~T?NvC0K(TelI zRD^bdu|<1vv*Q_*UxhQPT zAajRP*qk9L2~gOaVd((6Li|7L6PB~{Y`G=seIb%%kqp&$U1HK>!%NY-df)qAq zA}Gp9VRI$}VoqUmJ{53>5VM>qrV3EloN4C$P!u+2=0nBsQP`YW7Hdulo3ksR_Kpl{ z-cMn3b~AZ6h0WQ+Bod~g6Y?l*&R(X;Lt%5yVLC5g)F84!3Y&8-Q|FNEn{%OGXdfX_*qn=)$VXvwE)Mu)PCWjK^BJ!2QP`YI zm@@~3&AF6mf)qCAvQW28VRJ5LqTCcV=L#nCQ`np=Z@wz9o@|SV(vKJu5_I5%pJ#2*qrZv2(?FHbDo%6?Hz+` z)KAVG!#e^QK$p8g1l7PTQ`ns6{u_z0L;2oENQNEK z^B*BP+xrWl(ZeZh&iC_*@zS9vY|anzD#Iyk&Wm{?g;3a>m%?Lk3Y+tCZjD7@b6yD* zLdWT+usN?XWjKY+`5}{pQrMgyF+~W4&G|9&2PtgM0p`v@VRL@MGSqOmD#&TC9UmoOh_O*pSJh0keI*qpy)$^eDU`77qlOJQ@~2v>3n zoAV~qve48r>=L&JMuDxKT~;2xbB z9UK^gl~6OI6XU|k*8Dvr5_4hMi+&|;n%-P+&aA-?jU-%Hem}KWK8tY%YVLu()Vla; z6D;zA6qI8dIhMi9{lLhya0V&3B0M*3qa!Q<1GtMxXR>4Dou;Ugh zoZXaJmvAq%BGB1W^N+Zg!0mvSZdF$H)|5fMV=lb2GCMVGvUm>J7r5QK$6H@=hI}afZUDhLp-mh2$Z!jr;f#5+!K~ZRX5J|nvz4J(ca7-*(ttJ6{@ozAD0KgY- zjha|}Gq6}=r+`n38k<39DOO#4otxVWW%oHvr&^KgZnijS;odH@>ROWD8ex>Sgiq`v8>;7iEwRm*k?v^mXyOUUn3Yb~AWA|by@O-8bKYWX>8>F@x23Hb$T zvg*!MzcrJPAD$*32k<52_ojXJI+397O4C)U-RSE@q5?lqUapp0dlv_hs4T<>;nLnP z0tK(H8$i)vF0j)nzyN%SYVuPSWEm}@eUL#FM2)dvhpz#AiGysr0`Mgk+h$$k@JVOm zfOX1VaUN`$HGnTcAGlX#FuZMcL?o6PA&t>g`%2Jv?$yzA0AFG`J9Z1empH`dF#x{A zp_a>fyI&+$ggNDF{fWaYp9kPe9B$cZ{Wt*l5=U5OELaWTOB~5u_~O&(VCV46z;@)s zBvuA|2#-pvl4cvgmpF=vg8;t7YUYNv5!&k~)-Vxt8JK^3gDX+T>=0Q3_!9NZ3N<`C zFxERfJv^hlYnhi_K}=ttSjQ9`z?V3hIXHkX@iE&0ZI)Kw)6%@eF}9Nd_!7t3E{m%s z62}F+62O-@-gamJU*ZJYuHkVaaiZ;z0KUXYwv{8|;LGK)Cr`UFn-6j$Zwny{Y zM558>2m$aVnnE-_0AHfn)&u~2i56QB1n?zVZAB2kmsoErbQ#)J+GdNw0DOsdTf60KUW~<_H4#5}Ua@1i+Wr!UO>TUt(*Bmjn0`r-cZp z4?Ue6^va0`;7fd*Mj_s+``Ffdlx`*Bor( zs`ofWdUQ#^s0MZErK|qna%Kf4spjFg!Ks}-!&hdPBJmS&s;N|G|yzk7cnRVGamG2Mx`(<~{ z`#dvi*37I~vu57)%%TwBMS9D^Xew|0{)t>(RDShn6NS!f1o$eSJjM@s0(_N2#~Q>I z;Hz{O8^F@otGwUX8lRsKF;_sfc9R+w0R0lvyt zBveprOe3iX6r+@%oWuHwdB*0ghvsr}%_$mi%Rv`ht%0Zh| zOn|R)w`B4Q7SA-&7YuuP@s*gU%&#;Bj8G%GPxzS-${Z+RR;oy5#Xz; zH50;?0AJN#mAQZbU)5ieG}I|5z*qG*h5H5gsuoz2yvQO8@Ks&!H~Izms-AFtr56<7 ztJ-5t{US-WQlF2kc6Kuj<{_Y_8!e0luogStvb*v;be#9-h*bO;ojb+!|7V zuew7vUtD2v0lu2Ig@YOU}6UX`$k_7l_&Sd}};Y=;SSNkTnq#{(WE!F;-skQ)L?O$m6 zuZRF&t#E=27T~KrDrDDsah?EQ?f(|!h}xa8sC0Q5yLK`j!fXM)+IvH|Ux2SRkq9PW zgv@HM4uM)0t#(#PFdhr=)!rVm(}V?9(?#u($zT-qpyUOBJbxBTtM;`wg@`@@zS`PU zFdH0=m_mTB_8iILF8xxfYAGzhmpR3<>OMzgI;=sgwo)9K{kw~x)OHqH zLslJIH**%?%REtpAu{&RHW;7M-)?zW1aTJN%hX%L;3x*}lD^%&^c{ZYu?VUb;LDs+ zXI^o2I?@@Vd+*>x-!749wR|x&12Rmb@UYx3GWSKImH=O7vvj(Uk4&9FsMEiXSNn?y z@MZ3|8LBhFXfmK>mw8CixHAi#O$qR2USyY!;sSh`L2F7nl#*7~!-MFsa0v!3k7VjH z+pNj#V5YCM=B)Lpq6GLdv*hHpEieb4^v3p%#-`S`%`Inb+1#>qGkK}EG>goHHFK>~ z^*uwMEl!}8*uEfqbygaDWoOIjZ8a#e1o$!s7Mc;8Z$R;qHTfMB;LGeg%AC^@;LH4* zWser%%iO+*quS*YCBTb4 zzS;a3h`@~i-)!#nBPg~2-)!#KBS>0+Z#GX`L=XxH@XhAFzA{39Z_X`ObwJ<665yNj zdGbpaRehEK-<&UyElPlI&aGXDpP)o)0s?$2Wc5>-cpj9a;wG$ z$8vZK&09vnbQKh1-79R;*}%AOB$!kpGvbSxHfxl(X)z$&tZ6 zKJzLzIbxkkccqxOnlf>`m_^7hame~Kj))JA4q{eN%v;k8egT92$6cu!y75QZEcd>g@sZ$cUk)6(%OC0Tg*AQ`5o<7L|5 zl3@l^8ow?s51nEN2*d z)cH;frP+g@*kiZ>ablmGVeD~dI%+Q{XBc~e&9`7-1m|D&-_LS3spkK}~_ATdZ z7%e%&*z`Wk~2sy*pcbIA9 z3}fGQ&IQ%T8O9De=fhy+3}fGOE`q_x8OFZPhM=5b>=oxe@FL_4V|O}lpdOO$oA^Cs zIm6i9&dHF<^5hI-_c--jjatqy_GMYeVL8LtSI~K)%8Z<0?0)AKO3cU^#vX8}$ysuS zu?N{=%NfQVVv{Fl7<<^+hGb?m#GZEkq%ucxhOuWjXygoI&pNoFA!o=9@HttrmYiYi zo3c7lC|^P*lI~CWm)dDa&Tt(PT8zJ0^m7PGhBN6(sX3|$GrxlHunBughGa{+R0?>Y z;LJ()Mp(j1hM$BrtYr9k;u@*7L}KUAXfL!#{hDiK5yE!yacbu?sQ?ogH*hx5?tN-( z@mqfnjb(GFX%+tsMXlwZ&K>oD%IHHf1u2ktIUq(JvFwta1zid zOuEz|8JslP;%SDo5zk|`Rs^k5lPx|wWM@sb_yV?<8BMmt8akJ!Ls@dl$2bF@z;DIX z_^IR$v&yeSS-DjTh3@|>Ev%Y)#kL< zCa+1yFcwL-?CZ;o$?qyLAWUAHo`uJoWmex;UdQ%?dpRX~eYy*&x+X5UW#{tv4D*Kc zrPFaOY2;!@ZX7EySoy+NWIzsZ0vQvB=6A-2F=nBULT^kzRF1&_bTgA~DYBKy;$^X? z<%}M2Fp)ej`9Gz|Qs;`+(P3oq{N%Yf2f{05_yP{&gVI$p{1Fb9r8`&4@P!=Cq&wHh z@JBh^knUV7!yn@?J{_e`O!rNw3%)2x1+hHcv9BpVE|M2>aCN#nH_(Kuxg;3}x{iX) z2wuv;6DZh%;Kw<5A_X@f_z4c4Ou>x^ev*TyQm`Ar%Q(0`-J(wXDLzwkx_KNDMW5!p zwITrJpvyVXi2wwBuHe8K2&@vxD>-lu0&7L`GaT53z;PmZ6$i%BUA_1w_p=<>m+tCA z;A#$>pYG~M;2I8GlJ44pz_lE>Jl&NagQ^h+t_6a?^&Gev$RO&P19u<+1P*ZE-gMVG zR3;xklI}WQByZy5C(~Uka5bOf!1D;;YHsGhK?HC$w{YN}5x~`ao&&EVuv#R)z=2;O zutp?r<-l*#U4zKXZ5((z^J*DdgHyT<9~h60cjX2K^JsA*`FL^~nv{quK)cT*pWtXW zCrbH)5zqW2o9{@Jw)f^I){o<>v0Xi*e4eKmxz|QEjE@d8_B3OUNX)yHRK#Z(d@=xf zai3-QdAu*KKeMMrq&`6p7%3Z@`XoJ$lx%G3GU{P;FRFB6-32Sq0Fy3_S~R3|V%=2) zX`|MObx$GdOnS5pe zNyMgCkX0Jit`_O1IM_@dgj4Wo4tDZ3;mJQy7wM_V&P3KYAmwF$>AZx5N?3eWTK?6c z$TQsJe>=ayN%4*NUUY#IBKdoVdsX*hq>%iBb2Y#O@&3oDnPKzZwt0V4y!vc=W7ozO z+Dg1-V@sEClfQGeAlmG2BAGdpBKapi+nm!Ud;8_-{^EQA5c2Aam;7HoTb0tREv>v8 ziBwC?+R`fd6qA~@rPaSi^aNw8L}?9$k{ntsN^2<^o@UfqAH^Y$TeN0vX(k6#g6z|? z9V=F@YlOz`#*#lGOr;@`ttAgo*3$Bm{I(Lxs4Ge&HMyzeWiV$Fy>_OTG>4DU;aOrP zJr0i3;Vd2&XLNMHZ+u%zwy~?Fan(vRkmUQ4SI@$E)cw7E6tDTo-Q3lRv|PB7wjs8~ z(mlNc(lE?Vn*_e*&*#SXwK z9q-N!ai1iT?`Q6GFHQ7#<7}FlrV`(xV&^$_8QV;5E__symHqS5i5o1`MY*%2kd(oKFK zNu@vcW+!=P@&)w1=~gK1Q=j`K4x*}a1HFCwMe;6lGIalUC#hm@rc@g#bHgLolC z5D%jVIf%DD1nGJ75Qp)OM`2{?VGiSsj>5>)BOE?QhLNqWad=FIk+H9H_t@yv+pu*r%XWzA$rqAWBZ>5SJQPQ~G1|AeWnhRm((l<` zWLqM=bp(U!erl5<`4Zc3b9RPOPQIMH7YQfb6Y)FqEZoE2)LES=Ngvl2}-1#=dMW!Oe(pe&w##Pw}AZe^Jtn1hV)ke?z7;6^2?k;l>9OSkd>3EN`2*S z*$YE{*_@b98ZEzUNYV1k24?}F0`kj+Sx}Er^2>%pOA{D|7nff)^h1+hHvF*sauDP4 z@asK~Sj8n1h?HLrrex%8rBaipvWOl#lwv@Bxo}!rwzqUisoZfZktq3Plg6RSFCR*b zu>7)#btv-7LAF;)sQC!_WkW~T(+!W}tmd)EAs#JODM%GXO|a#cO)|yhmkrO$m%J+@ z<(Cb+xcsu=aq~73v>&oE&rn3``*4uMHyd@jEJl7_5H2jg9LR?M3bp*QA%*3agP6>T z5njB|$_uJzbMyK$jcWQwEwHfsvN=Vh{Bjf=l3z9?Pj*OFVoz7&=I%C{k-*Eem7NIr zWs`<%RJQzb5Yv~+EfW3uC#t`(iOfOZ*yr(de-zAz_TbfS8+gV{+ zP<}b8rlPcn$OZ$m{T);#zI`fx@&X`Q?IV zkCb1IVjqJ1@|4j`&6=k8NaTe?pG`NjuT34tJC%;}^{M0d(sm=0Thc}jMm`9C&w zZoDgyx5496$2b)E`0jVVrGlz~_rbik4rFJWW7;xgaMf zzZ^wG#~C5NY?uY*mkp(m{IX$0%P$)|QhwRMh2@tGM-Np|OOf)+hFM5{*)R&rFNZlH z`DH`lM@c|oSwMc-Falsme%Uaid4q)Q=;Q@~JET#1OnBe1xC+2~qOPzD(EzOMcno6qaB1DAZF#%P)JB;_}NxtIBR@ zYj5F4lAHRMQ;)*(O#fain_xaRM;~m6)X#Vw307J^G3M9FjD`SE+uA=O3;4FF% z=6loeu`86bVK$prAI!k}b#(V2HeX##D}&giSvx3(DC8$QHk9K}Wt}CGeX3#~k%a>! zc?f0)@;iG6hbAH7?Cg47`3n9S7fS!I-}Eu?lH+ecn$&4`(R}%CEMd*p8F^n0q}Uam zFtEl$XOnP-c7x?~&mSBfAgyC%h+px@dGm8{?c6amnBSEfm+A$Q9J}JwBX{;q;M-Z+ zly;bA{%@hPz@?Wb^qmp%&4^vmy6{gbmkW;-;-aI4IEwbF*5xS{mhX~fwi5825{~6T zIz6^$*HO+H&T_G^TTxC11siPV>+Nx_>YWCX1N}Z)2zt>Ax4QLNZBbAs+kXAL#{_!ak_ zHy@uEpaRhJ*V6hd>SN()Dz%G{#{c15b`eu7+NOXj04&O?zyS&jsK6HyIA%fx?n3~j zfh2`E7He{X{*o`xKK2LrpZ=16n0@Sh_@Dlgug+e)8~@Ya^s2>6u{uwG)2kPsjsNIx z#tn;~0Z4x{GD~`QpcxDK8*g(K{}pEXo4IiDcKk#7}mLDl6#sud^scYE$mqEnGOlgCc`GSaeK zdH;xD0aspz4#}1GWE5-CZN_g=SKc3^oZWr+fh%tn$RStWIxNXYxbl)Y;L3Y6OqMI} zSqO$)dEW=4-<6k68gk_&V_{d`N+g2iSh;UGv^UJ=<8b9Au%Ih1fem_Ra=7wdfN-=c zFEO#Gt9B-bEAPcH_*{7}gW*)CbWCoD3|HRIz~FP`B?A_Iv3)z;)L97mW0T=moF`z8 zcIEvY>LKaAjo-h=mG`tb)tYj4fh+G(T#c41FV}ITEAI?M^}F(ZnG*B4@=}xYyYg}) zw00(kD=(RBSKdA(!>+t3Tr6cyx$;ub=gK<+23Iz~=eX|5{I0xI4;d87?TDwh2B+2$ za^-CS@p$~rqMt)?<)tg7=BOgfd=z2wd{SZ0m6vQumo6~r&cd1DRt!tnmG?SW!>+tv zfz@*cji2%ZPV6=Omc4tmuy1&k}h>5)yi{M`Jt68_%lOv%V|jYp_Qy6 zNE@{uTFEJ7ok{g_9Nb>3L}D@i1IzP6D`_P_S=bM)q)l0jA6m&Kx^+M@erP49(ai%> zgdbW-yDX5PA6iL=vKxOh_CqV#OuaGEGIqZoTFDl=m5C7Cue{`Gx(|wbsCoO9Cs*+E zL>6=EPgKl$zw*?l91a@)vedsi#I8^dTyEu8QfO;5wp)SEv#91|Xr*wg`6g#jBMB0JN&Fq3HL3Ycl-S5nvbpH!*?M&_<;CjLdP+{2nh^KG; zElASFp6lt`bWxjq#M2K@S$U<%p6lsHJCJ75?dD%Phlfkg_4KnN3{CJabxN9`J=fC* zDG6=$JlE5&QbcW5p6lsf(22BBd#!CXo}L}Dv(I{Z0o$vM&wA+^x(f^KBc9q(@gj=7&_3d+J`0X^WJ&c)O30BV zm6HG_=p!6iQai1bc^NdqktH=?ks=&fQoAgir&6LESyF>VSa=U7N0!w4EDq+orf_6Q z?Y8KL;K-61viJc%^$dcL^5(vZOAtXhBDo)TI_E8)F(rjI=N}B zmsykojx4E9SsZRNen*znr!73fktKDxg%@#TNnK&_f{rYyEB#>5ktOvR3)l1irtM!9 zf#UWEI3ASyERQrD;c&)HOwE%B5t5NL^c$ryW^R*A=D7vm&+Yi_$ztmedVJ zdD@XBb)YCsJF=v1EJ{;nT_sXC73FD1mel8p(&Sl@+RYZt_@{KY^z@MXZq_t_TOx^A zklWJJ1BXSmUY+`UahmoQNPS@no^oVK-5SZ0cey$_IkKc~i{yEW7+(HvkL1xB1NR3W z?~4U_QI0IBI||dyg1G5=?<`FBR@`-oeyK3mOIma9D$MoLfT5iKf`40Ye$yUR|_-IL$M=E>b}ApS?^xMyuUEhzT5{2 z(?X6csRs*_!;UPeha%b0t|ewcJoWI@(M-*nrufLz(Y&Uko7vZKli^_8eJKk50|@u0b~H$EJ?qU4e}8_|!2%J}6!i8_<1Yvx(Fb?;sJYil6*Dq8qP| z)KgPOE9iR?x`e0yKN7Pp<(YSojCD!RzJuu2*`JGyu6YHP;Vqu(q_rbma` zM?CedqRePVmelh_BSko}q+W=QVLP&bn*mc4SE%wBQ1cEUE8V96gXlErlIfQs1|jk&Y~>S1d*WN0!tNA~=3W zmeda|3O~XEzA7U1Ba0CL{f;cDf3lb%N0!t-TWC>7mei}!Oxuwq^_s;g?#Pn*v7{Du zWJ$eR#S>_LMua0v>NP_&1324}CG}&&@P=--pGxW{hTtXPBmC4)u>Dl%OE!`Em%;?? z$ddY*;S_LWNxg0;l+y@DmekJ;rHCU->K9Ba>1^w0#3#!=?eN~fK#1CkNY&IY#_rUK zY4}OHEAd;l5kKW8V8XKeQB0un5xxR6ahuy9SAl2JnfNk$Q7TiPrtQb!Off#8zFge0 z6Uu1p-H@uQ--d+j&l)WdJ4*p{(_XYT-laS>o9$)B-h^FWX)E)*NX=mkJ8}=6o7=MU ztlao0?Y|;YbL%Oy*phq~DnU^Xln(qfn7r$=8-R3Kw{& zJ8^S6J!G#PVqatiT$NC2C*6tkr1zb`({%hrRBQdy{z%RgAMsx6K ztaki-1m&yZB zr`3&g{8zdJ{X}F&@g9)8e~skjCr35!LCJev@n)MV>Zg5yoKM}08q*FA%cx@T&pGhy zd}sn(fORnEQyWpq&G5#UGs;0~v>&42Cpq|i1Rp|hZpommr9U2y1P;rh(8hBE@*H`} z!}$tF1K@wofxqA!^L9>-pxE+M4NjM6FxjIOGngoQPAAfw&$;QM+|1{kbWu*`b1u3l z7l)6@w0ekr_*h;zTVJI!C0$DV2s&Gt%EO?{0%P(B{(RV z34fh+I5@HeKMPM)aTlt%Z^FniF9(lfzCZ^Q^FMKLRFJ>ulava+$zF5?4&F;2XN$Re z?Ls^HnwSvu=gboiqr?)T9|`?~onWA+0nx&JIk>^(k(+nm_7d&Z5(|5@1lRXtZYqyH zbAmR002ZN*=eV9$9y{acj>&DJ;&a>ZTaqM&!?W<0O5g|Oi7sJ~x`fhA2t!v;-ICId zE@7IqH(2&Q;!l@$;j@E3L)u+s7w30V)jjr)uR7Uv?BYGf^QgbeRb#87V!*$DerNR= zH(pF9e;3KbZMUWe$*`9yBMb4e9c3uu==x7E6mA41V-vd|7}@VRx7^`uMIuS}-S{o) z)z5w5nnSg^9mxhxxQdWPj08@)nvms;m=muddF_!JiXUE2KeYyS|m?x063s#gub_XtJtQSMG z_`As5T`}S(pGejoSpDRa$h?)(Kvq%AdF1zGvTY-(v7JJ;?Pv;AS4o#zU(#L3zwbpw zg?-LCU=916^}*`-oFz`V1i_^HDg0Jmho36$56k^NXNkt21FFzIXNmRH}$FgL* zyy~E1S+YafjRP4wmL)gS^N{jhK;SI7g*sCr1RcwgPg75Hh>m5c75qe(j%Dtjw&KF2 zj+vWrRw4)5%gp_hL)i3eJLb}|Et`9~&J<sDG*`M~ zZpI<^jM_mhooRz9LH0Ow&PBS54ijIcFzaU(kuPQG2tMzDcQTtMq0o{R2PO!rpA9 z!r6}&;rC`MP5X?>o2|4WXqDbPAg^hg^2KGa|bLEt$ag&&f*Gpmxc3uYLqvdJ6ME; z$vE<6bKhri*xje7ER(z2q91}cn>%Fj1Kw=za0mA+qhw z=Dt4!M|d8&;}$FA&F1DU^pL#S+=)Yq5%6YnC#_ghdb7EELTvBKQ1d}=Hg~T@kM?GB z_gNIVD6JFn{Da*67N>|en|rRs^YXld$YNpD@xPeZ0^k#t(Z5PdrKq{9s)jZ zHuv+zY1(PX{lXMH<;~{a8p)G)xjH#{v$?lL@~F%6d8xU#NAkQSQSHs!9Ieu?8_x{36`*I&BObdClxepd5 zhrQX{ha%Zid9%3>PaVzFtQiG7GIcbs>F8$mwW;HHr_yo0K6M=9&E|gN5ZInKoBQb0 zZ0{Omqke4a7~U1g7>`dKV@hu}_lb9qh}CU8`FBJ&u3zp`Q%5^wZ#MVo|BuA1OL^uU zBx7CDv+p3fb@t~XqepwQx!){GrbmbJW^=z)lo{>K=00CEQiL~~`$BXK+nde(c43as zo6UVOl8BBo=*{N7WHF6or?@wp`(sJ<`>NS4Xzr_3Jb~tCM0m5guNk5l!1aH``gw z{fQxXN%#mq^%FwgZ0^4lCTMRq_h*Jvz?;o|-B2i}5#DU>&kd!BH=FwlrbT+Qxi$4C zG+^Sn4nIlvRQy(M#ZT2Mm;kTp!vrcHkt}~tJDigsbqq(iY&YE5pn05aZdt!|qgd{~ zXKu%QOtklqtAu;@-0g@5aeJ(z!^el*(0Z^CmXp3}?t2-I0mfPyJeshzF>jvaX6L?% zM6dzU_-G$?VQRUKj&z1x_hj5JVzU-2sg*3r3J2AEOPg9X4Aa+4s8Ji zMU%O2A^WsHNZ)Ri$Nh6(M=`qC@&ZefdF&9S?B}w5dV0%V?3XzpcgGg)2j>1K*kznR zcW$_MY}Y8nnA{Jt8UA}%16A=qH1}yR8&F|X?AX|#aNW2&=T;w1RZF#65=9j5hq?CR z!P*tmFPn|1hvdgMqbkOC=%M-X&8TK}ysNV*+qNOwidmKR7BO=@E#cH*o4+RPn$Xs> zzOlPSBxqv2>a%}9M(T|@+p)F1r;VPs{~5h8=@+^p59u^$v;hLCd&#)H8R=65~`F2e3o!mL2cItsu%jZ2^kCQj~wsXB~on z3Utxp=5*MhS&_Lpmd{8StYshEJ4bqlaIcK0yRCf8!aF91CI(M$6XkCjqr7AfSzlt3 zYa?wkB&Q3i{9X&BU8X%?deX$=?WZTkX(7M-OP0Mm_x?$`fzcC8;2s?opQ;uZVNz}wz9XIC@-xs{4VUDgicA_ow9auvPp}wy?1beZ#BsDiSmOM zLZ06A^u!+319X|=@OLRcvDTzc1gH-VP0HtsV%%aeIS=&eHX8cgV z+B`bRRrnjr-ZVNaA5+MN>|dU*x6+bN>^ArUczN75+u$3p7hTun2)3#o5#@JTfGQIt zs_*mPSSS@VxjSzkoY=K_v@3@uKpWca?-^|z8ymvdfu8!9gAwKT%%PLXEz&n{ZEqJ9 zGae;FQ)3T$^p3`^?pEyo(j_WpvYG4O^Z}w`md{LgsHiA2HZtg@P*HB|NP_QlQBh%x zZ1LEY7NBo%QBh^Ax-;#-{jnQOt)kjs%{%o*Rx3nBO_Y75sHlyyuM!m*wzDrm);t_U zMcsF}WZJt?GK~W$c>UZE74;SbJKq9uzVR+*HskWvKAy#vkTqhq4t7@vJTK5J;2*e5EE^_i()bK^9&&Wno07KBeqFr-G8*1MB-ysuai z!kP!svX@FT>c6RZXMWr05RwxW%Pewp)0U3LJ{pDV`?+Gd1*2_5_WBhoEE2j5%0E5t zD^^-|M3%jI#VX5+8lLPOqUJuK(A5@dJwZ%gU$MqwP&er1b*%+7H8pR*2Cb)!j|_>5 z$X`fJ5u8El1+9W?_H#DivE?VU_z6v;L!;w<#s)uw3&PLX=x69M z^pjfsBvk=^PMe=&m#&|<$xl=z?dP24=lB|mpV=N_a-;E+I{YNB68)^rewMCKKWU4f zbcXE0{G3jkgZosYs?$2%hUxauxV(S5Y$ewH`GK}vY zd$2R=hL*;zuEsM3K6k{m$zy!ph`e=U3%iyLZJRL}FqaJNophat$;0h*JdcjmuHg&l zSZ}X;Bn7tW&_W7%`s1fkXnp&Z^`eoEkWNcuhgdI4+ zn0RJa%Lcfm(=m#%rE42akepA!w)Xaxji|K0{mlw>Gn0!P>idmdPT<&Jeo0iMm7@C2r5+HB1$5~$4{f7T z)V28gfL)$SjqIy4D@?2o3?xyYC_79XiRxD*#7@oG?n#WL#`n`p<@hka(TVD_SH6yS zl#C=aqxnT}vNmTc_Bd|N?Zgy-e&`HRnfKb9=0Pa>kM~nM^qs8FCbbPCpHZjF*{sIN z{=v~G)_~30HrStwWDVM^j$Hp>FSV+u^ma?8oUfpnMt--Tk-wzpW;N02F4jV`VeQNAJZTs zd7AF4e$>Kyc1;fN7{Sg3nB>Gf2^US-aVCB<+RpygHmsnwjbN69-a4xK&fbC*dKSW|D`uAHdZVNDuq>q=2`v^5K?&AJY1eqe#vK|P;ClOG%E-M_gP?{_sP zT9d^T)tfV`IS@e1yKhacnGmLot6RV3ugZ+wQ+d*zhBC{|gnP|jlQh)HwE1yws8jPd zh0}C9lEvIT%1P8LuqJt7Zl^A-=6b)e4MRgK?@zeC(o?VCTWJi&N$#B=UmT0Cxz zJ?O*6MQw*{zPQ51$%#?fO{4B3+cB+?xzB1SJ_ymiZZ#9SD|#pTc8SbGR^y<;(Bs|A#a5+L#_%3DCNgWR z$~M`3HNuKBc3PA4MCL61$SQqh1ob3quAI+?#f^a+PlMz|rq`O$Zov%vxGbgDEVH~? z3;d8Zk=;ExM*F*1XoEFpP3O~-*_p`zpr&U<=AZ@0{cB__g8q3~n&)5_O40FoDJitf=k4;)bZZIs~?; zJ%8$El?3C_Oo*tvJ!Gc|3tX$HJ2DxJq8^kO6SR%wc`GE$zKgn>Lc}H-yXsZ_y4qAQ zAzh%<^hDj2Ask(ms-$UdFm4M^0EoKt3LsrM3=r@QFcN+{MB!&5H&ap9o3@hfX~!E1 z?}AfzyR+H)b&h25m=0%X zotPNwq9stgSW=!K;>GP>ZfjPG!wG>=e zHO(pu+%2lXi@HtGz)DefpC9pB+Jfo6q?8>IKH>+gcKe1OQT0>K3plDQsUo~gEuCSN za`$@3rcU&4?P}NWef1xfcc)tT08S;0#yc_EhoY)KF9>h2(es1o#?dkCPi3NC5F}9Q z-3I?i5T~KNfiDcg9lH(q(I80U;obUGyZ&QAxO;Tx1RiD+82O6&i-KrVKTX}LtG+md z(%S^x$h4R#-^=PR36kX6RL)yo*2^&Umlk54H9F!g*3^Govbg2RYN5>g{S93D(&)HW;X{Yi-P5SJ&B)T~F8BfNXuHq;If6e+3?}Az$^}=tCl^ z<|aunMd`JQ&sm6?qwsD8+r>l~k{U6%AN3WMn}&))1Q~6A zG)S-am=ws1`nSUbemQL&93l8DYt*U|H!x~JxoOifGZkR#C?0V2YphYLv7TaCb)O^Z zJFG#hwo)9K{kw~x)OHqHLslJIH*=aw6ZKCNVTgKrXd8@A>2J3@EP^=C#nsna!{8_e z?vlRU>@8FOSOm2jvl2AIsz0U9yyEI~;_KwD;RxD7Qg{l3mo5{l+v+ng1*37j|)mNm?7AMfv zwJ!)?os|Y(+1YY>TMdfral?UyX2j+jP`qSKemCLu0}J8QQ_2>z?&I?i#8K_?!Q|YAwyqAjctXoOSm~-?b+kFf_VM1aF`nC1?WE=;u2WDpl2&*KWt6Bc_4;BYE58v!g?0!6$E^V zh4rS5V)pHYz!qL*nBC0tW<1G)aRX*a#2o4F!=*tVHEiyIt9N5lOO`$$7jt;>K;v%yc82->zS z?OQvLjGQ|PUqlDuZ|#u&_g!KxKQSVb+0eeFv-3w9z{Dw95}M9NF@FW=S(Y6JU(5-4nw1pANjd8dn;aQLcY#D#vB@F1Elzi(n7^7b zalDvC$p671Yuh*?J_z+NxZclSa~h1Z;-^C?2Y=P@c2DDf?A-{nmW#>m=*6OqenkN5dE{tZ_EnOGEyx6;th7B5Uga|aa900G*VXrMIaf9@NI zK9kbG^^agWWlt`PcfIk6NhpG0^p0}ArL-#wrP>qoKfeiJ((T0We3L@|(9kgaY_a)i zZyqC)`L~{mtQvSvU*8ah93Fg|g7bkLs}KL+Z&8s+_YGPTQOZ57Td|gY#DP0-!VJli z4Zsonh|k1TaTid*EnCw7sa2^ni3db>f@YK)Zo29CZ?S5Yw z?ha?;=B*7)#~UN|)?iyLw6A_{0*($}P)}_Zh1>B77PBjpcKb{i939 zbEsBGaNeu3{7seTi^?G-1wpWp$-eBK-s})9w8t_}<8tEABi(^F6RcWz$ZN1C)V{+d z6o`3o=G{#}l1qi|X8Z_}I!(AKmP`%nrY77HgP^YxG5pAliQ^|9hNv+F`UiLJq_oap z!`?nA=^5XVrKDr2JU)(@Xz=7$DU}k2q@-seAx}Z}WI)n0eur}_5=psV!mm4_0}!07xAZ@=MY@L5fN)(6g!>AzvcW8##U?so9!EdE3k+^&nI=A zX~R26?=U;uyHCVlVB>U0ZWfE1e`3gNMjZdPvmc3+X%uT37Wg8A84V6Y7I8ecvkz;l zDCd_LY*3(xzwG=PDJ^oQ$^D2e=69I6Tq7d>UFUb8u5+d-&Aa$P=WQ5HB?CGP6v_9T zzrxT;2HpuZ{(Uxd(%Gz?isP?1$3RILlAgNGwDxBFPUj5NL&|+Gey7ViQ<$o-8EE0E z3em%jPhy}~7Qfs1D)^;xK}Y=}SY3{!eC z-y;4D2a%XIJnQ6vyRrd3Co8seuc@(b%IZX+(7l*)JCT=^OYJm~NcrxJS=3I;?#0io z_$#NM61qPoYl%Q>rU)m*FDJk2oq$8y{BpoTun{n4|!00-0 z8ig}%Z2g&Vzbp9!U4M+fFD&^al~$}-1}>xQClZOBL!-Uu3_B(L@;2xOrreqMjkPP= z6=Xw*UFAxyo6d~)Q4Cc^Nb4_SBFkK1q-^8u3Z8mQnS+fP)%Q^0;JK z;*$g*o+Uo1EMpV;K1*(*+YBUIe3Cj-mQQQL9+pY%&nlBvp*qPzy7YI@^dA<|W{*;9z5DEaZn*eXa-QYgtGlA@$& zX#Ug!zlcM=qf;VAZ)_r+>4d3->@mC`K#GzMOCF&xPZ&Uok}c1ZMN3h#4=Riu)l+<}NGcNhQCIXqlT zQC`T%k}^vJa=HL(V`WHDj-y2w z1YhL|NKx8Gyh^aOB53ubCpq-DN3@}+ESF%5zNSTv~*y@kt{xoX&S{nqI@AvT~^wa z8=&v7=<7arLHSEaCR2*JO}t~cM>3_M)Qhu_4GT(n?bkhuLyK^u7s{-=sQd!F7}fLC z0*Smxk-qLm%#>{G#>d_j_oE3a7^*G-xX*$MDr<5IQOcSOKrzUc!|axKB9t}FiTR|_ z%9@50t*mKq(i$L#-M03&md#CPn#~}gtXY@^VF0D9X*e`xlbuRg)6fr1S<~>t%9=rp z%Y$SFv!s8+;)NsDHOK@al{JGY8RbGL!r=*M2`Fm@$pK}}AZ*gwvK`*y$ew_*reQ@X zYZ~-Wl{F6~Mp#+X#5xpZ%^=&mGSqy8vZkRIRMs>UDUhWTvXwOrr?|4F;d%Lzcjfw) zR@}B*x~!)C0jvCrD{Gomxp^CP!4FwUFci`HJ{;um&E_@E^MY_;Wz9e~{8y-zH4Q1O ztQo{)PK>73g;rkR2hMVnUPeD^frXVd%_$<4HKX8=vZf(ra2Z|O`VmMHH+~q zWzAwVOIg#sH|C(W+`hH=e2Ea>%gaJP}Yp%$@^5DTq$ct@u3Z)hO!p)JwItz}3Uj@rHTSNMN zOoy$kIVC&L{2!Y-H{KP<+u-r3V;qXI=9C!?C1Uk5PyQWwuw*EonmXFwqpUgQB@|4| zx|C<$L7uEjdiEVex6b}tWb}f{no(D*$=t(nA0nWvS&UgwS+iKAXl2dF7}V9a;`?yS z#Rw>C7UTq#HKT~=I3tub4YQ!KrlAy4)-;T0Wle)eDr*|Ju(GD%=%FfVDN(uBA!SIok%|iUGwto-}P?8|G}~ zhRa%9lX@9wRxNTHYun~yYL-9abl2DZ7fvKfJMcNPa5vP_Y28wlo_Cs!oaFRUI)T|g z+HGZXS!pL6VenN^yZ+HGT`%0kFxfG2_>qPdCDj6v~fW)6$XJMeM7a8F}&PAS&C zV8H3@sO`1&xZnm4^u_F8@bFUaJ100G&>qz8W=?W}NU9yU17+fFsU1L(q+BZG8B=MK z=HPUsW}MHSOSuuH{KZ_9HYvd|z#(nY_z_gjn8?;&3wzq6Cs7M1#g|EzHYrtdLn%3Z zlc&2U{JCQ;0SmAUq_jyXxF|X|TAP$|w7Ar#O-iPv1+JU5Nh!0XK5f!8ETXg>&OLHv z)7?M!-!W6~V)j0$O-lCZr9o}d-@{tQ3HY>0$&BfKTbq=Y$r?~MRP4zqv`LpBTPb%K zb(t)rO-jkcyjdvK5TH%E3Q_Be>5Y1VB~>xLmy2;b+M2qybZ^{w8nl-Bg- z2DC|OrKRe#GZtXO=_1;swVohMq&Df(xQ-}__kH86Vn+N$odjPZwqUa8j$>TbwQO+Px^swPn*=(qqIpaROywzl`=M? zDyU^V*Q5)htW9cQzOHZzy`_c{L|L2E2S;d=`fzk%wl=8`^J|kDC_X%B5u1E5S>J#A9U zoGYMBYA8W%QiITFBSM?hPl(bcH4Iyu)NgH9+N6GKv!_jJ?D%F`ehveNSlPckUvE(L z#BPJDi2hu*eA{e;2ee5Ipn5DMik^XWiGO27)1K9bqD@L^*76Fr(k6X|3}J0jHghLx z?s908`pin3)Y$ymq{faU_)dp5sWGxef6!A=X#titsj=$LRDV!dQEf24HffX{8ep|i zcG4zgyZRc%dpJOw^oLwBk=mpdgy#w00`TtgE@n34TzayM=9qJEul^7N3@iss8}BWBDF~)I3aCPKPN())K7@gCiOF-v`PI8U55TDZS|9) zwMqRPyLA1DZSoVNwMqRPUqkVy)*fO;X_NX%UM2dI+U#fP3iXq=_({>)q&5flsZK$4 zTBqAE-5wg3_fMA%M`)AUa7dff27TJ377(RPYQvG*q!uAUn=}ITYm-J0q&6u7Jm9dj zNqH3Fy^4mkN&T;(A#GBE=Xu(s^x_L`(sS0}%@@LwN}H4pr8X%Ykv1v+4{cKVpR`H& ze`u4^|D;Vy|4VIBIwFlrd{Rd?Pn(oNN}H4^tW8QsTB~U~1-w^%3Sf;$YLilcv`Lvk z+NAOT;}UrQZBnK{n^YR0P09w+CY2V_CZ!{(O-e_!NXOcw6ku&qI6m7n zJ#A7lC~Z=CD78uHSZkBgu~s8Jk^)AXltM2O-jd>HYo*-HmMczv`NWkYm?Sn zQw>U+)C}D9$OPJ?#z^B5J&c7msR6>;q<#!z1S!$xX_FdUed12qq#>gk)IponKwbvk zcZ4xo+N8!v*`@U>rA=x8{T(v2NsUqEgFeqDZPF0nMS9D^XfDvxCN)v$%sy>WKSY_* z+N1^vXpDMMT5T4NiZBm1Uv`GyV)Fw4ZA#GB_2x*fVC`y~uphlb2*rK&b4IZscYVc@n zQiG#>^lF2se&aX;c+*{$HmN~ruEVEIYM@AMQi6FZIYOJ%M8&JFr%f8RvNmbhtY3Se zO=`d>ZBm2Md2DS`KjPCS^+8%l^RH^2*snc`4=?3TU(hC{u}pmtZBmKTbUX3_X&a?Y z>N}g(CiNLZ+N6F|ZVzH>lSbiu8+l5rbF8^v_)+RNWtxamIR2X`^3vE&Z&}TGwk7I38 zzg1@URjUaQm#nN!>L)90(vXq0N&Qxu?6kTz)$qjYJmKtP)`gax!ogSfY5Pv0MsHffMxX*^yX z0zJjZStY@ETAMUzrwI$Jrjs^l5K<3HUI573+N42ZP@6P}>jLHP)1XZn#BFWTAO;Tr z+GY>hq|t~^n>0xAYm-{2Pn(qOMYTzpA*YZ7+N3loQ12myv`Lx8W4f?5sg-tEo75N4 z)*t;rsXv~L&6wtkrW%D`o0Mbg9O?QYZPG}9wMl)5*U}bDkFv8isSmK)?Hhq8B)=@` z%4aZNmSsSj)GFmjZBi>H;Uve0#_MU524J7Y<@rtk4eDH85G1e~ph^BCL7ZL~4SZn` zwlyz58U+2)mLChkJ}I$_f~ZgY^5PI0A%J;FkR;cpBDF~a#iW^*CK@E+WP04Ls<}xLOi}6ynEKCIh?=9&Qy}%7)(e3$BBQKLYM#)PlF9yg*5FGo-$0wx zPp5Szzcy(xob>ZuM$m z+N3@>LYvg!BtK$llNvy2lllzibqm_0KE%={jk4>(8MH|ata8pHL1>d2fLphvO==Jo zg$Od*e#?i$0&Q*5P;4VUO4_7FVAdvOJg7}-B2n{_ilwJmV_DskkT$8|YAeN&*}uC8 zN^NJMHDuMXbu-u6q~Y{6gS1Htqm=&k+QPWjCN0juU1YRL!&FO~Gz+b;8Ew)j zNmN%KKkN`_tW9co!AxIi&1dUO7tkiF8EEqRnmIT_QRQ%F&$)`Sw zdc57pYF1z=m7v;akElNLaO+N1?&o;GO#Jg7}tfaYnF7Qk(7(gGB}HfaHp z(IzcGD5y);+Ie&wIOZN7yVYH zP3pIL+N5meE;U-4l&?65TiT?ITiT=~6f_^&q`!l{WwobGx(rqhN^MdSMRTh?ZBh!R ztMN^PtxZY^O=lytNjotuTz0snO-fNnoAhv_P0A){ld5z{o0KwfyeK0i2I)us1jK=) zq1Gnt170>82>sQ-+kHO%Pr1a^`awQz(lQ$`+N9F#(m2or^TKJ!TV=ZJZ4-09N!lDGZ2G1qWD#tdkHt7ONWB%t} z!4=M;G;sX|v`G(-M5*?mO}Yah^q=s1q)8#9P5NnM)xaTbQU!Ny-OL|McXqdIZ6;w~ zd?6>5yRyPrPL+x@3X@tkH)layp@@UDeIRNxpCju^vd(v%cdhI}!|d(H_O<=OIZ@t& z5M!n7x}1~L?KduWpvg+bPRK3dVzEV1ZaBMVg>X)uh9u@scQ#x?N#*ws3umK0omNh# znnZW=!fB(BD`G`bT`8PR+hnTkzob-=_rX4#t3xKtL6A1fgyF5ta`euYVoC2ogwDH> z+QK-hI^*2Aekmw*yGy+QgDClBh^hKZ9fbvzk3)1m~qAbdeHsb68kMB_Pp~iISq2r~$ z1o#P@d)cpXK;^mY4}9>K53e~+U0VJhA>W3)vaeS`hakS3ai?g0^{HSntIUnLfJoEPS z4hd)2;m(A50_wt2E_IJ7m-^e|ve~_~&1iNwH%$7vPKo1CQLm$HQHV1S{bV}cO&2nh z8=>R>OKt64*fJH0|A>t(46tiOKXpK=hxwUPf@(f-P&hxQzUIUo!ubUW>Ya#gj(R!a z{E~C^uHoMC-8vp;hBy0g9&o6coFwz{z}Yx8CGij^fe!Ft>HsPAM<{i1au&}5+Q2Uh zkwnZsJKb8uxtB7Ef6jpzZue7$^LXTT)8P-%U`{;>&leQ^mH!S#?20o^UHeZ;`}rzV z?wa4Jz~>Nn0lDE;dAVu|=sBDf)N!09*8atgHSK+}tvrQTzvoz|$MV$0#3s;s$`$%D zwVssw3;Z_H-QS?>=g{TgpL2kkEZU(_6m<2D^uy^0B z&<`Ps%`xva^+356V*NUm!e3?V_4l(reRadwJ14a7R zj5Zik^5*fplroPU@f46)K`HZCP|7^6mC9o~{!B3=mC6$gNu~0brBq%LP%4kz;hc(= zo^&_hH&sxnJoc#bQ`CX`4U~TDF{cJ(ktP{&tyCU++?kDwOh}`rR33YR%`Ta-tWQei zu_v8l!JJMeD3!;aa^8dB0*c(qjgIWW zfXY@XkA2&zMj~Yzg@=QY7>~WkU`B((wo-ZQB?cQ5C}J-=7b2xaPH9l7JoX)CF4u^N zeb>1Z)OAj&5=f36bm%?cR5GwqdF*@6XJKe111puszR!kEI-8|b9(%=k3Op#4>pIht z;;}oO-=i{;?w{~GElR0;I!5+ErSjO_P6ui)4QP-)k&WHs9L?3}CHrMr$56SK(X(2q zJoXi57NSl!O69TpoqH)Uqf{Pyz@a7w6My}U$6@S2w#3Myl*(fdu_+-+q*8h8VJC-V zW;Dc}cG9?5${g}7V$X08iD|>L&Me@rY=F#ulbkSX)K^r zK64`ydKdm?(N788d2}aE(8dnnhDFL}(v?zkR1s!Aj_?OfSjyz%oMcP7R0>JA9A{3t zcf%43ij*gAfOT3xq&(?<71p>GDUYA>BTnom_$~W){FL)8SK${ak2fxZ+H$29DUYwG zOB0n!q&(h4aS{wGk@9%+x4>}4OiJq`NUhN#i@t+?bRyz%DI`YtzG+ z6tK)v(jaji+Y|0vsD{M#Y0_GEP25I|y|AqrHoQsCz=)|Vja)!70?rR`Ho+tAl|m2tV{v`E~T?!c>2gQ#(n?z@q#6ohWEWzrcv;$R|iUa}Q=N_Vbk9mR&{iSv_x zg>*2&D`ofs4!h~jRWke$4wt1nSIh8)9L}UW*U0ckIoy!$Tr0yLf8+E}K zC8;2mr#tpF2T!En1_VFB!ILSt z5y4M#@Kg$RBX}7H*QZ<5i9f|>YECzgFBgeVbKY7JSRoRZbD$G}l_GHk2hKoXl}KF4 zfpZX8D-xgKz%B%i6N#%hFqZDZ9utYra$sM&s}F&zIdFcus~>@DIB-e2YX<_?a^UiG zSAI++uH(S9KoGc|12+R1L|t>>4kUoU0S?@o?plY+WO?>=hx@!fl=5ri) z9syj<%^Wz00Iud14*W9$xSG#%;B^G>X~`Ej@GAt?h{UZN_-(pt5Sh7+18>(}jMr@8 zly1X7esr8ftMjxhka#@#H3H%apxUK9brVl;w3`!BN5eBe$>uu}rR}}>iS^_7PrEsUdIw0D`p9 z>>ohZnbfoX83$D&@mtBV_75Nc@vQv=l*QgZfF6Dz+4~335C^7#sQm+Em!_YLee9!1 z`v)jH&E>!$T0dNqn`t~ndH3vit|`AUdio}}(8HJr;r#<>)Phl>y?;Q=-akNAlG;Du zDX&7-t`@1MIVd*}Nc@R<)e_!7AdzwAB10UIhF>~AM$8hfZ)y2ghay*~eE{6bE6{yb z(&`qZQLCt`WeCcq)zk_Sj6s;RhM#yGS}ojKiiRf)HJV#+$Pdkwh|?kt_A%H5Q-bVq zOvVehiw+a_QJ5F!gnJfSo+gXj2f*!R%MW0gp6yt%a$O@f8Q54-F&+JG`{-VgXf0U> zOr%-OCec=M6hf{jk<`Sdl7B;ZCefGUPi2S0r|R%5F_W5Wrw(T^D9}3&#QZxB%%ow; zeodqrw09gx-#Q3L+IYu-^liF*m>mbw4^RbrRnI#Pq#ykzA|~CJ_?OP%;c~};^t1oY z(0}qTjfFHp?>LY?NJ(g`x8p$iRf?$1YR7@}FX%+tsCOJlze%ZUtK4xQ{RhfyMzvFG z$APqPZbg|Hg!UFlr+r2&5U{l(Xq7t-q-TfhyyHN60o$w1jsvA@sOv~!yYvox2e%Ev z!(A?#ks! zD5M|Hfe|*9q}i8u%NV`fh{PyIOe*8foq0^DC&u{6h+zj!m~`i8pL0x{B;L>5>0X+6 zoQ$(+W}0rKEh=`NW0$ebM4n(~l@}S0pGh{==qLXkj+c?aY)5Z?w@B<|+nn?U+Sx@v za_}tQmux^~Hl)uO9=5FelXMf@3`r(=(Riwzo22{TX1rzuOE>X>E6=N zhOL{Mc*D)=h9#XG4 zc?l<8PQHe$%=}LbYR|?A_^M`#lF*PnaZ{QG^Cg{Okd zXTi~%btL*FCA3*bA}0Ze5Jzm*k=SXa%u??Wn{^}xED{NOqa(ApBC*TDSuQeavyQ}I z5f-!tX|s;R`z#K*QWW2;BeC0}AHrrGi6M(0*sLQl9K!e-eVcV8Mna_UW*v#qFsb?f zvG*q6l~q;R@V?2-JvWs~?!Cz!a#I5-Dm7AbQOGEyQmINHsl+5z3^pB7sZ>=YmBb7+ zs0cEHQ;UcKB`PwAARr(pf)taYsEr8P;Oy6Q+rR#F<7aoC@PU>)&yFrHs7>Ja@KL%}-Y?_}%}!8+paVm#{Je!znG z1wqKs``#Vo&|t%t^cYDdeqj)f2-Xq5C`h!gkb-r@-@{0OU>)&`LzpayFVh{rgfjxc zI^vfyFd|q-{4&M~2kVGm?u6}N9q}s|$(Ko#jmUy^#IIzuV6cw(RScA!$`95NzdD3L zPo%gc)FYwSzBk11gLTB;7sAxZO>ccaqeKMjh<|`_=-TXH9q|t`+!3rJ{x=LqK?Xn0 zb|9Y*Fxf@pk|xgzYq%Rq()?f@@f%C>zo)u^xFG=%*b;NHf$3&o5l#1_3aBUt@y|wc{j4?j&S!WV`zv^ZsZizuX6+X`x^p@h?P^!@)Y@4?5ZI@EIlmLHwbalbMz^UGa-EC-b|G z?q*+_IgNiRo#x@0)0ki#@h=|%+Yi!INNyrq#2=qIS!8^T&?P+aU&xGI%9C#(8+J)gy@BNH>`yzBcQ^N( z0XGwPpzUex#~SHr-_$DNUoA<-TZewS`C3UPJQB5R>*=BRn5-<%luYCZ))D`@I|UX* z2kVG`Bbs9c>xe(=B*MfQ4Av3!4bha z;@@E$y^vK8_014iuBWxL8CDm#Xn3A6oxwWd-(`%5U>)%n92{Jw_jjX8*wz;4LN783 z-NFL#I7Iw=j1d6sU>))AGiE4QNBr*?S~6Hi{3SP&2kVHx%s8ckb;N%lsnNkY;xA=s z1I=bQf_21SHbk?4BeJm#D8cAeijztM>c`S;-J?_@gGMMbg+*2PYfp_ zSV#P)hJqz^1nY?Z%uq@M>xloHX!JJerp5l-rr9d&#-=X#9AAdqI4%BA?td?VJzVhr zM5lPzgwEl6d^8O17=d@aU!vnOJcgr(=_rmz6C=R>G94!f9hley{-*Iq$dm*V1a78R zks|&m*=C__;DEAyg>19IhHes%(NPT^!D$ZDQ5ud0C#Uzq3uij6g=2jE`~)3k2^H}t z=_n6JBfAEuP*0Ji9xP+~M#n__X*zCzV{plUIhw9`F2X~5!SyTtHNu;e0bh&8pCQv? znFJoVzMd;z3Z7SR3@3pXx+4CKTmx+Jo-Asxx)7vY>T-Epr;jT|g$#AV>OB5z4jW}& zJl;~+0mM1M&?)gv1@yF-!$YUUTge7{+3wIO@#ez5WzcLCIwiib@Bui3sHD&-@y&%5 zaGGRgAaqK63uQUG(hi*xZzD5!iv&Zb#M=qUGK9rHiJwj=c$MgMJOE1k3_|BBKNvf7 zO1z_hwb+3N@0$v%iiQ^h~PU=ic^c3)t8F5p#?iH7bsxELIaFYY*c>@u5Y-Wzqh?t*BzIAKeV>};lEPziq|U@k z%Hj8HQn65noJc)N*GeC{S+O}%dt(OC!ba&~W;C%m(%rJgC>I`^BmF@Js7%(0^mi;P z`ap>E_HuJN_|{XA>D%>mb=+W%*c|C`hU*9%>0cV7yksBQSYfi0-v|$k==wf0o%pu{qM4J(Eg_CZu0uHlwPqVsoT7RGJh)6zc9L45sS}azuJy zR&);QMS5YC1qWkuq)(Y`;qb+;ADbh6jg7I`9O?gLP%t(}`f#<$6Xm*eY>sqG4Fl}h z9O>ODgW;E#EH+0vlQtOCfR4?Peu&wn=DH8{WK0rYtWcz%W@ed!`h}`V}`r#^y-($_0iT zxuMt`=_eR0#blHSKzdcq6bnE0)`}VFyBGj<+9qRjq-W&~AHrx2!S^(3bjmI}Dbmx7 zV#Vf2KgSS!$sCN$kv_R#az{caHb?qXjN!-TNYAb}>Cj5CInoydtSUA~`c-BJ%`Q7O zNBWrtmY3AGYzH?i?O&JPKF8oZHb?qS2BCer@ljZ1z zH7QqTsvku|Fg8b~hRoFdW)2XUlx3#46PdKJ@z@-hjIl!&G}1+;))>j6gGprS7~sd| z$YhOGPo`Q>CzCT6kIj+EyX+8nsNk|gIH7v7D>VlH<{&b~zonXS#OBB}FbM7^Gz3^| zj?5gw<GV zHf9-{BeO7IQT;2^M0Qy#JT^yW5xaIPHb-W005P#SGD|GTj?Ix->H?+WXJ(m&`LQ`N z%Pl)eOF(Rn%rTZ3D^|zm$gE%xx?-`|9GR6N40Yu*tEAbE&5>En$l=%=nKcZCzTuqp zGiwO*R01 zmV`Mdwm{~18)UILGAGy&Dj1sB9GMeCsEo~#Imrf8Xb6!x*|zJr5+ZYo4anFWnK#>3 z9z8;2PPIWDngeOvPrJk9GPy;fpMyHP?OeMI2?-2k?G-ZC^ko?m&1YB9GN~2ve+D%Z43y< z=E!X4up>4{=1fKi#pcMI3^t+Wd9A4LPPIck^MkD-Cs z9JTb6y1)lCaBmP_@|7`LGcwJHV6HN*c|v9V{_1Nh|Ph&TOc+E z{+6*h@GlvggKU0m4m?t^Ifz2BIq)y7RXiIH^rLB{G8JhzSFg6Da8|F!zx>!7ctEi^@DCQ70}pj<4*c7S&4C6L zn?wF7V{_o&IyMLX?Z@W80~4DAk4$V1Jd&|F@Gl*kL;kH|a~Qw`;@G4a#?*=?D>erj zFg6GMma#eT&v0yxqcJ6m&4I^$Yz{oou{nsSVsqf%EH(!on%Erd$dAo|HXfU!p4NFX z3@FCt$UZvHtmyU1Bzxjf#)#_@y^PJC-e`b8Y>wD+K^DOIkI11fDW^fJ!`RHt8$=_qsTTd4FP_l*BI8} z$L7d>ewj&vXEw1pvWJ)35Wa_}*c{oBV+_J$b7Ye%3}C`+i0u8wE;n#EIJwf5Xr0L3 zvC0R6sQ_KI+DCb8j_hv&b}KeVwtlTiWyj{oepf<~u{pBmuKO80qtus*&5`Zr9CvJv z>;UIP#OBBja#B=mj_eR;MaAaG?&hqh*c{nm&MFm~BYVDN%KZwIY&EetvXkpf1w*f7 zu{p9YG6?SBJT^!6s`VzB9h)QjDub-p9NBA*HHnwMjIZ4QQvmF$rkrI zOl*$quNf4M&5^zO1WZX=$)VUBxjRj+@TeeNTY=E%LSa62|fu8D2( z!r3S`NA3pOXvgNrJ(jd;Pd$SBu{m=4*w!y(X+5IrtC`F8eho)1dUL;Zf;#DIY+u+U zrPv&~53$W%tZjay4zx&Lt5p~;uC9bFciBlmp3-Y12~a&Kk3xrVP|bL3uU zDBgy2Y>wPM+R~L>RP}fm8vBOvQ>1*S?7nb?rDJmxUXx4QD5C$qrSNOnL9heZ@i#=_ zB-R~mY@I0VV6Pesh=DH(_py#*L6GcW)=m7_9EAs2=fKL)>)pZ?tkE%q06fQyi^2xh z*l48}ErpjHRybof+oVS_74dtl_LUK+r?9!U9ED5SPBon#V{;T5*~T&SA=+ZW*c^p- z5CGpk&K#Sg{+HB~N>Kg2RR1fY^4J{pzsGGpxq@}Z=BO93AcJCa)GrCyb*KVAHb?y* zA~~XdSD7ncip^0!T^_=CY>xVSL%9D^m_912kH>=383*M&eGF`+(H5ln|WA)@}a zkR3NHFg8d1qC_x>x>3Sf9RI+^lBVD1`^+f$OA>5D6QD2n| zrd6>y>Mx8yOl*$&--akGHb?zHCCl2x=BU3-+M{E0)SohoQpzo49-E{7uV&$Ct0+n3&iHA-_7$5#OA2~mYtBr->82fkd9;3Ra7c{KGi8$Y>xVD6|0NR4&6Qi zz9V-65Kibm8}WNu(`+k+vO|K4ZGiRLS8Rl)5m7H+;HbLfu{r8jRkKD{ai+Y}XovLDU6hCaGw_o^i@vyXBx&|V+onB7*_bBMRo4IF@NQXZS5cq0ex20X+et9d?d zA&#cGNfJy|>J6CUCm5pkDD)Ock-L~EBUI+NC@x@2EX>JN@r3~dU*8me8ZgRF{{5GA z#c8%E!|ZGv^y7=SGKUWyfkPB`vQ-;LFx7Jm!*(;VIf~6}L1#e_2k7xAY`rL+#Fl(2 zA_ca(+DR%tX2ZeQ9K|(kVaQ{16mMhz#^xxlWXnP@n8&T+ZEU3vh>p!s{GHRT7iYz# zZ0)E@PAkFUtqh>vtz&Z(YnhvdN`eHL?4TR;V{;UL8z!*W9L00ks#RrfU}y#9*KWn; zC~jb@R_rMho1=Itv+6lV6g$}>R$DQREdE_3Q0zO4*^*VK*4><9a}*yd!4O5hv<;@m z{Lf?_7D1e1a}*ocGT6m{QKDjV6d!d^b!?8}sYUaMtMjp9a}?W{FNS9Lu{nzOIZ+my zqqtQ%UC3Le&Hx0Gr$Ko2pnmsWypP`Yt6Q>WSrh*KoS`P8aBPm^gOWy*na;;Qn~Kd* ze3o1~u3sJ9m|8R>|D9MtrkUNyQbhFcnaJCMe)#LvtqLr z6yIc<-@(`%#RE&sIq}&9=1>&jD*gkryJK?{Z(B-9dHulmAe-BJI=eQW-rCZKuX#X& zy10IsIYlrwN3ofKc5IH~tqj8HLf@wR*c`>`yIU3^ZUZ~$7 z=-3<$w?%<6Hb=uI+Bc(37FajHE{T{U-F>Jwtmqr~#l4tITS(Hc$wFmpj=6NlaKP~W zPG398n9QYZ2nU5?bIheZBnN88=9o)&7za(o=9nw@j=~pV$L5$zcML~1DmKSlx(zsR z6Psf$&H4@skIgZcCUyr&$L5$z+ZGN&L~M?^G}qTUVsp&Aec!m5SwHEqO)x)#pVcFRcsDrrYY4Go8u_i4T8AZ=$jNr zQAa2TrM7-hMC;!*+CL>4*PuKmDOK@k2nBTiuZ7paXSPGog!ZkQyFduAjUr*p|U#Kc-3-Bke3p4 ziXDY;d7YBo>DuMX?@8ZLkkoEO-AL5eV`YmisDh%^pp?(E@CSXzaFkd$w0F9Hd?!lv z#8!V9?3LxGJtIZ2Yw%M3EkHdWscZg0QdJazrhfbiWcU7lPz)bBFgWh35{uZw&o9GF z8x?a=|L)Q0e&9&$O|4!mVo#uAT>9c_e%lWzp&yAP~ZYI>8g?f~q*Eb1#qe#7?V-JpQ1t71}PAwM@us!c(>>^RbG4w!+@3 z?PA$Dqwm+bNcys?81`X~trg2|X4pMCJ4^@IV+?y%VRY4i{T;*p(av+_j}-P@C^~#v zfjUZybW8WPwn+hZ(}aJG)vQIRKjt^#4?*L570Rc^{ub? ze+bbBkAn99nv%$-_J6D0{y$ULFSK1On=@wGE)JK$n|g!73feA~ox|wsm036SxWYDT zyI6KRqwmnU$R=BPm%^~>mp#Ua@8!fbV%ZNEc00$QZGXqGC-r&d307yu&87LHU@dE4 z)ROEUf*p8}(S|8yJ=S5PO7trlozP5&up$>?coAqxh?KAaS(W8Wb+8gJ9d|#F-`og| zH4aNnh=YJ1FkOYm{q&LL-0_5N4gK0LJr2Kmq95zux zCjZ_K#x_va?jO|h?|9N=tjd;uN8{|6RNxNFzb7G+v_|12nkD~^V7&(S2ISunY*Zl1 zzwd+NrLii9{5vw&XawcoQ3d??Se21~zZeXsp+U>PUkQdbG-&yEG<4(HZ29*Gzzp*5 zy3Kr@_B&$#2#w(-|6lkyTeg|PRD)HUCWHV;_&!9WLH_+T7$CC%!lp&}_qo)Jeztd0 z8z)6Vi`+8#_cBOYZOOlX8Z)!x-?86;iOIiHPehB6e@9bXBz*bzvml!qlz;!dDx8vk z$3w_WUWh1rDpm%Sk(3?q=@?dedX^>sj;4C3l-nVlmwcIi%HHoyk18qMVR(I%IuVGg zFg^Y_0{Qn8UMY4*l_2$bI36>{vnlofoD*$c5--q8zD_?s0hX}*`v<@}J0Sn=C2s*M zlYjp@W%jr5GxIY1sHGuS7nFZL8t&d%Bma(|ek#tuDH2S(!}8G;9kNRF z$kOuB6`jg%WTI(sR&2%j81gc9TRys?3kNe2g7VQ7PvA&6Liy;#+Iyh(6Quv_)yFXA zO`;8y*E(8-_kkGJdbNyH*SfW@=WLPo&MkY72jg<{$nfa-!uxAF60U?eKpTSWUcV|#rT6SAJLTzc9AqYclX*^2M5o$|gGU&cIf?k6^ zX+#=r=^MZlM|-4ta|)-GW0EQ*R-mokJO?0YQ|isSdANEr)~{dlO1=32B=nN+rk{8Y zAJ^*5*Aw&!`iWDSCK&Z*%tBk4dNU@}W?#J-Po#}Ty%}@YR;}Jl)1p(o`TNkiA@yc% z-0!P52dut&bI`8Uo6(-<>diQEqcmH+9kqXeHjC11^#&R2)@=25N=itx)f~g-MZ`t=@Qu%r#rRw})VdzNR<9SRu_;Z<3)$ zq}l3C9Z`yaW~(>NQq8E@>g@}${VRi(4{El0`x)J>+3Fo&6e+!?GxAk1y@QNXLbKI- z2jltWl5(FLLz=DLI~lu#W~=uu#-r}->sERf1R+Q7dv}mSgAHZBP_xy$FbGFzwt5!@ ziS`weW~=ueMha-QdKZT-iH`3sM+dWV}n7>R`0_M*HTxe?_cXcVR*E(HTQrHmQoa5 zBfO84FhQ)gW#yc?OwtAm(5;(roo^E=|+YnBJ#n z;3>^k?-nOdj&gN!lwb31b@Fh^v$R;f+nhXK_)BZMdbdaNT$-)kXQJu8>Y>r;^X`bI z`{I&H?9%&eG}q5sbMK7i`uUOsrFT~})6Z2hKNrnJg3@gD?vAEenyubFGZ9I%)w|b8 zqkEWaeXZH*eLk8AGZbmIdiO z%~tQLCCPZ}P@1jY*Ge+onyub5B@;O`TfMKlQ*g~z?;Ft^OS9E`)=7kkGpO0>eUmZW znyucq7{#gC>V2Cr9Gb1(-!eR`+3G#V;0VoD?>mg67qZYwEwIODYqomNGp19s)%z}E zL}<2pFE}{1W~=uiqtGoZAj>Me?=eOIv^873?=xmdv(@`MhL+T9^2)eC|FX5W~=uzLn)!z>iwK()%`tv9sT~3axb|1VT{^M ztsA#(5o^4^nzstP6=u4PM%f8IACljJOLI?^BZPSW>R-g)z`!2Rr5@Db6(LHW|f8<=-LoTYIV`e%cy zDtywUfE@%h!7lv3?n&Vd(&18fX(%Y7x06b=Vpi|?z{C(m^7MwtvgkK9R9#CMQ=_N=b`qu_-kU4n)8&UtU9 ztHca?hxQJP?->IZ1@B#Cu7}bM>r1>~UL!CYVNV^aJ<;tdqiP#(*SvoNj+Z8uNsVuk19K{kK&VvGui`Z3Iu7)N!hCi|pv)zZxAV&;Nqr4q(AL6*dws*kaa(6Vs#A$k-gvT?S)+fKx1y*FS{U zzjVpIfstu&*V&6z2KCY3-@pI3V@(&C7}`6wZ^+L?#G3J))=wv8y&S?c@Go}g`%v3+ zsGBrngItdFIzBP94^xU*3!dv0w81!+rcG#Sf#NT#Ru{G(4n7Fk*cH9(GzDJ_@ZBMJ z{<#XK_IexR+S!D!Y+&b3c3I2uvd&YNb)mc}xU3tX%<{69<7GV!Wtbxez;YY_=Piay zf>*!tl2#!5cVJrfVU^MQf!_~CC`)W@BlzyMiDh>y3@`WH5@Y@9sBbA4FE?-rUJ}RX za_l(1N047qy#8abpKV$K{k~D<0@D-yt48!yKz9Q=ze%B=0PFl^>fp0*u;L_j0B1(O zE3vFX8L+e~;J;m@mFFnfQQB3zCWeLt{iu8FdRReevD{n#{N)~>9Gc!awsHcM z!B^tU4Oj3CU4b7#w7a);+omqiUV=vm{a$}lf4_)%FVM9u_=dW+SOPp0Cg9>rB!y&2 znXFMI6K9@-b#dT-KwZF{WDqOhJT=WWKqte0$ALSmcDyUU4Gi%~knn|jXxYNY;pk8B z#f$I9D#DaIeupW`yh&KiOf_20M&$&_p2FSmD#C7fr$IkTBr$5ZCtbRr8NufR-9fk; z9)>7S{x7&1aKl5-PEmkmKS;h_TgJ3uf4cZOwBVcGlgLcD10|W&Qy5T(zW^lvPZKnNw z%I=8$1{x!g{7?8Emje?m&?gRxvMwfr(@W&YVcz1(uK-Uipn+tqQo|C6b>9 zYrMa^4Sb+_MER-cwVp`+5Pqir5q@N7$khhj@K#sA%G-whAb#0mD@@V*9& zq^Q9xPlU8t_>={c1Ku~VLzHj947o`@ZI!oSR@|=K@T589h9}L&4G)j=$+&UDLqmMy z*?kcF=Dk=Qae6e2zmIyyCVB9Fyc*vnFWxQbfAh~!!bI``_!;-T^zd7PL=tBj9YbD? zzKW*#350M=YRLD}Lr5EqmmXScu;I>uKeD2{OR|`k9s-aKEy_zzS-6)Tjx8W@FFhPx zU~+ot$r{rG&v@x6yYa@Ov0Jefr)w;`RNRuIM9$Wd(1l|i31Kfi94Mu{^y1slD~}{5 z6Kfxb4i%>ck%q@Q;3=v?yY1npH5EjcmcNf7zt(rQdjZIG+SyKaPVH<*Eln6Y+tHw* zBXqXIWY9^mWBfh*N#o2DaoTfA*1sQ2Z0v4eQQ!(Ax-*v?&KY-7?%k53AO%bmgFjzHy1!yDjU0S_4tfN@i$}MEp2?ZYLvuLj8BlgA?w}XM z^rezx2F&a4Wm(JA+(9pt`t07m)=tqA6^nR8++Ck4`L)R8^&@;H(LC@f& z9rO&(;h<-M4hKDh>-U2j91eQnTnvvn=#`=|2fb1>?x0tS#~k!Z(U^l? zDH?asE5&0DdZlR0L9Y~zJLr|-F$cX;H0GdZXfrtIxrpHO5OmNhNn;LrrFq6d&&8AD zRGnNo=(%|Q%UR#??l#ts&Gq_kd41mPk-P{8J=f_mTU6rjX>IOp?Pm@mcN{_P+Oz4i z(Of@k&Al_48}LxNE1K!&Dm{}v7tKV1anOsbfuMul3`Fgq=c3U)OtwCA(2Hck%%dIj zA~|#)==VG3{m#qv@8bG$ABd*89P}d3?sU*|v5&w(Z^mS%Wz8z!i_QyipG|kOFU_3B zKb21N@XTo}2fZ0DrjtA9&BzXP|3_yojeiAl7<^^s6i4EqH)BCVnXqZ&@Sjiy=FRr_ z%*p-~2fZ0DAu=;|DNnwEGOJ21kXMft6JkmkWb;X)Yb3Dx<0vz;8F(V!HN+ohT z=s8ma9P}bNK?gk-5hhNDgPvhVI_Mcnl!KmOxE=Hi?sU*IaI}M-;pn9*w35?7&oHAL z^b8}~K`+b+Ip`S*-AV#Jc<7*K7y&Tkpl6sa2R(z%P|GOU=f}e#&_>oO;Ip|r1-~{HN=X0VR^n41=6mADSpHkXE z4{0^{vSBayc&UwO9gv#^_&&{hDE9<-OhB}78C2c-V(u`c@`I{-U!r3bRNZ@+j{KnN z-k0f^2UYhTA(ItU-FuX5R#0{CD`Zna)xF2)NCj2*4%3kzRNZ@=j#W@~?+H3mLDjt{ z=_oJbonugS?gh@7WwSiVg+NS_6<=BksB*u3HP^SM}r64uQV2-s1f8 zz^LpT7~BIfa)q}fFPjVAS?w5_=-Q<`C&9^aDIsOakHJQ@w=DlnC|2AAJnucYcgNTW zygLKgLT@>tNk68!1R;-O2+(2IWi-8kk+z`$3?$*LpfjYC_u?5=(m|~bBF{_ht;)}V zLhB2{Xh{8=U`M2-uL~p+lHQK|k_GVM z|EUF1{&~8((I2(BLsi~!$BKXP4&^UyqUzf{3?1d;s`5Gq-ZnOY0ZN7@lnwZQ$dnL(V9|%|w`8X%z9$ zv6TYU3-8kerYlirs%w`#;Vop#RvG~+@7DY~p-JK0l>SB$c>dKkIc-s zler1H6I4JKXlFvmQ3&6AaB^yBuU`|Np;}rhYa)tt2a%S`oTx~C`p*)yLZ-K&I|*7P zQ}s^ofLB-i%y$vIMy3qIpCfo(B?uO;U#CvDoqYSeyXnG?)vW<@8#K{9WISFOWiN(K zelM9%uB51wy`Tf*eV#0*Rr;qC-hFhgO_ku7*#cfHAksH90Ukrc;F9XyPuOOaFDU`{ zNXJa!JwQ#;#xV@bFgzu^FA&siiZkw~dXS*A7^D+DM96uS9b-5Kl|S{Jhj_E_`7zT+mjC1tPqSg>zvdhuL~~5@wst1#}rq z%6V=J<)dd-5dM_YL>rmYW}fzuc0#fYLANy+uVbUo$fpxpZ%~-chQM(M?g@aNLFio5 zKX}rP0^UIyeb7qTN#N0Pir-4vH2IYoxOlIt@Ljm}L=tNgs`b={SxdmZmhKLxHBeP{ zO$_fI2F*HhyntX|D2dZdkYA(io!wpFKe!3r685xr!yN){dT(xc2jn#8CCFXK`&kPm zidRBFF?byfBLN2G@F+A7+2Kw`^}m^pWZsYz$H1>+cK`TCl@ zF@xy1LaAY9+&bo)yXCc0F3r2){-eTer9Q|2#a<^;-?6OZ37gtpZcYbM%Zl8NqHL+^ zxWPaJduRf>7kvLQs=gpejWfJ+dSq(&E$t%pOJkIm>?0d1OmRRfsJw>$ zlR@3RsvBwWaJ9)3hA}kVNZZ)h`6AU)!vGn_PDevX?M@jCg^!0OV9`So_ac=^8w_ed z-Zdsg>LF&|LXu-X)RQqu{8)h^^)xff6x1hn!Iw*N>6}_ApT((nv%uye^`IM2Uv;F` z)UgvD939*<0pV2MF(iYjr!I4&_+1lBbJ!DJaWgunr{H_4RIhwul_PgxbZ}^-b7*SM z7|EwYMLfY^8Oud!@TXSgOtD(P4_%M=)LjgKI&B*ofz_f&&B_~o&(H{bpfaRJr)*s~ z*)*e^IWRm$Lv0)$J5tXv1aG?dMcDZ;ZtyZeWLl(7E|}br03y*N)AE}s#rPCsbPtaY zZ9F&y8PBda>CoCShJ*2ffOXT@G(P>LUS)PzX7%lX(TS1n<^1wY1ItT(g@%iJzl_`G z7<}`<tB6TMNRGr}3T8;fz8HyFX11|l{;i)}a$9jffmY9G>JJ>hYJU%`G zOA@@v!?vMFeQqwEOlqA|;OKOj+v+Ee32e?RQja5&kI-X5BXRuAX)XH}!1fR~k?CV6j z;Igk5>3XuOU#u*}`?ofq6SMfzxC-ZZph zdbda~3|LhEN;i>R)=GCT6i?lC(~H=(clWlK@Sy3%0R(RNI?)mfvf^%v^imfn6|vLH zENs)nz;29UDbmX=J4JSwIv~==SZ1tPd?dvWxzZ~bgdvHB2VqJZ*ahnekzN_XFsyre zl{7>9w`|%qxqWN|vJ>gmjJyeg2s97km!*0E;|5ry5n0 z)>}A?!$ae8{Pb{m%fzssT*AE^KC}1q<_VaqAZ#Fwy*>`geKrYfV?g^(d`_4;xNUUr zz{KPpka$mT=kO?$XAt92s$~V-u%fdwXQHwHO@Pqu4^j}95tt+e(l4Dt)` zwuOcdZcVg%Q+w7TW2DExzUIE(zAd8m3k>Lm`x*9y+OrlLwkij1&x+dSr6Isi^curD zKokHMypy8#^UF*UJoDzRp3dgJ*1i@|dw97GVH@H`x~LsF#vm9)%|A(Ug#ns(?i-#Q zq9ACs_Zz!>Z06wPN>`$FqV|qeJ`hX==&IE|+K#oTTk$smyF8UzPu141HK{t`_6-%P zqE^*@S3>j!ML%rk!WcS;OZkbtw2l_F=dNplm0>{=AU>*#)6Y5E;3NA@L%ZO?OAqy7 ztn&fRfe0Uiun~p*&^p;5C(-7&>vTh$)jYj(c+ADx%~{(an75NP%vqg7JBKlz*N`i} z^CeS0CF1@Ler>f6*IS}?a-FGQNI$~*+KUW=nP@jGPA64F^4hD`n`9jW2gjyOr+Sq^ z8)54bpY$+SQG3m?CJ{y~guQFbZxAAN%g4Ohe`k!YaZK#@)vX&$V!6G2CWwd(O~|ZY zWGKe(gk?-^=W!+l%G4AxE~R*jUpJ58>DQBX%ww}WlfY3n*sw~Xz*X|ryFx)&Ho z!Iv?p&B(w(+G?#knQhTwQh%qS?oa?RPaJgxvklh{iPX@q`=c^LID1r&nZz5&ntu4| zcGu)ML|>`7w!`ZuR`$n| zR_&<=pKW;Oqb&Ea4L8WrdN9&gGnehS8ID|P)cw{8>ZGr+-8hr97rM8o`w-hw!x9gV zPJ{IpwwJbjcxb=Q=|7xyX!7N39}OSPddH?G1|g&81NJ`nDr{&<)V-DMp&7m!{&lZ2 z6mLV&Lfcz=Hj27^w2>yesOs@BH1@$9HX*W|virgnLd@7PIZdmEU&|Xl_nKT-L=pWS zko&dlAlLy&acBs$qy3!RNvu2C*gBEh!8Uje*Z~idx%*g0u^>qHFzY5d)RV|P$T|mB z#`fl(_U5g9B6kIAbSxOGp2tOQ18Zzk+?O0yIAb^48bvY{@q4WHl@X|?u#HGM8*H)e zmK%+eA~(SH5h+@?tfiNkSzavzFJRk;z0>34@DV>l8`(}Fo=0H@cJ=R_Jg|49e+~Q# zOd}FfQ`&HF%)Z{)=o{ zz2@WbAi)H7&tDe;b(r{ksv?*UpFc(ZwvZhk6QPnseo-QrMBON1P0&6%Ndb6Z&r{@Y z3K3gy?W!CcM84n!Gtw1`T~Fk%3E?nRsYa?w2Gh3EW0%NZ7=iQ*!2)3jw$nxaw;>AM z6RDeu{6Hnkx~~JCP^MsA163mJn{de`dyXzHZ3az>{3)|2rQEoKo~3b-|EpQ}C|2+h zd;pYt)k8ZC>paP#H65G*BSiP$iznlZXu4Qxk(aCRq73x!Y3G_ z_9*S$r5b*qomjv~&tz8t>u!SKy`Qfb)cF08GMh0w~7#4+AVDTO=mzoe9ySFgMd7z$ z0zI6z4UZyx4qLUV%nb~!puP#gmwQ-&7`$B+Hn3Hzv7XATdd?ArPPT~ER!k#{e^&_< z`_5vvWYwv4H^;3sQFyEbLlpSZHkcmsKa;)J4&t;IS7>0%U>5^M$>90q-dlLoLG6WI z30z?nPA!^8T%C_xR`l*4o*LXE3T^BSxMo0D>M_`6IVcMEIZ=5(ly$jPzUr2@Or1e! z(!Y=1v8r3LW?2*d{hXmDBN*w(kvrzQhH>_PP||2J)A{&k+dV-~&xL2{MY>$Vhe*m9 zqA<+1q$5b!R#(pt*PwqwnOExp=(5|{W_Ga9*RVZneJbqJfqX7; zqOo05@DMx&J7%JAXt7zbSqqA9vd!-n*!G3jk2q7x9&=!cIVV1w00KLDqVNyQ-a0xs zhV!Px{CVuQrIeJ{4{XkDZtv;r+ITv6ocA_wZtXi;6xJ^@r#N$BV0@hRcGW7bnSon| zrf4dm7{YL?VG!E&ZK?-0S|?!1D+<-iP0n~f9GaLqsCO&tA7UGCJ_t)7^-iEZ&hCZ! z4FY`j*^O@z>TinzTj?!B{U+KsqfHiAH^455C`u;_stx>tYHJ^SSJK?l3hwv4XNU&c zLXzGj7TU6@r>j#m&>h18!{=;$?dV%C8fY8BLFsFTFqRFphvY!d>}l_7?b_PXDvLpP z7zb^8SI4$a$VToRg)gEL(r@dOAN%x(2D)Q7vf13x)!luzXrSAG18>>nXF;>Rg978M z2i%v@GgUOu#O@%0FM%Y`wuOVx+uGB*bz5iu#%;Y2zs%v>#wJOo>0DEkGwNg$)VV**~=^pC<028j3`Ue_nYy$7V! z<~QK_@n7r^TIUS|jFMI#2WQ;*hvQ&>;^$CBN8N^hKDh^6k^cjbMw#)ZA#lWwJ#_cWL365#k#xyH_!&M zCh#~|6UPT?;s6%q7_5nt719VNjXg-Ua2^zeYGEN7!&g4HALiojR=PwPaQ%~5&l*W2w??jWUcUoO!qkJzGYr#wU7p1BDUjLGC2+SL&S7)&noX39bUskK>CY!O^ zdymoGWDDlC4-cuEv|%^79uDcUEA*vcfxF%d`OC{5cU<;T%~cZ=HO|V{RVj~yiRROg z9;dD;n9c?idkfgnHVHr90?6XnS+V0GD6~B`L~JD%Glqk1^60KCp^Kk!CsGZS`1rCW?PTht{sQZC)H;{v4-El{Y2(I z2XkLL4o*%Qocr}A$ax(WOG_N%w>kJPcIdNUU5fMhqfnhqr@_YkVor|L=#i zvah}6*x$hMS25Gq;g9N-@W(93Vh#Kuj)NWYk)ctce$77(4Wonb7D@k}zg;{D#JE^A z7e1MZZP~i5vE_sl8joAGcGa53m3xmn7Jf`kj}D!(TRN`7;lRY;o>LASf80t0cQ>x= zTGzO8a%$%(yGN%_I6=&AIdS#G(D>MDilnd-1oKydHfG52Xa5rzHAC|OrS+c?)u!s`n)9`bAiX^emK&|xh{ev?rWXDl+wCulK zA^TS_@cyqtcK^iCu0e1I0g>`=lUVcrRmc`)50D=A|KAGP)B#H>WPb)a{{Lu&?D&l^ zh};U<<^M-3WS83t+2x?()gj`S;0m+csft~GBof%K!wo({0vjQ%3v48?(Ml57C&A2| z74bFj3s_778v$ie64=V}e})8hh5A@D@qrkAEvf~ry}CWP3;p1xG$@h}gaxgWk8FiJ;bV3B=@7I|J~c+r zH2ri5S|^{wEcB^-LF?p8m{6OQpmp-+cp`1og4W4jV(!{11+A0+8X;(%6tTaDMzjU3 zla-cn|L`b$`Y4jML8}zBPRej1VE_IA!wc0#d0P&REMB-VmBi>1g#T$7>*J@u*25d-qGH=wdL%7U$!(c zT!IC9JSb?LcpKy3=4F3LLF>f%jD7@y)`=0u4+vT(_J**qq;O(1L<$R9C&t30P0b*d zf;!+qLF>eLh|C486K@Z}4)Ni{1Y?B+trL?BRXSf%)mQ2P_RE^s*wenHt#4~c;Mv=OdIwM~qIB}41N(fpf-obc& zxn!+{1+5eBWb6`x)`@p99(8XsIxYx8j^6j~AcqE<)`?DB7=$APtrHgoiS`wepmpLs zj1&;GPFx(qWJ!D}%fuy|(bv3n)5f#={eoV~zz9L>#AS>V7PL-W?u2bY>%e4qUlB$*G#>4MALocU8Mw^_-r)S&suZujOP0Jl0I+Zu4ty8t7LvInu!FZ@SM0i znq~=FC+?YvNP^ahd!018hsoC0g4T)8M>AoDB0=lKebF4*?taI-Kbpxe_kn0yNYFa* zg=lhE&^qy;lkJw6HX^-=hh|P@TGn*MFV39I?>f4heQD-2{;71Dhi6V>1g#TaJ_5Ec zXq|XuX10F~vQs}ga|-_oWQwoMoFb$}?PmcFC+Oyoci!kYN-pOD+Td-kT&=}9Ti0r--zZ|g4T&=okW;8gM!wHZ!)G^&^qxg zMsW&SC%(-X>Oq(0bUjV{EyKft)`{mB93g0(_zvUfg{*q0NBzZ~*3M>FUEreOdB$`K zS|`5C7!iWji5DCkT&4GS!yXH4us|1jkx}S!1De$$@jb=}fVQA@;`@vl60}bI9YaeB zS|?s|Gr6F3;$_AuEohzifuu$YS|?u0(gvE%a0pr_UN%Itfa8MJi60n-zjWhz)rlV( zf}e#&_>oQEdeyYGoA_}wK?_>PM;6 z=;gh@p{vQliZ z=CjNm5?id&q_RYfdTIy)N^G%aO&vR7 zP;9a0GB;|zsi}Fz&5&Y?HNA3fk|Q@HwpjB7gXMQ>>idG4RXI~E^rh8K>@{~W0P3_& ziY?a6${W60Y_VpVQ7o~=n&%ke5?ib}xnOd4iY?ZBiZOh##hTgmCY>*~SaU(Zs>Bv+ zUS)Rp9M~3Hta+w^VqiQ~R4aK%`QZnZy=TX=CGJi>ZvULl!jBMXJ^q$)eQ(Q*{jR#THXp zW7U(X{#GxQGZ+_JOyym6P?9aU?4S=@Pj>a8hktVrsp8{QGY+xER0D(HenLZli7lq) z5H5!H?*hNNSmd`C^Ny<(8ek zS^=@e)G?MBD^`mwrdBWrKeuFJi>Z|%428l{tE3s$I!tUawVIK`VvDIY42Hhpob^*{ z840EgEI)oXnp(%~kXT9Qu4mSe*kbBfhO#?|nd?&<7=w!~rjBC(7h6od$p)a$(ly|p+2Ep4|i!G*3uptyjFk*|T6GNyJTTGo~16ph`b+T>OLV+T6iVaAy#nhW^tGqcY zvBlJ>HmJoGQ>WQ>U#Cx`nr%dD^NG~P0N@Z?Otm;T0kOr@CYuuyTTHdugs|9RYO~D< zi!G+M*bH5Vc9XW*B$wD?s@>-B+O;z~-6p!k7E@=~9IK<)xpjn?VX?(jr%m!3(avhC z&C(5Ole%n@OKdUK%{eembq;FMdJBhfcxYUXpB@f}#1>P%91e&rrusO@#1>QA7!Vd) zOl{||Lu@g1CL@Hz7E@{@IrJO?=tDPOY%%p#T7^W3EvA>+kD&pv#WX#o z2E`ULkIpmeD1AT3oOqNm;@vOQw8Ew8a)Plj}?cL$73F zi;7PAks&ViMo#TK(yutq2OLlj%gZeWd#R$1Ja99B4EH`^LT zG8OTAtoD@=sHdD- zd)!)%nekstc}=W?lx(U7F*1nGK*5m zjXN&3nER_)_$W4m*kbNH$)Yt~Kx{F$o97)6Tg-jSPRIlmb1wwaajd$EN~O;i7F*0^ zt5{tyUBlezZUFRQ@3RrVr!~#Cvhu|ia~InH>$k7ih!k7QWoX;nA-0%XRn2NSEVh_` zw;Y{nyE!Pfn7=RxbJ4#1ML{$m+?Rh(kU;WgFgBzLQ2yc|jt`6mz9a}U5x@MULD16b z%U>3Rxi(V%@*v99{PI_X(6FLk{>mUpz7YtEE#|L^Vlt5@k-u89sOQO-SW0X$|6wb= zCAOHqmSb4EruIIK|mZ~!)^K=M7W0plV2C_l+6L2O z{%5lH+CiMe7V`~k8SG-fC{bdI`9~d8Ew-3HwP+r3bv~BZV!n;N0oM#)Y%zbI6J=tH z`K|I*x4dQQ41y|x`TOV{YYDN%{QaDvCL>r)26PMa4@w$MW}&kwvBmte^dh~q*kXQ| zZApi6(khB@Bbpzs!NBFABw>C#+sqCY`Wm)ptxx3=Tg<2A<~41|&m^{(pJF@LI#=r+ z`c!EG_QZ~+@YS(A=*rHO+uLeU#Kac!hZdU^o3)_$CfocDiY?|3EHUR~VvG5IV0O3I zV*a+Jl$6(xOKdT}ewjH%P;4>Z%s^XgF@GzAaJtZM@_n(zeD!jZGu{um*ka)!w(;hJ zMr^SVXZJ$=20@E07H*3IrPyL&6YZOEvBi4nWI?rI$tmKOl%hymNDfs%DYjUoJB9-` zVv9xEhHy|wY_UjtNDkB%TP)HY#z9kJi$%G26ut;sY_Ujp3`aIfY_UkU0S9ix7K=3N zJ1AUiu}BlUgQUe4i?nUwAVi2Q7HO_`i7hsK>Z5J8*kZ%YhvEBsTWqo6(`bu}@{rhK z!!6q&eH=3hiY?ArbdPN%vBjWOi7hHKO{p%i#ksN@1aV(%ajxtL{r!__@z6gA(UgaW z#JqR?0Ir5)w1z=cDYFuua5H!{neX9c=K9Am*!;*yCq`1Acf}>ZNhG^be(3`EQ3M1Y z*(VNmj}61FLah1$NE8%8iXCd$13cw-7pulo#CjTb?(c!fz@Ro9tHJZd-qJ8al271C zxKqSZc={NKT>TW!C9a?MXIHEOsi(bA383`!(}2=bcENvL>FFM*Y^L<|pKw@K=1uMa z;mbx#Fe*;a5h*>L3K|%RWGnpirYL?f#K;;L85)MTXOk37L!1{YdnES5GN{{sl}b-J zAdAY8LFgVkhsH4?UD;P+4S>a^abyJa*ZK#?McHFyPNEsMGk3yU)3U>{<-nYcrs18U z?D5!J;joDkLaN@e`oiiwJG*)Dr`3}T~*vO8k`8yX{#{15n9WnrqpW}7DLSEh8?U9k?(^Q#0% z=JL7NQffv&+q-2Oi;8}kynjliExRXH14(C34eah{=?A@*MA`kZdoZ*89S{&`nmWJ( zG3;`-(i3&U%Ki9=L@pU+4-zRZDr7!o55;yuHr0(~PsEaNu~<0hdZO$}I)u!$;i*^+ z;7Qp5pOy_D^$zc* z!xl^vCm5si!5mt?>8rp1RUXXp1W22OsT-364o(-Md<$mCO;Yf)ybZJB_Fkwm(C(4u z&BGIuQ~jH}Tl?EbcODSsr%N*w0*#{l3_Q*!nbH#)w9*s(t(Bhe3d-W~T_a-yAads` zJ>3k&N+fZH(E>PXcvUq0ksus&8rm;MUd4KZw9zO%p|u8E=0vIVwA$!8(EzPzLjcmD z_LEY2QWmcCgo6i2<5PP4RGfiRB$#%OjP0P{q|lWoX^#Z@yQ~sDvY;bCAg!IEqEp$2 zAuc=!BkRFgu@&cIEW2-~%qFIxA#o0<=)%E_guUbaAcJfs#fm3z)&ohw$>H4)b+VEA zTv=I#yh-5wmnl7Ay&9#bi{X~*D?MRL$fI?_%VDpM6SiJ>dFtbIbgb|Sm<;+9c58^4 zB!`IyeMu@kodl*h+Lh81{u%!?9@Aq8C_Rzoeza(%C$c;ZmT09XoGwrwo(3h>gst?1 zI_j3vldfl~E~WH@73EhU*!GF!Bb|_EBH2qn@f<$BUlN`gC1{F%;+&)jL!v zpTjJ)l_@=8LT&byp72E4xL;d;iMea5R(it18a*e7o;bA&Jl>!RV*d*o(IBMhRB0La z`$|uo3RYj~DQMS9PiVK4o^S}3P>dl0{u-w)RM_0Hr5`)3=5ZN>9-&_)twLJsA!@z|E-iWavkx^kn#9rKcd~(ApVg zS1L1bDm?{rGD7F&1silmMmy&qtEtjTPb@EArwePm->LLu*rk=843E0EQM8dPv$%hr6&t?C_Ncme;{xA{8TV=ot2cHO7WP|Qz;r#dMZUzXCk@x9n(Jq+xpzi$15!74MKk?erNqtWqM1lAN>7nB5L9}a zfvA<9Tr|3e$<}8|PmxTRd9>0~BuDlSzhmC-yj=e-t}pk2XqrpuDe~-2r6(8r2$Y^? zOlDfvtOCC1yb$-G&5Tx!1zOcv?!nUnn~N>4LhLS$y_Ql5MRWn!1~)Eh|7&i=GB zd8E>l>xwm*=6ISzQ0b`@Gg9fPR3f+1lQTs?=_!&ERC;m|Vd8WsJsD=C(vzV?DLom6 zTj|N*PNgRUM=L!Uj$W!lE48$4?F%VA8D^BylVLtMK*o_wNNz*$-Sz>$?Dh>gxlvX87Kb} zsM*VgW>$KV6kF*DPv=y6qEgcf{Gig4LG%Y3p!8&nmeP|k2b7)+pfVw)CvMeBPsRqm zuZrA`uO>k0$zX1!CxiQXPQNsX}^khKv!(mEKHqh%UJsG=8>4~Af z(vz_njTWQy6pfP7lY!~F!Z{4gGL#@nN>3K-PR@r6)rPDm@t_Lg~pSv>q57nZ{_~SP>Ir zBLbA341+5@+13t-b0$FP$+jA$Cu4_ik))d|eR72J%QFoIh3<~u?c#U1ehIeEF?c}f z$pETOAXAtbh6eVEnpase?JamDN>7-lbRttqPj{mstn@@?nz_v=2c;*=tdyRN%~pCc zcF2N8Iw(CEBUyZDqB;gJr6*(6ld1ktAeA$it@PxwqtcVhj!I8tS6-(6%>k624pYrI zm7W*`_Y)cdmeLd9RC}_H=9+V>ikN3CcqcGQPqy7xda}*B#X;%G0Pq2;U!4mqvr&37 zX07xTu&Dl(Y9hO=6;hgnTYZ(cq3@kr>w31rK?2uS1Ju$08>4~B2 z4r1o|)CR_|m7W-2D?Ql&^jUH^mP$3p+n}ZNWJ8vK4>&)BP_6W214ik|wriClPB+YHB0-?^WFuM_2$Y@zfK%zo!3iln*&K(`lTC0bJ=qMG(v!{5 zb!azfn@w^nJ=q*yyLM)$+eEk0lg+U@ik(|Wi0M*#vPpg;+F5P2S-L@OQkP9~D?M=z zj8mP1R(j&FL+Odb4y7j!hm@W;Xem80z@_xWVW-j)BRG_v9H_1IB->ggCSIU3K`X{ z6qKF}B&a}N>8>usPtse zkkS)DrIenYhn3+>N>7Xvsr1A+(MnH@R6^;Au}UaCF;)qsC&rpV>4}(Te+M0R_YF*q zO$bnWG8GKH(pGvh5X_tbr6+@hl%5O}RC+Q4UoDLq+`7C8E&+MSD5dXje#8~3$YKB&Y% zyGLN_XB*!6D9e47E}VwZkiMF^Y{v~sqaL1or6*SgI_YawE>tT$84PP%D?J&jt@Pxw zlhTs`jB*nyJ=u1n^kmz6$EGI+hm6vbLGd=kl%5cXQhJgYRL)FFPjX=qMf7_>_SdEZ z7*!_PF9xM2Q$!mhr6(7tl%66WQhG8NS9&s5tPG~~WB?STfz>l9J=s=S+?QAvKrUKI z>B%N5rKgaQl%8xWZn5qjqDRw70ZLB>WnxY*GqXeK$)s^9JsA{BthW$B>B$DvrkDVw zCj;0@PsYxbo{Uv5+?CQ30^rGhBuY=zlS)wizLfhFQEjCs+*~QG^b}-hrKg}>3lnjr zrzj38Jq0n$S1Ub*uz=E25Qm;HF)#?hG4N|@0ZLCn0#nSnE(H4eJE@9bI<52+wBuu< zQhEwP>PAW1u9Ng3AbvswN>4#zQ0Xa%>k7rLhe}UDoGU#AF{AY4Ml7YLAjMXCVyLC` zMD~(OPsETLcLAj*d=#5m>4{jhrVA@QvAn}dPgX*%=JdiWI~~WWtE^y zmJ)FkH-XNpq?j&@1z<}t=%OGRR1JDhkU-ihCi{znxUC*^Nf71=LYD?XTPWzVAZ!UU zTpmO%DWNMus6$TZ${qVr9hpF)BS70CO_^_rd^zo93YOWYcXWCjm-NrEpXuxiw)JT+a!W zp46!Slmz1I%rua%ynb3lfr^c1EtrKd0`UxD}TAD$ZABS7gX%-~8-F4R_fB8I%# z>Wc|TAqh}=Vl$g&Srh*KoS`Nor_z&|vUEQF*^JUtxYRyLIYWTb(~Kl+tE=Z90gaTN z3=c0%Zu9RN#?g5V+t1d8j!=4{OlU*?2$Y`88Fj8!l|IF`wjBh#x{jujc_^hP;>Z@Z z)(wXio5rw!Z?esAhtiWdr>*p4?2$@OMB()lq4Z?3awt6+Fr@TkAi7I}lgtj#RO3od zhJp9PfYOr#w3MCFHwNB$8dIzVt5mfl5zO1M1TIfgY4V3TQl4VCI&_ zQv%Nv(0KCj#HjJ~7yU1mi7iUjRh1_*v05)(0BMURQC0P3Fo0iiUX&+KtU9Txy$Zbb|ZlhvZU1`pcnj;{jw95}>$)Zr|42vt~B2k6N~ z(D9*6s&ppRb+Ib{pk@P|Jr#?!*Wnq`3*dM)V;To4o@wjVbv-q7^c8Fzz%X+{YN)a zeXg$X^D2W*v&N*v!?m+i4QD_tX5Cd6$3!N!7A}81{0SXyEj8h>SA)H*{zDt#L>n|9 z#Br-)rxqj5`X)*H$i||~;&^rp!a=T-*U9ppSQXn=z>aVdlvGs$mh|L#P#V0lv#QRf zsyu}mpqk%YA=cI*@zg3PcrDBeryUCxA)1lb1DWcC8<8nQi!2hJYLmP`AzJa|LTomt z7GjIc4|#2?gu3Ditmj5(yLSIllnHsKL!GN(B*Yo2#%UaOU=Al2M{DGz3DKzxNm-FX zY_$wfDBhchH6Z&(s^SST`dn_LJ0QAwN?j&7Ws?mfcln`(zl$n z?s*y6^J?v$S7+K9dtMfAIXP3CvPb3REvFzmTz#;^6l%W>L5^g?VbuT);AfHa}XntxC3#^`j=MZLP`WFL6booA#C}} z&&?_Ar7aet?b-M!)~sd#}CEzWdxHjYXO7^ZeSJ zwbxmDt+m%$d+o(IodAGkJX{&x_Bc zOB99YmBxxmH^YVnuO*L>W8!#r)C3-Pqor0fjNjxj_vcu=D&y#d>6oSvM`@@TCZloq z1u_|yxxu6)7v7lN%7vL&a$>zJLNI*rQd<&YUF%aA`B7SIk25i#@rqI;?+F}m zQ87g5MLg|R1U4^%yA?=$lT7}nt%AwCd4b&uTEp{bQK>8`rfA1Y|5tHDzl9@uEQ3|B z6VT?xR5_D8^&E_3oK|!YoF3e7u!pYF8KzvgpoKJ>;N1wJevFqiX9mLqyBF+cGZUem z3~SF}T5u+EHqAuNfuTS`y9$(s-f7xHnebd430U}A!_#>tz=`nuKoLpjg1~ZIC_P;+ z$7jf;cQq%cnF2ul8cu1m%&<2*Fl1h6Qrw&%@4#LKsXxyo&Pv~)&rnW3ZPTT4Bp&gwg)=3?1MHFsZ9nxU6k zqxmFyBkVGZ29dtpq5pAosonSDrGzCm6O^~36QsR1R zu-CrLtoVaHQ%)>-RY+S2R-ZkK`|LYRP*JyWHxzV-bN2wwv15z6YGCUO13o7JG3;|c zqIf$$(338Z7YIFFhar`Mn+T8;V6C*33?}sHxl$-*X+_rJ@QzT`S~w3I&esu zJ#AjYyb&wVfY%TYrw!x&({1;kVKQQHs{u*pZE&kvUeMlx*x|*jGY|u326k0NI*U1{o*Sz<7btg7WBjEK&rXllricCFi9o_+;EcN0kh#O&X)Y z8+%w*JYhgI@g(N2#(;7z@0)4HSSZ7$u5z|AE;z6GOWk+j;Cw^!r81?Su1pOkzEgvl z@iY|Fqzua?zHxHKFwy%~J9^&+St`R|ien0tx?;wqR20D)+}b}&&L!RHs=eiG(|*o~8x6il#KZ7bCUJkAP+@0I1+qyHW3eQR`PZYI1uF32gbMHb_(Dh|^83o;@Hc`n z)x-bDl8a~N(%Igb-FWtP%Zx4a=FDiz6=rl~3N!P$HiI<~U7v~n9%^o+r%6$9W;Z^7 zF>j6}!ntq3yaYHAH^KM9*)uaecvnvg{Z-K?%8 z^@Z+yU$>$u=DNCjdn5&Dvzn$CFMui*dgT?^D%0CmP<2qscemwOGnCqrT!L=hsjd!L z4PHv;dXiKPK@9fv`&oG@zqO~WQ?~$5pj3EOLp{_7{7WP22QOLl#Km8oHDhzz`g^{OP`1H$>0!r|fR=AKxBr_xF1X{U^55 z^9U$x&?xcB`)ygH!(#BF`IuJtEZN2lHY+1r2mRsXGp7XORe z5BLiXyn4x^n&`~CZ&@{c{SHunLx_5$k5qVW0;%w5-@+Dud2|X8w?s*gJNsUFzSG~f z+n;zSI@7=Gm5&zBzilQyOcWVkJ^tf%c^H*EUIaV z-rmyk>WoF5&psPH-EWD$a7FQwj(PRb`Rk&y>nn~ypWlNRukhO61X*}eHG`i$!q9hvbzBv=&MAf`YJ%~s{nOh1#J2%k?X#SLZGk8 z68BYAQhgOA(^pXl^i`w|>X5Bz)gjM}#Ot0|v94zD@qEj=udG|Q_R^MXiukwAFAn&V zqOo09yeeXJIoMQquhYo%7apk)4Q*}eYl=|k$b)QD!4wF-zs8Zs`3L}toSJqOIVVO| z|8(XjS6_eauRA_^(JV@X7vhf}-ARA%y0)11`vz2U^pB4YobcL5t3)JqiAXA!?T&or z@+ao3u}xfPo)ri^#3AQ5fWiDm5lS-yWCegGzoEb(2GE2g3Oc_5*7=R#V17e65SJ+F z{07*{Zzx;&4P`68q0ISBSC!gY`At`o*K~dZK9JvtO650zoZkTI{07+MHzL>h4TV5{ zlO@h?s-*H8N+!Rd5Xf%`uAU@5QJKuqAVk^jDG*e6>+$zZkh$`Sd@-BFhgm~LNbPsD zLHivrM;1U18KMZxa#7?U189N_1ru2)1R@5dbS{Ti3}D{d(;+8oz^Qqh{CsF$qp^y} z;DrXd46=6oUQUK7ax_d|G+L{Ob;}-gb11+9q0eOpMT6h`33)!NQDn$CebC(9q{)kb_Wk%kIfX)eQ9YJ?^6h+3hyrbJ&Hoc zw66UVM+fR=9a|Ee;x)SY5Vz~)D0L{c90m9Wg@9yB9bC>b?U2wz02Hu>0F)F0F_lLLb90 zQQ>_KivM?y)@(jqO!dylr4g1gST`rl670yQ%GOYFr1|Qv!OD9lh%7T-K_M_-LFjd- zyYYE*J(eQ>RR619!9RAu z-}0FMciZFs+X`vF_=3MB`j~%L#VgTm{)xN&p6HZ4E&lgz#wN@sA}=iZ2*AgB{FB=| zqC5PF15f%V;lkv{R{3W}7y27_*ZId*`&(Ad_bV6reG8ZRvFL%j{VSs@{U6=@%ExZ- ziwB}LuSNgH|E(826s=qI;Oa%Rw^F@(eW!o=D~tS&=s>4`a&*cfe`|Cgzr)YR*ZWnE zE%HBqb95kAtoPp+d8~qVOshrjo$+Sqy|f}wU$oDKj1__LA<&mbIaG{liVzkse;p%u z`AXlu78{m`73w(sJ!&ZUS1)o^#r%^Wf8gGte_6HvS?mwaiN5f7{i3;k?LvQ_7oS!1 zk0<N?~MPn#XqUqPsc&s`7^(z;4h5(SH^$hZz}x6UvlVU zv>J|#-#vbPe$YQ181e#PImP!P6{_p1)P>c5OG z@h;#NM-vruq1Sr<%id%DXSTQd-}Iuf$1h#$@7-STXGeF_rIQ}>Ke_z{f8lQb^thlo z1ti_~`ZbUFt?iHRK}WjP??x}49=-La6%)~8ej(=5Yu_yMX)HEU!}pd^c9B4*8dYx@ zet-(>Vk2J4ER4cB9EH~5oC>Xf^CEYAHM*x*bN4-d-%5W{ym$-J@PXSp&PO&|>E|B$ z$t8ExG*aPQUPwUv=w-jkEpJR{EJkU)#J6TX0kS{7P&tf7LI(vNPcq5BcXu zu`iuL8l4%9C;XKU`LP%N@rf(0eoyY!P0N4 z$v$2@hh>?W)3+8?Z^Ms9j*S#Q`lNsT!m0kTh3FlpY`(kx*N<;s(K_=Rg(ZITL;j3{ zzoyz>RPgiB>eX~Hx?+Xj7x$~Ge~WucE5#gWTQ$Ii{x`f^|F?g|N`Jvhe?|MHch^UE zfssEaK0A6c((FqAMNF3-1l=oZ{jj$HnoH6D!6eAm1Y5;xcF1T85BrT|1TaVqEUaufnBJ+*yIV(J&1Zb=ExJ?v>}t`YE`bQ ztlCkrw6f-giIr7#U#^VSO{$lGy1q-D8&thZV0AhcS602ZVsYivJN>%K*zM!$D$l*` zn7YcEo#X2&7wnj@w6eA0`iYebz_F%of91J#Pgln3zEU}L@pF|`i@#nOy<$?ur-r#) zH>sk3n9IxX4C5-PhBq)pw&x<%PUv-KMP238+exq6NUxow*N*W^D;p|$CPJMrL!JFl z=jqC+P^k(kMHf%X@e3evz$MKjv79`rcM$dX<|+LYhYr-sQa$oFUC%1M?cyqa zOHx_2lkBs@Us_pPv1B5Q@MY+;zcNZzmGY?GkgE4~Rj-^LUAP{nm{9j>UQqPI_#xX} z#tlm*RpiTDx?Cs+-qV%5AtmqkN*>yEJGE;k`F+Q@CC81I7s}~P{;tBTpKo}~RD58+ zCir{hq${Prmnym{wI!BObe0{{0W&U{)Eg+(vEHNy$?NB>HN~f#euUo(`T<2hE~Ts#}T@!;KTg;H%b1#R(VAD z4SD2!{^H8mUE>y4p8MWo7FX8XNqOY933ZjVJEL`#D|Q^av~q7`#pLldS55qK-Tu0# z7eBZ7>x;j!_?vZKnKI!RGIBXPE`;>oz<9hf^8wW^__?ADj;^0naRpAxCRJR6Q{AL> z;%}e$ONvvTq583`)ca*Z;ut2r8<0yw(+u^nX4EBqRo6>?-%|R(4k8a%+^F*eqDrLX z%O_PVS7805HTv>R8X|qlwSOte!>=HC`+(NfbO^hnzuZRsWhdpy9mi0Lyaw6v%gB!V zkrX_X`w zd7S9?D*CS)`VFc*IMq+us_4tbH{oBzc-PO9e#K`v`slG38x_48Cd&37;d|kC(`%GZ*4{?OYKb4e3rN#7#Z%(Vs*DJD0dC zP50arY4HpP-c5>Iewz~Qxpdk~B+_^WCbK!65YNFBvve+`z0{T_eE1dbdhf&w`P2t) z1Mm71?Aq`}-%Q#A0ba77+uA^id5L6qz9T^oc6wde9Co~No6{)|QY__j>Grl>DC-Hu z@N{tZFeD`nFQ;-Mfu*^$if8zjX`d#*yFix|b2%*O8{~7z^(k*nx^Q)mv{hBGb`{&jJ)YeL;TS!fPsYElFkz#hmz1PP(r^n6-EYyhvZ0#(E~@HKUyw zm^-aR5ydJPv6x+6>=Ccl7l!nVPV%k2PzfmcX*uyRr98cXnjo*Sn1%H+>X% z30W0tmen7Onlo*i1f4OHk;tm)0MM2SL_*NBD!`got!Y#5O)VQ#npFbw8kUJqXD!A9 z3Z60(WEZeQiuy8WsnPP215({QO5$D4o7=P4)ho1zP~z)P^gT^HU|v=Yuw9kR7nbF6 z_$rnXE$nFQkw|2EHzwNQ6|Yp+-mVnixAPLq;ns#_O37t?={9mH7Cw) z3>7idI||tPDwgnBy!A?a<--XuP>LE}J^FGc*_GLrUXlX@vnvHCN=(a|yYeWnO?DO2 zreUkn$<0nRL|r;p%4;b;{akQJwGvsDNnwZ=`r?J?Nqq7qdu8*AG@c{Kc}w_9B-o74 zwB^05<8Jm-hFNJlxxkw)9sk)C8c_4S0hb>Tslz` zHZgd%MqSO|c^cKk;IkTawG?Ikx_ULTUdQTMYZzorNUz2ay&7G;*0_2#x_YfK8cE32 zE6#dN)_SdFFsN5t>t&j~wv_#clpDUG&K2IQL5BZByJ!Q0uWD2SgTK+J4GjKXGpiY7 zxKb;-fk9R_;x#aMzM>*E7`|B7Y^YV>8iQhRtwwENFr!fo3~tw`4Gi9`Q4I`!R--mB zxKE=R7~HQ>8yGZ(rX{O&98}c5)U}!z{11haLCz)mp&T9PAPl};p(?z)+)|5 zvHKsny`t%f6%B644$DPTh`^$-PeD<1J08DteD zA(vQ75HiSmNWzg-iL)x-(H6dzLDq+O#Y41N3bS zm36tqEsJ>9mNx4b3c>nRcr}BiG=ETtnOa^mb3R-9u6d+d#F;tV>2f+hko6cgdOO@% z?^l&r-;276$CQ|J)j6zjr8E(-hhsH{)wwvJqD6qhKPeH<=$17wc#5{s+R|EIQ`AGc zRx^YDrcl0Dhz@cA`~KnxQF4Nk!k!6h>xY&6kE`?OXl6M9agwUfyV)3m7_3v5BHo(C z3Z%UfI)IXZ`ODkrk17;W4};Gt6h(5AqXDxx-c)2Ttx;vy8NOlg`{l#%6m{uLP13+%lSZ}dQ{aA$YGBatZc&2uiS5W2Fwyl$kwG48PV%@0^sXW+{PB;MomRH*&>kTja4ds-n3l1k--ltRCwcERT{%o zY1Bc-^3g{bWZ@*Caga+aAA}4BRdLPfsuB-VB_5(mJWQ2%h$`_gRa^&++V0A>`otC4 z2o>IJ$NNmfI%Dd?AXg(xx>_;SE!xRz7#vV2-^=%v705{#-$ht)SZ;U^GL9L9jAm2R z5Ij{6_zk+f3OJ-L{lbti$ZKA-lEKr}(xw7g?SCt{a-3uZG6qjlC?Y#s!HW$UgY^Nj z76o@1vTg9JO|IQr`%RTED)4EIa-7YZ z4`0xxS;HV(3t?CoWL96%tk#rTnd{Beja|cy{c!nO>~U^!SSKr`iFn-Yv<^%Xu%W)D z0FKmilztW70;hMC(u7E2l0f8?O5#Z3@IXIg@W)EH=-XUiGllfmA1Zn#t?=eJN|(}L z&QYonlLP{>l!SXIM}j6@S+9%d7W?@}(@RXHlc+EhvtB8f=?0beR24%T~*!qRG&;b#;Mam9+W+^|J4XYxUv$(tCQqQW1X7(79tWMFaWB16dFB^uSl z;6ke|m)@-j*D!d8MaZT54IzUMScF{SoCmcTJY*4aX=C}}J0fJ58zTt0a9MzmVQ!)zV2Dv$skV}{9#>E*7HqKoix{YfIYg|i6<66QR*D~lft|hE- zErV|3TEZIFGUzt0C9H8R&OB1(6fdb-Npnqx+cd65x9#&9H*1h#ZVvTxh7Skm80OXx z9m6*$Z;)JuZ`HV(L5AE2veSv4s4X0v|Fc1|QL=#_uWcKQyX= zO@5Bj0lbzgaGgPIRA7febt!P0L2-Kq3`z;oCw57g`QN9gsL2f9uW_@q`B`P6V|cm} zNv7s_8P0^CQuHtBdNqSDE12)(5Pyd6RAXt#T$o8}HA%yI1#U7ZZ2<**P6>Ndondzd z|6QZjvPwq0Gbd$Zb8QR*3_h+HQI2RDhAIU#dY?A^t|4A&$X&HEJz`yA(>Ak4w8XVH1Nt z)2Ou!{@kj|B{L8@dDT^|kyYa@ckF;M$jZnL%q6~gfey^zPqk`SGsw!wx?D1A12)i0S?~g!*ZbqW8?c{$ z)*zR8cQGVl-=m~{T}y9Zkhxab(%&%<;VaA^d>Lew-AbiO-{nd!CE2TT*#VQ&82qJ1 zH8NPI7|QNc%Il}9!W`XDCqHtcjcVRa3|47WoWT<`s)@mk8s&KT9qLkzCTU=hYgKw% zwU@VsczL?2x=yobENvu9;kjE_mW-*4w!maI25S{cT98YDtjOSIT{q6)KUj536&p|p z&S>Zw3_hhUVJgbtK82EcaOqSnw3)%vhZXv5#b!vIL&EXWz?Bb-H&a6B=js9a=tP6ars8Q&38shjWXr^d<&wR=V}8^X=-qU!C`; z2%V^Uze4L%x%&M3wbCcVbVUW|2hbFMe(J28Jbp~?7Nu8A)#E4oO8NhR5lpYn=c+Sb z=JR$1aM*A=_+$(KrO$kIZct~wxwTh~1EqJd_*O0R;qx=9{@2v`Ts5L! zpw5fcd6_!%CMw^dWj=i7C;2Ot9w(~vDe8Q>I`e&3uE*#7>iW0Tx%5^k)A5-f!Df2C zx5)!H)A9LNitlgKnIB1bi)tUwDfq@G*W+`qqRXi>KXLGGRp$GUY=5rD=aKxxbbRJG z;N@Ja@)NHxnU2p7D1f(>KBLOKQMON&52$nLi5D9esQ9f>=hCrsMVa_srSJ{vOz&W$ z<0ED0A5nPT_IOH_pH^pX|BGenzoziN=j+Nor869U#6@aj{uUJd4eET8I^U+w1M2(% zbv896^oYVguFm_^nJ07yRry7AF0KEP!Vjr4&*x^S_$;MwR(QS*Qrv(i+Mi#(xSi{eo>|+3pLG;MDf=UvUzEx z*E#~t!^B6_j(M`)7f_;OJpN0=Jp-s_1U@f=rgj9HDNyk+gb>$qI@7yC_Kd*iD$op! zK$8Yd{|GcUfF?Tv&D|smItyPwZ_j%GnAixlo&(K6&`>RDRmxd=hpAOfzbX{`r6>Ie zJtuO$!pKu~Dp^P>3~>#Mjp~i~*`zvz2O}yOGZN?OKEvo3l>Nw@z*PxWXAKQ;@FO+& zJK3Ro9qpP5?6HEzjzcEq&8Xu9jfXD4&)YJE=keorm4fECu#|hmq$#~Ag65kf%sDPl zG^DB2Ss?d#&5DL*_JmY z!jH5_$Y#)#=wm`d$_nAkaY${FaY(Z4gX55*PsSnd?if0bLyA7A1p7?GUy3$! zROgIB)NVg=mbn;!$QOr)@kRA@Z8;)0He}0h0#;f++uOCZr?(qF-jz0&?DvB69=2hK zHHhk;L35C4L^XPjaLB?OB0eyM$s6=j!+sdhV5-o9Aqzv+eV)ra&c-lCA2k?-y5rSGS;F{h7!!Qn~D8fAR?MbPX)S~FG^b96LS zV%Ua~59zZDp}U1ei1X35;bCx4bM zu+Jw@Q`$$qC8N|n^l;VTlcjyaMtl-{A!znugUQ5U9GL9sLCiK__F0$@0yBWkD^u%n zU>e>Y#QX>t@2nu^_rPS&W(<2rYDnH$2Vb5?O6lWhduNXJ&ZAle1MHnBXh?O8r}#@V z6#Jm)-3tO4;pMZ$)2JrBvr&BL&gOzo6C+F-rYmbeX4o+wG<%pv5L^k&J`0ls=Aebi z0aH7J?M&5f1E$}?>;`6_I!Ln*n7uQDm=}OKY+-&3Of9;%@jJcUsTLB%NKK-=@c^?H z%~W7wbOrxq@4FD-VT)!ZFjd&NG@P%cS{lRAA}vPVxe1a>@{bwJJva$8_)~K5>>>ud z&?gdesCahqGOj=f_-rWQf|;779F3umS_McN(s`Lxp9)9Pn`$9L+Q(s|R{=EBmG-e`c|w-5PZemSeI^5K=U$>C z`&5C+NWJNopq2LN#5+as9gM`rVtadVw*4)Z zYO8jMmq~GdV8PFjRoNP4tokj`G~nL1iPfKwRTl&?zXfKG#%QYw&ScfMLti@!9PMmF zdx0|Bl%JjMAB9!-jKZq#)K+cl?b+PhRiu}I1r}~6P*X2b_9s`Oi`Fj@rqgJvnJr4D=-j&+C?gKzeXj z35Che^s@=+!B)_?o+c00jKYKM+JoWwc@Hes$`%7{*zrF=Gq8fKN)*okv(Li(D=-c9 zL7HCy({EuWOoW$LF%5f1N+<73fKjGc3LG`>sC{F4Hb`2&!IDD-?mPEs%cFrM`Vbvi zzI7Cq-=Zxap2JUrHL`4tGM2vtH2auFXB%0IEcP_?fhvLHXj_c#Buk6AF~}A>q%BrH z+YF4tVszJhxcq!A#m{OLKV>X-D`*;+Mq5nQB8!~_TT${e$I-S}t+p7_T*<)}dwmoZ z+cye}eO6m6JU@RN)@W7M2wRPkdQXC8pqYCmVSWe<{oYt+Y~4=lwY8vKJk)9@F`CUEe+I^Dm9sX-G9Ts0u|<-^0-S*>bog*Awm(^8LD z^tF&heGxPn+6b67KZPR2fX2*S1$h=`&U3hKVdl|JyTT~xE5;;!fg_#nvRks|6kO>r zmo2?vOw#8#(rGutmfqz^f5J#tcbvb3S~4fJCpV>0A#il|(5p)2U1`a=z0ipd$a>xr zMwYT+E4KnyN)N}UVKnOQr1o+cjr6-1_=P@^6CsM?&m1Z?=1^Q))|ea6S+)J^kWsGf zx>x@B+BN5O)>+)OH*F$FwQKH;9O30@=HJM%5joCgLVQ%)f2rG!S4sEKE1m7x`Z&zw zq)*G=AAAdF=$;dKAndL^UK~rWiuS73I=N0;^;y(?V^=`*?2#N{t6XcSU91J5!9TPj ze1sMEsnHe4o_^#9O=0^abf22;PE%|A$So+jM+{iHJ594NKk}b00Wfr*n)eLK-KVCV zIlA*qql6#1A0@ZD&^_oOTz`w8!Qc{dP=1bKw2>Y>KZL^b=pJ+{*pv1ANEUy|Qs&@@ zqV~())X~|oke+jsad-!+LU7>VI6McuWE|pc?Bd1u zCbMx?_pXtehRxa7?<5DT(01~>eX!qY{zF=X@u3>zum2bqQU3aRgXhuI&pyasYav4V zYtS_y$jKK2I7?r|0J&t86J7%!>5D8%?m@nohpN&SXSxKykT3d&@dexYO35#gw{*-;!mft%wpZ#;E@=V4Q+smo0WkmtmM>WyZ)zuNU z91UHg{=V%N?(fIE10yh@t%Le|J)%nX_tPmDorC)OQqai$-U4&O=p_gB_aWdw2K$ib zTvjwTorB~f`}=Azarsbx@5O)F-`#x)Fc$rNXcYaORwY$JpFQ|X8Q&b--}gY4?C)*# z#hY|r+VpttUjw4YQM*iihK{6v(H@8xcf$CH*jTcTyj?anBuyR39-gLtU2J5UI}XZ!seKlG~u+lE9#@smRE$oPSwLJo?JD%6&-5d(#50E&$~n8?^jhj5X8r)Lyp ze?Q-$VV}}RAf!*_M`k+HUDcdr1(wj)QvFF+?FA^7!p9SGhwczLh#a#-&s zS$_kX*g9%WOhlgN4FWR``A76+uh5AvYo*)rQH`Nmp9W3;dRYrf;CLDs&!TxAn1i?| z*#c;0&eH00ai*1}KymLt6KTF<-QW`q(&_~(%9WRChfQp-7LjQa?Zj~wH^ z2S2$7^@3KkiyT>QjHBNUP_8>c(xBuXl{q#Zxs^x&yhrLjAcdkz<&0@kvR=vDI+sx z6QIPANzq#_GI>Qt5@1;992!t!gnbS#Sw@3FGa2?><;bJxU4h|7MlZiM$tH_|X3HrY zy?4`~?i>`o)GLRJUW&}6CvjxXhU%`XDKh(TMMma5jvPWzWbPSFWWsS=2{8Eqi{>0)hAf)p z!1SlM7RRd8hkQyS)jNrqK8_?-wT6)ux;_IOt4npP(zt9N9IN!~rHoagp$M=KS}DBv z2*=?+osBhtO@I=`;qxbR9MUs|?m=-FJ(J_`{dTHRmevC6U0nwFY| z#i|<{h+S#DI1M zk}p!Hu`kdaLJqPsEjLJu;hu(~^`-3Z#AF?%J$)RB4Jpz|WT>6heMVzLqI3_k;qvdZ z4JV`Fu0P0zSB}DlRiGQmh6l6_dt7CJAsf;&TO--8ZZqOW&%3#K?`#VFjbww zT62Ket1)gQ&})Zan!v%mX*7{gGfZ#dOj|gHX9X()QY6TkwiYxLBYvb0f9-u^qNIpw z!VlRo*nnm|))ifZwhoG@J{?gHOXFJ+zRXHI3f+ml%=`5hcgbj;JSeM7eo|BkEBd zQNoWU8p()y7_Z8Z5%mnNySyl(&OT%0Jl_hs;i82iVF!X*j=5VQ%QY=|d0-S?rZ0c1 z@f3VeDR6M_9uOWRU(60%mEckHg?e`7pqAx`($6Dt9~y2<87`9$XR;5?>nOU08wa1! z5sp_t;N#V~ttP^W&sxfvLg(;ZEViL(mpdIhYBp3)e(oDZJntVxJQwD3JpZqHIm@9I zn}g!{Djm-&-5><1Snq&tq6Xu z_CX_K;uiM%q55)u{~(tBm_UF}dB5)iuaW$I;+dSsP6Bnf-+wgP z@KMsIInr?hp+q|Uc2w!3q!YBZ?fBd zqa&Su=WP4^+%ZYt??`{mkzR15Kj%oV8I$yVj`Wuu>0OTWe|DrV7?boT9O?8%65H}A zM>@@5ZOhk=N&2IXbS$Kpv&;Z8)du{-7iM2}k-uNBVml>78See!nCA5l8wQ zM|!^_Jv%1pdmQNxInt*)(lnj^i(k={Qh=^t>U-{(j_!;!wx zk$%URr0;U1?{cJ{=tysNqz{Zq`hX*y?)=!6pX^9q?nwW@n55Ht7A#qFcRJF?Inoyx z>1r)QZ}^mJnex9YF?{%UB>`D#ez=EQ0hy(TGg}U$QTx4m{v1XlN08aH-z3^T%k1 zEz`%G^;)LjMBQtUXhr6{b4}E#XnByM<%pyg9O+$-^p_p!Cp*&jj!Amfk)Cp-A9AGs z4*g46L$&?UF-h-oq;GJfzvM`#T@hRQzA;Jfbfh;s(w}#vzvxImFed4(j`XFD^!<+X z&pFZ$j!F6kNBTlX`V)@y-H!AZ$0R-ONT1_Kf5eeazooMMJ~Srj&5rcxj`W8d=~+km z&&MRa!I3`Ak$%4;eVrry@R+2pa-^T(NWagKUh7Ez&6uRGaHOB;NZ;j1r(dbte)l$w zW#4A0BYmvWJh{*Owwx|>Ej&fJ00otTXMVYRb!IA(2@Q+kIOvj&AHK$PG6t4 zrB5A`^cqL{AxC=3k^Yb)JvJuk(;ewAInp;c(&>3UyY1(WN&2~t^yeMv&5rbbM|#be zq)&6CKj%na+)&M@}&SFO%ceV*5bdKSE0njA}&sQZ4YK76L_YMB3_x_x>2ZzkV zNxhv~XVPaPFs@SffaU2Lhh50)vx$S%uB#L0g&{Un4bf4qly-Z z8ArFv)OCqD0hm6ev&5VQ%>4i*pKLDEQ)tIi1eWw_(D2Mk)>;M(&ln{p3Cw=YC(+g0 z1~Fcr#is`}bf6(h=bM13g>lF}lFxmDW~k?nc!$5lJO~W`M!tf6+trmwLPOM$76aft z1scxkvewtAmetZ912Y8s;Gg3BJ78?9R^mqGPTdOP9HU#8IE+3E2!omi(+G^*sfa1g z8$_*GfMzo=6mh23J;2zlxE~nq-KwP+Q0Vz?+0q0a;!L2=wgO{pxDU1VL1$yb7l7f_ zv9!jIfq}{ai~S0iT~Kjqk<3D z+6&A+3-dn}XA=qE1m<FFWZCDFRLkAz=8eIFiq&fyttoGUky*Gc@kRP|L*67eK@70*plBM}6|m zZiZ$*XvnHY)=R)pZXr2R)@ur5YK_CQ&%Dx4nnqw=)-j*Ybl?S( zkZgHy188b>yP$%X2ZjzK{Wf5D_fm4c7Z{$wR(SbBuBWX#>&g50G1ZEPLDLL!)6)IG zykNXh5Bgt7SijB4qq!&s0{7hqLOXL|Ju z&6o`5lYyCT@i`lq24L_{S>qC5%%}&nR}V}|>nuim#A+?BNS`KX5L6k7=%vn`sI^qr zBK&)R*=x!AC@>FMH2(+;zr9NGc?uYNj`SQb2SrOsmgqal((&{Mpjl;c{&!%06Rg#i zKrK2M-X7v0lFo$(ZLFhdTOhI!d%uB%BXJK9jhW5h^ zAOAGZyVIgM5tx4T0uwFMfuW+oEFl_gjrJ`${1O>9)EJV!8Z`WL4Fup=PkhuNF$IM& zcD~cWd<2+*Ot3G13YZm^HTD4$vostcjP5%L`LZZ4Ygz17(AeX}F?ed2G&A~~2@D+u za}h9)SQfh+n4eo#O#t(nMbiaLR%?jthessA*0R_QpxL8oNa}llsnx9@%pPE-Tbv&S z#%{&;fRRVc%ZPUy!ks0@FG2GGEj>}}5vzwzjUn>ifreN8WEDKUeFkJ%8lDM^-FIdI z!}nY&yv=xUnbtS*X|Wir+m6qZ5U&PH))lBly@2FYc-Nv-ol0*kb|jLyWKTyr&&5nn zdoRPujT>|6&0Olr^rRVX&(S;J6bBfaL7MU^tYVwZr4wxl`YF99e*`zJI+t$G7IM`I z6*S_5MCC3bDauK4{gw62NK@HdFH%mSkZkKrr`$?-w@+p>etug><_g8ET(LP~ONc;> z&gD?0w)Tj%38|i-nbyW6mVXYJm~(_-lOeRUE_P`thb9v0QBEuX)=2GLN~O4Z3^aj3 zHs9OhjaX6s=slUuCJI}#XsLK>Kz&^udukY$8+Vq3i5)b-&=Aoee)KzS+cq>;Mwtwl zL}KNVro^iHHO(055(&H!42|f(oBh+d1XB<)l`cV>uP7zj&}{fCfJvnxvv+F{)m`ke zioK~|vAs8k|bRQzmt{{S_J=fcv z$o2MOff?X0+k@uoi*3ER9Dbt%)1*@g^_d}VcIY)WK$(lw%SDp#LJ8zob}(fNNNdkv zG9q8tk1maO0p?1sC)?b1rZ<%4XXv-#-0yvgM1HbZUif}^`_Fp z)lY266gttOWWJb#F8F{;LX5ncZvX=i_4c%9IzSmDWLE?z<=|b4NX!aW6Eq3XbfGhp zy?}_=jQ3U`@ddcGcNO!UiH%#)C)8zGP;te$LUJR%C25z43wjg!0UOS`u8^tfxwB`_ z6(SXJY1nz3Q(mf&{Aeu`r6>`b8w8;Ac-OlL!yc!|0E*cL$wX~-h?n5x zV7)h6j@;pwl$bIV3ov%7cT11%a5i67D4ey-NeP<64M%{BJ)4oosbk9&m%v0hC(!!y z4San|GS^+qhF{C{^pvYsNM^doIDrpBFh?<~3B6QCYpLn57ezPmsCSfjGl*j21#z}F zdog~fXb`!4Q+lfxz$w=SFw8RC-1$6aap==XGUW+IW-+2$NsbziO6*EkhBe<25J(%# zX^~pEIJ2@$ca|rpn5m?C6CGW>8)?#jaW8LSXe7k+Sx$M(g9Qv^Ng0DMOXEATDuEFMc-x|z-#CV^`rZX2Vn3u>EdkUHEG^+EA zWJ@wHOjv!w2K+>MNV;S1(I6tXX#T(yJ0p%T`^rL{2`JUAYt!(9+f<%2x;> z&U7a`(us{p#3jvTWi+i>wnEK_I+H!AF60!xB4&VT#**rtnB+qBx%1|G>F#1ezQKtg z`P;cfM^6z`N#!$s0}J!RdoRc$3G{0jl59F9kFK}nJ-(a}^NIwlJ#UUwl?alllx7fQ z+$QY`lue(5ld!sCrd%b_ylRbJAO+v6G=rq#M~aEHh<(I&x}I#d7$(!&I#;~Ja!d*v zmMQ<26c=y3k`|t9)XUQaMYp^+SC>j*oTLzzzAzV;^dfdjI4$c-Lov`aEYn(fiTeDN zy*(6>G+V0gSyIGIyr&=tG~aYju{(kEKs~N2voV*%SIOv==y_U+Eu-IMirxfzTI|SB zvzIdoN*VI^#no!5s^0QtiXt3LQ6!n_d2{C?(BYQhA~iwECFFgP1ZfDD!c#7Wl|plP+A{BO^Mclgsi< z7mdKOin>7oh3PJzXsYOUya5op5>F(ILrgji=3{tmRWe^#MjsUO$jw`^g6wWacBsok zewrXp1_5=ut^!`%*_*(s4^u)U%R(ZX7g9MmZI!dVhw!k}YZ8s&sO*6A0SS&6&1M zGS3-xMzVsDr2J2r6Y<%bw*phSGPIY$Zs}ZUbV{YfophrNHp*z5D-#?x^;I>IfW4L^ zvjxmx)a->kA}0a~3?UsoG~W@OC44JP1aOfS$WjG$OJ|rYRbSVvZoKFk^gzIH5hOZ0 z!U4)+$l(BL7VB%|4a%u(PO_ZZyiX*8Jr#pLP4L~^Og&+BZ>rdpULhtBbx?&OU2?=l z^@=(MD$iYRH{1`l2koBl1N}t zmoABX(x6_iC&IfPJT9I-8IG=73`HSbo$n|F#sJ$-)MtzjNuOal7+oH2qQD-K14$qW zQboS4gs8Bc9Gs~jj_rAgw4r<$p-j@W(tL1$mSZONk7y5GWEwMAqvHq1P9!F|jFT%h zdqqat2L~`Gu2oQ!3P)J;?U1WQUw&CE7YS8=pZti-LO@cErIY1nW$;+XE{GBgzCk+G!0&e(@1Q~|ZL~aW?BmoXuT(Z8nQp&)nzkvaFqr<7^y1Vq!v22%Wii`tCM6 zcjnU5ch?&vgv3)(1VOS;5CKJqgomO?yd)GMFfS=W5eV@QA%39z;0He}gphwkf^)j6 zx~saXPIoPT%6Gb@(>-11bWfkEuTPyiRb6%R;yB;AcIoaXR?Ka*F5hZU3+I|6m zXoB}9+Wj9v*>eCy*S{oa5A`70zgJL>&qY-HfuI|B9nmd(XriCOdlCKg+Xej$<`dD+ z9vAfUp9LWL#s3uaxsL%5eIEaV=vOdriGKA@1iiWrK=f;vH$=aFzo6g1dlLQT>w>=g zNdThX#=Ic<3hGSsyI&Oa``-Z|`Wng*ef=AP{_q|EqCfsQL4W#h07QRwTF^Is0)Xhx zUla6~Zv`OwtCt1+&2Iq^{oTI{`sO(RqQ8Gd(6_eKwWKm4E2D znMd>|4=8Wv^Xmuum`#}HlWb9pXFDoW{d}D>Nf$*vza_PBarCsEJRMi1=3wm4r?+PF zy=**9_70}LFK8Ay#B^eK4 zr|+djp6#H;+eOnUU*Uw_tsEh{Ba5L$=o(%(&u=B$2fMpzo)r0bC*2oY5$kRotUJobBN}QGNBw9ZA-{fg6(71L#pYNoLMY6b_?Yl2FB-~fC7eeEj zt7(xerdefDz3c{KcY3h!WTRj;BcD-`4Hsmg0DLDZ=dFN>RFm7{jL zk)oHkgJC3@S~*!pqM?zCBLpgMLD$U5QVxkx^QN<%`9x(1C*kCoI94l;e z@v!DzpqD9%JDH}lhBB;Z+x82I^4PBxpRs=37o5DQ)YGP6q)lw^f*orAfJZH${a$%#XP2~+f` zR9&N*DeZDT30YcRw#69vt{6d6)+4FQVZ(er+s&?G4Pi^`OzqxiGp`oPjj_|Ul+vlu z8}x3Tma1MA;l?`{T9N@*JDpOnSxU94u1I}n2h+G_te0*jjH#NG{k&38F*I50d8MdI zcfXVc`recIO;t@LZBlMNwU%W8d+s14JnxTwvE$7zubm8WJGXjvE<>2U$mQnxdKs@= z-8^3&DRMdag(Dad#JCj_hMsV{1I}iXaWOuHkukBo4G*7JC)IKInv~m6NhJ5GI;oD8 z+?GnhkQjVPom9u+Yt>KrqYhJ@#RwJ{&-E6RIiga^Cm84{<$sZ8LOY?EI2*tNm|ovo zi;mr0=HzhLIVaavWe8Zy$-lt6-+@H=DRT&8gzmL+{7rs!Z)xTacBe-QLP)P{X z--W;Gw?O}OR?8cDtm=I#bHR9@N_|C{>()V_NT!rJPzlukfhT1S3tYUDPH`i?NI6xW zi`@Xu;}0Y7?1)7>ktE*RbKT$Djm?pTnx`=fsFXO==%vh|##71`Y6z*ci9>}h3pE$q zausSQA45^|G0bZ=WRLfxQX+~CNsr(&(N-hribyE;1Nbx^TeMTyVzYoj+t&H+HfnQg z>CyJ0w>;{eomkQKn8a3%wigVv?J#Jowc`P&$+^1dgoWEW*JDo0d8&`OdhrD>=ITDc z!-%*#5Yij5da z@55)Kt+qo?mFHqNfFH&mnjLCtCLAPAfT`UAV)Pq!?Y3+Pdqyt@d+cVilp_XBtlj~1RfeO1EYDj=>tvLgn|*3SE2vjnhAV)fLi z9ZOq{r!yj<+z;SMJT~woM~GReOdS^x8DF*WvuqKk%X*HhfF71ZtQhJNanjJDG_tC= zioqZ$AP(O99o?VVbE8kS5~%E9m>X`_#kYmNo}0?C4d}A< zD6e`-f{H3uKkGduj&yvTlPThSo7Zj326BU;PVO+~avSz#% zP0hktTeKfCB2icI%!4*VLl$(VB!j(x==pg&+WB0EXs14lG&cvMXBKH|4o2!#q)ic3AIE#VQQk@4@!w^g;!38m4r{D2Ej3$0jlUn)GGG7;JY(?J(6SYUO?d{3 z0g?CKqk~7dQo=Hf6@M!dZ8iQndUSG4(^kZ}*MAdh+N=e{>NoAWcG*_#df11tdVS|; zaaJy2hghp|_MAi>9R@JQy~obg+Oc5M#2Bj<5ZUjo8k}^OiHtiPLaQbotP z{QFgtV5P#CxeRV&z4&M?TbEUnlx1TzG(pFUGUyBFBk1c?cwZ~};Sl|Nom(+=qfqCm0JzyZ`iWOLN8mC?!7GLC_I%c z=DS6-b*!30xo$mt!e~8Q*IEy@r4vn6pfB()C9VeaMf9~SJk*N6!&=Ka!z4b4 za<%MgK)*zfICu|(IMsZOwU+(=`E{y+TCP9muZ)!#Q^yAMM)Zh-2R(=ro%+c%ogGFS zr)kGkt-2V4xR5@Feubz9Sj5GPwv*C#tGzjUg($b-k^^Mgk;c}f0lf|zcCW*-%`I@h z2W6_27Hci~u!XW`j5fokyln=h83(gUhOuS=eGPqF1n%?VtZtFTinZI1i*#+98gdNg z0{R~MF>-L6#oS@6K|8cZl?a2ffIfyEW$%0}WTs1j7&5iat(iyj0^>rStY9IP_-uGBYiq|&1 z8}*~DjzQ4(h-w?)y5C@HUo~0=;rQbR}b=($|cs;U>AQ~vq!pC z7M=_yW0wM=@%@Z<@ZCD9a8%CK;##z5>N4Y`86cFR? zeIzU^E#D7`k0dRTRx?Zdtvs0g>^31RnY>SQ3t5v=U;`Vyw#uJVvt$Vm{T~2>U + #ifndef _MSC_VER #include -#ifdef __MINGW32__ -#define ssize_t int -#endif #else -#define ssize_t int +#include +typedef ptrdiff_t ssize_t; #endif + + // Convolutional Codes // Convolutional polynomials are 16 bits wide @@ -92,10 +93,11 @@ size_t correct_convolutional_encode(correct_convolutional *conv, const uint8_t * * value should then be converted to bytes to find the correct * length for msg. * - * This function returns the number of bytes written to msg. + * This function returns the number of bytes written to msg. If + * it fails, it returns -1. */ -size_t correct_convolutional_decode(correct_convolutional *conv, const uint8_t *encoded, - size_t num_encoded_bits, uint8_t *msg); +ssize_t correct_convolutional_decode(correct_convolutional *conv, const uint8_t *encoded, + size_t num_encoded_bits, uint8_t *msg); /* correct_convolutional_decode_soft uses the given conv instance * to decode a block encoded by correct_convolutional_encode and @@ -115,11 +117,12 @@ size_t correct_convolutional_decode(correct_convolutional *conv, const uint8_t * * value should then be converted to bytes to find the correct * length for msg. * - * This function returns the number of bytes written to msg. + * This function returns the number of bytes written to msg. If + * it fails, it returns -1. */ -size_t correct_convolutional_decode_soft(correct_convolutional *conv, - const correct_convolutional_soft_t *encoded, - size_t num_encoded_bits, uint8_t *msg); +ssize_t correct_convolutional_decode_soft(correct_convolutional *conv, + const correct_convolutional_soft_t *encoded, + size_t num_encoded_bits, uint8_t *msg); // Reed-Solomon diff --git a/libcorrect/include/correct/convolutional.h b/libcorrect/include/correct/convolutional.h index 520319a..06b1710 100644 --- a/libcorrect/include/correct/convolutional.h +++ b/libcorrect/include/correct/convolutional.h @@ -10,6 +10,7 @@ #include #include "correct.h" +#include "correct/portable.h" typedef unsigned int shift_register_t; typedef uint16_t polynomial_t; diff --git a/libcorrect/include/correct/convolutional/bit.h b/libcorrect/include/correct/convolutional/bit.h index a01e1c6..6483898 100644 --- a/libcorrect/include/correct/convolutional/bit.h +++ b/libcorrect/include/correct/convolutional/bit.h @@ -24,6 +24,8 @@ void bit_writer_write_bitlist_reversed(bit_writer_t *w, uint8_t *l, size_t len); void bit_writer_flush_byte(bit_writer_t *w); +size_t bit_writer_length(bit_writer_t *w); + typedef struct { uint8_t current_byte; size_t byte_index; diff --git a/libcorrect/include/correct/convolutional/metric.h b/libcorrect/include/correct/convolutional/metric.h index 91bac45..ba64226 100644 --- a/libcorrect/include/correct/convolutional/metric.h +++ b/libcorrect/include/correct/convolutional/metric.h @@ -3,7 +3,7 @@ // measure the hamming distance of two bit strings // implemented as population count of x XOR y inline distance_t metric_distance(unsigned int x, unsigned int y) { - return __builtin_popcount(x ^ y); + return popcount(x ^ y); } inline distance_t metric_soft_distance_linear(unsigned int hard_x, const uint8_t *soft_y, size_t len) { diff --git a/libcorrect/include/correct/portable.h b/libcorrect/include/correct/portable.h new file mode 100644 index 0000000..b5d4407 --- /dev/null +++ b/libcorrect/include/correct/portable.h @@ -0,0 +1,19 @@ +#ifdef __GNUC__ +#define HAVE_BUILTINS +#endif + +#if defined(HAVE_BUILTINS) && !defined(DONT_USE_BUILTINS) +#define popcount __builtin_popcount +#define prefetch __builtin_prefetch +#else + + +static inline int popcount(int x) { + /* taken from the helpful http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel */ + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + return ((x + (x >> 4) & 0x0f0f0f0f) * 0x01010101) >> 24; +} +static inline void prefetch(void *x) {} + +#endif diff --git a/libcorrect/include/correct/reed-solomon.h b/libcorrect/include/correct/reed-solomon.h index 3aa56ec..94d3efb 100644 --- a/libcorrect/include/correct/reed-solomon.h +++ b/libcorrect/include/correct/reed-solomon.h @@ -6,14 +6,9 @@ #include #include #include -#ifndef _MSC_VER -#include -#ifdef __MINGW32__ -#define ssize_t int -#endif -#else - #define ssize_t int -#endif + +#include "correct.h" +#include "correct/portable.h" // an element in GF(2^8) typedef uint8_t field_element_t; @@ -36,7 +31,7 @@ typedef struct { unsigned int order; } polynomial_t; -typedef struct { +struct correct_reed_solomon { size_t block_length; size_t message_length; size_t min_distance; @@ -77,5 +72,5 @@ typedef struct { polynomial_t init_from_roots_scratch[2]; bool has_init_decode; -} correct_reed_solomon; +}; #endif diff --git a/libcorrect/include/correct/util/error-sim-fec.h b/libcorrect/include/correct/util/error-sim-fec.h new file mode 100644 index 0000000..b3deeb1 --- /dev/null +++ b/libcorrect/include/correct/util/error-sim-fec.h @@ -0,0 +1,8 @@ +#include "correct/util/error-sim.h" + +#include + +void conv_fec27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); +void conv_fec29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); +void conv_fec39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); +void conv_fec615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); diff --git a/libcorrect/include/correct/util/error-sim-shim.h b/libcorrect/include/correct/util/error-sim-shim.h new file mode 100644 index 0000000..aed1fc1 --- /dev/null +++ b/libcorrect/include/correct/util/error-sim-shim.h @@ -0,0 +1,7 @@ +#include "correct/util/error-sim.h" +#include "fec_shim.h" + +ssize_t conv_shim27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); +ssize_t conv_shim29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); +ssize_t conv_shim39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); +ssize_t conv_shim615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); diff --git a/libcorrect/include/correct/util/error-sim-sse.h b/libcorrect/include/correct/util/error-sim-sse.h new file mode 100644 index 0000000..2447854 --- /dev/null +++ b/libcorrect/include/correct/util/error-sim-sse.h @@ -0,0 +1,7 @@ +#include "correct/util/error-sim.h" + +#include "correct-sse.h" + +size_t conv_correct_sse_enclen(void *conv_v, size_t msg_len); +void conv_correct_sse_encode(void *conv_v, uint8_t *msg, size_t msg_len, uint8_t *encoded); +ssize_t conv_correct_sse_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); diff --git a/libcorrect/include/correct/util/error-sim.h b/libcorrect/include/correct/util/error-sim.h new file mode 100644 index 0000000..e75c5a1 --- /dev/null +++ b/libcorrect/include/correct/util/error-sim.h @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include + +#include "correct.h" +#include "correct/portable.h" + +size_t distance(uint8_t *a, uint8_t *b, size_t len); +void gaussian(double *res, size_t n_res, double sigma); + +void encode_bpsk(uint8_t *msg, double *voltages, size_t n_syms, double bpsk_voltage); +void byte2bit(uint8_t *bytes, uint8_t *bits, size_t n_bits); +void decode_bpsk(uint8_t *soft, uint8_t *msg, size_t n_syms); +void decode_bpsk_soft(double *voltages, uint8_t *soft, size_t n_syms, double bpsk_voltage); +double log2amp(double l); +double amp2log(double a); +double sigma_for_eb_n0(double eb_n0, double bpsk_bit_energy); +void build_white_noise(double *noise, size_t n_syms, double eb_n0, double bpsk_bit_energy); +void add_white_noise(double *signal, double *noise, size_t n_syms); + +typedef struct { + uint8_t *msg_out; + size_t msg_len; + uint8_t *encoded; + double *v; + double *corrupted; + uint8_t *soft; + double *noise; + size_t enclen; + size_t enclen_bytes; + void (*encode)(void *, uint8_t *msg, size_t msg_len, uint8_t *encoded); + void *encoder; + ssize_t (*decode)(void *, uint8_t *soft, size_t soft_len, uint8_t *msg); + void *decoder; +} conv_testbench; + +conv_testbench *resize_conv_testbench(conv_testbench *scratch, size_t (*enclen)(void *, size_t), void *enc, size_t msg_len); +void free_scratch(conv_testbench *scratch); +int test_conv_noise(conv_testbench *scratch, uint8_t *msg, size_t n_bytes, + double bpsk_voltage); + +size_t conv_correct_enclen(void *conv_v, size_t msg_len); +void conv_correct_encode(void *conv_v, uint8_t *msg, size_t msg_len, uint8_t *encoded); +ssize_t conv_correct_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg); diff --git a/libcorrect/include/fec_shim.h b/libcorrect/include/fec_shim.h index ecf6e11..b06e463 100644 --- a/libcorrect/include/fec_shim.h +++ b/libcorrect/include/fec_shim.h @@ -62,6 +62,13 @@ int chainback_viterbi615(void *vit, unsigned char *decoded, unsigned int n_decod void delete_viterbi615(void *vit); // Misc other -static inline int parity(unsigned int x) { return __builtin_parity(x); } +static inline int parity(unsigned int x) { + /* http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel */ + x ^= x >> 16; + x ^= x >> 8; + x ^= x >> 4; + x &= 0xf; + return (0x6996 >> x) & 1; +} #endif diff --git a/libcorrect/src/CMakeLists.txt b/libcorrect/src/CMakeLists.txt new file mode 100644 index 0000000..07eb7dc --- /dev/null +++ b/libcorrect/src/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(convolutional) +add_subdirectory(reed-solomon) diff --git a/libcorrect/src/convolutional/CMakeLists.txt b/libcorrect/src/convolutional/CMakeLists.txt new file mode 100644 index 0000000..43c4bd9 --- /dev/null +++ b/libcorrect/src/convolutional/CMakeLists.txt @@ -0,0 +1,5 @@ +set(SRCFILES bit.c metric.c history_buffer.c error_buffer.c lookup.c convolutional.c encode.c decode.c) +add_library(correct-convolutional OBJECT ${SRCFILES}) +if(HAVE_SSE) + add_subdirectory(sse) +endif() diff --git a/libcorrect/src/convolutional/bit.c b/libcorrect/src/convolutional/bit.c new file mode 100644 index 0000000..9ac4e1e --- /dev/null +++ b/libcorrect/src/convolutional/bit.c @@ -0,0 +1,232 @@ +#include "correct/convolutional/bit.h" + +bit_writer_t *bit_writer_create(uint8_t *bytes, size_t len) { + bit_writer_t *w = calloc(1, sizeof(bit_writer_t)); + + if (bytes) { + bit_writer_reconfigure(w, bytes, len); + } + + return w; +} + +void bit_writer_reconfigure(bit_writer_t *w, uint8_t *bytes, size_t len) { + w->bytes = bytes; + w->len = len; + + w->current_byte = 0; + w->current_byte_len = 0; + w->byte_index = 0; +} + +void bit_writer_destroy(bit_writer_t *w) { + free(w); +} + +void bit_writer_write(bit_writer_t *w, uint8_t val, unsigned int n) { + for (size_t j = 0; j < n; j++) { + bit_writer_write_1(w, val); + val >>= 1; + } +} + +void bit_writer_write_1(bit_writer_t *w, uint8_t val) { + w->current_byte |= val & 1; + w->current_byte_len++; + + if (w->current_byte_len == 8) { + // 8 bits in a byte -- move to the next byte + w->bytes[w->byte_index] = w->current_byte; + w->byte_index++; + w->current_byte_len = 0; + w->current_byte = 0; + } else { + w->current_byte <<= 1; + } +} + +void bit_writer_write_bitlist(bit_writer_t *w, uint8_t *l, size_t len) { + // first close the current byte + // we might have been given too few elements to do that. be careful. + size_t close_len = 8 - w->current_byte_len; + close_len = (close_len < len) ? close_len : len; + + uint16_t b = w->current_byte; + + for (ptrdiff_t i = 0; i < close_len; i++) { + b |= l[i]; + b <<= 1; + } + + + l += close_len; + len -= close_len; + + uint8_t *bytes = w->bytes; + size_t byte_index = w->byte_index; + + if (w->current_byte_len + close_len == 8) { + b >>= 1; + bytes[byte_index] = b; + byte_index++; + } else { + w->current_byte = b; + w->current_byte_len += close_len; + return; + } + + size_t full_bytes = len/8; + + for (size_t i = 0; i < full_bytes; i++) { + bytes[byte_index] = l[0] << 7 | l[1] << 6 | l[2] << 5 | + l[3] << 4 | l[4] << 3 | l[5] << 2 | + l[6] << 1 | l[7]; + byte_index += 1; + l += 8; + } + + len -= 8*full_bytes; + + b = 0; + for (ptrdiff_t i = 0; i < len; i++) { + b |= l[i]; + b <<= 1; + } + + w->current_byte = b; + w->byte_index = byte_index; + w->current_byte_len = len; +} + +void bit_writer_write_bitlist_reversed(bit_writer_t *w, uint8_t *l, size_t len) { + l = l + len - 1; + + uint8_t *bytes = w->bytes; + size_t byte_index = w->byte_index; + uint16_t b; + + if (w->current_byte_len != 0) { + size_t close_len = 8 - w->current_byte_len; + close_len = (close_len < len) ? close_len : len; + + b = w->current_byte; + + for (ptrdiff_t i = 0; i < close_len; i++) { + b |= *l; + b <<= 1; + l--; + } + + len -= close_len; + + if (w->current_byte_len + close_len == 8) { + b >>= 1; + bytes[byte_index] = b; + byte_index++; + } else { + w->current_byte = b; + w->current_byte_len += close_len; + return; + } + } + + size_t full_bytes = len/8; + + for (size_t i = 0; i < full_bytes; i++) { + bytes[byte_index] = l[0] << 7 | l[-1] << 6 | l[-2] << 5 | + l[-3] << 4 | l[-4] << 3 | l[-5] << 2 | + l[-6] << 1 | l[-7]; + byte_index += 1; + l -= 8; + } + + len -= 8*full_bytes; + + b = 0; + for (ptrdiff_t i = 0; i < len; i++) { + b |= *l; + b <<= 1; + l--; + } + + w->current_byte = (uint8_t)b; + w->byte_index = byte_index; + w->current_byte_len = len; +} + +void bit_writer_flush_byte(bit_writer_t *w) { + if (w->current_byte_len != 0) { + w->current_byte <<= (8 - w->current_byte_len); + w->bytes[w->byte_index] = w->current_byte; + w->byte_index++; + w->current_byte_len = 0; + } +} + +size_t bit_writer_length(bit_writer_t *w) { + return w->byte_index; +} + +uint8_t reverse_byte(uint8_t b) { + return (b & 0x80) >> 7 | (b & 0x40) >> 5 | (b & 0x20) >> 3 | + (b & 0x10) >> 1 | (b & 0x08) << 1 | (b & 0x04) << 3 | + (b & 0x02) << 5 | (b & 0x01) << 7; +} + +static uint8_t reverse_table[256]; + +void create_reverse_table() { + for (uint16_t i = 0; i < 256; i++) { + reverse_table[i] = reverse_byte(i); + } +} + +bit_reader_t *bit_reader_create(const uint8_t *bytes, size_t len) { + bit_reader_t *r = calloc(1, sizeof(bit_reader_t)); + + static bool reverse_table_created = false; + + if (!reverse_table_created) { + create_reverse_table(); + reverse_table_created = true; + } + + if (bytes) { + bit_reader_reconfigure(r, bytes, len); + } + + return r; +} + +void bit_reader_reconfigure(bit_reader_t *r, const uint8_t *bytes, size_t len) { + r->bytes = bytes; + r->len = len; + + r->current_byte_len = 8; + r->current_byte = bytes[0]; + r->byte_index = 0; +} + +void bit_reader_destroy(bit_reader_t *r) { + free(r); +} + +uint8_t bit_reader_read(bit_reader_t *r, unsigned int n) { + unsigned int read = 0; + unsigned int n_copy = n; + + if (r->current_byte_len < n) { + read = r->current_byte & ((1 << r->current_byte_len) - 1); + r->byte_index++; + r->current_byte = r->bytes[r->byte_index]; + n -= r->current_byte_len; + r->current_byte_len = 8; + read <<= n; + } + + uint8_t copy_mask = (1 << n) - 1; + copy_mask <<= (r->current_byte_len - n); + read |= (r->current_byte & copy_mask) >> (r->current_byte_len - n); + r->current_byte_len -= n; + return reverse_table[read] >> (8 - n_copy); +} diff --git a/libcorrect/src/convolutional/convolutional.c b/libcorrect/src/convolutional/convolutional.c new file mode 100644 index 0000000..910ed15 --- /dev/null +++ b/libcorrect/src/convolutional/convolutional.c @@ -0,0 +1,59 @@ +#include "correct/convolutional/convolutional.h" + +// https://www.youtube.com/watch?v=b3_lVSrPB6w + +correct_convolutional *_correct_convolutional_init(correct_convolutional *conv, + size_t rate, size_t order, + const polynomial_t *poly) { + if (order > 8 * sizeof(shift_register_t)) { + // XXX turn this into an error code + // printf("order must be smaller than 8 * sizeof(shift_register_t)\n"); + return NULL; + } + if (rate < 2) { + // XXX turn this into an error code + // printf("rate must be 2 or greater\n"); + return NULL; + } + + conv->order = order; + conv->rate = rate; + conv->numstates = 1 << order; + + unsigned int *table = malloc(sizeof(unsigned int) * (1 << order)); + fill_table(conv->rate, conv->order, poly, table); + *(unsigned int **)&conv->table = table; + + conv->bit_writer = bit_writer_create(NULL, 0); + conv->bit_reader = bit_reader_create(NULL, 0); + + conv->has_init_decode = false; + return conv; +} + +correct_convolutional *correct_convolutional_create(size_t rate, size_t order, + const polynomial_t *poly) { + correct_convolutional *conv = malloc(sizeof(correct_convolutional)); + correct_convolutional *init_conv = _correct_convolutional_init(conv, rate, order, poly); + if (!init_conv) { + free(conv); + } + return init_conv; +} + +void _correct_convolutional_teardown(correct_convolutional *conv) { + free(*(unsigned int **)&conv->table); + bit_writer_destroy(conv->bit_writer); + bit_reader_destroy(conv->bit_reader); + if (conv->has_init_decode) { + pair_lookup_destroy(conv->pair_lookup); + history_buffer_destroy(conv->history_buffer); + error_buffer_destroy(conv->errors); + free(conv->distances); + } +} + +void correct_convolutional_destroy(correct_convolutional *conv) { + _correct_convolutional_teardown(conv); + free(conv); +} diff --git a/libcorrect/src/convolutional/decode.c b/libcorrect/src/convolutional/decode.c new file mode 100644 index 0000000..e8891e0 --- /dev/null +++ b/libcorrect/src/convolutional/decode.c @@ -0,0 +1,321 @@ +#include "correct/convolutional/convolutional.h" + +void conv_decode_print_iter(correct_convolutional *conv, unsigned int iter, + unsigned int winner_index) { + if (iter < 2220) { + return; + } + printf("iteration: %d\n", iter); + distance_t *errors = conv->errors->write_errors; + printf("errors:\n"); + for (shift_register_t i = 0; i < conv->numstates / 2; i++) { + printf("%2d: %d\n", i, errors[i]); + } + printf("\n"); + printf("history:\n"); + for (shift_register_t i = 0; i < conv->numstates / 2; i++) { + printf("%2d: ", i); + for (unsigned int j = 0; j <= winner_index; j++) { + printf("%d", conv->history_buffer->history[j][i] ? 1 : 0); + } + printf("\n"); + } + printf("\n"); +} + +void convolutional_decode_warmup(correct_convolutional *conv, unsigned int sets, + const uint8_t *soft) { + // first phase: load shiftregister up from 0 (order goes from 1 to conv->order) + // we are building up error metrics for the first order bits + for (unsigned int i = 0; i < conv->order - 1 && i < sets; i++) { + // peel off rate bits from encoded to recover the same `out` as in the encoding process + // the difference being that this `out` will have the channel noise/errors applied + unsigned int out; + if (!soft) { + out = bit_reader_read(conv->bit_reader, conv->rate); + } + const distance_t *read_errors = conv->errors->read_errors; + distance_t *write_errors = conv->errors->write_errors; + // walk all of the state we have so far + for (size_t j = 0; j < (1 << (i + 1)); j += 1) { + unsigned int last = j >> 1; + distance_t dist; + if (soft) { + if (conv->soft_measurement == CORRECT_SOFT_LINEAR) { + dist = metric_soft_distance_linear(conv->table[j], soft + i * conv->rate, + conv->rate); + } else { + dist = metric_soft_distance_quadratic(conv->table[j], soft + i * conv->rate, + conv->rate); + } + } else { + dist = metric_distance(conv->table[j], out); + } + write_errors[j] = dist + read_errors[last]; + } + error_buffer_swap(conv->errors); + } +} + +void convolutional_decode_inner(correct_convolutional *conv, unsigned int sets, + const uint8_t *soft) { + shift_register_t highbit = 1 << (conv->order - 1); + for (unsigned int i = conv->order - 1; i < (sets - conv->order + 1); i++) { + distance_t *distances = conv->distances; + // lasterrors are the aggregate bit errors for the states of shiftregister for the previous + // time slice + if (soft) { + if (conv->soft_measurement == CORRECT_SOFT_LINEAR) { + for (unsigned int j = 0; j < 1 << (conv->rate); j++) { + distances[j] = + metric_soft_distance_linear(j, soft + i * conv->rate, conv->rate); + } + } else { + for (unsigned int j = 0; j < 1 << (conv->rate); j++) { + distances[j] = + metric_soft_distance_quadratic(j, soft + i * conv->rate, conv->rate); + } + } + } else { + unsigned int out = bit_reader_read(conv->bit_reader, conv->rate); + for (unsigned int i = 0; i < 1 << (conv->rate); i++) { + distances[i] = metric_distance(i, out); + } + } + pair_lookup_t pair_lookup = conv->pair_lookup; + pair_lookup_fill_distance(pair_lookup, distances); + + // a mask to get the high order bit from the shift register + unsigned int num_iter = highbit << 1; + const distance_t *read_errors = conv->errors->read_errors; + // aggregate bit errors for this time slice + distance_t *write_errors = conv->errors->write_errors; + + uint8_t *history = history_buffer_get_slice(conv->history_buffer); + // walk through all states, ignoring oldest bit + // we will track a best register state (path) and the number of bit errors at that path at + // this time slice + // this loop considers two paths per iteration (high order bit set, clear) + // so, it only runs numstates/2 iterations + // we'll update the history for every state and find the path with the least aggregated bit + // errors + + // now run the main loop + // we calculate 2 sets of 2 register states here (4 states per iter) + // this creates 2 sets which share a predecessor, and 2 sets which share a successor + // + // the first set definition is the two states that are the same except for the least order + // bit + // these two share a predecessor because their high n - 1 bits are the same (differ only by + // newest bit) + // + // the second set definition is the two states that are the same except for the high order + // bit + // these two share a successor because the oldest high order bit will be shifted out, and + // the other bits will be present in the successor + // + shift_register_t highbase = highbit >> 1; + for (shift_register_t low = 0, high = highbit, base = 0; high < num_iter; + low += 8, high += 8, base += 4) { + // shifted-right ancestors + // low and low_plus_one share low_past_error + // note that they are the same when shifted right by 1 + // same goes for high and high_plus_one + for (shift_register_t offset = 0, base_offset = 0; base_offset < 4; + offset += 2, base_offset += 1) { + distance_pair_key_t low_key = pair_lookup.keys[base + base_offset]; + distance_pair_key_t high_key = pair_lookup.keys[highbase + base + base_offset]; + distance_pair_t low_concat_dist = pair_lookup.distances[low_key]; + distance_pair_t high_concat_dist = pair_lookup.distances[high_key]; + + distance_t low_past_error = read_errors[base + base_offset]; + distance_t high_past_error = read_errors[highbase + base + base_offset]; + + distance_t low_error = (low_concat_dist & 0xffff) + low_past_error; + distance_t high_error = (high_concat_dist & 0xffff) + high_past_error; + + shift_register_t successor = low + offset; + distance_t error; + uint8_t history_mask; + if (low_error <= high_error) { + error = low_error; + history_mask = 0; + } else { + error = high_error; + history_mask = 1; + } + write_errors[successor] = error; + history[successor] = history_mask; + + shift_register_t low_plus_one = low + offset + 1; + + distance_t low_plus_one_error = (low_concat_dist >> 16) + low_past_error; + distance_t high_plus_one_error = (high_concat_dist >> 16) + high_past_error; + + shift_register_t plus_one_successor = low_plus_one; + distance_t plus_one_error; + uint8_t plus_one_history_mask; + if (low_plus_one_error <= high_plus_one_error) { + plus_one_error = low_plus_one_error; + plus_one_history_mask = 0; + } else { + plus_one_error = high_plus_one_error; + plus_one_history_mask = 1; + } + write_errors[plus_one_successor] = plus_one_error; + history[plus_one_successor] = plus_one_history_mask; + } + } + + history_buffer_process(conv->history_buffer, write_errors, conv->bit_writer); + error_buffer_swap(conv->errors); + } +} + +void convolutional_decode_tail(correct_convolutional *conv, unsigned int sets, + const uint8_t *soft) { + // flush state registers + // now we only shift in 0s, skipping 1-successors + shift_register_t highbit = 1 << (conv->order - 1); + for (unsigned int i = sets - conv->order + 1; i < sets; i++) { + // lasterrors are the aggregate bit errors for the states of shiftregister for the previous + // time slice + const distance_t *read_errors = conv->errors->read_errors; + // aggregate bit errors for this time slice + distance_t *write_errors = conv->errors->write_errors; + + uint8_t *history = history_buffer_get_slice(conv->history_buffer); + + // calculate the distance from all output states to our sliced bits + distance_t *distances = conv->distances; + if (soft) { + if (conv->soft_measurement == CORRECT_SOFT_LINEAR) { + for (unsigned int j = 0; j < 1 << (conv->rate); j++) { + distances[j] = + metric_soft_distance_linear(j, soft + i * conv->rate, conv->rate); + } + } else { + for (unsigned int j = 0; j < 1 << (conv->rate); j++) { + distances[j] = + metric_soft_distance_quadratic(j, soft + i * conv->rate, conv->rate); + } + } + } else { + unsigned int out = bit_reader_read(conv->bit_reader, conv->rate); + for (unsigned int i = 0; i < 1 << (conv->rate); i++) { + distances[i] = metric_distance(i, out); + } + } + const unsigned int *table = conv->table; + + // a mask to get the high order bit from the shift register + unsigned int num_iter = highbit << 1; + unsigned int skip = 1 << (conv->order - (sets - i)); + unsigned int base_skip = skip >> 1; + + shift_register_t highbase = highbit >> 1; + for (shift_register_t low = 0, high = highbit, base = 0; high < num_iter; + low += skip, high += skip, base += base_skip) { + unsigned int low_output = table[low]; + unsigned int high_output = table[high]; + distance_t low_dist = distances[low_output]; + distance_t high_dist = distances[high_output]; + + distance_t low_past_error = read_errors[base]; + distance_t high_past_error = read_errors[highbase + base]; + + distance_t low_error = low_dist + low_past_error; + distance_t high_error = high_dist + high_past_error; + + shift_register_t successor = low; + distance_t error; + uint8_t history_mask; + if (low_error < high_error) { + error = low_error; + history_mask = 0; + } else { + error = high_error; + history_mask = 1; + } + write_errors[successor] = error; + history[successor] = history_mask; + } + + history_buffer_process_skip(conv->history_buffer, write_errors, conv->bit_writer, skip); + error_buffer_swap(conv->errors); + } +} + +void _convolutional_decode_init(correct_convolutional *conv, unsigned int min_traceback, + unsigned int traceback_length, unsigned int renormalize_interval) { + conv->has_init_decode = true; + + conv->distances = calloc(1 << (conv->rate), sizeof(distance_t)); + conv->pair_lookup = pair_lookup_create(conv->rate, conv->order, conv->table); + + conv->soft_measurement = CORRECT_SOFT_LINEAR; + + // we limit history to go back as far as 5 * the order of our polynomial + conv->history_buffer = history_buffer_create(min_traceback, traceback_length, renormalize_interval, + conv->numstates / 2, 1 << (conv->order - 1)); + + conv->errors = error_buffer_create(conv->numstates); +} + +static ssize_t _convolutional_decode(correct_convolutional *conv, size_t num_encoded_bits, + size_t num_encoded_bytes, uint8_t *msg, + const soft_t *soft_encoded) { + if (!conv->has_init_decode) { + uint64_t max_error_per_input = conv->rate * soft_max; + unsigned int renormalize_interval = distance_max / max_error_per_input; + _convolutional_decode_init(conv, 5 * conv->order, 15 * conv->order, renormalize_interval); + } + + size_t sets = num_encoded_bits / conv->rate; + // XXX fix this vvvvvv + size_t decoded_len_bytes = num_encoded_bytes; + bit_writer_reconfigure(conv->bit_writer, msg, decoded_len_bytes); + + error_buffer_reset(conv->errors); + history_buffer_reset(conv->history_buffer); + + // no outputs are generated during warmup + convolutional_decode_warmup(conv, sets, soft_encoded); + convolutional_decode_inner(conv, sets, soft_encoded); + convolutional_decode_tail(conv, sets, soft_encoded); + + history_buffer_flush(conv->history_buffer, conv->bit_writer); + + return bit_writer_length(conv->bit_writer); +} + +// perform viterbi decoding +// hard decoder +ssize_t correct_convolutional_decode(correct_convolutional *conv, const uint8_t *encoded, + size_t num_encoded_bits, uint8_t *msg) { + if (num_encoded_bits % conv->rate) { + // XXX turn this into an error code + // printf("encoded length of message must be a multiple of rate\n"); + return -1; + } + + size_t num_encoded_bytes = + (num_encoded_bits % 8) ? (num_encoded_bits / 8 + 1) : (num_encoded_bits / 8); + bit_reader_reconfigure(conv->bit_reader, encoded, num_encoded_bytes); + + return _convolutional_decode(conv, num_encoded_bits, num_encoded_bytes, msg, NULL); +} + +ssize_t correct_convolutional_decode_soft(correct_convolutional *conv, const soft_t *encoded, + size_t num_encoded_bits, uint8_t *msg) { + if (num_encoded_bits % conv->rate) { + // XXX turn this into an error code + // printf("encoded length of message must be a multiple of rate\n"); + return -1; + } + + size_t num_encoded_bytes = + (num_encoded_bits % 8) ? (num_encoded_bits / 8 + 1) : (num_encoded_bits / 8); + + return _convolutional_decode(conv, num_encoded_bits, num_encoded_bytes, msg, encoded); +} diff --git a/libcorrect/src/convolutional/encode.c b/libcorrect/src/convolutional/encode.c new file mode 100644 index 0000000..5041262 --- /dev/null +++ b/libcorrect/src/convolutional/encode.c @@ -0,0 +1,61 @@ +#include "correct/convolutional/convolutional.h" + +size_t correct_convolutional_encode_len(correct_convolutional *conv, size_t msg_len) { + size_t msgbits = 8 * msg_len; + size_t encodedbits = conv->rate * (msgbits + conv->order + 1); + return encodedbits; +} + +// shift in most significant bit every time, one byte at a time +// shift register takes most recent bit on right, shifts left +// poly is written in same order, just & mask message w/ poly + +// assume that encoded length is long enough? +size_t correct_convolutional_encode(correct_convolutional *conv, + const uint8_t *msg, + size_t msg_len, + uint8_t *encoded) { + // convolutional code convolves filter coefficients, given by + // the polynomial, with some history from our message. + // the history is stored as single subsequent bits in shiftregister + shift_register_t shiftregister = 0; + + // shiftmask is the shiftregister bit mask that removes bits + // that extend beyond order + // e.g. if order is 7, then remove the 8th bit and beyond + unsigned int shiftmask = (1 << conv->order) - 1; + + size_t encoded_len_bits = correct_convolutional_encode_len(conv, msg_len); + size_t encoded_len = (encoded_len_bits % 8) ? (encoded_len_bits / 8 + 1) : (encoded_len_bits / 8); + bit_writer_reconfigure(conv->bit_writer, encoded, encoded_len); + + bit_reader_reconfigure(conv->bit_reader, msg, msg_len); + + for (size_t i = 0; i < 8 * msg_len; i++) { + // shiftregister has oldest bits on left, newest on right + shiftregister <<= 1; + shiftregister |= bit_reader_read(conv->bit_reader, 1); + shiftregister &= shiftmask; + // shift most significant bit from byte and move down one bit at a time + + // we do direct lookup of our convolutional output here + // all of the bits from this convolution are stored in this row + unsigned int out = conv->table[shiftregister]; + bit_writer_write(conv->bit_writer, out, conv->rate); + } + + // now flush the shiftregister + // this is simply running the loop as above but without any new inputs + // or rather, the new input string is all 0s + for (size_t i = 0; i < conv->order + 1; i++) { + shiftregister <<= 1; + shiftregister &= shiftmask; + unsigned int out = conv->table[shiftregister]; + bit_writer_write(conv->bit_writer, out, conv->rate); + } + + // 0-fill any remaining bits on our final byte + bit_writer_flush_byte(conv->bit_writer); + + return encoded_len_bits; +} diff --git a/libcorrect/src/convolutional/error_buffer.c b/libcorrect/src/convolutional/error_buffer.c new file mode 100644 index 0000000..a5fc0ab --- /dev/null +++ b/libcorrect/src/convolutional/error_buffer.c @@ -0,0 +1,43 @@ +#include "correct/convolutional/error_buffer.h" + +error_buffer_t *error_buffer_create(unsigned int num_states) { + error_buffer_t *buf = calloc(1, sizeof(error_buffer_t)); + + // how large are the error buffers? + buf->num_states = num_states; + + // save two error metrics, one for last round and one for this + // (double buffer) + // the error metric is the aggregated number of bit errors found + // at a given path which terminates at a particular shift register state + buf->errors[0] = calloc(sizeof(distance_t), num_states); + buf->errors[1] = calloc(sizeof(distance_t), num_states); + + // which buffer are we using, 0 or 1? + buf->index = 0; + + buf->read_errors = buf->errors[0]; + buf->write_errors = buf->errors[1]; + + return buf; +} + +void error_buffer_destroy(error_buffer_t *buf) { + free(buf->errors[0]); + free(buf->errors[1]); + free(buf); +} + +void error_buffer_reset(error_buffer_t *buf) { + memset(buf->errors[0], 0, buf->num_states * sizeof(distance_t)); + memset(buf->errors[1], 0, buf->num_states * sizeof(distance_t)); + buf->index = 0; + buf->read_errors = buf->errors[0]; + buf->write_errors = buf->errors[1]; +} + +void error_buffer_swap(error_buffer_t *buf) { + buf->read_errors = buf->errors[buf->index]; + buf->index = (buf->index + 1) % 2; + buf->write_errors = buf->errors[buf->index]; +} diff --git a/libcorrect/src/convolutional/history_buffer.c b/libcorrect/src/convolutional/history_buffer.c new file mode 100644 index 0000000..f54ffdd --- /dev/null +++ b/libcorrect/src/convolutional/history_buffer.c @@ -0,0 +1,158 @@ +#include "correct/convolutional/history_buffer.h" + +history_buffer *history_buffer_create(unsigned int min_traceback_length, + unsigned int traceback_group_length, + unsigned int renormalize_interval, unsigned int num_states, + shift_register_t highbit) { + history_buffer *buf = calloc(1, sizeof(history_buffer)); + + *(unsigned int *)&buf->min_traceback_length = min_traceback_length; + *(unsigned int *)&buf->traceback_group_length = traceback_group_length; + *(unsigned int *)&buf->cap = min_traceback_length + traceback_group_length; + *(unsigned int *)&buf->num_states = num_states; + *(shift_register_t *)&buf->highbit = highbit; + + buf->history = malloc(buf->cap * sizeof(uint8_t *)); + for (unsigned int i = 0; i < buf->cap; i++) { + buf->history[i] = calloc(num_states, sizeof(uint8_t)); + } + buf->fetched = malloc(buf->cap * sizeof(uint8_t)); + + buf->index = 0; + buf->len = 0; + + buf->renormalize_counter = 0; + buf->renormalize_interval = renormalize_interval; + + return buf; +} + +void history_buffer_destroy(history_buffer *buf) { + for (unsigned int i = 0; i < buf->cap; i++) { + free(buf->history[i]); + } + free(buf->history); + free(buf->fetched); + free(buf); +} + +void history_buffer_reset(history_buffer *buf) { + buf->len = 0; + buf->index = 0; +} + +uint8_t *history_buffer_get_slice(history_buffer *buf) { return buf->history[buf->index]; } + +shift_register_t history_buffer_search(history_buffer *buf, const distance_t *distances, + unsigned int search_every) { + shift_register_t bestpath; + distance_t leasterror = USHRT_MAX; + // search for a state with the least error + for (shift_register_t state = 0; state < buf->num_states; state += search_every) { + if (distances[state] < leasterror) { + leasterror = distances[state]; + bestpath = state; + } + } + return bestpath; +} + +void history_buffer_renormalize(history_buffer *buf, distance_t *distances, + shift_register_t min_register) { + distance_t min_distance = distances[min_register]; + for (shift_register_t i = 0; i < buf->num_states; i++) { + distances[i] -= min_distance; + } +} + +void history_buffer_traceback(history_buffer *buf, shift_register_t bestpath, + unsigned int min_traceback_length, bit_writer_t *output) { + unsigned int fetched_index = 0; + shift_register_t highbit = buf->highbit; + unsigned int index = buf->index; + unsigned int cap = buf->cap; + for (unsigned int j = 0; j < min_traceback_length; j++) { + if (index == 0) { + index = cap - 1; + } else { + index--; + } + // we're walking backwards from what the work we did before + // so, we'll shift high order bits in + // the path will cross multiple different shift register states, and we determine + // which state by going backwards one time slice at a time + uint8_t history = buf->history[index][bestpath]; + shift_register_t pathbit = history ? highbit : 0; + bestpath |= pathbit; + bestpath >>= 1; + } + unsigned int prefetch_index = index; + if (prefetch_index == 0) { + prefetch_index = cap - 1; + } else { + prefetch_index--; + } + unsigned int len = buf->len; + for (unsigned int j = min_traceback_length; j < len; j++) { + index = prefetch_index; + if (prefetch_index == 0) { + prefetch_index = cap - 1; + } else { + prefetch_index--; + } + prefetch(buf->history[prefetch_index]); + // we're walking backwards from what the work we did before + // so, we'll shift high order bits in + // the path will cross multiple different shift register states, and we determine + // which state by going backwards one time slice at a time + uint8_t history = buf->history[index][bestpath]; + shift_register_t pathbit = history ? highbit : 0; + bestpath |= pathbit; + bestpath >>= 1; + buf->fetched[fetched_index] = (pathbit ? 1 : 0); + fetched_index++; + } + bit_writer_write_bitlist_reversed(output, buf->fetched, fetched_index); + buf->len -= fetched_index; +} + +void history_buffer_process_skip(history_buffer *buf, distance_t *distances, bit_writer_t *output, + unsigned int skip) { + buf->index++; + if (buf->index == buf->cap) { + buf->index = 0; + } + + buf->renormalize_counter++; + buf->len++; + + // there are four ways these branches can resolve + // a) we are neither renormalizing nor doing a traceback + // b) we are renormalizing but not doing a traceback + // c) we are renormalizing and doing a traceback + // d) we are not renormalizing but we are doing a traceback + // in case c, we want to save the effort of finding the bestpath + // since that's expensive + // so we have to check for that case after we renormalize + if (buf->renormalize_counter == buf->renormalize_interval) { + buf->renormalize_counter = 0; + shift_register_t bestpath = history_buffer_search(buf, distances, skip); + history_buffer_renormalize(buf, distances, bestpath); + if (buf->len == buf->cap) { + // reuse the bestpath found for renormalizing + history_buffer_traceback(buf, bestpath, buf->min_traceback_length, output); + } + } else if (buf->len == buf->cap) { + // not renormalizing, find the bestpath here + shift_register_t bestpath = history_buffer_search(buf, distances, skip); + history_buffer_traceback(buf, bestpath, buf->min_traceback_length, output); + } +} + +void history_buffer_process(history_buffer *buf, distance_t *distances, bit_writer_t *output) { + history_buffer_process_skip(buf, distances, output, 1); +} + +void history_buffer_flush(history_buffer *buf, bit_writer_t *output) { + history_buffer_traceback(buf, 0, 0, output); +} diff --git a/libcorrect/src/convolutional/lookup.c b/libcorrect/src/convolutional/lookup.c new file mode 100644 index 0000000..8c96aae --- /dev/null +++ b/libcorrect/src/convolutional/lookup.c @@ -0,0 +1,74 @@ +#include "correct/convolutional/lookup.h" + +// table has numstates rows +// each row contains all of the polynomial output bits concatenated together +// e.g. for rate 2, we have 2 bits in each row +// the first poly gets the LEAST significant bit, last poly gets most significant +void fill_table(unsigned int rate, + unsigned int order, + const polynomial_t *poly, + unsigned int *table) { + for (shift_register_t i = 0; i < 1 << order; i++) { + unsigned int out = 0; + unsigned int mask = 1; + for (size_t j = 0; j < rate; j++) { + out |= (popcount(i & poly[j]) % 2) ? mask : 0; + mask <<= 1; + } + table[i] = out; + } +} + +pair_lookup_t pair_lookup_create(unsigned int rate, + unsigned int order, + const unsigned int *table) { + pair_lookup_t pairs; + + pairs.keys = malloc(sizeof(unsigned int) * (1 << (order - 1))); + pairs.outputs = calloc((1 << (rate * 2)), sizeof(unsigned int)); + unsigned int *inv_outputs = calloc((1 << (rate * 2)), sizeof(unsigned int)); + unsigned int output_counter = 1; + // for every (even-numbered) shift register state, find the concatenated output of the state + // and the subsequent state that follows it (low bit set). then, check to see if this + // concatenated output has a unique key assigned to it already. if not, give it a key. + // if it does, retrieve the key. assign this key to the shift register state. + for (unsigned int i = 0; i < (1 << (order - 1)); i++) { + // first get the concatenated pair of outputs + unsigned int out = table[i * 2 + 1]; + out <<= rate; + out |= table[i * 2]; + + // does this concatenated output exist in the outputs table yet? + if (!inv_outputs[out]) { + // doesn't exist, allocate a new key + inv_outputs[out] = output_counter; + pairs.outputs[output_counter] = out; + output_counter++; + } + // set the opaque key for the ith shift register state to the concatenated output entry + pairs.keys[i] = inv_outputs[out]; + } + pairs.outputs_len = output_counter; + pairs.output_mask = (1 << (rate)) - 1; + pairs.output_width = rate; + pairs.distances = calloc(pairs.outputs_len, sizeof(distance_pair_t)); + free(inv_outputs); + return pairs; +} + +void pair_lookup_destroy(pair_lookup_t pairs) { + free(pairs.keys); + free(pairs.outputs); + free(pairs.distances); +} + +void pair_lookup_fill_distance(pair_lookup_t pairs, distance_t *distances) { + for (unsigned int i = 1; i < pairs.outputs_len; i += 1) { + output_pair_t concat_out = pairs.outputs[i]; + unsigned int i_0 = concat_out & pairs.output_mask; + concat_out >>= pairs.output_width; + unsigned int i_1 = concat_out; + + pairs.distances[i] = (distances[i_1] << 16) | distances[i_0]; + } +} diff --git a/libcorrect/src/convolutional/metric.c b/libcorrect/src/convolutional/metric.c new file mode 100644 index 0000000..894db4d --- /dev/null +++ b/libcorrect/src/convolutional/metric.c @@ -0,0 +1,17 @@ +#include "correct/convolutional/metric.h" + +// measure the square of the euclidean distance between x and y +// since euclidean dist is sqrt(a^2 + b^2 + ... + n^2), the square is just +// a^2 + b^2 + ... + n^2 +distance_t metric_soft_distance_quadratic(unsigned int hard_x, const uint8_t *soft_y, size_t len) { + distance_t dist = 0; + for (unsigned int i = 0; i < len; i++) { + // first, convert hard_x to a soft measurement (0 -> 0, 1 - > 255) + unsigned int soft_x = (hard_x & 1) ? 255 : 0; + hard_x >>= 1; + int d = soft_y[i] - soft_x; + dist += d*d; + } + return dist >> 3; +} + diff --git a/libcorrect/src/convolutional/sse/CMakeLists.txt b/libcorrect/src/convolutional/sse/CMakeLists.txt new file mode 100644 index 0000000..0d0ade9 --- /dev/null +++ b/libcorrect/src/convolutional/sse/CMakeLists.txt @@ -0,0 +1,2 @@ +set(SRCFILES lookup.c convolutional.c encode.c decode.c) +add_library(correct-convolutional-sse OBJECT ${SRCFILES}) diff --git a/libcorrect/src/convolutional/sse/convolutional.c b/libcorrect/src/convolutional/sse/convolutional.c new file mode 100644 index 0000000..484c5c6 --- /dev/null +++ b/libcorrect/src/convolutional/sse/convolutional.c @@ -0,0 +1,21 @@ +#include "correct/convolutional/sse/convolutional.h" + +correct_convolutional_sse *correct_convolutional_sse_create(size_t rate, + size_t order, + const polynomial_t *poly) { + correct_convolutional_sse *conv = malloc(sizeof(correct_convolutional_sse)); + correct_convolutional *init_conv = _correct_convolutional_init(&conv->base_conv, rate, order, poly); + if (!init_conv) { + free(conv); + conv = NULL; + } + return conv; +} + +void correct_convolutional_sse_destroy(correct_convolutional_sse *conv) { + if (conv->base_conv.has_init_decode) { + oct_lookup_destroy(conv->oct_lookup); + } + _correct_convolutional_teardown(&conv->base_conv); + free(conv); +} diff --git a/libcorrect/src/convolutional/sse/decode.c b/libcorrect/src/convolutional/sse/decode.c new file mode 100644 index 0000000..0f6bcf5 --- /dev/null +++ b/libcorrect/src/convolutional/sse/decode.c @@ -0,0 +1,319 @@ +#include "correct/convolutional/sse/convolutional.h" + +static void convolutional_sse_decode_inner(correct_convolutional_sse *sse_conv, unsigned int sets, + const uint8_t *soft) { + correct_convolutional *conv = &sse_conv->base_conv; + shift_register_t highbit = 1 << (conv->order - 1); + unsigned int hist_buf_index = conv->history_buffer->index; + unsigned int hist_buf_cap = conv->history_buffer->cap; + unsigned int hist_buf_len = conv->history_buffer->len; + unsigned int hist_buf_rn_int = conv->history_buffer->renormalize_interval; + unsigned int hist_buf_rn_cnt = conv->history_buffer->renormalize_counter; + for (unsigned int i = conv->order - 1; i < (sets - conv->order + 1); i++) { + distance_t *distances = conv->distances; + // lasterrors are the aggregate bit errors for the states of + // shiftregister for the previous time slice + if (soft) { + if (conv->soft_measurement == CORRECT_SOFT_LINEAR) { + for (unsigned int j = 0; j < 1 << (conv->rate); j++) { + distances[j] = + metric_soft_distance_linear(j, soft + i * conv->rate, conv->rate); + } + } else { + for (unsigned int j = 0; j < 1 << (conv->rate); j++) { + distances[j] = + metric_soft_distance_quadratic(j, soft + i * conv->rate, conv->rate); + } + } + } else { + unsigned int out = bit_reader_read(conv->bit_reader, conv->rate); + for (unsigned int i = 0; i < 1 << (conv->rate); i++) { + distances[i] = metric_distance(i, out); + } + } + oct_lookup_t oct_lookup = sse_conv->oct_lookup; + oct_lookup_fill_distance(oct_lookup, distances); + + // a mask to get the high order bit from the shift register + unsigned int num_iter = highbit << 1; + const distance_t *read_errors = conv->errors->read_errors; + // aggregate bit errors for this time slice + distance_t *write_errors = conv->errors->write_errors; + + uint8_t *history = conv->history_buffer->history[hist_buf_index]; + ; + // walk through all states, ignoring oldest bit + // we will track a best register state (path) and the number of bit + // errors at that path at this time slice + // this loop considers two paths per iteration (high order bit set, + // clear) + // so, it only runs numstates/2 iterations + // we'll update the history for every state and find the path with the + // least aggregated bit errors + + // now run the main loop + // we calculate 2 sets of 2 register states here (4 states per iter) + // this creates 2 sets which share a predecessor, and 2 sets which share + // a successor + // + // the first set definition is the two states that are the same except + // for the least order bit + // these two share a predecessor because their high n - 1 bits are the + // same (differ only by newest bit) + // + // the second set definition is the two states that are the same except + // for the high order bit + // these two share a successor because the oldest high order bit will be + // shifted out, and the other bits will be present in the successor + // + shift_register_t highbase = highbit >> 1; + shift_register_t oct_highbase = highbase >> 2; + for (shift_register_t low = 0, high = highbit, base = 0, oct = 0; high < num_iter; + low += 32, high += 32, base += 16, oct += 4) { + // shifted-right ancestors + // low and low_plus_one share low_past_error + // note that they are the same when shifted right by 1 + // same goes for high and high_plus_one + __m128i past_shuffle_mask = + _mm_set_epi32(0x07060706, 0x05040504, 0x03020302, 0x01000100); + __m128i hist_mask = + _mm_set_epi32(0x80808080, 0x80808080, 0x0e0c0a09, 0x07050301); + + // the loop below calculates 64 register states per loop iteration + // it does this by packing the 128-bit xmm registers with 8, 16-bit + // distances + // 4 of these registers hold distances for convolutional shift + // register states with the high bit cleared + // and 4 hold distances for the corresponding shift register + // states with the high bit set + // since each xmm register holds 8 distances, this adds up to a + // total of 8 * 8 = 64 shift register states + for (shift_register_t offset = 0, base_offset = 0; base_offset < 16; + offset += 32, base_offset += 16) { + // load the past error for the register states with the high + // order bit cleared + __m128i low_past_error = + _mm_loadl_epi64((const __m128i *)(read_errors + base + base_offset)); + __m128i low_past_error0 = + _mm_loadl_epi64((const __m128i *)(read_errors + base + base_offset + 4)); + __m128i low_past_error1 = + _mm_loadl_epi64((const __m128i *)(read_errors + base + base_offset + 8)); + __m128i low_past_error2 = + _mm_loadl_epi64((const __m128i *)(read_errors + base + base_offset + 12)); + + // shuffle the low past error + // register states that differ only by their low order bit share + // a past error + low_past_error = _mm_shuffle_epi8(low_past_error, past_shuffle_mask); + low_past_error0 = _mm_shuffle_epi8(low_past_error0, past_shuffle_mask); + low_past_error1 = _mm_shuffle_epi8(low_past_error1, past_shuffle_mask); + low_past_error2 = _mm_shuffle_epi8(low_past_error2, past_shuffle_mask); + + // repeat past error lookup for register states with high order + // bit set + __m128i high_past_error = + _mm_loadl_epi64((const __m128i *)(read_errors + highbase + base + base_offset)); + __m128i high_past_error0 = _mm_loadl_epi64( + (const __m128i *)(read_errors + highbase + base + base_offset + 4)); + __m128i high_past_error1 = _mm_loadl_epi64( + (const __m128i *)(read_errors + highbase + base + base_offset + 8)); + __m128i high_past_error2 = _mm_loadl_epi64( + (const __m128i *)(read_errors + highbase + base + base_offset + 12)); + + high_past_error = _mm_shuffle_epi8(high_past_error, past_shuffle_mask); + high_past_error0 = _mm_shuffle_epi8(high_past_error0, past_shuffle_mask); + high_past_error1 = _mm_shuffle_epi8(high_past_error1, past_shuffle_mask); + high_past_error2 = _mm_shuffle_epi8(high_past_error2, past_shuffle_mask); + + // __m128i this_shuffle_mask = (__m128i){0x80800100, 0x80800302, + // 0x80800504, 0x80800706}; + + // load the opaque oct distance table keys from out loop index + distance_oct_key_t low_key = oct_lookup.keys[oct + (base_offset / 4)]; + distance_oct_key_t low_key0 = oct_lookup.keys[oct + (base_offset / 4) + 1]; + distance_oct_key_t low_key1 = oct_lookup.keys[oct + (base_offset / 4) + 2]; + distance_oct_key_t low_key2 = oct_lookup.keys[oct + (base_offset / 4) + 3]; + + // load the distances for the register states with high order + // bit cleared + __m128i low_this_error = + _mm_load_si128((const __m128i *)(oct_lookup.distances + low_key)); + __m128i low_this_error0 = + _mm_load_si128((const __m128i *)(oct_lookup.distances + low_key0)); + __m128i low_this_error1 = + _mm_load_si128((const __m128i *)(oct_lookup.distances + low_key1)); + __m128i low_this_error2 = + _mm_load_si128((const __m128i *)(oct_lookup.distances + low_key2)); + + // add the distance for this time slice to the past distances + __m128i low_error = _mm_add_epi16(low_past_error, low_this_error); + __m128i low_error0 = _mm_add_epi16(low_past_error0, low_this_error0); + __m128i low_error1 = _mm_add_epi16(low_past_error1, low_this_error1); + __m128i low_error2 = _mm_add_epi16(low_past_error2, low_this_error2); + + // repeat oct distance table lookup for registers with high + // order bit set + distance_oct_key_t high_key = + oct_lookup.keys[oct_highbase + oct + (base_offset / 4)]; + distance_oct_key_t high_key0 = + oct_lookup.keys[oct_highbase + oct + (base_offset / 4) + 1]; + distance_oct_key_t high_key1 = + oct_lookup.keys[oct_highbase + oct + (base_offset / 4) + 2]; + distance_oct_key_t high_key2 = + oct_lookup.keys[oct_highbase + oct + (base_offset / 4) + 3]; + + __m128i high_this_error = + _mm_load_si128((const __m128i *)(oct_lookup.distances + high_key)); + __m128i high_this_error0 = + _mm_load_si128((const __m128i *)(oct_lookup.distances + high_key0)); + __m128i high_this_error1 = + _mm_load_si128((const __m128i *)(oct_lookup.distances + high_key1)); + __m128i high_this_error2 = + _mm_load_si128((const __m128i *)(oct_lookup.distances + high_key2)); + + __m128i high_error = _mm_add_epi16(high_past_error, high_this_error); + __m128i high_error0 = _mm_add_epi16(high_past_error0, high_this_error0); + __m128i high_error1 = _mm_add_epi16(high_past_error1, high_this_error1); + __m128i high_error2 = _mm_add_epi16(high_past_error2, high_this_error2); + + // distances for this time slice calculated + + // find the least error between registers who differ only in + // their high order bit + __m128i min_error = _mm_min_epu16(low_error, high_error); + __m128i min_error0 = _mm_min_epu16(low_error0, high_error0); + __m128i min_error1 = _mm_min_epu16(low_error1, high_error1); + __m128i min_error2 = _mm_min_epu16(low_error2, high_error2); + + _mm_store_si128((__m128i *)(write_errors + low + offset), min_error); + _mm_store_si128((__m128i *)(write_errors + low + offset + 8), min_error0); + _mm_store_si128((__m128i *)(write_errors + low + offset + 16), min_error1); + _mm_store_si128((__m128i *)(write_errors + low + offset + 24), min_error2); + + // generate history bits as (low_error > least_error) + // this operation fills each element with all 1s if true and 0s + // if false + // in other words, we set the history bit to 1 if + // the register state with high order bit set was the least + // error + __m128i hist = _mm_cmpgt_epi16(low_error, min_error); + // pack the bits down from 16-bit wide to 8-bit wide to + // accomodate history table + hist = _mm_shuffle_epi8(hist, hist_mask); + + __m128i hist0 = _mm_cmpgt_epi16(low_error0, min_error0); + hist0 = _mm_shuffle_epi8(hist0, hist_mask); + + __m128i hist1 = _mm_cmpgt_epi16(low_error1, min_error1); + hist1 = _mm_shuffle_epi8(hist1, hist_mask); + + __m128i hist2 = _mm_cmpgt_epi16(low_error2, min_error2); + hist2 = _mm_shuffle_epi8(hist2, hist_mask); + + // write the least error so that the next time slice sees it as + // the past error + // store the history bits set by cmp and shuffle operations + _mm_storel_epi64((__m128i *)(history + low + offset), hist); + _mm_storel_epi64((__m128i *)(history + low + offset + 8), hist0); + _mm_storel_epi64((__m128i *)(history + low + offset + 16), hist1); + _mm_storel_epi64((__m128i *)(history + low + offset + 24), hist2); + } + } + + // bypass the call to history buffer + // we should really make that function inline and remove this below + if (hist_buf_len == hist_buf_cap - 1 || hist_buf_rn_cnt == hist_buf_rn_int - 1) { + // restore hist buffer state and invoke it + conv->history_buffer->len = hist_buf_len; + conv->history_buffer->index = hist_buf_index; + conv->history_buffer->renormalize_counter = hist_buf_rn_cnt; + history_buffer_process(conv->history_buffer, write_errors, conv->bit_writer); + // restore our local values + hist_buf_len = conv->history_buffer->len; + hist_buf_index = conv->history_buffer->index; + hist_buf_cap = conv->history_buffer->cap; + hist_buf_rn_cnt = conv->history_buffer->renormalize_counter; + } else { + hist_buf_len++; + hist_buf_index++; + if (hist_buf_index == hist_buf_cap) { + hist_buf_index = 0; + } + hist_buf_rn_cnt++; + } + error_buffer_swap(conv->errors); + } + conv->history_buffer->len = hist_buf_len; + conv->history_buffer->index = hist_buf_index; + conv->history_buffer->renormalize_counter = hist_buf_rn_cnt; +} + +static void _convolutional_sse_decode_init(correct_convolutional_sse *conv, + unsigned int min_traceback, + unsigned int traceback_length, + unsigned int renormalize_interval) { + _convolutional_decode_init(&conv->base_conv, min_traceback, traceback_length, + renormalize_interval); + conv->oct_lookup = + oct_lookup_create(conv->base_conv.rate, conv->base_conv.order, conv->base_conv.table); +} + +static ssize_t _convolutional_sse_decode(correct_convolutional_sse *sse_conv, + size_t num_encoded_bits, size_t num_encoded_bytes, + uint8_t *msg, const soft_t *soft_encoded) { + correct_convolutional *conv = &sse_conv->base_conv; + if (!conv->has_init_decode) { + uint64_t max_error_per_input = conv->rate * soft_max; + // sse implementation unfortunately uses signed math on our unsigned values + // reduces usable distance by /2 + unsigned int renormalize_interval = (distance_max / 2) / max_error_per_input; + _convolutional_sse_decode_init(sse_conv, 5 * conv->order, 100 * conv->order, + renormalize_interval); + } + + size_t sets = num_encoded_bits / conv->rate; + // XXX fix this vvvvvv + size_t decoded_len_bytes = num_encoded_bytes; + bit_writer_reconfigure(conv->bit_writer, msg, decoded_len_bytes); + + error_buffer_reset(conv->errors); + history_buffer_reset(conv->history_buffer); + + // no outputs are generated during warmup + convolutional_decode_warmup(conv, sets, soft_encoded); + convolutional_sse_decode_inner(sse_conv, sets, soft_encoded); + convolutional_decode_tail(conv, sets, soft_encoded); + + history_buffer_flush(conv->history_buffer, conv->bit_writer); + + return bit_writer_length(conv->bit_writer); +} + +ssize_t correct_convolutional_sse_decode(correct_convolutional_sse *conv, const uint8_t *encoded, + size_t num_encoded_bits, uint8_t *msg) { + if (num_encoded_bits % conv->base_conv.rate) { + // XXX turn this into an error code + // printf("encoded length of message must be a multiple of rate\n"); + return -1; + } + + size_t num_encoded_bytes = + (num_encoded_bits % 8) ? (num_encoded_bits / 8 + 1) : (num_encoded_bits / 8); + bit_reader_reconfigure(conv->base_conv.bit_reader, encoded, num_encoded_bytes); + + return _convolutional_sse_decode(conv, num_encoded_bits, num_encoded_bytes, msg, NULL); +} + +ssize_t correct_convolutional_sse_decode_soft(correct_convolutional_sse *conv, const soft_t *encoded, + size_t num_encoded_bits, uint8_t *msg) { + if (num_encoded_bits % conv->base_conv.rate) { + // XXX turn this into an error code + // printf("encoded length of message must be a multiple of rate\n"); + return -1; + } + + size_t num_encoded_bytes = + (num_encoded_bits % 8) ? (num_encoded_bits / 8 + 1) : (num_encoded_bits / 8); + + return _convolutional_sse_decode(conv, num_encoded_bits, num_encoded_bytes, msg, encoded); +} diff --git a/libcorrect/src/convolutional/sse/encode.c b/libcorrect/src/convolutional/sse/encode.c new file mode 100644 index 0000000..92ea10d --- /dev/null +++ b/libcorrect/src/convolutional/sse/encode.c @@ -0,0 +1,9 @@ +#include "correct/convolutional/sse/convolutional.h" + +size_t correct_convolutional_sse_encode_len(correct_convolutional_sse *conv, size_t msg_len) { + return correct_convolutional_encode_len(&conv->base_conv, msg_len); +} + +size_t correct_convolutional_sse_encode(correct_convolutional_sse *conv, const uint8_t *msg, size_t msg_len, uint8_t *encoded) { + return correct_convolutional_encode(&conv->base_conv, msg, msg_len, encoded); +} diff --git a/libcorrect/src/convolutional/sse/lookup.c b/libcorrect/src/convolutional/sse/lookup.c new file mode 100644 index 0000000..472dd8f --- /dev/null +++ b/libcorrect/src/convolutional/sse/lookup.c @@ -0,0 +1,183 @@ +#include "correct/convolutional/sse/lookup.h" + +quad_lookup_t quad_lookup_create(unsigned int rate, + unsigned int order, + const unsigned int *table) { + quad_lookup_t quads; + + quads.keys = malloc(sizeof(unsigned int) * (1 << (order - 2))); + quads.outputs = calloc((1 << (rate * 4)), sizeof(unsigned int)); + unsigned int *inv_outputs = calloc((1 << (rate * 4)), sizeof(unsigned int)); + unsigned int output_counter = 1; + // for every (even-numbered) shift register state, find the concatenated output of the state + // and the subsequent state that follows it (low bit set). then, check to see if this + // concatenated output has a unique key assigned to it already. if not, give it a key. + // if it does, retrieve the key. assign this key to the shift register state. + for (unsigned int i = 0; i < (1 << (order - 2)); i++) { + // first get the concatenated quad of outputs + unsigned int out = table[i * 4 + 3]; + out <<= rate; + out |= table[i * 4 + 2]; + out <<= rate; + out |= table[i * 4 + 1]; + out <<= rate; + out |= table[i * 4]; + + // does this concatenated output exist in the outputs table yet? + if (!inv_outputs[out]) { + // doesn't exist, allocate a new key + inv_outputs[out] = output_counter; + quads.outputs[output_counter] = out; + output_counter++; + } + // set the opaque key for the ith shift register state to the concatenated output entry + quads.keys[i] = inv_outputs[out]; + } + quads.outputs_len = output_counter; + quads.output_mask = (1 << (rate)) - 1; + quads.output_width = rate; + quads.distances = calloc(quads.outputs_len, sizeof(distance_quad_t)); + free(inv_outputs); + return quads; +} + +void quad_lookup_destroy(quad_lookup_t quads) { + free(quads.keys); + free(quads.outputs); + free(quads.distances); +} + +void quad_lookup_fill_distance(quad_lookup_t quads, distance_t *distances) { + for (unsigned int i = 1; i < quads.outputs_len; i += 1) { + output_quad_t concat_out = quads.outputs[i]; + unsigned int i_0 = concat_out & quads.output_mask; + concat_out >>= quads.output_width; + unsigned int i_1 = concat_out & quads.output_mask; + concat_out >>= quads.output_width; + unsigned int i_2 = concat_out & quads.output_mask; + concat_out >>= quads.output_width; + unsigned int i_3 = concat_out; + + quads.distances[i] = ((uint64_t)distances[i_3] << 48) | ((uint64_t)distances[i_2] << 32) | (distances[i_1] << 16) | distances[i_0]; + } +} + +distance_oct_key_t oct_lookup_find_key(output_oct_t *outputs, output_oct_t out, size_t num_keys) { + for (size_t i = 1; i < num_keys; i++) { + if (outputs[i] == out) { + return i; + } + } + return 0; +} + +oct_lookup_t oct_lookup_create(unsigned int rate, + unsigned int order, + const unsigned int *table) { + oct_lookup_t octs; + + octs.keys = malloc((1 << (order - 3)) * sizeof(distance_oct_key_t)); + octs.outputs = malloc(((output_oct_t)2 << rate) * sizeof(uint64_t)); + output_oct_t *short_outs = calloc(((output_oct_t)2 << rate), sizeof(output_oct_t)); + size_t outputs_len = 2 << rate; + unsigned int output_counter = 1; + // for every (even-numbered) shift register state, find the concatenated output of the state + // and the subsequent state that follows it (low bit set). then, check to see if this + // concatenated output has a unique key assigned to it already. if not, give it a key. + // if it does, retrieve the key. assign this key to the shift register state. + for (shift_register_t i = 0; i < (1 << (order - 3)); i++) { + // first get the concatenated oct of outputs + output_oct_t out = table[i * 8 + 7]; + out <<= rate; + out |= table[i * 8 + 6]; + out <<= rate; + out |= table[i * 8 + 5]; + out <<= rate; + out |= table[i * 8 + 4]; + out <<= rate; + out |= table[i * 8 + 3]; + out <<= rate; + out |= table[i * 8 + 2]; + out <<= rate; + out |= table[i * 8 + 1]; + out <<= rate; + out |= table[i * 8]; + + distance_oct_key_t key = oct_lookup_find_key(short_outs, out, output_counter); + // does this concatenated output exist in the outputs table yet? + if (!key) { + // doesn't exist, allocate a new key + // now build it in expanded form + output_oct_t expanded_out = table[i * 8 + 7]; + expanded_out <<= 8; + expanded_out |= table[i * 8 + 6]; + expanded_out <<= 8; + expanded_out |= table[i * 8 + 5]; + expanded_out <<= 8; + expanded_out |= table[i * 8 + 4]; + expanded_out <<= 8; + expanded_out |= table[i * 8 + 3]; + expanded_out <<= 8; + expanded_out |= table[i * 8 + 2]; + expanded_out <<= 8; + expanded_out |= table[i * 8 + 1]; + expanded_out <<= 8; + expanded_out |= table[i * 8]; + + if (output_counter == outputs_len) { + octs.outputs = realloc(octs.outputs, outputs_len * 2 * sizeof(output_oct_t)); + short_outs = realloc(short_outs, outputs_len * 2 * sizeof(output_oct_t)); + outputs_len *= 2; + } + short_outs[output_counter] = out; + octs.outputs[output_counter] = expanded_out; + key = output_counter; + output_counter++; + } + // set the opaque key for the ith shift register state to the concatenated output entry + // we multiply the key by 2 since the distances are strided by 2 + octs.keys[i] = key * 2; + } + free(short_outs); + octs.outputs_len = output_counter; + octs.output_mask = (1 << (rate)) - 1; + octs.output_width = rate; + octs.distances = malloc(octs.outputs_len * 2 * sizeof(uint64_t)); + return octs; +} + +void oct_lookup_destroy(oct_lookup_t octs) { + free(octs.keys); + free(octs.outputs); + free(octs.distances); +} + +// WIP: sse approach to filling the distance table +/* +void oct_lookup_fill_distance_sse(oct_lookup_t octs, distance_t *distances) { + distance_pair_t *distance_pair = (distance_pair_t*)octs.distances; + __v4si index_shuffle_mask = (__v4si){0xffffff00, 0xffffff01, 0xffffff02, 0xffffff03}; + __m256i dist_shuffle_mask = (__m256i){0x01000504, 0x09080d0c, 0xffffffff, 0xffffffff, + 0x01000504, 0x09080d0c, 0xffffffff, 0xffffffff}; + const int dist_permute_mask = 0x0c; + for (unsigned int i = 1; i < octs.outputs_len; i += 2) { + // big heaping todo vvv + // a) we want 16 bit distances GATHERed, not 32 bit + // b) we need to load 8 of those distances, not 4 + __v4si short_concat_index = _mm_loadl_epi64(octs.outputs + 2*i); + __v4si short_concat_index0 = _mm_loadl_epi64(octs.outputs + 2*i + 1); + __m256i concat_index = _mm256_cvtepu8_epi32(short_concat_index); + __m256i concat_index0 = _mm256_cvtepu8_epi32(short_concat_index0); + __m256i dist = _mm256_i32gather_epi32(distances, concat_index, sizeof(distance_t)); + __m256i dist0 = _mm256_i32gather_epi32(distances, concat_index0, sizeof(distance_t)); + dist = _mm256_shuffle_epi8(dist, dist_shuffle_mask); + dist0 = _mm256_shuffle_epi8(dist0, dist_shuffle_mask); + dist = __builtin_shufflevector(dist, dist, 0, 5, 0, 0); + dist0 = __builtin_shufflevector(dist0, dist0, 0, 5, 0, 0); + __v4si packed_dist = _mm256_castsi256_si128(dist); + _mm_store_si128(distance_pair + 8 * i, packed_dist); + __v4si packed_dist0 = _mm256_castsi256_si128(dist0); + _mm_store_si128(distance_pair + 8 * i + 4, packed_dist0); + } +} +*/ diff --git a/libcorrect/src/fec_shim.c b/libcorrect/src/fec_shim.c new file mode 100644 index 0000000..146c60c --- /dev/null +++ b/libcorrect/src/fec_shim.c @@ -0,0 +1,255 @@ +#include +#include + +#include "fec_shim.h" + +typedef struct { + correct_reed_solomon *rs; + unsigned int msg_length; + unsigned int block_length; + unsigned int num_roots; + uint8_t *msg_out; + unsigned int pad; + uint8_t *erasures; +} reed_solomon_shim; + +void *init_rs_char(int symbol_size, int primitive_polynomial, + int first_consecutive_root, int root_gap, int number_roots, + unsigned int pad) { + if (symbol_size != 8) { + return NULL; + } + + reed_solomon_shim *shim = malloc(sizeof(reed_solomon_shim)); + + shim->pad = pad; + shim->block_length = 255 - pad; + shim->num_roots = number_roots; + shim->msg_length = shim->block_length - number_roots; + shim->rs = correct_reed_solomon_create(primitive_polynomial, + first_consecutive_root, root_gap, number_roots); + shim->msg_out = malloc(shim->block_length); + shim->erasures = malloc(number_roots); + + return shim; +} + +void free_rs_char(void *rs) { + reed_solomon_shim *shim = (reed_solomon_shim *)rs; + correct_reed_solomon_destroy(shim->rs); + free(shim->msg_out); + free(shim->erasures); + free(shim); +} + +void encode_rs_char(void *rs, const unsigned char *msg, unsigned char *parity) { + reed_solomon_shim *shim = (reed_solomon_shim *)rs; + correct_reed_solomon_encode(shim->rs, msg, shim->msg_length, shim->msg_out); + memcpy(parity, shim->msg_out + shim->msg_length, shim->num_roots); +} + +void decode_rs_char(void *rs, unsigned char *block, int *erasure_locations, + int num_erasures) { + reed_solomon_shim *shim = (reed_solomon_shim *)rs; + for (int i = 0; i < num_erasures; i++) { + shim->erasures[i] = (uint8_t)(erasure_locations[i]) - shim->pad; + } + correct_reed_solomon_decode_with_erasures(shim->rs, block, shim->block_length, + shim->erasures, num_erasures, + block); +} + +typedef struct { + correct_convolutional *conv; + unsigned int rate; + unsigned int order; + uint8_t *buf; + size_t buf_len; + uint8_t *read_iter; + uint8_t *write_iter; +} convolutional_shim; + +static correct_convolutional_polynomial_t r12k7[] = {V27POLYA, V27POLYB}; + +static correct_convolutional_polynomial_t r12k9[] = {V29POLYA, V29POLYB}; + +static correct_convolutional_polynomial_t r13k9[] = {V39POLYA, V39POLYB, + V39POLYC}; + +static correct_convolutional_polynomial_t r16k15[] = { + V615POLYA, V615POLYB, V615POLYC, V615POLYD, V615POLYE, V615POLYF}; + +/* Common methods */ +static void *create_viterbi(unsigned int num_decoded_bits, unsigned int rate, + unsigned int order, + correct_convolutional_polynomial_t *poly) { + convolutional_shim *shim = malloc(sizeof(convolutional_shim)); + + size_t num_decoded_bytes = (num_decoded_bits % 8) + ? (num_decoded_bits / 8 + 1) + : num_decoded_bits / 8; + + shim->rate = rate; + shim->order = order; + shim->buf = malloc(num_decoded_bytes); + shim->buf_len = num_decoded_bytes; + shim->conv = correct_convolutional_create(rate, order, poly); + shim->read_iter = shim->buf; + shim->write_iter = shim->buf; + + return shim; +} + +static void delete_viterbi(void *vit) { + convolutional_shim *shim = (convolutional_shim *)vit; + free(shim->buf); + correct_convolutional_destroy(shim->conv); + free(shim); +} + +static void init_viterbi(void *vit) { + convolutional_shim *shim = (convolutional_shim *)vit; + shim->read_iter = shim->buf; + shim->write_iter = shim->buf; +} + +static void update_viterbi_blk(void *vit, const unsigned char *encoded_soft, + unsigned int num_encoded_groups) { + convolutional_shim *shim = (convolutional_shim *)vit; + + // don't overwrite our buffer + size_t rem = (shim->buf + shim->buf_len) - shim->write_iter; + size_t rem_bits = 8 * rem; + // this math isn't very clear + // here we sort of do the opposite of what liquid-dsp does + size_t n_write_bits = num_encoded_groups - (shim->order - 1); + if (n_write_bits > rem_bits) { + size_t reduction = n_write_bits - rem_bits; + num_encoded_groups -= reduction; + n_write_bits -= reduction; + } + + // what if n_write_bits isn't a multiple of 8? + // libcorrect can't start and stop at arbitrary indices... + correct_convolutional_decode_soft( + shim->conv, encoded_soft, num_encoded_groups * shim->rate, shim->write_iter); + shim->write_iter += n_write_bits / 8; +} + +static void chainback_viterbi(void *vit, unsigned char *decoded, + unsigned int num_decoded_bits) { + convolutional_shim *shim = (convolutional_shim *)vit; + + // num_decoded_bits not a multiple of 8? + // this is a similar problem to update_viterbi_blk + // although here we could actually resolve a non-multiple of 8 + size_t rem = shim->write_iter - shim->read_iter; + size_t rem_bits = 8 * rem; + + if (num_decoded_bits > rem_bits) { + num_decoded_bits = rem_bits; + } + + size_t num_decoded_bytes = (num_decoded_bits % 8) + ? (num_decoded_bits / 8 + 1) + : num_decoded_bits / 8; + memcpy(decoded, shim->read_iter, num_decoded_bytes); + + shim->read_iter += num_decoded_bytes; +} + +/* Rate 1/2, k = 7 */ +void *create_viterbi27(int num_decoded_bits) { + return create_viterbi(num_decoded_bits, 2, 7, r12k7); +} + +void delete_viterbi27(void *vit) { delete_viterbi(vit); } + +int init_viterbi27(void *vit, int _) { + init_viterbi(vit); + return 0; +} + +int update_viterbi27_blk(void *vit, unsigned char *encoded_soft, + int num_encoded_groups) { + update_viterbi_blk(vit, encoded_soft, num_encoded_groups); + return 0; +} + +int chainback_viterbi27(void *vit, unsigned char *decoded, + unsigned int num_decoded_bits, unsigned int _) { + chainback_viterbi(vit, decoded, num_decoded_bits); + return 0; +} + +/* Rate 1/2, k = 9 */ +void *create_viterbi29(int num_decoded_bits) { + return create_viterbi(num_decoded_bits, 2, 9, r12k9); +} + +void delete_viterbi29(void *vit) { delete_viterbi(vit); } + +int init_viterbi29(void *vit, int _) { + init_viterbi(vit); + return 0; +} + +int update_viterbi29_blk(void *vit, unsigned char *encoded_soft, + int num_encoded_groups) { + update_viterbi_blk(vit, encoded_soft, num_encoded_groups); + return 0; +} + +int chainback_viterbi29(void *vit, unsigned char *decoded, + unsigned int num_decoded_bits, unsigned int _) { + chainback_viterbi(vit, decoded, num_decoded_bits); + return 0; +} + +/* Rate 1/3, k = 9 */ +void *create_viterbi39(int num_decoded_bits) { + return create_viterbi(num_decoded_bits, 3, 9, r13k9); +} + +void delete_viterbi39(void *vit) { delete_viterbi(vit); } + +int init_viterbi39(void *vit, int _) { + init_viterbi(vit); + return 0; +} + +int update_viterbi39_blk(void *vit, unsigned char *encoded_soft, + int num_encoded_groups) { + update_viterbi_blk(vit, encoded_soft, num_encoded_groups); + return 0; +} + +int chainback_viterbi39(void *vit, unsigned char *decoded, + unsigned int num_decoded_bits, unsigned int _) { + chainback_viterbi(vit, decoded, num_decoded_bits); + return 0; +} + +/* Rate 1/6, k = 15 */ +void *create_viterbi615(int num_decoded_bits) { + return create_viterbi(num_decoded_bits, 6, 15, r16k15); +} + +void delete_viterbi615(void *vit) { delete_viterbi(vit); } + +int init_viterbi615(void *vit, int _) { + init_viterbi(vit); + return 0; +} + +int update_viterbi615_blk(void *vit, unsigned char *encoded_soft, + int num_encoded_groups) { + update_viterbi_blk(vit, encoded_soft, num_encoded_groups); + return 0; +} + +int chainback_viterbi615(void *vit, unsigned char *decoded, + unsigned int num_decoded_bits, unsigned int _) { + chainback_viterbi(vit, decoded, num_decoded_bits); + return 0; +} diff --git a/libcorrect/src/reed-solomon/CMakeLists.txt b/libcorrect/src/reed-solomon/CMakeLists.txt new file mode 100644 index 0000000..eabe75e --- /dev/null +++ b/libcorrect/src/reed-solomon/CMakeLists.txt @@ -0,0 +1,2 @@ +set(SRCFILES polynomial.c reed-solomon.c encode.c decode.c) +add_library(correct-reed-solomon OBJECT ${SRCFILES}) diff --git a/libcorrect/src/reed-solomon/decode.c b/libcorrect/src/reed-solomon/decode.c new file mode 100644 index 0000000..e765451 --- /dev/null +++ b/libcorrect/src/reed-solomon/decode.c @@ -0,0 +1,505 @@ +#include "correct/reed-solomon/encode.h" + +// calculate all syndromes of the received polynomial at the roots of the generator +// because we're evaluating at the roots of the generator, and because the transmitted +// polynomial was made to be a product of the generator, we know that the transmitted +// polynomial is 0 at these roots +// any nonzero syndromes we find here are the values of the error polynomial evaluated +// at these roots, so these values give us a window into the error polynomial. if +// these syndromes are all zero, then we can conclude the error polynomial is also +// zero. if they're nonzero, then we know our message received an error in transit. +// returns true if syndromes are all zero +static bool reed_solomon_find_syndromes(field_t field, polynomial_t msgpoly, field_logarithm_t **generator_root_exp, + field_element_t *syndromes, size_t min_distance) { + bool all_zero = true; + memset(syndromes, 0, min_distance * sizeof(field_element_t)); + for (unsigned int i = 0; i < min_distance; i++) { + // profiling reveals that this function takes about 50% of the cpu time of + // decoding. so, in order to speed it up a little, we precompute and save + // the successive powers of the roots of the generator, which are + // located in generator_root_exp + field_element_t eval = polynomial_eval_lut(field, msgpoly, generator_root_exp[i]); + if (eval) { + all_zero = false; + } + syndromes[i] = eval; + } + return all_zero; +} + +// Berlekamp-Massey algorithm to find LFSR that describes syndromes +// returns number of errors and writes the error locator polynomial to rs->error_locator +static unsigned int reed_solomon_find_error_locator(correct_reed_solomon *rs, size_t num_erasures) { + unsigned int numerrors = 0; + + memset(rs->error_locator.coeff, 0, (rs->min_distance + 1) * sizeof(field_element_t)); + + // initialize to f(x) = 1 + rs->error_locator.coeff[0] = 1; + rs->error_locator.order = 0; + + memcpy(rs->last_error_locator.coeff, rs->error_locator.coeff, (rs->min_distance + 1) * sizeof(field_element_t)); + rs->last_error_locator.order = rs->error_locator.order; + + field_element_t discrepancy; + field_element_t last_discrepancy = 1; + unsigned int delay_length = 1; + + for (unsigned int i = rs->error_locator.order; i < rs->min_distance - num_erasures; i++) { + discrepancy = rs->syndromes[i]; + for (unsigned int j = 1; j <= numerrors; j++) { + discrepancy = field_add(rs->field, discrepancy, + field_mul(rs->field, rs->error_locator.coeff[j], rs->syndromes[i - j])); + } + + if (!discrepancy) { + // our existing LFSR describes the new syndrome as well + // leave it as-is but update the number of delay elements + // so that if a discrepancy occurs later we can eliminate it + delay_length++; + continue; + } + + if (2 * numerrors <= i) { + // there's a discrepancy, but we still have room for more taps + // lengthen LFSR by one tap and set weight to eliminate discrepancy + + // shift the last locator by the delay length, multiply by discrepancy, + // and divide by the last discrepancy + // we move down because we're shifting up, and this prevents overwriting + for (int j = rs->last_error_locator.order; j >= 0; j--) { + // the bounds here will be ok since we have a headroom of numerrors + rs->last_error_locator.coeff[j + delay_length] = field_div( + rs->field, field_mul(rs->field, rs->last_error_locator.coeff[j], discrepancy), last_discrepancy); + } + for (int j = delay_length - 1; j >= 0; j--) { + rs->last_error_locator.coeff[j] = 0; + } + + // locator = locator - last_locator + // we will also update last_locator to be locator before this loop takes place + field_element_t temp; + for (int j = 0; j <= (rs->last_error_locator.order + delay_length); j++) { + temp = rs->error_locator.coeff[j]; + rs->error_locator.coeff[j] = + field_add(rs->field, rs->error_locator.coeff[j], rs->last_error_locator.coeff[j]); + rs->last_error_locator.coeff[j] = temp; + } + unsigned int temp_order = rs->error_locator.order; + rs->error_locator.order = rs->last_error_locator.order + delay_length; + rs->last_error_locator.order = temp_order; + + // now last_locator is locator before we started, + // and locator is (locator - (discrepancy/last_discrepancy) * x^(delay_length) * last_locator) + + numerrors = i + 1 - numerrors; + last_discrepancy = discrepancy; + delay_length = 1; + continue; + } + + // no more taps + // unlike the previous case, we are preserving last locator, + // but we'll update locator as before + // we're basically flattening the two loops from the previous case because + // we no longer need to update last_locator + for (int j = rs->last_error_locator.order; j >= 0; j--) { + rs->error_locator.coeff[j + delay_length] = + field_add(rs->field, rs->error_locator.coeff[j + delay_length], + field_div(rs->field, field_mul(rs->field, rs->last_error_locator.coeff[j], discrepancy), + last_discrepancy)); + } + rs->error_locator.order = (rs->last_error_locator.order + delay_length > rs->error_locator.order) + ? rs->last_error_locator.order + delay_length + : rs->error_locator.order; + delay_length++; + } + return rs->error_locator.order; +} + +// find the roots of the error locator polynomial +// Chien search +bool reed_solomon_factorize_error_locator(field_t field, unsigned int num_skip, polynomial_t locator_log, field_element_t *roots, + field_logarithm_t **element_exp) { + // normally it'd be tricky to find all the roots + // but, the finite field is awfully finite... + // just brute force search across every field element + unsigned int root = num_skip; + memset(roots + num_skip, 0, (locator_log.order) * sizeof(field_element_t)); + for (field_operation_t i = 0; i < 256; i++) { + // we make two optimizations here to help this search go faster + // a) we have precomputed the first successive powers of every single element + // in the field. we need at most n powers, where n is the largest possible + // degree of the error locator + // b) we have precomputed the error locator polynomial in log form, which + // helps reduce some lookups that would be done here + if (!polynomial_eval_log_lut(field, locator_log, element_exp[i])) { + roots[root] = (field_element_t)i; + root++; + } + } + // this is where we find out if we are have too many errors to recover from + // berlekamp-massey may have built an error locator that has 0 discrepancy + // on the syndromes but doesn't have enough roots + return root == locator_log.order + num_skip; +} + +// use error locator and syndromes to find the error evaluator polynomial +void reed_solomon_find_error_evaluator(field_t field, polynomial_t locator, polynomial_t syndromes, + polynomial_t error_evaluator) { + // the error evaluator, omega(x), is S(x)*Lamba(x) mod x^(2t) + // where S(x) is a polynomial constructed from the syndromes + // S(1) + S(2)*x + ... + S(2t)*x(2t - 1) + // and Lambda(x) is the error locator + // the modulo is implicit here -- we have limited the max length of error_evaluator, + // which polynomial_mul will interpret to mean that it should not compute + // powers larger than that, which is the same as performing mod x^(2t) + polynomial_mul(field, locator, syndromes, error_evaluator); +} + +// use error locator, error roots and syndromes to find the error values +// that is, the elements in the finite field which can be added to the received +// polynomial at the locations of the error roots in order to produce the +// transmitted polynomial +// forney algorithm +void reed_solomon_find_error_values(correct_reed_solomon *rs) { + // error value e(j) = -(X(j)^(1-c) * omega(X(j)^-1))/(lambda'(X(j)^-1)) + // where X(j)^-1 is a root of the error locator, omega(X) is the error evaluator, + // lambda'(X) is the first formal derivative of the error locator, + // and c is the first consecutive root of the generator used in encoding + + // first find omega(X), the error evaluator + // we generate S(x), the polynomial constructed from the roots of the syndromes + // this is *not* the polynomial constructed by expanding the products of roots + // S(x) = S(1) + S(2)*x + ... + S(2t)*x(2t - 1) + polynomial_t syndrome_poly; + syndrome_poly.order = rs->min_distance - 1; + syndrome_poly.coeff = rs->syndromes; + memset(rs->error_evaluator.coeff, 0, (rs->error_evaluator.order + 1) * sizeof(field_element_t)); + reed_solomon_find_error_evaluator(rs->field, rs->error_locator, syndrome_poly, rs->error_evaluator); + + // now find lambda'(X) + rs->error_locator_derivative.order = rs->error_locator.order - 1; + polynomial_formal_derivative(rs->field, rs->error_locator, rs->error_locator_derivative); + + // calculate each e(j) + for (unsigned int i = 0; i < rs->error_locator.order; i++) { + if (rs->error_roots[i] == 0) { + continue; + } + rs->error_vals[i] = field_mul( + rs->field, field_pow(rs->field, rs->error_roots[i], rs->first_consecutive_root - 1), + field_div( + rs->field, polynomial_eval_lut(rs->field, rs->error_evaluator, rs->element_exp[rs->error_roots[i]]), + polynomial_eval_lut(rs->field, rs->error_locator_derivative, rs->element_exp[rs->error_roots[i]]))); + } +} + +void reed_solomon_find_error_locations(field_t field, field_logarithm_t generator_root_gap, + field_element_t *error_roots, field_logarithm_t *error_locations, + unsigned int num_errors, unsigned int num_skip) { + for (unsigned int i = 0; i < num_errors; i++) { + // the error roots are the reciprocals of the error locations, so div 1 by them + + // we do mod 255 here because the log table aliases at index 1 + // the log of 1 is both 0 and 255 (alpha^255 = alpha^0 = 1) + // for most uses it makes sense to have log(1) = 255, but in this case + // we're interested in a byte index, and the 255th index is not even valid + // just wrap it back to 0 + + if (error_roots[i] == 0) { + continue; + } + + field_operation_t loc = field_div(field, 1, error_roots[i]); + for (field_operation_t j = 0; j < 256; j++) { + if (field_pow(field, j, generator_root_gap) == loc) { + error_locations[i] = field.log[j]; + break; + } + } + } +} + +// erasure method -- take given locations and convert to roots +// this is the inverse of reed_solomon_find_error_locations +static void reed_solomon_find_error_roots_from_locations(field_t field, field_logarithm_t generator_root_gap, + const field_logarithm_t *error_locations, + field_element_t *error_roots, unsigned int num_errors) { + for (unsigned int i = 0; i < num_errors; i++) { + field_element_t loc = field_pow(field, field.exp[error_locations[i]], generator_root_gap); + // field_element_t loc = field.exp[error_locations[i]]; + error_roots[i] = field_div(field, 1, loc); + // error_roots[i] = loc; + } +} + +// erasure method -- given the roots of the error locator, create the polynomial +static polynomial_t reed_solomon_find_error_locator_from_roots(field_t field, unsigned int num_errors, + field_element_t *error_roots, + polynomial_t error_locator, + polynomial_t *scratch) { + // multiply out roots to build the error locator polynomial + return polynomial_init_from_roots(field, num_errors, error_roots, error_locator, scratch); +} + +// erasure method +static void reed_solomon_find_modified_syndromes(correct_reed_solomon *rs, field_element_t *syndromes, polynomial_t error_locator, field_element_t *modified_syndromes) { + polynomial_t syndrome_poly; + syndrome_poly.order = rs->min_distance - 1; + syndrome_poly.coeff = syndromes; + + polynomial_t modified_syndrome_poly; + modified_syndrome_poly.order = rs->min_distance - 1; + modified_syndrome_poly.coeff = modified_syndromes; + + polynomial_mul(rs->field, error_locator, syndrome_poly, modified_syndrome_poly); +} + +void correct_reed_solomon_decoder_create(correct_reed_solomon *rs) { + rs->has_init_decode = true; + rs->syndromes = calloc(rs->min_distance, sizeof(field_element_t)); + rs->modified_syndromes = calloc(2 * rs->min_distance, sizeof(field_element_t)); + rs->received_polynomial = polynomial_create(rs->block_length - 1); + rs->error_locator = polynomial_create(rs->min_distance); + rs->error_locator_log = polynomial_create(rs->min_distance); + rs->erasure_locator = polynomial_create(rs->min_distance); + rs->error_roots = calloc(2 * rs->min_distance, sizeof(field_element_t)); + rs->error_vals = malloc(rs->min_distance * sizeof(field_element_t)); + rs->error_locations = malloc(rs->min_distance * sizeof(field_logarithm_t)); + + rs->last_error_locator = polynomial_create(rs->min_distance); + rs->error_evaluator = polynomial_create(rs->min_distance - 1); + rs->error_locator_derivative = polynomial_create(rs->min_distance - 1); + + // calculate and store the first block_length powers of every generator root + // we would have to do this work in order to calculate the syndromes + // if we save it, we can prevent the need to recalculate it on subsequent calls + // total memory usage is min_distance * block_length bytes e.g. 32 * 255 ~= 8k + rs->generator_root_exp = malloc(rs->min_distance * sizeof(field_logarithm_t *)); + for (unsigned int i = 0; i < rs->min_distance; i++) { + rs->generator_root_exp[i] = malloc(rs->block_length * sizeof(field_logarithm_t)); + polynomial_build_exp_lut(rs->field, rs->generator_roots[i], rs->block_length - 1, rs->generator_root_exp[i]); + } + + // calculate and store the first min_distance powers of every element in the field + // we would have to do this for chien search anyway, and its size is only 256 * min_distance bytes + // for min_distance = 32 this is 8k of memory, a pittance for the speedup we receive in exchange + // we also get to reuse this work during error value calculation + rs->element_exp = malloc(256 * sizeof(field_logarithm_t *)); + for (field_operation_t i = 0; i < 256; i++) { + rs->element_exp[i] = malloc(rs->min_distance * sizeof(field_logarithm_t)); + polynomial_build_exp_lut(rs->field, i, rs->min_distance - 1, rs->element_exp[i]); + } + + rs->init_from_roots_scratch[0] = polynomial_create(rs->min_distance); + rs->init_from_roots_scratch[1] = polynomial_create(rs->min_distance); +} + +ssize_t correct_reed_solomon_decode(correct_reed_solomon *rs, const uint8_t *encoded, size_t encoded_length, + uint8_t *msg) { + if (encoded_length > rs->block_length) { + return -1; + } + + // the message is the non-remainder part + size_t msg_length = encoded_length - rs->min_distance; + // if they handed us a nonfull block, we'll write in 0s + size_t pad_length = rs->block_length - encoded_length; + + if (!rs->has_init_decode) { + // initialize rs for decoding + correct_reed_solomon_decoder_create(rs); + } + + // we need to copy to our local buffer + // the buffer we're given has the coordinates in the wrong direction + // e.g. byte 0 corresponds to the 254th order coefficient + // so we're going to flip and then write padding + // the final copied buffer will look like + // | rem (rs->min_distance) | msg (msg_length) | pad (pad_length) | + + for (unsigned int i = 0; i < encoded_length; i++) { + rs->received_polynomial.coeff[i] = encoded[encoded_length - (i + 1)]; + } + + // fill the pad_length with 0s + for (unsigned int i = 0; i < pad_length; i++) { + rs->received_polynomial.coeff[i + encoded_length] = 0; + } + + + bool all_zero = reed_solomon_find_syndromes(rs->field, rs->received_polynomial, rs->generator_root_exp, + rs->syndromes, rs->min_distance); + + if (all_zero) { + // syndromes were all zero, so there was no error in the message + // copy to msg and we are done + for (unsigned int i = 0; i < msg_length; i++) { + msg[i] = rs->received_polynomial.coeff[encoded_length - (i + 1)]; + } + return msg_length; + } + + unsigned int order = reed_solomon_find_error_locator(rs, 0); + // XXX fix this vvvv + rs->error_locator.order = order; + + for (unsigned int i = 0; i <= rs->error_locator.order; i++) { + // this is a little strange since the coeffs are logs, not elements + // also, we'll be storing log(0) = 0 for any 0 coeffs in the error locator + // that would seem bad but we'll just be using this in chien search, and we'll skip all 0 coeffs + // (you might point out that log(1) also = 0, which would seem to alias. however, that's ok, + // because log(1) = 255 as well, and in fact that's how it's represented in our log table) + rs->error_locator_log.coeff[i] = rs->field.log[rs->error_locator.coeff[i]]; + } + rs->error_locator_log.order = rs->error_locator.order; + + if (!reed_solomon_factorize_error_locator(rs->field, 0, rs->error_locator_log, rs->error_roots, rs->element_exp)) { + // roots couldn't be found, so there were too many errors to deal with + // RS has failed for this message + return -1; + } + + reed_solomon_find_error_locations(rs->field, rs->generator_root_gap, rs->error_roots, rs->error_locations, + rs->error_locator.order, 0); + + reed_solomon_find_error_values(rs); + + for (unsigned int i = 0; i < rs->error_locator.order; i++) { + rs->received_polynomial.coeff[rs->error_locations[i]] = + field_sub(rs->field, rs->received_polynomial.coeff[rs->error_locations[i]], rs->error_vals[i]); + } + + for (unsigned int i = 0; i < msg_length; i++) { + msg[i] = rs->received_polynomial.coeff[encoded_length - (i + 1)]; + } + + return msg_length; +} + +ssize_t correct_reed_solomon_decode_with_erasures(correct_reed_solomon *rs, const uint8_t *encoded, + size_t encoded_length, const uint8_t *erasure_locations, + size_t erasure_length, uint8_t *msg) { + if (!erasure_length) { + return correct_reed_solomon_decode(rs, encoded, encoded_length, msg); + } + + if (encoded_length > rs->block_length) { + return -1; + } + + if (erasure_length > rs->min_distance) { + return -1; + } + + // the message is the non-remainder part + size_t msg_length = encoded_length - rs->min_distance; + // if they handed us a nonfull block, we'll write in 0s + size_t pad_length = rs->block_length - encoded_length; + + if (!rs->has_init_decode) { + // initialize rs for decoding + correct_reed_solomon_decoder_create(rs); + } + + // we need to copy to our local buffer + // the buffer we're given has the coordinates in the wrong direction + // e.g. byte 0 corresponds to the 254th order coefficient + // so we're going to flip and then write padding + // the final copied buffer will look like + // | rem (rs->min_distance) | msg (msg_length) | pad (pad_length) | + + for (unsigned int i = 0; i < encoded_length; i++) { + rs->received_polynomial.coeff[i] = encoded[encoded_length - (i + 1)]; + } + + // fill the pad_length with 0s + for (unsigned int i = 0; i < pad_length; i++) { + rs->received_polynomial.coeff[i + encoded_length] = 0; + } + + for (unsigned int i = 0; i < erasure_length; i++) { + // remap the coordinates of the erasures + rs->error_locations[i] = rs->block_length - (erasure_locations[i] + pad_length + 1); + } + + reed_solomon_find_error_roots_from_locations(rs->field, rs->generator_root_gap, rs->error_locations, + rs->error_roots, erasure_length); + + rs->erasure_locator = + reed_solomon_find_error_locator_from_roots(rs->field, erasure_length, rs->error_roots, rs->erasure_locator, rs->init_from_roots_scratch); + + bool all_zero = reed_solomon_find_syndromes(rs->field, rs->received_polynomial, rs->generator_root_exp, + rs->syndromes, rs->min_distance); + + if (all_zero) { + // syndromes were all zero, so there was no error in the message + // copy to msg and we are done + for (unsigned int i = 0; i < msg_length; i++) { + msg[i] = rs->received_polynomial.coeff[encoded_length - (i + 1)]; + } + return msg_length; + } + + reed_solomon_find_modified_syndromes(rs, rs->syndromes, rs->erasure_locator, rs->modified_syndromes); + + field_element_t *syndrome_copy = malloc(rs->min_distance * sizeof(field_element_t)); + memcpy(syndrome_copy, rs->syndromes, rs->min_distance * sizeof(field_element_t)); + + for (unsigned int i = erasure_length; i < rs->min_distance; i++) { + rs->syndromes[i - erasure_length] = rs->modified_syndromes[i]; + } + + unsigned int order = reed_solomon_find_error_locator(rs, erasure_length); + // XXX fix this vvvv + rs->error_locator.order = order; + + for (unsigned int i = 0; i <= rs->error_locator.order; i++) { + // this is a little strange since the coeffs are logs, not elements + // also, we'll be storing log(0) = 0 for any 0 coeffs in the error locator + // that would seem bad but we'll just be using this in chien search, and we'll skip all 0 coeffs + // (you might point out that log(1) also = 0, which would seem to alias. however, that's ok, + // because log(1) = 255 as well, and in fact that's how it's represented in our log table) + rs->error_locator_log.coeff[i] = rs->field.log[rs->error_locator.coeff[i]]; + } + rs->error_locator_log.order = rs->error_locator.order; + + /* + for (unsigned int i = 0; i < erasure_length; i++) { + rs->error_roots[i] = field_div(rs->field, 1, rs->error_roots[i]); + } + */ + + if (!reed_solomon_factorize_error_locator(rs->field, erasure_length, rs->error_locator_log, rs->error_roots, rs->element_exp)) { + // roots couldn't be found, so there were too many errors to deal with + // RS has failed for this message + return -1; + } + + polynomial_t temp_poly = polynomial_create(rs->error_locator.order + erasure_length); + polynomial_mul(rs->field, rs->erasure_locator, rs->error_locator, temp_poly); + polynomial_t placeholder_poly = rs->error_locator; + rs->error_locator = temp_poly; + + + reed_solomon_find_error_locations(rs->field, rs->generator_root_gap, rs->error_roots, rs->error_locations, + rs->error_locator.order, erasure_length); + + memcpy(rs->syndromes, syndrome_copy, rs->min_distance * sizeof(field_element_t)); + + reed_solomon_find_error_values(rs); + + for (unsigned int i = 0; i < rs->error_locator.order; i++) { + rs->received_polynomial.coeff[rs->error_locations[i]] = + field_sub(rs->field, rs->received_polynomial.coeff[rs->error_locations[i]], rs->error_vals[i]); + } + + rs->error_locator = placeholder_poly; + + for (unsigned int i = 0; i < msg_length; i++) { + msg[i] = rs->received_polynomial.coeff[encoded_length - (i + 1)]; + } + + return msg_length; +} diff --git a/libcorrect/src/reed-solomon/encode.c b/libcorrect/src/reed-solomon/encode.c new file mode 100644 index 0000000..d4eb6f3 --- /dev/null +++ b/libcorrect/src/reed-solomon/encode.c @@ -0,0 +1,34 @@ +#include "correct/reed-solomon/encode.h" + +ssize_t correct_reed_solomon_encode(correct_reed_solomon *rs, const uint8_t *msg, size_t msg_length, uint8_t *encoded) { + if (msg_length > rs->message_length) { + return -1; + } + + size_t pad_length = rs->message_length - msg_length; + for (unsigned int i = 0; i < msg_length; i++) { + // message goes from high order to low order but libcorrect polynomials go low to high + // so we reverse on the way in and on the way out + // we'd have to do a copy anyway so this reversal should be free + rs->encoded_polynomial.coeff[rs->encoded_polynomial.order - (i + pad_length)] = msg[i]; + } + + // 0-fill the rest of the coefficients -- this length will always be > 0 + // because the order of this poly is block_length and the msg_length <= message_length + // e.g. 255 and 223 + memset(rs->encoded_polynomial.coeff + (rs->encoded_polynomial.order + 1 - pad_length), 0, pad_length); + memset(rs->encoded_polynomial.coeff, 0, (rs->encoded_polynomial.order + 1 - rs->message_length)); + + polynomial_mod(rs->field, rs->encoded_polynomial, rs->generator, rs->encoded_remainder); + + // now return byte order to highest order to lowest order + for (unsigned int i = 0; i < msg_length; i++) { + encoded[i] = rs->encoded_polynomial.coeff[rs->encoded_polynomial.order - (i + pad_length)]; + } + + for (unsigned int i = 0; i < rs->min_distance; i++) { + encoded[msg_length + i] = rs->encoded_remainder.coeff[rs->min_distance - (i + 1)]; + } + + return rs->block_length; +} diff --git a/libcorrect/src/reed-solomon/polynomial.c b/libcorrect/src/reed-solomon/polynomial.c new file mode 100644 index 0000000..32c2792 --- /dev/null +++ b/libcorrect/src/reed-solomon/polynomial.c @@ -0,0 +1,255 @@ +#include "correct/reed-solomon/polynomial.h" + +polynomial_t polynomial_create(unsigned int order) { + polynomial_t polynomial; + polynomial.coeff = malloc(sizeof(field_element_t) * (order + 1)); + polynomial.order = order; + return polynomial; +} + +void polynomial_destroy(polynomial_t polynomial) { + free(polynomial.coeff); +} + +// if you want a full multiplication, then make res.order = l.order + r.order +// but if you just care about a lower order, e.g. mul mod x^i, then you can select +// fewer coefficients +void polynomial_mul(field_t field, polynomial_t l, polynomial_t r, polynomial_t res) { + // perform an element-wise multiplication of two polynomials + memset(res.coeff, 0, sizeof(field_element_t) * (res.order + 1)); + for (unsigned int i = 0; i <= l.order; i++) { + if (i > res.order) { + continue; + } + unsigned int j_limit = (r.order > res.order - i) ? res.order - i : r.order; + for (unsigned int j = 0; j <= j_limit; j++) { + // e.g. alpha^5*x * alpha^37*x^2 --> alpha^42*x^3 + res.coeff[i + j] = field_add(field, res.coeff[i + j], field_mul(field, l.coeff[i], r.coeff[j])); + } + } +} + +void polynomial_mod(field_t field, polynomial_t dividend, polynomial_t divisor, polynomial_t mod) { + // find the polynomial remainder of dividend mod divisor + // do long division and return just the remainder (written to mod) + + if (mod.order < dividend.order) { + // mod.order must be >= dividend.order (scratch space needed) + // this is an error -- catch it in debug? + return; + } + // initialize remainder as dividend + memcpy(mod.coeff, dividend.coeff, sizeof(field_element_t) * (dividend.order + 1)); + + // XXX make sure divisor[divisor_order] is nonzero + field_logarithm_t divisor_leading = field.log[divisor.coeff[divisor.order]]; + // long division steps along one order at a time, starting at the highest order + for (unsigned int i = dividend.order; i > 0; i--) { + // look at the leading coefficient of dividend and divisor + // if leading coefficient of dividend / leading coefficient of divisor is q + // then the next row of subtraction will be q * divisor + // if order of q < 0 then what we have is the remainder and we are done + if (i < divisor.order) { + break; + } + if (mod.coeff[i] == 0) { + continue; + } + unsigned int q_order = i - divisor.order; + field_logarithm_t q_coeff = field_div_log(field, field.log[mod.coeff[i]], divisor_leading); + + // now that we've chosen q, multiply the divisor by q and subtract from + // our remainder. subtracting in GF(2^8) is XOR, just like addition + for (unsigned int j = 0; j <= divisor.order; j++) { + if (divisor.coeff[j] == 0) { + continue; + } + // all of the multiplication is shifted up by q_order places + mod.coeff[j + q_order] = field_add(field, mod.coeff[j + q_order], + field_mul_log_element(field, field.log[divisor.coeff[j]], q_coeff)); + } + } +} + +void polynomial_formal_derivative(field_t field, polynomial_t poly, polynomial_t der) { + // if f(x) = a(n)*x^n + ... + a(1)*x + a(0) + // then f'(x) = n*a(n)*x^(n-1) + ... + 2*a(2)*x + a(1) + // where n*a(n) = sum(k=1, n, a(n)) e.g. the nth sum of a(n) in GF(2^8) + + // assumes der.order = poly.order - 1 + memset(der.coeff, 0, sizeof(field_element_t) * (der.order + 1)); + for (unsigned int i = 0; i <= der.order; i++) { + // we're filling in the ith power of der, so we look ahead one power in poly + // f(x) = a(i + 1)*x^(i + 1) -> f'(x) = (i + 1)*a(i + 1)*x^i + // where (i + 1)*a(i + 1) is the sum of a(i + 1) (i + 1) times, not the product + der.coeff[i] = field_sum(field, poly.coeff[i + 1], i + 1); + } +} + +field_element_t polynomial_eval(field_t field, polynomial_t poly, field_element_t val) { + // evaluate the polynomial poly at a particular element val + if (val == 0) { + return poly.coeff[0]; + } + + field_element_t res = 0; + + // we're going to start at 0th order and multiply by val each time + field_logarithm_t val_exponentiated = field.log[1]; + field_logarithm_t val_log = field.log[val]; + + for (unsigned int i = 0; i <= poly.order; i++) { + if (poly.coeff[i] != 0) { + // multiply-accumulate by the next coeff times the next power of val + res = field_add(field, res, + field_mul_log_element(field, field.log[poly.coeff[i]], val_exponentiated)); + } + // now advance to the next power + val_exponentiated = field_mul_log(field, val_exponentiated, val_log); + } + return res; +} + +field_element_t polynomial_eval_lut(field_t field, polynomial_t poly, const field_logarithm_t *val_exp) { + // evaluate the polynomial poly at a particular element val + // in this case, all of the logarithms of the successive powers of val have been precalculated + // this removes the extra work we'd have to do to calculate val_exponentiated each time + // if this function is to be called on the same val multiple times + if (val_exp[0] == 0) { + return poly.coeff[0]; + } + + field_element_t res = 0; + + for (unsigned int i = 0; i <= poly.order; i++) { + if (poly.coeff[i] != 0) { + // multiply-accumulate by the next coeff times the next power of val + res = field_add(field, res, + field_mul_log_element(field, field.log[poly.coeff[i]], val_exp[i])); + } + } + return res; +} + +field_element_t polynomial_eval_log_lut(field_t field, polynomial_t poly_log, const field_logarithm_t *val_exp) { + // evaluate the log_polynomial poly at a particular element val + // like polynomial_eval_lut, the logarithms of the successive powers of val have been + // precomputed + if (val_exp[0] == 0) { + if (poly_log.coeff[0] == 0) { + // special case for the non-existant log case + return 0; + } + return field.exp[poly_log.coeff[0]]; + } + + field_element_t res = 0; + + for (unsigned int i = 0; i <= poly_log.order; i++) { + // using 0 as a sentinel value in log -- log(0) is really -inf + if (poly_log.coeff[i] != 0) { + // multiply-accumulate by the next coeff times the next power of val + res = field_add(field, res, + field_mul_log_element(field, poly_log.coeff[i], val_exp[i])); + } + } + return res; +} + +void polynomial_build_exp_lut(field_t field, field_element_t val, unsigned int order, field_logarithm_t *val_exp) { + // create the lookup table of successive powers of val used by polynomial_eval_lut + field_logarithm_t val_exponentiated = field.log[1]; + field_logarithm_t val_log = field.log[val]; + for (unsigned int i = 0; i <= order; i++) { + if (val == 0) { + val_exp[i] = 0; + } else { + val_exp[i] = val_exponentiated; + val_exponentiated = field_mul_log(field, val_exponentiated, val_log); + } + } +} + +polynomial_t polynomial_init_from_roots(field_t field, unsigned int nroots, field_element_t *roots, polynomial_t poly, polynomial_t *scratch) { + unsigned int order = nroots; + polynomial_t l; + field_element_t l_coeff[2]; + l.order = 1; + l.coeff = l_coeff; + + // we'll keep two temporary stores of rightside polynomial + // each time through the loop, we take the previous result and use it as new rightside + // swap back and forth (prevents the need for a copy) + polynomial_t r[2]; + r[0] = scratch[0]; + r[1] = scratch[1]; + unsigned int rcoeffres = 0; + + // initialize the result with x + roots[0] + r[rcoeffres].coeff[1] = 1; + r[rcoeffres].coeff[0] = roots[0]; + r[rcoeffres].order = 1; + + // initialize lcoeff[1] with x + // we'll fill in the 0th order term in each loop iter + l.coeff[1] = 1; + + // loop through, using previous run's result as the new right hand side + // this allows us to multiply one group at a time + for (unsigned int i = 1; i < nroots; i++) { + l.coeff[0] = roots[i]; + unsigned int nextrcoeff = rcoeffres; + rcoeffres = (rcoeffres + 1) % 2; + r[rcoeffres].order = i + 1; + polynomial_mul(field, l, r[nextrcoeff], r[rcoeffres]); + } + + memcpy(poly.coeff, r[rcoeffres].coeff, (order + 1) * sizeof(field_element_t)); + poly.order = order; + + return poly; +} + +polynomial_t polynomial_create_from_roots(field_t field, unsigned int nroots, field_element_t *roots) { + polynomial_t poly = polynomial_create(nroots); + unsigned int order = nroots; + polynomial_t l; + l.order = 1; + l.coeff = calloc(2, sizeof(field_element_t)); + + polynomial_t r[2]; + // we'll keep two temporary stores of rightside polynomial + // each time through the loop, we take the previous result and use it as new rightside + // swap back and forth (prevents the need for a copy) + r[0].coeff = calloc(order + 1, sizeof(field_element_t)); + r[1].coeff = calloc(order + 1, sizeof(field_element_t)); + unsigned int rcoeffres = 0; + + // initialize the result with x + roots[0] + r[rcoeffres].coeff[0] = roots[0]; + r[rcoeffres].coeff[1] = 1; + r[rcoeffres].order = 1; + + // initialize lcoeff[1] with x + // we'll fill in the 0th order term in each loop iter + l.coeff[1] = 1; + + // loop through, using previous run's result as the new right hand side + // this allows us to multiply one group at a time + for (unsigned int i = 1; i < nroots; i++) { + l.coeff[0] = roots[i]; + unsigned int nextrcoeff = rcoeffres; + rcoeffres = (rcoeffres + 1) % 2; + r[rcoeffres].order = i + 1; + polynomial_mul(field, l, r[nextrcoeff], r[rcoeffres]); + } + + memcpy(poly.coeff, r[rcoeffres].coeff, (order + 1) * sizeof(field_element_t)); + poly.order = order; + + free(l.coeff); + free(r[0].coeff); + free(r[1].coeff); + + return poly; +} diff --git a/libcorrect/src/reed-solomon/reed-solomon.c b/libcorrect/src/reed-solomon/reed-solomon.c new file mode 100644 index 0000000..91a708e --- /dev/null +++ b/libcorrect/src/reed-solomon/reed-solomon.c @@ -0,0 +1,187 @@ +#include "correct/reed-solomon/reed-solomon.h" + +// coeff must be of size nroots + 1 +// e.g. 2 roots (x + alpha)(x + alpha^2) yields a poly with 3 terms x^2 + g0*x + g1 +static polynomial_t reed_solomon_build_generator(field_t field, unsigned int nroots, field_element_t first_consecutive_root, unsigned int root_gap, polynomial_t generator, field_element_t *roots) { + // generator has order 2*t + // of form (x + alpha^1)(x + alpha^2)...(x - alpha^2*t) + for (unsigned int i = 0; i < nroots; i++) { + roots[i] = field.exp[(root_gap * (i + first_consecutive_root)) % 255]; + } + return polynomial_create_from_roots(field, nroots, roots); +} + +correct_reed_solomon *correct_reed_solomon_create(field_operation_t primitive_polynomial, field_logarithm_t first_consecutive_root, field_logarithm_t generator_root_gap, size_t num_roots) { + correct_reed_solomon *rs = calloc(1, sizeof(correct_reed_solomon)); + rs->field = field_create(primitive_polynomial); + + rs->block_length = 255; + rs->min_distance = num_roots; + rs->message_length = rs->block_length - rs->min_distance; + + rs->first_consecutive_root = first_consecutive_root; + rs->generator_root_gap = generator_root_gap; + + rs->generator_roots = malloc(rs->min_distance * sizeof(field_element_t)); + + rs->generator = reed_solomon_build_generator(rs->field, rs->min_distance, rs->first_consecutive_root, rs->generator_root_gap, rs->generator, rs->generator_roots); + + rs->encoded_polynomial = polynomial_create(rs->block_length - 1); + rs->encoded_remainder = polynomial_create(rs->block_length - 1); + + rs->has_init_decode = false; + + return rs; +} + +void correct_reed_solomon_destroy(correct_reed_solomon *rs) { + field_destroy(rs->field); + polynomial_destroy(rs->generator); + free(rs->generator_roots); + polynomial_destroy(rs->encoded_polynomial); + polynomial_destroy(rs->encoded_remainder); + if (rs->has_init_decode) { + free(rs->syndromes); + free(rs->modified_syndromes); + polynomial_destroy(rs->received_polynomial); + polynomial_destroy(rs->error_locator); + polynomial_destroy(rs->error_locator_log); + polynomial_destroy(rs->erasure_locator); + free(rs->error_roots); + free(rs->error_vals); + free(rs->error_locations); + polynomial_destroy(rs->last_error_locator); + polynomial_destroy(rs->error_evaluator); + polynomial_destroy(rs->error_locator_derivative); + for (unsigned int i = 0; i < rs->min_distance; i++) { + free(rs->generator_root_exp[i]); + } + free(rs->generator_root_exp); + for (field_operation_t i = 0; i < 256; i++) { + free(rs->element_exp[i]); + } + free(rs->element_exp); + polynomial_destroy(rs->init_from_roots_scratch[0]); + polynomial_destroy(rs->init_from_roots_scratch[1]); + } + free(rs); +} + +void correct_reed_solomon_debug_print(correct_reed_solomon *rs) { + for (unsigned int i = 0; i < 256; i++) { + printf("%3d %3d %3d %3d\n", i, rs->field.exp[i], i, rs->field.log[i]); + } + printf("\n"); + + printf("roots: "); + for (unsigned int i = 0; i < rs->min_distance; i++) { + printf("%d", rs->generator_roots[i]); + if (i < rs->min_distance - 1) { + printf(", "); + } + } + printf("\n\n"); + + printf("generator: "); + for (unsigned int i = 0; i < rs->generator.order + 1; i++) { + printf("%d*x^%d", rs->generator.coeff[i], i); + if (i < rs->generator.order) { + printf(" + "); + } + } + printf("\n\n"); + + printf("generator (alpha format): "); + for (unsigned int i = rs->generator.order + 1; i > 0; i--) { + printf("alpha^%d*x^%d", rs->field.log[rs->generator.coeff[i - 1]], i - 1); + if (i > 1) { + printf(" + "); + } + } + printf("\n\n"); + + printf("remainder: "); + bool has_printed = false; + for (unsigned int i = 0; i < rs->encoded_remainder.order + 1; i++) { + if (!rs->encoded_remainder.coeff[i]) { + continue; + } + if (has_printed) { + printf(" + "); + } + has_printed = true; + printf("%d*x^%d", rs->encoded_remainder.coeff[i], i); + } + printf("\n\n"); + + printf("syndromes: "); + for (unsigned int i = 0; i < rs->min_distance; i++) { + printf("%d", rs->syndromes[i]); + if (i < rs->min_distance - 1) { + printf(", "); + } + } + printf("\n\n"); + + printf("numerrors: %d\n\n", rs->error_locator.order); + + printf("error locator: "); + has_printed = false; + for (unsigned int i = 0; i < rs->error_locator.order + 1; i++) { + if (!rs->error_locator.coeff[i]) { + continue; + } + if (has_printed) { + printf(" + "); + } + has_printed = true; + printf("%d*x^%d", rs->error_locator.coeff[i], i); + } + printf("\n\n"); + + printf("error roots: "); + for (unsigned int i = 0; i < rs->error_locator.order; i++) { + printf("%d@%d", polynomial_eval(rs->field, rs->error_locator, rs->error_roots[i]), rs->error_roots[i]); + if (i < rs->error_locator.order - 1) { + printf(", "); + } + } + printf("\n\n"); + + printf("error evaluator: "); + has_printed = false; + for (unsigned int i = 0; i < rs->error_evaluator.order; i++) { + if (!rs->error_evaluator.coeff[i]) { + continue; + } + if (has_printed) { + printf(" + "); + } + has_printed = true; + printf("%d*x^%d", rs->error_evaluator.coeff[i], i); + } + printf("\n\n"); + + printf("error locator derivative: "); + has_printed = false; + for (unsigned int i = 0; i < rs->error_locator_derivative.order; i++) { + if (!rs->error_locator_derivative.coeff[i]) { + continue; + } + if (has_printed) { + printf(" + "); + } + has_printed = true; + printf("%d*x^%d", rs->error_locator_derivative.coeff[i], i); + } + printf("\n\n"); + + printf("error locator: "); + for (unsigned int i = 0; i < rs->error_locator.order; i++) { + printf("%d@%d", rs->error_vals[i], rs->error_locations[i]); + if (i < rs->error_locator.order - 1) { + printf(", "); + } + } + printf("\n\n"); +} diff --git a/libcorrect/tests/CMakeLists.txt b/libcorrect/tests/CMakeLists.txt new file mode 100644 index 0000000..b35e5f9 --- /dev/null +++ b/libcorrect/tests/CMakeLists.txt @@ -0,0 +1,54 @@ +include_directories("include") + + +add_executable(convolutional_test_runner EXCLUDE_FROM_ALL convolutional.c $) +target_link_libraries(convolutional_test_runner correct_static "${LIBM}") +set_target_properties(convolutional_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") +add_test(NAME convolutional_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND convolutional_test_runner) +set(all_test_runners ${all_test_runners} convolutional_test_runner) + +if(HAVE_SSE) + add_executable(convolutional_sse_test_runner EXCLUDE_FROM_ALL convolutional-sse.c $) + target_link_libraries(convolutional_sse_test_runner correct_static "${LIBM}") + set_target_properties(convolutional_sse_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") + add_test(NAME convolutional_sse_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND convolutional_sse_test_runner) + set(all_test_runners ${all_test_runners} convolutional_sse_test_runner) +endif() + +if(HAVE_LIBFEC) + add_executable(convolutional_fec_test_runner EXCLUDE_FROM_ALL convolutional-fec.c $) + target_link_libraries(convolutional_fec_test_runner correct_static FEC "${LIBM}") + set_target_properties(convolutional_fec_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") + add_test(NAME convolutional_fec_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND convolutional_fec_test_runner) + set(all_test_runners ${all_test_runners} convolutional_fec_test_runner) +endif() + +add_executable(convolutional_shim_test_runner EXCLUDE_FROM_ALL convolutional-shim.c $) +target_link_libraries(convolutional_shim_test_runner correct_static fec_shim_static "${LIBM}") +set_target_properties(convolutional_shim_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") +add_test(NAME convolutional_shim_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND convolutional_shim_test_runner) +set(all_test_runners ${all_test_runners} convolutional_shim_test_runner) + +add_executable(reed_solomon_test_runner EXCLUDE_FROM_ALL reed-solomon.c rs_tester.c) +target_link_libraries(reed_solomon_test_runner correct_static "${LIBM}") +set_target_properties(reed_solomon_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") +add_test(NAME reed_solomon_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND reed_solomon_test_runner) +set(all_test_runners ${all_test_runners} reed_solomon_test_runner) + +if(HAVE_LIBFEC) + add_executable(reed_solomon_interop_test_runner EXCLUDE_FROM_ALL reed-solomon-fec-interop.c rs_tester.c rs_tester_fec.c) + target_link_libraries(reed_solomon_interop_test_runner correct_static FEC "${LIBM}") + set_target_properties(reed_solomon_interop_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") + add_test(NAME reed_solomon_interop_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND reed_solomon_interop_test_runner) + set(all_test_runners ${all_test_runners} reed_solomon_interop_test_runner) +endif() + +add_executable(reed_solomon_shim_interop_test_runner EXCLUDE_FROM_ALL reed-solomon-shim-interop.c rs_tester.c rs_tester_fec_shim.c) +target_link_libraries(reed_solomon_shim_interop_test_runner correct_static fec_shim_static "${LIBM}") +set_target_properties(reed_solomon_shim_interop_test_runner PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") +add_test(NAME reed_solomon_shim_interop_test WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/tests" COMMAND reed_solomon_shim_interop_test_runner) +set(all_test_runners ${all_test_runners} reed_solomon_shim_interop_test_runner) + +add_custom_target(test_runners DEPENDS ${all_test_runners}) +add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS test_runners) +enable_testing() diff --git a/libcorrect/tests/convolutional-fec.c b/libcorrect/tests/convolutional-fec.c new file mode 100644 index 0000000..f8b40db --- /dev/null +++ b/libcorrect/tests/convolutional-fec.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include + +#include + +#include "correct.h" +#include "correct/util/error-sim-fec.h" + +size_t max_block_len = 4096; + +size_t test_conv(correct_convolutional *conv, void *fec, + void (*decode)(void *, uint8_t *, size_t, uint8_t *), + conv_testbench **testbench_ptr, size_t msg_len, double eb_n0, + double bpsk_bit_energy, double bpsk_voltage) { + uint8_t *msg = malloc(max_block_len); + + size_t num_errors = 0; + + while (msg_len) { + size_t block_len = (max_block_len < msg_len) ? max_block_len : msg_len; + msg_len -= block_len; + + for (unsigned int j = 0; j < block_len; j++) { + msg[j] = rand() % 256; + } + + *testbench_ptr = + resize_conv_testbench(*testbench_ptr, conv_correct_enclen, conv, block_len); + conv_testbench *testbench = *testbench_ptr; + testbench->encoder = conv; + testbench->encode = conv_correct_encode; + testbench->decoder = fec; + testbench->decode = decode; + build_white_noise(testbench->noise, testbench->enclen, eb_n0, bpsk_bit_energy); + num_errors += test_conv_noise(testbench, msg, block_len, bpsk_voltage); + } + free(msg); + return num_errors; +} + +void assert_test_result(correct_convolutional *conv, void *fec, + void (*decode)(void *, uint8_t *, size_t, uint8_t *), + conv_testbench **testbench, size_t test_length, size_t rate, size_t order, + double eb_n0, double error_rate) { + double bpsk_voltage = 1.0 / sqrt(2.0); + double bpsk_sym_energy = 2 * pow(bpsk_voltage, 2.0); + double bpsk_bit_energy = bpsk_sym_energy * rate; + + size_t error_count = + test_conv(conv, fec, decode, testbench, test_length, eb_n0, bpsk_bit_energy, bpsk_voltage); + double observed_error_rate = error_count / ((double)test_length * 8); + if (observed_error_rate > error_rate) { + printf( + "test failed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu " + "order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + exit(1); + } else { + printf( + "test passed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu " + "order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + } +} + +int main() { + srand(time(NULL)); + + conv_testbench *testbench = NULL; + + correct_convolutional *conv; + void *fec; + uint16_t *poly; + + poly = (uint16_t[]){V27POLYA, V27POLYB}; + conv = correct_convolutional_create(2, 7, poly); + fec = create_viterbi27(8 * max_block_len); + assert_test_result(conv, fec, conv_fec27_decode, &testbench, 1000000, 2, 6, INFINITY, 0); + assert_test_result(conv, fec, conv_fec27_decode, &testbench, 1000000, 2, 6, 4.5, 8e-06); + assert_test_result(conv, fec, conv_fec27_decode, &testbench, 1000000, 2, 6, 4.0, 5e-05); + delete_viterbi27(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + poly = (uint16_t[]){V29POLYA, V29POLYB}; + conv = correct_convolutional_create(2, 9, poly); + fec = create_viterbi29(8 * max_block_len); + assert_test_result(conv, fec, conv_fec29_decode, &testbench, 1000000, 2, 9, INFINITY, 0); + assert_test_result(conv, fec, conv_fec29_decode, &testbench, 1000000, 2, 9, 4.5, 3e-06); + assert_test_result(conv, fec, conv_fec29_decode, &testbench, 1000000, 2, 9, 4.0, 8e-06); + delete_viterbi29(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + poly = (uint16_t[]){V39POLYA, V39POLYB, V39POLYC}; + conv = correct_convolutional_create(3, 9, poly); + fec = create_viterbi39(8 * max_block_len); + assert_test_result(conv, fec, conv_fec39_decode, &testbench, 1000000, 3, 9, INFINITY, 0); + assert_test_result(conv, fec, conv_fec39_decode, &testbench, 1000000, 3, 9, 4.5, 3e-06); + assert_test_result(conv, fec, conv_fec39_decode, &testbench, 1000000, 3, 9, 4.0, 5e-06); + delete_viterbi39(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + poly = (uint16_t[]){V615POLYA, V615POLYB, V615POLYC, V615POLYD, V615POLYE, V615POLYF}; + conv = correct_convolutional_create(6, 15, poly); + fec = create_viterbi615(8 * max_block_len); + assert_test_result(conv, fec, conv_fec615_decode, &testbench, 100000, 6, 15, INFINITY, 0); + assert_test_result(conv, fec, conv_fec615_decode, &testbench, 100000, 6, 15, 3.0, 3e-06); + assert_test_result(conv, fec, conv_fec615_decode, &testbench, 100000, 6, 15, 2.5, 1e-05); + delete_viterbi615(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + free_scratch(testbench); + return 0; +} diff --git a/libcorrect/tests/convolutional-shim.c b/libcorrect/tests/convolutional-shim.c new file mode 100644 index 0000000..7a19227 --- /dev/null +++ b/libcorrect/tests/convolutional-shim.c @@ -0,0 +1,122 @@ +#include +#include +#include +#include + +#include "correct.h" +#include "fec_shim.h" +#include "correct/util/error-sim-shim.h" + +size_t max_block_len = 4096; + +size_t test_conv(correct_convolutional *conv, void *fec, + ssize_t (*decode)(void *, uint8_t *, size_t, uint8_t *), + conv_testbench **testbench_ptr, size_t msg_len, double eb_n0, + double bpsk_bit_energy, double bpsk_voltage) { + uint8_t *msg = malloc(max_block_len); + + size_t num_errors = 0; + + while (msg_len) { + size_t block_len = (max_block_len < msg_len) ? max_block_len : msg_len; + msg_len -= block_len; + + for (unsigned int j = 0; j < block_len; j++) { + msg[j] = rand() % 256; + } + + *testbench_ptr = + resize_conv_testbench(*testbench_ptr, conv_correct_enclen, conv, block_len); + conv_testbench *testbench = *testbench_ptr; + testbench->encoder = conv; + testbench->encode = conv_correct_encode; + testbench->decoder = fec; + testbench->decode = decode; + build_white_noise(testbench->noise, testbench->enclen, eb_n0, bpsk_bit_energy); + num_errors += test_conv_noise(testbench, msg, block_len, bpsk_voltage); + } + free(msg); + return num_errors; +} + +void assert_test_result(correct_convolutional *conv, void *fec, + ssize_t (*decode)(void *, uint8_t *, size_t, uint8_t *), + conv_testbench **testbench, size_t test_length, size_t rate, size_t order, + double eb_n0, double error_rate) { + double bpsk_voltage = 1.0 / sqrt(2.0); + double bpsk_sym_energy = 2 * pow(bpsk_voltage, 2.0); + double bpsk_bit_energy = bpsk_sym_energy * rate; + + size_t error_count = + test_conv(conv, fec, decode, testbench, test_length, eb_n0, bpsk_bit_energy, bpsk_voltage); + double observed_error_rate = error_count / ((double)test_length * 8); + if (observed_error_rate > error_rate) { + printf( + "test failed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu " + "order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + exit(1); + } else { + printf( + "test passed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu " + "order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + } +} + +int main() { + srand(time(NULL)); + + conv_testbench *testbench = NULL; + + correct_convolutional *conv; + void *fec; + uint16_t *poly; + + poly = (uint16_t[]){V27POLYA, V27POLYB}; + conv = correct_convolutional_create(2, 7, poly); + fec = create_viterbi27(8 * max_block_len); + assert_test_result(conv, fec, conv_shim27_decode, &testbench, 1000000, 2, 6, INFINITY, 0); + assert_test_result(conv, fec, conv_shim27_decode, &testbench, 1000000, 2, 6, 4.5, 8e-06); + assert_test_result(conv, fec, conv_shim27_decode, &testbench, 1000000, 2, 6, 4.0, 5e-05); + delete_viterbi27(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + poly = (uint16_t[]){V29POLYA, V29POLYB}; + conv = correct_convolutional_create(2, 9, poly); + fec = create_viterbi29(8 * max_block_len); + assert_test_result(conv, fec, conv_shim29_decode, &testbench, 1000000, 2, 9, INFINITY, 0); + assert_test_result(conv, fec, conv_shim29_decode, &testbench, 1000000, 2, 9, 4.5, 3e-06); + assert_test_result(conv, fec, conv_shim29_decode, &testbench, 1000000, 2, 9, 4.0, 8e-06); + delete_viterbi29(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + poly = (uint16_t[]){V39POLYA, V39POLYB, V39POLYC}; + conv = correct_convolutional_create(3, 9, poly); + fec = create_viterbi39(8 * max_block_len); + assert_test_result(conv, fec, conv_shim39_decode, &testbench, 1000000, 3, 9, INFINITY, 0); + assert_test_result(conv, fec, conv_shim39_decode, &testbench, 1000000, 3, 9, 4.5, 3e-06); + assert_test_result(conv, fec, conv_shim39_decode, &testbench, 1000000, 3, 9, 4.0, 9e-06); + delete_viterbi39(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + poly = (uint16_t[]){V615POLYA, V615POLYB, V615POLYC, V615POLYD, V615POLYE, V615POLYF}; + conv = correct_convolutional_create(6, 15, poly); + fec = create_viterbi615(8 * max_block_len); + assert_test_result(conv, fec, conv_shim615_decode, &testbench, 100000, 6, 15, INFINITY, 0); + assert_test_result(conv, fec, conv_shim615_decode, &testbench, 100000, 6, 15, 3.0, 2e-05); + assert_test_result(conv, fec, conv_shim615_decode, &testbench, 100000, 6, 15, 2.5, 4e-05); + delete_viterbi615(fec); + correct_convolutional_destroy(conv); + + printf("\n"); + + free_scratch(testbench); + return 0; +} diff --git a/libcorrect/tests/convolutional-sse.c b/libcorrect/tests/convolutional-sse.c new file mode 100644 index 0000000..fb2185e --- /dev/null +++ b/libcorrect/tests/convolutional-sse.c @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +#include "correct/util/error-sim-sse.h" + +size_t max_block_len = 4096; + +size_t test_conv(correct_convolutional_sse *conv, conv_testbench **testbench_ptr, + size_t msg_len, double eb_n0, double bpsk_bit_energy, + double bpsk_voltage) { + uint8_t *msg = malloc(max_block_len); + + size_t num_errors = 0; + + while (msg_len) { + size_t block_len = (max_block_len < msg_len) ? max_block_len : msg_len; + msg_len -= block_len; + + for (unsigned int j = 0; j < block_len; j++) { + msg[j] = rand() % 256; + } + + *testbench_ptr = resize_conv_testbench(*testbench_ptr, conv_correct_sse_enclen, conv, block_len); + conv_testbench *testbench = *testbench_ptr; + testbench->encoder = conv; + testbench->encode = conv_correct_sse_encode; + testbench->decoder = conv; + testbench->decode = conv_correct_sse_decode; + build_white_noise(testbench->noise, testbench->enclen, eb_n0, bpsk_bit_energy); + num_errors += test_conv_noise(testbench, msg, block_len, bpsk_voltage); + } + free(msg); + return num_errors; +} + +void assert_test_result(correct_convolutional_sse *conv, conv_testbench **testbench, + size_t test_length, size_t rate, size_t order, double eb_n0, double error_rate) { + double bpsk_voltage = 1.0/sqrt(2.0); + double bpsk_sym_energy = 2*pow(bpsk_voltage, 2.0); + double bpsk_bit_energy = bpsk_sym_energy * rate; + + size_t error_count = test_conv(conv, testbench, test_length, eb_n0, bpsk_bit_energy, bpsk_voltage); + double observed_error_rate = error_count/((double)test_length * 8); + if (observed_error_rate > error_rate) { + printf("test failed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + exit(1); + } else { + printf("test passed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + } +} + +int main() { + srand(time(NULL)); + + conv_testbench *testbench = NULL; + + correct_convolutional_sse *conv; + + // n.b. the error rates below are at 5.0dB/4.5dB for order 6 polys + // and 4.5dB/4.0dB for order 7-9 polys. this can be easy to miss. + + conv = correct_convolutional_sse_create(2, 6, correct_conv_r12_6_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 6, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 6, 5.0, 8e-06); + assert_test_result(conv, &testbench, 1000000, 2, 6, 4.5, 3e-05); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(2, 7, correct_conv_r12_7_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 7, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 7, 4.5, 1e-05); + assert_test_result(conv, &testbench, 1000000, 2, 7, 4.0, 5e-05); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(2, 8, correct_conv_r12_8_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 8, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 8, 4.5, 5e-06); + assert_test_result(conv, &testbench, 1000000, 2, 8, 4.0, 3e-05); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(2, 9, correct_conv_r12_9_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 9, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 9, 4.5, 3e-06); + assert_test_result(conv, &testbench, 1000000, 2, 9, 4.0, 8e-06); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(3, 6, correct_conv_r13_6_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 6, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 6, 5.0, 5e-06); + assert_test_result(conv, &testbench, 1000000, 3, 6, 4.5, 2e-05); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(3, 7, correct_conv_r13_7_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 7, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 7, 4.5, 5e-06); + assert_test_result(conv, &testbench, 1000000, 3, 7, 4.0, 3e-05); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(3, 8, correct_conv_r13_8_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 8, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 8, 4.5, 4e-06); + assert_test_result(conv, &testbench, 1000000, 3, 8, 4.0, 1e-05); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_sse_create(3, 9, correct_conv_r13_9_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 9, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 9, 4.5, 3e-06); + assert_test_result(conv, &testbench, 1000000, 3, 9, 4.0, 5e-06); + correct_convolutional_sse_destroy(conv); + + printf("\n"); + + free_scratch(testbench); + return 0; +} diff --git a/libcorrect/tests/convolutional.c b/libcorrect/tests/convolutional.c new file mode 100644 index 0000000..4e58dd5 --- /dev/null +++ b/libcorrect/tests/convolutional.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include + +#include "correct.h" +#include "correct/util/error-sim.h" + +size_t max_block_len = 4096; + +size_t test_conv(correct_convolutional *conv, conv_testbench **testbench_ptr, + size_t msg_len, double eb_n0, double bpsk_bit_energy, + double bpsk_voltage) { + uint8_t *msg = malloc(max_block_len); + + size_t num_errors = 0; + + while (msg_len) { + size_t block_len = (max_block_len < msg_len) ? max_block_len : msg_len; + msg_len -= block_len; + + for (unsigned int j = 0; j < block_len; j++) { + msg[j] = rand() % 256; + } + + *testbench_ptr = resize_conv_testbench(*testbench_ptr, conv_correct_enclen, conv, block_len); + conv_testbench *testbench = *testbench_ptr; + testbench->encoder = conv; + testbench->encode = conv_correct_encode; + testbench->decoder = conv; + testbench->decode = conv_correct_decode; + build_white_noise(testbench->noise, testbench->enclen, eb_n0, bpsk_bit_energy); + num_errors += test_conv_noise(testbench, msg, block_len, bpsk_voltage); + } + free(msg); + return num_errors; +} + +void assert_test_result(correct_convolutional *conv, conv_testbench **testbench, + size_t test_length, size_t rate, size_t order, double eb_n0, double error_rate) { + double bpsk_voltage = 1.0/sqrt(2.0); + double bpsk_sym_energy = 2*pow(bpsk_voltage, 2.0); + double bpsk_bit_energy = bpsk_sym_energy * rate; + + size_t error_count = test_conv(conv, testbench, test_length, eb_n0, bpsk_bit_energy, bpsk_voltage); + double observed_error_rate = error_count/((double)test_length * 8); + if (observed_error_rate > error_rate) { + printf("test failed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + exit(1); + } else { + printf("test passed, expected error rate=%.2e, observed error rate=%.2e @%.1fdB for rate %zu order %zu\n", + error_rate, observed_error_rate, eb_n0, rate, order); + } +} + +int main() { + srand(time(NULL)); + + conv_testbench *testbench = NULL; + + correct_convolutional *conv; + + // n.b. the error rates below are at 5.0dB/4.5dB for order 6 polys + // and 4.5dB/4.0dB for order 7-9 polys. this can be easy to miss. + + conv = correct_convolutional_create(2, 6, correct_conv_r12_6_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 6, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 6, 5.0, 5e-06); + assert_test_result(conv, &testbench, 1000000, 2, 6, 4.5, 3e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(2, 7, correct_conv_r12_7_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 7, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 7, 4.5, 1e-05); + assert_test_result(conv, &testbench, 1000000, 2, 7, 4.0, 5e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(2, 8, correct_conv_r12_8_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 8, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 8, 4.5, 5e-06); + assert_test_result(conv, &testbench, 1000000, 2, 8, 4.0, 3e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(2, 9, correct_conv_r12_9_polynomial); + assert_test_result(conv, &testbench, 1000000, 2, 9, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 2, 9, 4.5, 3e-06); + assert_test_result(conv, &testbench, 1000000, 2, 9, 4.0, 1e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(3, 6, correct_conv_r13_6_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 6, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 6, 5.0, 5e-06); + assert_test_result(conv, &testbench, 1000000, 3, 6, 4.5, 2e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(3, 7, correct_conv_r13_7_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 7, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 7, 4.5, 5e-06); + assert_test_result(conv, &testbench, 1000000, 3, 7, 4.0, 3e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(3, 8, correct_conv_r13_8_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 8, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 8, 4.5, 4e-06); + assert_test_result(conv, &testbench, 1000000, 3, 8, 4.0, 1e-05); + correct_convolutional_destroy(conv); + + printf("\n"); + + conv = correct_convolutional_create(3, 9, correct_conv_r13_9_polynomial); + assert_test_result(conv, &testbench, 1000000, 3, 9, INFINITY, 0); + assert_test_result(conv, &testbench, 1000000, 3, 9, 4.5, 3e-06); + assert_test_result(conv, &testbench, 1000000, 3, 9, 4.0, 5e-06); + correct_convolutional_destroy(conv); + + printf("\n"); + + free_scratch(testbench); + return 0; +} diff --git a/libcorrect/tests/include/rs_tester.h b/libcorrect/tests/include/rs_tester.h new file mode 100644 index 0000000..95143ad --- /dev/null +++ b/libcorrect/tests/include/rs_tester.h @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +#include "correct.h" + +void rs_correct_encode(void *encoder, uint8_t *msg, size_t msg_length, + uint8_t *msg_out); +void rs_correct_decode(void *decoder, uint8_t *encoded, size_t encoded_length, + uint8_t *erasure_locations, size_t erasure_length, + uint8_t *msg, size_t pad_length, size_t num_roots); + +typedef struct { + size_t block_length; + size_t message_length; + size_t min_distance; + unsigned char *msg; + uint8_t *encoded; + int *indices; + uint8_t *corrupted_encoded; + uint8_t *erasure_locations; + unsigned char *recvmsg; +} rs_testbench; + +typedef struct { + void (*encode)(void *, uint8_t *, size_t, uint8_t *); + void *encoder; + void (*decode)(void *, uint8_t *, size_t, uint8_t *, size_t, uint8_t *, size_t, size_t); + void *decoder; +} rs_test; + +rs_testbench *rs_testbench_create(size_t block_length, size_t min_distance); +void rs_testbench_destroy(rs_testbench *testbench); + +typedef struct { + bool output_matches; +} rs_test_run; + +rs_test_run test_rs_errors(rs_test *test, rs_testbench *testbench, size_t msg_length, + size_t num_errors, size_t num_erasures); diff --git a/libcorrect/tests/include/rs_tester_fec.h b/libcorrect/tests/include/rs_tester_fec.h new file mode 100644 index 0000000..99264a0 --- /dev/null +++ b/libcorrect/tests/include/rs_tester_fec.h @@ -0,0 +1,10 @@ +#include +#include +#include +#include +#include +void rs_fec_encode(void *encoder, uint8_t *msg, size_t msg_length, + uint8_t *msg_out); +void rs_fec_decode(void *decoder, uint8_t *encoded, size_t encoded_length, + uint8_t *erasure_locations, size_t erasure_length, + uint8_t *msg, size_t pad_length, size_t num_roots); diff --git a/libcorrect/tests/include/rs_tester_fec_shim.h b/libcorrect/tests/include/rs_tester_fec_shim.h new file mode 100644 index 0000000..d81c4cd --- /dev/null +++ b/libcorrect/tests/include/rs_tester_fec_shim.h @@ -0,0 +1,10 @@ +#include +#include +#include +#include +#include "fec_shim.h" +void rs_fec_encode(void *encoder, uint8_t *msg, size_t msg_length, + uint8_t *msg_out); +void rs_fec_decode(void *decoder, uint8_t *encoded, size_t encoded_length, + uint8_t *erasure_locations, size_t erasure_length, + uint8_t *msg, size_t pad_length, size_t num_roots); diff --git a/libcorrect/tests/reed-solomon-fec-interop.c b/libcorrect/tests/reed-solomon-fec-interop.c new file mode 100644 index 0000000..c9f217b --- /dev/null +++ b/libcorrect/tests/reed-solomon-fec-interop.c @@ -0,0 +1,138 @@ +#include +#include +#include +#include +#include + +#include "rs_tester.h" +#include "rs_tester_fec.h" + +void print_test_type(size_t block_length, size_t message_length, + size_t num_errors, size_t num_erasures) { + printf( + "testing reed solomon block length=%zu, message length=%zu, " + "errors=%zu, erasures=%zu...", + block_length, message_length, num_errors, num_erasures); +} + +void fail_test() { + printf("FAILED\n"); + exit(1); +} + +void pass_test() { printf("PASSED\n"); } + +void run_tests(correct_reed_solomon *rs, void *fec_rs, rs_testbench *testbench, + size_t block_length, size_t test_msg_length, size_t num_errors, + size_t num_erasures, size_t num_iterations) { + // run both ways, correct->fec and fec->correct + rs_test test; + test.encode = rs_correct_encode; + test.encoder = rs; + test.decode = rs_fec_decode; + test.decoder = fec_rs; + + print_test_type(block_length, test_msg_length, num_errors, num_erasures); + for (size_t i = 0; i < num_iterations; i++) { + rs_test_run run = test_rs_errors(&test, testbench, test_msg_length, + num_errors, num_erasures); + if (!run.output_matches) { + fail_test(); + } + } + + test.encode = rs_fec_encode; + test.encoder = fec_rs; + test.decode = rs_correct_decode; + test.decoder = rs; + for (size_t i = 0; i < num_iterations; i++) { + rs_test_run run = test_rs_errors(&test, testbench, test_msg_length, + num_errors, num_erasures); + if (!run.output_matches) { + fail_test(); + } + } + pass_test(); +} + +int main() { + srand(time(NULL)); + + size_t block_length = 255; + size_t min_distance = 32; + size_t message_length = block_length - min_distance; + + size_t pad_length; + void *fec_rs; + + correct_reed_solomon *rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + rs_testbench *testbench = rs_testbench_create(block_length, min_distance); + + pad_length = message_length / 2; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + pad_length = 0; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + min_distance = 16; + message_length = block_length - min_distance; + rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + testbench = rs_testbench_create(block_length, min_distance); + + pad_length = message_length / 2; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + pad_length = 0; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + printf("test passed\n"); + return 0; +} diff --git a/libcorrect/tests/reed-solomon-shim-interop.c b/libcorrect/tests/reed-solomon-shim-interop.c new file mode 100644 index 0000000..9ee52fc --- /dev/null +++ b/libcorrect/tests/reed-solomon-shim-interop.c @@ -0,0 +1,138 @@ +#include +#include +#include +#include +#include + +#include "rs_tester.h" +#include "rs_tester_fec_shim.h" + +void print_test_type(size_t block_length, size_t message_length, + size_t num_errors, size_t num_erasures) { + printf( + "testing reed solomon block length=%zu, message length=%zu, " + "errors=%zu, erasures=%zu...", + block_length, message_length, num_errors, num_erasures); +} + +void fail_test() { + printf("FAILED\n"); + exit(1); +} + +void pass_test() { printf("PASSED\n"); } + +void run_tests(correct_reed_solomon *rs, void *fec_rs, rs_testbench *testbench, + size_t block_length, size_t test_msg_length, size_t num_errors, + size_t num_erasures, size_t num_iterations) { + // run both ways, correct->fec and fec->correct + rs_test test; + test.encode = rs_correct_encode; + test.encoder = rs; + test.decode = rs_fec_decode; + test.decoder = fec_rs; + + print_test_type(block_length, test_msg_length, num_errors, num_erasures); + for (size_t i = 0; i < num_iterations; i++) { + rs_test_run run = test_rs_errors(&test, testbench, test_msg_length, num_errors, + num_erasures); + if (!run.output_matches) { + fail_test(); + } + } + + test.encode = rs_fec_encode; + test.encoder = fec_rs; + test.decode = rs_correct_decode; + test.decoder = rs; + for (size_t i = 0; i < num_iterations; i++) { + rs_test_run run = test_rs_errors(&test, testbench, test_msg_length, num_errors, + num_erasures); + if (!run.output_matches) { + fail_test(); + } + } + pass_test(); +} + +int main() { + srand(time(NULL)); + + size_t block_length = 255; + size_t min_distance = 32; + size_t message_length = block_length - min_distance; + + size_t pad_length; + void *fec_rs; + + correct_reed_solomon *rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + rs_testbench *testbench = rs_testbench_create(block_length, min_distance); + + pad_length = message_length / 2; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + pad_length = 0; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + min_distance = 16; + message_length = block_length - min_distance; + rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + testbench = rs_testbench_create(block_length, min_distance); + + pad_length = message_length / 2; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + pad_length = 0; + fec_rs = init_rs_char(8, correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance, + pad_length); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 2, 0, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + 0, min_distance, 20000); + run_tests(rs, fec_rs, testbench, block_length, message_length - pad_length, + min_distance / 4, min_distance / 2, 20000); + free_rs_char(fec_rs); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + printf("test passed\n"); + return 0; +} diff --git a/libcorrect/tests/reed-solomon.c b/libcorrect/tests/reed-solomon.c new file mode 100644 index 0000000..1615c50 --- /dev/null +++ b/libcorrect/tests/reed-solomon.c @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include + +#include "rs_tester.h" + +void print_test_type(size_t block_length, size_t message_length, + size_t num_errors, size_t num_erasures) { + printf( + "testing reed solomon block length=%zu, message length=%zu, " + "errors=%zu, erasures=%zu...", + block_length, message_length, num_errors, num_erasures); +} + +void fail_test() { + printf("FAILED\n"); + exit(1); +} + +void pass_test() { printf("PASSED\n"); } + +void run_tests(correct_reed_solomon *rs, rs_testbench *testbench, + size_t block_length, size_t test_msg_length, size_t num_errors, + size_t num_erasures, size_t num_iterations) { + rs_test test; + test.encode = rs_correct_encode; + test.decode = rs_correct_decode; + test.encoder = rs; + test.decoder = rs; + print_test_type(block_length, test_msg_length, num_errors, num_erasures); + for (size_t i = 0; i < num_iterations; i++) { + rs_test_run run = test_rs_errors(&test, testbench, test_msg_length, num_errors, + num_erasures); + if (!run.output_matches) { + fail_test(); + } + } + pass_test(); +} + +int main() { + srand(time(NULL)); + + size_t block_length = 255; + size_t min_distance = 32; + size_t message_length = block_length - min_distance; + + correct_reed_solomon *rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + rs_testbench *testbench = rs_testbench_create(block_length, min_distance); + + run_tests(rs, testbench, block_length, message_length / 2, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 2, + 0, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 2, 0, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 4, + min_distance / 2, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 4, + min_distance / 2, 20000); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + min_distance = 16; + message_length = block_length - min_distance; + rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + testbench = rs_testbench_create(block_length, min_distance); + + run_tests(rs, testbench, block_length, message_length / 2, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 2, + 0, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 2, 0, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 4, + min_distance / 2, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 4, + min_distance / 2, 20000); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + min_distance = 8; + message_length = block_length - min_distance; + rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + testbench = rs_testbench_create(block_length, min_distance); + + run_tests(rs, testbench, block_length, message_length / 2, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 2, + 0, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 2, 0, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 4, + min_distance / 2, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 4, + min_distance / 2, 20000); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + min_distance = 4; + message_length = block_length - min_distance; + rs = correct_reed_solomon_create( + correct_rs_primitive_polynomial_ccsds, 1, 1, min_distance); + testbench = rs_testbench_create(block_length, min_distance); + + run_tests(rs, testbench, block_length, message_length / 2, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length, 0, 0, 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 2, + 0, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 2, 0, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length, 0, min_distance, + 20000); + run_tests(rs, testbench, block_length, message_length / 2, min_distance / 4, + min_distance / 2, 20000); + run_tests(rs, testbench, block_length, message_length, min_distance / 4, + min_distance / 2, 20000); + + rs_testbench_destroy(testbench); + correct_reed_solomon_destroy(rs); + + printf("test passed\n"); + return 0; +} diff --git a/libcorrect/tests/rs_tester.c b/libcorrect/tests/rs_tester.c new file mode 100644 index 0000000..217bd42 --- /dev/null +++ b/libcorrect/tests/rs_tester.c @@ -0,0 +1,102 @@ +#include "rs_tester.h" + +void shuffle(int *a, size_t len) { + for (size_t i = 0; i < len - 2; i++) { + size_t j = rand() % (len - i) + i; + int temp = a[i]; + a[i] = a[j]; + a[j] = temp; + } +} + +void rs_correct_encode(void *encoder, uint8_t *msg, size_t msg_length, + uint8_t *msg_out) { + correct_reed_solomon_encode((correct_reed_solomon *)encoder, msg, + msg_length, msg_out); +} + +void rs_correct_decode(void *decoder, uint8_t *encoded, size_t encoded_length, + uint8_t *erasure_locations, size_t erasure_length, + uint8_t *msg, size_t pad_length, size_t num_roots) { + correct_reed_solomon_decode_with_erasures( + (correct_reed_solomon *)decoder, encoded, encoded_length, + erasure_locations, erasure_length, msg); +} + +rs_testbench *rs_testbench_create(size_t block_length, size_t min_distance) { + rs_testbench *testbench = calloc(1, sizeof(rs_testbench)); + + size_t message_length = block_length - min_distance; + testbench->message_length = message_length; + testbench->block_length = block_length; + testbench->min_distance = min_distance; + + testbench->msg = calloc(message_length, sizeof(unsigned char)); + testbench->encoded = malloc(block_length * sizeof(uint8_t)); + + testbench->indices = malloc(block_length * sizeof(int)); + + testbench->corrupted_encoded = malloc(block_length * sizeof(uint8_t)); + testbench->erasure_locations = malloc(min_distance * sizeof(uint8_t)); + testbench->recvmsg = malloc(sizeof(unsigned char) * message_length); + + return testbench; +} + +void rs_testbench_destroy(rs_testbench *testbench) { + free(testbench->msg); + free(testbench->encoded); + free(testbench->indices); + free(testbench->corrupted_encoded); + free(testbench->erasure_locations); + free(testbench->recvmsg); + free(testbench); +} + +rs_test_run test_rs_errors(rs_test *test, rs_testbench *testbench, size_t msg_length, + size_t num_errors, size_t num_erasures) { + rs_test_run run; + run.output_matches = false; + + if (msg_length > testbench->message_length) { + return run; + } + + for (size_t i = 0; i < msg_length; i++) { + testbench->msg[i] = rand() % 256; + } + + size_t block_length = msg_length + testbench->min_distance; + size_t pad_length = testbench->message_length - msg_length; + + test->encode(test->encoder, testbench->msg, msg_length, testbench->encoded); + + memcpy(testbench->corrupted_encoded, testbench->encoded, block_length); + + for (int i = 0; i < block_length; i++) { + testbench->indices[i] = i; + } + + shuffle(testbench->indices, block_length); + + for (unsigned int i = 0; i < num_erasures; i++) { + int index = testbench->indices[i]; + uint8_t corruption_mask = (rand() % 255) + 1; + testbench->corrupted_encoded[index] ^= corruption_mask; + testbench->erasure_locations[i] = index; + } + + for (unsigned int i = 0; i < num_errors; i++) { + int index = testbench->indices[i + num_erasures]; + uint8_t corruption_mask = (rand() % 255) + 1; + testbench->corrupted_encoded[index] ^= corruption_mask; + } + + test->decode(test->decoder, testbench->corrupted_encoded, block_length, + testbench->erasure_locations, num_erasures, + testbench->recvmsg, pad_length, testbench->min_distance); + + run.output_matches = (bool)(memcmp(testbench->msg, testbench->recvmsg, msg_length) == 0); + + return run; +} diff --git a/libcorrect/tests/rs_tester_fec.c b/libcorrect/tests/rs_tester_fec.c new file mode 100644 index 0000000..dcb49f6 --- /dev/null +++ b/libcorrect/tests/rs_tester_fec.c @@ -0,0 +1,30 @@ +#include "rs_tester_fec.h" +void rs_fec_encode(void *encoder, uint8_t *msg, size_t msg_length, + uint8_t *msg_out) { + // XXX make sure that pad length used to build encoder corresponds to this + // msg_length + memcpy(msg_out, msg, msg_length); + encode_rs_char(encoder, msg_out, msg_out + msg_length); +} + +void rs_fec_decode(void *decoder, uint8_t *encoded, size_t encoded_length, + uint8_t *erasure_locations, size_t erasure_length, + uint8_t *msg, size_t pad_length, size_t num_roots) { + // XXX make sure that pad length used to build decoder corresponds to this + // encoded_length + if (erasure_length) { + static size_t locations_len = 0; + static int *locations = NULL; + if (locations_len < erasure_length) { + locations = realloc(locations, erasure_length * sizeof(int)); + locations_len = erasure_length; + } + for (size_t i = 0; i < erasure_length; i++) { + locations[i] = (unsigned int)(erasure_locations[i]) + pad_length; + } + decode_rs_char(decoder, encoded, locations, erasure_length); + } else { + decode_rs_char(decoder, encoded, NULL, 0); + } + memcpy(msg, encoded, encoded_length - num_roots); +} diff --git a/libcorrect/tests/rs_tester_fec_shim.c b/libcorrect/tests/rs_tester_fec_shim.c new file mode 100644 index 0000000..3e49a69 --- /dev/null +++ b/libcorrect/tests/rs_tester_fec_shim.c @@ -0,0 +1,26 @@ +#include "rs_tester_fec_shim.h" +void rs_fec_encode(void *encoder, uint8_t *msg, size_t msg_length, + uint8_t *msg_out) { + // XXX make sure that pad length used to build encoder corresponds to this + // msg_length + memcpy(msg_out, msg, msg_length); + encode_rs_char(encoder, msg_out, msg_out + msg_length); +} + +void rs_fec_decode(void *decoder, uint8_t *encoded, size_t encoded_length, + uint8_t *erasure_locations, size_t erasure_length, + uint8_t *msg, size_t pad_length, size_t num_roots) { + // XXX make sure that pad length used to build decoder corresponds to this + // encoded_length + if (erasure_length) { + int *locations = malloc(erasure_length * sizeof(int)); + for (size_t i = 0; i < erasure_length; i++) { + locations[i] = (unsigned int)(erasure_locations[i]) + pad_length; + } + decode_rs_char(decoder, encoded, locations, erasure_length); + free(locations); + } else { + decode_rs_char(decoder, encoded, NULL, 0); + } + memcpy(msg, encoded, encoded_length - num_roots); +} diff --git a/libcorrect/tools/CMakeLists.txt b/libcorrect/tools/CMakeLists.txt new file mode 100644 index 0000000..f86990a --- /dev/null +++ b/libcorrect/tools/CMakeLists.txt @@ -0,0 +1,29 @@ +add_executable(rs_find_primitive_poly EXCLUDE_FROM_ALL find_rs_primitive_poly.c) +target_link_libraries(rs_find_primitive_poly correct_static) +set(all_tools ${all_tools} rs_find_primitive_poly) + +if(HAVE_LIBFEC) + add_executable(conv_find_libfec_poly EXCLUDE_FROM_ALL find_conv_libfec_poly.c) + target_link_libraries(conv_find_libfec_poly correct_static fec) + set(all_tools ${all_tools} conv_find_libfec_poly) +endif() + +if(HAVE_SSE) + add_executable(conv_find_optim_poly EXCLUDE_FROM_ALL find_conv_optim_poly.c $) + target_link_libraries(conv_find_optim_poly correct_static) + set(all_tools ${all_tools} conv_find_optim_poly) + + add_executable(conv_find_optim_poly_annealing EXCLUDE_FROM_ALL find_conv_optim_poly_annealing.c $) + target_link_libraries(conv_find_optim_poly_annealing correct_static) + set(all_tools ${all_tools} conv_find_optim_poly_annealing) +else() + add_executable(conv_find_optim_poly EXCLUDE_FROM_ALL find_conv_optim_poly.c $) + target_link_libraries(conv_find_optim_poly correct_static) + set(all_tools ${all_tools} conv_find_optim_poly) + + add_executable(conv_find_optim_poly_annealing EXCLUDE_FROM_ALL find_conv_optim_poly_annealing.c $) + target_link_libraries(conv_find_optim_poly_annealing correct_static) + set(all_tools ${all_tools} conv_find_optim_poly_annealing) +endif() + +add_custom_target(tools DEPENDS ${all_tools}) diff --git a/libcorrect/tools/find_conv_libfec_poly.c b/libcorrect/tools/find_conv_libfec_poly.c new file mode 100644 index 0000000..4d15824 --- /dev/null +++ b/libcorrect/tools/find_conv_libfec_poly.c @@ -0,0 +1,279 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// this program allows us to find all of the polynomials that come with libfec +// this way, we can provide compatibility with libfec-encoded streams and vice versa +// we can do this without directly copy-pasting from libfec's source, thanks +// to this finder + +typedef struct { + void *vit; + int update_len; + int (*init)(void *, int); + int (*update)(void *, unsigned char *, int); + int (*chainback)(void *, unsigned char *, unsigned int, unsigned int); +} libfec_decoder_t; + +void byte2bit(uint8_t *bytes, uint8_t *bits, size_t n_bits) { + unsigned char cmask = 0x80; + for (size_t i = 0; i < n_bits; i++) { + bits[i] = (bytes[i/8] & cmask) ? 255 : 0; + cmask >>= 1; + if (!cmask) { + cmask = 0x80; + } + } +} + +correct_convolutional_polynomial_t *resize_poly_list(correct_convolutional_polynomial_t *polys, size_t cap) { + polys = realloc(polys, cap * sizeof(correct_convolutional_polynomial_t)); + return polys; +} + +void find_poly_coeff(size_t rate, size_t order, uint8_t *msg, size_t msg_len, libfec_decoder_t libfec, correct_convolutional_polynomial_t **polys_dest, size_t *polys_len, size_t search_coeff) { + // find a single coefficient of an unknown convolutional polynomial + // we are given a payload to encode, and we'll test all possible coefficients + // to see which ones yield correct decodings by libfec, which has some + // unknown polynomial "baked in" + + // temp poly (this will be the one we search with) + correct_convolutional_polynomial_t *poly = malloc(rate * sizeof(correct_convolutional_polynomial_t)); + + // what's the largest coefficient value we'll test? + correct_convolutional_polynomial_t maxcoeff = (1 << order) - 1; + + // note that we start about half way in + // this sum asks that we have the + // a) highest order bit set + // b) lowest order bit set + // we're only interested in coefficient values for which this is + // true because if it weren't, the coefficient would actually be + // of a smaller order than its supposed given order + correct_convolutional_polynomial_t startcoeff = (1 << (order - 1)) + 1; + + // the values of this don't really matter except for the coeff we're searching for + // but just to be safe, we set them all + for (size_t i = 0; i < rate; i++) { + poly[i] = startcoeff; + } + + // create a dummy encoder so that we can find how long the resulting encoded value is + correct_convolutional *conv_dummy = correct_convolutional_create(rate, order, poly); + size_t enclen_bits = correct_convolutional_encode_len(conv_dummy, msg_len); + size_t enclen = (enclen_bits % 8) ? (enclen_bits / 8 + 1) : enclen_bits / 8; + correct_convolutional_destroy(conv_dummy); + + // compact encoded format (this comes from libcorrect) + uint8_t *encoded = malloc(enclen * sizeof(uint8_t)); + // soft encoded format (this goes to libfec, one byte per bit) + uint8_t *encoded_bits = malloc(enclen * 8 * sizeof(uint8_t)); + // resulting decoded message which we'll compare to our given payload + uint8_t *msg_cmp = malloc(msg_len * sizeof(uint8_t)); + + // we keep a list of coefficients which yielded correct decodings + // there could be 0, 1, or more than 1, and we'll return all of them + // we'll dynamically resize this as we go + size_t polys_cap = 1; + *polys_len = 0; + correct_convolutional_polynomial_t *polys = NULL; + polys = resize_poly_list(polys, polys_cap); + + // iteration constants -- we go by 2 because we want the lowest order bit to + // stay set + for (correct_convolutional_polynomial_t i = startcoeff; i <= maxcoeff; i += 2) { + poly[search_coeff] = i; + correct_convolutional *conv = correct_convolutional_create(rate, order, poly); + + correct_convolutional_encode(conv, (uint8_t*)msg, msg_len, encoded); + byte2bit(encoded, encoded_bits, enclen); + + // now erase all the bits we're not searching for + for (size_t i = 0; i < msg_len * 8; i++) { + for (size_t j = 0; j < rate; j++) { + if (j != search_coeff) { + // 128 is a soft erasure + encoded_bits[i * rate + j] = 128; + } + } + } + + libfec.init(libfec.vit, 0); + libfec.update(libfec.vit, encoded_bits, libfec.update_len); + libfec.chainback(libfec.vit, msg_cmp, 8 * msg_len, 0); + + correct_convolutional_destroy(conv); + + if (memcmp(msg_cmp, msg, msg_len) == 0) { + // match found + + // resize list to make room + if (*polys_len == polys_cap) { + polys = resize_poly_list(polys, polys_cap * 2); + polys_cap *= 2; + } + polys[*polys_len] = i; + *polys_len = *polys_len + 1; + } + } + + polys = resize_poly_list(polys, *polys_len); + *polys_dest = polys; + free(poly); + free(msg_cmp); + free(encoded); + free(encoded_bits); +} + +// we choose 2 bytes because we need a payload that's longer than +// the shift register under test. since that includes an order 15 +// s.r., we need at least 15 bits. +size_t msg_len = 2; + +void find_poly(size_t rate, size_t order, libfec_decoder_t libfec, correct_convolutional_polynomial_t *poly) { + // find the complete set of coefficients that are "baked in" to + // one particular method of libfec + // most of this method is described by find_poly_coeff + + // for each coeff we want to find, we'll generate random 2-byte payloads and give + // them to find_poly_coeff. If find_poly_coeff returns an empty list, we + // try again. If it returns a nonempty list, then we find the intersection of + // all the coefficient values find_poly_coeff has given us so far (we start + // with the complete set). we are finished when only one coeff value remains + + // we perform this process for each coeff e.g. 6 times for a rate 1/6 polynomial + + uint8_t msg[msg_len]; + + // this is the list returned to us by find_poly_coeff + correct_convolutional_polynomial_t *polys; + // the list's length is written here + size_t polys_len; + + printf("rate 1/%zu order %zu poly:", rate, order); + + for (size_t search_coeff = 0; search_coeff < rate; search_coeff++) { + correct_convolutional_polynomial_t *fit = NULL; + size_t fit_len = 0; + size_t fit_cap = 0; + bool done = false; + + while (!done) { + for (size_t i = 0; i < msg_len; i++) { + msg[i] = rand() % 256; + } + find_poly_coeff(rate, order, msg, msg_len, libfec, &polys, &polys_len, search_coeff); + + if (polys_len == 0) { + // skip if none fit (this is a special case) + continue; + } + + if (fit_len == 0) { + // the very first intersection + // we'll just copy the list handed to us + fit_cap = polys_len; + fit_len = polys_len; + fit = resize_poly_list(fit, fit_cap); + for (size_t i = 0; i < polys_len; i++) { + fit[i] = polys[i]; + } + } else { + // find intersection + ptrdiff_t polys_iter = 0; + ptrdiff_t fit_iter = 0; + ptrdiff_t new_fit_iter = 0; + // the lists generated by find_poly_coeff are sorted + // so we just retain the sorted property and walk both + while (polys_iter < polys_len && fit_iter < fit_len) { + if (polys[polys_iter] < fit[fit_iter]) { + polys_iter++; + } else if (polys[polys_iter] > fit[fit_iter]) { + fit_iter++; + } else { + fit[new_fit_iter] = fit[fit_iter]; + polys_iter++; + fit_iter++; + new_fit_iter++; + } + } + // if new_fit_iter is 0 here then we don't intersect at all + // in this case we have to restart the search for this coeff + if (new_fit_iter != 0) { + fit_len = new_fit_iter; + } else { + free(fit); + fit = NULL; + fit_cap = 0; + fit_len = 0; + } + } + + free(polys); + + if (fit_len == 1) { + poly[search_coeff] = fit[0]; + if (order <= 9) { + printf(" %04o", fit[0]); + } else { + printf(" %06o", fit[0]); + } + done = true; + } + } + + free(fit); + } + printf("\n"); +} + +int main() { + libfec_decoder_t libfec; + + srand(time(NULL)); + + setbuf(stdout, NULL); + + correct_convolutional_polynomial_t poly[6]; + + libfec.vit = create_viterbi27(8 * msg_len); + libfec.update_len = 8 * msg_len + 6; + libfec.init = init_viterbi27; + libfec.update = update_viterbi27_blk; + libfec.chainback = chainback_viterbi27; + find_poly(2, 7, libfec, poly); + delete_viterbi27(libfec.vit); + + libfec.vit = create_viterbi29(8 * msg_len); + libfec.update_len = 8 * msg_len + 8; + libfec.init = init_viterbi29; + libfec.update = update_viterbi29_blk; + libfec.chainback = chainback_viterbi29; + find_poly(2, 9, libfec, poly); + delete_viterbi29(libfec.vit); + + libfec.vit = create_viterbi39(8 * msg_len); + libfec.update_len = 8 * msg_len + 8; + libfec.init = init_viterbi39; + libfec.update = update_viterbi39_blk; + libfec.chainback = chainback_viterbi39; + find_poly(3, 9, libfec, poly); + delete_viterbi39(libfec.vit); + + libfec.vit = create_viterbi615(8 * msg_len); + libfec.update_len = 8 * msg_len + 14; + libfec.init = init_viterbi615; + libfec.update = update_viterbi615_blk; + libfec.chainback = chainback_viterbi615; + find_poly(6, 15, libfec, poly); + delete_viterbi615(libfec.vit); + + return 0; +} diff --git a/libcorrect/tools/find_conv_optim_poly.c b/libcorrect/tools/find_conv_optim_poly.c new file mode 100644 index 0000000..8b22574 --- /dev/null +++ b/libcorrect/tools/find_conv_optim_poly.c @@ -0,0 +1,330 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if HAVE_SSE +#include "correct/util/error-sim-sse.h" +typedef correct_convolutional_sse conv_t; +static conv_t*(*conv_create)(size_t, size_t, const uint16_t *) = correct_convolutional_sse_create; +static void(*conv_destroy)(conv_t *) = correct_convolutional_sse_destroy; +static size_t(*conv_enclen)(void *, size_t) = conv_correct_sse_enclen; +static void(*conv_encode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_sse_encode; +static void(*conv_decode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_sse_decode; +#else +#include "correct/util/error-sim.h" +typedef correct_convolutional conv_t; +static conv_t*(*conv_create)(size_t, size_t, const uint16_t *) = correct_convolutional_create; +static void(*conv_destroy)(conv_t *) = correct_convolutional_destroy; +static size_t(*conv_enclen)(void *, size_t) = conv_correct_enclen; +static void(*conv_encode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_encode; +static void(*conv_decode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_decode; +#endif + +typedef struct { + conv_t *conv; + correct_convolutional_polynomial_t *poly; +} conv_tester_t; + +typedef struct { + int *distances; + float cost; + correct_convolutional_polynomial_t *poly; +} conv_result_t; + +int compare_conv_results(const void *avoid, const void *bvoid) { + const conv_result_t *a = (const conv_result_t *)avoid; + const conv_result_t *b = (const conv_result_t *)bvoid; + + if (a->cost > b->cost) { + return 1; + } + return -1; +} + +typedef struct { + size_t rate; + size_t order; + conv_result_t *items; + size_t items_len; + conv_testbench *scratch; + uint8_t *msg; + size_t msg_len; + size_t test_offset; + double bpsk_voltage; +} exhaustive_thread_args; + +void *search_exhaustive_thread(void *vargs) { + exhaustive_thread_args *args = (exhaustive_thread_args *)vargs; + conv_t *conv; + for (size_t i = 0; i < args->items_len; i++) { + conv = conv_create(args->rate, args->order, args->items[i].poly); + args->scratch->encode = conv_encode; + args->scratch->encoder = conv; + args->scratch->decode = conv_decode; + args->scratch->decoder = conv; + args->items[i].distances[args->test_offset] += test_conv_noise(args->scratch, args->msg, args->msg_len, args->bpsk_voltage); + conv_destroy(conv); + } + pthread_exit(NULL); +} + +void search_exhaustive(size_t rate, size_t order, + size_t n_bytes, uint8_t *msg, + conv_testbench **scratches, size_t num_scratches, + float *weights, + conv_result_t *items, + size_t items_len, double bpsk_voltage) { + + exhaustive_thread_args *args = malloc(num_scratches * sizeof(exhaustive_thread_args)); + pthread_t *threads = malloc(num_scratches * sizeof(pthread_t)); + + for (size_t i = 0; i < num_scratches; i++) { + args[i].rate = rate; + args[i].order = order; + args[i].items = items; + args[i].items_len = items_len; + args[i].scratch = scratches[i]; + args[i].msg = msg; + args[i].msg_len = n_bytes; + args[i].test_offset = i; + args[i].bpsk_voltage = bpsk_voltage; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + pthread_create(&threads[i], &attr, search_exhaustive_thread, &args[i]); + } + + for (size_t i = 0; i < num_scratches; i++) { + pthread_join(threads[i], NULL); + } + + free(args); + free(threads); + +} + +void search_exhaustive_init(conv_result_t *items, size_t items_len, + size_t num_scratches) { + for (size_t i = 0; i < items_len; i++) { + for (size_t j = 0; j < num_scratches; j++) { + items[i].distances[j] = 0; + } + } +} + +void search_exhaustive_fin(conv_result_t *items, size_t items_len, + float *weights, size_t weights_len) { + for (size_t i = 0; i < items_len; i++) { + items[i].cost = 0; + for (size_t j = 0; j < weights_len; j++) { + items[i].cost += weights[j] * items[i].distances[j]; + } + } + + qsort(items, items_len, sizeof(conv_result_t), compare_conv_results); +} + +const size_t max_block_len = 16384; +const size_t max_msg_len = 50000000; + +void test(size_t rate, size_t order, + conv_tester_t start, conv_testbench **scratches, + size_t num_scratches, float *weights, + size_t n_bytes, double *eb_n0, + double bpsk_bit_energy, size_t n_iter, + double bpsk_voltage) { + + uint8_t *msg = malloc(max_block_len * sizeof(uint8_t)); + + correct_convolutional_polynomial_t maxcoeff = (1 << order) - 1; + correct_convolutional_polynomial_t startcoeff = (1 << (order - 1)) + 1; + size_t num_polys = (maxcoeff - startcoeff) / 2 + 1; + size_t convs_len = 1; + for (size_t i = 0; i < rate; i++) { + convs_len *= num_polys; + } + + conv_result_t *exhaustive = malloc(convs_len * sizeof(conv_result_t)); + correct_convolutional_polynomial_t *iter_poly = malloc(rate * sizeof(correct_convolutional_polynomial_t)); + + for (size_t i = 0; i < rate; i++) { + iter_poly[i] = startcoeff; + } + + // init exhaustive with all polys + for (size_t i = 0; i < convs_len; i++) { + exhaustive[i].poly = malloc(rate * sizeof(correct_convolutional_polynomial_t)); + exhaustive[i].distances = calloc(num_scratches, sizeof(int)); + exhaustive[i].cost = 0; + memcpy(exhaustive[i].poly, iter_poly, rate * sizeof(correct_convolutional_polynomial_t)); + // this next loop adds 2 with "carry" + for (size_t j = 0; j < rate; j++) { + if (iter_poly[j] < maxcoeff) { + iter_poly[j] += 2; + // no more carries to propagate + break; + } else { + iter_poly[j] = startcoeff; + } + } + } + free(iter_poly); + + while (convs_len > 20) { + size_t bytes_remaining = n_bytes; + + // call init(), which sets all the error metrics to 0 for our new run + search_exhaustive_init(exhaustive, convs_len, num_scratches); + + while (bytes_remaining) { + // in order to keep memory usage constant, we separate the msg into + // blocks and send each one through + // each time we do this, we have to calculate a new noise for each + // testbench + + size_t block_len = (max_block_len < bytes_remaining) ? max_block_len : bytes_remaining; + bytes_remaining -= block_len; + + for (unsigned int j = 0; j < block_len; j++) { + msg[j] = rand() % 256; + } + + for (size_t i = 0; i < num_scratches; i++) { + scratches[i] = resize_conv_testbench(scratches[i], conv_enclen, start.conv, block_len); + build_white_noise(scratches[i]->noise, scratches[i]->enclen, eb_n0[i], bpsk_bit_energy); + } + + search_exhaustive(rate, order, + block_len, msg, scratches, num_scratches, weights, + exhaustive, convs_len, bpsk_voltage); + } + + // call fin(), which calculates a cost metric for all of the distances + // added by our msg block iterations and then sorts by this metric + search_exhaustive_fin(exhaustive, convs_len, weights, num_scratches); + + // decide paramters for next loop iter + // if we've reduced to 20 or fewer items, we're going to just select + // those and declare the test done + size_t new_convs_len = (convs_len / 2) < 20 ? 20 : convs_len / 2; + + // normally we'll double the message length each time we halve + // the number of entries so that each iter takes roughly the + // same time but has twice the resolution of the previous run. + // + // however, if we've reached max_msg_len, then we assume that + // the error stats collected are likely converged to whatever + // final value they'll take, and adding more length will not + // help us get better metrics. if we're at that point, then + // we just select the top 20 items and declare them winners + if (n_bytes >= max_msg_len) { + // converged case + new_convs_len = 20; + } else { + // increase our error metric resolution next run + n_bytes *= 2; + n_bytes = (n_bytes < max_msg_len) ? n_bytes : max_msg_len; + } + for (size_t i = new_convs_len; i < convs_len; i++) { + // these entries lost, free their memory here + free(exhaustive[i].poly); + free(exhaustive[i].distances); + } + convs_len = new_convs_len; + printf("exhaustive run: %zu items remain\n", convs_len); + } + + for (size_t i = 0; i < convs_len; i++) { + for (size_t j = 0; j < rate; j++) { + printf(" %06o", exhaustive[i].poly[j]); + } + printf(":"); + for (size_t j = 0; j < num_scratches; j++) { + printf(" %.2e@%.1fdB", exhaustive[i].distances[j]/((float)n_bytes * 8), eb_n0[j]); + } + printf("\n"); + } + + for (size_t i = 0; i < convs_len; i++) { + free(exhaustive[i].poly); + free(exhaustive[i].distances); + } + free(exhaustive); + free(msg); +} + +int main(int argc, char **argv) { + srand(time(NULL)); + + size_t rate, order, n_bytes, n_iter; + + sscanf(argv[1], "%zu", &rate); + sscanf(argv[2], "%zu", &order); + sscanf(argv[3], "%zu", &n_bytes); + sscanf(argv[4], "%zu", &n_iter); + + double bpsk_voltage = 1.0/sqrt(2.0); + double bpsk_sym_energy = 2*pow(bpsk_voltage, 2.0); + double bpsk_bit_energy = bpsk_sym_energy/1.0; + + bpsk_bit_energy = bpsk_sym_energy * rate; // rate bits transmitted for every input bit + + correct_convolutional_polynomial_t maxcoeff = (1 << order) - 1; + correct_convolutional_polynomial_t startcoeff = (1 << (order - 1)) + 1; + + conv_tester_t start; + + start.poly = malloc(rate * sizeof(correct_convolutional_polynomial_t)); + + for (size_t i = 0; i < rate; i++) { + start.poly[i] = ((maxcoeff - startcoeff) / 2) + startcoeff + 1; + } + + start.conv = conv_create(rate, order, start.poly); + + size_t num_scratches = 4; + float *weights; + conv_testbench **scratches = malloc(num_scratches * sizeof(conv_testbench *)); + double *eb_n0; + + for (size_t i = 0; i < num_scratches; i++) { + scratches[i] = resize_conv_testbench(NULL, conv_enclen, start.conv, max_block_len); + } + + switch (order) { + case 6: + eb_n0 = (double[]){6.0, 5.5, 5.0, 4.5}; + weights = (float[]){8000, 400, 20, 1}; + break; + case 7: + eb_n0 = (double[]){5.5, 5.0, 4.5, 4.0}; + weights = (float[]){8000, 400, 20, 1}; + break; + case 8: + case 9: + eb_n0 = (double[]){5.0, 4.5, 4.0, 3.5}; + weights = (float[]){8000, 400, 20, 1}; + break; + default: + eb_n0 = (double[]){4.5, 4.0, 3.5, 3.0}; + weights = (float[]){8000, 400, 20, 1}; + } + + test(rate, order, start, scratches, num_scratches, weights, n_bytes, eb_n0, bpsk_bit_energy, n_iter, bpsk_voltage); + + free(start.poly); + conv_destroy(start.conv); + for (size_t i = 0; i < num_scratches; i++) { + free_scratch(scratches[i]); + } + free(scratches); + + return 0; +} diff --git a/libcorrect/tools/find_conv_optim_poly_annealing.c b/libcorrect/tools/find_conv_optim_poly_annealing.c new file mode 100644 index 0000000..a4f0203 --- /dev/null +++ b/libcorrect/tools/find_conv_optim_poly_annealing.c @@ -0,0 +1,350 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if HAVE_SSE +#include "correct/util/error-sim-sse.h" +typedef correct_convolutional_sse conv_t; +static conv_t*(*conv_create)(size_t, size_t, const uint16_t *) = correct_convolutional_sse_create; +static void(*conv_destroy)(conv_t *) = correct_convolutional_sse_destroy; +static size_t(*conv_enclen)(void *, size_t) = conv_correct_sse_enclen; +static void(*conv_encode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_sse_encode; +static void(*conv_decode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_sse_decode; +#else +#include "correct/util/error-sim.h" +typedef correct_convolutional conv_t; +static conv_t*(*conv_create)(size_t, size_t, const uint16_t *) = correct_convolutional_create; +static void(*conv_destroy)(conv_t *) = correct_convolutional_destroy; +static size_t(*conv_enclen)(void *, size_t) = conv_correct_enclen; +static void(*conv_encode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_encode; +static void(*conv_decode)(void *, uint8_t *, size_t, uint8_t *) = conv_correct_decode; +#endif + +typedef struct { + conv_t *conv; + correct_convolutional_polynomial_t *poly; +} conv_tester_t; + +void shuffle(int *a, size_t len) { + for (size_t i = 0; i < len - 2; i++) { + size_t j = rand() % (len - i) + i; + int temp = a[i]; + a[i] = a[j]; + a[j] = temp; + } +} + +int rand_geo(float p, int max) { + int geo = 1; + while (geo < max) { + if (rand() / (float)RAND_MAX > p) { + geo++; + } else { + break; + } + } + return geo; +} + +void next_neighbor(correct_convolutional_polynomial_t *start, + correct_convolutional_polynomial_t *neighbor, size_t rate, size_t order) { + int coeffs[rate * (order - 2)]; + for (int i = 0; i < rate * (order - 2); i++) { + coeffs[i] = i; + } + shuffle(coeffs, rate * (order - 2)); + + memcpy(neighbor, start, rate * sizeof(correct_convolutional_polynomial_t)); + size_t nflips = rand_geo(0.4, rate * (order - 2)); + for (int i = 0; i < nflips; i++) { + ptrdiff_t index = coeffs[i] / (order - 2); + // decide which bit to flip + // we avoid the edge bits to prevent creating a degenerate poly + neighbor[index] ^= 1 << (coeffs[i] % (order - 2) + 1); + } +} + +bool accept(float cost_a, float cost_b, double temperature) { + if (cost_b < cost_a) { + return true; + } + + float p = (float)(rand()) / (float)(RAND_MAX); + + return exp((cost_a - cost_b) / (cost_a * temperature)) > p; +} + +typedef struct { + size_t rate; + size_t order; + correct_convolutional_polynomial_t *poly; + unsigned int distance; + conv_testbench *scratch; + size_t msg_len; + double eb_n0; + double bpsk_voltage; + double bpsk_bit_energy; +} thread_args; + +const size_t max_block_len = 16384; + +void *find_cost_thread(void *vargs) { + thread_args *args = (thread_args *)vargs; + conv_t *conv; + uint8_t *msg = malloc(max_block_len); + + conv = conv_create(args->rate, args->order, args->poly); + args->distance = 0; + conv_testbench *scratch = args->scratch; + + size_t bytes_remaining = args->msg_len; + while (bytes_remaining) { + // in order to keep memory usage constant, we separate the msg into + // blocks and send each one through + // each time we do this, we have to calculate a new noise for each + // testbench + size_t block_len = (max_block_len < bytes_remaining) ? max_block_len : bytes_remaining; + bytes_remaining -= block_len; + + for (unsigned int j = 0; j < block_len; j++) { + msg[j] = rand() % 256; + } + + scratch = resize_conv_testbench(scratch, conv_enclen, conv, block_len); + scratch->encode = conv_encode; + scratch->encoder = conv; + scratch->decode = conv_decode; + scratch->decoder = conv; + + build_white_noise(scratch->noise, scratch->enclen, args->eb_n0, args->bpsk_bit_energy); + + args->distance += test_conv_noise(scratch, msg, block_len, args->bpsk_voltage); + } + conv_destroy(conv); + free(msg); + pthread_exit(NULL); +} + +float find_cost(size_t rate, size_t order, correct_convolutional_polynomial_t *poly, size_t msg_len, + conv_testbench **scratches, size_t num_scratches, float *weights, double *eb_n0, + double bpsk_voltage, double bpsk_bit_energy) { + thread_args *args = malloc(num_scratches * sizeof(thread_args)); + pthread_t *threads = malloc(num_scratches * sizeof(pthread_t)); + + for (size_t i = 0; i < num_scratches; i++) { + args[i].rate = rate; + args[i].order = order; + args[i].poly = poly; + args[i].scratch = scratches[i]; + args[i].msg_len = msg_len; + args[i].eb_n0 = eb_n0[i]; + args[i].bpsk_voltage = bpsk_voltage; + args[i].bpsk_bit_energy = bpsk_bit_energy; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + pthread_create(&threads[i], &attr, find_cost_thread, &args[i]); + } + + for (size_t i = 0; i < num_scratches; i++) { + pthread_join(threads[i], NULL); + } + + float cost = 0; + printf("poly:"); + for (size_t i = 0; i < rate; i++) { + printf(" %06o", poly[i]); + } + printf(" error:"); + for (size_t i = 0; i < num_scratches; i++) { + cost += weights[i] * args[i].distance; + printf(" %.2e@%.1fdB", (args[i].distance / (float)(msg_len * 8)), eb_n0[i]); + } + printf("\n"); + + free(args); + free(threads); + + return cost; +} + +static bool terminated = false; + +void sig_handler(int sig) { + if (sig == SIGINT || sig == SIGTERM || sig == SIGHUP) { + if (!terminated) { + terminated = true; + printf("terminating after current poly\n"); + } + } +} + +void search_simulated_annealing(size_t rate, size_t order, size_t n_steps, conv_tester_t *start, + size_t n_bytes, conv_testbench **scratches, size_t num_scratches, + float *weights, double start_temperature, double cooling_factor, + double *eb_n0, double bpsk_voltage, double bpsk_bit_energy) { + // perform simulated annealing to find the optimal polynomial + + float cost = find_cost(rate, order, start->poly, n_bytes, scratches, num_scratches, weights, + eb_n0, bpsk_voltage, bpsk_bit_energy); + + correct_convolutional_polynomial_t *neighbor_poly = + malloc(rate * sizeof(correct_convolutional_polynomial_t)); + + correct_convolutional_polynomial_t *state = + malloc(rate * sizeof(correct_convolutional_polynomial_t)); + correct_convolutional_polynomial_t *best = + malloc(rate * sizeof(correct_convolutional_polynomial_t)); + + float best_cost = cost; + + memcpy(state, start->poly, rate * sizeof(correct_convolutional_polynomial_t)); + memcpy(best, start->poly, rate * sizeof(correct_convolutional_polynomial_t)); + + double temperature = start_temperature; + + for (size_t i = 0; i < n_steps; i++) { + next_neighbor(state, neighbor_poly, rate, order); + float neighbor_cost = + find_cost(rate, order, neighbor_poly, n_bytes, scratches, num_scratches, weights, eb_n0, + bpsk_voltage, bpsk_bit_energy); + if (accept(cost, neighbor_cost, temperature)) { + // we're moving to our neighbor's house + memcpy(state, neighbor_poly, rate * sizeof(correct_convolutional_polynomial_t)); + cost = neighbor_cost; + } else { + // actually where we live now is nice + } + + if (cost < best_cost) { + best_cost = cost; + memcpy(best, state, rate * sizeof(correct_convolutional_polynomial_t)); + } + + temperature *= cooling_factor; + + if (terminated) { + break; + } + } + + printf("last state:"); + for (size_t i = 0; i < rate; i++) { + printf(" %06o", state[i]); + } + printf("\n"); + + printf("best state:"); + for (size_t i = 0; i < rate; i++) { + printf(" %06o", best[i]); + } + + memcpy(start->poly, best, rate * sizeof(correct_convolutional_polynomial_t)); + + free(state); + free(best); + free(neighbor_poly); +} + +void test_sa(size_t rate, size_t order, conv_tester_t start, conv_testbench **scratches, + size_t num_scratches, float *weights, size_t n_bytes, double *eb_n0, + double bpsk_bit_energy, size_t n_iter, double bpsk_voltage) { + for (size_t i = 0; i < n_iter; i++) { + double temperature = (i == 0) ? 0.5 : 250; + double cooling_factor = (i == 0) ? 0.985 : 0.95; + size_t n_steps = (i == 0) ? 500 : 100; + + search_simulated_annealing(rate, order, n_steps, &start, n_bytes, scratches, num_scratches, + weights, temperature, cooling_factor, eb_n0, bpsk_voltage, + bpsk_bit_energy); + } +} + +int main(int argc, char **argv) { + srand(time(NULL)); + + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + signal(SIGHUP, sig_handler); + + size_t rate, order, n_bytes, n_iter; + + sscanf(argv[1], "%zu", &rate); + sscanf(argv[2], "%zu", &order); + sscanf(argv[3], "%zu", &n_bytes); + sscanf(argv[4], "%zu", &n_iter); + + double bpsk_voltage = 1.0 / sqrt(2.0); + double bpsk_sym_energy = 2 * pow(bpsk_voltage, 2.0); + double bpsk_bit_energy = bpsk_sym_energy / 1.0; + + bpsk_bit_energy = bpsk_sym_energy * rate; // rate bits transmitted for every input bit + + // correct_convolutional_polynomial_t maxcoeff = (1 << order) - 1; + correct_convolutional_polynomial_t startcoeff = (1 << (order - 1)) + 1; + + conv_tester_t start; + + start.poly = malloc(rate * sizeof(correct_convolutional_polynomial_t)); + + for (size_t i = 0; i < rate; i++) { + start.poly[i] = ((rand() % (1 << (order - 2))) << 1) + startcoeff; + } + + start.conv = conv_create(rate, order, start.poly); + + size_t num_scratches = 4; + float *weights; + conv_testbench **scratches = malloc(num_scratches * sizeof(conv_testbench *)); + double *eb_n0; + + for (size_t i = 0; i < num_scratches; i++) { + scratches[i] = resize_conv_testbench(NULL, conv_enclen, start.conv, max_block_len); + } + + switch (order) { + case 6: + eb_n0 = (double[]){6.0, 5.5, 5.0, 4.5}; + weights = (float[]){8000, 400, 20, 1}; + break; + case 7: + case 8: + eb_n0 = (double[]){5.5, 5.0, 4.5, 4.0}; + weights = (float[]){8000, 400, 20, 1}; + break; + case 9: + case 10: + eb_n0 = (double[]){5.0, 4.5, 4.0, 3.5}; + weights = (float[]){8000, 400, 20, 1}; + break; + case 11: + case 12: + case 13: + eb_n0 = (double[]){4.5, 4.0, 3.5, 3.0}; + weights = (float[]){8000, 400, 20, 1}; + break; + default: + eb_n0 = (double[]){3.5, 3.0, 2.5, 2.0}; + weights = (float[]){8000, 400, 20, 1}; + } + + test_sa(rate, order, start, scratches, num_scratches, weights, n_bytes, eb_n0, bpsk_bit_energy, + n_iter, bpsk_voltage); + + free(start.poly); + conv_destroy(start.conv); + for (size_t i = 0; i < num_scratches; i++) { + free_scratch(scratches[i]); + } + free(scratches); + + return 0; +} diff --git a/libcorrect/tools/find_rs_primitive_poly.c b/libcorrect/tools/find_rs_primitive_poly.c new file mode 100644 index 0000000..5b5b3e0 --- /dev/null +++ b/libcorrect/tools/find_rs_primitive_poly.c @@ -0,0 +1,51 @@ +#include "correct/reed-solomon.h" + +size_t block_size = 255; +int power_max = 8; + +// visit all of the elements from the poly +bool trypoly(field_operation_t poly, field_logarithm_t *log) { + memset(log, 0, block_size + 1); + field_operation_t element = 1; + log[0] = (field_logarithm_t)0; + for (field_operation_t i = 1; i < block_size + 1; i++) { + element = element * 2; + element = (element > block_size) ? (element ^ poly) : element; + if (log[element] != 0) { + return false; + } + log[element] = (field_logarithm_t)i; + } + return true; +} + +int main() { + field_logarithm_t *log = malloc((block_size + 1) * sizeof(field_logarithm_t)); + for (field_operation_t i = (block_size + 1); i < (block_size + 1) << 1; i++) { + if (trypoly(i, log)) { + printf("0x%x valid: ", i); + field_operation_t poly = i; + int power = power_max; + while(poly) { + if (poly & (block_size + 1)) { + if (power > 1) { + printf("x^%d", power); + } else if (power) { + printf("x"); + } else { + printf("1"); + } + if (poly & block_size) { + printf(" + "); + } + } + power--; + poly <<= 1; + poly &= (block_size << 1) + 1; + } + printf("\n"); + } + } + free(log); + return 0; +} diff --git a/libcorrect/util/CMakeLists.txt b/libcorrect/util/CMakeLists.txt new file mode 100644 index 0000000..739f649 --- /dev/null +++ b/libcorrect/util/CMakeLists.txt @@ -0,0 +1,11 @@ +add_library(error_sim OBJECT error-sim.c) + +add_library(error_sim_shim OBJECT error-sim.c error-sim-shim.c) + +if(HAVE_LIBFEC) + add_library(error_sim_fec OBJECT error-sim.c error-sim-fec.c) +endif() + +if(HAVE_SSE) + add_library(error_sim_sse OBJECT error-sim.c error-sim-sse.c) +endif() diff --git a/libcorrect/util/error-sim-fec.c b/libcorrect/util/error-sim-fec.c new file mode 100644 index 0000000..d97aa87 --- /dev/null +++ b/libcorrect/util/error-sim-fec.c @@ -0,0 +1,29 @@ +#include "correct/util/error-sim-fec.h" + +void conv_fec27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi27(conv_v, 0); + update_viterbi27_blk(conv_v, soft, soft_len / 2 - 2); + size_t n_decoded_bits = (soft_len / 2) - 8; + chainback_viterbi27(conv_v, msg, n_decoded_bits, 0); +} + +void conv_fec29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi29(conv_v, 0); + update_viterbi29_blk(conv_v, soft, soft_len / 2 - 2); + size_t n_decoded_bits = (soft_len / 2) - 10; + chainback_viterbi29(conv_v, msg, n_decoded_bits, 0); +} + +void conv_fec39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi39(conv_v, 0); + update_viterbi39_blk(conv_v, soft, soft_len / 3 - 2); + size_t n_decoded_bits = (soft_len / 3) - 10; + chainback_viterbi39(conv_v, msg, n_decoded_bits, 0); +} + +void conv_fec615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi615(conv_v, 0); + update_viterbi615_blk(conv_v, soft, soft_len / 6 - 2); + size_t n_decoded_bits = (soft_len / 6) - 16; + chainback_viterbi615(conv_v, msg, n_decoded_bits, 0); +} diff --git a/libcorrect/util/error-sim-shim.c b/libcorrect/util/error-sim-shim.c new file mode 100644 index 0000000..d050d0b --- /dev/null +++ b/libcorrect/util/error-sim-shim.c @@ -0,0 +1,33 @@ +#include "correct/util/error-sim-shim.h" + +ssize_t conv_shim27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi27(conv_v, 0); + update_viterbi27_blk(conv_v, soft, soft_len / 2 - 2); + size_t n_decoded_bits = (soft_len / 2) - 8; + chainback_viterbi27(conv_v, msg, n_decoded_bits, 0); + return (n_decoded_bits % 8) ? (n_decoded_bits / 8) + 1 : n_decoded_bits / 8; +} + +ssize_t conv_shim29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi29(conv_v, 0); + update_viterbi29_blk(conv_v, soft, soft_len / 2 - 2); + size_t n_decoded_bits = (soft_len / 2) - 10; + chainback_viterbi29(conv_v, msg, n_decoded_bits, 0); + return (n_decoded_bits % 8) ? (n_decoded_bits / 8) + 1 : n_decoded_bits / 8; +} + +ssize_t conv_shim39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi39(conv_v, 0); + update_viterbi39_blk(conv_v, soft, soft_len / 3 - 2); + size_t n_decoded_bits = (soft_len / 3) - 10; + chainback_viterbi39(conv_v, msg, n_decoded_bits, 0); + return (n_decoded_bits % 8) ? (n_decoded_bits / 8) + 1 : n_decoded_bits / 8; +} + +ssize_t conv_shim615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + init_viterbi615(conv_v, 0); + update_viterbi615_blk(conv_v, soft, soft_len / 6 - 2); + size_t n_decoded_bits = (soft_len / 6) - 16; + chainback_viterbi615(conv_v, msg, n_decoded_bits, 0); + return (n_decoded_bits % 8) ? (n_decoded_bits / 8) + 1 : n_decoded_bits / 8; +} diff --git a/libcorrect/util/error-sim-sse.c b/libcorrect/util/error-sim-sse.c new file mode 100644 index 0000000..e7b9a2f --- /dev/null +++ b/libcorrect/util/error-sim-sse.c @@ -0,0 +1,13 @@ +#include "correct/util/error-sim-sse.h" + +size_t conv_correct_sse_enclen(void *conv_v, size_t msg_len) { + return correct_convolutional_sse_encode_len((correct_convolutional_sse *)conv_v, msg_len); +} + +void conv_correct_sse_encode(void *conv_v, uint8_t *msg, size_t msg_len, uint8_t *encoded) { + correct_convolutional_sse_encode((correct_convolutional_sse *)conv_v, msg, msg_len, encoded); +} + +ssize_t conv_correct_sse_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + return correct_convolutional_sse_decode_soft((correct_convolutional_sse *)conv_v, soft, soft_len, msg); +} diff --git a/libcorrect/util/error-sim.c b/libcorrect/util/error-sim.c new file mode 100644 index 0000000..0cd3400 --- /dev/null +++ b/libcorrect/util/error-sim.c @@ -0,0 +1,188 @@ +#include "correct/util/error-sim.h" + +size_t distance(uint8_t *a, uint8_t *b, size_t len) { + size_t dist = 0; + for (size_t i = 0; i < len; i++) { + if (a[i] != b[i]) { + + } + dist += popcount((unsigned int)a[i] ^ (unsigned int)b[i]); + } + return dist; +} + +void gaussian(double *res, size_t n_res, double sigma) { + for (size_t i = 0; i < n_res; i += 2) { + // compute using polar method of box muller + double s, u, v; + while (true) { + u = (double)(rand())/(double)RAND_MAX; + v = (double)(rand())/(double)RAND_MAX; + + s = pow(u, 2.0) + pow(v, 2.0); + + if (s > DBL_EPSILON && s < 1) { + break; + } + } + + double base = sqrt((-2.0 * log(s))/s); + + double z0 = u * base; + res[i] = z0 * sigma; + + if (i + 1 < n_res) { + double z1 = v * base; + res[i + 1] = z1 * sigma; + } + } +} + +void encode_bpsk(uint8_t *msg, double *voltages, size_t n_syms, double bpsk_voltage) { + uint8_t mask = 0x80; + for (size_t i = 0; i < n_syms; i++) { + voltages[i] = msg[i/8] & mask ? bpsk_voltage : -bpsk_voltage; + mask >>= 1; + if (!mask) { + mask = 0x80; + } + } +} + +void byte2bit(uint8_t *bytes, uint8_t *bits, size_t n_bits) { + unsigned char cmask = 0x80; + for (size_t i = 0; i < n_bits; i++) { + bits[i] = (bytes[i/8] & cmask) ? 255 : 0; + cmask >>= 1; + if (!cmask) { + cmask = 0x80; + } + } +} + +void decode_bpsk(uint8_t *soft, uint8_t *msg, size_t n_syms) { + uint8_t mask = 0x80; + for (size_t i = 0; i < n_syms; i++) { + uint8_t bit = soft[i] > 127 ? 1 : 0; + if (bit) { + msg[i/8] |= mask; + } + mask >>= 1; + if (!mask) { + mask = 0x80; + } + } +} + +void decode_bpsk_soft(double *voltages, uint8_t *soft, size_t n_syms, double bpsk_voltage) { + for (size_t i = 0; i < n_syms; i++) { + double rel = voltages[i]/bpsk_voltage; + if (rel > 1) { + soft[i] = 255; + } else if (rel < -1) { + soft[i] = 0; + } else { + soft[i] = (uint8_t)(127.5 + 127.5 * rel); + } + } +} + +double log2amp(double l) { + return pow(10.0, l/10.0); +} + +double amp2log(double a) { + return 10.0 * log10(a); +} + +double sigma_for_eb_n0(double eb_n0, double bpsk_bit_energy) { + // eb/n0 is the ratio of bit energy to noise energy + // eb/n0 is expressed in dB so first we convert to amplitude + double eb_n0_amp = log2amp(eb_n0); + // now the conversion. sigma^2 = n0/2 = ((eb/n0)^-1 * eb)/2 = eb/(2 * (eb/n0)) + return sqrt(bpsk_bit_energy/(double)(2.0 * eb_n0_amp)); +} + +void build_white_noise(double *noise, size_t n_syms, double eb_n0, double bpsk_bit_energy) { + double sigma = sigma_for_eb_n0(eb_n0, bpsk_bit_energy); + gaussian(noise, n_syms, sigma); +} + +void add_white_noise(double *signal, double *noise, size_t n_syms) { + const double sqrt_2 = sqrt(2); + for (size_t i = 0; i < n_syms; i++) { + // we want to add the noise in to the signal + // but we can't add them directly, because they're expressed as magnitudes + // and the signal is real valued while the noise is complex valued + + // we'll assume that the noise is exactly half real, half imaginary + // which means it forms a 90-45-45 triangle in the complex plane + // that means that the magnitude we have here is sqrt(2) * the real valued portion + // so, we'll divide by sqrt(2) + // (we are effectively throwing away the complex portion) + signal[i] += noise[i]/sqrt_2; + } +} + +conv_testbench *resize_conv_testbench(conv_testbench *scratch, size_t (*enclen_f)(void *, size_t), void *enc, size_t msg_len) { + if (!scratch) { + scratch = calloc(1, sizeof(conv_testbench)); + } + + scratch->msg_out = realloc(scratch->msg_out, msg_len); + + size_t enclen = enclen_f(enc, msg_len); + size_t enclen_bytes = (enclen % 8) ? (enclen/8 + 1) : enclen/8; + scratch->enclen = enclen; + scratch->enclen_bytes = enclen_bytes; + + scratch->encoded = realloc(scratch->encoded, enclen_bytes); + scratch->v = realloc(scratch->v, enclen * sizeof(double)); + scratch->corrupted = realloc(scratch->corrupted, enclen * sizeof(double)); + scratch->noise = realloc(scratch->noise, enclen * sizeof(double)); + scratch->soft = realloc(scratch->soft, enclen); + return scratch; +} + +void free_scratch(conv_testbench *scratch) { + free(scratch->msg_out); + free(scratch->encoded); + free(scratch->v); + free(scratch->corrupted); + free(scratch->soft); + free(scratch->noise); + free(scratch); +} + +int test_conv_noise(conv_testbench *scratch, uint8_t *msg, size_t n_bytes, + double bpsk_voltage) { + scratch->encode(scratch->encoder, msg, n_bytes, scratch->encoded); + encode_bpsk(scratch->encoded, scratch->v, scratch->enclen, bpsk_voltage); + + memcpy(scratch->corrupted, scratch->v, scratch->enclen * sizeof(double)); + add_white_noise(scratch->corrupted, scratch->noise, scratch->enclen); + decode_bpsk_soft(scratch->corrupted, scratch->soft, scratch->enclen, bpsk_voltage); + + memset(scratch->msg_out, 0, n_bytes); + + ssize_t decode_len = scratch->decode(scratch->decoder, scratch->soft, scratch->enclen, scratch->msg_out); + + if (decode_len != n_bytes) { + printf("expected to decode %zu bytes, decoded %zu bytes instead\n", n_bytes, decode_len); + exit(1); + } + + return distance((uint8_t*)msg, scratch->msg_out, n_bytes); +} + +size_t conv_correct_enclen(void *conv_v, size_t msg_len) { + return correct_convolutional_encode_len((correct_convolutional *)conv_v, msg_len); +} + +void conv_correct_encode(void *conv_v, uint8_t *msg, size_t msg_len, uint8_t *encoded) { + correct_convolutional_encode((correct_convolutional *)conv_v, msg, msg_len, encoded); +} + +ssize_t conv_correct_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) { + return correct_convolutional_decode_soft((correct_convolutional *)conv_v, soft, soft_len, msg); +}