Fine sync: accuracy improved further

pull/61/head
Pieter Robyns 2017-08-23 17:20:42 +02:00
rodzic fdcdc005c9
commit bd0f873c85
4 zmienionych plików z 64 dodań i 17 usunięć

Wyświetl plik

@ -1,33 +1,33 @@
-------- Test Results on 2017-08-03 14:59:58 ---------
-------- Test Results on 2017-08-23 17:19:43 ---------
Test serie 0: [u'01 23 45 67 89 ab cd ef'] * 10
Test 1 :: cr4-5 bw125 sf7 crc1 pwr1 :: passed 10 out of 10 (100.00%)
Test 2 :: cr4-5 bw125 sf8 crc1 pwr1 :: passed 7 out of 10 ( 70.00%)
Test 2 :: cr4-5 bw125 sf8 crc1 pwr1 :: passed 9 out of 10 ( 90.00%)
Test 3 :: cr4-5 bw125 sf12 crc1 pwr1 :: passed 0 out of 10 ( 0.00%)
Test 4 :: cr4-7 bw125 sf6 crc1 pwr1 :: passed 0 out of 10 ( 0.00%)
Test 5 :: cr4-7 bw125 sf7 crc1 pwr1 :: passed 10 out of 10 (100.00%)
Test 6 :: cr4-6 bw125 sf6 crc1 pwr1 :: passed 0 out of 10 ( 0.00%)
Test 7 :: cr4-6 bw125 sf7 crc1 pwr1 :: passed 10 out of 10 (100.00%)
=> Total passed: 37 out of 70 (52.86%)
=> Total passed: 39 out of 70 (55.71%)
Test serie 1: [u'11 11 11'] * 1
Test 8 :: cr4-5 bw125 sf7 crc1 pwr1 :: passed 1 out of 1 (100.00%)
Test 9 :: cr4-5 bw125 sf8 crc1 pwr1 :: passed 1 out of 1 (100.00%)
Test 10 :: cr4-5 bw125 sf12 crc1 pwr1 :: passed 0 out of 1 ( 0.00%)
Test 10 :: cr4-5 bw125 sf12 crc1 pwr1 :: passed 1 out of 1 (100.00%)
Test 11 :: cr4-7 bw125 sf6 crc1 pwr1 :: passed 1 out of 1 (100.00%)
Test 12 :: cr4-7 bw125 sf7 crc1 pwr1 :: passed 1 out of 1 (100.00%)
Test 13 :: cr4-6 bw125 sf6 crc1 pwr1 :: passed 0 out of 1 ( 0.00%)
Test 14 :: cr4-6 bw125 sf7 crc1 pwr1 :: passed 1 out of 1 (100.00%)
=> Total passed: 5 out of 7 (71.43%)
=> Total passed: 6 out of 7 (85.71%)
Test serie 2: [u'11 11 11'] * 5
Test 15 :: cr4-5 bw125 sf7 crc1 pwr1 :: passed 5 out of 5 (100.00%)
Test 16 :: cr4-5 bw125 sf8 crc1 pwr1 :: passed 5 out of 5 (100.00%)
Test 17 :: cr4-5 bw125 sf12 crc1 pwr1 :: passed 0 out of 5 ( 0.00%)
Test 17 :: cr4-5 bw125 sf12 crc1 pwr1 :: passed 1 out of 5 ( 20.00%)
Test 18 :: cr4-7 bw125 sf6 crc1 pwr1 :: passed 4 out of 5 ( 80.00%)
Test 19 :: cr4-7 bw125 sf7 crc1 pwr1 :: passed 5 out of 5 (100.00%)
Test 20 :: cr4-6 bw125 sf6 crc1 pwr1 :: passed 0 out of 5 ( 0.00%)
Test 20 :: cr4-6 bw125 sf6 crc1 pwr1 :: passed 1 out of 5 ( 20.00%)
Test 21 :: cr4-6 bw125 sf7 crc1 pwr1 :: passed 5 out of 5 (100.00%)
=> Total passed: 24 out of 35 (68.57%)
=> Total passed: 26 out of 35 (74.29%)
Test serie 3: [u'aa aa aa aa'] * 3
Test 22 :: cr4-5 bw125 sf7 crc1 pwr1 :: passed 3 out of 3 (100.00%)
@ -51,13 +51,13 @@ Test serie 4: [u'ff ff ff ff'] * 1
Test serie 5: [u'ff ff ff ff'] * 10
Test 36 :: cr4-5 bw125 sf7 crc1 pwr1 :: passed 9 out of 10 ( 90.00%)
Test 37 :: cr4-5 bw125 sf8 crc1 pwr1 :: passed 8 out of 10 ( 80.00%)
Test 37 :: cr4-5 bw125 sf8 crc1 pwr1 :: passed 9 out of 10 ( 90.00%)
Test 38 :: cr4-5 bw125 sf12 crc1 pwr1 :: passed 0 out of 10 ( 0.00%)
Test 39 :: cr4-7 bw125 sf6 crc1 pwr1 :: passed 0 out of 10 ( 0.00%)
Test 40 :: cr4-7 bw125 sf7 crc1 pwr1 :: passed 10 out of 10 (100.00%)
Test 41 :: cr4-6 bw125 sf6 crc1 pwr1 :: passed 0 out of 10 ( 0.00%)
Test 42 :: cr4-6 bw125 sf7 crc1 pwr1 :: passed 10 out of 10 (100.00%)
=> Total passed: 37 out of 70 (52.86%)
=> Total passed: 38 out of 70 (54.29%)
Test serie 6: [u'55 55 55 55'] * 3
Test 43 :: cr4-5 bw125 sf7 crc1 pwr1 :: passed 3 out of 3 (100.00%)
@ -110,5 +110,5 @@ Test serie 10: [u'88 88 88 88'] * 10
=> Total passed: 40 out of 70 (57.14%)
====== Total passed: 234 out of 413 (56.66%) ======
====== Total passed: 240 out of 413 (58.11%) ======

Wyświetl plik

@ -138,6 +138,8 @@ namespace gr {
#ifndef NDEBUG
d_dbg.attach();
#endif
d_fine_sync = 0;
}
/**
@ -162,6 +164,7 @@ namespace gr {
this->d_upchirp.resize(this->d_samples_per_symbol);
this->d_downchirp_ifreq.resize(this->d_samples_per_symbol);
this->d_upchirp_ifreq.resize(this->d_samples_per_symbol);
this->d_upchirp_ifreq_v.resize(this->d_samples_per_symbol*3);
const double T = -0.5 * this->d_bw * this->d_symbols_per_second;
const double f0 = (this->d_bw / 2.0);
@ -183,6 +186,11 @@ namespace gr {
samples_to_file("/tmp/downchirp", &this->d_downchirp[0], this->d_downchirp.size(), sizeof(gr_complex));
samples_to_file("/tmp/upchirp", &this->d_upchirp[0], this->d_upchirp.size(), sizeof(gr_complex));
// Values
memcpy(&d_upchirp_ifreq_v[0], &d_upchirp_ifreq[0], sizeof(float) * this->d_samples_per_symbol);
memcpy(&d_upchirp_ifreq_v[0]+this->d_samples_per_symbol, &d_upchirp_ifreq[0], sizeof(float) * this->d_samples_per_symbol);
memcpy(&d_upchirp_ifreq_v[0]+this->d_samples_per_symbol*2, &d_upchirp_ifreq[0], sizeof(float) * this->d_samples_per_symbol);
}
void decoder_impl::values_to_file(const std::string path, const unsigned char *v, const uint32_t length, const uint32_t ppm) {
@ -290,6 +298,12 @@ namespace gr {
}
}
float decoder_impl::cross_correlate_ifreq_fast(const float *samples_ifreq, const float *ideal_chirp, const uint32_t window) {
float result = 0;
volk_32f_x2_dot_prod_32f(&result, samples_ifreq, ideal_chirp, window);
return result;
}
/**
* Currently unused.
*/
@ -321,11 +335,33 @@ namespace gr {
result += (samples_ifreq[i] - average) * (ideal_chirp[i] - chirp_avg) / sd;
}
result /= (float)(to_idx - 1u);
result /= (float)(to_idx);
return result;
}
void decoder_impl::fine_sync(const gr_complex* in_samples, uint32_t bin_idx) {
int32_t shift_ref = bin_idx * this->d_decim_factor + d_decim_factor;
int32_t search_space = this->d_decim_factor; // At most d_decim_factor samples offset
float samples_ifreq[d_samples_per_symbol];
float max_correlation = 0.0f;
int32_t lag = 0;
this->instantaneous_frequency(in_samples, samples_ifreq, d_samples_per_symbol);
for(int32_t i = -search_space; i < search_space; i++) {
float c = cross_correlate_ifreq_fast(samples_ifreq, &d_upchirp_ifreq_v[shift_ref+i+d_samples_per_symbol], d_samples_per_symbol-1);
if(c > max_correlation) {
max_correlation = c;
lag = i;
}
}
d_debug << "FINE: " << -lag << std::endl;
d_fine_sync = -lag;
}
float decoder_impl::detect_downchirp(const gr_complex *samples, const uint32_t window) {
float samples_ifreq[window];
this->instantaneous_frequency(samples, samples_ifreq, window);
@ -499,6 +535,9 @@ namespace gr {
// DBGR_START_TIME_MEASUREMENT(false, "only");
uint32_t bin_idx = this->max_frequency_gradient_idx(samples, is_header);
fine_sync(samples, bin_idx);
if(d_fine_sync >= d_decim_factor)
d_fine_sync = 0;
//uint32_t bin_idx = this->get_shift_fft(samples);
// DBGR_INTERMEDIATE_TIME_MEASUREMENT();
@ -506,6 +545,7 @@ namespace gr {
// Header has additional redundancy
if (is_header) {
bin_idx /= 4u;
//bin_idx = std::max(bin_idx - 2u, 0u) / 4u;
}
// Decode (actually gray encode) the bin to get the symbol value
@ -567,8 +607,8 @@ namespace gr {
this->deshuffle(shuffle_pattern, is_header);
// For determining whitening sequence
//if (!is_header)
// this->values_to_file("/tmp/after_deshuffle", &this->d_words_deshuffled[0], this->d_words_deshuffled.size(), 8);
if (!is_header)
this->values_to_file("/tmp/after_deshuffle", &this->d_words_deshuffled[0], this->d_words_deshuffled.size(), 8);
this->dewhiten(is_header ? gr::lora::prng_header : this->d_whitening_sequence);
this->hamming_decode(out_data);
@ -886,7 +926,7 @@ namespace gr {
this->msg_raw_chirp_debug(raw_input, this->d_samples_per_symbol);
//samples_debug(input, d_samples_per_symbol);
this->consume_each(this->d_samples_per_symbol);
this->consume_each(this->d_samples_per_symbol+d_fine_sync);
break;
}
@ -919,7 +959,7 @@ namespace gr {
this->msg_raw_chirp_debug(raw_input, this->d_samples_per_symbol);
//samples_debug(input, d_samples_per_symbol);
this->consume_each(this->d_samples_per_symbol);
this->consume_each(this->d_samples_per_symbol+d_fine_sync);
break;
}

Wyświetl plik

@ -27,6 +27,7 @@
#include <vector>
#include <fstream>
#include <lora/debugger.h>
#include <volk/volk.h>
#define DECIMATOR_FILTER_SIZE (2*8*1 + 1) // 2*decim_factor*delay+1
@ -74,6 +75,8 @@ namespace gr {
std::vector<gr_complex> d_upchirp; ///< The complex ideal upchirp.
std::vector<float> d_upchirp_ifreq; ///< The instantaneous frequency of the ideal upchirp.
std::vector<float> d_upchirp_ifreq_v; ///< The instantaneous frequency of the ideal upchirp.
std::vector<gr_complex> d_fft; ///< Vector containing the FFT resuls.
std::vector<gr_complex> d_mult_hf; ///< Vector containing the FFT decimation.
std::vector<gr_complex> d_tmp; ///< Vector containing the FFT decimation.
@ -114,6 +117,10 @@ namespace gr {
float d_cfo_estimation; ///< An estimation for the current Center Frequency Offset.
double d_dt; ///< Indicates how fast the frequency changes in a symbol (chirp).
float cross_correlate_ifreq_fast(const float *samples_ifreq, const float *ideal_chirp, const uint32_t window);
void fine_sync(const gr_complex* in_samples, uint32_t bin_idx);
uint32_t d_fine_sync;
/**
* \brief Calculates the average energy from the given samples and returns whether its higher than the given threshold.
*

Wyświetl plik

@ -35,7 +35,7 @@ namespace gr {
* Whitening sequence
*/
const uint8_t prng_payload[] = {
0xff, 0xff, 0x2d, 0xff, 0x78, 0xff, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0xd2, 0xff, 0x55, 0x2d, 0x4b, 0x78, 0x66, 0xe1, 0x1e, 0xd2, 0xff, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0xe1, 0xb4, 0xd2, 0x99, 0x87, 0xe1, 0xcc, 0x00, 0xaa, 0x00, 0xb4, 0x00, 0x99, 0x00, 0xe1, 0xd2, 0x00, 0x55, 0x00, 0x99, 0x00, 0xe1, 0x00, 0xd2, 0xd2, 0x87, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0xd2, 0xe1, 0x87, 0xd2, 0x1e, 0x55, 0x2d, 0x99, 0x78, 0x33, 0xe1, 0x55, 0xd2, 0x4b, 0x55, 0x66, 0x99, 0x1e, 0x33, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x78, 0xd2, 0xe1, 0x87, 0x00, 0xcc, 0x00, 0x78, 0x00, 0x33, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0x33, 0x78, 0x55, 0x33, 0x99, 0x55, 0x33, 0x99, 0x87, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0x66, 0x33, 0x1e, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0x33, 0x66, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0x00, 0x33, 0x00, 0x55, 0xd2, 0x99, 0x55, 0xe1, 0x4b, 0x00, 0xb4, 0x00, 0x4b, 0xd2, 0x66, 0x55, 0xcc, 0x4b, 0xaa, 0xb4, 0x66, 0x4b, 0xcc, 0x66, 0xaa, 0xcc, 0xb4, 0xaa, 0x4b, 0x66, 0x66, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x55, 0x66, 0x4b, 0xcc, 0x66, 0x78, 0xcc, 0x33, 0x78, 0x55, 0xe1, 0x4b, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0x1e, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x87, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0xff, 0xaa, 0x2d, 0x66, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0x2d, 0xaa, 0xaa, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0x2d, 0xb4, 0xaa, 0x4b, 0xb4, 0x66, 0x99, 0x1e, 0xe1, 0x2d, 0xd2, 0xaa, 0x55, 0xb4, 0x99, 0x99, 0xe1, 0xe1, 0x00, 0xd2, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0xe1, 0xaa, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0xcc, 0xe1, 0xaa, 0xd2, 0x66, 0x87, 0xcc, 0x1e, 0x78, 0xff, 0xe1, 0x2d, 0xd2, 0x78, 0x87, 0x33, 0x1e, 0x87, 0xff, 0x1e, 0x2d, 0x2d, 0x78, 0x78, 0x33, 0x33, 0x87, 0x87, 0x1e, 0xcc, 0x2d, 0x78, 0x78, 0xe1, 0x33, 0xd2, 0x87, 0x55, 0xcc, 0x4b, 0x78, 0x66, 0xe1, 0xcc, 0xd2, 0xaa, 0x55, 0xb4, 0x4b, 0x99, 0x66, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x4b, 0xb4, 0xb4, 0x99, 0x4b, 0x33, 0xb4, 0x55, 0x99, 0x4b, 0x33, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x99, 0xaa, 0x33, 0x66, 0x87, 0x1e, 0x1e, 0x2d, 0x2d, 0xaa, 0xaa, 0x66, 0x66, 0xcc, 0x1e, 0x78, 0x2f, 0x37, 0xa2, 0xa7, 0x76, 0x1f, 0x8c, 0x7f, 0x78, 0x2f, 0x33, 0xa2, 0xa7, 0x62, 0x1e, 0x0e, 0x7f, 0xbe, 0x2d, 0xff, 0xa4, 0xdf, 0x76, 0x2d, 0x5f, 0xaa, 0x7f, 0xf4, 0xfb, 0x93, 0xdf, 0x33, 0x3c, 0x87, 0xaa, 0x4c, 0xb6, 0x78, 0x91, 0x13, 0x33, 0x97, 0x82, 0x4c, 0x8c, 0xa8, 0x7c, 0xb4, 0x33, 0x6b, 0x8e, 0xb4, 0x5c, 0xd9, 0xa8, 0xe5, 0xbc, 0xf2, 0x5b, 0x86, 0xf4, 0x4c, 0x99, 0x68, 0xc5, 0xe9, 0xd2, 0x02, 0x87, 0x41, 0x4c, 0xd2, 0x2a, 0x87, 0xed, 0x3e, 0x00, 0x2d, 0x01, 0x2a, 0xd2, 0xb4, 0x83, 0x49, 0x16, 0xa4, 0x0c, 0x0b, 0xaa, 0x34, 0xb6, 0x4f, 0x4b, 0x6e, 0x94, 0x0f, 0x4b, 0x3f, 0xb4, 0xfd, 0x4f, 0x25, 0x46, 0x68, 0x1f, 0x73, 0x7f, 0x55, 0xff, 0x4d, 0x2d, 0x9c, 0x68, 0x99, 0x32, 0x61, 0x15, 0x00, 0x4f, 0xd0, 0xb4, 0x65, 0x98, 0xd1, 0xe1, 0xb3, 0x02, 0x87, 0xde, 0x1e, 0x55, 0xee, 0xf9, 0xff, 0xb3, 0xff, 0x95, 0xfb, 0x36, 0x00, 0x01, 0x40, 0x80, 0x87, 0x75, 0xc0, 0x03,
0xff, 0xff, 0x2d, 0xff, 0x78, 0xff, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0xd2, 0xff, 0x55, 0x2d, 0x4b, 0x78, 0x66, 0xe1, 0x1e, 0xd2, 0xff, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0xe1, 0xb4, 0xd2, 0x99, 0x87, 0xe1, 0xcc, 0x00, 0xaa, 0x00, 0xb4, 0x00, 0x99, 0x00, 0xe1, 0xd2, 0x00, 0x55, 0x00, 0x99, 0x00, 0xe1, 0x00, 0xd2, 0xd2, 0x87, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0xd2, 0xe1, 0x87, 0xd2, 0x1e, 0x55, 0x2d, 0x99, 0x78, 0x33, 0xe1, 0x55, 0xd2, 0x4b, 0x55, 0x66, 0x99, 0x1e, 0x33, 0x2d, 0x55, 0x78, 0x4b, 0xe1, 0x66, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x78, 0xd2, 0xe1, 0x87, 0x00, 0xcc, 0x00, 0x78, 0x00, 0x33, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0x33, 0x78, 0x55, 0x33, 0x99, 0x55, 0x33, 0x99, 0x87, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0x66, 0x33, 0x1e, 0x87, 0x2d, 0xcc, 0x78, 0xaa, 0x33, 0x66, 0x55, 0x1e, 0x99, 0x2d, 0xe1, 0x78, 0x00, 0x33, 0x00, 0x55, 0xd2, 0x99, 0x55, 0xe1, 0x4b, 0x00, 0xb4, 0x00, 0x4b, 0xd2, 0x66, 0x55, 0xcc, 0x4b, 0xaa, 0xb4, 0x66, 0x4b, 0xcc, 0x66, 0xaa, 0xcc, 0xb4, 0xaa, 0x4b, 0x66, 0x66, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x55, 0x66, 0x4b, 0xcc, 0x66, 0x78, 0xcc, 0x33, 0x78, 0x55, 0xe1, 0x4b, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0x1e, 0xe1, 0xff, 0x00, 0xff, 0xd2, 0x2d, 0x87, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0xff, 0xaa, 0x2d, 0x66, 0xaa, 0x1e, 0x66, 0xff, 0xcc, 0x2d, 0xaa, 0xaa, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0x2d, 0xb4, 0xaa, 0x4b, 0xb4, 0x66, 0x99, 0x1e, 0xe1, 0x2d, 0xd2, 0xaa, 0x55, 0xb4, 0x99, 0x99, 0xe1, 0xe1, 0x00, 0xd2, 0xd2, 0x55, 0x87, 0x99, 0xcc, 0xe1, 0xaa, 0x00, 0x66, 0xd2, 0xcc, 0x87, 0x78, 0xcc, 0xe1, 0xaa, 0xd2, 0x66, 0x87, 0xcc, 0x1e, 0x78, 0xff, 0xe1, 0x2d, 0xd2, 0x78, 0x87, 0x33, 0x1e, 0x87, 0xff, 0x1e, 0x2d, 0x2d, 0x78, 0x78, 0x33, 0x33, 0x87, 0x87, 0x1e, 0xcc, 0x2d, 0x78, 0x78, 0xe1, 0x33, 0xd2, 0x87, 0x55, 0xcc, 0x4b, 0x78, 0x66, 0xe1, 0xcc, 0xd2, 0xaa, 0x55, 0xb4, 0x4b, 0x99, 0x66, 0x33, 0xcc, 0x55, 0xaa, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x99, 0xb4, 0xe1, 0x99, 0xd2, 0x33, 0x55, 0x55, 0x4b, 0x4b, 0xb4, 0xb4, 0x99, 0x4b, 0x33, 0xb4, 0x55, 0x99, 0x4b, 0x33, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x99, 0xaa, 0x33, 0x66, 0xc7, 0x1e, 0x1e, 0x2d, 0x2d, 0xaa, 0xaa, 0x66, 0x66, 0xcc, 0x1e, 0x78, 0x2d, 0x33, 0xaa, 0x87, 0x66, 0x1e, 0xcc, 0xff, 0x78, 0x2d, 0x33, 0xaa, 0x87, 0x66, 0x1e, 0x1e, 0xff, 0xff, 0x2d, 0xff, 0xaa, 0xff, 0x66, 0x2d, 0x1e, 0xaa, 0xff, 0xb4, 0xff, 0x99, 0xff, 0x33, 0x2d, 0x87, 0xaa, 0xcc, 0xb4, 0x78, 0x99, 0x33, 0x33, 0x87, 0x87, 0xcc, 0xcc, 0xaa, 0x78, 0xb4, 0x33, 0x4b, 0x87, 0xb4, 0xcc, 0x99, 0xaa, 0xe1, 0xb4, 0xd2, 0x4b, 0x87, 0xb4, 0xcc, 0x99, 0x78, 0xe1, 0xe1, 0xd2, 0x00, 0x87, 0x00, 0xcc, 0xd2, 0x78, 0x87, 0xe1, 0x1e, 0x00, 0x2d, 0x00, 0xaa, 0xd2, 0xb4, 0x87, 0x4b, 0x1e, 0xb4, 0x2d, 0x4b, 0xaa, 0xb4, 0xb4, 0x4b, 0x4b, 0x66, 0xb4, 0x1e, 0x4b, 0xff, 0xb4, 0xff, 0x4b, 0x2d, 0x66, 0x78, 0x1e, 0x33, 0xff, 0x55, 0xff, 0x4b, 0x2d, 0xb4, 0x78, 0x99, 0x33, 0xe1, 0x55, 0x00, 0x4b, 0xd2, 0xb4, 0x55, 0x99, 0x99, 0xe1, 0x33, 0x00, 0x87, 0xd2, 0x1e, 0x55, 0xff, 0x99, 0xff, 0x33, 0xff, 0x87, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x87, 0xe1, 0xaa, 0xcc,
/*0xff, 0xff, 0x2e, 0xff, 0x5c, 0xff, 0xe8, 0xff, 0x00, 0xff, 0xd1, 0x2e, 0x72, 0x5c, 0x65, 0xe8, 0x4b, 0x00, 0x17, 0xd1, 0xff, 0x72, 0x2e, 0x65, 0x5c, 0x4b, 0xe8, 0x17, 0xd1, 0xff, 0xa3, 0x2e, 0xc6, 0x5c, 0x8d, 0xe8, 0x9a, 0xd1, 0xb4, 0xa3, 0xe8, 0xc6, 0x00, 0x8d, 0x00, 0x9a, 0x00, 0xb4, 0x00, 0xe8, 0xd1, 0x00, 0x72, 0x00, 0xb4, 0x00, 0xe8, 0x00, 0xd1, 0xd1, 0xa3, 0x72, 0x17, 0xb4, 0x2e, 0xe8, 0x5c, 0xd1, 0xe8, 0xa3, 0xd1, 0x17, 0x72, 0x2e, 0xb4, 0x5c, 0x39, 0xe8, 0x72, 0xd1, 0x65, 0x72, 0x4b, 0xb4, 0x17, 0x39, 0x2e, 0x72, 0x5c, 0x65, 0xe8, 0x4b, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x5c, 0xd1, 0xe8, 0xa3, 0x00, 0xc6, 0x00, 0x5c, 0x00, 0x39, 0xd1, 0x72, 0xa3, 0xb4, 0xc6, 0x39, 0x5c, 0x72, 0x39, 0xb4, 0x72, 0x39, 0xb4, 0xa3, 0x39, 0xc6, 0x72, 0x8d, 0xb4, 0x4b, 0x39, 0x17, 0xa3, 0x2e, 0xc6, 0x5c, 0x8d, 0x39, 0x4b, 0x72, 0x17, 0xb4, 0x2e, 0xe8, 0x5c, 0x00, 0x39, 0x00, 0x72, 0xd1, 0xb4, 0x72, 0xe8, 0x65, 0x00, 0x9a, 0x00, 0x65, 0xd1, 0x4b, 0x72, 0xc6, 0x65, 0x8d, 0x9a, 0x4b, 0x65, 0xc6, 0x4b, 0x8d, 0xc6, 0x9a, 0x8d, 0x65, 0x4b, 0x4b, 0xc6, 0xc6, 0x8d, 0x5c, 0x9a, 0x39, 0x65, 0x72, 0x4b, 0x65, 0xc6, 0x4b, 0x5c, 0xc6, 0x39, 0x5c, 0x72, 0xe8, 0x65, 0x00, 0x4b, 0xd1, 0xc6, 0xa3, 0x5c, 0x17, 0xe8, 0xff, 0x00, 0xff, 0xd1, 0x2e, 0xa3, 0x8d, 0x17, 0x4b, 0xff, 0xc6, 0xff, 0x8d, 0x2e, 0x4b, 0x8d, 0x17, 0x4b, 0xff, 0xc6, 0x2e, 0x8d, 0x8d, 0x4b, 0x9a, 0x17, 0x65, 0xff, 0x4b, 0x2e, 0x17, 0x8d, 0x2e, 0x9a, 0x8d, 0x65, 0x9a, 0x4b, 0xb4, 0x17, 0xe8, 0x2e, 0xd1, 0x8d, 0x72, 0x9a, 0xb4, 0xb4, 0xe8, 0xe8, 0x00, 0xd1, 0xd1, 0x72, 0xa3, 0xb4*/
};